├── .gitignore ├── .npmignore ├── .prettierrc ├── CHANGELOG.md ├── INSTALL.md ├── LICENSE ├── README.md ├── assets ├── README.md ├── banner-template.html └── cursor-mcp-banner.txt ├── docs └── installtion-success-cursor-screenshot.png ├── package-lock.json ├── package.json ├── src └── index.mts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependency directories 2 | node_modules/ 3 | jspm_packages/ 4 | 5 | # Compiled output 6 | lib/ 7 | dist/ 8 | build/ 9 | *.tsbuildinfo 10 | 11 | # Logs 12 | logs 13 | *.log 14 | npm-debug.log* 15 | yarn-debug.log* 16 | yarn-error.log* 17 | 18 | # Runtime data 19 | pids 20 | *.pid 21 | *.seed 22 | *.pid.lock 23 | 24 | # Environment files 25 | .env 26 | .env.local 27 | .env.development.local 28 | .env.test.local 29 | .env.production.local 30 | 31 | # Editor directories and files 32 | .idea/ 33 | .vscode/ 34 | *.swp 35 | *.swo 36 | .DS_Store 37 | 38 | # Test files and directories 39 | test-folder/ 40 | 41 | # Backups and archives 42 | *.tgz 43 | cursor-mcp-installer-*.tgz 44 | cursor-ai-mcp-installer-*.tgz 45 | 46 | # Smithery files for this fork 47 | smithery.yaml 48 | SMITHERY.md 49 | 50 | # Publishing instructions 51 | PUBLISHING.md 52 | 53 | # Development only files 54 | Dockerfile 55 | CONTRIBUTING.md 56 | # tsconfig.json is commented out as it's needed for building the project 57 | # tsconfig.json 58 | 59 | # Marketing materials 60 | marketing/ -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Source files 2 | src/ 3 | 4 | # Development files 5 | .git/ 6 | .github/ 7 | .vscode/ 8 | .idea/ 9 | .DS_Store 10 | *.log 11 | *.swp 12 | *.swo 13 | 14 | # Config files not needed in the package 15 | .prettierrc 16 | .eslintrc 17 | tsconfig.json 18 | eslint.config.mjs 19 | 20 | # Assets used for documentation 21 | assets/ 22 | public-git-plan.md 23 | 24 | # Tests 25 | tests/ 26 | __tests__/ 27 | *.test.ts 28 | *.spec.ts 29 | 30 | # Documentation files (redundant in package) 31 | CONTRIBUTING.md -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "endOfLine": "auto", 3 | "singleQuote": false, 4 | "printWidth": 100, 5 | "tabWidth": 2 6 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to the Cursor MCP Installer will be documented in this file. 4 | 5 | ## [0.1.3] - 2024-06-10 6 | 7 | ### Summary 8 | This release significantly improves path handling in the MCP Installer, making it more robust when dealing with various file paths, schema files, and server detection. Users will experience fewer issues with file paths containing spaces or special characters, better detection of OpenAPI schema files, and more reliable server discovery in local directories. 9 | 10 | ### Added 11 | - New path handling utilities to improve file path resolution: 12 | - `normalizeServerPath` - Normalizes and validates file paths 13 | - `findSchemaFile` - Intelligently finds schema files in arguments 14 | - `findServerEntryPoint` - Detects common server entry points in directories 15 | 16 | ### Improved 17 | - Enhanced path handling for all MCP server installations 18 | - Better schema file detection for OpenAPI schema servers (now checks all arguments) 19 | - Improved directory scanning for server entry points 20 | - Automatic normalization of file paths in server arguments 21 | - More robust error handling during path resolution 22 | - Added support for detecting Python server files in local installations 23 | 24 | ### Fixed 25 | - Fixed issues with relative vs. absolute paths in server configurations 26 | - Resolved problems with path handling for files with spaces 27 | - Improved error reporting for invalid file paths 28 | 29 | ### Thanks 30 | - Special thanks to [@ItzAmirreza](https://github.com/ItzAmirreza) for submitting the issue regarding path handling problems for initial installation 31 | 32 | ## [0.1.2] - 2024-05-21 33 | 34 | ### Added 35 | - Fixed installation instructions to include required `index.mjs` argument in command args 36 | - Enhanced error handling for installation failures 37 | - Support for more MCP server types including Python-based servers 38 | 39 | ### Changed 40 | - Updated repository URLs 41 | - Cleaned up repository structure 42 | - Improved documentation and examples 43 | 44 | ### Fixed 45 | - Resolved issues with npm package naming 46 | - Fixed configuration file path generation 47 | - Improved error messages for failed installations 48 | 49 | Initial public release. 50 | 51 | - Base functionality for installing MCP servers 52 | - Support for npm and uvx installations 53 | - Basic support for OpenAPI schema servers 54 | - Support for installing from local directories -------------------------------------------------------------------------------- /INSTALL.md: -------------------------------------------------------------------------------- 1 | # Quick Installation Guide 2 | 3 | This guide provides the simplest ways to install and use the MCP Installer. 4 | 5 | ## Option 1: Using npx (No Installation Required) 6 | 7 | 1. Edit your Cursor configuration file: 8 | - **macOS/Linux**: `~/.cursor/mcp.json` 9 | - **Windows**: `%USERPROFILE%\.cursor\mcp.json` 10 | 11 | 2. Add the following configuration (create the file if it doesn't exist): 12 | 13 | ```json 14 | { 15 | "mcpServers": { 16 | "MCP Installer": { 17 | "command": "npx", 18 | "type": "stdio", 19 | "args": [ 20 | "cursor-mcp-installer-free", 21 | "index.mjs" 22 | ] 23 | } 24 | } 25 | } 26 | ``` 27 | 28 | 3. Restart Cursor 29 | 4. Ask Claude to "Install the web search MCP server" 30 | 31 | ## Option 2: Global Installation with npm 32 | 33 | 1. Install the package globally: 34 | 35 | ```bash 36 | npm install -g cursor-mcp-installer-free 37 | ``` 38 | 39 | 2. Edit your Cursor configuration file: 40 | 41 | ```json 42 | { 43 | "mcpServers": { 44 | "MCP Installer": { 45 | "command": "cursor-mcp-installer-free", 46 | "type": "stdio", 47 | "args": [ 48 | "index.mjs" 49 | ] 50 | } 51 | } 52 | } 53 | ``` 54 | 55 | 3. Restart Cursor 56 | 4. Ask Claude to "Install the web search MCP server" 57 | 58 | ## Troubleshooting 59 | 60 | - If you get an error about the command not being found, make sure you have Node.js installed and that it's in your PATH. 61 | - If Cursor doesn't recognize the MCP server, check that your configuration file is correctly formatted and in the right location. 62 | - Try restarting your computer if changes don't take effect after restarting Cursor. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Matthew Cage 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cursor MCP Installer 2 | 3 |
4 | 5 |
  6 |    ___         __  __    ___  __            ___   ___ 
  7 |   / __\/\ /\  /__\/ _\  /___\/__\  /\/\    / __\ / _ \
  8 |  / /  / / \ \/ \//\ \  //  // \// /    \  / /   / /_)/
  9 | / /___\ \_/ / _  \_\ \/ \_// _  \/ /\/\ \/ /___/ ___/ 
 10 | \____/ \___/\/ \_/\__/\___/\/ \_/\/    \/\____/\/     
 11 |                                                       
 12 |   _____    __  __  _____  _      __    __    __  __   
 13 |   \_   \/\ \ \/ _\/__   \/_\    / /   / /   /__\/__\  
 14 |    / /\/  \/ /\ \   / /\//_\\  / /   / /   /_\ / \//  
 15 | /\/ /_/ /\  / _\ \ / / /  _  \/ /___/ /___//__/ _  \  
 16 | \____/\_\ \/  \__/ \/  \_/ \_/\____/\____/\__/\/ \_/  
 17 | 
 18 | +---------------------------------------------+
 19 | | 🚀 CURSOR MCP INSTALLER 🚀                 |
 20 | | ✨ Magically install MCP servers with ease ✨ |
 21 | +---------------------------------------------+
 22 | 
23 | 24 |

A Model Context Protocol (MCP) server for installing and configuring other MCP servers within Cursor IDE.

