├── .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 | [](https://opensource.org/licenses/MIT)
27 | [](https://www.npmjs.com/package/cursor-mcp-installer-free)
28 | [](https://github.com/anthropic-labs/model-context-protocol)
29 | [](https://cursor.sh)
30 | [](https://www.npmjs.com/package/cursor-mcp-installer-free)
31 |
32 |
33 |
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 |
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 |
141 |
142 |
143 |
144 |
149 |
150 |
Cursor MCP Installer
151 |
Seamlessly install and configure MCP servers for your Cursor IDE
152 |
153 |
MCP Protocol
154 |
Cursor IDE
155 |
156 |
157 |
158 |
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 | }
--------------------------------------------------------------------------------