├── .gitignore ├── LICENSE ├── README.md ├── biome.json ├── img ├── available-tools.png ├── claude-does-math-the-fancy-way.png ├── mcp-inspector-oauth-success.png ├── mcp-inspector-sse-config.png ├── mcp-inspector-successful-tool-call.png └── mcp-login.png ├── package-lock.json ├── package.json ├── src ├── app.ts ├── index.ts └── utils.ts ├── static ├── README.md └── img ├── submissions.csv ├── tsconfig.json ├── worker-configuration.d.ts └── wrangler.jsonc /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | .nx 4 | .idea 5 | .vscode 6 | .zed 7 | # Logs 8 | 9 | logs 10 | _.log 11 | npm-debug.log_ 12 | yarn-debug.log* 13 | yarn-error.log* 14 | lerna-debug.log* 15 | .pnpm-debug.log* 16 | 17 | # Diagnostic reports (https://nodejs.org/api/report.html) 18 | 19 | report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json 20 | 21 | # Runtime data 22 | 23 | pids 24 | _.pid 25 | _.seed 26 | \*.pid.lock 27 | 28 | # Directory for instrumented libs generated by jscoverage/JSCover 29 | 30 | lib-cov 31 | 32 | # Coverage directory used by tools like istanbul 33 | 34 | coverage 35 | \*.lcov 36 | 37 | # nyc test coverage 38 | 39 | .nyc_output 40 | 41 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 42 | 43 | .grunt 44 | 45 | # Bower dependency directory (https://bower.io/) 46 | 47 | bower_components 48 | 49 | # node-waf configuration 50 | 51 | .lock-wscript 52 | 53 | # Compiled binary addons (https://nodejs.org/api/addons.html) 54 | 55 | build/Release 56 | 57 | # Dependency directories 58 | 59 | node_modules/ 60 | jspm_packages/ 61 | 62 | # Snowpack dependency directory (https://snowpack.dev/) 63 | 64 | web_modules/ 65 | 66 | # TypeScript cache 67 | 68 | \*.tsbuildinfo 69 | 70 | # Optional npm cache directory 71 | 72 | .npm 73 | 74 | # Optional eslint cache 75 | 76 | .eslintcache 77 | 78 | # Optional stylelint cache 79 | 80 | .stylelintcache 81 | 82 | # Microbundle cache 83 | 84 | .rpt2_cache/ 85 | .rts2_cache_cjs/ 86 | .rts2_cache_es/ 87 | .rts2_cache_umd/ 88 | 89 | # Optional REPL history 90 | 91 | .node_repl_history 92 | 93 | # Output of 'npm pack' 94 | 95 | \*.tgz 96 | 97 | # Yarn Integrity file 98 | 99 | .yarn-integrity 100 | 101 | # dotenv environment variable files 102 | 103 | .env 104 | .env.development.local 105 | .env.test.local 106 | .env.production.local 107 | .env.local 108 | 109 | # parcel-bundler cache (https://parceljs.org/) 110 | 111 | .cache 112 | .parcel-cache 113 | 114 | # Next.js build output 115 | 116 | .next 117 | out 118 | 119 | # Nuxt.js build / generate output 120 | 121 | .nuxt 122 | dist 123 | 124 | # Gatsby files 125 | 126 | .cache/ 127 | 128 | # Comment in the public line in if your project uses Gatsby and not Next.js 129 | 130 | # https://nextjs.org/blog/next-9-1#public-directory-support 131 | 132 | # public 133 | 134 | # vuepress build output 135 | 136 | .vuepress/dist 137 | 138 | # vuepress v2.x temp and cache directory 139 | 140 | .temp 141 | .cache 142 | 143 | # Docusaurus cache and generated files 144 | 145 | .docusaurus 146 | 147 | # Serverless directories 148 | 149 | .serverless/ 150 | 151 | # FuseBox cache 152 | 153 | .fusebox/ 154 | 155 | # DynamoDB Local files 156 | 157 | .dynamodb/ 158 | 159 | # TernJS port file 160 | 161 | .tern-port 162 | 163 | # Stores VSCode versions used for testing VSCode extensions 164 | 165 | .vscode-test 166 | 167 | # yarn v2 168 | 169 | .yarn/cache 170 | .yarn/unplugged 171 | .yarn/build-state.yml 172 | .yarn/install-state.gz 173 | .pnp.\* 174 | 175 | # wrangler project 176 | 177 | .dev.vars 178 | .wrangler/ 179 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License Copyright (c) 2025 swyxio 2 | 3 | Permission is hereby granted, free of 4 | charge, to any person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, copy, modify, merge, 7 | publish, distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to the 9 | following conditions: 10 | 11 | The above copyright notice and this permission notice 12 | (including the next paragraph) shall be included in all copies or substantial 13 | portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 16 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 18 | EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AI Engineer MCP 2025 2 | 3 | This project hosts the AI Engineer Conference 2025 talk submission system and MCP server. 4 | 5 | Thanks to @threepointone for help setting this up with Cloudflare! <3 6 | 7 | image 8 | 9 | 10 | ## add this to your MCP Client 11 | 12 | `https://ai-engineer-wf-2025.swyx-5de.workers.dev/sse` 13 | 14 | ```json 15 | // for example .cursor/mcp.json 16 | { 17 | "mcpServers": { 18 | "AIECONF": { 19 | "url": "https://ai-engineer-wf-2025.swyx-5de.workers.dev/sse" 20 | } 21 | } 22 | } 23 | ``` 24 | 25 | and then try "tell me about the conference" in your chat app that will then call the MCP server. 26 | 27 | 28 | ## Project Structure 29 | 30 | The project is built as a Cloudflare Worker with the following key components: 31 | - MCP server implementation in `src/index.ts` 32 | - Application logic in `src/app.ts` 33 | - Utility functions in `src/utils.ts` 34 | - Static assets in `static/` directory 35 | 36 | ## Develop locally 37 | 38 | ```bash 39 | # clone the repository 40 | git clone git@github.com:cloudflare/ai.git 41 | 42 | # install dependencies 43 | cd ai 44 | npm install 45 | 46 | # run locally 47 | npx wrangler dev 48 | ``` 49 | 50 | You should be able to open [`http://localhost:8787/`](http://localhost:8787/) in your browser 51 | 52 | ## Connect the MCP inspector to your server 53 | 54 | To explore your new MCP api, you can use the [MCP Inspector](https://modelcontextprotocol.io/docs/tools/inspector). 55 | 56 | - Start it with `npx @modelcontextprotocol/inspector` 57 | - [Within the inspector](http://localhost:5173), switch the Transport Type to `SSE` and enter `http://localhost:8787/sse` as the URL of the MCP server to connect to, and click "Connect" 58 | - You will navigate to a (mock) user/password login screen. Input any email and pass to login. 59 | - You should be redirected back to the MCP Inspector and you can now list and call any defined tools! 60 | 61 |
62 | MCP Inspector with the above config 63 |
64 | 65 |
66 | MCP Inspector with after a tool call 67 |
68 | 69 | ## Connect Claude Desktop to your local MCP server 70 | 71 | The MCP inspector is great, but we really want to connect this to Claude! Follow [Anthropic's Quickstart](https://modelcontextprotocol.io/quickstart/user) and within Claude Desktop go to Settings > Developer > Edit Config to find your configuration file. 72 | 73 | Open the file in your text editor and replace it with this configuration: 74 | 75 | ```json 76 | { 77 | "mcpServers": { 78 | "math": { 79 | "command": "npx", 80 | "args": [ 81 | "mcp-remote", 82 | "http://localhost:8787/sse" 83 | ] 84 | } 85 | } 86 | } 87 | ``` 88 | 89 | This will run a local proxy and let Claude talk to your MCP server over HTTP 90 | 91 | When you open Claude a browser window should open and allow you to login. You should see the tools available in the bottom right. Given the right prompt Claude should ask to call the tool. 92 | 93 |
94 | Clicking on the hammer icon shows a list of available tools 95 |
96 | 97 |
98 | Claude answers the prompt 'I seem to have lost my calculator and have run out of fingers. Could you use the math tool to add 23 and 19?' by invoking the MCP add tool 99 |
100 | 101 | ## Deploy to Cloudflare 102 | 103 | 1. Make sure you have the following KV namespaces created: 104 | - `OAUTH_KV` for authentication 105 | - `AIEWFSUBMISSIONS` for talk submissions 106 | 2. Ensure your secrets store is configured with the `SECRETKEY` 107 | 3. Deploy using: 108 | ```bash 109 | npm run deploy 110 | ``` 111 | 112 | ## Call your newly deployed remote MCP server from a remote MCP client 113 | 114 | Just like you did above in "Develop locally", run the MCP inspector: 115 | 116 | `npx @modelcontextprotocol/inspector@latest` 117 | 118 | Then enter the `workers.dev` URL (ex: `worker-name.account-name.workers.dev/sse`) of your Worker in the inspector as the URL of the MCP server to connect to, and click "Connect". 119 | 120 | You've now connected to your MCP server from a remote MCP client. 121 | 122 | ## Connect Claude Desktop to your remote MCP server 123 | 124 | Update the Claude configuration file to point to your `workers.dev` URL (ex: `worker-name.account-name.workers.dev/sse`) and restart Claude 125 | 126 | ```json 127 | { 128 | "mcpServers": { 129 | "math": { 130 | "command": "npx", 131 | "args": [ 132 | "mcp-remote", 133 | "https://worker-name.account-name.workers.dev/sse" 134 | ] 135 | } 136 | } 137 | } 138 | ``` 139 | 140 | ## Debugging 141 | 142 | Should anything go wrong it can be helpful to restart Claude, or to try connecting directly to your 143 | MCP server on the command line with the following command. 144 | 145 | ```bash 146 | npx mcp-remote http://localhost:8787/sse 147 | ``` 148 | 149 | In some rare cases it may help to clear the files added to `~/.mcp-auth` 150 | 151 | ```bash 152 | rm -rf ~/.mcp-auth 153 | ``` 154 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.6.2/schema.json", 3 | "organizeImports": { 4 | "enabled": true 5 | }, 6 | "files": { 7 | "ignore": ["worker-configuration.d.ts"] 8 | }, 9 | "vcs": { 10 | "enabled": true, 11 | "clientKind": "git", 12 | "useIgnoreFile": true 13 | }, 14 | "linter": { 15 | "enabled": true, 16 | "rules": { 17 | "recommended": true, 18 | "suspicious": { 19 | "noExplicitAny": "off", 20 | "noDebugger": "off", 21 | "noConsoleLog": "off", 22 | "noConfusingVoidType": "off" 23 | }, 24 | "style": { 25 | "noNonNullAssertion": "off" 26 | } 27 | } 28 | }, 29 | "formatter": { 30 | "enabled": true, 31 | "indentWidth": 4, 32 | "lineWidth": 100 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /img/available-tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiDotEngineer/aie-mcp/2edce781ef5abff8d9b9c6fe283a103279c3d9e0/img/available-tools.png -------------------------------------------------------------------------------- /img/claude-does-math-the-fancy-way.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiDotEngineer/aie-mcp/2edce781ef5abff8d9b9c6fe283a103279c3d9e0/img/claude-does-math-the-fancy-way.png -------------------------------------------------------------------------------- /img/mcp-inspector-oauth-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiDotEngineer/aie-mcp/2edce781ef5abff8d9b9c6fe283a103279c3d9e0/img/mcp-inspector-oauth-success.png -------------------------------------------------------------------------------- /img/mcp-inspector-sse-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiDotEngineer/aie-mcp/2edce781ef5abff8d9b9c6fe283a103279c3d9e0/img/mcp-inspector-sse-config.png -------------------------------------------------------------------------------- /img/mcp-inspector-successful-tool-call.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiDotEngineer/aie-mcp/2edce781ef5abff8d9b9c6fe283a103279c3d9e0/img/mcp-inspector-successful-tool-call.png -------------------------------------------------------------------------------- /img/mcp-login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aiDotEngineer/aie-mcp/2edce781ef5abff8d9b9c6fe283a103279c3d9e0/img/mcp-login.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "remote-mcp-server", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "remote-mcp-server", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "@cloudflare/workers-oauth-provider": "^0.0.2", 12 | "@modelcontextprotocol/sdk": "^1.7.0", 13 | "agents": "^0.0.53", 14 | "hono": "^4.7.4", 15 | "zod": "^3.24.2" 16 | }, 17 | "devDependencies": { 18 | "@cloudflare/workers-types": "^4.20250418.0", 19 | "marked": "^15.0.7", 20 | "typescript": "^5.5.2", 21 | "workers-mcp": "^0.1.0-3", 22 | "wrangler": "^4.12.0" 23 | } 24 | }, 25 | "node_modules/@babel/helper-string-parser": { 26 | "version": "7.25.9", 27 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 28 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 29 | "dev": true, 30 | "license": "MIT", 31 | "engines": { 32 | "node": ">=6.9.0" 33 | } 34 | }, 35 | "node_modules/@babel/helper-validator-identifier": { 36 | "version": "7.25.9", 37 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 38 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 39 | "dev": true, 40 | "license": "MIT", 41 | "engines": { 42 | "node": ">=6.9.0" 43 | } 44 | }, 45 | "node_modules/@babel/parser": { 46 | "version": "7.27.0", 47 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", 48 | "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", 49 | "dev": true, 50 | "license": "MIT", 51 | "dependencies": { 52 | "@babel/types": "^7.27.0" 53 | }, 54 | "bin": { 55 | "parser": "bin/babel-parser.js" 56 | }, 57 | "engines": { 58 | "node": ">=6.0.0" 59 | } 60 | }, 61 | "node_modules/@babel/types": { 62 | "version": "7.27.0", 63 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", 64 | "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", 65 | "dev": true, 66 | "license": "MIT", 67 | "dependencies": { 68 | "@babel/helper-string-parser": "^7.25.9", 69 | "@babel/helper-validator-identifier": "^7.25.9" 70 | }, 71 | "engines": { 72 | "node": ">=6.9.0" 73 | } 74 | }, 75 | "node_modules/@clack/core": { 76 | "version": "0.3.5", 77 | "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.5.tgz", 78 | "integrity": "sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==", 79 | "dev": true, 80 | "license": "MIT", 81 | "dependencies": { 82 | "picocolors": "^1.0.0", 83 | "sisteransi": "^1.0.5" 84 | } 85 | }, 86 | "node_modules/@clack/prompts": { 87 | "version": "0.8.2", 88 | "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.8.2.tgz", 89 | "integrity": "sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==", 90 | "dev": true, 91 | "license": "MIT", 92 | "dependencies": { 93 | "@clack/core": "0.3.5", 94 | "picocolors": "^1.0.0", 95 | "sisteransi": "^1.0.5" 96 | } 97 | }, 98 | "node_modules/@cloudflare/kv-asset-handler": { 99 | "version": "0.4.0", 100 | "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", 101 | "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", 102 | "dev": true, 103 | "license": "MIT OR Apache-2.0", 104 | "dependencies": { 105 | "mime": "^3.0.0" 106 | }, 107 | "engines": { 108 | "node": ">=18.0.0" 109 | } 110 | }, 111 | "node_modules/@cloudflare/unenv-preset": { 112 | "version": "2.3.1", 113 | "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.3.1.tgz", 114 | "integrity": "sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==", 115 | "dev": true, 116 | "license": "MIT OR Apache-2.0", 117 | "peerDependencies": { 118 | "unenv": "2.0.0-rc.15", 119 | "workerd": "^1.20250320.0" 120 | }, 121 | "peerDependenciesMeta": { 122 | "workerd": { 123 | "optional": true 124 | } 125 | } 126 | }, 127 | "node_modules/@cloudflare/workerd-darwin-64": { 128 | "version": "1.20250416.0", 129 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250416.0.tgz", 130 | "integrity": "sha512-aZgF8Swp9eVYxJPWOoZbAgAaYjWuYqGmEA+QJ2ecRGDBqm87rT4GEw7/mmLpxrpllny3VfEEhkk9iYCGv8nlFw==", 131 | "cpu": [ 132 | "x64" 133 | ], 134 | "dev": true, 135 | "license": "Apache-2.0", 136 | "optional": true, 137 | "os": [ 138 | "darwin" 139 | ], 140 | "engines": { 141 | "node": ">=16" 142 | } 143 | }, 144 | "node_modules/@cloudflare/workerd-darwin-arm64": { 145 | "version": "1.20250416.0", 146 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250416.0.tgz", 147 | "integrity": "sha512-FhswG1QYRfaTZ4FAlUkfVWaoM2lrlqumiBTrhbo9czMJdGR/oBXS4SGynuI6zyhApHeBf3/fZpA/SBAe4cXdgg==", 148 | "cpu": [ 149 | "arm64" 150 | ], 151 | "dev": true, 152 | "license": "Apache-2.0", 153 | "optional": true, 154 | "os": [ 155 | "darwin" 156 | ], 157 | "engines": { 158 | "node": ">=16" 159 | } 160 | }, 161 | "node_modules/@cloudflare/workerd-linux-64": { 162 | "version": "1.20250416.0", 163 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250416.0.tgz", 164 | "integrity": "sha512-G+nXEAJ/9y+A857XShwxKeRdfxok6UcjiQe6G+wQeCn/Ofkp/EWydacKdyeVU6QIm1oHS78DwJ7AzbCYywf9aw==", 165 | "cpu": [ 166 | "x64" 167 | ], 168 | "dev": true, 169 | "license": "Apache-2.0", 170 | "optional": true, 171 | "os": [ 172 | "linux" 173 | ], 174 | "engines": { 175 | "node": ">=16" 176 | } 177 | }, 178 | "node_modules/@cloudflare/workerd-linux-arm64": { 179 | "version": "1.20250416.0", 180 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250416.0.tgz", 181 | "integrity": "sha512-U6oVW0d9w1fpnDYNrjPJ9SFkDlGJWJWbXHlTBObXl6vccP16WewvuxyHkKqyUhUc8hyBaph7sxeKzKmuCFQ4SA==", 182 | "cpu": [ 183 | "arm64" 184 | ], 185 | "dev": true, 186 | "license": "Apache-2.0", 187 | "optional": true, 188 | "os": [ 189 | "linux" 190 | ], 191 | "engines": { 192 | "node": ">=16" 193 | } 194 | }, 195 | "node_modules/@cloudflare/workerd-windows-64": { 196 | "version": "1.20250416.0", 197 | "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250416.0.tgz", 198 | "integrity": "sha512-YAjjTzL1z9YYeN4sqYfj1dtQXd2Bblj+B+hl4Rz2aOhblpZEZAdhapZlOCRvLLkOJshKJUnRD3mDlytAdgwybQ==", 199 | "cpu": [ 200 | "x64" 201 | ], 202 | "dev": true, 203 | "license": "Apache-2.0", 204 | "optional": true, 205 | "os": [ 206 | "win32" 207 | ], 208 | "engines": { 209 | "node": ">=16" 210 | } 211 | }, 212 | "node_modules/@cloudflare/workers-oauth-provider": { 213 | "version": "0.0.2", 214 | "resolved": "https://registry.npmjs.org/@cloudflare/workers-oauth-provider/-/workers-oauth-provider-0.0.2.tgz", 215 | "integrity": "sha512-/4ITlItqtmG077CBdo/14c4GNrhLDQ9Y/+mDMEppzXz5g0gVbYjzZGtXrQFQG1mfOHNfXmNxgVwin2eh0X423Q==", 216 | "license": "MIT", 217 | "dependencies": { 218 | "@cloudflare/workers-types": "^4.20250311.0" 219 | } 220 | }, 221 | "node_modules/@cloudflare/workers-types": { 222 | "version": "4.20250418.0", 223 | "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250418.0.tgz", 224 | "integrity": "sha512-cPnHbEAryOX1FwEjjMXXCLudkxXUlfy7Hf55lqTPpYRSUA76NGLFfkhUF7+KkRrFg2u6pNpXTj24Gv5pMEHlqg==", 225 | "license": "MIT OR Apache-2.0" 226 | }, 227 | "node_modules/@cspotcode/source-map-support": { 228 | "version": "0.8.1", 229 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 230 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 231 | "dev": true, 232 | "license": "MIT", 233 | "dependencies": { 234 | "@jridgewell/trace-mapping": "0.3.9" 235 | }, 236 | "engines": { 237 | "node": ">=12" 238 | } 239 | }, 240 | "node_modules/@emnapi/runtime": { 241 | "version": "1.4.3", 242 | "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", 243 | "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", 244 | "dev": true, 245 | "license": "MIT", 246 | "optional": true, 247 | "dependencies": { 248 | "tslib": "^2.4.0" 249 | } 250 | }, 251 | "node_modules/@esbuild/aix-ppc64": { 252 | "version": "0.25.2", 253 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", 254 | "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", 255 | "cpu": [ 256 | "ppc64" 257 | ], 258 | "dev": true, 259 | "license": "MIT", 260 | "optional": true, 261 | "os": [ 262 | "aix" 263 | ], 264 | "engines": { 265 | "node": ">=18" 266 | } 267 | }, 268 | "node_modules/@esbuild/android-arm": { 269 | "version": "0.25.2", 270 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", 271 | "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", 272 | "cpu": [ 273 | "arm" 274 | ], 275 | "dev": true, 276 | "license": "MIT", 277 | "optional": true, 278 | "os": [ 279 | "android" 280 | ], 281 | "engines": { 282 | "node": ">=18" 283 | } 284 | }, 285 | "node_modules/@esbuild/android-arm64": { 286 | "version": "0.25.2", 287 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", 288 | "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", 289 | "cpu": [ 290 | "arm64" 291 | ], 292 | "dev": true, 293 | "license": "MIT", 294 | "optional": true, 295 | "os": [ 296 | "android" 297 | ], 298 | "engines": { 299 | "node": ">=18" 300 | } 301 | }, 302 | "node_modules/@esbuild/android-x64": { 303 | "version": "0.25.2", 304 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", 305 | "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", 306 | "cpu": [ 307 | "x64" 308 | ], 309 | "dev": true, 310 | "license": "MIT", 311 | "optional": true, 312 | "os": [ 313 | "android" 314 | ], 315 | "engines": { 316 | "node": ">=18" 317 | } 318 | }, 319 | "node_modules/@esbuild/darwin-arm64": { 320 | "version": "0.25.2", 321 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", 322 | "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", 323 | "cpu": [ 324 | "arm64" 325 | ], 326 | "dev": true, 327 | "license": "MIT", 328 | "optional": true, 329 | "os": [ 330 | "darwin" 331 | ], 332 | "engines": { 333 | "node": ">=18" 334 | } 335 | }, 336 | "node_modules/@esbuild/darwin-x64": { 337 | "version": "0.25.2", 338 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", 339 | "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", 340 | "cpu": [ 341 | "x64" 342 | ], 343 | "dev": true, 344 | "license": "MIT", 345 | "optional": true, 346 | "os": [ 347 | "darwin" 348 | ], 349 | "engines": { 350 | "node": ">=18" 351 | } 352 | }, 353 | "node_modules/@esbuild/freebsd-arm64": { 354 | "version": "0.25.2", 355 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", 356 | "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", 357 | "cpu": [ 358 | "arm64" 359 | ], 360 | "dev": true, 361 | "license": "MIT", 362 | "optional": true, 363 | "os": [ 364 | "freebsd" 365 | ], 366 | "engines": { 367 | "node": ">=18" 368 | } 369 | }, 370 | "node_modules/@esbuild/freebsd-x64": { 371 | "version": "0.25.2", 372 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", 373 | "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", 374 | "cpu": [ 375 | "x64" 376 | ], 377 | "dev": true, 378 | "license": "MIT", 379 | "optional": true, 380 | "os": [ 381 | "freebsd" 382 | ], 383 | "engines": { 384 | "node": ">=18" 385 | } 386 | }, 387 | "node_modules/@esbuild/linux-arm": { 388 | "version": "0.25.2", 389 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", 390 | "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", 391 | "cpu": [ 392 | "arm" 393 | ], 394 | "dev": true, 395 | "license": "MIT", 396 | "optional": true, 397 | "os": [ 398 | "linux" 399 | ], 400 | "engines": { 401 | "node": ">=18" 402 | } 403 | }, 404 | "node_modules/@esbuild/linux-arm64": { 405 | "version": "0.25.2", 406 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", 407 | "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", 408 | "cpu": [ 409 | "arm64" 410 | ], 411 | "dev": true, 412 | "license": "MIT", 413 | "optional": true, 414 | "os": [ 415 | "linux" 416 | ], 417 | "engines": { 418 | "node": ">=18" 419 | } 420 | }, 421 | "node_modules/@esbuild/linux-ia32": { 422 | "version": "0.25.2", 423 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", 424 | "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", 425 | "cpu": [ 426 | "ia32" 427 | ], 428 | "dev": true, 429 | "license": "MIT", 430 | "optional": true, 431 | "os": [ 432 | "linux" 433 | ], 434 | "engines": { 435 | "node": ">=18" 436 | } 437 | }, 438 | "node_modules/@esbuild/linux-loong64": { 439 | "version": "0.25.2", 440 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", 441 | "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", 442 | "cpu": [ 443 | "loong64" 444 | ], 445 | "dev": true, 446 | "license": "MIT", 447 | "optional": true, 448 | "os": [ 449 | "linux" 450 | ], 451 | "engines": { 452 | "node": ">=18" 453 | } 454 | }, 455 | "node_modules/@esbuild/linux-mips64el": { 456 | "version": "0.25.2", 457 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", 458 | "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", 459 | "cpu": [ 460 | "mips64el" 461 | ], 462 | "dev": true, 463 | "license": "MIT", 464 | "optional": true, 465 | "os": [ 466 | "linux" 467 | ], 468 | "engines": { 469 | "node": ">=18" 470 | } 471 | }, 472 | "node_modules/@esbuild/linux-ppc64": { 473 | "version": "0.25.2", 474 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", 475 | "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", 476 | "cpu": [ 477 | "ppc64" 478 | ], 479 | "dev": true, 480 | "license": "MIT", 481 | "optional": true, 482 | "os": [ 483 | "linux" 484 | ], 485 | "engines": { 486 | "node": ">=18" 487 | } 488 | }, 489 | "node_modules/@esbuild/linux-riscv64": { 490 | "version": "0.25.2", 491 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", 492 | "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", 493 | "cpu": [ 494 | "riscv64" 495 | ], 496 | "dev": true, 497 | "license": "MIT", 498 | "optional": true, 499 | "os": [ 500 | "linux" 501 | ], 502 | "engines": { 503 | "node": ">=18" 504 | } 505 | }, 506 | "node_modules/@esbuild/linux-s390x": { 507 | "version": "0.25.2", 508 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", 509 | "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", 510 | "cpu": [ 511 | "s390x" 512 | ], 513 | "dev": true, 514 | "license": "MIT", 515 | "optional": true, 516 | "os": [ 517 | "linux" 518 | ], 519 | "engines": { 520 | "node": ">=18" 521 | } 522 | }, 523 | "node_modules/@esbuild/linux-x64": { 524 | "version": "0.25.2", 525 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", 526 | "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", 527 | "cpu": [ 528 | "x64" 529 | ], 530 | "dev": true, 531 | "license": "MIT", 532 | "optional": true, 533 | "os": [ 534 | "linux" 535 | ], 536 | "engines": { 537 | "node": ">=18" 538 | } 539 | }, 540 | "node_modules/@esbuild/netbsd-arm64": { 541 | "version": "0.25.2", 542 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", 543 | "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", 544 | "cpu": [ 545 | "arm64" 546 | ], 547 | "dev": true, 548 | "license": "MIT", 549 | "optional": true, 550 | "os": [ 551 | "netbsd" 552 | ], 553 | "engines": { 554 | "node": ">=18" 555 | } 556 | }, 557 | "node_modules/@esbuild/netbsd-x64": { 558 | "version": "0.25.2", 559 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", 560 | "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", 561 | "cpu": [ 562 | "x64" 563 | ], 564 | "dev": true, 565 | "license": "MIT", 566 | "optional": true, 567 | "os": [ 568 | "netbsd" 569 | ], 570 | "engines": { 571 | "node": ">=18" 572 | } 573 | }, 574 | "node_modules/@esbuild/openbsd-arm64": { 575 | "version": "0.25.2", 576 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", 577 | "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", 578 | "cpu": [ 579 | "arm64" 580 | ], 581 | "dev": true, 582 | "license": "MIT", 583 | "optional": true, 584 | "os": [ 585 | "openbsd" 586 | ], 587 | "engines": { 588 | "node": ">=18" 589 | } 590 | }, 591 | "node_modules/@esbuild/openbsd-x64": { 592 | "version": "0.25.2", 593 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", 594 | "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", 595 | "cpu": [ 596 | "x64" 597 | ], 598 | "dev": true, 599 | "license": "MIT", 600 | "optional": true, 601 | "os": [ 602 | "openbsd" 603 | ], 604 | "engines": { 605 | "node": ">=18" 606 | } 607 | }, 608 | "node_modules/@esbuild/sunos-x64": { 609 | "version": "0.25.2", 610 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", 611 | "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", 612 | "cpu": [ 613 | "x64" 614 | ], 615 | "dev": true, 616 | "license": "MIT", 617 | "optional": true, 618 | "os": [ 619 | "sunos" 620 | ], 621 | "engines": { 622 | "node": ">=18" 623 | } 624 | }, 625 | "node_modules/@esbuild/win32-arm64": { 626 | "version": "0.25.2", 627 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", 628 | "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", 629 | "cpu": [ 630 | "arm64" 631 | ], 632 | "dev": true, 633 | "license": "MIT", 634 | "optional": true, 635 | "os": [ 636 | "win32" 637 | ], 638 | "engines": { 639 | "node": ">=18" 640 | } 641 | }, 642 | "node_modules/@esbuild/win32-ia32": { 643 | "version": "0.25.2", 644 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", 645 | "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", 646 | "cpu": [ 647 | "ia32" 648 | ], 649 | "dev": true, 650 | "license": "MIT", 651 | "optional": true, 652 | "os": [ 653 | "win32" 654 | ], 655 | "engines": { 656 | "node": ">=18" 657 | } 658 | }, 659 | "node_modules/@esbuild/win32-x64": { 660 | "version": "0.25.2", 661 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", 662 | "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", 663 | "cpu": [ 664 | "x64" 665 | ], 666 | "dev": true, 667 | "license": "MIT", 668 | "optional": true, 669 | "os": [ 670 | "win32" 671 | ], 672 | "engines": { 673 | "node": ">=18" 674 | } 675 | }, 676 | "node_modules/@fastify/busboy": { 677 | "version": "2.1.1", 678 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 679 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 680 | "dev": true, 681 | "license": "MIT", 682 | "engines": { 683 | "node": ">=14" 684 | } 685 | }, 686 | "node_modules/@img/sharp-darwin-arm64": { 687 | "version": "0.33.5", 688 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", 689 | "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", 690 | "cpu": [ 691 | "arm64" 692 | ], 693 | "dev": true, 694 | "license": "Apache-2.0", 695 | "optional": true, 696 | "os": [ 697 | "darwin" 698 | ], 699 | "engines": { 700 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 701 | }, 702 | "funding": { 703 | "url": "https://opencollective.com/libvips" 704 | }, 705 | "optionalDependencies": { 706 | "@img/sharp-libvips-darwin-arm64": "1.0.4" 707 | } 708 | }, 709 | "node_modules/@img/sharp-darwin-x64": { 710 | "version": "0.33.5", 711 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", 712 | "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", 713 | "cpu": [ 714 | "x64" 715 | ], 716 | "dev": true, 717 | "license": "Apache-2.0", 718 | "optional": true, 719 | "os": [ 720 | "darwin" 721 | ], 722 | "engines": { 723 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 724 | }, 725 | "funding": { 726 | "url": "https://opencollective.com/libvips" 727 | }, 728 | "optionalDependencies": { 729 | "@img/sharp-libvips-darwin-x64": "1.0.4" 730 | } 731 | }, 732 | "node_modules/@img/sharp-libvips-darwin-arm64": { 733 | "version": "1.0.4", 734 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", 735 | "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", 736 | "cpu": [ 737 | "arm64" 738 | ], 739 | "dev": true, 740 | "license": "LGPL-3.0-or-later", 741 | "optional": true, 742 | "os": [ 743 | "darwin" 744 | ], 745 | "funding": { 746 | "url": "https://opencollective.com/libvips" 747 | } 748 | }, 749 | "node_modules/@img/sharp-libvips-darwin-x64": { 750 | "version": "1.0.4", 751 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", 752 | "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", 753 | "cpu": [ 754 | "x64" 755 | ], 756 | "dev": true, 757 | "license": "LGPL-3.0-or-later", 758 | "optional": true, 759 | "os": [ 760 | "darwin" 761 | ], 762 | "funding": { 763 | "url": "https://opencollective.com/libvips" 764 | } 765 | }, 766 | "node_modules/@img/sharp-libvips-linux-arm": { 767 | "version": "1.0.5", 768 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", 769 | "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", 770 | "cpu": [ 771 | "arm" 772 | ], 773 | "dev": true, 774 | "license": "LGPL-3.0-or-later", 775 | "optional": true, 776 | "os": [ 777 | "linux" 778 | ], 779 | "funding": { 780 | "url": "https://opencollective.com/libvips" 781 | } 782 | }, 783 | "node_modules/@img/sharp-libvips-linux-arm64": { 784 | "version": "1.0.4", 785 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", 786 | "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", 787 | "cpu": [ 788 | "arm64" 789 | ], 790 | "dev": true, 791 | "license": "LGPL-3.0-or-later", 792 | "optional": true, 793 | "os": [ 794 | "linux" 795 | ], 796 | "funding": { 797 | "url": "https://opencollective.com/libvips" 798 | } 799 | }, 800 | "node_modules/@img/sharp-libvips-linux-s390x": { 801 | "version": "1.0.4", 802 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", 803 | "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", 804 | "cpu": [ 805 | "s390x" 806 | ], 807 | "dev": true, 808 | "license": "LGPL-3.0-or-later", 809 | "optional": true, 810 | "os": [ 811 | "linux" 812 | ], 813 | "funding": { 814 | "url": "https://opencollective.com/libvips" 815 | } 816 | }, 817 | "node_modules/@img/sharp-libvips-linux-x64": { 818 | "version": "1.0.4", 819 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", 820 | "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", 821 | "cpu": [ 822 | "x64" 823 | ], 824 | "dev": true, 825 | "license": "LGPL-3.0-or-later", 826 | "optional": true, 827 | "os": [ 828 | "linux" 829 | ], 830 | "funding": { 831 | "url": "https://opencollective.com/libvips" 832 | } 833 | }, 834 | "node_modules/@img/sharp-libvips-linuxmusl-arm64": { 835 | "version": "1.0.4", 836 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", 837 | "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", 838 | "cpu": [ 839 | "arm64" 840 | ], 841 | "dev": true, 842 | "license": "LGPL-3.0-or-later", 843 | "optional": true, 844 | "os": [ 845 | "linux" 846 | ], 847 | "funding": { 848 | "url": "https://opencollective.com/libvips" 849 | } 850 | }, 851 | "node_modules/@img/sharp-libvips-linuxmusl-x64": { 852 | "version": "1.0.4", 853 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", 854 | "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", 855 | "cpu": [ 856 | "x64" 857 | ], 858 | "dev": true, 859 | "license": "LGPL-3.0-or-later", 860 | "optional": true, 861 | "os": [ 862 | "linux" 863 | ], 864 | "funding": { 865 | "url": "https://opencollective.com/libvips" 866 | } 867 | }, 868 | "node_modules/@img/sharp-linux-arm": { 869 | "version": "0.33.5", 870 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", 871 | "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", 872 | "cpu": [ 873 | "arm" 874 | ], 875 | "dev": true, 876 | "license": "Apache-2.0", 877 | "optional": true, 878 | "os": [ 879 | "linux" 880 | ], 881 | "engines": { 882 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 883 | }, 884 | "funding": { 885 | "url": "https://opencollective.com/libvips" 886 | }, 887 | "optionalDependencies": { 888 | "@img/sharp-libvips-linux-arm": "1.0.5" 889 | } 890 | }, 891 | "node_modules/@img/sharp-linux-arm64": { 892 | "version": "0.33.5", 893 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", 894 | "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", 895 | "cpu": [ 896 | "arm64" 897 | ], 898 | "dev": true, 899 | "license": "Apache-2.0", 900 | "optional": true, 901 | "os": [ 902 | "linux" 903 | ], 904 | "engines": { 905 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 906 | }, 907 | "funding": { 908 | "url": "https://opencollective.com/libvips" 909 | }, 910 | "optionalDependencies": { 911 | "@img/sharp-libvips-linux-arm64": "1.0.4" 912 | } 913 | }, 914 | "node_modules/@img/sharp-linux-s390x": { 915 | "version": "0.33.5", 916 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", 917 | "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", 918 | "cpu": [ 919 | "s390x" 920 | ], 921 | "dev": true, 922 | "license": "Apache-2.0", 923 | "optional": true, 924 | "os": [ 925 | "linux" 926 | ], 927 | "engines": { 928 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 929 | }, 930 | "funding": { 931 | "url": "https://opencollective.com/libvips" 932 | }, 933 | "optionalDependencies": { 934 | "@img/sharp-libvips-linux-s390x": "1.0.4" 935 | } 936 | }, 937 | "node_modules/@img/sharp-linux-x64": { 938 | "version": "0.33.5", 939 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", 940 | "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", 941 | "cpu": [ 942 | "x64" 943 | ], 944 | "dev": true, 945 | "license": "Apache-2.0", 946 | "optional": true, 947 | "os": [ 948 | "linux" 949 | ], 950 | "engines": { 951 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 952 | }, 953 | "funding": { 954 | "url": "https://opencollective.com/libvips" 955 | }, 956 | "optionalDependencies": { 957 | "@img/sharp-libvips-linux-x64": "1.0.4" 958 | } 959 | }, 960 | "node_modules/@img/sharp-linuxmusl-arm64": { 961 | "version": "0.33.5", 962 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", 963 | "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", 964 | "cpu": [ 965 | "arm64" 966 | ], 967 | "dev": true, 968 | "license": "Apache-2.0", 969 | "optional": true, 970 | "os": [ 971 | "linux" 972 | ], 973 | "engines": { 974 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 975 | }, 976 | "funding": { 977 | "url": "https://opencollective.com/libvips" 978 | }, 979 | "optionalDependencies": { 980 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" 981 | } 982 | }, 983 | "node_modules/@img/sharp-linuxmusl-x64": { 984 | "version": "0.33.5", 985 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", 986 | "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", 987 | "cpu": [ 988 | "x64" 989 | ], 990 | "dev": true, 991 | "license": "Apache-2.0", 992 | "optional": true, 993 | "os": [ 994 | "linux" 995 | ], 996 | "engines": { 997 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 998 | }, 999 | "funding": { 1000 | "url": "https://opencollective.com/libvips" 1001 | }, 1002 | "optionalDependencies": { 1003 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4" 1004 | } 1005 | }, 1006 | "node_modules/@img/sharp-wasm32": { 1007 | "version": "0.33.5", 1008 | "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", 1009 | "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", 1010 | "cpu": [ 1011 | "wasm32" 1012 | ], 1013 | "dev": true, 1014 | "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", 1015 | "optional": true, 1016 | "dependencies": { 1017 | "@emnapi/runtime": "^1.2.0" 1018 | }, 1019 | "engines": { 1020 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1021 | }, 1022 | "funding": { 1023 | "url": "https://opencollective.com/libvips" 1024 | } 1025 | }, 1026 | "node_modules/@img/sharp-win32-ia32": { 1027 | "version": "0.33.5", 1028 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", 1029 | "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", 1030 | "cpu": [ 1031 | "ia32" 1032 | ], 1033 | "dev": true, 1034 | "license": "Apache-2.0 AND LGPL-3.0-or-later", 1035 | "optional": true, 1036 | "os": [ 1037 | "win32" 1038 | ], 1039 | "engines": { 1040 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1041 | }, 1042 | "funding": { 1043 | "url": "https://opencollective.com/libvips" 1044 | } 1045 | }, 1046 | "node_modules/@img/sharp-win32-x64": { 1047 | "version": "0.33.5", 1048 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", 1049 | "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", 1050 | "cpu": [ 1051 | "x64" 1052 | ], 1053 | "dev": true, 1054 | "license": "Apache-2.0 AND LGPL-3.0-or-later", 1055 | "optional": true, 1056 | "os": [ 1057 | "win32" 1058 | ], 1059 | "engines": { 1060 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 1061 | }, 1062 | "funding": { 1063 | "url": "https://opencollective.com/libvips" 1064 | } 1065 | }, 1066 | "node_modules/@jridgewell/resolve-uri": { 1067 | "version": "3.1.2", 1068 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1069 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1070 | "dev": true, 1071 | "license": "MIT", 1072 | "engines": { 1073 | "node": ">=6.0.0" 1074 | } 1075 | }, 1076 | "node_modules/@jridgewell/sourcemap-codec": { 1077 | "version": "1.5.0", 1078 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 1079 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 1080 | "dev": true, 1081 | "license": "MIT" 1082 | }, 1083 | "node_modules/@jridgewell/trace-mapping": { 1084 | "version": "0.3.9", 1085 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 1086 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 1087 | "dev": true, 1088 | "license": "MIT", 1089 | "dependencies": { 1090 | "@jridgewell/resolve-uri": "^3.0.3", 1091 | "@jridgewell/sourcemap-codec": "^1.4.10" 1092 | } 1093 | }, 1094 | "node_modules/@jsdoc/salty": { 1095 | "version": "0.2.9", 1096 | "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz", 1097 | "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==", 1098 | "dev": true, 1099 | "license": "Apache-2.0", 1100 | "dependencies": { 1101 | "lodash": "^4.17.21" 1102 | }, 1103 | "engines": { 1104 | "node": ">=v12.0.0" 1105 | } 1106 | }, 1107 | "node_modules/@modelcontextprotocol/sdk": { 1108 | "version": "1.9.0", 1109 | "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.9.0.tgz", 1110 | "integrity": "sha512-Jq2EUCQpe0iyO5FGpzVYDNFR6oR53AIrwph9yWl7uSc7IWUMsrmpmSaTGra5hQNunXpM+9oit85p924jWuHzUA==", 1111 | "license": "MIT", 1112 | "dependencies": { 1113 | "content-type": "^1.0.5", 1114 | "cors": "^2.8.5", 1115 | "cross-spawn": "^7.0.3", 1116 | "eventsource": "^3.0.2", 1117 | "express": "^5.0.1", 1118 | "express-rate-limit": "^7.5.0", 1119 | "pkce-challenge": "^5.0.0", 1120 | "raw-body": "^3.0.0", 1121 | "zod": "^3.23.8", 1122 | "zod-to-json-schema": "^3.24.1" 1123 | }, 1124 | "engines": { 1125 | "node": ">=18" 1126 | } 1127 | }, 1128 | "node_modules/@nodelib/fs.scandir": { 1129 | "version": "2.1.5", 1130 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1131 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1132 | "dev": true, 1133 | "license": "MIT", 1134 | "dependencies": { 1135 | "@nodelib/fs.stat": "2.0.5", 1136 | "run-parallel": "^1.1.9" 1137 | }, 1138 | "engines": { 1139 | "node": ">= 8" 1140 | } 1141 | }, 1142 | "node_modules/@nodelib/fs.stat": { 1143 | "version": "2.0.5", 1144 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1145 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1146 | "dev": true, 1147 | "license": "MIT", 1148 | "engines": { 1149 | "node": ">= 8" 1150 | } 1151 | }, 1152 | "node_modules/@nodelib/fs.walk": { 1153 | "version": "1.2.8", 1154 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1155 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1156 | "dev": true, 1157 | "license": "MIT", 1158 | "dependencies": { 1159 | "@nodelib/fs.scandir": "2.1.5", 1160 | "fastq": "^1.6.0" 1161 | }, 1162 | "engines": { 1163 | "node": ">= 8" 1164 | } 1165 | }, 1166 | "node_modules/@silvia-odwyer/photon-node": { 1167 | "version": "0.3.3", 1168 | "resolved": "https://registry.npmjs.org/@silvia-odwyer/photon-node/-/photon-node-0.3.3.tgz", 1169 | "integrity": "sha512-30nDWTHQ7/d1xGnO41ol5tnBA1Bmo2N6h9HNPByBbIYU2xCYB9g4o4zB6vxAq15ixrBRTjb1Nnz1K0Jli3Hxnw==", 1170 | "dev": true, 1171 | "license": "Apache-2.0" 1172 | }, 1173 | "node_modules/@types/linkify-it": { 1174 | "version": "5.0.0", 1175 | "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", 1176 | "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", 1177 | "dev": true, 1178 | "license": "MIT" 1179 | }, 1180 | "node_modules/@types/markdown-it": { 1181 | "version": "14.1.2", 1182 | "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", 1183 | "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", 1184 | "dev": true, 1185 | "license": "MIT", 1186 | "dependencies": { 1187 | "@types/linkify-it": "^5", 1188 | "@types/mdurl": "^2" 1189 | } 1190 | }, 1191 | "node_modules/@types/mdurl": { 1192 | "version": "2.0.0", 1193 | "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", 1194 | "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", 1195 | "dev": true, 1196 | "license": "MIT" 1197 | }, 1198 | "node_modules/accepts": { 1199 | "version": "2.0.0", 1200 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", 1201 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 1202 | "license": "MIT", 1203 | "dependencies": { 1204 | "mime-types": "^3.0.0", 1205 | "negotiator": "^1.0.0" 1206 | }, 1207 | "engines": { 1208 | "node": ">= 0.6" 1209 | } 1210 | }, 1211 | "node_modules/acorn": { 1212 | "version": "8.14.0", 1213 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 1214 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 1215 | "dev": true, 1216 | "license": "MIT", 1217 | "bin": { 1218 | "acorn": "bin/acorn" 1219 | }, 1220 | "engines": { 1221 | "node": ">=0.4.0" 1222 | } 1223 | }, 1224 | "node_modules/acorn-walk": { 1225 | "version": "8.3.2", 1226 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", 1227 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", 1228 | "dev": true, 1229 | "license": "MIT", 1230 | "engines": { 1231 | "node": ">=0.4.0" 1232 | } 1233 | }, 1234 | "node_modules/agents": { 1235 | "version": "0.0.53", 1236 | "resolved": "https://registry.npmjs.org/agents/-/agents-0.0.53.tgz", 1237 | "integrity": "sha512-FNQlUW4pNJ/vOlHfMzIH15rB+7IY2TykyyPtnR0cIRJkDAKKSKYlboMmBcyWUpMumw0En/CMR/G/lEU2kPwxcQ==", 1238 | "license": "MIT", 1239 | "dependencies": { 1240 | "@modelcontextprotocol/sdk": "^1.8.0", 1241 | "cron-schedule": "^5.0.4", 1242 | "nanoid": "^5.1.5", 1243 | "partyserver": "^0.0.66", 1244 | "partysocket": "1.1.3" 1245 | } 1246 | }, 1247 | "node_modules/argparse": { 1248 | "version": "2.0.1", 1249 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1250 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1251 | "dev": true, 1252 | "license": "Python-2.0" 1253 | }, 1254 | "node_modules/array-back": { 1255 | "version": "6.2.2", 1256 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", 1257 | "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", 1258 | "dev": true, 1259 | "license": "MIT", 1260 | "engines": { 1261 | "node": ">=12.17" 1262 | } 1263 | }, 1264 | "node_modules/as-table": { 1265 | "version": "1.0.55", 1266 | "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", 1267 | "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", 1268 | "dev": true, 1269 | "license": "MIT", 1270 | "dependencies": { 1271 | "printable-characters": "^1.0.42" 1272 | } 1273 | }, 1274 | "node_modules/blake3-wasm": { 1275 | "version": "2.1.5", 1276 | "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", 1277 | "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", 1278 | "dev": true, 1279 | "license": "MIT" 1280 | }, 1281 | "node_modules/bluebird": { 1282 | "version": "3.7.2", 1283 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 1284 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", 1285 | "dev": true, 1286 | "license": "MIT" 1287 | }, 1288 | "node_modules/body-parser": { 1289 | "version": "2.2.0", 1290 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", 1291 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", 1292 | "license": "MIT", 1293 | "dependencies": { 1294 | "bytes": "^3.1.2", 1295 | "content-type": "^1.0.5", 1296 | "debug": "^4.4.0", 1297 | "http-errors": "^2.0.0", 1298 | "iconv-lite": "^0.6.3", 1299 | "on-finished": "^2.4.1", 1300 | "qs": "^6.14.0", 1301 | "raw-body": "^3.0.0", 1302 | "type-is": "^2.0.0" 1303 | }, 1304 | "engines": { 1305 | "node": ">=18" 1306 | } 1307 | }, 1308 | "node_modules/braces": { 1309 | "version": "3.0.3", 1310 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1311 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1312 | "dev": true, 1313 | "license": "MIT", 1314 | "dependencies": { 1315 | "fill-range": "^7.1.1" 1316 | }, 1317 | "engines": { 1318 | "node": ">=8" 1319 | } 1320 | }, 1321 | "node_modules/bytes": { 1322 | "version": "3.1.2", 1323 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1324 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 1325 | "license": "MIT", 1326 | "engines": { 1327 | "node": ">= 0.8" 1328 | } 1329 | }, 1330 | "node_modules/cache-point": { 1331 | "version": "3.0.1", 1332 | "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-3.0.1.tgz", 1333 | "integrity": "sha512-itTIMLEKbh6Dw5DruXbxAgcyLnh/oPGVLBfTPqBOftASxHe8bAeXy7JkO4F0LvHqht7XqP5O/09h5UcHS2w0FA==", 1334 | "dev": true, 1335 | "license": "MIT", 1336 | "dependencies": { 1337 | "array-back": "^6.2.2" 1338 | }, 1339 | "engines": { 1340 | "node": ">=12.17" 1341 | }, 1342 | "peerDependencies": { 1343 | "@75lb/nature": "latest" 1344 | }, 1345 | "peerDependenciesMeta": { 1346 | "@75lb/nature": { 1347 | "optional": true 1348 | } 1349 | } 1350 | }, 1351 | "node_modules/call-bind-apply-helpers": { 1352 | "version": "1.0.2", 1353 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 1354 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 1355 | "license": "MIT", 1356 | "dependencies": { 1357 | "es-errors": "^1.3.0", 1358 | "function-bind": "^1.1.2" 1359 | }, 1360 | "engines": { 1361 | "node": ">= 0.4" 1362 | } 1363 | }, 1364 | "node_modules/call-bound": { 1365 | "version": "1.0.4", 1366 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 1367 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 1368 | "license": "MIT", 1369 | "dependencies": { 1370 | "call-bind-apply-helpers": "^1.0.2", 1371 | "get-intrinsic": "^1.3.0" 1372 | }, 1373 | "engines": { 1374 | "node": ">= 0.4" 1375 | }, 1376 | "funding": { 1377 | "url": "https://github.com/sponsors/ljharb" 1378 | } 1379 | }, 1380 | "node_modules/catharsis": { 1381 | "version": "0.9.0", 1382 | "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", 1383 | "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", 1384 | "dev": true, 1385 | "license": "MIT", 1386 | "dependencies": { 1387 | "lodash": "^4.17.15" 1388 | }, 1389 | "engines": { 1390 | "node": ">= 10" 1391 | } 1392 | }, 1393 | "node_modules/chalk": { 1394 | "version": "5.4.1", 1395 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", 1396 | "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", 1397 | "dev": true, 1398 | "license": "MIT", 1399 | "engines": { 1400 | "node": "^12.17.0 || ^14.13 || >=16.0.0" 1401 | }, 1402 | "funding": { 1403 | "url": "https://github.com/chalk/chalk?sponsor=1" 1404 | } 1405 | }, 1406 | "node_modules/color": { 1407 | "version": "4.2.3", 1408 | "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", 1409 | "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", 1410 | "dev": true, 1411 | "license": "MIT", 1412 | "optional": true, 1413 | "dependencies": { 1414 | "color-convert": "^2.0.1", 1415 | "color-string": "^1.9.0" 1416 | }, 1417 | "engines": { 1418 | "node": ">=12.5.0" 1419 | } 1420 | }, 1421 | "node_modules/color-convert": { 1422 | "version": "2.0.1", 1423 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1424 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1425 | "dev": true, 1426 | "license": "MIT", 1427 | "optional": true, 1428 | "dependencies": { 1429 | "color-name": "~1.1.4" 1430 | }, 1431 | "engines": { 1432 | "node": ">=7.0.0" 1433 | } 1434 | }, 1435 | "node_modules/color-name": { 1436 | "version": "1.1.4", 1437 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1438 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1439 | "dev": true, 1440 | "license": "MIT", 1441 | "optional": true 1442 | }, 1443 | "node_modules/color-string": { 1444 | "version": "1.9.1", 1445 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 1446 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 1447 | "dev": true, 1448 | "license": "MIT", 1449 | "optional": true, 1450 | "dependencies": { 1451 | "color-name": "^1.0.0", 1452 | "simple-swizzle": "^0.2.2" 1453 | } 1454 | }, 1455 | "node_modules/commander": { 1456 | "version": "2.20.3", 1457 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1458 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 1459 | "dev": true, 1460 | "license": "MIT" 1461 | }, 1462 | "node_modules/content-disposition": { 1463 | "version": "1.0.0", 1464 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", 1465 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", 1466 | "license": "MIT", 1467 | "dependencies": { 1468 | "safe-buffer": "5.2.1" 1469 | }, 1470 | "engines": { 1471 | "node": ">= 0.6" 1472 | } 1473 | }, 1474 | "node_modules/content-type": { 1475 | "version": "1.0.5", 1476 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 1477 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 1478 | "license": "MIT", 1479 | "engines": { 1480 | "node": ">= 0.6" 1481 | } 1482 | }, 1483 | "node_modules/cookie": { 1484 | "version": "0.7.2", 1485 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", 1486 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", 1487 | "license": "MIT", 1488 | "engines": { 1489 | "node": ">= 0.6" 1490 | } 1491 | }, 1492 | "node_modules/cookie-signature": { 1493 | "version": "1.2.2", 1494 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", 1495 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", 1496 | "license": "MIT", 1497 | "engines": { 1498 | "node": ">=6.6.0" 1499 | } 1500 | }, 1501 | "node_modules/cors": { 1502 | "version": "2.8.5", 1503 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 1504 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1505 | "license": "MIT", 1506 | "dependencies": { 1507 | "object-assign": "^4", 1508 | "vary": "^1" 1509 | }, 1510 | "engines": { 1511 | "node": ">= 0.10" 1512 | } 1513 | }, 1514 | "node_modules/cron-schedule": { 1515 | "version": "5.0.4", 1516 | "resolved": "https://registry.npmjs.org/cron-schedule/-/cron-schedule-5.0.4.tgz", 1517 | "integrity": "sha512-nH0a49E/kSVk6BeFgKZy4uUsy6D2A16p120h5bYD9ILBhQu7o2sJFH+WI4R731TSBQ0dB1Ik7inB/dRAB4C8QQ==", 1518 | "license": "MIT", 1519 | "engines": { 1520 | "node": ">=18" 1521 | } 1522 | }, 1523 | "node_modules/cross-spawn": { 1524 | "version": "7.0.6", 1525 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1526 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1527 | "license": "MIT", 1528 | "dependencies": { 1529 | "path-key": "^3.1.0", 1530 | "shebang-command": "^2.0.0", 1531 | "which": "^2.0.1" 1532 | }, 1533 | "engines": { 1534 | "node": ">= 8" 1535 | } 1536 | }, 1537 | "node_modules/current-module-paths": { 1538 | "version": "1.1.2", 1539 | "resolved": "https://registry.npmjs.org/current-module-paths/-/current-module-paths-1.1.2.tgz", 1540 | "integrity": "sha512-H4s4arcLx/ugbu1XkkgSvcUZax0L6tXUqnppGniQb8l5VjUKGHoayXE5RiriiPhYDd+kjZnaok1Uig13PKtKYQ==", 1541 | "dev": true, 1542 | "license": "MIT", 1543 | "engines": { 1544 | "node": ">=12.17" 1545 | } 1546 | }, 1547 | "node_modules/data-uri-to-buffer": { 1548 | "version": "2.0.2", 1549 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", 1550 | "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", 1551 | "dev": true, 1552 | "license": "MIT" 1553 | }, 1554 | "node_modules/debug": { 1555 | "version": "4.4.0", 1556 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1557 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1558 | "license": "MIT", 1559 | "dependencies": { 1560 | "ms": "^2.1.3" 1561 | }, 1562 | "engines": { 1563 | "node": ">=6.0" 1564 | }, 1565 | "peerDependenciesMeta": { 1566 | "supports-color": { 1567 | "optional": true 1568 | } 1569 | } 1570 | }, 1571 | "node_modules/defu": { 1572 | "version": "6.1.4", 1573 | "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", 1574 | "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", 1575 | "dev": true, 1576 | "license": "MIT" 1577 | }, 1578 | "node_modules/depd": { 1579 | "version": "2.0.0", 1580 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1581 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 1582 | "license": "MIT", 1583 | "engines": { 1584 | "node": ">= 0.8" 1585 | } 1586 | }, 1587 | "node_modules/detect-libc": { 1588 | "version": "2.0.3", 1589 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 1590 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 1591 | "dev": true, 1592 | "license": "Apache-2.0", 1593 | "optional": true, 1594 | "engines": { 1595 | "node": ">=8" 1596 | } 1597 | }, 1598 | "node_modules/dunder-proto": { 1599 | "version": "1.0.1", 1600 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 1601 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 1602 | "license": "MIT", 1603 | "dependencies": { 1604 | "call-bind-apply-helpers": "^1.0.1", 1605 | "es-errors": "^1.3.0", 1606 | "gopd": "^1.2.0" 1607 | }, 1608 | "engines": { 1609 | "node": ">= 0.4" 1610 | } 1611 | }, 1612 | "node_modules/ee-first": { 1613 | "version": "1.1.1", 1614 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1615 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 1616 | "license": "MIT" 1617 | }, 1618 | "node_modules/encodeurl": { 1619 | "version": "2.0.0", 1620 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 1621 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 1622 | "license": "MIT", 1623 | "engines": { 1624 | "node": ">= 0.8" 1625 | } 1626 | }, 1627 | "node_modules/entities": { 1628 | "version": "4.5.0", 1629 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 1630 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 1631 | "dev": true, 1632 | "license": "BSD-2-Clause", 1633 | "engines": { 1634 | "node": ">=0.12" 1635 | }, 1636 | "funding": { 1637 | "url": "https://github.com/fb55/entities?sponsor=1" 1638 | } 1639 | }, 1640 | "node_modules/es-define-property": { 1641 | "version": "1.0.1", 1642 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 1643 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 1644 | "license": "MIT", 1645 | "engines": { 1646 | "node": ">= 0.4" 1647 | } 1648 | }, 1649 | "node_modules/es-errors": { 1650 | "version": "1.3.0", 1651 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 1652 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 1653 | "license": "MIT", 1654 | "engines": { 1655 | "node": ">= 0.4" 1656 | } 1657 | }, 1658 | "node_modules/es-object-atoms": { 1659 | "version": "1.1.1", 1660 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 1661 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 1662 | "license": "MIT", 1663 | "dependencies": { 1664 | "es-errors": "^1.3.0" 1665 | }, 1666 | "engines": { 1667 | "node": ">= 0.4" 1668 | } 1669 | }, 1670 | "node_modules/esbuild": { 1671 | "version": "0.25.2", 1672 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", 1673 | "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", 1674 | "dev": true, 1675 | "hasInstallScript": true, 1676 | "license": "MIT", 1677 | "bin": { 1678 | "esbuild": "bin/esbuild" 1679 | }, 1680 | "engines": { 1681 | "node": ">=18" 1682 | }, 1683 | "optionalDependencies": { 1684 | "@esbuild/aix-ppc64": "0.25.2", 1685 | "@esbuild/android-arm": "0.25.2", 1686 | "@esbuild/android-arm64": "0.25.2", 1687 | "@esbuild/android-x64": "0.25.2", 1688 | "@esbuild/darwin-arm64": "0.25.2", 1689 | "@esbuild/darwin-x64": "0.25.2", 1690 | "@esbuild/freebsd-arm64": "0.25.2", 1691 | "@esbuild/freebsd-x64": "0.25.2", 1692 | "@esbuild/linux-arm": "0.25.2", 1693 | "@esbuild/linux-arm64": "0.25.2", 1694 | "@esbuild/linux-ia32": "0.25.2", 1695 | "@esbuild/linux-loong64": "0.25.2", 1696 | "@esbuild/linux-mips64el": "0.25.2", 1697 | "@esbuild/linux-ppc64": "0.25.2", 1698 | "@esbuild/linux-riscv64": "0.25.2", 1699 | "@esbuild/linux-s390x": "0.25.2", 1700 | "@esbuild/linux-x64": "0.25.2", 1701 | "@esbuild/netbsd-arm64": "0.25.2", 1702 | "@esbuild/netbsd-x64": "0.25.2", 1703 | "@esbuild/openbsd-arm64": "0.25.2", 1704 | "@esbuild/openbsd-x64": "0.25.2", 1705 | "@esbuild/sunos-x64": "0.25.2", 1706 | "@esbuild/win32-arm64": "0.25.2", 1707 | "@esbuild/win32-ia32": "0.25.2", 1708 | "@esbuild/win32-x64": "0.25.2" 1709 | } 1710 | }, 1711 | "node_modules/escape-html": { 1712 | "version": "1.0.3", 1713 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1714 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 1715 | "license": "MIT" 1716 | }, 1717 | "node_modules/escape-string-regexp": { 1718 | "version": "2.0.0", 1719 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 1720 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 1721 | "dev": true, 1722 | "license": "MIT", 1723 | "engines": { 1724 | "node": ">=8" 1725 | } 1726 | }, 1727 | "node_modules/etag": { 1728 | "version": "1.8.1", 1729 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1730 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 1731 | "license": "MIT", 1732 | "engines": { 1733 | "node": ">= 0.6" 1734 | } 1735 | }, 1736 | "node_modules/event-target-polyfill": { 1737 | "version": "0.0.4", 1738 | "resolved": "https://registry.npmjs.org/event-target-polyfill/-/event-target-polyfill-0.0.4.tgz", 1739 | "integrity": "sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==", 1740 | "license": "MIT" 1741 | }, 1742 | "node_modules/eventsource": { 1743 | "version": "3.0.6", 1744 | "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz", 1745 | "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==", 1746 | "license": "MIT", 1747 | "dependencies": { 1748 | "eventsource-parser": "^3.0.1" 1749 | }, 1750 | "engines": { 1751 | "node": ">=18.0.0" 1752 | } 1753 | }, 1754 | "node_modules/eventsource-parser": { 1755 | "version": "3.0.1", 1756 | "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", 1757 | "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", 1758 | "license": "MIT", 1759 | "engines": { 1760 | "node": ">=18.0.0" 1761 | } 1762 | }, 1763 | "node_modules/exit-hook": { 1764 | "version": "2.2.1", 1765 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", 1766 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", 1767 | "dev": true, 1768 | "license": "MIT", 1769 | "engines": { 1770 | "node": ">=6" 1771 | }, 1772 | "funding": { 1773 | "url": "https://github.com/sponsors/sindresorhus" 1774 | } 1775 | }, 1776 | "node_modules/express": { 1777 | "version": "5.1.0", 1778 | "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", 1779 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", 1780 | "license": "MIT", 1781 | "dependencies": { 1782 | "accepts": "^2.0.0", 1783 | "body-parser": "^2.2.0", 1784 | "content-disposition": "^1.0.0", 1785 | "content-type": "^1.0.5", 1786 | "cookie": "^0.7.1", 1787 | "cookie-signature": "^1.2.1", 1788 | "debug": "^4.4.0", 1789 | "encodeurl": "^2.0.0", 1790 | "escape-html": "^1.0.3", 1791 | "etag": "^1.8.1", 1792 | "finalhandler": "^2.1.0", 1793 | "fresh": "^2.0.0", 1794 | "http-errors": "^2.0.0", 1795 | "merge-descriptors": "^2.0.0", 1796 | "mime-types": "^3.0.0", 1797 | "on-finished": "^2.4.1", 1798 | "once": "^1.4.0", 1799 | "parseurl": "^1.3.3", 1800 | "proxy-addr": "^2.0.7", 1801 | "qs": "^6.14.0", 1802 | "range-parser": "^1.2.1", 1803 | "router": "^2.2.0", 1804 | "send": "^1.1.0", 1805 | "serve-static": "^2.2.0", 1806 | "statuses": "^2.0.1", 1807 | "type-is": "^2.0.1", 1808 | "vary": "^1.1.2" 1809 | }, 1810 | "engines": { 1811 | "node": ">= 18" 1812 | }, 1813 | "funding": { 1814 | "type": "opencollective", 1815 | "url": "https://opencollective.com/express" 1816 | } 1817 | }, 1818 | "node_modules/express-rate-limit": { 1819 | "version": "7.5.0", 1820 | "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", 1821 | "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", 1822 | "license": "MIT", 1823 | "engines": { 1824 | "node": ">= 16" 1825 | }, 1826 | "funding": { 1827 | "url": "https://github.com/sponsors/express-rate-limit" 1828 | }, 1829 | "peerDependencies": { 1830 | "express": "^4.11 || 5 || ^5.0.0-beta.1" 1831 | } 1832 | }, 1833 | "node_modules/exsolve": { 1834 | "version": "1.0.4", 1835 | "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.4.tgz", 1836 | "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==", 1837 | "dev": true, 1838 | "license": "MIT" 1839 | }, 1840 | "node_modules/fast-glob": { 1841 | "version": "3.3.3", 1842 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 1843 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 1844 | "dev": true, 1845 | "license": "MIT", 1846 | "dependencies": { 1847 | "@nodelib/fs.stat": "^2.0.2", 1848 | "@nodelib/fs.walk": "^1.2.3", 1849 | "glob-parent": "^5.1.2", 1850 | "merge2": "^1.3.0", 1851 | "micromatch": "^4.0.8" 1852 | }, 1853 | "engines": { 1854 | "node": ">=8.6.0" 1855 | } 1856 | }, 1857 | "node_modules/fastq": { 1858 | "version": "1.19.1", 1859 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 1860 | "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 1861 | "dev": true, 1862 | "license": "ISC", 1863 | "dependencies": { 1864 | "reusify": "^1.0.4" 1865 | } 1866 | }, 1867 | "node_modules/file-set": { 1868 | "version": "5.2.2", 1869 | "resolved": "https://registry.npmjs.org/file-set/-/file-set-5.2.2.tgz", 1870 | "integrity": "sha512-/KgJI1V/QaDK4enOk/E2xMFk1cTWJghEr7UmWiRZfZ6upt6gQCfMn4jJ7aOm64OKurj4TaVnSSgSDqv5ZKYA3A==", 1871 | "dev": true, 1872 | "license": "MIT", 1873 | "dependencies": { 1874 | "array-back": "^6.2.2", 1875 | "fast-glob": "^3.3.2" 1876 | }, 1877 | "engines": { 1878 | "node": ">=12.17" 1879 | }, 1880 | "peerDependencies": { 1881 | "@75lb/nature": "latest" 1882 | }, 1883 | "peerDependenciesMeta": { 1884 | "@75lb/nature": { 1885 | "optional": true 1886 | } 1887 | } 1888 | }, 1889 | "node_modules/fill-range": { 1890 | "version": "7.1.1", 1891 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1892 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1893 | "dev": true, 1894 | "license": "MIT", 1895 | "dependencies": { 1896 | "to-regex-range": "^5.0.1" 1897 | }, 1898 | "engines": { 1899 | "node": ">=8" 1900 | } 1901 | }, 1902 | "node_modules/finalhandler": { 1903 | "version": "2.1.0", 1904 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", 1905 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", 1906 | "license": "MIT", 1907 | "dependencies": { 1908 | "debug": "^4.4.0", 1909 | "encodeurl": "^2.0.0", 1910 | "escape-html": "^1.0.3", 1911 | "on-finished": "^2.4.1", 1912 | "parseurl": "^1.3.3", 1913 | "statuses": "^2.0.1" 1914 | }, 1915 | "engines": { 1916 | "node": ">= 0.8" 1917 | } 1918 | }, 1919 | "node_modules/forwarded": { 1920 | "version": "0.2.0", 1921 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1922 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 1923 | "license": "MIT", 1924 | "engines": { 1925 | "node": ">= 0.6" 1926 | } 1927 | }, 1928 | "node_modules/fresh": { 1929 | "version": "2.0.0", 1930 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", 1931 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", 1932 | "license": "MIT", 1933 | "engines": { 1934 | "node": ">= 0.8" 1935 | } 1936 | }, 1937 | "node_modules/fs-extra": { 1938 | "version": "11.3.0", 1939 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", 1940 | "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", 1941 | "dev": true, 1942 | "license": "MIT", 1943 | "dependencies": { 1944 | "graceful-fs": "^4.2.0", 1945 | "jsonfile": "^6.0.1", 1946 | "universalify": "^2.0.0" 1947 | }, 1948 | "engines": { 1949 | "node": ">=14.14" 1950 | } 1951 | }, 1952 | "node_modules/fsevents": { 1953 | "version": "2.3.3", 1954 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1955 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1956 | "dev": true, 1957 | "hasInstallScript": true, 1958 | "license": "MIT", 1959 | "optional": true, 1960 | "os": [ 1961 | "darwin" 1962 | ], 1963 | "engines": { 1964 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1965 | } 1966 | }, 1967 | "node_modules/function-bind": { 1968 | "version": "1.1.2", 1969 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1970 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1971 | "license": "MIT", 1972 | "funding": { 1973 | "url": "https://github.com/sponsors/ljharb" 1974 | } 1975 | }, 1976 | "node_modules/get-intrinsic": { 1977 | "version": "1.3.0", 1978 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 1979 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 1980 | "license": "MIT", 1981 | "dependencies": { 1982 | "call-bind-apply-helpers": "^1.0.2", 1983 | "es-define-property": "^1.0.1", 1984 | "es-errors": "^1.3.0", 1985 | "es-object-atoms": "^1.1.1", 1986 | "function-bind": "^1.1.2", 1987 | "get-proto": "^1.0.1", 1988 | "gopd": "^1.2.0", 1989 | "has-symbols": "^1.1.0", 1990 | "hasown": "^2.0.2", 1991 | "math-intrinsics": "^1.1.0" 1992 | }, 1993 | "engines": { 1994 | "node": ">= 0.4" 1995 | }, 1996 | "funding": { 1997 | "url": "https://github.com/sponsors/ljharb" 1998 | } 1999 | }, 2000 | "node_modules/get-proto": { 2001 | "version": "1.0.1", 2002 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 2003 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 2004 | "license": "MIT", 2005 | "dependencies": { 2006 | "dunder-proto": "^1.0.1", 2007 | "es-object-atoms": "^1.0.0" 2008 | }, 2009 | "engines": { 2010 | "node": ">= 0.4" 2011 | } 2012 | }, 2013 | "node_modules/get-source": { 2014 | "version": "2.0.12", 2015 | "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", 2016 | "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", 2017 | "dev": true, 2018 | "license": "Unlicense", 2019 | "dependencies": { 2020 | "data-uri-to-buffer": "^2.0.0", 2021 | "source-map": "^0.6.1" 2022 | } 2023 | }, 2024 | "node_modules/get-tsconfig": { 2025 | "version": "4.10.0", 2026 | "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", 2027 | "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", 2028 | "dev": true, 2029 | "license": "MIT", 2030 | "dependencies": { 2031 | "resolve-pkg-maps": "^1.0.0" 2032 | }, 2033 | "funding": { 2034 | "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 2035 | } 2036 | }, 2037 | "node_modules/glob-parent": { 2038 | "version": "5.1.2", 2039 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2040 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2041 | "dev": true, 2042 | "license": "ISC", 2043 | "dependencies": { 2044 | "is-glob": "^4.0.1" 2045 | }, 2046 | "engines": { 2047 | "node": ">= 6" 2048 | } 2049 | }, 2050 | "node_modules/glob-to-regexp": { 2051 | "version": "0.4.1", 2052 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 2053 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 2054 | "dev": true, 2055 | "license": "BSD-2-Clause" 2056 | }, 2057 | "node_modules/gopd": { 2058 | "version": "1.2.0", 2059 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 2060 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 2061 | "license": "MIT", 2062 | "engines": { 2063 | "node": ">= 0.4" 2064 | }, 2065 | "funding": { 2066 | "url": "https://github.com/sponsors/ljharb" 2067 | } 2068 | }, 2069 | "node_modules/graceful-fs": { 2070 | "version": "4.2.11", 2071 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 2072 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 2073 | "dev": true, 2074 | "license": "ISC" 2075 | }, 2076 | "node_modules/has-symbols": { 2077 | "version": "1.1.0", 2078 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 2079 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 2080 | "license": "MIT", 2081 | "engines": { 2082 | "node": ">= 0.4" 2083 | }, 2084 | "funding": { 2085 | "url": "https://github.com/sponsors/ljharb" 2086 | } 2087 | }, 2088 | "node_modules/hasown": { 2089 | "version": "2.0.2", 2090 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 2091 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 2092 | "license": "MIT", 2093 | "dependencies": { 2094 | "function-bind": "^1.1.2" 2095 | }, 2096 | "engines": { 2097 | "node": ">= 0.4" 2098 | } 2099 | }, 2100 | "node_modules/hono": { 2101 | "version": "4.7.7", 2102 | "resolved": "https://registry.npmjs.org/hono/-/hono-4.7.7.tgz", 2103 | "integrity": "sha512-2PCpQRbN87Crty8/L/7akZN3UyZIAopSoRxCwRbJgUuV1+MHNFHzYFxZTg4v/03cXUm+jce/qa2VSBZpKBm3Qw==", 2104 | "license": "MIT", 2105 | "engines": { 2106 | "node": ">=16.9.0" 2107 | } 2108 | }, 2109 | "node_modules/http-errors": { 2110 | "version": "2.0.0", 2111 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 2112 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 2113 | "license": "MIT", 2114 | "dependencies": { 2115 | "depd": "2.0.0", 2116 | "inherits": "2.0.4", 2117 | "setprototypeof": "1.2.0", 2118 | "statuses": "2.0.1", 2119 | "toidentifier": "1.0.1" 2120 | }, 2121 | "engines": { 2122 | "node": ">= 0.8" 2123 | } 2124 | }, 2125 | "node_modules/iconv-lite": { 2126 | "version": "0.6.3", 2127 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 2128 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 2129 | "license": "MIT", 2130 | "dependencies": { 2131 | "safer-buffer": ">= 2.1.2 < 3.0.0" 2132 | }, 2133 | "engines": { 2134 | "node": ">=0.10.0" 2135 | } 2136 | }, 2137 | "node_modules/inherits": { 2138 | "version": "2.0.4", 2139 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2140 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2141 | "license": "ISC" 2142 | }, 2143 | "node_modules/ipaddr.js": { 2144 | "version": "1.9.1", 2145 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 2146 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 2147 | "license": "MIT", 2148 | "engines": { 2149 | "node": ">= 0.10" 2150 | } 2151 | }, 2152 | "node_modules/is-arrayish": { 2153 | "version": "0.3.2", 2154 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 2155 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", 2156 | "dev": true, 2157 | "license": "MIT", 2158 | "optional": true 2159 | }, 2160 | "node_modules/is-extglob": { 2161 | "version": "2.1.1", 2162 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2163 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2164 | "dev": true, 2165 | "license": "MIT", 2166 | "engines": { 2167 | "node": ">=0.10.0" 2168 | } 2169 | }, 2170 | "node_modules/is-glob": { 2171 | "version": "4.0.3", 2172 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2173 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2174 | "dev": true, 2175 | "license": "MIT", 2176 | "dependencies": { 2177 | "is-extglob": "^2.1.1" 2178 | }, 2179 | "engines": { 2180 | "node": ">=0.10.0" 2181 | } 2182 | }, 2183 | "node_modules/is-number": { 2184 | "version": "7.0.0", 2185 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2186 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2187 | "dev": true, 2188 | "license": "MIT", 2189 | "engines": { 2190 | "node": ">=0.12.0" 2191 | } 2192 | }, 2193 | "node_modules/is-promise": { 2194 | "version": "4.0.0", 2195 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", 2196 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", 2197 | "license": "MIT" 2198 | }, 2199 | "node_modules/isexe": { 2200 | "version": "2.0.0", 2201 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2202 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2203 | "license": "ISC" 2204 | }, 2205 | "node_modules/js2xmlparser": { 2206 | "version": "4.0.2", 2207 | "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", 2208 | "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", 2209 | "dev": true, 2210 | "license": "Apache-2.0", 2211 | "dependencies": { 2212 | "xmlcreate": "^2.0.4" 2213 | } 2214 | }, 2215 | "node_modules/jsdoc": { 2216 | "version": "4.0.4", 2217 | "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz", 2218 | "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==", 2219 | "dev": true, 2220 | "license": "Apache-2.0", 2221 | "dependencies": { 2222 | "@babel/parser": "^7.20.15", 2223 | "@jsdoc/salty": "^0.2.1", 2224 | "@types/markdown-it": "^14.1.1", 2225 | "bluebird": "^3.7.2", 2226 | "catharsis": "^0.9.0", 2227 | "escape-string-regexp": "^2.0.0", 2228 | "js2xmlparser": "^4.0.2", 2229 | "klaw": "^3.0.0", 2230 | "markdown-it": "^14.1.0", 2231 | "markdown-it-anchor": "^8.6.7", 2232 | "marked": "^4.0.10", 2233 | "mkdirp": "^1.0.4", 2234 | "requizzle": "^0.2.3", 2235 | "strip-json-comments": "^3.1.0", 2236 | "underscore": "~1.13.2" 2237 | }, 2238 | "bin": { 2239 | "jsdoc": "jsdoc.js" 2240 | }, 2241 | "engines": { 2242 | "node": ">=12.0.0" 2243 | } 2244 | }, 2245 | "node_modules/jsdoc-api": { 2246 | "version": "9.3.4", 2247 | "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-9.3.4.tgz", 2248 | "integrity": "sha512-di8lggLACEttpyAZ6WjKKafUP4wC4prAGjt40nMl7quDpp2nD7GmLt6/WxhRu9Q6IYoAAySsNeidBXYVAMwlqg==", 2249 | "dev": true, 2250 | "license": "MIT", 2251 | "dependencies": { 2252 | "array-back": "^6.2.2", 2253 | "cache-point": "^3.0.0", 2254 | "current-module-paths": "^1.1.2", 2255 | "file-set": "^5.2.2", 2256 | "jsdoc": "^4.0.4", 2257 | "object-to-spawn-args": "^2.0.1", 2258 | "walk-back": "^5.1.1" 2259 | }, 2260 | "engines": { 2261 | "node": ">=12.17" 2262 | }, 2263 | "peerDependencies": { 2264 | "@75lb/nature": "latest" 2265 | }, 2266 | "peerDependenciesMeta": { 2267 | "@75lb/nature": { 2268 | "optional": true 2269 | } 2270 | } 2271 | }, 2272 | "node_modules/jsdoc/node_modules/marked": { 2273 | "version": "4.3.0", 2274 | "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", 2275 | "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", 2276 | "dev": true, 2277 | "license": "MIT", 2278 | "bin": { 2279 | "marked": "bin/marked.js" 2280 | }, 2281 | "engines": { 2282 | "node": ">= 12" 2283 | } 2284 | }, 2285 | "node_modules/jsonfile": { 2286 | "version": "6.1.0", 2287 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 2288 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 2289 | "dev": true, 2290 | "license": "MIT", 2291 | "dependencies": { 2292 | "universalify": "^2.0.0" 2293 | }, 2294 | "optionalDependencies": { 2295 | "graceful-fs": "^4.1.6" 2296 | } 2297 | }, 2298 | "node_modules/just-filter-object": { 2299 | "version": "3.2.0", 2300 | "resolved": "https://registry.npmjs.org/just-filter-object/-/just-filter-object-3.2.0.tgz", 2301 | "integrity": "sha512-OeorYJxmp2zhy/0LxjS1UjbJ7XMY8M4gVa1RRKxnIVheCYmng2E2hE0lEbDGv4aRh/HI7FgNUXtOMnmNxpoXRQ==", 2302 | "dev": true, 2303 | "license": "MIT" 2304 | }, 2305 | "node_modules/just-map-values": { 2306 | "version": "3.2.0", 2307 | "resolved": "https://registry.npmjs.org/just-map-values/-/just-map-values-3.2.0.tgz", 2308 | "integrity": "sha512-TyqCKtK3NxiUgOjRYMIKURvBTHesi3XzomDY0QVPZ3rYzLCF+nNq5rSi0B/L5aOd/WMTZo6ukzA4wih4HUbrDg==", 2309 | "dev": true, 2310 | "license": "MIT" 2311 | }, 2312 | "node_modules/klaw": { 2313 | "version": "3.0.0", 2314 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", 2315 | "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", 2316 | "dev": true, 2317 | "license": "MIT", 2318 | "dependencies": { 2319 | "graceful-fs": "^4.1.9" 2320 | } 2321 | }, 2322 | "node_modules/linkify-it": { 2323 | "version": "5.0.0", 2324 | "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", 2325 | "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", 2326 | "dev": true, 2327 | "license": "MIT", 2328 | "dependencies": { 2329 | "uc.micro": "^2.0.0" 2330 | } 2331 | }, 2332 | "node_modules/lodash": { 2333 | "version": "4.17.21", 2334 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2335 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2336 | "dev": true, 2337 | "license": "MIT" 2338 | }, 2339 | "node_modules/markdown-it": { 2340 | "version": "14.1.0", 2341 | "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", 2342 | "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", 2343 | "dev": true, 2344 | "license": "MIT", 2345 | "dependencies": { 2346 | "argparse": "^2.0.1", 2347 | "entities": "^4.4.0", 2348 | "linkify-it": "^5.0.0", 2349 | "mdurl": "^2.0.0", 2350 | "punycode.js": "^2.3.1", 2351 | "uc.micro": "^2.1.0" 2352 | }, 2353 | "bin": { 2354 | "markdown-it": "bin/markdown-it.mjs" 2355 | } 2356 | }, 2357 | "node_modules/markdown-it-anchor": { 2358 | "version": "8.6.7", 2359 | "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", 2360 | "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", 2361 | "dev": true, 2362 | "license": "Unlicense", 2363 | "peerDependencies": { 2364 | "@types/markdown-it": "*", 2365 | "markdown-it": "*" 2366 | } 2367 | }, 2368 | "node_modules/marked": { 2369 | "version": "15.0.8", 2370 | "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.8.tgz", 2371 | "integrity": "sha512-rli4l2LyZqpQuRve5C0rkn6pj3hT8EWPC+zkAxFTAJLxRbENfTAhEQq9itrmf1Y81QtAX5D/MYlGlIomNgj9lA==", 2372 | "dev": true, 2373 | "license": "MIT", 2374 | "bin": { 2375 | "marked": "bin/marked.js" 2376 | }, 2377 | "engines": { 2378 | "node": ">= 18" 2379 | } 2380 | }, 2381 | "node_modules/math-intrinsics": { 2382 | "version": "1.1.0", 2383 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 2384 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 2385 | "license": "MIT", 2386 | "engines": { 2387 | "node": ">= 0.4" 2388 | } 2389 | }, 2390 | "node_modules/mdurl": { 2391 | "version": "2.0.0", 2392 | "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", 2393 | "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", 2394 | "dev": true, 2395 | "license": "MIT" 2396 | }, 2397 | "node_modules/media-typer": { 2398 | "version": "1.1.0", 2399 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 2400 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 2401 | "license": "MIT", 2402 | "engines": { 2403 | "node": ">= 0.8" 2404 | } 2405 | }, 2406 | "node_modules/merge-descriptors": { 2407 | "version": "2.0.0", 2408 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", 2409 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", 2410 | "license": "MIT", 2411 | "engines": { 2412 | "node": ">=18" 2413 | }, 2414 | "funding": { 2415 | "url": "https://github.com/sponsors/sindresorhus" 2416 | } 2417 | }, 2418 | "node_modules/merge2": { 2419 | "version": "1.4.1", 2420 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2421 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2422 | "dev": true, 2423 | "license": "MIT", 2424 | "engines": { 2425 | "node": ">= 8" 2426 | } 2427 | }, 2428 | "node_modules/micromatch": { 2429 | "version": "4.0.8", 2430 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 2431 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 2432 | "dev": true, 2433 | "license": "MIT", 2434 | "dependencies": { 2435 | "braces": "^3.0.3", 2436 | "picomatch": "^2.3.1" 2437 | }, 2438 | "engines": { 2439 | "node": ">=8.6" 2440 | } 2441 | }, 2442 | "node_modules/mime": { 2443 | "version": "3.0.0", 2444 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 2445 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 2446 | "dev": true, 2447 | "license": "MIT", 2448 | "bin": { 2449 | "mime": "cli.js" 2450 | }, 2451 | "engines": { 2452 | "node": ">=10.0.0" 2453 | } 2454 | }, 2455 | "node_modules/mime-db": { 2456 | "version": "1.54.0", 2457 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", 2458 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", 2459 | "license": "MIT", 2460 | "engines": { 2461 | "node": ">= 0.6" 2462 | } 2463 | }, 2464 | "node_modules/mime-types": { 2465 | "version": "3.0.1", 2466 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", 2467 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", 2468 | "license": "MIT", 2469 | "dependencies": { 2470 | "mime-db": "^1.54.0" 2471 | }, 2472 | "engines": { 2473 | "node": ">= 0.6" 2474 | } 2475 | }, 2476 | "node_modules/miniflare": { 2477 | "version": "4.20250416.0", 2478 | "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250416.0.tgz", 2479 | "integrity": "sha512-261PhPgD9zs5/BTdbWqwiaXtWxb+Av5zKCwTU+HXrA5E4tf3qnULwh3u6SVUOAEArEroFuKJzawsQ9COtNBurQ==", 2480 | "dev": true, 2481 | "license": "MIT", 2482 | "dependencies": { 2483 | "@cspotcode/source-map-support": "0.8.1", 2484 | "acorn": "8.14.0", 2485 | "acorn-walk": "8.3.2", 2486 | "exit-hook": "2.2.1", 2487 | "glob-to-regexp": "0.4.1", 2488 | "stoppable": "1.1.0", 2489 | "undici": "^5.28.5", 2490 | "workerd": "1.20250416.0", 2491 | "ws": "8.18.0", 2492 | "youch": "3.3.4", 2493 | "zod": "3.22.3" 2494 | }, 2495 | "bin": { 2496 | "miniflare": "bootstrap.js" 2497 | }, 2498 | "engines": { 2499 | "node": ">=18.0.0" 2500 | } 2501 | }, 2502 | "node_modules/miniflare/node_modules/zod": { 2503 | "version": "3.22.3", 2504 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", 2505 | "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", 2506 | "dev": true, 2507 | "license": "MIT", 2508 | "funding": { 2509 | "url": "https://github.com/sponsors/colinhacks" 2510 | } 2511 | }, 2512 | "node_modules/mkdirp": { 2513 | "version": "1.0.4", 2514 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 2515 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 2516 | "dev": true, 2517 | "license": "MIT", 2518 | "bin": { 2519 | "mkdirp": "bin/cmd.js" 2520 | }, 2521 | "engines": { 2522 | "node": ">=10" 2523 | } 2524 | }, 2525 | "node_modules/ms": { 2526 | "version": "2.1.3", 2527 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2528 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2529 | "license": "MIT" 2530 | }, 2531 | "node_modules/mustache": { 2532 | "version": "4.2.0", 2533 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", 2534 | "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", 2535 | "dev": true, 2536 | "license": "MIT", 2537 | "bin": { 2538 | "mustache": "bin/mustache" 2539 | } 2540 | }, 2541 | "node_modules/nanoid": { 2542 | "version": "5.1.5", 2543 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", 2544 | "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", 2545 | "funding": [ 2546 | { 2547 | "type": "github", 2548 | "url": "https://github.com/sponsors/ai" 2549 | } 2550 | ], 2551 | "license": "MIT", 2552 | "bin": { 2553 | "nanoid": "bin/nanoid.js" 2554 | }, 2555 | "engines": { 2556 | "node": "^18 || >=20" 2557 | } 2558 | }, 2559 | "node_modules/negotiator": { 2560 | "version": "1.0.0", 2561 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 2562 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 2563 | "license": "MIT", 2564 | "engines": { 2565 | "node": ">= 0.6" 2566 | } 2567 | }, 2568 | "node_modules/npm-path": { 2569 | "version": "2.0.4", 2570 | "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", 2571 | "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", 2572 | "dev": true, 2573 | "license": "MIT", 2574 | "dependencies": { 2575 | "which": "^1.2.10" 2576 | }, 2577 | "bin": { 2578 | "npm-path": "bin/npm-path" 2579 | }, 2580 | "engines": { 2581 | "node": ">=0.8" 2582 | } 2583 | }, 2584 | "node_modules/npm-path/node_modules/which": { 2585 | "version": "1.3.1", 2586 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2587 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2588 | "dev": true, 2589 | "license": "ISC", 2590 | "dependencies": { 2591 | "isexe": "^2.0.0" 2592 | }, 2593 | "bin": { 2594 | "which": "bin/which" 2595 | } 2596 | }, 2597 | "node_modules/npm-which": { 2598 | "version": "3.0.1", 2599 | "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", 2600 | "integrity": "sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A==", 2601 | "dev": true, 2602 | "license": "MIT", 2603 | "dependencies": { 2604 | "commander": "^2.9.0", 2605 | "npm-path": "^2.0.2", 2606 | "which": "^1.2.10" 2607 | }, 2608 | "bin": { 2609 | "npm-which": "bin/npm-which.js" 2610 | }, 2611 | "engines": { 2612 | "node": ">=4.2.0" 2613 | } 2614 | }, 2615 | "node_modules/npm-which/node_modules/which": { 2616 | "version": "1.3.1", 2617 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2618 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2619 | "dev": true, 2620 | "license": "ISC", 2621 | "dependencies": { 2622 | "isexe": "^2.0.0" 2623 | }, 2624 | "bin": { 2625 | "which": "bin/which" 2626 | } 2627 | }, 2628 | "node_modules/object-assign": { 2629 | "version": "4.1.1", 2630 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2631 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2632 | "license": "MIT", 2633 | "engines": { 2634 | "node": ">=0.10.0" 2635 | } 2636 | }, 2637 | "node_modules/object-inspect": { 2638 | "version": "1.13.4", 2639 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 2640 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 2641 | "license": "MIT", 2642 | "engines": { 2643 | "node": ">= 0.4" 2644 | }, 2645 | "funding": { 2646 | "url": "https://github.com/sponsors/ljharb" 2647 | } 2648 | }, 2649 | "node_modules/object-to-spawn-args": { 2650 | "version": "2.0.1", 2651 | "resolved": "https://registry.npmjs.org/object-to-spawn-args/-/object-to-spawn-args-2.0.1.tgz", 2652 | "integrity": "sha512-6FuKFQ39cOID+BMZ3QaphcC8Y4cw6LXBLyIgPU+OhIYwviJamPAn+4mITapnSBQrejB+NNp+FMskhD8Cq+Ys3w==", 2653 | "dev": true, 2654 | "license": "MIT", 2655 | "engines": { 2656 | "node": ">=8.0.0" 2657 | } 2658 | }, 2659 | "node_modules/ohash": { 2660 | "version": "2.0.11", 2661 | "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", 2662 | "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", 2663 | "dev": true, 2664 | "license": "MIT" 2665 | }, 2666 | "node_modules/on-finished": { 2667 | "version": "2.4.1", 2668 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 2669 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 2670 | "license": "MIT", 2671 | "dependencies": { 2672 | "ee-first": "1.1.1" 2673 | }, 2674 | "engines": { 2675 | "node": ">= 0.8" 2676 | } 2677 | }, 2678 | "node_modules/once": { 2679 | "version": "1.4.0", 2680 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2681 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2682 | "license": "ISC", 2683 | "dependencies": { 2684 | "wrappy": "1" 2685 | } 2686 | }, 2687 | "node_modules/parseurl": { 2688 | "version": "1.3.3", 2689 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2690 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 2691 | "license": "MIT", 2692 | "engines": { 2693 | "node": ">= 0.8" 2694 | } 2695 | }, 2696 | "node_modules/partyserver": { 2697 | "version": "0.0.66", 2698 | "resolved": "https://registry.npmjs.org/partyserver/-/partyserver-0.0.66.tgz", 2699 | "integrity": "sha512-GyC1uy4dvC4zPkwdzHqCkQ1J1CMiI0swIJQ0qqsJh16WNkEo5QHuU3l3ikLO8t+Yq0cRr0qO8++xbr11h+107w==", 2700 | "license": "ISC", 2701 | "dependencies": { 2702 | "nanoid": "^5.1.2" 2703 | }, 2704 | "peerDependencies": { 2705 | "@cloudflare/workers-types": "^4.20240729.0" 2706 | } 2707 | }, 2708 | "node_modules/partysocket": { 2709 | "version": "1.1.3", 2710 | "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-1.1.3.tgz", 2711 | "integrity": "sha512-87Jd/nqPoWnVfzHE6Z12WLWTJ+TAgxs0b7i2S163HfQSrVDUK5tW/FC64T5N8L5ss+gqF+EV0BwjZMWggMY3UA==", 2712 | "license": "ISC", 2713 | "dependencies": { 2714 | "event-target-polyfill": "^0.0.4" 2715 | } 2716 | }, 2717 | "node_modules/path-key": { 2718 | "version": "3.1.1", 2719 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2720 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2721 | "license": "MIT", 2722 | "engines": { 2723 | "node": ">=8" 2724 | } 2725 | }, 2726 | "node_modules/path-to-regexp": { 2727 | "version": "8.2.0", 2728 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", 2729 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", 2730 | "license": "MIT", 2731 | "engines": { 2732 | "node": ">=16" 2733 | } 2734 | }, 2735 | "node_modules/pathe": { 2736 | "version": "2.0.3", 2737 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 2738 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 2739 | "dev": true, 2740 | "license": "MIT" 2741 | }, 2742 | "node_modules/picocolors": { 2743 | "version": "1.1.1", 2744 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2745 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2746 | "dev": true, 2747 | "license": "ISC" 2748 | }, 2749 | "node_modules/picomatch": { 2750 | "version": "2.3.1", 2751 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2752 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2753 | "dev": true, 2754 | "license": "MIT", 2755 | "engines": { 2756 | "node": ">=8.6" 2757 | }, 2758 | "funding": { 2759 | "url": "https://github.com/sponsors/jonschlinkert" 2760 | } 2761 | }, 2762 | "node_modules/pkce-challenge": { 2763 | "version": "5.0.0", 2764 | "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", 2765 | "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", 2766 | "license": "MIT", 2767 | "engines": { 2768 | "node": ">=16.20.0" 2769 | } 2770 | }, 2771 | "node_modules/printable-characters": { 2772 | "version": "1.0.42", 2773 | "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", 2774 | "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", 2775 | "dev": true, 2776 | "license": "Unlicense" 2777 | }, 2778 | "node_modules/proxy-addr": { 2779 | "version": "2.0.7", 2780 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 2781 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 2782 | "license": "MIT", 2783 | "dependencies": { 2784 | "forwarded": "0.2.0", 2785 | "ipaddr.js": "1.9.1" 2786 | }, 2787 | "engines": { 2788 | "node": ">= 0.10" 2789 | } 2790 | }, 2791 | "node_modules/punycode.js": { 2792 | "version": "2.3.1", 2793 | "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", 2794 | "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", 2795 | "dev": true, 2796 | "license": "MIT", 2797 | "engines": { 2798 | "node": ">=6" 2799 | } 2800 | }, 2801 | "node_modules/qs": { 2802 | "version": "6.14.0", 2803 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", 2804 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 2805 | "license": "BSD-3-Clause", 2806 | "dependencies": { 2807 | "side-channel": "^1.1.0" 2808 | }, 2809 | "engines": { 2810 | "node": ">=0.6" 2811 | }, 2812 | "funding": { 2813 | "url": "https://github.com/sponsors/ljharb" 2814 | } 2815 | }, 2816 | "node_modules/queue-microtask": { 2817 | "version": "1.2.3", 2818 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2819 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2820 | "dev": true, 2821 | "funding": [ 2822 | { 2823 | "type": "github", 2824 | "url": "https://github.com/sponsors/feross" 2825 | }, 2826 | { 2827 | "type": "patreon", 2828 | "url": "https://www.patreon.com/feross" 2829 | }, 2830 | { 2831 | "type": "consulting", 2832 | "url": "https://feross.org/support" 2833 | } 2834 | ], 2835 | "license": "MIT" 2836 | }, 2837 | "node_modules/range-parser": { 2838 | "version": "1.2.1", 2839 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2840 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 2841 | "license": "MIT", 2842 | "engines": { 2843 | "node": ">= 0.6" 2844 | } 2845 | }, 2846 | "node_modules/raw-body": { 2847 | "version": "3.0.0", 2848 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", 2849 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", 2850 | "license": "MIT", 2851 | "dependencies": { 2852 | "bytes": "3.1.2", 2853 | "http-errors": "2.0.0", 2854 | "iconv-lite": "0.6.3", 2855 | "unpipe": "1.0.0" 2856 | }, 2857 | "engines": { 2858 | "node": ">= 0.8" 2859 | } 2860 | }, 2861 | "node_modules/requizzle": { 2862 | "version": "0.2.4", 2863 | "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", 2864 | "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", 2865 | "dev": true, 2866 | "license": "MIT", 2867 | "dependencies": { 2868 | "lodash": "^4.17.21" 2869 | } 2870 | }, 2871 | "node_modules/resolve-pkg-maps": { 2872 | "version": "1.0.0", 2873 | "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", 2874 | "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", 2875 | "dev": true, 2876 | "license": "MIT", 2877 | "funding": { 2878 | "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" 2879 | } 2880 | }, 2881 | "node_modules/reusify": { 2882 | "version": "1.1.0", 2883 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 2884 | "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 2885 | "dev": true, 2886 | "license": "MIT", 2887 | "engines": { 2888 | "iojs": ">=1.0.0", 2889 | "node": ">=0.10.0" 2890 | } 2891 | }, 2892 | "node_modules/router": { 2893 | "version": "2.2.0", 2894 | "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", 2895 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", 2896 | "license": "MIT", 2897 | "dependencies": { 2898 | "debug": "^4.4.0", 2899 | "depd": "^2.0.0", 2900 | "is-promise": "^4.0.0", 2901 | "parseurl": "^1.3.3", 2902 | "path-to-regexp": "^8.0.0" 2903 | }, 2904 | "engines": { 2905 | "node": ">= 18" 2906 | } 2907 | }, 2908 | "node_modules/run-parallel": { 2909 | "version": "1.2.0", 2910 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2911 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2912 | "dev": true, 2913 | "funding": [ 2914 | { 2915 | "type": "github", 2916 | "url": "https://github.com/sponsors/feross" 2917 | }, 2918 | { 2919 | "type": "patreon", 2920 | "url": "https://www.patreon.com/feross" 2921 | }, 2922 | { 2923 | "type": "consulting", 2924 | "url": "https://feross.org/support" 2925 | } 2926 | ], 2927 | "license": "MIT", 2928 | "dependencies": { 2929 | "queue-microtask": "^1.2.2" 2930 | } 2931 | }, 2932 | "node_modules/safe-buffer": { 2933 | "version": "5.2.1", 2934 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2935 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2936 | "funding": [ 2937 | { 2938 | "type": "github", 2939 | "url": "https://github.com/sponsors/feross" 2940 | }, 2941 | { 2942 | "type": "patreon", 2943 | "url": "https://www.patreon.com/feross" 2944 | }, 2945 | { 2946 | "type": "consulting", 2947 | "url": "https://feross.org/support" 2948 | } 2949 | ], 2950 | "license": "MIT" 2951 | }, 2952 | "node_modules/safer-buffer": { 2953 | "version": "2.1.2", 2954 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2955 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2956 | "license": "MIT" 2957 | }, 2958 | "node_modules/semver": { 2959 | "version": "7.7.1", 2960 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 2961 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 2962 | "dev": true, 2963 | "license": "ISC", 2964 | "optional": true, 2965 | "bin": { 2966 | "semver": "bin/semver.js" 2967 | }, 2968 | "engines": { 2969 | "node": ">=10" 2970 | } 2971 | }, 2972 | "node_modules/send": { 2973 | "version": "1.2.0", 2974 | "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", 2975 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", 2976 | "license": "MIT", 2977 | "dependencies": { 2978 | "debug": "^4.3.5", 2979 | "encodeurl": "^2.0.0", 2980 | "escape-html": "^1.0.3", 2981 | "etag": "^1.8.1", 2982 | "fresh": "^2.0.0", 2983 | "http-errors": "^2.0.0", 2984 | "mime-types": "^3.0.1", 2985 | "ms": "^2.1.3", 2986 | "on-finished": "^2.4.1", 2987 | "range-parser": "^1.2.1", 2988 | "statuses": "^2.0.1" 2989 | }, 2990 | "engines": { 2991 | "node": ">= 18" 2992 | } 2993 | }, 2994 | "node_modules/serve-static": { 2995 | "version": "2.2.0", 2996 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", 2997 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", 2998 | "license": "MIT", 2999 | "dependencies": { 3000 | "encodeurl": "^2.0.0", 3001 | "escape-html": "^1.0.3", 3002 | "parseurl": "^1.3.3", 3003 | "send": "^1.2.0" 3004 | }, 3005 | "engines": { 3006 | "node": ">= 18" 3007 | } 3008 | }, 3009 | "node_modules/setprototypeof": { 3010 | "version": "1.2.0", 3011 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 3012 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 3013 | "license": "ISC" 3014 | }, 3015 | "node_modules/sharp": { 3016 | "version": "0.33.5", 3017 | "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", 3018 | "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", 3019 | "dev": true, 3020 | "hasInstallScript": true, 3021 | "license": "Apache-2.0", 3022 | "optional": true, 3023 | "dependencies": { 3024 | "color": "^4.2.3", 3025 | "detect-libc": "^2.0.3", 3026 | "semver": "^7.6.3" 3027 | }, 3028 | "engines": { 3029 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 3030 | }, 3031 | "funding": { 3032 | "url": "https://opencollective.com/libvips" 3033 | }, 3034 | "optionalDependencies": { 3035 | "@img/sharp-darwin-arm64": "0.33.5", 3036 | "@img/sharp-darwin-x64": "0.33.5", 3037 | "@img/sharp-libvips-darwin-arm64": "1.0.4", 3038 | "@img/sharp-libvips-darwin-x64": "1.0.4", 3039 | "@img/sharp-libvips-linux-arm": "1.0.5", 3040 | "@img/sharp-libvips-linux-arm64": "1.0.4", 3041 | "@img/sharp-libvips-linux-s390x": "1.0.4", 3042 | "@img/sharp-libvips-linux-x64": "1.0.4", 3043 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", 3044 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4", 3045 | "@img/sharp-linux-arm": "0.33.5", 3046 | "@img/sharp-linux-arm64": "0.33.5", 3047 | "@img/sharp-linux-s390x": "0.33.5", 3048 | "@img/sharp-linux-x64": "0.33.5", 3049 | "@img/sharp-linuxmusl-arm64": "0.33.5", 3050 | "@img/sharp-linuxmusl-x64": "0.33.5", 3051 | "@img/sharp-wasm32": "0.33.5", 3052 | "@img/sharp-win32-ia32": "0.33.5", 3053 | "@img/sharp-win32-x64": "0.33.5" 3054 | } 3055 | }, 3056 | "node_modules/shebang-command": { 3057 | "version": "2.0.0", 3058 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3059 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3060 | "license": "MIT", 3061 | "dependencies": { 3062 | "shebang-regex": "^3.0.0" 3063 | }, 3064 | "engines": { 3065 | "node": ">=8" 3066 | } 3067 | }, 3068 | "node_modules/shebang-regex": { 3069 | "version": "3.0.0", 3070 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3071 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3072 | "license": "MIT", 3073 | "engines": { 3074 | "node": ">=8" 3075 | } 3076 | }, 3077 | "node_modules/side-channel": { 3078 | "version": "1.1.0", 3079 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 3080 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 3081 | "license": "MIT", 3082 | "dependencies": { 3083 | "es-errors": "^1.3.0", 3084 | "object-inspect": "^1.13.3", 3085 | "side-channel-list": "^1.0.0", 3086 | "side-channel-map": "^1.0.1", 3087 | "side-channel-weakmap": "^1.0.2" 3088 | }, 3089 | "engines": { 3090 | "node": ">= 0.4" 3091 | }, 3092 | "funding": { 3093 | "url": "https://github.com/sponsors/ljharb" 3094 | } 3095 | }, 3096 | "node_modules/side-channel-list": { 3097 | "version": "1.0.0", 3098 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 3099 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 3100 | "license": "MIT", 3101 | "dependencies": { 3102 | "es-errors": "^1.3.0", 3103 | "object-inspect": "^1.13.3" 3104 | }, 3105 | "engines": { 3106 | "node": ">= 0.4" 3107 | }, 3108 | "funding": { 3109 | "url": "https://github.com/sponsors/ljharb" 3110 | } 3111 | }, 3112 | "node_modules/side-channel-map": { 3113 | "version": "1.0.1", 3114 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 3115 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 3116 | "license": "MIT", 3117 | "dependencies": { 3118 | "call-bound": "^1.0.2", 3119 | "es-errors": "^1.3.0", 3120 | "get-intrinsic": "^1.2.5", 3121 | "object-inspect": "^1.13.3" 3122 | }, 3123 | "engines": { 3124 | "node": ">= 0.4" 3125 | }, 3126 | "funding": { 3127 | "url": "https://github.com/sponsors/ljharb" 3128 | } 3129 | }, 3130 | "node_modules/side-channel-weakmap": { 3131 | "version": "1.0.2", 3132 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 3133 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 3134 | "license": "MIT", 3135 | "dependencies": { 3136 | "call-bound": "^1.0.2", 3137 | "es-errors": "^1.3.0", 3138 | "get-intrinsic": "^1.2.5", 3139 | "object-inspect": "^1.13.3", 3140 | "side-channel-map": "^1.0.1" 3141 | }, 3142 | "engines": { 3143 | "node": ">= 0.4" 3144 | }, 3145 | "funding": { 3146 | "url": "https://github.com/sponsors/ljharb" 3147 | } 3148 | }, 3149 | "node_modules/simple-swizzle": { 3150 | "version": "0.2.2", 3151 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 3152 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 3153 | "dev": true, 3154 | "license": "MIT", 3155 | "optional": true, 3156 | "dependencies": { 3157 | "is-arrayish": "^0.3.1" 3158 | } 3159 | }, 3160 | "node_modules/sisteransi": { 3161 | "version": "1.0.5", 3162 | "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 3163 | "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", 3164 | "dev": true, 3165 | "license": "MIT" 3166 | }, 3167 | "node_modules/source-map": { 3168 | "version": "0.6.1", 3169 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3170 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3171 | "dev": true, 3172 | "license": "BSD-3-Clause", 3173 | "engines": { 3174 | "node": ">=0.10.0" 3175 | } 3176 | }, 3177 | "node_modules/stacktracey": { 3178 | "version": "2.1.8", 3179 | "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", 3180 | "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", 3181 | "dev": true, 3182 | "license": "Unlicense", 3183 | "dependencies": { 3184 | "as-table": "^1.0.36", 3185 | "get-source": "^2.0.12" 3186 | } 3187 | }, 3188 | "node_modules/statuses": { 3189 | "version": "2.0.1", 3190 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 3191 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 3192 | "license": "MIT", 3193 | "engines": { 3194 | "node": ">= 0.8" 3195 | } 3196 | }, 3197 | "node_modules/stoppable": { 3198 | "version": "1.1.0", 3199 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 3200 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", 3201 | "dev": true, 3202 | "license": "MIT", 3203 | "engines": { 3204 | "node": ">=4", 3205 | "npm": ">=6" 3206 | } 3207 | }, 3208 | "node_modules/strip-json-comments": { 3209 | "version": "3.1.1", 3210 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3211 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3212 | "dev": true, 3213 | "license": "MIT", 3214 | "engines": { 3215 | "node": ">=8" 3216 | }, 3217 | "funding": { 3218 | "url": "https://github.com/sponsors/sindresorhus" 3219 | } 3220 | }, 3221 | "node_modules/tmp": { 3222 | "version": "0.2.3", 3223 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", 3224 | "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", 3225 | "dev": true, 3226 | "license": "MIT", 3227 | "engines": { 3228 | "node": ">=14.14" 3229 | } 3230 | }, 3231 | "node_modules/tmp-promise": { 3232 | "version": "3.0.3", 3233 | "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", 3234 | "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", 3235 | "dev": true, 3236 | "license": "MIT", 3237 | "dependencies": { 3238 | "tmp": "^0.2.0" 3239 | } 3240 | }, 3241 | "node_modules/to-regex-range": { 3242 | "version": "5.0.1", 3243 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3244 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3245 | "dev": true, 3246 | "license": "MIT", 3247 | "dependencies": { 3248 | "is-number": "^7.0.0" 3249 | }, 3250 | "engines": { 3251 | "node": ">=8.0" 3252 | } 3253 | }, 3254 | "node_modules/toidentifier": { 3255 | "version": "1.0.1", 3256 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 3257 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 3258 | "license": "MIT", 3259 | "engines": { 3260 | "node": ">=0.6" 3261 | } 3262 | }, 3263 | "node_modules/ts-blank-space": { 3264 | "version": "0.4.4", 3265 | "resolved": "https://registry.npmjs.org/ts-blank-space/-/ts-blank-space-0.4.4.tgz", 3266 | "integrity": "sha512-G6GkD6oEJ7j5gG2e5qAizfE4Ap7JXMpnN0CEp9FEt4LExdaqsdwB90aQsaAwcKhiSxVk5KoqFW9xfxTQ4lBUnQ==", 3267 | "dev": true, 3268 | "license": "Apache-2.0", 3269 | "dependencies": { 3270 | "typescript": "5.1.6 - 5.7.x" 3271 | }, 3272 | "engines": { 3273 | "node": ">=18.0.0" 3274 | } 3275 | }, 3276 | "node_modules/ts-blank-space/node_modules/typescript": { 3277 | "version": "5.7.3", 3278 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", 3279 | "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", 3280 | "dev": true, 3281 | "license": "Apache-2.0", 3282 | "bin": { 3283 | "tsc": "bin/tsc", 3284 | "tsserver": "bin/tsserver" 3285 | }, 3286 | "engines": { 3287 | "node": ">=14.17" 3288 | } 3289 | }, 3290 | "node_modules/tslib": { 3291 | "version": "2.8.1", 3292 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 3293 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 3294 | "dev": true, 3295 | "license": "0BSD", 3296 | "optional": true 3297 | }, 3298 | "node_modules/tsx": { 3299 | "version": "4.19.3", 3300 | "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", 3301 | "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", 3302 | "dev": true, 3303 | "license": "MIT", 3304 | "dependencies": { 3305 | "esbuild": "~0.25.0", 3306 | "get-tsconfig": "^4.7.5" 3307 | }, 3308 | "bin": { 3309 | "tsx": "dist/cli.mjs" 3310 | }, 3311 | "engines": { 3312 | "node": ">=18.0.0" 3313 | }, 3314 | "optionalDependencies": { 3315 | "fsevents": "~2.3.3" 3316 | } 3317 | }, 3318 | "node_modules/type-is": { 3319 | "version": "2.0.1", 3320 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", 3321 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", 3322 | "license": "MIT", 3323 | "dependencies": { 3324 | "content-type": "^1.0.5", 3325 | "media-typer": "^1.1.0", 3326 | "mime-types": "^3.0.0" 3327 | }, 3328 | "engines": { 3329 | "node": ">= 0.6" 3330 | } 3331 | }, 3332 | "node_modules/typescript": { 3333 | "version": "5.8.3", 3334 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 3335 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 3336 | "dev": true, 3337 | "license": "Apache-2.0", 3338 | "bin": { 3339 | "tsc": "bin/tsc", 3340 | "tsserver": "bin/tsserver" 3341 | }, 3342 | "engines": { 3343 | "node": ">=14.17" 3344 | } 3345 | }, 3346 | "node_modules/uc.micro": { 3347 | "version": "2.1.0", 3348 | "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", 3349 | "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", 3350 | "dev": true, 3351 | "license": "MIT" 3352 | }, 3353 | "node_modules/ufo": { 3354 | "version": "1.6.1", 3355 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", 3356 | "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", 3357 | "dev": true, 3358 | "license": "MIT" 3359 | }, 3360 | "node_modules/underscore": { 3361 | "version": "1.13.7", 3362 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", 3363 | "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", 3364 | "dev": true, 3365 | "license": "MIT" 3366 | }, 3367 | "node_modules/undici": { 3368 | "version": "5.29.0", 3369 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", 3370 | "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", 3371 | "dev": true, 3372 | "license": "MIT", 3373 | "dependencies": { 3374 | "@fastify/busboy": "^2.0.0" 3375 | }, 3376 | "engines": { 3377 | "node": ">=14.0" 3378 | } 3379 | }, 3380 | "node_modules/unenv": { 3381 | "version": "2.0.0-rc.15", 3382 | "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.15.tgz", 3383 | "integrity": "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==", 3384 | "dev": true, 3385 | "license": "MIT", 3386 | "dependencies": { 3387 | "defu": "^6.1.4", 3388 | "exsolve": "^1.0.4", 3389 | "ohash": "^2.0.11", 3390 | "pathe": "^2.0.3", 3391 | "ufo": "^1.5.4" 3392 | } 3393 | }, 3394 | "node_modules/universalify": { 3395 | "version": "2.0.1", 3396 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 3397 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 3398 | "dev": true, 3399 | "license": "MIT", 3400 | "engines": { 3401 | "node": ">= 10.0.0" 3402 | } 3403 | }, 3404 | "node_modules/unpipe": { 3405 | "version": "1.0.0", 3406 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3407 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 3408 | "license": "MIT", 3409 | "engines": { 3410 | "node": ">= 0.8" 3411 | } 3412 | }, 3413 | "node_modules/vary": { 3414 | "version": "1.1.2", 3415 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3416 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 3417 | "license": "MIT", 3418 | "engines": { 3419 | "node": ">= 0.8" 3420 | } 3421 | }, 3422 | "node_modules/walk-back": { 3423 | "version": "5.1.1", 3424 | "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.1.tgz", 3425 | "integrity": "sha512-e/FRLDVdZQWFrAzU6Hdvpm7D7m2ina833gIKLptQykRK49mmCYHLHq7UqjPDbxbKLZkTkW1rFqbengdE3sLfdw==", 3426 | "dev": true, 3427 | "license": "MIT", 3428 | "engines": { 3429 | "node": ">=12.17" 3430 | } 3431 | }, 3432 | "node_modules/which": { 3433 | "version": "2.0.2", 3434 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3435 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3436 | "license": "ISC", 3437 | "dependencies": { 3438 | "isexe": "^2.0.0" 3439 | }, 3440 | "bin": { 3441 | "node-which": "bin/node-which" 3442 | }, 3443 | "engines": { 3444 | "node": ">= 8" 3445 | } 3446 | }, 3447 | "node_modules/workerd": { 3448 | "version": "1.20250416.0", 3449 | "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250416.0.tgz", 3450 | "integrity": "sha512-Yrx/bZAKbmSvomdTAzzIpOHwpYhs0ldr2wqed22UEhQ0mIplAHY4xmY+SjAJhP/TydZrciOVzBxwM1+4T40KNA==", 3451 | "dev": true, 3452 | "hasInstallScript": true, 3453 | "license": "Apache-2.0", 3454 | "bin": { 3455 | "workerd": "bin/workerd" 3456 | }, 3457 | "engines": { 3458 | "node": ">=16" 3459 | }, 3460 | "optionalDependencies": { 3461 | "@cloudflare/workerd-darwin-64": "1.20250416.0", 3462 | "@cloudflare/workerd-darwin-arm64": "1.20250416.0", 3463 | "@cloudflare/workerd-linux-64": "1.20250416.0", 3464 | "@cloudflare/workerd-linux-arm64": "1.20250416.0", 3465 | "@cloudflare/workerd-windows-64": "1.20250416.0" 3466 | } 3467 | }, 3468 | "node_modules/workers-mcp": { 3469 | "version": "0.1.0-3", 3470 | "resolved": "https://registry.npmjs.org/workers-mcp/-/workers-mcp-0.1.0-3.tgz", 3471 | "integrity": "sha512-PCgcGZnFvtk0WkbUsA9nDd5qqwv310L7on0/hlJZ9hQZkJMntGf5v3L2X3mLSDs9WSDF6jSedxlvWCtIXrKbEg==", 3472 | "dev": true, 3473 | "license": "Apache-2.0", 3474 | "dependencies": { 3475 | "@clack/prompts": "^0.8.2", 3476 | "@modelcontextprotocol/sdk": "^1.7.0", 3477 | "@silvia-odwyer/photon-node": "^0.3.3", 3478 | "chalk": "^5.3.0", 3479 | "fs-extra": "^11.2.0", 3480 | "hono": "^4.7.4", 3481 | "jsdoc-api": "^9.3.4", 3482 | "just-filter-object": "^3.2.0", 3483 | "just-map-values": "^3.2.0", 3484 | "npm-which": "^3.0.1", 3485 | "tmp-promise": "^3.0.3", 3486 | "ts-blank-space": "^0.4.4", 3487 | "tsx": "^4.19.2" 3488 | }, 3489 | "bin": { 3490 | "workers-mcp": "dist/cli.js" 3491 | }, 3492 | "engines": { 3493 | "node": ">=16.17.0" 3494 | } 3495 | }, 3496 | "node_modules/wrangler": { 3497 | "version": "4.12.0", 3498 | "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.12.0.tgz", 3499 | "integrity": "sha512-4rfAXOi5KqM3ECvOrZJ97k3zEqxVwtdt4bijd8jcRBZ6iJYvEtjgjVi4TsfkVa/eXGhpfHTUnKu2uk8UHa8M2w==", 3500 | "dev": true, 3501 | "license": "MIT OR Apache-2.0", 3502 | "dependencies": { 3503 | "@cloudflare/kv-asset-handler": "0.4.0", 3504 | "@cloudflare/unenv-preset": "2.3.1", 3505 | "blake3-wasm": "2.1.5", 3506 | "esbuild": "0.25.2", 3507 | "miniflare": "4.20250416.0", 3508 | "path-to-regexp": "6.3.0", 3509 | "unenv": "2.0.0-rc.15", 3510 | "workerd": "1.20250416.0" 3511 | }, 3512 | "bin": { 3513 | "wrangler": "bin/wrangler.js", 3514 | "wrangler2": "bin/wrangler.js" 3515 | }, 3516 | "engines": { 3517 | "node": ">=18.0.0" 3518 | }, 3519 | "optionalDependencies": { 3520 | "fsevents": "~2.3.2", 3521 | "sharp": "^0.33.5" 3522 | }, 3523 | "peerDependencies": { 3524 | "@cloudflare/workers-types": "^4.20250415.0" 3525 | }, 3526 | "peerDependenciesMeta": { 3527 | "@cloudflare/workers-types": { 3528 | "optional": true 3529 | } 3530 | } 3531 | }, 3532 | "node_modules/wrangler/node_modules/path-to-regexp": { 3533 | "version": "6.3.0", 3534 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", 3535 | "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", 3536 | "dev": true, 3537 | "license": "MIT" 3538 | }, 3539 | "node_modules/wrappy": { 3540 | "version": "1.0.2", 3541 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3542 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3543 | "license": "ISC" 3544 | }, 3545 | "node_modules/ws": { 3546 | "version": "8.18.0", 3547 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 3548 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 3549 | "dev": true, 3550 | "license": "MIT", 3551 | "engines": { 3552 | "node": ">=10.0.0" 3553 | }, 3554 | "peerDependencies": { 3555 | "bufferutil": "^4.0.1", 3556 | "utf-8-validate": ">=5.0.2" 3557 | }, 3558 | "peerDependenciesMeta": { 3559 | "bufferutil": { 3560 | "optional": true 3561 | }, 3562 | "utf-8-validate": { 3563 | "optional": true 3564 | } 3565 | } 3566 | }, 3567 | "node_modules/xmlcreate": { 3568 | "version": "2.0.4", 3569 | "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", 3570 | "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", 3571 | "dev": true, 3572 | "license": "Apache-2.0" 3573 | }, 3574 | "node_modules/youch": { 3575 | "version": "3.3.4", 3576 | "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz", 3577 | "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", 3578 | "dev": true, 3579 | "license": "MIT", 3580 | "dependencies": { 3581 | "cookie": "^0.7.1", 3582 | "mustache": "^4.2.0", 3583 | "stacktracey": "^2.1.8" 3584 | } 3585 | }, 3586 | "node_modules/zod": { 3587 | "version": "3.24.2", 3588 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", 3589 | "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", 3590 | "license": "MIT", 3591 | "funding": { 3592 | "url": "https://github.com/sponsors/colinhacks" 3593 | } 3594 | }, 3595 | "node_modules/zod-to-json-schema": { 3596 | "version": "3.24.5", 3597 | "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", 3598 | "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", 3599 | "license": "ISC", 3600 | "peerDependencies": { 3601 | "zod": "^3.24.1" 3602 | } 3603 | } 3604 | } 3605 | } 3606 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ai-engineer-wf-2025", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "deploy": "wrangler deploy", 7 | "dev": "wrangler dev", 8 | "format": "biome format --write", 9 | "lint:fix": "biome lint --fix", 10 | "start": "wrangler dev", 11 | "cf-typegen": "wrangler types" 12 | }, 13 | "devDependencies": { 14 | "@cloudflare/workers-types": "^4.20250418.0", 15 | "marked": "^15.0.7", 16 | "typescript": "^5.5.2", 17 | "workers-mcp": "^0.1.0-3", 18 | "wrangler": "^4.12.0" 19 | }, 20 | "dependencies": { 21 | "@cloudflare/workers-oauth-provider": "^0.0.2", 22 | "@modelcontextprotocol/sdk": "^1.7.0", 23 | "agents": "^0.0.53", 24 | "hono": "^4.7.4", 25 | "zod": "^3.24.2" 26 | }, 27 | "license": "MIT" 28 | } -------------------------------------------------------------------------------- /src/app.ts: -------------------------------------------------------------------------------- 1 | import { Hono } from "hono"; 2 | import { 3 | layout, 4 | homeContent, 5 | parseApproveFormBody, 6 | renderAuthorizationRejectedContent, 7 | renderAuthorizationApprovedContent, 8 | renderLoggedInAuthorizeScreen, 9 | renderLoggedOutAuthorizeScreen, 10 | } from "./utils"; 11 | import type { OAuthHelpers } from "@cloudflare/workers-oauth-provider"; 12 | 13 | export type Bindings = Env & { 14 | OAUTH_PROVIDER: OAuthHelpers; 15 | }; 16 | 17 | const app = new Hono<{ 18 | Bindings: Bindings; 19 | }>(); 20 | 21 | // Render a basic homepage placeholder to make sure the app is up 22 | app.get("/", async (c) => { 23 | const content = await homeContent(c.req.raw); 24 | return c.html(layout(content, "MCP Remote Auth Demo - Home")); 25 | }); 26 | 27 | // Render an authorization page 28 | // If the user is logged in, we'll show a form to approve the appropriate scopes 29 | // If the user is not logged in, we'll show a form to both login and approve the scopes 30 | app.get("/authorize", async (c) => { 31 | // We don't have an actual auth system, so to demonstrate both paths, you can 32 | // hard-code whether the user is logged in or not. We'll default to true 33 | // const isLoggedIn = false; 34 | const isLoggedIn = true; 35 | 36 | const oauthReqInfo = await c.env.OAUTH_PROVIDER.parseAuthRequest(c.req.raw); 37 | 38 | const oauthScopes = [ 39 | { 40 | name: "read_profile", 41 | description: "Read your basic profile information", 42 | }, 43 | { name: "read_data", description: "Access your stored data" }, 44 | { name: "write_data", description: "Create and modify your data" }, 45 | ]; 46 | 47 | if (isLoggedIn) { 48 | const content = await renderLoggedInAuthorizeScreen(oauthScopes, oauthReqInfo); 49 | return c.html(layout(content, "MCP Remote Auth Demo - Authorization")); 50 | } 51 | 52 | const content = await renderLoggedOutAuthorizeScreen(oauthScopes, oauthReqInfo); 53 | return c.html(layout(content, "MCP Remote Auth Demo - Authorization")); 54 | }); 55 | 56 | // The /authorize page has a form that will POST to /approve 57 | // This endpoint is responsible for validating any login information and 58 | // then completing the authorization request with the OAUTH_PROVIDER 59 | app.post("/approve", async (c) => { 60 | const { action, oauthReqInfo, email, password } = await parseApproveFormBody( 61 | await c.req.parseBody(), 62 | ); 63 | 64 | if (!oauthReqInfo) { 65 | return c.html("INVALID LOGIN", 401); 66 | } 67 | 68 | // If the user needs to both login and approve, we should validate the login first 69 | if (action === "login_approve") { 70 | // We'll allow any values for email and password for this demo 71 | // but you could validate them here 72 | // Ex: 73 | // if (email !== "user@example.com" || password !== "password") { 74 | // biome-ignore lint/correctness/noConstantCondition: This is a demo 75 | if (false) { 76 | return c.html( 77 | layout( 78 | await renderAuthorizationRejectedContent("/"), 79 | "MCP Remote Auth Demo - Authorization Status", 80 | ), 81 | ); 82 | } 83 | } 84 | 85 | // The user must be successfully logged in and have approved the scopes, so we 86 | // can complete the authorization request 87 | const { redirectTo } = await c.env.OAUTH_PROVIDER.completeAuthorization({ 88 | request: oauthReqInfo, 89 | userId: email, 90 | metadata: { 91 | label: "Test User", 92 | }, 93 | scope: oauthReqInfo.scope, 94 | props: { 95 | userEmail: email, 96 | }, 97 | }); 98 | 99 | return c.html( 100 | layout( 101 | await renderAuthorizationApprovedContent(redirectTo), 102 | "MCP Remote Auth Demo - Authorization Status", 103 | ), 104 | ); 105 | }); 106 | 107 | export default app; 108 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import app from "./app"; 2 | import { McpAgent } from "agents/mcp"; 3 | import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 4 | import { z } from "zod"; 5 | import OAuthProvider from "@cloudflare/workers-oauth-provider"; 6 | 7 | interface Env { 8 | AIEWFSUBMISSIONS: KVNamespace; 9 | SECRETKEY: { 10 | get(): Promise; 11 | }; 12 | } 13 | 14 | const CONFERENCE_INFO = { 15 | title: "AI Engineer World's Fair 2025", 16 | date: "June 3–5, 2025", 17 | location: "San Francisco", 18 | venue: { 19 | name: "Marriott Marquis SF", 20 | address: "780 Mission St, San Francisco, CA 94103", 21 | }, 22 | hotels: [ 23 | { 24 | name: "Marriott Marquis", 25 | rate: "$399/night", 26 | dates: "May 29–Jun 7", 27 | bookingLink: "https://book.passkey.com/go/AIEngineer2025" 28 | }, 29 | { 30 | name: "Beacon Grand", 31 | rate: "$289/night", 32 | groupCode: "0601AEWF", 33 | bookingLink: "https://www.beacongrand.com/" 34 | } 35 | ], 36 | stats: { 37 | attendees: "~3,000", 38 | attendeeTypes: ["Founders", "VPs of AI", "AI Engineers"], 39 | talks: "~150 launches and talks", 40 | workshops: "~100 practical workshops and expo sessions", 41 | exhibitors: "~50 top DevTools and employers" 42 | }, 43 | links: { 44 | tickets: "https://ti.to/software-3/ai-engineer-worlds-fair-2025", 45 | talks: "https://youtube.com/@aidotengineer", 46 | newsletter: "https://ai.engineer/newsletter", 47 | twitter: "https://twitter.com/aiDotEngineer", 48 | youtube: "https://www.youtube.com/@aiengineer", 49 | cfp: "https://sessionize.com/ai-engineer-worlds-fair-2025" 50 | }, 51 | description: "The AI Engineer World's Fair is the largest technical conference for engineers working in AI today. Returning for its third year, this event is where the leading AI labs, founders, VPs of AI, and engineers gather to share what they're building and what's next." 52 | }; 53 | 54 | const TRACKS = [ 55 | "AI Architects", 56 | "/r/localLlama", 57 | "Model Context Protocol (MCP)", 58 | "GraphRAG", 59 | "AI in Action", 60 | "Evals", 61 | "Agent Reliability", 62 | "Reasoning and RL", 63 | "Retrieval, Search, and Recommendation Systems", 64 | "Security", 65 | "Infrastructure", 66 | "Generative Media", 67 | "AI Design & Novel AI UX", 68 | "AI Product Management", 69 | "Autonomy, Robotics, and Embodied Agents", 70 | "Computer-Using Agents (CUA)", 71 | "SWE Agents", 72 | "Vibe Coding", 73 | "Voice", 74 | "Sales/Support Agents", 75 | "The Great AI Debates", 76 | "Anything Else" 77 | ] as const; 78 | 79 | const TRACK_DESCRIPTIONS = { 80 | "AI Architects": "Exclusive track for AI Leadership (CTOs, VPs of AI, and AI Architects at >1000 person enterprises). Topics include hiring and scaling AI Engineer orgs, defining AI strategy, compliance, data partnerships, and build vs buy decisions.", 81 | "/r/localLlama": "Any topic/high ranking posters from /r/localLlama is welcome. Focus on launches of open weights/models, local inference tools, and personal/private/local agents.", 82 | "Model Context Protocol (MCP)": "Talks on hard problems with MCP integration, new clients, stateful/stateless transports, sampling, auth, o11y, service discovery, and hierarchical MCP. Includes A2A protocol discussions.", 83 | "GraphRAG": "Talks on knowledge graphs to enhance retrieval and generation, architectures and tools for building GraphRAG applications, and real-world use cases. Special focus on agent graph memory.", 84 | "AI in Action": "Practical advice on using AI tooling to improve productivity. Focus on power users of Cursor, Windsurf, ChatGPT, Lindy, Notion AI etc. sharing their productivity hacks.", 85 | "Evals": "Overviews of frontier LLM Evals, new benchmarks, and concrete advice on making custom product evals less painful. Both LLM-as-Judge and Human-in-the-loop approaches.", 86 | "Agent Reliability": "Focus on making AI capabilities consistent and reliable. Looking for definitive talks that will shape the industry's reliability thinking in 2025.", 87 | "Reasoning and RL": "Train-time sorcery, finetune fight club, proof-of-thought, and cross-pollination between academic insights and real-world P&L.", 88 | "Retrieval, Search, and Recommendation Systems": "Best RAG talks and LLM-improved RecSys talks. Special focus on notable RAG/RecSys+LLM work from consumer-facing companies.", 89 | "Security": "Red-team tales, privacy & sovereignty, trust layers, and model supply-chain security. Focus on practical security implementations.", 90 | "Infrastructure": "GPU-less futures, sub-50ms inference, fleet orchestration, and LLM OS tools. Both hardware and systems software focus.", 91 | "Generative Media": "Models, products and platforms for generating images, audio, and video. Pipeline craft, creator economy, and ethics & IP discussions.", 92 | "AI Design & Novel AI UX": "New track for designers building AI-powered experiences. Both production AI product development and novel thought-provoking demos welcome.", 93 | "AI Product Management": "Road-mapping AI products, PM ↔ Eng handshake, metric north stars, and the art of GPT wrapping. Focus on practical PM insights.", 94 | "Autonomy, Robotics, and Embodied Agents": "Launches and research on LLMs x Robotics. Focus on practical applications of LLMs/Transformers in the physical world.", 95 | "Computer-Using Agents (CUA)": "Long running Web Search-, Browser- and other Computer-Using Agent launches and architecture breakdowns. Focus on screen vision accuracy and general purpose agents.", 96 | "SWE Agents": "Both Inner Loop and Outer Loop Agents for software engineers. Focus on automating software development workflows and best practices.", 97 | "Vibe Coding": "Code Agents for nontechnical people building ephemeral software and low code prototypes. Best practices and live demos welcome.", 98 | "Voice": "Real-time voice AI for personal/business needs. Focus on new models and challenges in voice agent personalization.", 99 | "Sales/Support Agents": "AI-powered chatbots vs. human-assisted AI for customer support. Focus on practical implementations and training approaches.", 100 | "The Great AI Debates": "Oxford-Style Debates on interesting AI propositions. Focus on good-faith disagreement and audience engagement.", 101 | "Anything Else": "Best talks in AI Engineering that don't fit cleanly in other categories. Focus on innovative and impactful content." 102 | } as const; 103 | 104 | // Simple hash function for emails 105 | function hashEmail(email: string): string { 106 | // Convert email to lowercase and remove whitespace 107 | const cleanEmail = email.toLowerCase().trim(); 108 | // Create a simple hash using the first 3 chars and last 3 chars of the local part 109 | // and the domain, then create a numeric hash 110 | const [local, domain] = cleanEmail.split('@'); 111 | const hashStr = `${local.slice(0, 3)}${local.slice(-3)}${domain}`; 112 | // Simple numeric hash 113 | let hash = 0; 114 | for (let i = 0; i < hashStr.length; i++) { 115 | hash = ((hash << 5) - hash) + hashStr.charCodeAt(i); 116 | hash = hash & hash; // Convert to 32bit integer 117 | } 118 | // Convert to base36 and take first 8 chars 119 | return Math.abs(hash).toString(36).slice(0, 8); 120 | } 121 | 122 | // Generate a unique submission ID 123 | function generateSubmissionId(): string { 124 | const timestamp = Date.now().toString(36); 125 | const random = Math.random().toString(36).substring(2, 6); 126 | return `${timestamp}-${random}`; 127 | } 128 | 129 | export class MyMCP extends McpAgent { 130 | server = new McpServer({ 131 | name: "Demo", 132 | version: "1.0.0", 133 | instructions: "This is a demo server for the MCP Conference 2024. It is used to submit and list talk submissions.", 134 | capabilities: { 135 | tools: ["add", "conference-details", "submit-talk", "list-submissions", "edit-talk"] 136 | } 137 | }); 138 | 139 | async init() { 140 | 141 | this.server.tool("conference-details", 142 | "Get detailed information about the AI Engineer Conference 2025, including dates, venue, submission guidelines, and other important details for speakers and attendees, straight from ai.engineer/llms.txt", 143 | async () => { 144 | const response = await fetch("https://www.ai.engineer/llms.txt"); 145 | const text = await response.text(); 146 | 147 | return { 148 | content: [{ 149 | type: "text", 150 | text 151 | }] 152 | }; 153 | } 154 | ); 155 | 156 | this.server.resource("conference-tracks", "mcp://resource/conference-tracks", async (uri) => { 157 | const tracksInfo = TRACKS.map(track => ({ 158 | name: track, 159 | description: TRACK_DESCRIPTIONS[track] 160 | })); 161 | 162 | return { 163 | contents: [{ uri: uri.href, text: JSON.stringify(tracksInfo, null, 2) }], 164 | }; 165 | }); 166 | 167 | this.server.resource("conference-info", "mcp://resource/conference-info", async (uri) => { 168 | return { 169 | contents: [{ uri: uri.href, text: JSON.stringify(CONFERENCE_INFO, null, 2) }], 170 | }; 171 | }); 172 | 173 | this.server.tool("submit-talk", 174 | "Submit a talk proposal for the conference - make sure all fields are confirmed by the speaker before submitting - do not hallucinate any fields. If you dont know the exact email, you must ask for it before using this tool.", 175 | { 176 | speakerName: z.string().describe("Full name of the speaker"), 177 | email: z.string().email().describe("Email address of the speaker. If you dont know the exact email, you must ask for it before using this tool."), 178 | talkTitle: z.string().describe("Title of the proposed talk (can be changed later)"), 179 | abstract: z.string().describe("Abstract of the proposed talk - markdown is allowed. (can be changed later)"), 180 | tracks: z.array(z.enum(TRACKS)).describe("Possible track categories for the talk (can select up to 3)"), 181 | speakerTitle: z.string().optional().describe("Speaker's professional title (e.g. CTO, AI Engineer)"), 182 | speakerCompany: z.string().optional().describe("Speaker's company or organization"), 183 | speakerPhotoUrl: z.string().url().optional().describe("URL to speaker's photo (must be a valid URL)"), 184 | speakerBio: z.string().optional().describe("Speaker's bio - markdown is allowed"), 185 | reviewComments: z.string().optional().describe("Comments for the review committee on why they should consider this talk") 186 | }, async ({ speakerName, email, talkTitle, abstract, tracks, speakerTitle, speakerCompany, speakerPhotoUrl, speakerBio, reviewComments }) => { 187 | const secretHash = hashEmail(email); 188 | const submissionId = generateSubmissionId(); 189 | const submission = { 190 | speakerName, 191 | email, 192 | secretHash, 193 | submissionId, 194 | talkTitle, 195 | abstract, 196 | tracks, 197 | speakerTitle, 198 | speakerCompany, 199 | speakerPhotoUrl, 200 | speakerBio, 201 | reviewComments, 202 | submittedAt: new Date().toISOString() 203 | }; 204 | 205 | // Store in Cloudflare KV 206 | await this.env.AIEWFSUBMISSIONS.put( 207 | `talk-${submissionId}`, 208 | JSON.stringify(submission) 209 | ); 210 | 211 | return { 212 | content: [{ 213 | type: "text", 214 | text: `Thank you for your submission, ${speakerName}! Your talk "${talkTitle}" has been submitted for the following tracks: ${tracks.join(', ')}. We'll review it and get back to you at ${email}.\n\nYour submission ID is: ${submissionId}\nYour email hash is: ${secretHash} - you can use either to list or edit your submission.` 215 | }] 216 | }; 217 | }); 218 | 219 | this.server.tool("edit-talk", 220 | "Edit an existing talk submission. You must provide either the submission ID or email hash to identify your submission, and a valid secret key.", 221 | { 222 | submissionId: z.string().optional().describe("The unique submission ID"), 223 | secretHash: z.string().optional().describe("The email hash (alternative to submissionId)"), 224 | speakerName: z.string().optional().describe("Updated full name of the speaker"), 225 | email: z.string().email().optional().describe("Updated email address of the speaker"), 226 | talkTitle: z.string().optional().describe("Updated title of the proposed talk"), 227 | abstract: z.string().optional().describe("Updated abstract of the proposed talk"), 228 | tracks: z.array(z.enum(TRACKS)).optional().describe("Updated track categories for the talk"), 229 | speakerTitle: z.string().optional().describe("Updated speaker's professional title"), 230 | speakerCompany: z.string().optional().describe("Updated speaker's company or organization"), 231 | speakerPhotoUrl: z.string().url().optional().describe("Updated URL to speaker's photo"), 232 | speakerBio: z.string().optional().describe("Updated speaker's bio - markdown is allowed"), 233 | reviewComments: z.string().optional().describe("Updated comments for the review committee") 234 | }, async ({ submissionId, secretHash, speakerName, email, talkTitle, abstract, tracks, speakerTitle, speakerCompany, speakerPhotoUrl, speakerBio, reviewComments }) => { 235 | 236 | // Find the submission 237 | let submission; 238 | if (submissionId) { 239 | const value = await this.env.AIEWFSUBMISSIONS.get(`talk-${submissionId}`); 240 | if (!value) { 241 | return { 242 | content: [{ 243 | type: "text", 244 | text: "No submission found with the provided ID." 245 | }] 246 | }; 247 | } 248 | submission = JSON.parse(value); 249 | } else if (secretHash) { 250 | const submissions = await this.env.AIEWFSUBMISSIONS.list(); 251 | const submissionDetails = await Promise.all( 252 | submissions.keys.map(async (key) => { 253 | const value = await this.env.AIEWFSUBMISSIONS.get(key.name); 254 | return value ? JSON.parse(value) : null; 255 | }) 256 | ); 257 | submission = submissionDetails.find(sub => sub?.secretHash === secretHash); 258 | if (!submission) { 259 | return { 260 | content: [{ 261 | type: "text", 262 | text: "No submission found with the provided email hash." 263 | }] 264 | }; 265 | } 266 | } else { 267 | return { 268 | content: [{ 269 | type: "text", 270 | text: "Please provide either a submission ID or email hash." 271 | }] 272 | }; 273 | } 274 | 275 | // Update the submission with new values 276 | const updatedSubmission = { 277 | ...submission, 278 | speakerName: speakerName || submission.speakerName, 279 | email: email || submission.email, 280 | talkTitle: talkTitle || submission.talkTitle, 281 | abstract: abstract || submission.abstract, 282 | tracks: tracks || submission.tracks, 283 | speakerTitle: speakerTitle ?? submission.speakerTitle, 284 | speakerCompany: speakerCompany ?? submission.speakerCompany, 285 | speakerPhotoUrl: speakerPhotoUrl ?? submission.speakerPhotoUrl, 286 | speakerBio: speakerBio ?? submission.speakerBio, 287 | reviewComments: reviewComments ?? submission.reviewComments, 288 | updatedAt: new Date().toISOString() 289 | }; 290 | 291 | // Store the updated submission 292 | await this.env.AIEWFSUBMISSIONS.put( 293 | `talk-${submission.submissionId}`, 294 | JSON.stringify(updatedSubmission) 295 | ); 296 | 297 | return { 298 | content: [{ 299 | type: "text", 300 | text: `Your submission has been updated successfully!\n\nUpdated details:\nSpeaker: ${updatedSubmission.speakerName}\nEmail: ${updatedSubmission.email}\nTitle: ${updatedSubmission.talkTitle}\nTracks: ${updatedSubmission.tracks.join(', ')}` 301 | }] 302 | }; 303 | }); 304 | 305 | this.server.tool("list-submissions", { 306 | secretHash: z.string().optional().describe("Secret hash to filter submissions") 307 | }, async ({ secretHash }) => { 308 | const submissions = await this.env.AIEWFSUBMISSIONS.list(); 309 | const submissionDetails = await Promise.all( 310 | submissions.keys.map(async (key) => { 311 | const value = await this.env.AIEWFSUBMISSIONS.get(key.name); 312 | return value ? JSON.parse(value) : null; 313 | }) 314 | ); 315 | 316 | const validSubmissions = submissionDetails 317 | .filter((sub): sub is NonNullable => sub !== null) 318 | .filter(sub => !secretHash || sub.secretHash === secretHash); 319 | 320 | if (validSubmissions.length === 0) { 321 | return { 322 | content: [{ 323 | type: "text", 324 | text: secretHash 325 | ? "No submissions found for the provided email hash." 326 | : "No talk submissions found." 327 | }] 328 | }; 329 | } 330 | 331 | const formattedSubmissions = validSubmissions.map(sub => 332 | `Speaker: ${sub.speakerName}\n` + 333 | (sub.speakerTitle ? `Title: ${sub.speakerTitle}\n` : '') + 334 | (sub.speakerCompany ? `Company: ${sub.speakerCompany}\n` : '') + 335 | `Email: ${sub.email}\n` + 336 | `Title: ${sub.talkTitle}\n` + 337 | `Tracks: ${sub.tracks.join(', ')}\n` + 338 | `Submitted: ${new Date(sub.submittedAt).toLocaleDateString()}\n` + 339 | `Abstract: ${sub.abstract}\n` + 340 | (sub.speakerBio ? `Speaker Bio: ${sub.speakerBio}\n` : '') + 341 | (sub.reviewComments ? `Review Comments: ${sub.reviewComments}\n` : '') + 342 | `---\n` 343 | ).join('\n'); 344 | 345 | return { 346 | content: [{ 347 | type: "text", 348 | text: `Found ${validSubmissions.length} talk submission(s):\n\n${formattedSubmissions}` 349 | }] 350 | }; 351 | }); 352 | } 353 | } 354 | 355 | // export default MyMCP.mount("/sse"); 356 | 357 | export default { 358 | fetch: async (request: Request, env: Env, ctx: ExecutionContext) => { 359 | const url = new URL(request.url); 360 | if (url.pathname === "/listall") { 361 | const secretKey = url.searchParams.get("secret"); 362 | const storedSecretKey = await env.SECRETKEY.get(); 363 | if (!secretKey || secretKey !== storedSecretKey) { 364 | return new Response("Unauthorized: Invalid or missing secret key", { status: 401 }); 365 | } 366 | 367 | // Get all submission keys 368 | const submissions = await env.AIEWFSUBMISSIONS.list(); 369 | 370 | // Fetch all submission details 371 | const submissionDetails = await Promise.all( 372 | submissions.keys.map(async (key) => { 373 | const value = await env.AIEWFSUBMISSIONS.get(key.name); 374 | return value ? JSON.parse(value) : null; 375 | }) 376 | ); 377 | 378 | // Filter out null values and create CSV 379 | const validSubmissions = submissionDetails.filter((sub): sub is NonNullable => sub !== null); 380 | 381 | // Define CSV headers 382 | const headers = [ 383 | "Submission ID", 384 | "Speaker Name", 385 | "Speaker Title", 386 | "Speaker Company", 387 | "Email", 388 | "Talk Title", 389 | "Tracks", 390 | "Abstract", 391 | "Speaker Bio", 392 | "Review Comments", 393 | "Speaker Photo URL", 394 | "Submitted At", 395 | "Updated At" 396 | ]; 397 | 398 | // Create CSV rows with safe value handling 399 | const safeStr = (val: any) => { 400 | if (val === null || val === undefined) return ''; 401 | return String(val).replace(/"/g, '""'); 402 | }; 403 | 404 | const rows = validSubmissions.map(sub => [ 405 | safeStr(sub.submissionId), 406 | `"${safeStr(sub.speakerName)}"`, 407 | `"${safeStr(sub.speakerTitle)}"`, 408 | `"${safeStr(sub.speakerCompany)}"`, 409 | `"${safeStr(sub.email)}"`, 410 | `"${safeStr(sub.talkTitle)}"`, 411 | `"${Array.isArray(sub.tracks) ? sub.tracks.join(', ') : ''}"`, 412 | `"${safeStr(sub.abstract)}"`, 413 | `"${safeStr(sub.speakerBio)}"`, 414 | `"${safeStr(sub.reviewComments)}"`, 415 | `"${safeStr(sub.speakerPhotoUrl)}"`, 416 | safeStr(sub.submittedAt), 417 | safeStr(sub.updatedAt) 418 | ]); 419 | 420 | // Combine headers and rows 421 | const csvContent = [ 422 | headers.join(','), 423 | ...rows.map(row => row.join(',')) 424 | ].join('\n'); 425 | 426 | // Return CSV response 427 | return new Response(csvContent, { 428 | headers: { 429 | 'Content-Type': 'text/csv', 430 | 'Content-Disposition': 'attachment; filename="submissions.csv"' 431 | } 432 | }); 433 | } 434 | // @ts-ignore 435 | return MyMCP.mount("/sse").fetch(request, env, ctx); 436 | }, 437 | // scheduled: MyMCP.mount("/sse"), 438 | }; 439 | 440 | // // Export the OAuth handler as the default 441 | // export default new OAuthProvider({ 442 | // apiRoute: "/sse", 443 | // // TODO: fix these types 444 | // // @ts-ignore 445 | // apiHandler: MyMCP.mount("/sse"), 446 | // // @ts-ignore 447 | // defaultHandler: app, 448 | // authorizeEndpoint: "/authorize", 449 | // tokenEndpoint: "/token", 450 | // clientRegistrationEndpoint: "/register", 451 | // }); 452 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | // Helper to generate the layout 2 | import { html, raw } from "hono/html"; 3 | import type { HtmlEscapedString } from "hono/utils/html"; 4 | import { marked } from "marked"; 5 | import type { AuthRequest } from "@cloudflare/workers-oauth-provider"; 6 | import { env } from "cloudflare:workers"; 7 | 8 | // This file mainly exists as a dumping ground for uninteresting html and CSS 9 | // to remove clutter and noise from the auth logic. You likely do not need 10 | // anything from this file. 11 | 12 | export const layout = (content: HtmlEscapedString | string, title: string) => html` 13 | 14 | 15 | 16 | 17 | 21 | ${title} 22 | 23 | 40 | 147 | 148 | 151 |
152 |
155 | MCP Remote Auth Demo 160 |
161 |
162 |
163 | ${content} 164 |
165 |
166 |
167 |