25 | 26 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 27 | [![npm version](https://img.shields.io/npm/v/cursor-mcp-installer-free.svg)](https://www.npmjs.com/package/cursor-mcp-installer-free) 28 | [![MCP Compatible](https://img.shields.io/badge/MCP-Compatible-brightgreen.svg)](https://github.com/anthropic-labs/model-context-protocol) 29 | [![Cursor IDE](https://img.shields.io/badge/Cursor-IDE-blue.svg)](https://cursor.sh) 30 | [![npm downloads](https://img.shields.io/npm/dt/cursor-mcp-installer-free.svg)](https://www.npmjs.com/package/cursor-mcp-installer-free) 31 | 32 | 33 | LinkedIn 34 | 35 |
36 | 37 | > **📢 NOW AVAILABLE ON NPM!** Install with a simple `npm install -g cursor-mcp-installer-free` command or use directly with `npx cursor-mcp-installer-free` or `uvx cursor-mcp-installer-free`! 38 | 39 | > **🔄 Latest Updates (v0.1.3):** Improved path handling for all MCP server installations, better OpenAPI schema detection, and more robust server discovery in local directories. Thanks to [@ItzAmirreza](https://github.com/ItzAmirreza) for submitting the initial installation path handling issue. See [CHANGELOG.md](CHANGELOG.md) for details. 40 | 41 | ## Quick Start Guide 42 | 43 | ### Step 1: Add to Cursor Configuration 44 | 45 | Choose one of these methods to add the MCP Installer to your Cursor configuration: 46 | 47 | #### Using npx (Easiest - No Installation Required) 48 | 49 | Add this to your `~/.cursor/mcp.json` file (create it if it doesn't exist): 50 | 51 | ```json 52 | { 53 | "mcpServers": { 54 | "MCP Installer": { 55 | "command": "npx", 56 | "type": "stdio", 57 | "args": [ 58 | "cursor-mcp-installer-free@0.1.3", 59 | "index.mjs" 60 | ] 61 | } 62 | } 63 | } 64 | ``` 65 | 66 | #### Using npm (Global Installation) 67 | 68 | ```bash 69 | npm install -g cursor-mcp-installer-free@0.1.3 70 | ``` 71 | 72 | Then add to your `~/.cursor/mcp.json`: 73 | 74 | ```json 75 | { 76 | "mcpServers": { 77 | "MCP Installer": { 78 | "command": "cursor-mcp-installer-free", 79 | "type": "stdio", 80 | "args": [ 81 | "index.mjs" 82 | ] 83 | } 84 | } 85 | } 86 | ``` 87 | 88 | ### Step 2: Restart Cursor 89 | 90 | Close and reopen Cursor to apply the configuration changes. 91 | 92 | ### Step 3: Use Claude to Install Servers 93 | 94 | Ask Claude to install any MCP server for you: 95 | 96 | ``` 97 | Install the web search MCP server 98 | ``` 99 | 100 | or 101 | 102 | ``` 103 | Install the MCP server for OpenAPI schema exploration with my-schema.yaml 104 | ``` 105 | 106 | ### Step 4: What You'll See When Installed 107 | 108 | Once properly installed and Cursor is restarted, you'll see the MCP Installer available in the sidebar when using Claude: 109 | 110 | MCP Installer Interface 111 | 112 | The MCP Installer provides three main tools: 113 | - `install_repo_mcp_server`: Install MCP servers from npm packages or repositories 114 | - `install_local_mcp_server`: Install MCP servers from local directories 115 | - `add_to_cursor_config`: Add custom MCP server configurations 116 | 117 | ## Features 118 | 119 | - Install MCP servers from npm packages 120 | - Install MCP servers from local directories 121 | - Configure MCP servers for Cursor 122 | - Add custom MCP server configurations 123 | 124 | ## Prerequisites 125 | 126 | Before using this tool, you need to have installed: 127 | 128 | - [Node.js](https://nodejs.org/) (for npm packages) 129 | - [Cursor IDE](https://cursor.sh/) 130 | 131 | ## Installation 132 | 133 | There are several ways to install and use the Cursor MCP Installer: 134 | 135 | ### 1. Using npm (Recommended) 136 | 137 | ```bash 138 | npm install -g cursor-mcp-installer-free@0.1.3 139 | ``` 140 | 141 | After installation, add it to your Cursor MCP configuration file: 142 | 143 | ```json 144 | { 145 | "mcpServers": { 146 | "MCP Installer": { 147 | "command": "cursor-mcp-installer-free", 148 | "type": "stdio", 149 | "args": [ 150 | "index.mjs" 151 | ] 152 | } 153 | } 154 | } 155 | ``` 156 | 157 | ### 2. Using npx (No Installation Required) 158 | 159 | You can use npx to run the package without installing it globally: 160 | 161 | ```json 162 | { 163 | "mcpServers": { 164 | "MCP Installer": { 165 | "command": "npx", 166 | "type": "stdio", 167 | "args": [ 168 | "cursor-mcp-installer-free@0.1.3", 169 | "index.mjs" 170 | ] 171 | } 172 | } 173 | } 174 | ``` 175 | 176 | ### 3. Direct from GitHub 177 | 178 | Clone the repository and build it locally: 179 | 180 | ```bash 181 | # Clone the repository 182 | git clone https://github.com/matthewdcage/cursor-mcp-installer.git 183 | cd cursor-mcp-installer 184 | 185 | # Install dependencies and build 186 | npm install 187 | npm run build 188 | ``` 189 | 190 | Then configure Cursor to use your local installation: 191 | 192 | ```json 193 | { 194 | "mcpServers": { 195 | "MCP Installer": { 196 | "command": "node", 197 | "type": "stdio", 198 | "args": [ 199 | "/path/to/cursor-mcp-installer/lib/index.mjs" 200 | ] 201 | } 202 | } 203 | } 204 | ``` 205 | 206 | Replace `/path/to/cursor-mcp-installer` with the actual path where you've cloned the repository. 207 | 208 | ### Where is the Cursor MCP Configuration File? 209 | 210 | The Cursor MCP configuration file is located at: 211 | 212 | - **macOS/Linux**: `~/.cursor/mcp.json` 213 | - **Windows**: `%USERPROFILE%\.cursor\mcp.json` 214 | 215 | If the file doesn't exist, you can create it with the content from any of the installation methods above. 216 | 217 | ## Path Handling Improvements in v0.1.3 218 | 219 | Version 0.1.3 introduces significant improvements to path handling for MCP server installations: 220 | 221 | ### Enhanced Path Resolution 222 | - Properly normalizes both relative and absolute paths 223 | - Handles paths with spaces and special characters 224 | - Ensures consistent path formatting across different operating systems 225 | 226 | ### Better Schema Detection 227 | - Now scans all arguments for schema files, not just the first one 228 | - Supports more schema file extensions (.yaml, .yml, .json, .openapi) 229 | - Properly normalizes schema file paths before passing to servers 230 | 231 | ### Improved Server Discovery 232 | - Added detection of common server entry points in local directories 233 | - Enhanced support for Python-based MCP servers 234 | - Better error reporting for path-related issues 235 | 236 | These improvements make the MCP Installer more robust for all types of server installations, especially when dealing with custom file paths, OpenAPI schemas, and local directory installations. 237 | 238 | ## Usage 239 | 240 | Once installed, you can use Claude or Cursor to interact with the MCP Installer. Here are some example prompts: 241 | 242 | ### Install an npm package as an MCP server 243 | 244 | ``` 245 | Install the MCP server named mcp-server-fetch 246 | ``` 247 | 248 | ### Install with arguments 249 | 250 | ``` 251 | Install the @modelcontextprotocol/server-filesystem package as an MCP server. Use ['/home/user/documents'] for the arguments 252 | ``` 253 | 254 | ### Install a local MCP server 255 | 256 | ``` 257 | Install the MCP server at /home/user/projects/my-mcp-server 258 | ``` 259 | 260 | ### Install with environment variables 261 | 262 | ``` -------------------------------------------------------------------------------- /assets/README.md: -------------------------------------------------------------------------------- 1 | # Banner Image Generation 2 | 3 | This directory contains resources for the Cursor MCP Installer banner. 4 | 5 | ## Instructions for Generating a Proper Banner 6 | 7 | 1. Open the `banner-template.html` file in a web browser 8 | 2. Take a screenshot of the banner (the dark blue/purple gradient box with the Cursor MCP Installer title) 9 | 3. Save the screenshot as `cursor-mcp-banner.png` in this directory 10 | 4. Push the image to the repository 11 | 12 | ## Using a Different Banner 13 | 14 | If you prefer to use a different banner image: 15 | 16 | 1. Create your banner image with dimensions around 1200x400px 17 | 2. Save it as `cursor-mcp-banner.png` in this directory 18 | 3. Update the README.md in the root directory to use your image: -------------------------------------------------------------------------------- /assets/banner-template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Cursor MCP Installer Banner 7 | 138 | 139 | 140 | 159 | 160 | -------------------------------------------------------------------------------- /assets/cursor-mcp-banner.txt: -------------------------------------------------------------------------------- 1 | ______ __ __ _____ _____ _____ _ _ _ 2 | / _____) | \/ | __ \_ _| |_ _| | | | | | 3 | | / _ _ ____ ___ _ _ | \ / | |__) || | | | _ __ ___| |_ __ _| | | ___ _ __ 4 | | | | | | |/ ___) _ \ | | | | |\/| | ___/ | | | | | '_ \/ __| __/ _` | | |/ _ \ '__| 5 | | \_____ | |_| | | | |_| | |_| | | | | | | _| |_ _| |_| | | \__ \ || (_| | | | __/ | 6 | \______)|____/|_| \___/\__ | |_| |_|_| |_____| |_____|_| |_|___/\__\__,_|_|_|\___|_| 7 | (____/ 8 | 9 | +-----------------------------------------+ 10 | | Cursor MCP Installer | 11 | | Seamlessly install MCP servers | 12 | +-----------------------------------------+ -------------------------------------------------------------------------------- /docs/installtion-success-cursor-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthewdcage/cursor-mcp-installer/acbcd5f72d327c813701a720e03b18613d10a7c2/docs/installtion-success-cursor-screenshot.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cursor-mcp-installer-free", 3 | "version": "0.1.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "cursor-mcp-installer-free", 9 | "version": "0.1.1", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@modelcontextprotocol/sdk": "^1.0.1", 13 | "rimraf": "^6.0.1", 14 | "spawn-rx": "^4.0.0" 15 | }, 16 | "bin": { 17 | "cursor-mcp-installer-free": "lib/index.mjs" 18 | }, 19 | "devDependencies": { 20 | "shx": "^0.3.4", 21 | "ts-node": "^10.9.2", 22 | "typescript": "^5.6.3" 23 | } 24 | }, 25 | "node_modules/@cspotcode/source-map-support": { 26 | "version": "0.8.1", 27 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 28 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 29 | "dev": true, 30 | "dependencies": { 31 | "@jridgewell/trace-mapping": "0.3.9" 32 | }, 33 | "engines": { 34 | "node": ">=12" 35 | } 36 | }, 37 | "node_modules/@isaacs/cliui": { 38 | "version": "8.0.2", 39 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 40 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 41 | "dependencies": { 42 | "string-width": "^5.1.2", 43 | "string-width-cjs": "npm:string-width@^4.2.0", 44 | "strip-ansi": "^7.0.1", 45 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 46 | "wrap-ansi": "^8.1.0", 47 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 48 | }, 49 | "engines": { 50 | "node": ">=12" 51 | } 52 | }, 53 | "node_modules/@jridgewell/resolve-uri": { 54 | "version": "3.1.2", 55 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 56 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 57 | "dev": true, 58 | "engines": { 59 | "node": ">=6.0.0" 60 | } 61 | }, 62 | "node_modules/@jridgewell/sourcemap-codec": { 63 | "version": "1.5.0", 64 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 65 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 66 | "dev": true 67 | }, 68 | "node_modules/@jridgewell/trace-mapping": { 69 | "version": "0.3.9", 70 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 71 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 72 | "dev": true, 73 | "dependencies": { 74 | "@jridgewell/resolve-uri": "^3.0.3", 75 | "@jridgewell/sourcemap-codec": "^1.4.10" 76 | } 77 | }, 78 | "node_modules/@modelcontextprotocol/sdk": { 79 | "version": "1.7.0", 80 | "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.7.0.tgz", 81 | "integrity": "sha512-IYPe/FLpvF3IZrd/f5p5ffmWhMc3aEMuM2wGJASDqC2Ge7qatVCdbfPx3n/5xFeb19xN0j/911M2AaFuircsWA==", 82 | "dependencies": { 83 | "content-type": "^1.0.5", 84 | "cors": "^2.8.5", 85 | "eventsource": "^3.0.2", 86 | "express": "^5.0.1", 87 | "express-rate-limit": "^7.5.0", 88 | "pkce-challenge": "^4.1.0", 89 | "raw-body": "^3.0.0", 90 | "zod": "^3.23.8", 91 | "zod-to-json-schema": "^3.24.1" 92 | }, 93 | "engines": { 94 | "node": ">=18" 95 | } 96 | }, 97 | "node_modules/@tsconfig/node10": { 98 | "version": "1.0.11", 99 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", 100 | "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", 101 | "dev": true 102 | }, 103 | "node_modules/@tsconfig/node12": { 104 | "version": "1.0.11", 105 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 106 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 107 | "dev": true 108 | }, 109 | "node_modules/@tsconfig/node14": { 110 | "version": "1.0.3", 111 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 112 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 113 | "dev": true 114 | }, 115 | "node_modules/@tsconfig/node16": { 116 | "version": "1.0.4", 117 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 118 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 119 | "dev": true 120 | }, 121 | "node_modules/@types/node": { 122 | "version": "22.13.10", 123 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", 124 | "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", 125 | "dev": true, 126 | "peer": true, 127 | "dependencies": { 128 | "undici-types": "~6.20.0" 129 | } 130 | }, 131 | "node_modules/accepts": { 132 | "version": "2.0.0", 133 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", 134 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 135 | "dependencies": { 136 | "mime-types": "^3.0.0", 137 | "negotiator": "^1.0.0" 138 | }, 139 | "engines": { 140 | "node": ">= 0.6" 141 | } 142 | }, 143 | "node_modules/acorn": { 144 | "version": "8.14.1", 145 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 146 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 147 | "dev": true, 148 | "bin": { 149 | "acorn": "bin/acorn" 150 | }, 151 | "engines": { 152 | "node": ">=0.4.0" 153 | } 154 | }, 155 | "node_modules/acorn-walk": { 156 | "version": "8.3.4", 157 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 158 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 159 | "dev": true, 160 | "dependencies": { 161 | "acorn": "^8.11.0" 162 | }, 163 | "engines": { 164 | "node": ">=0.4.0" 165 | } 166 | }, 167 | "node_modules/ansi-regex": { 168 | "version": "6.1.0", 169 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 170 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 171 | "engines": { 172 | "node": ">=12" 173 | }, 174 | "funding": { 175 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 176 | } 177 | }, 178 | "node_modules/ansi-styles": { 179 | "version": "6.2.1", 180 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 181 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 182 | "engines": { 183 | "node": ">=12" 184 | }, 185 | "funding": { 186 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 187 | } 188 | }, 189 | "node_modules/arg": { 190 | "version": "4.1.3", 191 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 192 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 193 | "dev": true 194 | }, 195 | "node_modules/balanced-match": { 196 | "version": "1.0.2", 197 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 198 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 199 | }, 200 | "node_modules/body-parser": { 201 | "version": "2.1.0", 202 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.1.0.tgz", 203 | "integrity": "sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==", 204 | "dependencies": { 205 | "bytes": "^3.1.2", 206 | "content-type": "^1.0.5", 207 | "debug": "^4.4.0", 208 | "http-errors": "^2.0.0", 209 | "iconv-lite": "^0.5.2", 210 | "on-finished": "^2.4.1", 211 | "qs": "^6.14.0", 212 | "raw-body": "^3.0.0", 213 | "type-is": "^2.0.0" 214 | }, 215 | "engines": { 216 | "node": ">=18" 217 | } 218 | }, 219 | "node_modules/body-parser/node_modules/debug": { 220 | "version": "4.4.0", 221 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 222 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 223 | "dependencies": { 224 | "ms": "^2.1.3" 225 | }, 226 | "engines": { 227 | "node": ">=6.0" 228 | }, 229 | "peerDependenciesMeta": { 230 | "supports-color": { 231 | "optional": true 232 | } 233 | } 234 | }, 235 | "node_modules/body-parser/node_modules/ms": { 236 | "version": "2.1.3", 237 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 238 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 239 | }, 240 | "node_modules/body-parser/node_modules/qs": { 241 | "version": "6.14.0", 242 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", 243 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 244 | "dependencies": { 245 | "side-channel": "^1.1.0" 246 | }, 247 | "engines": { 248 | "node": ">=0.6" 249 | }, 250 | "funding": { 251 | "url": "https://github.com/sponsors/ljharb" 252 | } 253 | }, 254 | "node_modules/brace-expansion": { 255 | "version": "2.0.1", 256 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 257 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 258 | "dependencies": { 259 | "balanced-match": "^1.0.0" 260 | } 261 | }, 262 | "node_modules/bytes": { 263 | "version": "3.1.2", 264 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 265 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 266 | "engines": { 267 | "node": ">= 0.8" 268 | } 269 | }, 270 | "node_modules/call-bind-apply-helpers": { 271 | "version": "1.0.2", 272 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 273 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 274 | "dependencies": { 275 | "es-errors": "^1.3.0", 276 | "function-bind": "^1.1.2" 277 | }, 278 | "engines": { 279 | "node": ">= 0.4" 280 | } 281 | }, 282 | "node_modules/call-bound": { 283 | "version": "1.0.4", 284 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 285 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 286 | "dependencies": { 287 | "call-bind-apply-helpers": "^1.0.2", 288 | "get-intrinsic": "^1.3.0" 289 | }, 290 | "engines": { 291 | "node": ">= 0.4" 292 | }, 293 | "funding": { 294 | "url": "https://github.com/sponsors/ljharb" 295 | } 296 | }, 297 | "node_modules/color-convert": { 298 | "version": "2.0.1", 299 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 300 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 301 | "dependencies": { 302 | "color-name": "~1.1.4" 303 | }, 304 | "engines": { 305 | "node": ">=7.0.0" 306 | } 307 | }, 308 | "node_modules/color-name": { 309 | "version": "1.1.4", 310 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 311 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 312 | }, 313 | "node_modules/concat-map": { 314 | "version": "0.0.1", 315 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 316 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 317 | "dev": true 318 | }, 319 | "node_modules/content-disposition": { 320 | "version": "1.0.0", 321 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", 322 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", 323 | "dependencies": { 324 | "safe-buffer": "5.2.1" 325 | }, 326 | "engines": { 327 | "node": ">= 0.6" 328 | } 329 | }, 330 | "node_modules/content-type": { 331 | "version": "1.0.5", 332 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 333 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 334 | "engines": { 335 | "node": ">= 0.6" 336 | } 337 | }, 338 | "node_modules/cookie": { 339 | "version": "0.7.1", 340 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", 341 | "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", 342 | "engines": { 343 | "node": ">= 0.6" 344 | } 345 | }, 346 | "node_modules/cookie-signature": { 347 | "version": "1.2.2", 348 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", 349 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", 350 | "engines": { 351 | "node": ">=6.6.0" 352 | } 353 | }, 354 | "node_modules/cors": { 355 | "version": "2.8.5", 356 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 357 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 358 | "dependencies": { 359 | "object-assign": "^4", 360 | "vary": "^1" 361 | }, 362 | "engines": { 363 | "node": ">= 0.10" 364 | } 365 | }, 366 | "node_modules/create-require": { 367 | "version": "1.1.1", 368 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 369 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 370 | "dev": true 371 | }, 372 | "node_modules/cross-spawn": { 373 | "version": "7.0.6", 374 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 375 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 376 | "dependencies": { 377 | "path-key": "^3.1.0", 378 | "shebang-command": "^2.0.0", 379 | "which": "^2.0.1" 380 | }, 381 | "engines": { 382 | "node": ">= 8" 383 | } 384 | }, 385 | "node_modules/debug": { 386 | "version": "4.3.6", 387 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 388 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 389 | "dependencies": { 390 | "ms": "2.1.2" 391 | }, 392 | "engines": { 393 | "node": ">=6.0" 394 | }, 395 | "peerDependenciesMeta": { 396 | "supports-color": { 397 | "optional": true 398 | } 399 | } 400 | }, 401 | "node_modules/depd": { 402 | "version": "2.0.0", 403 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 404 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 405 | "engines": { 406 | "node": ">= 0.8" 407 | } 408 | }, 409 | "node_modules/destroy": { 410 | "version": "1.2.0", 411 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 412 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 413 | "engines": { 414 | "node": ">= 0.8", 415 | "npm": "1.2.8000 || >= 1.4.16" 416 | } 417 | }, 418 | "node_modules/diff": { 419 | "version": "4.0.2", 420 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 421 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 422 | "dev": true, 423 | "engines": { 424 | "node": ">=0.3.1" 425 | } 426 | }, 427 | "node_modules/dunder-proto": { 428 | "version": "1.0.1", 429 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 430 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 431 | "dependencies": { 432 | "call-bind-apply-helpers": "^1.0.1", 433 | "es-errors": "^1.3.0", 434 | "gopd": "^1.2.0" 435 | }, 436 | "engines": { 437 | "node": ">= 0.4" 438 | } 439 | }, 440 | "node_modules/eastasianwidth": { 441 | "version": "0.2.0", 442 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 443 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" 444 | }, 445 | "node_modules/ee-first": { 446 | "version": "1.1.1", 447 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 448 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 449 | }, 450 | "node_modules/emoji-regex": { 451 | "version": "9.2.2", 452 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 453 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" 454 | }, 455 | "node_modules/encodeurl": { 456 | "version": "2.0.0", 457 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 458 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 459 | "engines": { 460 | "node": ">= 0.8" 461 | } 462 | }, 463 | "node_modules/es-define-property": { 464 | "version": "1.0.1", 465 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 466 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 467 | "engines": { 468 | "node": ">= 0.4" 469 | } 470 | }, 471 | "node_modules/es-errors": { 472 | "version": "1.3.0", 473 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 474 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 475 | "engines": { 476 | "node": ">= 0.4" 477 | } 478 | }, 479 | "node_modules/es-object-atoms": { 480 | "version": "1.1.1", 481 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 482 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 483 | "dependencies": { 484 | "es-errors": "^1.3.0" 485 | }, 486 | "engines": { 487 | "node": ">= 0.4" 488 | } 489 | }, 490 | "node_modules/escape-html": { 491 | "version": "1.0.3", 492 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 493 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 494 | }, 495 | "node_modules/etag": { 496 | "version": "1.8.1", 497 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 498 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 499 | "engines": { 500 | "node": ">= 0.6" 501 | } 502 | }, 503 | "node_modules/eventsource": { 504 | "version": "3.0.5", 505 | "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.5.tgz", 506 | "integrity": "sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==", 507 | "dependencies": { 508 | "eventsource-parser": "^3.0.0" 509 | }, 510 | "engines": { 511 | "node": ">=18.0.0" 512 | } 513 | }, 514 | "node_modules/eventsource-parser": { 515 | "version": "3.0.0", 516 | "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.0.tgz", 517 | "integrity": "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==", 518 | "engines": { 519 | "node": ">=18.0.0" 520 | } 521 | }, 522 | "node_modules/express": { 523 | "version": "5.0.1", 524 | "resolved": "https://registry.npmjs.org/express/-/express-5.0.1.tgz", 525 | "integrity": "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==", 526 | "dependencies": { 527 | "accepts": "^2.0.0", 528 | "body-parser": "^2.0.1", 529 | "content-disposition": "^1.0.0", 530 | "content-type": "~1.0.4", 531 | "cookie": "0.7.1", 532 | "cookie-signature": "^1.2.1", 533 | "debug": "4.3.6", 534 | "depd": "2.0.0", 535 | "encodeurl": "~2.0.0", 536 | "escape-html": "~1.0.3", 537 | "etag": "~1.8.1", 538 | "finalhandler": "^2.0.0", 539 | "fresh": "2.0.0", 540 | "http-errors": "2.0.0", 541 | "merge-descriptors": "^2.0.0", 542 | "methods": "~1.1.2", 543 | "mime-types": "^3.0.0", 544 | "on-finished": "2.4.1", 545 | "once": "1.4.0", 546 | "parseurl": "~1.3.3", 547 | "proxy-addr": "~2.0.7", 548 | "qs": "6.13.0", 549 | "range-parser": "~1.2.1", 550 | "router": "^2.0.0", 551 | "safe-buffer": "5.2.1", 552 | "send": "^1.1.0", 553 | "serve-static": "^2.1.0", 554 | "setprototypeof": "1.2.0", 555 | "statuses": "2.0.1", 556 | "type-is": "^2.0.0", 557 | "utils-merge": "1.0.1", 558 | "vary": "~1.1.2" 559 | }, 560 | "engines": { 561 | "node": ">= 18" 562 | } 563 | }, 564 | "node_modules/express-rate-limit": { 565 | "version": "7.5.0", 566 | "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", 567 | "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", 568 | "engines": { 569 | "node": ">= 16" 570 | }, 571 | "funding": { 572 | "url": "https://github.com/sponsors/express-rate-limit" 573 | }, 574 | "peerDependencies": { 575 | "express": "^4.11 || 5 || ^5.0.0-beta.1" 576 | } 577 | }, 578 | "node_modules/finalhandler": { 579 | "version": "2.1.0", 580 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", 581 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", 582 | "dependencies": { 583 | "debug": "^4.4.0", 584 | "encodeurl": "^2.0.0", 585 | "escape-html": "^1.0.3", 586 | "on-finished": "^2.4.1", 587 | "parseurl": "^1.3.3", 588 | "statuses": "^2.0.1" 589 | }, 590 | "engines": { 591 | "node": ">= 0.8" 592 | } 593 | }, 594 | "node_modules/finalhandler/node_modules/debug": { 595 | "version": "4.4.0", 596 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 597 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 598 | "dependencies": { 599 | "ms": "^2.1.3" 600 | }, 601 | "engines": { 602 | "node": ">=6.0" 603 | }, 604 | "peerDependenciesMeta": { 605 | "supports-color": { 606 | "optional": true 607 | } 608 | } 609 | }, 610 | "node_modules/finalhandler/node_modules/ms": { 611 | "version": "2.1.3", 612 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 613 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 614 | }, 615 | "node_modules/foreground-child": { 616 | "version": "3.3.1", 617 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 618 | "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 619 | "dependencies": { 620 | "cross-spawn": "^7.0.6", 621 | "signal-exit": "^4.0.1" 622 | }, 623 | "engines": { 624 | "node": ">=14" 625 | }, 626 | "funding": { 627 | "url": "https://github.com/sponsors/isaacs" 628 | } 629 | }, 630 | "node_modules/forwarded": { 631 | "version": "0.2.0", 632 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 633 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 634 | "engines": { 635 | "node": ">= 0.6" 636 | } 637 | }, 638 | "node_modules/fresh": { 639 | "version": "2.0.0", 640 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", 641 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", 642 | "engines": { 643 | "node": ">= 0.8" 644 | } 645 | }, 646 | "node_modules/fs.realpath": { 647 | "version": "1.0.0", 648 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 649 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 650 | "dev": true 651 | }, 652 | "node_modules/function-bind": { 653 | "version": "1.1.2", 654 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 655 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 656 | "funding": { 657 | "url": "https://github.com/sponsors/ljharb" 658 | } 659 | }, 660 | "node_modules/get-intrinsic": { 661 | "version": "1.3.0", 662 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 663 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 664 | "dependencies": { 665 | "call-bind-apply-helpers": "^1.0.2", 666 | "es-define-property": "^1.0.1", 667 | "es-errors": "^1.3.0", 668 | "es-object-atoms": "^1.1.1", 669 | "function-bind": "^1.1.2", 670 | "get-proto": "^1.0.1", 671 | "gopd": "^1.2.0", 672 | "has-symbols": "^1.1.0", 673 | "hasown": "^2.0.2", 674 | "math-intrinsics": "^1.1.0" 675 | }, 676 | "engines": { 677 | "node": ">= 0.4" 678 | }, 679 | "funding": { 680 | "url": "https://github.com/sponsors/ljharb" 681 | } 682 | }, 683 | "node_modules/get-proto": { 684 | "version": "1.0.1", 685 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 686 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 687 | "dependencies": { 688 | "dunder-proto": "^1.0.1", 689 | "es-object-atoms": "^1.0.0" 690 | }, 691 | "engines": { 692 | "node": ">= 0.4" 693 | } 694 | }, 695 | "node_modules/glob": { 696 | "version": "11.0.1", 697 | "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", 698 | "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", 699 | "dependencies": { 700 | "foreground-child": "^3.1.0", 701 | "jackspeak": "^4.0.1", 702 | "minimatch": "^10.0.0", 703 | "minipass": "^7.1.2", 704 | "package-json-from-dist": "^1.0.0", 705 | "path-scurry": "^2.0.0" 706 | }, 707 | "bin": { 708 | "glob": "dist/esm/bin.mjs" 709 | }, 710 | "engines": { 711 | "node": "20 || >=22" 712 | }, 713 | "funding": { 714 | "url": "https://github.com/sponsors/isaacs" 715 | } 716 | }, 717 | "node_modules/gopd": { 718 | "version": "1.2.0", 719 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 720 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 721 | "engines": { 722 | "node": ">= 0.4" 723 | }, 724 | "funding": { 725 | "url": "https://github.com/sponsors/ljharb" 726 | } 727 | }, 728 | "node_modules/has-symbols": { 729 | "version": "1.1.0", 730 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 731 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 732 | "engines": { 733 | "node": ">= 0.4" 734 | }, 735 | "funding": { 736 | "url": "https://github.com/sponsors/ljharb" 737 | } 738 | }, 739 | "node_modules/hasown": { 740 | "version": "2.0.2", 741 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 742 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 743 | "dependencies": { 744 | "function-bind": "^1.1.2" 745 | }, 746 | "engines": { 747 | "node": ">= 0.4" 748 | } 749 | }, 750 | "node_modules/http-errors": { 751 | "version": "2.0.0", 752 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 753 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 754 | "dependencies": { 755 | "depd": "2.0.0", 756 | "inherits": "2.0.4", 757 | "setprototypeof": "1.2.0", 758 | "statuses": "2.0.1", 759 | "toidentifier": "1.0.1" 760 | }, 761 | "engines": { 762 | "node": ">= 0.8" 763 | } 764 | }, 765 | "node_modules/iconv-lite": { 766 | "version": "0.5.2", 767 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", 768 | "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", 769 | "dependencies": { 770 | "safer-buffer": ">= 2.1.2 < 3" 771 | }, 772 | "engines": { 773 | "node": ">=0.10.0" 774 | } 775 | }, 776 | "node_modules/inflight": { 777 | "version": "1.0.6", 778 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 779 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 780 | "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.", 781 | "dev": true, 782 | "dependencies": { 783 | "once": "^1.3.0", 784 | "wrappy": "1" 785 | } 786 | }, 787 | "node_modules/inherits": { 788 | "version": "2.0.4", 789 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 790 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 791 | }, 792 | "node_modules/interpret": { 793 | "version": "1.4.0", 794 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 795 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", 796 | "dev": true, 797 | "engines": { 798 | "node": ">= 0.10" 799 | } 800 | }, 801 | "node_modules/ipaddr.js": { 802 | "version": "1.9.1", 803 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 804 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 805 | "engines": { 806 | "node": ">= 0.10" 807 | } 808 | }, 809 | "node_modules/is-core-module": { 810 | "version": "2.16.1", 811 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 812 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 813 | "dev": true, 814 | "dependencies": { 815 | "hasown": "^2.0.2" 816 | }, 817 | "engines": { 818 | "node": ">= 0.4" 819 | }, 820 | "funding": { 821 | "url": "https://github.com/sponsors/ljharb" 822 | } 823 | }, 824 | "node_modules/is-fullwidth-code-point": { 825 | "version": "3.0.0", 826 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 827 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 828 | "engines": { 829 | "node": ">=8" 830 | } 831 | }, 832 | "node_modules/is-promise": { 833 | "version": "4.0.0", 834 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", 835 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" 836 | }, 837 | "node_modules/isexe": { 838 | "version": "2.0.0", 839 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 840 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 841 | }, 842 | "node_modules/jackspeak": { 843 | "version": "4.1.0", 844 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", 845 | "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", 846 | "dependencies": { 847 | "@isaacs/cliui": "^8.0.2" 848 | }, 849 | "engines": { 850 | "node": "20 || >=22" 851 | }, 852 | "funding": { 853 | "url": "https://github.com/sponsors/isaacs" 854 | } 855 | }, 856 | "node_modules/lodash.assign": { 857 | "version": "4.2.0", 858 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", 859 | "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" 860 | }, 861 | "node_modules/lru-cache": { 862 | "version": "11.0.2", 863 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", 864 | "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", 865 | "engines": { 866 | "node": "20 || >=22" 867 | } 868 | }, 869 | "node_modules/make-error": { 870 | "version": "1.3.6", 871 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 872 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 873 | "dev": true 874 | }, 875 | "node_modules/math-intrinsics": { 876 | "version": "1.1.0", 877 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 878 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 879 | "engines": { 880 | "node": ">= 0.4" 881 | } 882 | }, 883 | "node_modules/media-typer": { 884 | "version": "1.1.0", 885 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 886 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 887 | "engines": { 888 | "node": ">= 0.8" 889 | } 890 | }, 891 | "node_modules/merge-descriptors": { 892 | "version": "2.0.0", 893 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", 894 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", 895 | "engines": { 896 | "node": ">=18" 897 | }, 898 | "funding": { 899 | "url": "https://github.com/sponsors/sindresorhus" 900 | } 901 | }, 902 | "node_modules/methods": { 903 | "version": "1.1.2", 904 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 905 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 906 | "engines": { 907 | "node": ">= 0.6" 908 | } 909 | }, 910 | "node_modules/mime-db": { 911 | "version": "1.54.0", 912 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", 913 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", 914 | "engines": { 915 | "node": ">= 0.6" 916 | } 917 | }, 918 | "node_modules/mime-types": { 919 | "version": "3.0.0", 920 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz", 921 | "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", 922 | "dependencies": { 923 | "mime-db": "^1.53.0" 924 | }, 925 | "engines": { 926 | "node": ">= 0.6" 927 | } 928 | }, 929 | "node_modules/minimatch": { 930 | "version": "10.0.1", 931 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", 932 | "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", 933 | "dependencies": { 934 | "brace-expansion": "^2.0.1" 935 | }, 936 | "engines": { 937 | "node": "20 || >=22" 938 | }, 939 | "funding": { 940 | "url": "https://github.com/sponsors/isaacs" 941 | } 942 | }, 943 | "node_modules/minimist": { 944 | "version": "1.2.8", 945 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 946 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 947 | "dev": true, 948 | "funding": { 949 | "url": "https://github.com/sponsors/ljharb" 950 | } 951 | }, 952 | "node_modules/minipass": { 953 | "version": "7.1.2", 954 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 955 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 956 | "engines": { 957 | "node": ">=16 || 14 >=14.17" 958 | } 959 | }, 960 | "node_modules/ms": { 961 | "version": "2.1.2", 962 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 963 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 964 | }, 965 | "node_modules/negotiator": { 966 | "version": "1.0.0", 967 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 968 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 969 | "engines": { 970 | "node": ">= 0.6" 971 | } 972 | }, 973 | "node_modules/object-assign": { 974 | "version": "4.1.1", 975 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 976 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 977 | "engines": { 978 | "node": ">=0.10.0" 979 | } 980 | }, 981 | "node_modules/object-inspect": { 982 | "version": "1.13.4", 983 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 984 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 985 | "engines": { 986 | "node": ">= 0.4" 987 | }, 988 | "funding": { 989 | "url": "https://github.com/sponsors/ljharb" 990 | } 991 | }, 992 | "node_modules/on-finished": { 993 | "version": "2.4.1", 994 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 995 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 996 | "dependencies": { 997 | "ee-first": "1.1.1" 998 | }, 999 | "engines": { 1000 | "node": ">= 0.8" 1001 | } 1002 | }, 1003 | "node_modules/once": { 1004 | "version": "1.4.0", 1005 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1006 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1007 | "dependencies": { 1008 | "wrappy": "1" 1009 | } 1010 | }, 1011 | "node_modules/package-json-from-dist": { 1012 | "version": "1.0.1", 1013 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 1014 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" 1015 | }, 1016 | "node_modules/parseurl": { 1017 | "version": "1.3.3", 1018 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1019 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1020 | "engines": { 1021 | "node": ">= 0.8" 1022 | } 1023 | }, 1024 | "node_modules/path-is-absolute": { 1025 | "version": "1.0.1", 1026 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1027 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1028 | "dev": true, 1029 | "engines": { 1030 | "node": ">=0.10.0" 1031 | } 1032 | }, 1033 | "node_modules/path-key": { 1034 | "version": "3.1.1", 1035 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1036 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1037 | "engines": { 1038 | "node": ">=8" 1039 | } 1040 | }, 1041 | "node_modules/path-parse": { 1042 | "version": "1.0.7", 1043 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1044 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1045 | "dev": true 1046 | }, 1047 | "node_modules/path-scurry": { 1048 | "version": "2.0.0", 1049 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", 1050 | "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", 1051 | "dependencies": { 1052 | "lru-cache": "^11.0.0", 1053 | "minipass": "^7.1.2" 1054 | }, 1055 | "engines": { 1056 | "node": "20 || >=22" 1057 | }, 1058 | "funding": { 1059 | "url": "https://github.com/sponsors/isaacs" 1060 | } 1061 | }, 1062 | "node_modules/path-to-regexp": { 1063 | "version": "8.2.0", 1064 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", 1065 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", 1066 | "engines": { 1067 | "node": ">=16" 1068 | } 1069 | }, 1070 | "node_modules/pkce-challenge": { 1071 | "version": "4.1.0", 1072 | "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-4.1.0.tgz", 1073 | "integrity": "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==", 1074 | "engines": { 1075 | "node": ">=16.20.0" 1076 | } 1077 | }, 1078 | "node_modules/proxy-addr": { 1079 | "version": "2.0.7", 1080 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1081 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1082 | "dependencies": { 1083 | "forwarded": "0.2.0", 1084 | "ipaddr.js": "1.9.1" 1085 | }, 1086 | "engines": { 1087 | "node": ">= 0.10" 1088 | } 1089 | }, 1090 | "node_modules/qs": { 1091 | "version": "6.13.0", 1092 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 1093 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 1094 | "dependencies": { 1095 | "side-channel": "^1.0.6" 1096 | }, 1097 | "engines": { 1098 | "node": ">=0.6" 1099 | }, 1100 | "funding": { 1101 | "url": "https://github.com/sponsors/ljharb" 1102 | } 1103 | }, 1104 | "node_modules/range-parser": { 1105 | "version": "1.2.1", 1106 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1107 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1108 | "engines": { 1109 | "node": ">= 0.6" 1110 | } 1111 | }, 1112 | "node_modules/raw-body": { 1113 | "version": "3.0.0", 1114 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", 1115 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", 1116 | "dependencies": { 1117 | "bytes": "3.1.2", 1118 | "http-errors": "2.0.0", 1119 | "iconv-lite": "0.6.3", 1120 | "unpipe": "1.0.0" 1121 | }, 1122 | "engines": { 1123 | "node": ">= 0.8" 1124 | } 1125 | }, 1126 | "node_modules/raw-body/node_modules/iconv-lite": { 1127 | "version": "0.6.3", 1128 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1129 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1130 | "dependencies": { 1131 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1132 | }, 1133 | "engines": { 1134 | "node": ">=0.10.0" 1135 | } 1136 | }, 1137 | "node_modules/rechoir": { 1138 | "version": "0.6.2", 1139 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1140 | "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", 1141 | "dev": true, 1142 | "dependencies": { 1143 | "resolve": "^1.1.6" 1144 | }, 1145 | "engines": { 1146 | "node": ">= 0.10" 1147 | } 1148 | }, 1149 | "node_modules/resolve": { 1150 | "version": "1.22.10", 1151 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 1152 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 1153 | "dev": true, 1154 | "dependencies": { 1155 | "is-core-module": "^2.16.0", 1156 | "path-parse": "^1.0.7", 1157 | "supports-preserve-symlinks-flag": "^1.0.0" 1158 | }, 1159 | "bin": { 1160 | "resolve": "bin/resolve" 1161 | }, 1162 | "engines": { 1163 | "node": ">= 0.4" 1164 | }, 1165 | "funding": { 1166 | "url": "https://github.com/sponsors/ljharb" 1167 | } 1168 | }, 1169 | "node_modules/rimraf": { 1170 | "version": "6.0.1", 1171 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", 1172 | "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", 1173 | "dependencies": { 1174 | "glob": "^11.0.0", 1175 | "package-json-from-dist": "^1.0.0" 1176 | }, 1177 | "bin": { 1178 | "rimraf": "dist/esm/bin.mjs" 1179 | }, 1180 | "engines": { 1181 | "node": "20 || >=22" 1182 | }, 1183 | "funding": { 1184 | "url": "https://github.com/sponsors/isaacs" 1185 | } 1186 | }, 1187 | "node_modules/router": { 1188 | "version": "2.1.0", 1189 | "resolved": "https://registry.npmjs.org/router/-/router-2.1.0.tgz", 1190 | "integrity": "sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==", 1191 | "dependencies": { 1192 | "is-promise": "^4.0.0", 1193 | "parseurl": "^1.3.3", 1194 | "path-to-regexp": "^8.0.0" 1195 | }, 1196 | "engines": { 1197 | "node": ">= 18" 1198 | } 1199 | }, 1200 | "node_modules/rxjs": { 1201 | "version": "7.8.2", 1202 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", 1203 | "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", 1204 | "dependencies": { 1205 | "tslib": "^2.1.0" 1206 | } 1207 | }, 1208 | "node_modules/safe-buffer": { 1209 | "version": "5.2.1", 1210 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1211 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1212 | "funding": [ 1213 | { 1214 | "type": "github", 1215 | "url": "https://github.com/sponsors/feross" 1216 | }, 1217 | { 1218 | "type": "patreon", 1219 | "url": "https://www.patreon.com/feross" 1220 | }, 1221 | { 1222 | "type": "consulting", 1223 | "url": "https://feross.org/support" 1224 | } 1225 | ] 1226 | }, 1227 | "node_modules/safer-buffer": { 1228 | "version": "2.1.2", 1229 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1230 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1231 | }, 1232 | "node_modules/send": { 1233 | "version": "1.1.0", 1234 | "resolved": "https://registry.npmjs.org/send/-/send-1.1.0.tgz", 1235 | "integrity": "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==", 1236 | "dependencies": { 1237 | "debug": "^4.3.5", 1238 | "destroy": "^1.2.0", 1239 | "encodeurl": "^2.0.0", 1240 | "escape-html": "^1.0.3", 1241 | "etag": "^1.8.1", 1242 | "fresh": "^0.5.2", 1243 | "http-errors": "^2.0.0", 1244 | "mime-types": "^2.1.35", 1245 | "ms": "^2.1.3", 1246 | "on-finished": "^2.4.1", 1247 | "range-parser": "^1.2.1", 1248 | "statuses": "^2.0.1" 1249 | }, 1250 | "engines": { 1251 | "node": ">= 18" 1252 | } 1253 | }, 1254 | "node_modules/send/node_modules/fresh": { 1255 | "version": "0.5.2", 1256 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1257 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 1258 | "engines": { 1259 | "node": ">= 0.6" 1260 | } 1261 | }, 1262 | "node_modules/send/node_modules/mime-db": { 1263 | "version": "1.52.0", 1264 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1265 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1266 | "engines": { 1267 | "node": ">= 0.6" 1268 | } 1269 | }, 1270 | "node_modules/send/node_modules/mime-types": { 1271 | "version": "2.1.35", 1272 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1273 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1274 | "dependencies": { 1275 | "mime-db": "1.52.0" 1276 | }, 1277 | "engines": { 1278 | "node": ">= 0.6" 1279 | } 1280 | }, 1281 | "node_modules/send/node_modules/ms": { 1282 | "version": "2.1.3", 1283 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1284 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1285 | }, 1286 | "node_modules/serve-static": { 1287 | "version": "2.1.0", 1288 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.1.0.tgz", 1289 | "integrity": "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==", 1290 | "dependencies": { 1291 | "encodeurl": "^2.0.0", 1292 | "escape-html": "^1.0.3", 1293 | "parseurl": "^1.3.3", 1294 | "send": "^1.0.0" 1295 | }, 1296 | "engines": { 1297 | "node": ">= 18" 1298 | } 1299 | }, 1300 | "node_modules/setprototypeof": { 1301 | "version": "1.2.0", 1302 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1303 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1304 | }, 1305 | "node_modules/shebang-command": { 1306 | "version": "2.0.0", 1307 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1308 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1309 | "dependencies": { 1310 | "shebang-regex": "^3.0.0" 1311 | }, 1312 | "engines": { 1313 | "node": ">=8" 1314 | } 1315 | }, 1316 | "node_modules/shebang-regex": { 1317 | "version": "3.0.0", 1318 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1319 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1320 | "engines": { 1321 | "node": ">=8" 1322 | } 1323 | }, 1324 | "node_modules/shelljs": { 1325 | "version": "0.8.5", 1326 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", 1327 | "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", 1328 | "dev": true, 1329 | "dependencies": { 1330 | "glob": "^7.0.0", 1331 | "interpret": "^1.0.0", 1332 | "rechoir": "^0.6.2" 1333 | }, 1334 | "bin": { 1335 | "shjs": "bin/shjs" 1336 | }, 1337 | "engines": { 1338 | "node": ">=4" 1339 | } 1340 | }, 1341 | "node_modules/shelljs/node_modules/brace-expansion": { 1342 | "version": "1.1.11", 1343 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1344 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1345 | "dev": true, 1346 | "dependencies": { 1347 | "balanced-match": "^1.0.0", 1348 | "concat-map": "0.0.1" 1349 | } 1350 | }, 1351 | "node_modules/shelljs/node_modules/glob": { 1352 | "version": "7.2.3", 1353 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1354 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1355 | "deprecated": "Glob versions prior to v9 are no longer supported", 1356 | "dev": true, 1357 | "dependencies": { 1358 | "fs.realpath": "^1.0.0", 1359 | "inflight": "^1.0.4", 1360 | "inherits": "2", 1361 | "minimatch": "^3.1.1", 1362 | "once": "^1.3.0", 1363 | "path-is-absolute": "^1.0.0" 1364 | }, 1365 | "engines": { 1366 | "node": "*" 1367 | }, 1368 | "funding": { 1369 | "url": "https://github.com/sponsors/isaacs" 1370 | } 1371 | }, 1372 | "node_modules/shelljs/node_modules/minimatch": { 1373 | "version": "3.1.2", 1374 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1375 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1376 | "dev": true, 1377 | "dependencies": { 1378 | "brace-expansion": "^1.1.7" 1379 | }, 1380 | "engines": { 1381 | "node": "*" 1382 | } 1383 | }, 1384 | "node_modules/shx": { 1385 | "version": "0.3.4", 1386 | "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", 1387 | "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", 1388 | "dev": true, 1389 | "dependencies": { 1390 | "minimist": "^1.2.3", 1391 | "shelljs": "^0.8.5" 1392 | }, 1393 | "bin": { 1394 | "shx": "lib/cli.js" 1395 | }, 1396 | "engines": { 1397 | "node": ">=6" 1398 | } 1399 | }, 1400 | "node_modules/side-channel": { 1401 | "version": "1.1.0", 1402 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 1403 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 1404 | "dependencies": { 1405 | "es-errors": "^1.3.0", 1406 | "object-inspect": "^1.13.3", 1407 | "side-channel-list": "^1.0.0", 1408 | "side-channel-map": "^1.0.1", 1409 | "side-channel-weakmap": "^1.0.2" 1410 | }, 1411 | "engines": { 1412 | "node": ">= 0.4" 1413 | }, 1414 | "funding": { 1415 | "url": "https://github.com/sponsors/ljharb" 1416 | } 1417 | }, 1418 | "node_modules/side-channel-list": { 1419 | "version": "1.0.0", 1420 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 1421 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 1422 | "dependencies": { 1423 | "es-errors": "^1.3.0", 1424 | "object-inspect": "^1.13.3" 1425 | }, 1426 | "engines": { 1427 | "node": ">= 0.4" 1428 | }, 1429 | "funding": { 1430 | "url": "https://github.com/sponsors/ljharb" 1431 | } 1432 | }, 1433 | "node_modules/side-channel-map": { 1434 | "version": "1.0.1", 1435 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 1436 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 1437 | "dependencies": { 1438 | "call-bound": "^1.0.2", 1439 | "es-errors": "^1.3.0", 1440 | "get-intrinsic": "^1.2.5", 1441 | "object-inspect": "^1.13.3" 1442 | }, 1443 | "engines": { 1444 | "node": ">= 0.4" 1445 | }, 1446 | "funding": { 1447 | "url": "https://github.com/sponsors/ljharb" 1448 | } 1449 | }, 1450 | "node_modules/side-channel-weakmap": { 1451 | "version": "1.0.2", 1452 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 1453 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 1454 | "dependencies": { 1455 | "call-bound": "^1.0.2", 1456 | "es-errors": "^1.3.0", 1457 | "get-intrinsic": "^1.2.5", 1458 | "object-inspect": "^1.13.3", 1459 | "side-channel-map": "^1.0.1" 1460 | }, 1461 | "engines": { 1462 | "node": ">= 0.4" 1463 | }, 1464 | "funding": { 1465 | "url": "https://github.com/sponsors/ljharb" 1466 | } 1467 | }, 1468 | "node_modules/signal-exit": { 1469 | "version": "4.1.0", 1470 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1471 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1472 | "engines": { 1473 | "node": ">=14" 1474 | }, 1475 | "funding": { 1476 | "url": "https://github.com/sponsors/isaacs" 1477 | } 1478 | }, 1479 | "node_modules/spawn-rx": { 1480 | "version": "4.0.0", 1481 | "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-4.0.0.tgz", 1482 | "integrity": "sha512-N4cXZu2xWaIq39IcwcibBhhtArRt43/P3nHI5c1GVmlqbtN4oM6VuumdcZYs3TsH4Z17dsTRpqJls3Y8Foy26w==", 1483 | "dependencies": { 1484 | "debug": "^4.3.7", 1485 | "lodash.assign": "^4.2.0", 1486 | "rxjs": "^7.8.1" 1487 | } 1488 | }, 1489 | "node_modules/spawn-rx/node_modules/debug": { 1490 | "version": "4.4.0", 1491 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1492 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1493 | "dependencies": { 1494 | "ms": "^2.1.3" 1495 | }, 1496 | "engines": { 1497 | "node": ">=6.0" 1498 | }, 1499 | "peerDependenciesMeta": { 1500 | "supports-color": { 1501 | "optional": true 1502 | } 1503 | } 1504 | }, 1505 | "node_modules/spawn-rx/node_modules/ms": { 1506 | "version": "2.1.3", 1507 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1508 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1509 | }, 1510 | "node_modules/statuses": { 1511 | "version": "2.0.1", 1512 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1513 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1514 | "engines": { 1515 | "node": ">= 0.8" 1516 | } 1517 | }, 1518 | "node_modules/string-width": { 1519 | "version": "5.1.2", 1520 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1521 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1522 | "dependencies": { 1523 | "eastasianwidth": "^0.2.0", 1524 | "emoji-regex": "^9.2.2", 1525 | "strip-ansi": "^7.0.1" 1526 | }, 1527 | "engines": { 1528 | "node": ">=12" 1529 | }, 1530 | "funding": { 1531 | "url": "https://github.com/sponsors/sindresorhus" 1532 | } 1533 | }, 1534 | "node_modules/string-width-cjs": { 1535 | "name": "string-width", 1536 | "version": "4.2.3", 1537 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1538 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1539 | "dependencies": { 1540 | "emoji-regex": "^8.0.0", 1541 | "is-fullwidth-code-point": "^3.0.0", 1542 | "strip-ansi": "^6.0.1" 1543 | }, 1544 | "engines": { 1545 | "node": ">=8" 1546 | } 1547 | }, 1548 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 1549 | "version": "5.0.1", 1550 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1551 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1552 | "engines": { 1553 | "node": ">=8" 1554 | } 1555 | }, 1556 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1557 | "version": "8.0.0", 1558 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1559 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1560 | }, 1561 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 1562 | "version": "6.0.1", 1563 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1564 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1565 | "dependencies": { 1566 | "ansi-regex": "^5.0.1" 1567 | }, 1568 | "engines": { 1569 | "node": ">=8" 1570 | } 1571 | }, 1572 | "node_modules/strip-ansi": { 1573 | "version": "7.1.0", 1574 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1575 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1576 | "dependencies": { 1577 | "ansi-regex": "^6.0.1" 1578 | }, 1579 | "engines": { 1580 | "node": ">=12" 1581 | }, 1582 | "funding": { 1583 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1584 | } 1585 | }, 1586 | "node_modules/strip-ansi-cjs": { 1587 | "name": "strip-ansi", 1588 | "version": "6.0.1", 1589 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1590 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1591 | "dependencies": { 1592 | "ansi-regex": "^5.0.1" 1593 | }, 1594 | "engines": { 1595 | "node": ">=8" 1596 | } 1597 | }, 1598 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 1599 | "version": "5.0.1", 1600 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1601 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1602 | "engines": { 1603 | "node": ">=8" 1604 | } 1605 | }, 1606 | "node_modules/supports-preserve-symlinks-flag": { 1607 | "version": "1.0.0", 1608 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1609 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1610 | "dev": true, 1611 | "engines": { 1612 | "node": ">= 0.4" 1613 | }, 1614 | "funding": { 1615 | "url": "https://github.com/sponsors/ljharb" 1616 | } 1617 | }, 1618 | "node_modules/toidentifier": { 1619 | "version": "1.0.1", 1620 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1621 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1622 | "engines": { 1623 | "node": ">=0.6" 1624 | } 1625 | }, 1626 | "node_modules/ts-node": { 1627 | "version": "10.9.2", 1628 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 1629 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 1630 | "dev": true, 1631 | "dependencies": { 1632 | "@cspotcode/source-map-support": "^0.8.0", 1633 | "@tsconfig/node10": "^1.0.7", 1634 | "@tsconfig/node12": "^1.0.7", 1635 | "@tsconfig/node14": "^1.0.0", 1636 | "@tsconfig/node16": "^1.0.2", 1637 | "acorn": "^8.4.1", 1638 | "acorn-walk": "^8.1.1", 1639 | "arg": "^4.1.0", 1640 | "create-require": "^1.1.0", 1641 | "diff": "^4.0.1", 1642 | "make-error": "^1.1.1", 1643 | "v8-compile-cache-lib": "^3.0.1", 1644 | "yn": "3.1.1" 1645 | }, 1646 | "bin": { 1647 | "ts-node": "dist/bin.js", 1648 | "ts-node-cwd": "dist/bin-cwd.js", 1649 | "ts-node-esm": "dist/bin-esm.js", 1650 | "ts-node-script": "dist/bin-script.js", 1651 | "ts-node-transpile-only": "dist/bin-transpile.js", 1652 | "ts-script": "dist/bin-script-deprecated.js" 1653 | }, 1654 | "peerDependencies": { 1655 | "@swc/core": ">=1.2.50", 1656 | "@swc/wasm": ">=1.2.50", 1657 | "@types/node": "*", 1658 | "typescript": ">=2.7" 1659 | }, 1660 | "peerDependenciesMeta": { 1661 | "@swc/core": { 1662 | "optional": true 1663 | }, 1664 | "@swc/wasm": { 1665 | "optional": true 1666 | } 1667 | } 1668 | }, 1669 | "node_modules/tslib": { 1670 | "version": "2.8.1", 1671 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1672 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 1673 | }, 1674 | "node_modules/type-is": { 1675 | "version": "2.0.0", 1676 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz", 1677 | "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", 1678 | "dependencies": { 1679 | "content-type": "^1.0.5", 1680 | "media-typer": "^1.1.0", 1681 | "mime-types": "^3.0.0" 1682 | }, 1683 | "engines": { 1684 | "node": ">= 0.6" 1685 | } 1686 | }, 1687 | "node_modules/typescript": { 1688 | "version": "5.8.2", 1689 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 1690 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 1691 | "dev": true, 1692 | "bin": { 1693 | "tsc": "bin/tsc", 1694 | "tsserver": "bin/tsserver" 1695 | }, 1696 | "engines": { 1697 | "node": ">=14.17" 1698 | } 1699 | }, 1700 | "node_modules/undici-types": { 1701 | "version": "6.20.0", 1702 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", 1703 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", 1704 | "dev": true, 1705 | "peer": true 1706 | }, 1707 | "node_modules/unpipe": { 1708 | "version": "1.0.0", 1709 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1710 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1711 | "engines": { 1712 | "node": ">= 0.8" 1713 | } 1714 | }, 1715 | "node_modules/utils-merge": { 1716 | "version": "1.0.1", 1717 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1718 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1719 | "engines": { 1720 | "node": ">= 0.4.0" 1721 | } 1722 | }, 1723 | "node_modules/v8-compile-cache-lib": { 1724 | "version": "3.0.1", 1725 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 1726 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 1727 | "dev": true 1728 | }, 1729 | "node_modules/vary": { 1730 | "version": "1.1.2", 1731 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1732 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1733 | "engines": { 1734 | "node": ">= 0.8" 1735 | } 1736 | }, 1737 | "node_modules/which": { 1738 | "version": "2.0.2", 1739 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1740 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1741 | "dependencies": { 1742 | "isexe": "^2.0.0" 1743 | }, 1744 | "bin": { 1745 | "node-which": "bin/node-which" 1746 | }, 1747 | "engines": { 1748 | "node": ">= 8" 1749 | } 1750 | }, 1751 | "node_modules/wrap-ansi": { 1752 | "version": "8.1.0", 1753 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 1754 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1755 | "dependencies": { 1756 | "ansi-styles": "^6.1.0", 1757 | "string-width": "^5.0.1", 1758 | "strip-ansi": "^7.0.1" 1759 | }, 1760 | "engines": { 1761 | "node": ">=12" 1762 | }, 1763 | "funding": { 1764 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1765 | } 1766 | }, 1767 | "node_modules/wrap-ansi-cjs": { 1768 | "name": "wrap-ansi", 1769 | "version": "7.0.0", 1770 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1771 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1772 | "dependencies": { 1773 | "ansi-styles": "^4.0.0", 1774 | "string-width": "^4.1.0", 1775 | "strip-ansi": "^6.0.0" 1776 | }, 1777 | "engines": { 1778 | "node": ">=10" 1779 | }, 1780 | "funding": { 1781 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1782 | } 1783 | }, 1784 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 1785 | "version": "5.0.1", 1786 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1787 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1788 | "engines": { 1789 | "node": ">=8" 1790 | } 1791 | }, 1792 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 1793 | "version": "4.3.0", 1794 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1795 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1796 | "dependencies": { 1797 | "color-convert": "^2.0.1" 1798 | }, 1799 | "engines": { 1800 | "node": ">=8" 1801 | }, 1802 | "funding": { 1803 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1804 | } 1805 | }, 1806 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 1807 | "version": "8.0.0", 1808 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1809 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1810 | }, 1811 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 1812 | "version": "4.2.3", 1813 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1814 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1815 | "dependencies": { 1816 | "emoji-regex": "^8.0.0", 1817 | "is-fullwidth-code-point": "^3.0.0", 1818 | "strip-ansi": "^6.0.1" 1819 | }, 1820 | "engines": { 1821 | "node": ">=8" 1822 | } 1823 | }, 1824 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 1825 | "version": "6.0.1", 1826 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1827 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1828 | "dependencies": { 1829 | "ansi-regex": "^5.0.1" 1830 | }, 1831 | "engines": { 1832 | "node": ">=8" 1833 | } 1834 | }, 1835 | "node_modules/wrappy": { 1836 | "version": "1.0.2", 1837 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1838 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1839 | }, 1840 | "node_modules/yn": { 1841 | "version": "3.1.1", 1842 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1843 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1844 | "dev": true, 1845 | "engines": { 1846 | "node": ">=6" 1847 | } 1848 | }, 1849 | "node_modules/zod": { 1850 | "version": "3.24.2", 1851 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", 1852 | "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", 1853 | "funding": { 1854 | "url": "https://github.com/sponsors/colinhacks" 1855 | } 1856 | }, 1857 | "node_modules/zod-to-json-schema": { 1858 | "version": "3.24.4", 1859 | "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.4.tgz", 1860 | "integrity": "sha512-0uNlcvgabyrni9Ag8Vghj21drk7+7tp7VTwwR7KxxXXc/3pbXz2PHlDgj3cICahgF1kHm4dExBFj7BXrZJXzig==", 1861 | "peerDependencies": { 1862 | "zod": "^3.24.1" 1863 | } 1864 | } 1865 | } 1866 | } 1867 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cursor-mcp-installer-free", 3 | "version": "0.1.3", 4 | "bin": { 5 | "cursor-mcp-installer-free": "lib/index.mjs" 6 | }, 7 | "description": "A MCP server to install other MCP servers in Cursor", 8 | "main": "lib/index.mjs", 9 | "type": "module", 10 | "scripts": { 11 | "prepare": "tsc && shx chmod +x ./lib/index.mjs", 12 | "build": "tsc", 13 | "test": "echo \"No tests specified\"", 14 | "prepublishOnly": "npm run build", 15 | "publish-public": "npm publish --access public" 16 | }, 17 | "author": "Matthew Cage", 18 | "license": "MIT", 19 | "dependencies": { 20 | "@modelcontextprotocol/sdk": "^1.0.1", 21 | "rimraf": "^6.0.1", 22 | "spawn-rx": "^4.0.0" 23 | }, 24 | "devDependencies": { 25 | "shx": "^0.3.4", 26 | "ts-node": "^10.9.2", 27 | "typescript": "^5.6.3" 28 | }, 29 | "keywords": [ 30 | "cursor", 31 | "mcp", 32 | "installer", 33 | "ModelContextProtocol" 34 | ], 35 | "repository": { 36 | "type": "git", 37 | "url": "git+https://github.com/matthewdcage/cursor-mcp-installer.git" 38 | }, 39 | "bugs": { 40 | "url": "https://github.com/matthewdcage/cursor-mcp-installer/issues" 41 | }, 42 | "homepage": "https://github.com/matthewdcage/cursor-mcp-installer#readme", 43 | "engines": { 44 | "node": ">=16.0.0" 45 | }, 46 | "publishConfig": { 47 | "access": "public" 48 | }, 49 | "files": [ 50 | "lib/**/*" 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /src/index.mts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { Server } from "@modelcontextprotocol/sdk/server/index.js"; 4 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 5 | import { 6 | CallToolRequestSchema, 7 | ListToolsRequestSchema, 8 | } from "@modelcontextprotocol/sdk/types.js"; 9 | import * as os from "os"; 10 | import * as fs from "fs"; 11 | import * as path from "path"; 12 | import { spawnPromise } from "spawn-rx"; 13 | 14 | // Add startup logs for debugging 15 | console.log("Starting cursor-mcp-installer-free MCP server..."); 16 | 17 | const server = new Server( 18 | { 19 | name: "cursor-mcp-installer-free", 20 | version: "0.1.3", 21 | }, 22 | { 23 | capabilities: { 24 | tools: {}, 25 | }, 26 | } 27 | ); 28 | 29 | server.setRequestHandler(ListToolsRequestSchema, async () => { 30 | return { 31 | tools: [ 32 | { 33 | name: "install_repo_mcp_server", 34 | description: "Install an MCP server via npx or uvx", 35 | inputSchema: { 36 | type: "object", 37 | properties: { 38 | name: { 39 | type: "string", 40 | description: "The package name of the MCP server", 41 | }, 42 | args: { 43 | type: "array", 44 | items: { type: "string" }, 45 | description: "The arguments to pass along", 46 | }, 47 | env: { 48 | type: "array", 49 | items: { type: "string" }, 50 | description: "The environment variables to set, delimited by =", 51 | }, 52 | }, 53 | required: ["name"], 54 | }, 55 | }, 56 | { 57 | name: "install_local_mcp_server", 58 | description: 59 | "Install an MCP server whose code is cloned locally on your computer", 60 | inputSchema: { 61 | type: "object", 62 | properties: { 63 | path: { 64 | type: "string", 65 | description: 66 | "The path to the MCP server code cloned on your computer", 67 | }, 68 | args: { 69 | type: "array", 70 | items: { type: "string" }, 71 | description: "The arguments to pass along", 72 | }, 73 | env: { 74 | type: "array", 75 | items: { type: "string" }, 76 | description: "The environment variables to set, delimited by =", 77 | }, 78 | }, 79 | required: ["path"], 80 | }, 81 | }, 82 | { 83 | name: "add_to_cursor_config", 84 | description: 85 | "Add any MCP server to Cursor's configuration", 86 | inputSchema: { 87 | type: "object", 88 | properties: { 89 | name: { 90 | type: "string", 91 | description: "Display name for the MCP server in Cursor", 92 | }, 93 | command: { 94 | type: "string", 95 | description: "Command to execute (e.g., node, npx, python)", 96 | }, 97 | args: { 98 | type: "array", 99 | items: { type: "string" }, 100 | description: "Arguments to pass to the command", 101 | }, 102 | path: { 103 | type: "string", 104 | description: "Path to the MCP server on disk (optional, used instead of command+args)", 105 | }, 106 | env: { 107 | type: "array", 108 | items: { type: "string" }, 109 | description: "Environment variables to set, delimited by =", 110 | }, 111 | }, 112 | required: ["name"], 113 | }, 114 | }, 115 | ], 116 | }; 117 | }); 118 | 119 | async function hasNodeJs() { 120 | try { 121 | await spawnPromise("node", ["--version"]); 122 | return true; 123 | } catch (e) { 124 | return false; 125 | } 126 | } 127 | 128 | async function hasUvx() { 129 | try { 130 | await spawnPromise("uvx", ["--version"]); 131 | return true; 132 | } catch (e) { 133 | return false; 134 | } 135 | } 136 | 137 | async function isNpmPackage(name: string) { 138 | try { 139 | await spawnPromise("npm", ["view", name, "version"]); 140 | return true; 141 | } catch (e) { 142 | return false; 143 | } 144 | } 145 | 146 | // New helper functions for path handling and server detection 147 | 148 | /** 149 | * Normalizes and validates a file path 150 | * @param filePath The file path to normalize 151 | * @param cwd Optional current working directory for resolving relative paths 152 | * @returns Normalized absolute path 153 | */ 154 | function normalizeServerPath(filePath: string, cwd?: string): string { 155 | // Handle file paths with spaces that might be unquoted 156 | filePath = filePath.trim(); 157 | 158 | // Convert relative to absolute path if needed 159 | if (!path.isAbsolute(filePath) && cwd) { 160 | filePath = path.resolve(cwd, filePath); 161 | } 162 | 163 | // Return normalized path (even if it doesn't exist, as it might be a command) 164 | return path.normalize(filePath); 165 | } 166 | 167 | /** 168 | * Looks for a schema file in the provided arguments 169 | * @param args Array of arguments to search 170 | * @returns The schema file path if found, undefined otherwise 171 | */ 172 | function findSchemaFile(args?: string[]): string | undefined { 173 | if (!args || args.length === 0) return undefined; 174 | 175 | // Check all arguments for schema files 176 | return args.find(arg => 177 | arg && typeof arg === 'string' && 178 | /\.(yaml|yml|json|openapi)$/i.test(arg)); 179 | } 180 | 181 | /** 182 | * Finds a server entry point in a directory 183 | * @param dirPath Directory to search 184 | * @returns Object with path and command, or undefined if not found 185 | */ 186 | function findServerEntryPoint(dirPath: string): { path: string, command: string } | undefined { 187 | // Look for common entry point patterns 188 | const entryPointPatterns = [ 189 | // Node.js patterns 190 | { file: 'index.js', command: 'node' }, 191 | { file: 'index.mjs', command: 'node' }, 192 | { file: 'server.js', command: 'node' }, 193 | { file: 'dist/index.js', command: 'node' }, 194 | { file: 'lib/index.js', command: 'node' }, 195 | { file: 'lib/index.mjs', command: 'node' }, 196 | // Python patterns 197 | { file: 'server.py', command: 'python3' }, 198 | { file: 'main.py', command: 'python3' }, 199 | { file: '__main__.py', command: 'python3' } 200 | ]; 201 | 202 | for (const pattern of entryPointPatterns) { 203 | const filePath = path.join(dirPath, pattern.file); 204 | if (fs.existsSync(filePath)) { 205 | return { path: filePath, command: pattern.command }; 206 | } 207 | } 208 | 209 | return undefined; 210 | } 211 | 212 | function installToCursor( 213 | name: string, 214 | cmd: string, 215 | args: string[], 216 | env?: string[] 217 | ) { 218 | const configPath = path.join(os.homedir(), ".cursor", "mcp.json"); 219 | 220 | // In Smithery environment, we may not have direct file system access 221 | // Instead, return the config that would be written 222 | const isInContainer = process.env.SMITHERY_CONTAINER === 'true'; 223 | 224 | let config: any; 225 | try { 226 | if (!isInContainer && fs.existsSync(configPath)) { 227 | config = JSON.parse(fs.readFileSync(configPath, "utf8")); 228 | } else { 229 | config = { mcpServers: {} }; 230 | } 231 | } catch (e) { 232 | config = { mcpServers: {} }; 233 | } 234 | 235 | const envObj = (env ?? []).reduce((acc, val) => { 236 | const [key, value] = val.split("="); 237 | acc[key] = value; 238 | 239 | return acc; 240 | }, {} as Record); 241 | 242 | // Normalize any file paths in args 243 | const normalizedArgs = args.map(arg => { 244 | // Only normalize if it looks like a file path 245 | if (arg && typeof arg === 'string' && (arg.includes('/') || arg.includes('\\'))) { 246 | try { 247 | return normalizeServerPath(arg); 248 | } catch (e) { 249 | // If normalization fails, return the original arg 250 | return arg; 251 | } 252 | } 253 | return arg; 254 | }); 255 | 256 | const newServer = { 257 | command: cmd, 258 | type: "stdio", 259 | args: normalizedArgs, 260 | ...(env ? { env: envObj } : {}), 261 | }; 262 | 263 | config.mcpServers = config.mcpServers || {}; 264 | config.mcpServers[name] = newServer; 265 | 266 | if (!isInContainer && fs.existsSync(path.dirname(configPath))) { 267 | try { 268 | fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); 269 | return true; 270 | } catch (e) { 271 | console.error("Failed to write config file:", e); 272 | // Continue to return the config even if we can't write it 273 | } 274 | } 275 | 276 | // Return the configuration that would be written 277 | return config; 278 | } 279 | 280 | function installRepoWithArgsToCursor( 281 | name: string, 282 | npmIfTrueElseUvx: boolean, 283 | args?: string[], 284 | env?: string[] 285 | ) { 286 | // If the name is in a scoped package, we need to remove the scope 287 | const serverName = /^@.*\//i.test(name) ? name.split("/")[1] : name; 288 | 289 | // For Cursor, create a friendly display name 290 | const formattedName = serverName 291 | .replace(/-/g, ' ') 292 | .replace(/\b\w/g, l => l.toUpperCase()); 293 | 294 | // Check if we're using a package that requires special handling 295 | if (name === 'mcp-openapi-schema' || name.includes('openapi-schema')) { 296 | // For OpenAPI schema servers, find schema file anywhere in the arguments 297 | const schemaFile = findSchemaFile(args); 298 | 299 | if (schemaFile) { 300 | // Special configuration for OpenAPI schema servers 301 | // First try to get the installed package path 302 | try { 303 | const packagePath = path.dirname(require.resolve(`${name}/package.json`)); 304 | const indexPath = path.join(packagePath, 'index.mjs'); 305 | 306 | if (fs.existsSync(indexPath)) { 307 | // Create new args array with normalized schema path 308 | const newArgs = args?.map(arg => { 309 | if (arg === schemaFile) { 310 | try { 311 | return normalizeServerPath(schemaFile, process.cwd()); 312 | } catch (e) { 313 | return arg; 314 | } 315 | } 316 | return arg; 317 | }) ?? []; 318 | 319 | installToCursor( 320 | formattedName, 321 | 'node', 322 | [indexPath, ...newArgs], 323 | env 324 | ); 325 | return; 326 | } 327 | } catch (error) { 328 | console.warn(`Couldn't resolve ${name} package path, falling back to npx`); 329 | } 330 | } 331 | } 332 | 333 | // Check if this is a Python package 334 | if (!npmIfTrueElseUvx || name.includes('x-mcp') || name.includes('python') || name.endsWith('.py')) { 335 | // For Python MCP servers, we should use python -m module_name pattern instead of uvx 336 | // This helps ensure proper module paths and environment 337 | 338 | const moduleName = name.replace(/-/g, '_').replace(/\.git$/, ''); 339 | // Extract module name from common patterns like username/repo-name.git 340 | const cleanModuleName = moduleName.includes('/') ? 341 | moduleName.split('/').pop()!.replace(/\.git$/, '') : 342 | moduleName; 343 | 344 | // For X Twitter MCP specifically 345 | if (name.includes('x-mcp')) { 346 | installToCursor( 347 | 'X Twitter Tools', 348 | 'python3', 349 | ['-m', `${cleanModuleName.replace(/-/g, '_')}.server`], 350 | env 351 | ); 352 | return; 353 | } 354 | 355 | // For other Python-based MCP servers 356 | installToCursor( 357 | formattedName, 358 | 'python3', 359 | ['-m', cleanModuleName], 360 | env 361 | ); 362 | return; 363 | } 364 | 365 | // Default case - use npx/uvx 366 | installToCursor( 367 | formattedName, 368 | npmIfTrueElseUvx ? "npx" : "uvx", 369 | ["-y", name, ...(args ?? [])], 370 | env 371 | ); 372 | } 373 | 374 | async function attemptNodeInstall( 375 | directory: string 376 | ): Promise> { 377 | await spawnPromise("npm", ["install"], { cwd: directory }); 378 | 379 | // Run down package.json looking for bins 380 | const pkg = JSON.parse( 381 | fs.readFileSync(path.join(directory, "package.json"), "utf-8") 382 | ); 383 | 384 | const result: Record = {}; 385 | 386 | // Check for bin entries first 387 | if (pkg.bin) { 388 | Object.keys(pkg.bin).forEach(key => { 389 | result[key] = normalizeServerPath(pkg.bin[key], directory); 390 | }); 391 | } 392 | 393 | // If no bins, try main entry point 394 | if (Object.keys(result).length === 0 && pkg.main) { 395 | result[pkg.name] = normalizeServerPath(pkg.main, directory); 396 | } 397 | 398 | // If still no results, try to find a server entry point 399 | if (Object.keys(result).length === 0) { 400 | const entryPoint = findServerEntryPoint(directory); 401 | if (entryPoint) { 402 | result[pkg.name || 'server'] = entryPoint.path; 403 | } 404 | } 405 | 406 | return result; 407 | } 408 | 409 | async function addToCursorConfig( 410 | name: string, 411 | command?: string, 412 | args?: string[], 413 | serverPath?: string, 414 | env?: string[] 415 | ) { 416 | const isInContainer = process.env.SMITHERY_CONTAINER === 'true'; 417 | 418 | // Handle the case where the user provides either a command or a path 419 | if (!serverPath && !command) { 420 | return { 421 | content: [ 422 | { 423 | type: "text", 424 | text: "Error: You must provide either a command or a path!", 425 | }, 426 | ], 427 | isError: true, 428 | }; 429 | } 430 | 431 | try { 432 | // If a server path is provided, use that instead of the command+args 433 | if (serverPath) { 434 | // Normalize the server path 435 | const normalizedPath = normalizeServerPath(serverPath, process.cwd()); 436 | 437 | if (!isInContainer && !fs.existsSync(normalizedPath)) { 438 | return { 439 | content: [ 440 | { 441 | type: "text", 442 | text: `Error: Path ${normalizedPath} does not exist!`, 443 | }, 444 | ], 445 | isError: true, 446 | }; 447 | } 448 | 449 | // Use node to run the server if it's a JavaScript file 450 | if (normalizedPath.endsWith('.js') || normalizedPath.endsWith('.mjs')) { 451 | command = 'node'; 452 | args = [normalizedPath, ...(args || [])]; 453 | } else if (normalizedPath.endsWith('.py')) { 454 | // Use python for Python files 455 | command = 'python3'; 456 | args = [normalizedPath, ...(args || [])]; 457 | } else { 458 | // Otherwise use the serverPath as the command 459 | command = normalizedPath; 460 | args = args || []; 461 | } 462 | } else if (args) { 463 | // If we have command and args, normalize any file paths in args 464 | args = args.map(arg => { 465 | // Only normalize if it looks like a file path 466 | if (arg && typeof arg === 'string' && (arg.includes('/') || arg.includes('\\'))) { 467 | try { 468 | return normalizeServerPath(arg, process.cwd()); 469 | } catch (e) { 470 | // If normalization fails, return the original arg 471 | return arg; 472 | } 473 | } 474 | return arg; 475 | }); 476 | } 477 | 478 | // Create server config 479 | const envObj = (env ?? []).reduce((acc: Record, val) => { 480 | const [key, value] = val.split("="); 481 | if (key) acc[key] = value || ""; 482 | return acc; 483 | }, {} as Record); 484 | 485 | const serverConfig = { 486 | command: command!, // We've verified either command or serverPath is provided 487 | type: "stdio", 488 | args: args || [], 489 | ...(env && env.length > 0 ? { env: envObj } : {}) 490 | }; 491 | 492 | if (isInContainer) { 493 | // In Smithery, just return the configuration 494 | const config: { mcpServers: Record } = { mcpServers: {} }; 495 | config.mcpServers[name] = serverConfig; 496 | 497 | return { 498 | content: [ 499 | { 500 | type: "text", 501 | text: `Here's the configuration to add to your ~/.cursor/mcp.json file:\n\n` + 502 | `\`\`\`json\n${JSON.stringify(config, null, 2)}\n\`\`\`\n\n` + 503 | `After adding this configuration, restart Cursor to apply the changes.` 504 | }, 505 | ], 506 | }; 507 | } else { 508 | // In local environment, update the config file 509 | const configPath = path.join(os.homedir(), ".cursor", "mcp.json"); 510 | 511 | let config: { mcpServers: Record }; 512 | try { 513 | config = fs.existsSync(configPath) 514 | ? JSON.parse(fs.readFileSync(configPath, "utf8")) 515 | : { mcpServers: {} }; 516 | } catch (e) { 517 | config = { mcpServers: {} }; 518 | } 519 | 520 | config.mcpServers = config.mcpServers || {}; 521 | config.mcpServers[name] = serverConfig; 522 | 523 | fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); 524 | 525 | return { 526 | content: [ 527 | { 528 | type: "text", 529 | text: `Successfully added ${name} to your Cursor configuration! Please restart Cursor to apply the changes.`, 530 | }, 531 | ], 532 | }; 533 | } 534 | } catch (e) { 535 | return { 536 | content: [ 537 | { 538 | type: "text", 539 | text: `Error: ${e}`, 540 | }, 541 | ], 542 | isError: true, 543 | }; 544 | } 545 | } 546 | 547 | async function installLocalMcpServer( 548 | dirPath: string, 549 | args?: string[], 550 | env?: string[] 551 | ) { 552 | const isInContainer = process.env.SMITHERY_CONTAINER === 'true'; 553 | 554 | if (isInContainer) { 555 | return { 556 | content: [ 557 | { 558 | type: "text", 559 | text: "Local directory installation is not available in the Smithery environment. " + 560 | "Please use this tool locally with Cursor to install from local directories.", 561 | }, 562 | ], 563 | isError: true, 564 | }; 565 | } 566 | 567 | try { 568 | // Normalize the directory path 569 | const normalizedDirPath = normalizeServerPath(dirPath, process.cwd()); 570 | 571 | if (!fs.existsSync(normalizedDirPath)) { 572 | return { 573 | content: [ 574 | { 575 | type: "text", 576 | text: `Path ${normalizedDirPath} does not exist locally!`, 577 | }, 578 | ], 579 | isError: true, 580 | }; 581 | } 582 | 583 | // Check if it's a Node.js package with package.json 584 | if (fs.existsSync(path.join(normalizedDirPath, "package.json"))) { 585 | const servers = await attemptNodeInstall(normalizedDirPath); 586 | 587 | if (Object.keys(servers).length > 0) { 588 | Object.keys(servers).forEach((name) => { 589 | // Install to Cursor 590 | const formattedName = name 591 | .replace(/-/g, ' ') 592 | .replace(/\b\w/g, l => l.toUpperCase()); 593 | 594 | installToCursor( 595 | formattedName, 596 | "node", 597 | [servers[name], ...(args ?? [])], 598 | env 599 | ); 600 | }); 601 | 602 | return { 603 | content: [ 604 | { 605 | type: "text", 606 | text: `Installed the following servers to Cursor: ${Object.keys( 607 | servers 608 | ).join(", ")}. Please restart Cursor to apply the changes.`, 609 | }, 610 | ], 611 | }; 612 | } 613 | } 614 | 615 | // If not a Node.js package or no server found, try to find a server entry point 616 | const entryPoint = findServerEntryPoint(normalizedDirPath); 617 | if (entryPoint) { 618 | // Get the directory name for a default name 619 | const dirName = path.basename(normalizedDirPath); 620 | const formattedName = dirName 621 | .replace(/-/g, ' ') 622 | .replace(/\b\w/g, l => l.toUpperCase()); 623 | 624 | installToCursor( 625 | formattedName, 626 | entryPoint.command, 627 | [entryPoint.path, ...(args ?? [])], 628 | env 629 | ); 630 | 631 | return { 632 | content: [ 633 | { 634 | type: "text", 635 | text: `Installed ${formattedName} to Cursor. Please restart Cursor to apply the changes.`, 636 | }, 637 | ], 638 | }; 639 | } 640 | 641 | return { 642 | content: [ 643 | { 644 | type: "text", 645 | text: `Can't figure out how to install ${normalizedDirPath}. No server entry point was found.`, 646 | }, 647 | ], 648 | isError: true, 649 | }; 650 | } catch (e) { 651 | return { 652 | content: [ 653 | { 654 | type: "text", 655 | text: `Error installing from local directory: ${e}`, 656 | }, 657 | ], 658 | isError: true, 659 | }; 660 | } 661 | } 662 | 663 | async function installRepoMcpServer( 664 | name: string, 665 | args?: string[], 666 | env?: string[] 667 | ) { 668 | if (!(await hasNodeJs())) { 669 | return { 670 | content: [ 671 | { 672 | type: "text", 673 | text: "Error: Node.js is not installed, please install it!", 674 | }, 675 | ], 676 | isError: true, 677 | }; 678 | } 679 | 680 | const isNpm = await isNpmPackage(name); 681 | const hasUv = await hasUvx(); 682 | 683 | if (!isNpm && !hasUv) { 684 | return { 685 | content: [ 686 | { 687 | type: "text", 688 | text: "Error: Package not found in npm registry and uvx is not installed!", 689 | }, 690 | ], 691 | isError: true, 692 | }; 693 | } 694 | 695 | const isInContainer = process.env.SMITHERY_CONTAINER === 'true'; 696 | 697 | try { 698 | if (isInContainer) { 699 | // In Smithery, we can't directly install - provide instructions instead 700 | const packageManager = isNpm ? "npm" : "uvx"; 701 | const configResult = installRepoWithArgsToCursor(name, isNpm, args, env); 702 | 703 | return { 704 | content: [ 705 | { 706 | type: "text", 707 | text: `Instructions for installing ${name}:\n\n` + 708 | `1. Install the package with: ${packageManager} install -g ${name}\n\n` + 709 | `2. Add the following to your ~/.cursor/mcp.json file:\n\n` + 710 | `\`\`\`json\n${JSON.stringify(configResult, null, 2)}\n\`\`\`\n\n` + 711 | `3. Restart Cursor and the MCP server will be available` 712 | }, 713 | ], 714 | }; 715 | } else { 716 | // Normal direct installation 717 | installRepoWithArgsToCursor(name, isNpm, args, env); 718 | 719 | return { 720 | content: [ 721 | { 722 | type: "text", 723 | text: `Successfully installed the ${name} MCP server!`, 724 | }, 725 | ], 726 | }; 727 | } 728 | } catch (e) { 729 | return { 730 | content: [ 731 | { 732 | type: "text", 733 | text: `Error: ${e}`, 734 | }, 735 | ], 736 | isError: true, 737 | }; 738 | } 739 | } 740 | 741 | // Add the server request handler for tool calls 742 | server.setRequestHandler(CallToolRequestSchema, async (request) => { 743 | try { 744 | if (request.params.name === "install_repo_mcp_server") { 745 | const { name, args, env } = request.params.arguments as { 746 | name: string; 747 | args?: string[]; 748 | env?: string[]; 749 | }; 750 | 751 | return await installRepoMcpServer(name, args, env); 752 | } 753 | 754 | if (request.params.name === "install_local_mcp_server") { 755 | const dirPath = request.params.arguments!.path as string; 756 | const { args, env } = request.params.arguments as { 757 | args?: string[]; 758 | env?: string[]; 759 | }; 760 | 761 | return await installLocalMcpServer(dirPath, args, env); 762 | } 763 | 764 | if (request.params.name === "add_to_cursor_config") { 765 | const { name, command, args, path: serverPath, env } = request.params.arguments as { 766 | name: string; 767 | command?: string; 768 | args?: string[]; 769 | path?: string; 770 | env?: string[]; 771 | }; 772 | 773 | return await addToCursorConfig(name, command, args, serverPath, env); 774 | } 775 | 776 | throw new Error(`Unknown tool: ${request.params.name}`); 777 | } catch (err) { 778 | return { 779 | content: [ 780 | { 781 | type: "text", 782 | text: `Error setting up package: ${err}`, 783 | }, 784 | ], 785 | isError: true, 786 | }; 787 | } 788 | }); 789 | 790 | async function runServer() { 791 | console.log("Initializing MCP server transport..."); 792 | const transport = new StdioServerTransport(); 793 | console.log("Connecting MCP server..."); 794 | await server.connect(transport); 795 | console.log("MCP server connected and ready"); 796 | } 797 | 798 | runServer().catch((error) => { 799 | console.error("Error starting MCP server:", error); 800 | process.exit(1); 801 | }); 802 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "removeComments": false, 4 | "preserveConstEnums": true, 5 | "sourceMap": true, 6 | "declaration": true, 7 | "noImplicitAny": true, 8 | "noImplicitReturns": true, 9 | "strictNullChecks": true, 10 | "noUnusedLocals": true, 11 | "noImplicitThis": true, 12 | "noUnusedParameters": true, 13 | "module": "NodeNext", 14 | "moduleResolution": "NodeNext", 15 | "pretty": true, 16 | "target": "ES2022", 17 | "outDir": "lib", 18 | "esModuleInterop": true, 19 | "skipLibCheck": true, 20 | "forceConsistentCasingInFileNames": true, 21 | "strict": true, 22 | "lib": ["dom", "es2022"] 23 | }, 24 | "formatCodeOptions": { 25 | "indentSize": 2, 26 | "tabSize": 2 27 | }, 28 | "include": ["src/**/*.mts"], 29 | "exclude": ["node_modules", "lib", "**/*.spec.ts"] 30 | } --------------------------------------------------------------------------------