├── .gitignore ├── images └── wow.gif ├── tsconfig.json ├── package.json ├── LICENSE ├── src ├── schemas.ts └── index.ts ├── README.md └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules 3 | .DS_Store 4 | dist -------------------------------------------------------------------------------- /images/wow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Scrapybara/scrapybara-mcp/HEAD/images/wow.gif -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "ESNext", 5 | "moduleResolution": "node", 6 | "outDir": "./dist", 7 | "rootDir": "./src", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "skipLibCheck": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "allowImportingTsExtensions": false, 13 | "noEmit": false 14 | }, 15 | "include": ["src/**/*.ts"], 16 | "exclude": ["node_modules"] 17 | } 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "scrapybara-mcp", 3 | "version": "0.1.0", 4 | "description": "MCP server for Scrapybara", 5 | "license": "MIT", 6 | "author": "Scrapybara", 7 | "homepage": "https://scrapybara.com", 8 | "bugs": "https://github.com/scrapybara/scrapybara-mcp/issues", 9 | "type": "module", 10 | "bin": { 11 | "mcp-server-scrapybara": "dist/index.js" 12 | }, 13 | "files": [ 14 | "dist" 15 | ], 16 | "scripts": { 17 | "build": "tsc && shx chmod +x dist/*.js", 18 | "watch": "tsc --watch" 19 | }, 20 | "dependencies": { 21 | "@modelcontextprotocol/sdk": "^1.7.0", 22 | "scrapybara": "^2.4.1", 23 | "zod": "^3.24.2", 24 | "zod-to-json-schema": "^3.24.4" 25 | }, 26 | "devDependencies": { 27 | "@types/node": "^22", 28 | "shx": "^0.3.4", 29 | "typescript": "^5.6.2" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Scrapybara Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | export const CancellationNotificationSchema = z.object({ 4 | method: z.literal("notifications/cancelled"), 5 | params: z.object({ 6 | requestId: z.string(), 7 | }), 8 | }); 9 | 10 | export const StartInstanceSchema = z.object({}); 11 | 12 | export const GetInstancesSchema = z.object({}); 13 | 14 | export const StopInstanceSchema = z.object({ 15 | instance_id: z.string().describe("The ID of the instance to stop."), 16 | }); 17 | 18 | export const BashSchema = z.object({ 19 | instance_id: z 20 | .string() 21 | .describe("The ID of the instance to run the command on."), 22 | command: z.string().describe("The command to run in the instance shell."), 23 | }); 24 | 25 | export const ActSchema = z.object({ 26 | instance_id: z.string().describe("The ID of the instance to act on."), 27 | prompt: z.string().describe(`The prompt to act on. 28 | 29 | - Go to https://ycombinator.com/companies, set batch filter to W25, and extract all company names. 30 | - Find the best way to contact Scrapybara. 31 | - Order a Big Mac from McDonald's on Doordash. 32 | 33 | `), 34 | schema: z 35 | .any() 36 | .optional() 37 | .describe("Optional schema if you want to extract structured output."), 38 | }); 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 7 |
8 | 9 |

10 | MIT License 11 | Discord 12 | X 13 | 14 | A Model Context Protocol server for [Scrapybara](https://scrapybara.com). This server enables MCP clients such as [Claude Desktop](https://claude.ai/download), [Cursor](https://www.cursor.com/), and [Windsurf](https://codeium.com/windsurf) to interact with virtual Ubuntu desktops and take actions such as browsing the web, running code, and more. 15 | 16 | ## Prerequisites 17 | 18 | - Node.js 18+ 19 | - pnpm 20 | - Scrapybara API key (get one at [scrapybara.com](https://scrapybara.com)) 21 | 22 | ## Installation 23 | 24 | 1. Clone the repository: 25 | 26 | ```bash 27 | git clone https://github.com/scrapybara/scrapybara-mcp.git 28 | cd scrapybara-mcp 29 | ``` 30 | 31 | 2. Install dependencies: 32 | 33 | ```bash 34 | pnpm install 35 | ``` 36 | 37 | 3. Build the project: 38 | 39 | ```bash 40 | pnpm build 41 | ``` 42 | 43 | 4. Add the following to your MCP client config: 44 | 45 | ```json 46 | { 47 | "mcpServers": { 48 | "scrapybara-mcp": { 49 | "command": "node", 50 | "args": ["path/to/scrapybara-mcp/dist/index.js"], 51 | "env": { 52 | "SCRAPYBARA_API_KEY": "", 53 | "ACT_MODEL": "", // "anthropic" or "openai" 54 | "AUTH_STATE_ID": "" // Optional, for authenticating the browser 55 | } 56 | } 57 | } 58 | } 59 | ``` 60 | 61 | 5. Restart your MCP client and you're good to go! 62 | 63 | ## Tools 64 | 65 | - **start_instance** - Start a Scrapybara Ubuntu instance. Use it as a desktop sandbox to access the web or run code. Always present the stream URL to the user afterwards so they can watch the instance in real time. 66 | - **get_instances** - Get all running Scrapybara instances. 67 | - **stop_instance** - Stop a running Scrapybara instance. 68 | - **bash** - Run a bash command in a Scrapybara instance. 69 | - **act** - Take action on a Scrapybara instance through an agent. The agent can control the instance with mouse/keyboard and bash commands. 70 | 71 | ## Contributing 72 | 73 | Scrapybara MCP is a community-driven project. Whether you're submitting an idea, fixing a typo, adding a new tool, or improving an existing one, your contributions are greatly appreciated! 74 | 75 | Before contributing, read through the existing issues and pull requests to see if someone else is already working on something similar. That way you can avoid duplicating efforts. 76 | 77 | If there are more tools or features you'd like to see, feel free to suggest them on the [issues page](https://github.com/scrapybara/scrapybara-mcp/issues). 78 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 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 | TextContent, 9 | } from "@modelcontextprotocol/sdk/types.js"; 10 | import { zodToJsonSchema } from "zod-to-json-schema"; 11 | import { z } from "zod"; 12 | 13 | import { ScrapybaraClient, UbuntuInstance, Scrapybara } from "scrapybara"; 14 | import { 15 | anthropic, 16 | UBUNTU_SYSTEM_PROMPT as ANTHROPIC_UBUNTU_SYSTEM_PROMPT, 17 | } from "scrapybara/anthropic/index.js"; 18 | import { 19 | openai, 20 | UBUNTU_SYSTEM_PROMPT as OPENAI_UBUNTU_SYSTEM_PROMPT, 21 | } from "scrapybara/openai/index.js"; 22 | import { bashTool, computerTool, editTool } from "scrapybara/tools/index.js"; 23 | 24 | import { 25 | StopInstanceSchema, 26 | BashSchema, 27 | ActSchema, 28 | StartInstanceSchema, 29 | GetInstancesSchema, 30 | CancellationNotificationSchema, 31 | } from "./schemas.js"; 32 | 33 | let actModel = 34 | process.env.ACT_MODEL === "anthropic" 35 | ? anthropic() 36 | : process.env.ACT_MODEL === "openai" 37 | ? openai() 38 | : anthropic(); // Default to Anthropic 39 | 40 | let actSystem = 41 | process.env.ACT_MODEL === "anthropic" 42 | ? ANTHROPIC_UBUNTU_SYSTEM_PROMPT 43 | : process.env.ACT_MODEL === "openai" 44 | ? OPENAI_UBUNTU_SYSTEM_PROMPT 45 | : ANTHROPIC_UBUNTU_SYSTEM_PROMPT; // Default to Anthropic's prompt 46 | 47 | let currentController: AbortController | null = null; 48 | 49 | const server = new Server( 50 | { 51 | name: "scrapybara-mcp", 52 | version: "0.1.0", 53 | }, 54 | { 55 | capabilities: { 56 | tools: {}, 57 | notifications: {}, 58 | }, 59 | } 60 | ); 61 | 62 | server.setNotificationHandler(CancellationNotificationSchema, async () => { 63 | if (currentController) { 64 | currentController.abort(); 65 | currentController = null; 66 | } 67 | }); 68 | 69 | server.setRequestHandler(ListToolsRequestSchema, async () => { 70 | return { 71 | tools: [ 72 | { 73 | name: "start_instance", 74 | description: 75 | "Start a Scrapybara Ubuntu instance. Use it as a desktop sandbox to access the web or run code. Always present the stream URL to the user afterwards so they can watch the instance in real time.", 76 | inputSchema: zodToJsonSchema(StartInstanceSchema), 77 | }, 78 | { 79 | name: "get_instances", 80 | description: "Get all running Scrapybara instances.", 81 | inputSchema: zodToJsonSchema(GetInstancesSchema), 82 | }, 83 | { 84 | name: "stop_instance", 85 | description: "Stop a running Scrapybara instance.", 86 | inputSchema: zodToJsonSchema(StopInstanceSchema), 87 | }, 88 | { 89 | name: "bash", 90 | description: "Run a bash command in a Scrapybara instance.", 91 | inputSchema: zodToJsonSchema(BashSchema), 92 | }, 93 | { 94 | name: "act", 95 | description: 96 | "Take action on a Scrapybara instance through an agent. The agent can control the instance with mouse/keyboard and bash commands.", 97 | inputSchema: zodToJsonSchema(ActSchema), 98 | }, 99 | ], 100 | }; 101 | }); 102 | 103 | server.setRequestHandler(CallToolRequestSchema, async (request) => { 104 | try { 105 | if (!request.params.arguments) { 106 | throw new Error("Arguments are required"); 107 | } 108 | 109 | currentController = new AbortController(); 110 | 111 | const client = new ScrapybaraClient({ 112 | apiKey: process.env.SCRAPYBARA_API_KEY, 113 | }); 114 | 115 | switch (request.params.name) { 116 | case "start_instance": { 117 | const instance = await client.startUbuntu(); 118 | await instance.browser.start({ 119 | abortSignal: currentController.signal, 120 | }); 121 | 122 | if (process.env.AUTH_STATE_ID) { 123 | await instance.browser.authenticate( 124 | { 125 | authStateId: process.env.AUTH_STATE_ID, 126 | }, 127 | { abortSignal: currentController.signal } 128 | ); 129 | } 130 | 131 | const streamUrlResponse = await instance.getStreamUrl({ 132 | abortSignal: currentController.signal, 133 | }); 134 | 135 | const streamUrl = streamUrlResponse.streamUrl; 136 | return { 137 | content: [ 138 | { 139 | type: "text", 140 | text: JSON.stringify({ ...instance, streamUrl }, null, 2), 141 | } as TextContent, 142 | ], 143 | }; 144 | } 145 | 146 | case "get_instances": { 147 | const instances = await client.getInstances({ 148 | abortSignal: currentController.signal, 149 | }); 150 | 151 | return { 152 | content: [ 153 | { 154 | type: "text", 155 | text: JSON.stringify(instances, null, 2), 156 | } as TextContent, 157 | ], 158 | }; 159 | } 160 | 161 | case "stop_instance": { 162 | const args = StopInstanceSchema.parse(request.params.arguments); 163 | const instance = await client.get(args.instance_id, { 164 | abortSignal: currentController.signal, 165 | }); 166 | 167 | const response = await instance.stop({ 168 | abortSignal: currentController.signal, 169 | }); 170 | 171 | return { 172 | content: [ 173 | { 174 | type: "text", 175 | text: JSON.stringify(response, null, 2), 176 | } as TextContent, 177 | ], 178 | }; 179 | } 180 | 181 | case "bash": { 182 | const args = BashSchema.parse(request.params.arguments); 183 | const instance = await client.get(args.instance_id, { 184 | abortSignal: currentController.signal, 185 | }); 186 | 187 | if ("bash" in instance) { 188 | const response = await instance.bash( 189 | { command: args.command }, 190 | { abortSignal: currentController.signal } 191 | ); 192 | 193 | return { 194 | content: [ 195 | { 196 | type: "text", 197 | text: JSON.stringify(response, null, 2), 198 | } as TextContent, 199 | ], 200 | }; 201 | } else { 202 | throw new Error("Instance does not support bash commands"); 203 | } 204 | } 205 | 206 | case "act": { 207 | const args = ActSchema.parse(request.params.arguments); 208 | const instance = await client.get(args.instance_id, { 209 | abortSignal: currentController.signal, 210 | }); 211 | 212 | const tools: Scrapybara.Tool[] = [computerTool(instance)]; 213 | 214 | if (instance instanceof UbuntuInstance) { 215 | tools.push(bashTool(instance)); 216 | tools.push(editTool(instance)); 217 | } 218 | 219 | const actResponse = await client.act({ 220 | model: actModel, 221 | tools, 222 | system: actSystem, 223 | prompt: args.prompt, 224 | schema: args.schema, 225 | requestOptions: { 226 | abortSignal: currentController.signal, 227 | }, 228 | }); 229 | 230 | return { 231 | content: [ 232 | { 233 | type: "text", 234 | text: JSON.stringify( 235 | { text: actResponse.text, output: actResponse.output }, 236 | null, 237 | 2 238 | ), 239 | } as TextContent, 240 | ], 241 | }; 242 | } 243 | 244 | default: 245 | throw new Error(`Unknown tool: ${request.params.name}`); 246 | } 247 | } catch (error) { 248 | if (error instanceof z.ZodError) { 249 | throw new Error(`Invalid input: ${JSON.stringify(error.errors)}`); 250 | } 251 | if (error instanceof Error && error.name === "AbortError") { 252 | return { 253 | content: [ 254 | { 255 | type: "text", 256 | text: JSON.stringify( 257 | { status: "Operation was cancelled." }, 258 | null, 259 | 2 260 | ), 261 | } as TextContent, 262 | ], 263 | }; 264 | } 265 | throw error; 266 | } 267 | }); 268 | 269 | async function runServer() { 270 | const transport = new StdioServerTransport(); 271 | await server.connect(transport); 272 | } 273 | 274 | runServer().catch((error) => { 275 | const errorMsg = error instanceof Error ? error.message : String(error); 276 | console.error(errorMsg); 277 | }); 278 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@modelcontextprotocol/sdk': 12 | specifier: ^1.7.0 13 | version: 1.7.0 14 | scrapybara: 15 | specifier: ^2.4.1 16 | version: 2.4.1 17 | zod: 18 | specifier: ^3.24.2 19 | version: 3.24.2 20 | zod-to-json-schema: 21 | specifier: ^3.24.4 22 | version: 3.24.4(zod@3.24.2) 23 | devDependencies: 24 | '@types/node': 25 | specifier: ^22 26 | version: 22.13.10 27 | shx: 28 | specifier: ^0.3.4 29 | version: 0.3.4 30 | typescript: 31 | specifier: ^5.6.2 32 | version: 5.8.2 33 | 34 | packages: 35 | 36 | '@modelcontextprotocol/sdk@1.7.0': 37 | resolution: {integrity: sha512-IYPe/FLpvF3IZrd/f5p5ffmWhMc3aEMuM2wGJASDqC2Ge7qatVCdbfPx3n/5xFeb19xN0j/911M2AaFuircsWA==} 38 | engines: {node: '>=18'} 39 | 40 | '@types/node@22.13.10': 41 | resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} 42 | 43 | abort-controller@3.0.0: 44 | resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 45 | engines: {node: '>=6.5'} 46 | 47 | accepts@2.0.0: 48 | resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} 49 | engines: {node: '>= 0.6'} 50 | 51 | asynckit@0.4.0: 52 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 53 | 54 | balanced-match@1.0.2: 55 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 56 | 57 | base64-js@1.5.1: 58 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 59 | 60 | body-parser@2.1.0: 61 | resolution: {integrity: sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==} 62 | engines: {node: '>=18'} 63 | 64 | brace-expansion@1.1.11: 65 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 66 | 67 | buffer@6.0.3: 68 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 69 | 70 | bytes@3.1.2: 71 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 72 | engines: {node: '>= 0.8'} 73 | 74 | call-bind-apply-helpers@1.0.2: 75 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 76 | engines: {node: '>= 0.4'} 77 | 78 | call-bound@1.0.4: 79 | resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 80 | engines: {node: '>= 0.4'} 81 | 82 | combined-stream@1.0.8: 83 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 84 | engines: {node: '>= 0.8'} 85 | 86 | concat-map@0.0.1: 87 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 88 | 89 | content-disposition@1.0.0: 90 | resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} 91 | engines: {node: '>= 0.6'} 92 | 93 | content-type@1.0.5: 94 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 95 | engines: {node: '>= 0.6'} 96 | 97 | cookie-signature@1.2.2: 98 | resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} 99 | engines: {node: '>=6.6.0'} 100 | 101 | cookie@0.7.1: 102 | resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} 103 | engines: {node: '>= 0.6'} 104 | 105 | cors@2.8.5: 106 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 107 | engines: {node: '>= 0.10'} 108 | 109 | debug@4.3.6: 110 | resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} 111 | engines: {node: '>=6.0'} 112 | peerDependencies: 113 | supports-color: '*' 114 | peerDependenciesMeta: 115 | supports-color: 116 | optional: true 117 | 118 | debug@4.4.0: 119 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 120 | engines: {node: '>=6.0'} 121 | peerDependencies: 122 | supports-color: '*' 123 | peerDependenciesMeta: 124 | supports-color: 125 | optional: true 126 | 127 | delayed-stream@1.0.0: 128 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 129 | engines: {node: '>=0.4.0'} 130 | 131 | depd@2.0.0: 132 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 133 | engines: {node: '>= 0.8'} 134 | 135 | destroy@1.2.0: 136 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 137 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 138 | 139 | dunder-proto@1.0.1: 140 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 141 | engines: {node: '>= 0.4'} 142 | 143 | ee-first@1.1.1: 144 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 145 | 146 | encodeurl@2.0.0: 147 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 148 | engines: {node: '>= 0.8'} 149 | 150 | es-define-property@1.0.1: 151 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 152 | engines: {node: '>= 0.4'} 153 | 154 | es-errors@1.3.0: 155 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 156 | engines: {node: '>= 0.4'} 157 | 158 | es-object-atoms@1.1.1: 159 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 160 | engines: {node: '>= 0.4'} 161 | 162 | es-set-tostringtag@2.1.0: 163 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 164 | engines: {node: '>= 0.4'} 165 | 166 | escape-html@1.0.3: 167 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 168 | 169 | etag@1.8.1: 170 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 171 | engines: {node: '>= 0.6'} 172 | 173 | event-target-shim@5.0.1: 174 | resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 175 | engines: {node: '>=6'} 176 | 177 | events@3.3.0: 178 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 179 | engines: {node: '>=0.8.x'} 180 | 181 | eventsource-parser@3.0.0: 182 | resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} 183 | engines: {node: '>=18.0.0'} 184 | 185 | eventsource@3.0.5: 186 | resolution: {integrity: sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==} 187 | engines: {node: '>=18.0.0'} 188 | 189 | express-rate-limit@7.5.0: 190 | resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} 191 | engines: {node: '>= 16'} 192 | peerDependencies: 193 | express: ^4.11 || 5 || ^5.0.0-beta.1 194 | 195 | express@5.0.1: 196 | resolution: {integrity: sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==} 197 | engines: {node: '>= 18'} 198 | 199 | finalhandler@2.1.0: 200 | resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} 201 | engines: {node: '>= 0.8'} 202 | 203 | form-data@4.0.2: 204 | resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} 205 | engines: {node: '>= 6'} 206 | 207 | formdata-node@6.0.3: 208 | resolution: {integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==} 209 | engines: {node: '>= 18'} 210 | 211 | forwarded@0.2.0: 212 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 213 | engines: {node: '>= 0.6'} 214 | 215 | fresh@0.5.2: 216 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 217 | engines: {node: '>= 0.6'} 218 | 219 | fresh@2.0.0: 220 | resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} 221 | engines: {node: '>= 0.8'} 222 | 223 | fs.realpath@1.0.0: 224 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 225 | 226 | function-bind@1.1.2: 227 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 228 | 229 | get-intrinsic@1.3.0: 230 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 231 | engines: {node: '>= 0.4'} 232 | 233 | get-proto@1.0.1: 234 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 235 | engines: {node: '>= 0.4'} 236 | 237 | glob@7.2.3: 238 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 239 | deprecated: Glob versions prior to v9 are no longer supported 240 | 241 | gopd@1.2.0: 242 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 243 | engines: {node: '>= 0.4'} 244 | 245 | has-symbols@1.1.0: 246 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 247 | engines: {node: '>= 0.4'} 248 | 249 | has-tostringtag@1.0.2: 250 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 251 | engines: {node: '>= 0.4'} 252 | 253 | hasown@2.0.2: 254 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 255 | engines: {node: '>= 0.4'} 256 | 257 | http-errors@2.0.0: 258 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 259 | engines: {node: '>= 0.8'} 260 | 261 | iconv-lite@0.5.2: 262 | resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} 263 | engines: {node: '>=0.10.0'} 264 | 265 | iconv-lite@0.6.3: 266 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 267 | engines: {node: '>=0.10.0'} 268 | 269 | ieee754@1.2.1: 270 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 271 | 272 | inflight@1.0.6: 273 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 274 | 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. 275 | 276 | inherits@2.0.4: 277 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 278 | 279 | interpret@1.4.0: 280 | resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} 281 | engines: {node: '>= 0.10'} 282 | 283 | ipaddr.js@1.9.1: 284 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 285 | engines: {node: '>= 0.10'} 286 | 287 | is-core-module@2.16.1: 288 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 289 | engines: {node: '>= 0.4'} 290 | 291 | is-promise@4.0.0: 292 | resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} 293 | 294 | math-intrinsics@1.1.0: 295 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 296 | engines: {node: '>= 0.4'} 297 | 298 | media-typer@1.1.0: 299 | resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 300 | engines: {node: '>= 0.8'} 301 | 302 | merge-descriptors@2.0.0: 303 | resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} 304 | engines: {node: '>=18'} 305 | 306 | methods@1.1.2: 307 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 308 | engines: {node: '>= 0.6'} 309 | 310 | mime-db@1.52.0: 311 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 312 | engines: {node: '>= 0.6'} 313 | 314 | mime-db@1.53.0: 315 | resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} 316 | engines: {node: '>= 0.6'} 317 | 318 | mime-types@2.1.35: 319 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 320 | engines: {node: '>= 0.6'} 321 | 322 | mime-types@3.0.0: 323 | resolution: {integrity: sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==} 324 | engines: {node: '>= 0.6'} 325 | 326 | minimatch@3.1.2: 327 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 328 | 329 | minimist@1.2.8: 330 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 331 | 332 | ms@2.1.2: 333 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 334 | 335 | ms@2.1.3: 336 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 337 | 338 | negotiator@1.0.0: 339 | resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} 340 | engines: {node: '>= 0.6'} 341 | 342 | node-fetch@2.7.0: 343 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 344 | engines: {node: 4.x || >=6.0.0} 345 | peerDependencies: 346 | encoding: ^0.1.0 347 | peerDependenciesMeta: 348 | encoding: 349 | optional: true 350 | 351 | object-assign@4.1.1: 352 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 353 | engines: {node: '>=0.10.0'} 354 | 355 | object-inspect@1.13.4: 356 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 357 | engines: {node: '>= 0.4'} 358 | 359 | on-finished@2.4.1: 360 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 361 | engines: {node: '>= 0.8'} 362 | 363 | once@1.4.0: 364 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 365 | 366 | parseurl@1.3.3: 367 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 368 | engines: {node: '>= 0.8'} 369 | 370 | path-is-absolute@1.0.1: 371 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 372 | engines: {node: '>=0.10.0'} 373 | 374 | path-parse@1.0.7: 375 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 376 | 377 | path-to-regexp@8.2.0: 378 | resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} 379 | engines: {node: '>=16'} 380 | 381 | pkce-challenge@4.1.0: 382 | resolution: {integrity: sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==} 383 | engines: {node: '>=16.20.0'} 384 | 385 | process@0.11.10: 386 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 387 | engines: {node: '>= 0.6.0'} 388 | 389 | proxy-addr@2.0.7: 390 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 391 | engines: {node: '>= 0.10'} 392 | 393 | qs@6.13.0: 394 | resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} 395 | engines: {node: '>=0.6'} 396 | 397 | qs@6.14.0: 398 | resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} 399 | engines: {node: '>=0.6'} 400 | 401 | range-parser@1.2.1: 402 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 403 | engines: {node: '>= 0.6'} 404 | 405 | raw-body@3.0.0: 406 | resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} 407 | engines: {node: '>= 0.8'} 408 | 409 | readable-stream@4.7.0: 410 | resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} 411 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 412 | 413 | rechoir@0.6.2: 414 | resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} 415 | engines: {node: '>= 0.10'} 416 | 417 | resolve@1.22.10: 418 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 419 | engines: {node: '>= 0.4'} 420 | hasBin: true 421 | 422 | router@2.1.0: 423 | resolution: {integrity: sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==} 424 | engines: {node: '>= 18'} 425 | 426 | safe-buffer@5.2.1: 427 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 428 | 429 | safer-buffer@2.1.2: 430 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 431 | 432 | scrapybara@2.4.1: 433 | resolution: {integrity: sha512-WMlJUX8jHc1HdeNmPXe9PO1OR6083GC/EQ/+KOdXYV07sv+F0XmLan8lmrCeW+qAliAgS+usTRgQeIte13JVyw==} 434 | 435 | send@1.1.0: 436 | resolution: {integrity: sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==} 437 | engines: {node: '>= 18'} 438 | 439 | serve-static@2.1.0: 440 | resolution: {integrity: sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==} 441 | engines: {node: '>= 18'} 442 | 443 | setprototypeof@1.2.0: 444 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 445 | 446 | shelljs@0.8.5: 447 | resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} 448 | engines: {node: '>=4'} 449 | hasBin: true 450 | 451 | shx@0.3.4: 452 | resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} 453 | engines: {node: '>=6'} 454 | hasBin: true 455 | 456 | side-channel-list@1.0.0: 457 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 458 | engines: {node: '>= 0.4'} 459 | 460 | side-channel-map@1.0.1: 461 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 462 | engines: {node: '>= 0.4'} 463 | 464 | side-channel-weakmap@1.0.2: 465 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 466 | engines: {node: '>= 0.4'} 467 | 468 | side-channel@1.1.0: 469 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 470 | engines: {node: '>= 0.4'} 471 | 472 | statuses@2.0.1: 473 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 474 | engines: {node: '>= 0.8'} 475 | 476 | string_decoder@1.3.0: 477 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 478 | 479 | supports-preserve-symlinks-flag@1.0.0: 480 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 481 | engines: {node: '>= 0.4'} 482 | 483 | toidentifier@1.0.1: 484 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 485 | engines: {node: '>=0.6'} 486 | 487 | tr46@0.0.3: 488 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 489 | 490 | type-is@2.0.0: 491 | resolution: {integrity: sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==} 492 | engines: {node: '>= 0.6'} 493 | 494 | typescript@5.8.2: 495 | resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 496 | engines: {node: '>=14.17'} 497 | hasBin: true 498 | 499 | undici-types@6.20.0: 500 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 501 | 502 | unpipe@1.0.0: 503 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 504 | engines: {node: '>= 0.8'} 505 | 506 | url-join@4.0.1: 507 | resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} 508 | 509 | utils-merge@1.0.1: 510 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 511 | engines: {node: '>= 0.4.0'} 512 | 513 | vary@1.1.2: 514 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 515 | engines: {node: '>= 0.8'} 516 | 517 | webidl-conversions@3.0.1: 518 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 519 | 520 | whatwg-url@5.0.0: 521 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 522 | 523 | wrappy@1.0.2: 524 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 525 | 526 | zod-to-json-schema@3.24.4: 527 | resolution: {integrity: sha512-0uNlcvgabyrni9Ag8Vghj21drk7+7tp7VTwwR7KxxXXc/3pbXz2PHlDgj3cICahgF1kHm4dExBFj7BXrZJXzig==} 528 | peerDependencies: 529 | zod: ^3.24.1 530 | 531 | zod@3.24.2: 532 | resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} 533 | 534 | snapshots: 535 | 536 | '@modelcontextprotocol/sdk@1.7.0': 537 | dependencies: 538 | content-type: 1.0.5 539 | cors: 2.8.5 540 | eventsource: 3.0.5 541 | express: 5.0.1 542 | express-rate-limit: 7.5.0(express@5.0.1) 543 | pkce-challenge: 4.1.0 544 | raw-body: 3.0.0 545 | zod: 3.24.2 546 | zod-to-json-schema: 3.24.4(zod@3.24.2) 547 | transitivePeerDependencies: 548 | - supports-color 549 | 550 | '@types/node@22.13.10': 551 | dependencies: 552 | undici-types: 6.20.0 553 | 554 | abort-controller@3.0.0: 555 | dependencies: 556 | event-target-shim: 5.0.1 557 | 558 | accepts@2.0.0: 559 | dependencies: 560 | mime-types: 3.0.0 561 | negotiator: 1.0.0 562 | 563 | asynckit@0.4.0: {} 564 | 565 | balanced-match@1.0.2: {} 566 | 567 | base64-js@1.5.1: {} 568 | 569 | body-parser@2.1.0: 570 | dependencies: 571 | bytes: 3.1.2 572 | content-type: 1.0.5 573 | debug: 4.4.0 574 | http-errors: 2.0.0 575 | iconv-lite: 0.5.2 576 | on-finished: 2.4.1 577 | qs: 6.14.0 578 | raw-body: 3.0.0 579 | type-is: 2.0.0 580 | transitivePeerDependencies: 581 | - supports-color 582 | 583 | brace-expansion@1.1.11: 584 | dependencies: 585 | balanced-match: 1.0.2 586 | concat-map: 0.0.1 587 | 588 | buffer@6.0.3: 589 | dependencies: 590 | base64-js: 1.5.1 591 | ieee754: 1.2.1 592 | 593 | bytes@3.1.2: {} 594 | 595 | call-bind-apply-helpers@1.0.2: 596 | dependencies: 597 | es-errors: 1.3.0 598 | function-bind: 1.1.2 599 | 600 | call-bound@1.0.4: 601 | dependencies: 602 | call-bind-apply-helpers: 1.0.2 603 | get-intrinsic: 1.3.0 604 | 605 | combined-stream@1.0.8: 606 | dependencies: 607 | delayed-stream: 1.0.0 608 | 609 | concat-map@0.0.1: {} 610 | 611 | content-disposition@1.0.0: 612 | dependencies: 613 | safe-buffer: 5.2.1 614 | 615 | content-type@1.0.5: {} 616 | 617 | cookie-signature@1.2.2: {} 618 | 619 | cookie@0.7.1: {} 620 | 621 | cors@2.8.5: 622 | dependencies: 623 | object-assign: 4.1.1 624 | vary: 1.1.2 625 | 626 | debug@4.3.6: 627 | dependencies: 628 | ms: 2.1.2 629 | 630 | debug@4.4.0: 631 | dependencies: 632 | ms: 2.1.3 633 | 634 | delayed-stream@1.0.0: {} 635 | 636 | depd@2.0.0: {} 637 | 638 | destroy@1.2.0: {} 639 | 640 | dunder-proto@1.0.1: 641 | dependencies: 642 | call-bind-apply-helpers: 1.0.2 643 | es-errors: 1.3.0 644 | gopd: 1.2.0 645 | 646 | ee-first@1.1.1: {} 647 | 648 | encodeurl@2.0.0: {} 649 | 650 | es-define-property@1.0.1: {} 651 | 652 | es-errors@1.3.0: {} 653 | 654 | es-object-atoms@1.1.1: 655 | dependencies: 656 | es-errors: 1.3.0 657 | 658 | es-set-tostringtag@2.1.0: 659 | dependencies: 660 | es-errors: 1.3.0 661 | get-intrinsic: 1.3.0 662 | has-tostringtag: 1.0.2 663 | hasown: 2.0.2 664 | 665 | escape-html@1.0.3: {} 666 | 667 | etag@1.8.1: {} 668 | 669 | event-target-shim@5.0.1: {} 670 | 671 | events@3.3.0: {} 672 | 673 | eventsource-parser@3.0.0: {} 674 | 675 | eventsource@3.0.5: 676 | dependencies: 677 | eventsource-parser: 3.0.0 678 | 679 | express-rate-limit@7.5.0(express@5.0.1): 680 | dependencies: 681 | express: 5.0.1 682 | 683 | express@5.0.1: 684 | dependencies: 685 | accepts: 2.0.0 686 | body-parser: 2.1.0 687 | content-disposition: 1.0.0 688 | content-type: 1.0.5 689 | cookie: 0.7.1 690 | cookie-signature: 1.2.2 691 | debug: 4.3.6 692 | depd: 2.0.0 693 | encodeurl: 2.0.0 694 | escape-html: 1.0.3 695 | etag: 1.8.1 696 | finalhandler: 2.1.0 697 | fresh: 2.0.0 698 | http-errors: 2.0.0 699 | merge-descriptors: 2.0.0 700 | methods: 1.1.2 701 | mime-types: 3.0.0 702 | on-finished: 2.4.1 703 | once: 1.4.0 704 | parseurl: 1.3.3 705 | proxy-addr: 2.0.7 706 | qs: 6.13.0 707 | range-parser: 1.2.1 708 | router: 2.1.0 709 | safe-buffer: 5.2.1 710 | send: 1.1.0 711 | serve-static: 2.1.0 712 | setprototypeof: 1.2.0 713 | statuses: 2.0.1 714 | type-is: 2.0.0 715 | utils-merge: 1.0.1 716 | vary: 1.1.2 717 | transitivePeerDependencies: 718 | - supports-color 719 | 720 | finalhandler@2.1.0: 721 | dependencies: 722 | debug: 4.4.0 723 | encodeurl: 2.0.0 724 | escape-html: 1.0.3 725 | on-finished: 2.4.1 726 | parseurl: 1.3.3 727 | statuses: 2.0.1 728 | transitivePeerDependencies: 729 | - supports-color 730 | 731 | form-data@4.0.2: 732 | dependencies: 733 | asynckit: 0.4.0 734 | combined-stream: 1.0.8 735 | es-set-tostringtag: 2.1.0 736 | mime-types: 2.1.35 737 | 738 | formdata-node@6.0.3: {} 739 | 740 | forwarded@0.2.0: {} 741 | 742 | fresh@0.5.2: {} 743 | 744 | fresh@2.0.0: {} 745 | 746 | fs.realpath@1.0.0: {} 747 | 748 | function-bind@1.1.2: {} 749 | 750 | get-intrinsic@1.3.0: 751 | dependencies: 752 | call-bind-apply-helpers: 1.0.2 753 | es-define-property: 1.0.1 754 | es-errors: 1.3.0 755 | es-object-atoms: 1.1.1 756 | function-bind: 1.1.2 757 | get-proto: 1.0.1 758 | gopd: 1.2.0 759 | has-symbols: 1.1.0 760 | hasown: 2.0.2 761 | math-intrinsics: 1.1.0 762 | 763 | get-proto@1.0.1: 764 | dependencies: 765 | dunder-proto: 1.0.1 766 | es-object-atoms: 1.1.1 767 | 768 | glob@7.2.3: 769 | dependencies: 770 | fs.realpath: 1.0.0 771 | inflight: 1.0.6 772 | inherits: 2.0.4 773 | minimatch: 3.1.2 774 | once: 1.4.0 775 | path-is-absolute: 1.0.1 776 | 777 | gopd@1.2.0: {} 778 | 779 | has-symbols@1.1.0: {} 780 | 781 | has-tostringtag@1.0.2: 782 | dependencies: 783 | has-symbols: 1.1.0 784 | 785 | hasown@2.0.2: 786 | dependencies: 787 | function-bind: 1.1.2 788 | 789 | http-errors@2.0.0: 790 | dependencies: 791 | depd: 2.0.0 792 | inherits: 2.0.4 793 | setprototypeof: 1.2.0 794 | statuses: 2.0.1 795 | toidentifier: 1.0.1 796 | 797 | iconv-lite@0.5.2: 798 | dependencies: 799 | safer-buffer: 2.1.2 800 | 801 | iconv-lite@0.6.3: 802 | dependencies: 803 | safer-buffer: 2.1.2 804 | 805 | ieee754@1.2.1: {} 806 | 807 | inflight@1.0.6: 808 | dependencies: 809 | once: 1.4.0 810 | wrappy: 1.0.2 811 | 812 | inherits@2.0.4: {} 813 | 814 | interpret@1.4.0: {} 815 | 816 | ipaddr.js@1.9.1: {} 817 | 818 | is-core-module@2.16.1: 819 | dependencies: 820 | hasown: 2.0.2 821 | 822 | is-promise@4.0.0: {} 823 | 824 | math-intrinsics@1.1.0: {} 825 | 826 | media-typer@1.1.0: {} 827 | 828 | merge-descriptors@2.0.0: {} 829 | 830 | methods@1.1.2: {} 831 | 832 | mime-db@1.52.0: {} 833 | 834 | mime-db@1.53.0: {} 835 | 836 | mime-types@2.1.35: 837 | dependencies: 838 | mime-db: 1.52.0 839 | 840 | mime-types@3.0.0: 841 | dependencies: 842 | mime-db: 1.53.0 843 | 844 | minimatch@3.1.2: 845 | dependencies: 846 | brace-expansion: 1.1.11 847 | 848 | minimist@1.2.8: {} 849 | 850 | ms@2.1.2: {} 851 | 852 | ms@2.1.3: {} 853 | 854 | negotiator@1.0.0: {} 855 | 856 | node-fetch@2.7.0: 857 | dependencies: 858 | whatwg-url: 5.0.0 859 | 860 | object-assign@4.1.1: {} 861 | 862 | object-inspect@1.13.4: {} 863 | 864 | on-finished@2.4.1: 865 | dependencies: 866 | ee-first: 1.1.1 867 | 868 | once@1.4.0: 869 | dependencies: 870 | wrappy: 1.0.2 871 | 872 | parseurl@1.3.3: {} 873 | 874 | path-is-absolute@1.0.1: {} 875 | 876 | path-parse@1.0.7: {} 877 | 878 | path-to-regexp@8.2.0: {} 879 | 880 | pkce-challenge@4.1.0: {} 881 | 882 | process@0.11.10: {} 883 | 884 | proxy-addr@2.0.7: 885 | dependencies: 886 | forwarded: 0.2.0 887 | ipaddr.js: 1.9.1 888 | 889 | qs@6.13.0: 890 | dependencies: 891 | side-channel: 1.1.0 892 | 893 | qs@6.14.0: 894 | dependencies: 895 | side-channel: 1.1.0 896 | 897 | range-parser@1.2.1: {} 898 | 899 | raw-body@3.0.0: 900 | dependencies: 901 | bytes: 3.1.2 902 | http-errors: 2.0.0 903 | iconv-lite: 0.6.3 904 | unpipe: 1.0.0 905 | 906 | readable-stream@4.7.0: 907 | dependencies: 908 | abort-controller: 3.0.0 909 | buffer: 6.0.3 910 | events: 3.3.0 911 | process: 0.11.10 912 | string_decoder: 1.3.0 913 | 914 | rechoir@0.6.2: 915 | dependencies: 916 | resolve: 1.22.10 917 | 918 | resolve@1.22.10: 919 | dependencies: 920 | is-core-module: 2.16.1 921 | path-parse: 1.0.7 922 | supports-preserve-symlinks-flag: 1.0.0 923 | 924 | router@2.1.0: 925 | dependencies: 926 | is-promise: 4.0.0 927 | parseurl: 1.3.3 928 | path-to-regexp: 8.2.0 929 | 930 | safe-buffer@5.2.1: {} 931 | 932 | safer-buffer@2.1.2: {} 933 | 934 | scrapybara@2.4.1: 935 | dependencies: 936 | form-data: 4.0.2 937 | formdata-node: 6.0.3 938 | node-fetch: 2.7.0 939 | qs: 6.14.0 940 | readable-stream: 4.7.0 941 | url-join: 4.0.1 942 | zod: 3.24.2 943 | zod-to-json-schema: 3.24.4(zod@3.24.2) 944 | transitivePeerDependencies: 945 | - encoding 946 | 947 | send@1.1.0: 948 | dependencies: 949 | debug: 4.3.6 950 | destroy: 1.2.0 951 | encodeurl: 2.0.0 952 | escape-html: 1.0.3 953 | etag: 1.8.1 954 | fresh: 0.5.2 955 | http-errors: 2.0.0 956 | mime-types: 2.1.35 957 | ms: 2.1.3 958 | on-finished: 2.4.1 959 | range-parser: 1.2.1 960 | statuses: 2.0.1 961 | transitivePeerDependencies: 962 | - supports-color 963 | 964 | serve-static@2.1.0: 965 | dependencies: 966 | encodeurl: 2.0.0 967 | escape-html: 1.0.3 968 | parseurl: 1.3.3 969 | send: 1.1.0 970 | transitivePeerDependencies: 971 | - supports-color 972 | 973 | setprototypeof@1.2.0: {} 974 | 975 | shelljs@0.8.5: 976 | dependencies: 977 | glob: 7.2.3 978 | interpret: 1.4.0 979 | rechoir: 0.6.2 980 | 981 | shx@0.3.4: 982 | dependencies: 983 | minimist: 1.2.8 984 | shelljs: 0.8.5 985 | 986 | side-channel-list@1.0.0: 987 | dependencies: 988 | es-errors: 1.3.0 989 | object-inspect: 1.13.4 990 | 991 | side-channel-map@1.0.1: 992 | dependencies: 993 | call-bound: 1.0.4 994 | es-errors: 1.3.0 995 | get-intrinsic: 1.3.0 996 | object-inspect: 1.13.4 997 | 998 | side-channel-weakmap@1.0.2: 999 | dependencies: 1000 | call-bound: 1.0.4 1001 | es-errors: 1.3.0 1002 | get-intrinsic: 1.3.0 1003 | object-inspect: 1.13.4 1004 | side-channel-map: 1.0.1 1005 | 1006 | side-channel@1.1.0: 1007 | dependencies: 1008 | es-errors: 1.3.0 1009 | object-inspect: 1.13.4 1010 | side-channel-list: 1.0.0 1011 | side-channel-map: 1.0.1 1012 | side-channel-weakmap: 1.0.2 1013 | 1014 | statuses@2.0.1: {} 1015 | 1016 | string_decoder@1.3.0: 1017 | dependencies: 1018 | safe-buffer: 5.2.1 1019 | 1020 | supports-preserve-symlinks-flag@1.0.0: {} 1021 | 1022 | toidentifier@1.0.1: {} 1023 | 1024 | tr46@0.0.3: {} 1025 | 1026 | type-is@2.0.0: 1027 | dependencies: 1028 | content-type: 1.0.5 1029 | media-typer: 1.1.0 1030 | mime-types: 3.0.0 1031 | 1032 | typescript@5.8.2: {} 1033 | 1034 | undici-types@6.20.0: {} 1035 | 1036 | unpipe@1.0.0: {} 1037 | 1038 | url-join@4.0.1: {} 1039 | 1040 | utils-merge@1.0.1: {} 1041 | 1042 | vary@1.1.2: {} 1043 | 1044 | webidl-conversions@3.0.1: {} 1045 | 1046 | whatwg-url@5.0.0: 1047 | dependencies: 1048 | tr46: 0.0.3 1049 | webidl-conversions: 3.0.1 1050 | 1051 | wrappy@1.0.2: {} 1052 | 1053 | zod-to-json-schema@3.24.4(zod@3.24.2): 1054 | dependencies: 1055 | zod: 3.24.2 1056 | 1057 | zod@3.24.2: {} 1058 | --------------------------------------------------------------------------------