168 | © ${new Date().getFullYear()} MCP Remote Auth Demo. 169 | All rights reserved. 170 |

171 |
172 |
173 | 174 | 175 | `; 176 | 177 | export const homeContent = async (req: Request): Promise => { 178 | // We have the README symlinked into the static directory, so we can fetch it 179 | // and render it into HTML 180 | const origin = new URL(req.url).origin; 181 | const res = await env.ASSETS.fetch(`${origin}/README.md`); 182 | const markdown = await res.text(); 183 | const content = await marked(markdown); 184 | return html` 185 |
${raw(content)}
186 | `; 187 | }; 188 | 189 | export const renderLoggedInAuthorizeScreen = async ( 190 | oauthScopes: { name: string; description: string }[], 191 | oauthReqInfo: AuthRequest, 192 | ) => { 193 | return html` 194 |
195 |

196 | Authorization Request 197 |

198 | 199 |
200 |

201 | MCP Remote Auth Demo would like permission to: 202 |

203 |
    204 | ${oauthScopes.map( 205 | (scope) => html` 206 |
  • 207 | 211 |
    212 |

    ${scope.name}

    213 |

    214 | ${scope.description} 215 |

    216 |
    217 |
  • 218 | `, 219 | )} 220 |
221 |
222 |
223 | 228 | 229 | 237 | 245 |
246 |
247 | `; 248 | }; 249 | 250 | export const renderLoggedOutAuthorizeScreen = async ( 251 | oauthScopes: { name: string; description: string }[], 252 | oauthReqInfo: AuthRequest, 253 | ) => { 254 | return html` 255 |
256 |

