├── .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 |
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 |

63 |
64 |
65 |
66 |

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 |

95 |
96 |
97 |
98 |

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 |
162 |
163 | ${content}
164 |
165 |
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 |
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 |
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 |

32 |
33 |
34 |
35 |

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 |

64 |
65 |
66 |
67 |

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 |
--------------------------------------------------------------------------------