257 | Authorization Request 258 |

259 | 260 |
261 |

262 | MCP Remote Auth Demo would like permission to: 263 |

264 |
    265 | ${oauthScopes.map( 266 | (scope) => html` 267 |
  • 268 | 272 |
    273 |

    ${scope.name}

    274 |

    275 | ${scope.description} 276 |

    277 |
    278 |
  • 279 | `, 280 | )} 281 |
282 |
283 |
284 | 289 |
290 |
291 | 296 | 303 |
304 |
305 | 310 | 317 |
318 |
319 | 327 | 335 |
336 |
337 | `; 338 | }; 339 | 340 | export const renderApproveContent = async ( 341 | message: string, 342 | status: string, 343 | redirectUrl: string, 344 | ) => { 345 | return html` 346 |
349 |
350 | 357 | ${status === "success" ? "✓" : "✗"} 358 | 359 |
360 |

361 | ${message} 362 |

363 |

364 | You will be redirected back to the application shortly. 365 |

366 | 370 | Return to Home 371 | 372 | ${raw(` 373 | 378 | `)} 379 |
380 | `; 381 | }; 382 | 383 | export const renderAuthorizationApprovedContent = async (redirectUrl: string) => { 384 | return renderApproveContent("Authorization approved!", "success", redirectUrl); 385 | }; 386 | 387 | export const renderAuthorizationRejectedContent = async (redirectUrl: string) => { 388 | return renderApproveContent("Authorization rejected.", "error", redirectUrl); 389 | }; 390 | 391 | export const parseApproveFormBody = async (body: { 392 | [x: string]: string | File; 393 | }) => { 394 | const action = body.action as string; 395 | const email = body.email as string; 396 | const password = body.password as string; 397 | let oauthReqInfo: AuthRequest | null = null; 398 | try { 399 | oauthReqInfo = JSON.parse(body.oauthReqInfo as string) as AuthRequest; 400 | } catch (e) { 401 | oauthReqInfo = null; 402 | } 403 | 404 | return { action, oauthReqInfo, email, password }; 405 | }; 406 | -------------------------------------------------------------------------------- /static/README.md: -------------------------------------------------------------------------------- 1 | # Remote MCP Server on Cloudflare 2 | 3 | Let's get a remote MCP server up-and-running on Cloudflare Workers complete with OAuth login! 4 | 5 | ## Develop locally 6 | 7 | ```bash 8 | # clone the repository 9 | git clone git@github.com:cloudflare/ai.git 10 | 11 | # install dependencies 12 | cd ai 13 | npm install 14 | 15 | # run locally 16 | npx nx dev remote-mcp-server 17 | ``` 18 | 19 | You should be able to open [`http://localhost:8787/`](http://localhost:8787/) in your browser 20 | 21 | ## Connect the MCP inspector to your server 22 | 23 | To explore your new MCP api, you can use the [MCP Inspector](https://modelcontextprotocol.io/docs/tools/inspector). 24 | 25 | - Start it with `npx @modelcontextprotocol/inspector` 26 | - [Within the inspector](http://localhost:5173), switch the Transport Type to `SSE` and enter `http://localhost:8787/sse` as the URL of the MCP server to connect to, and click "Connect" 27 | - You will navigate to a (mock) user/password login screen. Input any email and pass to login. 28 | - You should be redirected back to the MCP Inspector and you can now list and call any defined tools! 29 | 30 |
31 | MCP Inspector with the above config 32 |
33 | 34 |
35 | MCP Inspector with after a tool call 36 |
37 | 38 | ## Connect Claude Desktop to your local MCP server 39 | 40 | The MCP inspector is great, but we really want to connect this to Claude! Follow [Anthropic's Quickstart](https://modelcontextprotocol.io/quickstart/user) and within Claude Desktop go to Settings > Developer > Edit Config to find your configuration file. 41 | 42 | Open the file in your text editor and replace it with this configuration: 43 | 44 | ```json 45 | { 46 | "mcpServers": { 47 | "math": { 48 | "command": "npx", 49 | "args": [ 50 | "mcp-remote", 51 | "http://localhost:8787/sse" 52 | ] 53 | } 54 | } 55 | } 56 | ``` 57 | 58 | This will run a local proxy and let Claude talk to your MCP server over HTTP 59 | 60 | When you open Claude a browser window should open and allow you to login. You should see the tools available in the bottom right. Given the right prompt Claude should ask to call the tool. 61 | 62 |
63 | Clicking on the hammer icon shows a list of available tools 64 |
65 | 66 |
67 | Claude answers the prompt 'I seem to have lost my calculator and have run out of fingers. Could you use the math tool to add 23 and 19?' by invoking the MCP add tool 68 |
69 | 70 | ## Deploy to Cloudflare 71 | 72 | 1. `npx wrangler@latest kv namespace create remote-mcp-server-oauth-kv` 73 | 2. Follow the guidance to add the kv namespace ID to `wrangler.jsonc` 74 | 3. `npm run deploy` 75 | 76 | ## Call your newly deployed remote MCP server from a remote MCP client 77 | 78 | Just like you did above in "Develop locally", run the MCP inspector: 79 | 80 | `npx @modelcontextprotocol/inspector@latest` 81 | 82 | Then enter the `workers.dev` URL (ex: `worker-name.account-name.workers.dev/sse`) of your Worker in the inspector as the URL of the MCP server to connect to, and click "Connect". 83 | 84 | You've now connected to your MCP server from a remote MCP client. 85 | 86 | ## Connect Claude Desktop to your remote MCP server 87 | 88 | Update the Claude configuration file to point to your `workers.dev` URL (ex: `worker-name.account-name.workers.dev/sse`) and restart Claude 89 | 90 | ```json 91 | { 92 | "mcpServers": { 93 | "math": { 94 | "command": "npx", 95 | "args": [ 96 | "mcp-remote", 97 | "https://worker-name.account-name.workers.dev/sse" 98 | ] 99 | } 100 | } 101 | } 102 | ``` 103 | 104 | ## Debugging 105 | 106 | Should anything go wrong it can be helpful to restart Claude, or to try connecting directly to your 107 | MCP server on the command line with the following command. 108 | 109 | ```bash 110 | npx mcp-remote http://localhost:8787/sse 111 | ``` 112 | 113 | In some rare cases it may help to clear the files added to `~/.mcp-auth` 114 | 115 | ```bash 116 | rm -rf ~/.mcp-auth 117 | ``` 118 | -------------------------------------------------------------------------------- /static/img: -------------------------------------------------------------------------------- 1 | /var/folders/l6/wxx61ndd6qn804svp_x3qf6c0000gn/T/c3-templateCuWTqG/img -------------------------------------------------------------------------------- /submissions.csv: -------------------------------------------------------------------------------- 1 | Error: Secret "SECRETKEY" not found 2 | at async Object.fetch (file:///Users/shawnwang/Desktop/Work/aie-mcp/src/index.ts:362:28) 3 | at async jsonError (file:///Users/shawnwang/.nvm/versions/node/v23.8.0/lib/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts:22:10) 4 | at async drainBody (file:///Users/shawnwang/.nvm/versions/node/v23.8.0/lib/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts:5:10) -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2021", 4 | "lib": ["es2021"], 5 | "jsx": "react-jsx", 6 | "module": "es2022", 7 | "moduleResolution": "Bundler", 8 | "resolveJsonModule": true, 9 | "allowJs": true, 10 | "checkJs": false, 11 | "noEmit": true, 12 | "isolatedModules": true, 13 | "allowSyntheticDefaultImports": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "strict": true, 16 | "skipLibCheck": true, 17 | "types": [ 18 | "@cloudflare/workers-types/2023-07-01" 19 | ] 20 | }, 21 | "include": ["worker-configuration.d.ts", "src/**/*.ts"] 22 | } 23 | -------------------------------------------------------------------------------- /wrangler.jsonc: -------------------------------------------------------------------------------- 1 | /** 2 | * For more details on how to configure Wrangler, refer to: 3 | * https://developers.cloudflare.com/workers/wrangler/configuration/ 4 | */ 5 | { 6 | "$schema": "node_modules/wrangler/config-schema.json", 7 | "name": "ai-engineer-wf-2025", 8 | "main": "src/index.ts", 9 | "compatibility_date": "2025-03-10", 10 | "compatibility_flags": [ 11 | "nodejs_compat" 12 | ], 13 | "migrations": [ 14 | { 15 | "new_sqlite_classes": [ 16 | "MyMCP" 17 | ], 18 | "tag": "v1" 19 | } 20 | ], 21 | "durable_objects": { 22 | "bindings": [ 23 | { 24 | "class_name": "MyMCP", 25 | "name": "MCP_OBJECT" 26 | } 27 | ] 28 | }, 29 | "kv_namespaces": [ 30 | { 31 | "binding": "OAUTH_KV", 32 | "id": "748bced7761944ecbdeab0b9122cd670" 33 | }, 34 | { 35 | "binding": "AIEWFSUBMISSIONS", 36 | "id": "dbad811fcd034df7a9897903d28b2af6" 37 | } 38 | ], 39 | "observability": { 40 | "enabled": true 41 | }, 42 | "assets": { 43 | "directory": "./static/", 44 | "binding": "ASSETS" 45 | }, 46 | "secrets_store_secrets": [ 47 | { 48 | "binding": "SECRETKEY", 49 | "store_id": "edd1ba8cbc284bb6a4ceb7b7145fc5da", 50 | "secret_name": "SECRETKEY" 51 | } 52 | ] 53 | /** 54 | * Smart Placement 55 | * Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement 56 | */ 57 | // "placement": { "mode": "smart" }, 58 | 59 | /** 60 | * Bindings 61 | * Bindings allow your Worker to interact with resources on the Cloudflare Developer Platform, including 62 | * databases, object storage, AI inference, real-time communication and more. 63 | * https://developers.cloudflare.com/workers/runtime-apis/bindings/ 64 | */ 65 | 66 | /** 67 | * Environment Variables 68 | * https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables 69 | */ 70 | // "vars": { "MY_VARIABLE": "production_value" }, 71 | /** 72 | * Note: Use secrets to store sensitive data. 73 | * https://developers.cloudflare.com/workers/configuration/secrets/ 74 | */ 75 | 76 | /** 77 | * Static Assets 78 | * https://developers.cloudflare.com/workers/static-assets/binding/ 79 | */ 80 | // "assets": { "directory": "./public/", "binding": "ASSETS" }, 81 | 82 | /** 83 | * Service Bindings (communicate between multiple Workers) 84 | * https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings 85 | */ 86 | // "services": [{ "binding": "MY_SERVICE", "service": "my-service" }] 87 | } 88 | --------------------------------------------------------------------------------