├── .github └── workflows │ ├── check.yml │ └── release.yml ├── .gitignore ├── .vscode └── settings.json ├── Dockerfile ├── LICENSE ├── README.md ├── deno.jsonc ├── deno.lock ├── entrypoint.sh ├── scripts ├── build.ts └── dev.ts └── src ├── cli ├── args.ts ├── format.ts └── templates.ts ├── drupal ├── auth.ts ├── client.ts ├── helpers.ts ├── json_rpc.ts └── preflight.ts ├── mod.ts └── server.ts /.github/workflows/check.yml: -------------------------------------------------------------------------------- 1 | name: check 2 | 3 | on: 4 | pull_request: 5 | 6 | jobs: 7 | lint: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | - uses: denoland/setup-deno@v2 12 | with: 13 | deno-version: "2.x" 14 | - run: deno task lint 15 | - run: deno fmt --check 16 | 17 | build: 18 | runs-on: ubuntu-latest 19 | steps: 20 | - uses: actions/checkout@v4 21 | - uses: denoland/setup-deno@v2 22 | with: 23 | deno-version: "2.x" 24 | - run: deno task build --output=build/mcp-server-drupal 25 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: release 2 | 3 | env: 4 | PACKAGE_NAME: "mcp-server-drupal" 5 | TARGET_LIST: "x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,x86_64-pc-windows-msvc,x86_64-apple-darwin,aarch64-apple-darwin" 6 | REGISTRY: ghcr.io 7 | IMAGE_NAME: omedia/mcp-server-drupal 8 | 9 | on: 10 | push: 11 | tags: 12 | - "v*.*.*" 13 | 14 | permissions: 15 | contents: write 16 | id-token: write 17 | packages: write 18 | 19 | jobs: 20 | binary: 21 | runs-on: ubuntu-latest 22 | steps: 23 | - name: Checkout code 24 | uses: actions/checkout@v4 25 | 26 | - name: Setup Deno 27 | uses: denoland/setup-deno@v2 28 | with: 29 | deno-version: "2.x" 30 | 31 | - name: Extract version from tag 32 | run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV 33 | 34 | - name: Setup cosign 35 | uses: sigstore/cosign-installer@v3.7.0 36 | 37 | - name: Build the binaries 38 | run: | 39 | for target in $(echo $TARGET_LIST | tr "," "\n") 40 | do 41 | arch=$(echo $target | cut -d'-' -f1) 42 | os=$(echo $target | cut -d'-' -f2) 43 | 44 | case $arch in 45 | "x86_64") arch_name="x86" ;; 46 | "aarch64") arch_name="arm" ;; 47 | *) arch_name=$arch ;; 48 | esac 49 | 50 | case $os in 51 | "apple") os_name="darwin" ;; 52 | "unknown") os_name="linux" ;; 53 | "pc") os_name="windows" ;; 54 | *) os_name=$os ;; 55 | esac 56 | 57 | binary_name="${PACKAGE_NAME}_${os_name}_${arch_name}" 58 | 59 | deno task build --target=$target --output=./build/$binary_name 60 | done 61 | 62 | - name: Sign binaries 63 | run: | 64 | mkdir -p build/bundles 65 | 66 | for file in build/*; do 67 | if [[ "$file" == "build/bundles" ]]; then continue; fi 68 | base_name=$(basename "$file" .exe) 69 | cosign sign-blob --bundle "build/bundles/${base_name}.bundle" --yes "$file" 70 | done 71 | 72 | cd build/bundles 73 | tar -czf ../signatures.tar.gz * 74 | cd ../.. 75 | 76 | - name: Release 77 | uses: softprops/action-gh-release@v2 78 | with: 79 | files: | 80 | build/* 81 | name: "MCP Server Drupal: ${{ env.VERSION }}" 82 | 83 | docker: 84 | runs-on: ubuntu-latest 85 | steps: 86 | - name: Checkout repository 87 | uses: actions/checkout@v4 88 | 89 | - name: Extract version from tag 90 | run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV 91 | 92 | - name: Set up Docker Buildx 93 | uses: docker/setup-buildx-action@v3 94 | 95 | - name: Login to GitHub Container Registry 96 | uses: docker/login-action@v3 97 | with: 98 | registry: ${{ env.REGISTRY }} 99 | username: ${{ github.actor }} 100 | password: ${{ secrets.GITHUB_TOKEN }} 101 | 102 | - name: Extract metadata for Docker 103 | id: meta 104 | uses: docker/metadata-action@v5 105 | with: 106 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 107 | tags: | 108 | type=semver,pattern={{version}} 109 | type=raw,value=latest 110 | labels: | 111 | org.opencontainers.image.source=https://github.com/omedia/mcp-server-drupal 112 | org.opencontainers.image.description=MCP Server for Drupal 113 | org.opencontainers.image.licenses=MIT 114 | org.opencontainers.image.version=${{ env.VERSION }} 115 | org.opencontainers.image.created={{date 'iso8601'}} 116 | 117 | - name: Build and push Docker image 118 | uses: docker/build-push-action@v5 119 | with: 120 | context: . 121 | push: true 122 | tags: ${{ steps.meta.outputs.tags }} 123 | labels: ${{ steps.meta.outputs.labels }} 124 | cache-from: type=gha 125 | cache-to: type=gha,mode=max 126 | platforms: linux/amd64,linux/arm64 127 | 128 | - name: Sign the images with Cosign 129 | uses: sigstore/cosign-installer@v3.7.0 130 | 131 | - name: Sign container image 132 | run: | 133 | cosign sign --yes ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.VERSION }} 134 | cosign sign --yes ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest 135 | 136 | jsr: 137 | runs-on: ubuntu-latest 138 | 139 | steps: 140 | - uses: actions/checkout@v4 141 | - run: npx jsr publish 142 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | *.log 3 | .env* 4 | build/ 5 | .DS_Store 6 | 7 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "deno.enable": true 3 | } 4 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM denoland/deno:2.1.5 2 | 3 | LABEL org.opencontainers.image.source=https://github.com/Omedia/mcp-server-drupal 4 | LABEL org.opencontainers.image.description="MCP Server for Drupal" 5 | LABEL org.opencontainers.image.licenses=MIT 6 | 7 | WORKDIR /app 8 | 9 | COPY entrypoint.sh /entrypoint.sh 10 | RUN chmod +x /entrypoint.sh 11 | 12 | COPY deno.jsonc deno.lock ./ 13 | COPY src ./src 14 | 15 | USER deno 16 | 17 | RUN deno cache src/mod.ts 18 | 19 | ENTRYPOINT ["/entrypoint.sh"] 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Omedia 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MCP Server for Drupal 2 | 3 | ![image](https://github.com/user-attachments/assets/3fc18e9b-acd6-4490-8f43-504d812354dc) 4 | 5 | This is a typescript based companion [Model Context Protocol(MCP)](https://modelcontextprotocol.io/introduction) server for the [Drupal MCP module](https://www.drupal.org/project/mcp) that works with the `STDIO` transport. In order to use `SSE` transport this server is not required. 6 | 7 | > [!IMPORTANT] 8 | > 📖 Detailed docs are avilable at [drupalmcp.io](https://drupalmcp.io/en) 9 | 10 | ## Installation 11 | 12 | The STDIO Binary is available through multiple distribution channels to accommodate various environments: 13 | 14 | - [Docker container](https://github.com/Omedia/mcp-server-drupal/pkgs/container/mcp-server-drupal) 15 | - [Compiled binary](https://github.com/Omedia/mcp-server-drupal/releases) 16 | - [JSR package](https://jsr.io/@omedia/mcp-server-drupal) 17 | 18 | Here is a quick example of how to use the server with `docker`: 19 | 20 | ```json 21 | { 22 | "mcpServers": { 23 | "mcp-server-drupal": { 24 | "command": "docker", 25 | "args": [ 26 | "run", 27 | "-i", 28 | "--rm", 29 | "ghcr.io/omedia/mcp-server-drupal", 30 | "--drupal-url=__DRUPAL_BASE_URL_" 31 | ], 32 | "env": {} 33 | } 34 | } 35 | } 36 | ``` 37 | 38 | 📖 For more details check the [Installation](http://drupalmcp.io/en/mcp-server/stdio-transport/#installation) section in the docs 39 | 40 | ## Authentication 41 | 42 | The server supports both authentication via environment variables. You can use either a auth token or a basic auth with username and password combination . The following environment variables are supported: 43 | 44 | - `DRUPAL_AUTH_TOKEN`: The authentication token. 45 | - `DRUPAL_AUTH_USER`: The username for authentication. 46 | - `DRUPAL_AUTH_PASSWORD`: The password for authentication. 47 | 48 | > [!NOTE] 49 | > Make sure to turn the authentication on the Drupal MCP module settings page. 50 | 51 | > [!NOTE] 52 | > If both `DRUPAL_AUTH_TOKEN` and `DRUPAL_AUTH_USER`/`DRUPAL_AUTH_PASSWORD` are set, the token will be used over the username and password. 53 | 54 | 📖 Check the [Authentication](http://drupalmcp.io/en/mcp-server/stdio-transport/#authentication) section in the docs for more details 55 | 56 | ## MCP 57 | 58 | - All instruments are defined by the Drupal API during the initialization phase 59 | 60 | > [!NOTE] 61 | > The server now exposes the following 62 | > 63 | > - Resources (templates, reads) 64 | > - Tools (calls) 65 | > 66 | > No prompts are exposed by the server for now 67 | 68 | ## Development 69 | 70 | This project is built with [Deno](https://deno.land/). 71 | 72 | > [!NOTE] 73 | > Use deno version `2.0.0` or above 74 | 75 | Install dependencies: 76 | 77 | ```bash 78 | deno install 79 | ``` 80 | 81 | For development with auto-rebuild: 82 | 83 | ```bash 84 | bun task dev 85 | ``` 86 | 87 | Build the server: 88 | 89 | ```bash 90 | deno task build --output build/mcp-server-drupal 91 | ``` 92 | 93 | > [!TIP] 94 | > To build for the specific platform use the `--target` flag and check the 95 | > [docs](https://docs.deno.com/runtime/reference/cli/compile/#supported-targets) 96 | 97 | ### Debugging 98 | 99 | Since MCP servers communicate over stdio, debugging can be challenging. We 100 | recommend using the 101 | [MCP Inspector](https://github.com/modelcontextprotocol/inspector), which is 102 | available as a deno task: 103 | 104 | ```bash 105 | deno task inspector --drupal-url [DRUPAL_BASE_URL] 106 | ``` 107 | 108 | ## Verifying the binaries and images 109 | 110 | `drupal_mcp_server` binaries and container images are signed by [cosign](https://github.com/sigstore/cosign) using identity-based signing. 111 | 112 | You can verify your binary by downloading the `signatures.tar.gz` file from the release page, extracting the signature and running the following command: 113 | 114 | ```bash 115 | cosign verify-blob ${YOUR_BINARY_NAME} \ 116 | --bundle signatures/${YOUR_BINARY_NAME}.bundle \ 117 | --certificate-oidc-issuer https://token.actions.githubusercontent.com \ 118 | --certificate-identity-regexp https://github.com/Omedia/mcp-server-drupal/.github/workflows/release.yml@refs/tags/v \ 119 | --certificate-github-workflow-repository Omedia/mcp-server-drupal 120 | ``` 121 | 122 | On the container side you can verify the image by running the following command: 123 | 124 | ```bash 125 | cosign verify ghcr.io/omedia/mcp-server-drupal:latest \ 126 | --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \ 127 | --certificate-identity-regexp "https://github.com/Omedia/mcp-server-drupal/.github/workflows/release.yml@refs/tags/v" 128 | ``` 129 | -------------------------------------------------------------------------------- /deno.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@omedia/mcp-server-drupal", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "exports": "./src/mod.ts", 6 | "tasks": { 7 | "dev": "deno run -A scripts/dev.ts", 8 | "format": "deno fmt", 9 | "lint": "deno lint", 10 | "build": "deno run --allow-read --allow-net --allow-env --allow-run scripts/build.ts", 11 | "inspector": "npx @modelcontextprotocol/inspector build/mcp-server-drupal", 12 | "release": "deno run -A npm:release-it" 13 | }, 14 | "compilerOptions": { 15 | "strict": true, 16 | "noFallthroughCasesInSwitch": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noPropertyAccessFromIndexSignature": true 20 | }, 21 | "imports": { 22 | "@modelcontextprotocol/sdk": "npm:@modelcontextprotocol/sdk@^1.10.2", 23 | "@std/assert": "jsr:@std/assert@1", 24 | "@std/cli": "jsr:@std/cli@^1.0.9", 25 | "@std/dotenv": "jsr:@std/dotenv@^0.225.3", 26 | "@std/fmt": "jsr:@std/fmt@^1.0.3", 27 | "@std/fs": "jsr:@std/fs@^1.0.8", 28 | "@std/path": "jsr:@std/path@^1.0.8", 29 | "zod": "npm:zod@^3.24.1" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "4", 3 | "specifiers": { 4 | "jsr:@std/assert@1": "1.0.10", 5 | "jsr:@std/cli@^1.0.9": "1.0.9", 6 | "jsr:@std/dotenv@~0.225.3": "0.225.3", 7 | "jsr:@std/fmt@^1.0.3": "1.0.3", 8 | "jsr:@std/fs@^1.0.8": "1.0.8", 9 | "jsr:@std/internal@^1.0.5": "1.0.5", 10 | "jsr:@std/path@^1.0.8": "1.0.8", 11 | "npm:@modelcontextprotocol/sdk@^1.10.2": "1.10.2_express@5.1.0_zod@3.24.1", 12 | "npm:release-it@*": "18.0.0", 13 | "npm:zod@^3.24.1": "3.24.1" 14 | }, 15 | "jsr": { 16 | "@std/assert@1.0.10": { 17 | "integrity": "59b5cbac5bd55459a19045d95cc7c2ff787b4f8527c0dd195078ff6f9481fbb3", 18 | "dependencies": [ 19 | "jsr:@std/internal" 20 | ] 21 | }, 22 | "@std/cli@1.0.9": { 23 | "integrity": "557e5865af000efbf3f737dcfea5b8ab86453594f4a9cd8d08c9fa83d8e3f3bc" 24 | }, 25 | "@std/dotenv@0.225.3": { 26 | "integrity": "a95e5b812c27b0854c52acbae215856d9cce9d4bbf774d938c51d212711e8d4a" 27 | }, 28 | "@std/fmt@1.0.3": { 29 | "integrity": "97765c16aa32245ff4e2204ecf7d8562496a3cb8592340a80e7e554e0bb9149f" 30 | }, 31 | "@std/fs@1.0.8": { 32 | "integrity": "161c721b6f9400b8100a851b6f4061431c538b204bb76c501d02c508995cffe0", 33 | "dependencies": [ 34 | "jsr:@std/path" 35 | ] 36 | }, 37 | "@std/internal@1.0.5": { 38 | "integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba" 39 | }, 40 | "@std/path@1.0.8": { 41 | "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" 42 | } 43 | }, 44 | "npm": { 45 | "@babel/code-frame@7.26.2": { 46 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", 47 | "dependencies": [ 48 | "@babel/helper-validator-identifier", 49 | "js-tokens", 50 | "picocolors" 51 | ] 52 | }, 53 | "@babel/helper-validator-identifier@7.25.9": { 54 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" 55 | }, 56 | "@iarna/toml@2.2.5": { 57 | "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" 58 | }, 59 | "@inquirer/checkbox@4.0.4_@types+node@22.10.5": { 60 | "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", 61 | "dependencies": [ 62 | "@inquirer/core", 63 | "@inquirer/figures", 64 | "@inquirer/type", 65 | "@types/node", 66 | "ansi-escapes", 67 | "yoctocolors-cjs" 68 | ] 69 | }, 70 | "@inquirer/confirm@5.1.1_@types+node@22.10.5": { 71 | "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", 72 | "dependencies": [ 73 | "@inquirer/core", 74 | "@inquirer/type", 75 | "@types/node" 76 | ] 77 | }, 78 | "@inquirer/core@10.1.2_@types+node@22.10.5": { 79 | "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", 80 | "dependencies": [ 81 | "@inquirer/figures", 82 | "@inquirer/type", 83 | "ansi-escapes", 84 | "cli-width", 85 | "mute-stream", 86 | "signal-exit", 87 | "strip-ansi@6.0.1", 88 | "wrap-ansi@6.2.0", 89 | "yoctocolors-cjs" 90 | ] 91 | }, 92 | "@inquirer/editor@4.2.1_@types+node@22.10.5": { 93 | "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", 94 | "dependencies": [ 95 | "@inquirer/core", 96 | "@inquirer/type", 97 | "@types/node", 98 | "external-editor" 99 | ] 100 | }, 101 | "@inquirer/expand@4.0.4_@types+node@22.10.5": { 102 | "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", 103 | "dependencies": [ 104 | "@inquirer/core", 105 | "@inquirer/type", 106 | "@types/node", 107 | "yoctocolors-cjs" 108 | ] 109 | }, 110 | "@inquirer/figures@1.0.9": { 111 | "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==" 112 | }, 113 | "@inquirer/input@4.1.1_@types+node@22.10.5": { 114 | "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", 115 | "dependencies": [ 116 | "@inquirer/core", 117 | "@inquirer/type", 118 | "@types/node" 119 | ] 120 | }, 121 | "@inquirer/number@3.0.4_@types+node@22.10.5": { 122 | "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", 123 | "dependencies": [ 124 | "@inquirer/core", 125 | "@inquirer/type", 126 | "@types/node" 127 | ] 128 | }, 129 | "@inquirer/password@4.0.4_@types+node@22.10.5": { 130 | "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", 131 | "dependencies": [ 132 | "@inquirer/core", 133 | "@inquirer/type", 134 | "@types/node", 135 | "ansi-escapes" 136 | ] 137 | }, 138 | "@inquirer/prompts@7.2.1_@types+node@22.10.5": { 139 | "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", 140 | "dependencies": [ 141 | "@inquirer/checkbox", 142 | "@inquirer/confirm", 143 | "@inquirer/editor", 144 | "@inquirer/expand", 145 | "@inquirer/input", 146 | "@inquirer/number", 147 | "@inquirer/password", 148 | "@inquirer/rawlist", 149 | "@inquirer/search", 150 | "@inquirer/select", 151 | "@types/node" 152 | ] 153 | }, 154 | "@inquirer/rawlist@4.0.4_@types+node@22.10.5": { 155 | "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", 156 | "dependencies": [ 157 | "@inquirer/core", 158 | "@inquirer/type", 159 | "@types/node", 160 | "yoctocolors-cjs" 161 | ] 162 | }, 163 | "@inquirer/search@3.0.4_@types+node@22.10.5": { 164 | "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", 165 | "dependencies": [ 166 | "@inquirer/core", 167 | "@inquirer/figures", 168 | "@inquirer/type", 169 | "@types/node", 170 | "yoctocolors-cjs" 171 | ] 172 | }, 173 | "@inquirer/select@4.0.4_@types+node@22.10.5": { 174 | "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", 175 | "dependencies": [ 176 | "@inquirer/core", 177 | "@inquirer/figures", 178 | "@inquirer/type", 179 | "@types/node", 180 | "ansi-escapes", 181 | "yoctocolors-cjs" 182 | ] 183 | }, 184 | "@inquirer/type@3.0.2_@types+node@22.10.5": { 185 | "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", 186 | "dependencies": [ 187 | "@types/node" 188 | ] 189 | }, 190 | "@modelcontextprotocol/sdk@1.10.2_express@5.1.0_zod@3.24.1": { 191 | "integrity": "sha512-rb6AMp2DR4SN+kc6L1ta2NCpApyA9WYNx3CrTSZvGxq9wH71bRur+zRqPfg0vQ9mjywR7qZdX2RGHOPq3ss+tA==", 192 | "dependencies": [ 193 | "content-type", 194 | "cors", 195 | "cross-spawn", 196 | "eventsource", 197 | "express", 198 | "express-rate-limit", 199 | "pkce-challenge", 200 | "raw-body", 201 | "zod", 202 | "zod-to-json-schema" 203 | ] 204 | }, 205 | "@nodelib/fs.scandir@2.1.5": { 206 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 207 | "dependencies": [ 208 | "@nodelib/fs.stat", 209 | "run-parallel" 210 | ] 211 | }, 212 | "@nodelib/fs.stat@2.0.5": { 213 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 214 | }, 215 | "@nodelib/fs.walk@1.2.8": { 216 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 217 | "dependencies": [ 218 | "@nodelib/fs.scandir", 219 | "fastq" 220 | ] 221 | }, 222 | "@octokit/auth-token@5.1.1": { 223 | "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==" 224 | }, 225 | "@octokit/core@6.1.3": { 226 | "integrity": "sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow==", 227 | "dependencies": [ 228 | "@octokit/auth-token", 229 | "@octokit/graphql", 230 | "@octokit/request", 231 | "@octokit/request-error", 232 | "@octokit/types", 233 | "before-after-hook", 234 | "universal-user-agent" 235 | ] 236 | }, 237 | "@octokit/endpoint@10.1.2": { 238 | "integrity": "sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==", 239 | "dependencies": [ 240 | "@octokit/types", 241 | "universal-user-agent" 242 | ] 243 | }, 244 | "@octokit/graphql@8.1.2": { 245 | "integrity": "sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw==", 246 | "dependencies": [ 247 | "@octokit/request", 248 | "@octokit/types", 249 | "universal-user-agent" 250 | ] 251 | }, 252 | "@octokit/openapi-types@22.2.0": { 253 | "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" 254 | }, 255 | "@octokit/plugin-paginate-rest@11.3.6_@octokit+core@6.1.3": { 256 | "integrity": "sha512-zcvqqf/+TicbTCa/Z+3w4eBJcAxCFymtc0UAIsR3dEVoNilWld4oXdscQ3laXamTszUZdusw97K8+DrbFiOwjw==", 257 | "dependencies": [ 258 | "@octokit/core", 259 | "@octokit/types" 260 | ] 261 | }, 262 | "@octokit/plugin-request-log@5.3.1_@octokit+core@6.1.3": { 263 | "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", 264 | "dependencies": [ 265 | "@octokit/core" 266 | ] 267 | }, 268 | "@octokit/plugin-rest-endpoint-methods@13.2.6_@octokit+core@6.1.3": { 269 | "integrity": "sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw==", 270 | "dependencies": [ 271 | "@octokit/core", 272 | "@octokit/types" 273 | ] 274 | }, 275 | "@octokit/request-error@6.1.6": { 276 | "integrity": "sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==", 277 | "dependencies": [ 278 | "@octokit/types" 279 | ] 280 | }, 281 | "@octokit/request@9.1.4": { 282 | "integrity": "sha512-tMbOwGm6wDII6vygP3wUVqFTw3Aoo0FnVQyhihh8vVq12uO3P+vQZeo2CKMpWtPSogpACD0yyZAlVlQnjW71DA==", 283 | "dependencies": [ 284 | "@octokit/endpoint", 285 | "@octokit/request-error", 286 | "@octokit/types", 287 | "fast-content-type-parse", 288 | "universal-user-agent" 289 | ] 290 | }, 291 | "@octokit/rest@21.0.2_@octokit+core@6.1.3": { 292 | "integrity": "sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ==", 293 | "dependencies": [ 294 | "@octokit/core", 295 | "@octokit/plugin-paginate-rest", 296 | "@octokit/plugin-request-log", 297 | "@octokit/plugin-rest-endpoint-methods" 298 | ] 299 | }, 300 | "@octokit/types@13.6.2": { 301 | "integrity": "sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==", 302 | "dependencies": [ 303 | "@octokit/openapi-types" 304 | ] 305 | }, 306 | "@pnpm/config.env-replace@1.1.0": { 307 | "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==" 308 | }, 309 | "@pnpm/network.ca-file@1.0.2": { 310 | "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", 311 | "dependencies": [ 312 | "graceful-fs@4.2.10" 313 | ] 314 | }, 315 | "@pnpm/npm-conf@2.3.1": { 316 | "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", 317 | "dependencies": [ 318 | "@pnpm/config.env-replace", 319 | "@pnpm/network.ca-file", 320 | "config-chain" 321 | ] 322 | }, 323 | "@sec-ant/readable-stream@0.4.1": { 324 | "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" 325 | }, 326 | "@sindresorhus/merge-streams@2.3.0": { 327 | "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==" 328 | }, 329 | "@sindresorhus/merge-streams@4.0.0": { 330 | "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==" 331 | }, 332 | "@tootallnate/quickjs-emscripten@0.23.0": { 333 | "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" 334 | }, 335 | "@types/node@22.10.5": { 336 | "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", 337 | "dependencies": [ 338 | "undici-types" 339 | ] 340 | }, 341 | "@types/parse-path@7.0.3": { 342 | "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==" 343 | }, 344 | "accepts@2.0.0": { 345 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 346 | "dependencies": [ 347 | "mime-types@3.0.1", 348 | "negotiator" 349 | ] 350 | }, 351 | "agent-base@7.1.3": { 352 | "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" 353 | }, 354 | "ansi-align@3.0.1": { 355 | "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", 356 | "dependencies": [ 357 | "string-width@4.2.3" 358 | ] 359 | }, 360 | "ansi-escapes@4.3.2": { 361 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 362 | "dependencies": [ 363 | "type-fest@0.21.3" 364 | ] 365 | }, 366 | "ansi-regex@5.0.1": { 367 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 368 | }, 369 | "ansi-regex@6.1.0": { 370 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" 371 | }, 372 | "ansi-styles@4.3.0": { 373 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 374 | "dependencies": [ 375 | "color-convert" 376 | ] 377 | }, 378 | "ansi-styles@6.2.1": { 379 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" 380 | }, 381 | "argparse@2.0.1": { 382 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 383 | }, 384 | "ast-types@0.13.4": { 385 | "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", 386 | "dependencies": [ 387 | "tslib" 388 | ] 389 | }, 390 | "async-retry@1.3.3": { 391 | "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", 392 | "dependencies": [ 393 | "retry" 394 | ] 395 | }, 396 | "atomically@2.0.3": { 397 | "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==", 398 | "dependencies": [ 399 | "stubborn-fs", 400 | "when-exit" 401 | ] 402 | }, 403 | "balanced-match@1.0.2": { 404 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 405 | }, 406 | "basic-ftp@5.0.5": { 407 | "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==" 408 | }, 409 | "before-after-hook@3.0.2": { 410 | "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" 411 | }, 412 | "body-parser@2.2.0": { 413 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", 414 | "dependencies": [ 415 | "bytes", 416 | "content-type", 417 | "debug", 418 | "http-errors", 419 | "iconv-lite@0.6.3", 420 | "on-finished", 421 | "qs", 422 | "raw-body", 423 | "type-is" 424 | ] 425 | }, 426 | "boxen@8.0.1": { 427 | "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", 428 | "dependencies": [ 429 | "ansi-align", 430 | "camelcase", 431 | "chalk", 432 | "cli-boxes", 433 | "string-width@7.2.0", 434 | "type-fest@4.31.0", 435 | "widest-line", 436 | "wrap-ansi@9.0.0" 437 | ] 438 | }, 439 | "brace-expansion@1.1.11": { 440 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 441 | "dependencies": [ 442 | "balanced-match", 443 | "concat-map" 444 | ] 445 | }, 446 | "braces@3.0.3": { 447 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 448 | "dependencies": [ 449 | "fill-range" 450 | ] 451 | }, 452 | "bundle-name@4.1.0": { 453 | "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", 454 | "dependencies": [ 455 | "run-applescript" 456 | ] 457 | }, 458 | "bytes@3.1.2": { 459 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 460 | }, 461 | "call-bind-apply-helpers@1.0.2": { 462 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 463 | "dependencies": [ 464 | "es-errors", 465 | "function-bind" 466 | ] 467 | }, 468 | "call-bound@1.0.4": { 469 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 470 | "dependencies": [ 471 | "call-bind-apply-helpers", 472 | "get-intrinsic" 473 | ] 474 | }, 475 | "callsites@3.1.0": { 476 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 477 | }, 478 | "camelcase@8.0.0": { 479 | "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==" 480 | }, 481 | "chalk@5.4.1": { 482 | "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==" 483 | }, 484 | "chardet@0.7.0": { 485 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 486 | }, 487 | "ci-info@4.1.0": { 488 | "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==" 489 | }, 490 | "cli-boxes@3.0.0": { 491 | "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" 492 | }, 493 | "cli-cursor@5.0.0": { 494 | "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", 495 | "dependencies": [ 496 | "restore-cursor" 497 | ] 498 | }, 499 | "cli-spinners@2.9.2": { 500 | "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==" 501 | }, 502 | "cli-width@4.1.0": { 503 | "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==" 504 | }, 505 | "color-convert@2.0.1": { 506 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 507 | "dependencies": [ 508 | "color-name" 509 | ] 510 | }, 511 | "color-name@1.1.4": { 512 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 513 | }, 514 | "concat-map@0.0.1": { 515 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 516 | }, 517 | "config-chain@1.1.13": { 518 | "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", 519 | "dependencies": [ 520 | "ini@1.3.8", 521 | "proto-list" 522 | ] 523 | }, 524 | "configstore@7.0.0": { 525 | "integrity": "sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==", 526 | "dependencies": [ 527 | "atomically", 528 | "dot-prop", 529 | "graceful-fs@4.2.11", 530 | "xdg-basedir" 531 | ] 532 | }, 533 | "content-disposition@1.0.0": { 534 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", 535 | "dependencies": [ 536 | "safe-buffer" 537 | ] 538 | }, 539 | "content-type@1.0.5": { 540 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 541 | }, 542 | "cookie-signature@1.2.2": { 543 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==" 544 | }, 545 | "cookie@0.7.2": { 546 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" 547 | }, 548 | "cors@2.8.5": { 549 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 550 | "dependencies": [ 551 | "object-assign", 552 | "vary" 553 | ] 554 | }, 555 | "cosmiconfig@9.0.0": { 556 | "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", 557 | "dependencies": [ 558 | "env-paths", 559 | "import-fresh", 560 | "js-yaml", 561 | "parse-json" 562 | ] 563 | }, 564 | "cross-spawn@7.0.6": { 565 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 566 | "dependencies": [ 567 | "path-key@3.1.1", 568 | "shebang-command", 569 | "which" 570 | ] 571 | }, 572 | "data-uri-to-buffer@6.0.2": { 573 | "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==" 574 | }, 575 | "debug@4.4.0": { 576 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 577 | "dependencies": [ 578 | "ms" 579 | ] 580 | }, 581 | "deep-extend@0.6.0": { 582 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 583 | }, 584 | "default-browser-id@5.0.0": { 585 | "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==" 586 | }, 587 | "default-browser@5.2.1": { 588 | "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", 589 | "dependencies": [ 590 | "bundle-name", 591 | "default-browser-id" 592 | ] 593 | }, 594 | "define-lazy-prop@3.0.0": { 595 | "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==" 596 | }, 597 | "degenerator@5.0.1": { 598 | "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", 599 | "dependencies": [ 600 | "ast-types", 601 | "escodegen", 602 | "esprima" 603 | ] 604 | }, 605 | "depd@2.0.0": { 606 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 607 | }, 608 | "dot-prop@9.0.0": { 609 | "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", 610 | "dependencies": [ 611 | "type-fest@4.31.0" 612 | ] 613 | }, 614 | "dunder-proto@1.0.1": { 615 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 616 | "dependencies": [ 617 | "call-bind-apply-helpers", 618 | "es-errors", 619 | "gopd" 620 | ] 621 | }, 622 | "ee-first@1.1.1": { 623 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 624 | }, 625 | "emoji-regex@10.4.0": { 626 | "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" 627 | }, 628 | "emoji-regex@8.0.0": { 629 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 630 | }, 631 | "encodeurl@2.0.0": { 632 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" 633 | }, 634 | "env-paths@2.2.1": { 635 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" 636 | }, 637 | "error-ex@1.3.2": { 638 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 639 | "dependencies": [ 640 | "is-arrayish" 641 | ] 642 | }, 643 | "es-define-property@1.0.1": { 644 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" 645 | }, 646 | "es-errors@1.3.0": { 647 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" 648 | }, 649 | "es-object-atoms@1.1.1": { 650 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 651 | "dependencies": [ 652 | "es-errors" 653 | ] 654 | }, 655 | "escape-goat@4.0.0": { 656 | "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==" 657 | }, 658 | "escape-html@1.0.3": { 659 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 660 | }, 661 | "escodegen@2.1.0": { 662 | "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", 663 | "dependencies": [ 664 | "esprima", 665 | "estraverse", 666 | "esutils", 667 | "source-map" 668 | ] 669 | }, 670 | "esprima@4.0.1": { 671 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 672 | }, 673 | "estraverse@5.3.0": { 674 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" 675 | }, 676 | "esutils@2.0.3": { 677 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 678 | }, 679 | "etag@1.8.1": { 680 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 681 | }, 682 | "eventsource-parser@3.0.1": { 683 | "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==" 684 | }, 685 | "eventsource@3.0.6": { 686 | "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==", 687 | "dependencies": [ 688 | "eventsource-parser" 689 | ] 690 | }, 691 | "execa@8.0.1": { 692 | "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", 693 | "dependencies": [ 694 | "cross-spawn", 695 | "get-stream@8.0.1", 696 | "human-signals@5.0.0", 697 | "is-stream@3.0.0", 698 | "merge-stream", 699 | "npm-run-path@5.3.0", 700 | "onetime@6.0.0", 701 | "signal-exit", 702 | "strip-final-newline@3.0.0" 703 | ] 704 | }, 705 | "execa@9.5.2": { 706 | "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==", 707 | "dependencies": [ 708 | "@sindresorhus/merge-streams@4.0.0", 709 | "cross-spawn", 710 | "figures", 711 | "get-stream@9.0.1", 712 | "human-signals@8.0.0", 713 | "is-plain-obj", 714 | "is-stream@4.0.1", 715 | "npm-run-path@6.0.0", 716 | "pretty-ms", 717 | "signal-exit", 718 | "strip-final-newline@4.0.0", 719 | "yoctocolors" 720 | ] 721 | }, 722 | "express-rate-limit@7.5.0_express@5.1.0": { 723 | "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", 724 | "dependencies": [ 725 | "express" 726 | ] 727 | }, 728 | "express@5.1.0": { 729 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", 730 | "dependencies": [ 731 | "accepts", 732 | "body-parser", 733 | "content-disposition", 734 | "content-type", 735 | "cookie", 736 | "cookie-signature", 737 | "debug", 738 | "encodeurl", 739 | "escape-html", 740 | "etag", 741 | "finalhandler", 742 | "fresh", 743 | "http-errors", 744 | "merge-descriptors", 745 | "mime-types@3.0.1", 746 | "on-finished", 747 | "once", 748 | "parseurl", 749 | "proxy-addr", 750 | "qs", 751 | "range-parser", 752 | "router", 753 | "send", 754 | "serve-static", 755 | "statuses", 756 | "type-is", 757 | "vary" 758 | ] 759 | }, 760 | "external-editor@3.1.0": { 761 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 762 | "dependencies": [ 763 | "chardet", 764 | "iconv-lite@0.4.24", 765 | "tmp" 766 | ] 767 | }, 768 | "fast-content-type-parse@2.0.1": { 769 | "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==" 770 | }, 771 | "fast-glob@3.3.3": { 772 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 773 | "dependencies": [ 774 | "@nodelib/fs.stat", 775 | "@nodelib/fs.walk", 776 | "glob-parent", 777 | "merge2", 778 | "micromatch" 779 | ] 780 | }, 781 | "fastq@1.18.0": { 782 | "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", 783 | "dependencies": [ 784 | "reusify" 785 | ] 786 | }, 787 | "figures@6.1.0": { 788 | "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", 789 | "dependencies": [ 790 | "is-unicode-supported@2.1.0" 791 | ] 792 | }, 793 | "fill-range@7.1.1": { 794 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 795 | "dependencies": [ 796 | "to-regex-range" 797 | ] 798 | }, 799 | "finalhandler@2.1.0": { 800 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", 801 | "dependencies": [ 802 | "debug", 803 | "encodeurl", 804 | "escape-html", 805 | "on-finished", 806 | "parseurl", 807 | "statuses" 808 | ] 809 | }, 810 | "forwarded@0.2.0": { 811 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 812 | }, 813 | "fresh@2.0.0": { 814 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==" 815 | }, 816 | "fs.realpath@1.0.0": { 817 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 818 | }, 819 | "function-bind@1.1.2": { 820 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 821 | }, 822 | "get-east-asian-width@1.3.0": { 823 | "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==" 824 | }, 825 | "get-intrinsic@1.3.0": { 826 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 827 | "dependencies": [ 828 | "call-bind-apply-helpers", 829 | "es-define-property", 830 | "es-errors", 831 | "es-object-atoms", 832 | "function-bind", 833 | "get-proto", 834 | "gopd", 835 | "has-symbols", 836 | "hasown", 837 | "math-intrinsics" 838 | ] 839 | }, 840 | "get-proto@1.0.1": { 841 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 842 | "dependencies": [ 843 | "dunder-proto", 844 | "es-object-atoms" 845 | ] 846 | }, 847 | "get-stream@8.0.1": { 848 | "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" 849 | }, 850 | "get-stream@9.0.1": { 851 | "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", 852 | "dependencies": [ 853 | "@sec-ant/readable-stream", 854 | "is-stream@4.0.1" 855 | ] 856 | }, 857 | "get-uri@6.0.4": { 858 | "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", 859 | "dependencies": [ 860 | "basic-ftp", 861 | "data-uri-to-buffer", 862 | "debug" 863 | ] 864 | }, 865 | "git-up@8.0.0": { 866 | "integrity": "sha512-uBI8Zdt1OZlrYfGcSVroLJKgyNNXlgusYFzHk614lTasz35yg2PVpL1RMy0LOO2dcvF9msYW3pRfUSmafZNrjg==", 867 | "dependencies": [ 868 | "is-ssh", 869 | "parse-url" 870 | ] 871 | }, 872 | "git-url-parse@16.0.0": { 873 | "integrity": "sha512-Y8iAF0AmCaqXc6a5GYgPQW9ESbncNLOL+CeQAJRhmWUOmnPkKpBYeWYp4mFd3LA5j53CdGDdslzX12yEBVHQQg==", 874 | "dependencies": [ 875 | "git-up" 876 | ] 877 | }, 878 | "glob-parent@5.1.2": { 879 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 880 | "dependencies": [ 881 | "is-glob" 882 | ] 883 | }, 884 | "glob@7.2.3": { 885 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 886 | "dependencies": [ 887 | "fs.realpath", 888 | "inflight", 889 | "inherits", 890 | "minimatch", 891 | "once", 892 | "path-is-absolute" 893 | ] 894 | }, 895 | "global-directory@4.0.1": { 896 | "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", 897 | "dependencies": [ 898 | "ini@4.1.1" 899 | ] 900 | }, 901 | "globby@14.0.2": { 902 | "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", 903 | "dependencies": [ 904 | "@sindresorhus/merge-streams@2.3.0", 905 | "fast-glob", 906 | "ignore", 907 | "path-type", 908 | "slash", 909 | "unicorn-magic@0.1.0" 910 | ] 911 | }, 912 | "gopd@1.2.0": { 913 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" 914 | }, 915 | "graceful-fs@4.2.10": { 916 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" 917 | }, 918 | "graceful-fs@4.2.11": { 919 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 920 | }, 921 | "has-symbols@1.1.0": { 922 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" 923 | }, 924 | "hasown@2.0.2": { 925 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 926 | "dependencies": [ 927 | "function-bind" 928 | ] 929 | }, 930 | "http-errors@2.0.0": { 931 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 932 | "dependencies": [ 933 | "depd", 934 | "inherits", 935 | "setprototypeof", 936 | "statuses", 937 | "toidentifier" 938 | ] 939 | }, 940 | "http-proxy-agent@7.0.2": { 941 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 942 | "dependencies": [ 943 | "agent-base", 944 | "debug" 945 | ] 946 | }, 947 | "https-proxy-agent@7.0.6": { 948 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 949 | "dependencies": [ 950 | "agent-base", 951 | "debug" 952 | ] 953 | }, 954 | "human-signals@5.0.0": { 955 | "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==" 956 | }, 957 | "human-signals@8.0.0": { 958 | "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==" 959 | }, 960 | "iconv-lite@0.4.24": { 961 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 962 | "dependencies": [ 963 | "safer-buffer" 964 | ] 965 | }, 966 | "iconv-lite@0.6.3": { 967 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 968 | "dependencies": [ 969 | "safer-buffer" 970 | ] 971 | }, 972 | "ignore@5.3.2": { 973 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" 974 | }, 975 | "import-fresh@3.3.0": { 976 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 977 | "dependencies": [ 978 | "parent-module", 979 | "resolve-from" 980 | ] 981 | }, 982 | "inflight@1.0.6": { 983 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 984 | "dependencies": [ 985 | "once", 986 | "wrappy" 987 | ] 988 | }, 989 | "inherits@2.0.4": { 990 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 991 | }, 992 | "ini@1.3.8": { 993 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 994 | }, 995 | "ini@4.1.1": { 996 | "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==" 997 | }, 998 | "inquirer@12.3.0_@types+node@22.10.5": { 999 | "integrity": "sha512-3NixUXq+hM8ezj2wc7wC37b32/rHq1MwNZDYdvx+d6jokOD+r+i8Q4Pkylh9tISYP114A128LCX8RKhopC5RfQ==", 1000 | "dependencies": [ 1001 | "@inquirer/core", 1002 | "@inquirer/prompts", 1003 | "@inquirer/type", 1004 | "@types/node", 1005 | "ansi-escapes", 1006 | "mute-stream", 1007 | "run-async", 1008 | "rxjs" 1009 | ] 1010 | }, 1011 | "interpret@1.4.0": { 1012 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" 1013 | }, 1014 | "ip-address@9.0.5": { 1015 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 1016 | "dependencies": [ 1017 | "jsbn", 1018 | "sprintf-js" 1019 | ] 1020 | }, 1021 | "ipaddr.js@1.9.1": { 1022 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1023 | }, 1024 | "is-arrayish@0.2.1": { 1025 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" 1026 | }, 1027 | "is-core-module@2.16.1": { 1028 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 1029 | "dependencies": [ 1030 | "hasown" 1031 | ] 1032 | }, 1033 | "is-docker@3.0.0": { 1034 | "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" 1035 | }, 1036 | "is-extglob@2.1.1": { 1037 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 1038 | }, 1039 | "is-fullwidth-code-point@3.0.0": { 1040 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 1041 | }, 1042 | "is-glob@4.0.3": { 1043 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1044 | "dependencies": [ 1045 | "is-extglob" 1046 | ] 1047 | }, 1048 | "is-in-ci@1.0.0": { 1049 | "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==" 1050 | }, 1051 | "is-inside-container@1.0.0": { 1052 | "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", 1053 | "dependencies": [ 1054 | "is-docker" 1055 | ] 1056 | }, 1057 | "is-installed-globally@1.0.0": { 1058 | "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", 1059 | "dependencies": [ 1060 | "global-directory", 1061 | "is-path-inside" 1062 | ] 1063 | }, 1064 | "is-interactive@2.0.0": { 1065 | "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==" 1066 | }, 1067 | "is-npm@6.0.0": { 1068 | "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==" 1069 | }, 1070 | "is-number@7.0.0": { 1071 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1072 | }, 1073 | "is-path-inside@4.0.0": { 1074 | "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==" 1075 | }, 1076 | "is-plain-obj@4.1.0": { 1077 | "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" 1078 | }, 1079 | "is-promise@4.0.0": { 1080 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" 1081 | }, 1082 | "is-ssh@1.4.0": { 1083 | "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", 1084 | "dependencies": [ 1085 | "protocols" 1086 | ] 1087 | }, 1088 | "is-stream@3.0.0": { 1089 | "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" 1090 | }, 1091 | "is-stream@4.0.1": { 1092 | "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==" 1093 | }, 1094 | "is-unicode-supported@1.3.0": { 1095 | "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==" 1096 | }, 1097 | "is-unicode-supported@2.1.0": { 1098 | "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==" 1099 | }, 1100 | "is-wsl@3.1.0": { 1101 | "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", 1102 | "dependencies": [ 1103 | "is-inside-container" 1104 | ] 1105 | }, 1106 | "isexe@2.0.0": { 1107 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 1108 | }, 1109 | "issue-parser@7.0.1": { 1110 | "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", 1111 | "dependencies": [ 1112 | "lodash.capitalize", 1113 | "lodash.escaperegexp", 1114 | "lodash.isplainobject", 1115 | "lodash.isstring", 1116 | "lodash.uniqby" 1117 | ] 1118 | }, 1119 | "js-tokens@4.0.0": { 1120 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1121 | }, 1122 | "js-yaml@4.1.0": { 1123 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1124 | "dependencies": [ 1125 | "argparse" 1126 | ] 1127 | }, 1128 | "jsbn@1.1.0": { 1129 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" 1130 | }, 1131 | "json-parse-even-better-errors@2.3.1": { 1132 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" 1133 | }, 1134 | "ky@1.7.4": { 1135 | "integrity": "sha512-zYEr/gh7uLW2l4su11bmQ2M9xLgQLjyvx58UyNM/6nuqyWFHPX5ktMjvpev3F8QWdjSsHUpnWew4PBCswBNuMQ==" 1136 | }, 1137 | "latest-version@9.0.0": { 1138 | "integrity": "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==", 1139 | "dependencies": [ 1140 | "package-json" 1141 | ] 1142 | }, 1143 | "lines-and-columns@1.2.4": { 1144 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" 1145 | }, 1146 | "lodash.capitalize@4.2.1": { 1147 | "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==" 1148 | }, 1149 | "lodash.escaperegexp@4.1.2": { 1150 | "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" 1151 | }, 1152 | "lodash.isplainobject@4.0.6": { 1153 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 1154 | }, 1155 | "lodash.isstring@4.0.1": { 1156 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 1157 | }, 1158 | "lodash.uniqby@4.7.0": { 1159 | "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==" 1160 | }, 1161 | "lodash@4.17.21": { 1162 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1163 | }, 1164 | "log-symbols@6.0.0": { 1165 | "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", 1166 | "dependencies": [ 1167 | "chalk", 1168 | "is-unicode-supported@1.3.0" 1169 | ] 1170 | }, 1171 | "lru-cache@7.18.3": { 1172 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" 1173 | }, 1174 | "macos-release@3.3.0": { 1175 | "integrity": "sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==" 1176 | }, 1177 | "math-intrinsics@1.1.0": { 1178 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" 1179 | }, 1180 | "media-typer@1.1.0": { 1181 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==" 1182 | }, 1183 | "merge-descriptors@2.0.0": { 1184 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==" 1185 | }, 1186 | "merge-stream@2.0.0": { 1187 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" 1188 | }, 1189 | "merge2@1.4.1": { 1190 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 1191 | }, 1192 | "micromatch@4.0.8": { 1193 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1194 | "dependencies": [ 1195 | "braces", 1196 | "picomatch" 1197 | ] 1198 | }, 1199 | "mime-db@1.52.0": { 1200 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1201 | }, 1202 | "mime-db@1.54.0": { 1203 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" 1204 | }, 1205 | "mime-types@2.1.35": { 1206 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1207 | "dependencies": [ 1208 | "mime-db@1.52.0" 1209 | ] 1210 | }, 1211 | "mime-types@3.0.1": { 1212 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", 1213 | "dependencies": [ 1214 | "mime-db@1.54.0" 1215 | ] 1216 | }, 1217 | "mimic-fn@4.0.0": { 1218 | "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" 1219 | }, 1220 | "mimic-function@5.0.1": { 1221 | "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==" 1222 | }, 1223 | "minimatch@3.1.2": { 1224 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1225 | "dependencies": [ 1226 | "brace-expansion" 1227 | ] 1228 | }, 1229 | "minimist@1.2.8": { 1230 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" 1231 | }, 1232 | "ms@2.1.3": { 1233 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1234 | }, 1235 | "mute-stream@2.0.0": { 1236 | "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==" 1237 | }, 1238 | "negotiator@1.0.0": { 1239 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==" 1240 | }, 1241 | "netmask@2.0.2": { 1242 | "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" 1243 | }, 1244 | "new-github-release-url@2.0.0": { 1245 | "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", 1246 | "dependencies": [ 1247 | "type-fest@2.19.0" 1248 | ] 1249 | }, 1250 | "npm-run-path@5.3.0": { 1251 | "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", 1252 | "dependencies": [ 1253 | "path-key@4.0.0" 1254 | ] 1255 | }, 1256 | "npm-run-path@6.0.0": { 1257 | "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", 1258 | "dependencies": [ 1259 | "path-key@4.0.0", 1260 | "unicorn-magic@0.3.0" 1261 | ] 1262 | }, 1263 | "object-assign@4.1.1": { 1264 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" 1265 | }, 1266 | "object-inspect@1.13.4": { 1267 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" 1268 | }, 1269 | "on-finished@2.4.1": { 1270 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1271 | "dependencies": [ 1272 | "ee-first" 1273 | ] 1274 | }, 1275 | "once@1.4.0": { 1276 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1277 | "dependencies": [ 1278 | "wrappy" 1279 | ] 1280 | }, 1281 | "onetime@6.0.0": { 1282 | "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", 1283 | "dependencies": [ 1284 | "mimic-fn" 1285 | ] 1286 | }, 1287 | "onetime@7.0.0": { 1288 | "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", 1289 | "dependencies": [ 1290 | "mimic-function" 1291 | ] 1292 | }, 1293 | "open@10.1.0": { 1294 | "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", 1295 | "dependencies": [ 1296 | "default-browser", 1297 | "define-lazy-prop", 1298 | "is-inside-container", 1299 | "is-wsl" 1300 | ] 1301 | }, 1302 | "ora@8.1.1": { 1303 | "integrity": "sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==", 1304 | "dependencies": [ 1305 | "chalk", 1306 | "cli-cursor", 1307 | "cli-spinners", 1308 | "is-interactive", 1309 | "is-unicode-supported@2.1.0", 1310 | "log-symbols", 1311 | "stdin-discarder", 1312 | "string-width@7.2.0", 1313 | "strip-ansi@7.1.0" 1314 | ] 1315 | }, 1316 | "os-name@6.0.0": { 1317 | "integrity": "sha512-bv608E0UX86atYi2GMGjDe0vF/X1TJjemNS8oEW6z22YW1Rc3QykSYoGfkQbX0zZX9H0ZB6CQP/3GTf1I5hURg==", 1318 | "dependencies": [ 1319 | "macos-release", 1320 | "windows-release" 1321 | ] 1322 | }, 1323 | "os-tmpdir@1.0.2": { 1324 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" 1325 | }, 1326 | "pac-proxy-agent@7.1.0": { 1327 | "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", 1328 | "dependencies": [ 1329 | "@tootallnate/quickjs-emscripten", 1330 | "agent-base", 1331 | "debug", 1332 | "get-uri", 1333 | "http-proxy-agent", 1334 | "https-proxy-agent", 1335 | "pac-resolver", 1336 | "socks-proxy-agent" 1337 | ] 1338 | }, 1339 | "pac-resolver@7.0.1": { 1340 | "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", 1341 | "dependencies": [ 1342 | "degenerator", 1343 | "netmask" 1344 | ] 1345 | }, 1346 | "package-json@10.0.1": { 1347 | "integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==", 1348 | "dependencies": [ 1349 | "ky", 1350 | "registry-auth-token", 1351 | "registry-url", 1352 | "semver" 1353 | ] 1354 | }, 1355 | "parent-module@1.0.1": { 1356 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1357 | "dependencies": [ 1358 | "callsites" 1359 | ] 1360 | }, 1361 | "parse-json@5.2.0": { 1362 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1363 | "dependencies": [ 1364 | "@babel/code-frame", 1365 | "error-ex", 1366 | "json-parse-even-better-errors", 1367 | "lines-and-columns" 1368 | ] 1369 | }, 1370 | "parse-ms@4.0.0": { 1371 | "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==" 1372 | }, 1373 | "parse-path@7.0.0": { 1374 | "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", 1375 | "dependencies": [ 1376 | "protocols" 1377 | ] 1378 | }, 1379 | "parse-url@9.2.0": { 1380 | "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", 1381 | "dependencies": [ 1382 | "@types/parse-path", 1383 | "parse-path" 1384 | ] 1385 | }, 1386 | "parseurl@1.3.3": { 1387 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1388 | }, 1389 | "path-is-absolute@1.0.1": { 1390 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" 1391 | }, 1392 | "path-key@3.1.1": { 1393 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 1394 | }, 1395 | "path-key@4.0.0": { 1396 | "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" 1397 | }, 1398 | "path-parse@1.0.7": { 1399 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 1400 | }, 1401 | "path-to-regexp@8.2.0": { 1402 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==" 1403 | }, 1404 | "path-type@5.0.0": { 1405 | "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==" 1406 | }, 1407 | "picocolors@1.1.1": { 1408 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" 1409 | }, 1410 | "picomatch@2.3.1": { 1411 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 1412 | }, 1413 | "pkce-challenge@5.0.0": { 1414 | "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==" 1415 | }, 1416 | "pretty-ms@9.2.0": { 1417 | "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", 1418 | "dependencies": [ 1419 | "parse-ms" 1420 | ] 1421 | }, 1422 | "proto-list@1.2.4": { 1423 | "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" 1424 | }, 1425 | "protocols@2.0.1": { 1426 | "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" 1427 | }, 1428 | "proxy-addr@2.0.7": { 1429 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1430 | "dependencies": [ 1431 | "forwarded", 1432 | "ipaddr.js" 1433 | ] 1434 | }, 1435 | "proxy-agent@6.5.0": { 1436 | "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", 1437 | "dependencies": [ 1438 | "agent-base", 1439 | "debug", 1440 | "http-proxy-agent", 1441 | "https-proxy-agent", 1442 | "lru-cache", 1443 | "pac-proxy-agent", 1444 | "proxy-from-env", 1445 | "socks-proxy-agent" 1446 | ] 1447 | }, 1448 | "proxy-from-env@1.1.0": { 1449 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1450 | }, 1451 | "pupa@3.1.0": { 1452 | "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", 1453 | "dependencies": [ 1454 | "escape-goat" 1455 | ] 1456 | }, 1457 | "qs@6.14.0": { 1458 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 1459 | "dependencies": [ 1460 | "side-channel" 1461 | ] 1462 | }, 1463 | "queue-microtask@1.2.3": { 1464 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 1465 | }, 1466 | "range-parser@1.2.1": { 1467 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1468 | }, 1469 | "raw-body@3.0.0": { 1470 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", 1471 | "dependencies": [ 1472 | "bytes", 1473 | "http-errors", 1474 | "iconv-lite@0.6.3", 1475 | "unpipe" 1476 | ] 1477 | }, 1478 | "rc@1.2.8": { 1479 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1480 | "dependencies": [ 1481 | "deep-extend", 1482 | "ini@1.3.8", 1483 | "minimist", 1484 | "strip-json-comments" 1485 | ] 1486 | }, 1487 | "rechoir@0.6.2": { 1488 | "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", 1489 | "dependencies": [ 1490 | "resolve" 1491 | ] 1492 | }, 1493 | "registry-auth-token@5.0.3": { 1494 | "integrity": "sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA==", 1495 | "dependencies": [ 1496 | "@pnpm/npm-conf" 1497 | ] 1498 | }, 1499 | "registry-url@6.0.1": { 1500 | "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", 1501 | "dependencies": [ 1502 | "rc" 1503 | ] 1504 | }, 1505 | "release-it@18.0.0": { 1506 | "integrity": "sha512-aO7sGBwv+0m8FXVNT+RyL1yky9Nhg0IxkqJIdofTma0Dz4w9z0+u5DddzesOoYQL2fawib3Kwn30DaLxqiz5ng==", 1507 | "dependencies": [ 1508 | "@iarna/toml", 1509 | "@octokit/rest", 1510 | "async-retry", 1511 | "chalk", 1512 | "ci-info", 1513 | "cosmiconfig", 1514 | "execa@9.5.2", 1515 | "git-url-parse", 1516 | "globby", 1517 | "inquirer", 1518 | "issue-parser", 1519 | "lodash", 1520 | "mime-types@2.1.35", 1521 | "new-github-release-url", 1522 | "open", 1523 | "ora", 1524 | "os-name", 1525 | "proxy-agent", 1526 | "semver", 1527 | "shelljs", 1528 | "undici", 1529 | "update-notifier", 1530 | "url-join", 1531 | "wildcard-match", 1532 | "yargs-parser" 1533 | ] 1534 | }, 1535 | "resolve-from@4.0.0": { 1536 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" 1537 | }, 1538 | "resolve@1.22.10": { 1539 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 1540 | "dependencies": [ 1541 | "is-core-module", 1542 | "path-parse", 1543 | "supports-preserve-symlinks-flag" 1544 | ] 1545 | }, 1546 | "restore-cursor@5.1.0": { 1547 | "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", 1548 | "dependencies": [ 1549 | "onetime@7.0.0", 1550 | "signal-exit" 1551 | ] 1552 | }, 1553 | "retry@0.13.1": { 1554 | "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" 1555 | }, 1556 | "reusify@1.0.4": { 1557 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 1558 | }, 1559 | "router@2.2.0": { 1560 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", 1561 | "dependencies": [ 1562 | "debug", 1563 | "depd", 1564 | "is-promise", 1565 | "parseurl", 1566 | "path-to-regexp" 1567 | ] 1568 | }, 1569 | "run-applescript@7.0.0": { 1570 | "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==" 1571 | }, 1572 | "run-async@3.0.0": { 1573 | "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==" 1574 | }, 1575 | "run-parallel@1.2.0": { 1576 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1577 | "dependencies": [ 1578 | "queue-microtask" 1579 | ] 1580 | }, 1581 | "rxjs@7.8.1": { 1582 | "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", 1583 | "dependencies": [ 1584 | "tslib" 1585 | ] 1586 | }, 1587 | "safe-buffer@5.2.1": { 1588 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1589 | }, 1590 | "safer-buffer@2.1.2": { 1591 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1592 | }, 1593 | "semver@7.6.3": { 1594 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" 1595 | }, 1596 | "send@1.2.0": { 1597 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", 1598 | "dependencies": [ 1599 | "debug", 1600 | "encodeurl", 1601 | "escape-html", 1602 | "etag", 1603 | "fresh", 1604 | "http-errors", 1605 | "mime-types@3.0.1", 1606 | "ms", 1607 | "on-finished", 1608 | "range-parser", 1609 | "statuses" 1610 | ] 1611 | }, 1612 | "serve-static@2.2.0": { 1613 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", 1614 | "dependencies": [ 1615 | "encodeurl", 1616 | "escape-html", 1617 | "parseurl", 1618 | "send" 1619 | ] 1620 | }, 1621 | "setprototypeof@1.2.0": { 1622 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1623 | }, 1624 | "shebang-command@2.0.0": { 1625 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1626 | "dependencies": [ 1627 | "shebang-regex" 1628 | ] 1629 | }, 1630 | "shebang-regex@3.0.0": { 1631 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 1632 | }, 1633 | "shelljs@0.8.5": { 1634 | "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", 1635 | "dependencies": [ 1636 | "glob", 1637 | "interpret", 1638 | "rechoir" 1639 | ] 1640 | }, 1641 | "side-channel-list@1.0.0": { 1642 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 1643 | "dependencies": [ 1644 | "es-errors", 1645 | "object-inspect" 1646 | ] 1647 | }, 1648 | "side-channel-map@1.0.1": { 1649 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 1650 | "dependencies": [ 1651 | "call-bound", 1652 | "es-errors", 1653 | "get-intrinsic", 1654 | "object-inspect" 1655 | ] 1656 | }, 1657 | "side-channel-weakmap@1.0.2": { 1658 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 1659 | "dependencies": [ 1660 | "call-bound", 1661 | "es-errors", 1662 | "get-intrinsic", 1663 | "object-inspect", 1664 | "side-channel-map" 1665 | ] 1666 | }, 1667 | "side-channel@1.1.0": { 1668 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 1669 | "dependencies": [ 1670 | "es-errors", 1671 | "object-inspect", 1672 | "side-channel-list", 1673 | "side-channel-map", 1674 | "side-channel-weakmap" 1675 | ] 1676 | }, 1677 | "signal-exit@4.1.0": { 1678 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" 1679 | }, 1680 | "slash@5.1.0": { 1681 | "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==" 1682 | }, 1683 | "smart-buffer@4.2.0": { 1684 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" 1685 | }, 1686 | "socks-proxy-agent@8.0.5": { 1687 | "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", 1688 | "dependencies": [ 1689 | "agent-base", 1690 | "debug", 1691 | "socks" 1692 | ] 1693 | }, 1694 | "socks@2.8.3": { 1695 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 1696 | "dependencies": [ 1697 | "ip-address", 1698 | "smart-buffer" 1699 | ] 1700 | }, 1701 | "source-map@0.6.1": { 1702 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1703 | }, 1704 | "sprintf-js@1.1.3": { 1705 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" 1706 | }, 1707 | "statuses@2.0.1": { 1708 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1709 | }, 1710 | "stdin-discarder@0.2.2": { 1711 | "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==" 1712 | }, 1713 | "string-width@4.2.3": { 1714 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1715 | "dependencies": [ 1716 | "emoji-regex@8.0.0", 1717 | "is-fullwidth-code-point", 1718 | "strip-ansi@6.0.1" 1719 | ] 1720 | }, 1721 | "string-width@7.2.0": { 1722 | "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", 1723 | "dependencies": [ 1724 | "emoji-regex@10.4.0", 1725 | "get-east-asian-width", 1726 | "strip-ansi@7.1.0" 1727 | ] 1728 | }, 1729 | "strip-ansi@6.0.1": { 1730 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1731 | "dependencies": [ 1732 | "ansi-regex@5.0.1" 1733 | ] 1734 | }, 1735 | "strip-ansi@7.1.0": { 1736 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1737 | "dependencies": [ 1738 | "ansi-regex@6.1.0" 1739 | ] 1740 | }, 1741 | "strip-final-newline@3.0.0": { 1742 | "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" 1743 | }, 1744 | "strip-final-newline@4.0.0": { 1745 | "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==" 1746 | }, 1747 | "strip-json-comments@2.0.1": { 1748 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" 1749 | }, 1750 | "stubborn-fs@1.2.5": { 1751 | "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==" 1752 | }, 1753 | "supports-preserve-symlinks-flag@1.0.0": { 1754 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" 1755 | }, 1756 | "tmp@0.0.33": { 1757 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1758 | "dependencies": [ 1759 | "os-tmpdir" 1760 | ] 1761 | }, 1762 | "to-regex-range@5.0.1": { 1763 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1764 | "dependencies": [ 1765 | "is-number" 1766 | ] 1767 | }, 1768 | "toidentifier@1.0.1": { 1769 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1770 | }, 1771 | "tslib@2.8.1": { 1772 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 1773 | }, 1774 | "type-fest@0.21.3": { 1775 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" 1776 | }, 1777 | "type-fest@2.19.0": { 1778 | "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" 1779 | }, 1780 | "type-fest@4.31.0": { 1781 | "integrity": "sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==" 1782 | }, 1783 | "type-is@2.0.1": { 1784 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", 1785 | "dependencies": [ 1786 | "content-type", 1787 | "media-typer", 1788 | "mime-types@3.0.1" 1789 | ] 1790 | }, 1791 | "undici-types@6.20.0": { 1792 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" 1793 | }, 1794 | "undici@6.21.0": { 1795 | "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==" 1796 | }, 1797 | "unicorn-magic@0.1.0": { 1798 | "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==" 1799 | }, 1800 | "unicorn-magic@0.3.0": { 1801 | "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==" 1802 | }, 1803 | "universal-user-agent@7.0.2": { 1804 | "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==" 1805 | }, 1806 | "unpipe@1.0.0": { 1807 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1808 | }, 1809 | "update-notifier@7.3.1": { 1810 | "integrity": "sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==", 1811 | "dependencies": [ 1812 | "boxen", 1813 | "chalk", 1814 | "configstore", 1815 | "is-in-ci", 1816 | "is-installed-globally", 1817 | "is-npm", 1818 | "latest-version", 1819 | "pupa", 1820 | "semver", 1821 | "xdg-basedir" 1822 | ] 1823 | }, 1824 | "url-join@5.0.0": { 1825 | "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==" 1826 | }, 1827 | "vary@1.1.2": { 1828 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1829 | }, 1830 | "when-exit@2.1.3": { 1831 | "integrity": "sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw==" 1832 | }, 1833 | "which@2.0.2": { 1834 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1835 | "dependencies": [ 1836 | "isexe" 1837 | ] 1838 | }, 1839 | "widest-line@5.0.0": { 1840 | "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", 1841 | "dependencies": [ 1842 | "string-width@7.2.0" 1843 | ] 1844 | }, 1845 | "wildcard-match@5.1.4": { 1846 | "integrity": "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g==" 1847 | }, 1848 | "windows-release@6.0.1": { 1849 | "integrity": "sha512-MS3BzG8QK33dAyqwxfYJCJ03arkwKaddUOvvnnlFdXLudflsQF6I8yAxrLBeQk4yO8wjdH/+ax0YzxJEDrOftg==", 1850 | "dependencies": [ 1851 | "execa@8.0.1" 1852 | ] 1853 | }, 1854 | "wrap-ansi@6.2.0": { 1855 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 1856 | "dependencies": [ 1857 | "ansi-styles@4.3.0", 1858 | "string-width@4.2.3", 1859 | "strip-ansi@6.0.1" 1860 | ] 1861 | }, 1862 | "wrap-ansi@9.0.0": { 1863 | "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", 1864 | "dependencies": [ 1865 | "ansi-styles@6.2.1", 1866 | "string-width@7.2.0", 1867 | "strip-ansi@7.1.0" 1868 | ] 1869 | }, 1870 | "wrappy@1.0.2": { 1871 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1872 | }, 1873 | "xdg-basedir@5.1.0": { 1874 | "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==" 1875 | }, 1876 | "yargs-parser@21.1.1": { 1877 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" 1878 | }, 1879 | "yoctocolors-cjs@2.1.2": { 1880 | "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==" 1881 | }, 1882 | "yoctocolors@2.1.1": { 1883 | "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==" 1884 | }, 1885 | "zod-to-json-schema@3.24.5_zod@3.24.1": { 1886 | "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", 1887 | "dependencies": [ 1888 | "zod" 1889 | ] 1890 | }, 1891 | "zod@3.24.1": { 1892 | "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==" 1893 | } 1894 | }, 1895 | "workspace": { 1896 | "dependencies": [ 1897 | "jsr:@std/assert@1", 1898 | "jsr:@std/cli@^1.0.9", 1899 | "jsr:@std/dotenv@~0.225.3", 1900 | "jsr:@std/fmt@^1.0.3", 1901 | "jsr:@std/fs@^1.0.8", 1902 | "jsr:@std/path@^1.0.8", 1903 | "npm:@modelcontextprotocol/sdk@^1.10.2", 1904 | "npm:zod@^3.24.1" 1905 | ] 1906 | } 1907 | } 1908 | -------------------------------------------------------------------------------- /entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | DENO_ARGS="--allow-net --allow-read --allow-env" 4 | APP_ARGS="" 5 | 6 | # Process all arguments 7 | for arg in "$@"; do 8 | if [ "$arg" = "--unsafe-net" ]; then 9 | DENO_ARGS="$DENO_ARGS --unsafely-ignore-certificate-errors" 10 | else 11 | APP_ARGS="$APP_ARGS $arg" 12 | fi 13 | done 14 | 15 | # Execute Deno with processed arguments 16 | exec deno run $DENO_ARGS src/mod.ts $APP_ARGS 17 | -------------------------------------------------------------------------------- /scripts/build.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from "@std/path"; 2 | import { z } from "zod"; 3 | 4 | const SDK_KEY = "@modelcontextprotocol/sdk"; 5 | 6 | const ConfigSchema = z.object({ 7 | version: z.string(), 8 | imports: z 9 | .object({ 10 | [SDK_KEY]: z.string(), 11 | }) 12 | .transform((value) => { 13 | const full = value[SDK_KEY]; 14 | const sdkVersionMatch = full.match(/\d+\.\d+\.\d+/); 15 | const sdkVersion = sdkVersionMatch ? sdkVersionMatch[0] : "unknown"; 16 | 17 | return sdkVersion; 18 | }), 19 | }); 20 | 21 | if (import.meta.main) { 22 | try { 23 | const path = resolve(import.meta.dirname!, "..", "deno.jsonc"); 24 | const entry = resolve(import.meta.dirname!, "..", "src", "mod.ts"); 25 | const config = JSON.parse(Deno.readTextFileSync(path)); 26 | const parsed = ConfigSchema.safeParse(config); 27 | 28 | if (!parsed.success) { 29 | console.error(`ERROR: ${parsed.error.errors}`); 30 | Deno.exit(5); 31 | } 32 | 33 | const command = new Deno.Command(Deno.execPath(), { 34 | args: [ 35 | "compile", 36 | "--allow-read", 37 | "--allow-net", 38 | "--allow-env", 39 | ...Deno.args, 40 | entry, 41 | `--build-sdk-version=${parsed.data.imports}`, 42 | `--build-app-version=${parsed.data.version}`, 43 | ], 44 | stdout: "inherit", 45 | stderr: "inherit", 46 | }); 47 | 48 | await command.output(); 49 | Deno.exit(0); 50 | } catch (error) { 51 | if (error instanceof Deno.errors.NotFound) { 52 | Deno.exit(5); 53 | } 54 | 55 | console.error("ERROR: ", error); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /scripts/dev.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from "@std/path"; 2 | 3 | async function compile() { 4 | const entry = resolve(import.meta.dirname!, "..", "src", "mod.ts"); 5 | const command = new Deno.Command(Deno.execPath(), { 6 | args: ["compile", "-A", "--output=build/mcp-server-drupal", entry], 7 | stdout: "inherit", 8 | stderr: "inherit", 9 | }); 10 | 11 | const { code } = await command.output(); 12 | 13 | if (code !== 0) { 14 | console.log("dev[ERROR]: ", code); 15 | } else { 16 | console.log("dev[INFO]: Compiled successfully"); 17 | } 18 | } 19 | 20 | if (import.meta.main) { 21 | const watcher = Deno.watchFs(resolve(import.meta.dirname!, "..", "src/")); 22 | console.log("\ndev[INFO]: Watching for changes..."); 23 | 24 | for await (const event of watcher) { 25 | if (["modify", "create", "remove"].includes(event.kind)) { 26 | console.log("dev[INFO]: Compiling"); 27 | await compile(); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/cli/args.ts: -------------------------------------------------------------------------------- 1 | import { parseArgs } from "@std/cli"; 2 | import { 3 | DRUPAL_URL_REQUIRED, 4 | HELP_MESSAGE, 5 | VERSION_FRAME, 6 | } from "./templates.ts"; 7 | 8 | const flags = parseArgs(Deno.args, { 9 | boolean: ["help", "version"], 10 | string: ["drupal-url", "build-sdk-version", "build-app-version"], 11 | default: { 12 | ["build-sdk-version"]: "dev", 13 | ["build-app-version"]: "dev", 14 | }, 15 | }); 16 | 17 | function setup() { 18 | if (flags.help) { 19 | console.info(HELP_MESSAGE); 20 | Deno.exit(0); 21 | } 22 | 23 | if (flags.version) { 24 | console.log( 25 | VERSION_FRAME(flags["build-app-version"]!, flags["build-sdk-version"]!) 26 | ); 27 | Deno.exit(0); 28 | } 29 | 30 | if (!flags["drupal-url"]) { 31 | console.error(DRUPAL_URL_REQUIRED); 32 | Deno.exit(1); 33 | } 34 | 35 | Deno.addSignalListener("SIGINT", () => { 36 | Deno.exit(0); 37 | }); 38 | } 39 | 40 | export { flags, setup }; 41 | -------------------------------------------------------------------------------- /src/cli/format.ts: -------------------------------------------------------------------------------- 1 | import { bold, green, red, yellow } from "@std/fmt/colors"; 2 | 3 | const Formatter = { 4 | error(err: unknown) { 5 | return `\n${bold(red("ERROR:"))} ${err}`; 6 | }, 7 | info(msg: string) { 8 | return `\n${bold(green("INFO:"))} ${msg}`; 9 | }, 10 | warning: (msg: string) => `\n${bold(yellow("WARNING:"))} ${msg}`, 11 | }; 12 | 13 | export { Formatter }; 14 | -------------------------------------------------------------------------------- /src/cli/templates.ts: -------------------------------------------------------------------------------- 1 | import { bold, cyan, yellow } from "@std/fmt/colors"; 2 | import { Formatter } from "./format.ts"; 3 | 4 | const HELP_MESSAGE = ` 5 | ${bold("Usage:")} ${yellow("mcp-server-drupal [OPTIONS]")} 6 | 7 | ${bold("Options:")} 8 | ${cyan("--drupal-url")} The URL of the Drupal site 9 | ${cyan("--version")} The version of the server 10 | 11 | ${bold(yellow("Drupal Module:"))} https://www.drupal.org/project/mcp 12 | ${bold(yellow("Docs:"))} https://mcp-77a54f.pages.drupalcode.org 13 | `; 14 | 15 | const DRUPAL_URL_REQUIRED = Formatter.error(`${cyan( 16 | "--drupal-url" 17 | )} is required, please provide the URL of the Drupal instance 18 | `); 19 | 20 | const VERSION_FRAME = (core: string, sdk: string) => ` 21 | MCP Server: ${yellow(core)} 22 | MCP SDK: ${yellow(sdk)} 23 | `; 24 | 25 | const AUTH_MESSAGES = { 26 | PREVENT_BOTH: Formatter.warning( 27 | `Both ${cyan("DRUPAL_AUTH_TOKEN")} and ${cyan( 28 | "DRUPAL_AUTH_USER" 29 | )} with ${cyan("DRUPAL_AUTH_PASSWORD")} are set. ${bold( 30 | yellow("Using token over user and pass.") 31 | )}` 32 | ), 33 | MISSING_PASSWORD: Formatter.error( 34 | `${cyan("DRUPAL_AUTH_PASSWORD")} is required when ${cyan( 35 | "DRUPAL_AUTH_USER" 36 | )} is set` 37 | ), 38 | MISSING_USERNAME: Formatter.error( 39 | `${cyan("DRUPAL_AUTH_USER")} is required when ${cyan( 40 | "DRUPAL_AUTH_PASS" 41 | )} is set` 42 | ), 43 | }; 44 | 45 | export { DRUPAL_URL_REQUIRED, HELP_MESSAGE, AUTH_MESSAGES, VERSION_FRAME }; 46 | -------------------------------------------------------------------------------- /src/drupal/auth.ts: -------------------------------------------------------------------------------- 1 | import { AUTH_MESSAGES } from "../cli/templates.ts"; 2 | 3 | const AUTH_ENV_VARS = { 4 | token: Deno.env.get("DRUPAL_AUTH_TOKEN"), 5 | user: Deno.env.get("DRUPAL_AUTH_USER"), 6 | pass: Deno.env.get("DRUPAL_AUTH_PASSWORD"), 7 | }; 8 | 9 | function validate(): void { 10 | if (AUTH_ENV_VARS.token && (AUTH_ENV_VARS.user || AUTH_ENV_VARS.pass)) { 11 | console.error(AUTH_MESSAGES.PREVENT_BOTH); 12 | } 13 | 14 | if (AUTH_ENV_VARS.user && !AUTH_ENV_VARS.pass) { 15 | console.error(AUTH_MESSAGES.MISSING_PASSWORD); 16 | Deno.exit(1); 17 | } 18 | 19 | if (AUTH_ENV_VARS.pass && !AUTH_ENV_VARS.user) { 20 | console.error(AUTH_MESSAGES.MISSING_USERNAME); 21 | Deno.exit(1); 22 | } 23 | } 24 | 25 | function header(): string { 26 | const prefix = "Basic "; 27 | 28 | if (AUTH_ENV_VARS.token) return prefix + btoa(AUTH_ENV_VARS.token); 29 | 30 | return prefix + btoa(`${AUTH_ENV_VARS.user}:${AUTH_ENV_VARS.pass}`); 31 | } 32 | 33 | function isEnabled(): boolean { 34 | return !!(AUTH_ENV_VARS.token || (AUTH_ENV_VARS.user && AUTH_ENV_VARS.pass)); 35 | } 36 | 37 | const Auth = { 38 | validate, 39 | header, 40 | isEnabled, 41 | }; 42 | 43 | export { Auth }; 44 | -------------------------------------------------------------------------------- /src/drupal/client.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Resource, 3 | ResourceTemplate, 4 | Tool, 5 | } from "@modelcontextprotocol/sdk/types.ts"; 6 | import { composeMCPEndpoint } from "./helpers.ts"; 7 | import { createJSONRPCClient } from "./json_rpc.ts"; 8 | 9 | enum MCPMethods { 10 | TOOLS = "tools/list", 11 | RESOURCES = "resources/list", 12 | TEMPLATES = "resources/templates/list", 13 | CALL = "tools/call", 14 | READ = "resources/read", 15 | } 16 | 17 | export type DrupalProxy = ReturnType; 18 | 19 | function createDrupalProxy(base: string, auth?: string) { 20 | const url = composeMCPEndpoint(base); 21 | const call = createJSONRPCClient(url, auth); 22 | 23 | return { 24 | async tools(): Promise { 25 | const data = await call<"tools", Tool[]>(MCPMethods.TOOLS); 26 | return data.result.tools; 27 | }, 28 | async resources(): Promise { 29 | const data = await call<"resources", Resource[]>(MCPMethods.RESOURCES); 30 | 31 | return data.result.resources; 32 | }, 33 | async templates(): Promise { 34 | const data = await call<"resourceTemplates", ResourceTemplate[]>( 35 | MCPMethods.TEMPLATES 36 | ); 37 | return data.result.resourceTemplates; 38 | }, 39 | async call(name: string, args?: Record) { 40 | const data = await call<"_", unknown>(MCPMethods.CALL, { 41 | name, 42 | arguments: args, 43 | }); 44 | return data.result; 45 | }, 46 | async read(params: Record) { 47 | const data = await call<"_", unknown>(MCPMethods.READ, params); 48 | return data.result; 49 | }, 50 | }; 51 | } 52 | 53 | export { createDrupalProxy }; 54 | -------------------------------------------------------------------------------- /src/drupal/helpers.ts: -------------------------------------------------------------------------------- 1 | const DRUPAL_MCP_SUFFIX = "mcp/post"; 2 | 3 | function composeMCPEndpoint(base: string) { 4 | if (base.endsWith("/")) { 5 | return `${base}${DRUPAL_MCP_SUFFIX}`; 6 | } 7 | 8 | return `${base}/${DRUPAL_MCP_SUFFIX}`; 9 | } 10 | 11 | export { composeMCPEndpoint }; 12 | -------------------------------------------------------------------------------- /src/drupal/json_rpc.ts: -------------------------------------------------------------------------------- 1 | import { Formatter } from "../cli/format.ts"; 2 | 3 | type JSONRPCResponse = { 4 | jsonrpc: string; 5 | id: string; 6 | result: { 7 | [key in K]: T; 8 | }; 9 | error: Record; 10 | }; 11 | 12 | function createJSONRPCClient(url: string, auth?: string) { 13 | const headers: Record = {}; 14 | 15 | if (auth) { 16 | headers["Authorization"] = auth; 17 | } 18 | 19 | function req( 20 | method: string, 21 | params?: Record 22 | ): Promise> { 23 | const request = new Request(url, { 24 | method: "POST", 25 | body: JSON.stringify({ 26 | jsonrpc: "2.0", 27 | id: Math.floor(Math.random() * Number.MAX_SAFE_INTEGER), 28 | method, 29 | params: params, 30 | }), 31 | headers: headers, 32 | }); 33 | 34 | return fetch(request) 35 | .then((response) => { 36 | return response.json(); 37 | }) 38 | .then((data) => { 39 | if (data.error) { 40 | let message = `Something went while executing the request: ${method}`; 41 | if (data.error.data) { 42 | message = data.error.data as string; 43 | } 44 | 45 | throw new Error(message); 46 | } 47 | 48 | return data; 49 | }) 50 | .catch((error) => { 51 | console.error(Formatter.error(error)); 52 | 53 | throw error; 54 | }); 55 | } 56 | 57 | return req; 58 | } 59 | 60 | export { createJSONRPCClient }; 61 | -------------------------------------------------------------------------------- /src/drupal/preflight.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ListResourcesRequestSchema, 3 | ListResourceTemplatesRequestSchema, 4 | ListToolsRequestSchema, 5 | } from "@modelcontextprotocol/sdk/types.js"; 6 | import { Formatter } from "../cli/format.ts"; 7 | import { DrupalProxy } from "./client.ts"; 8 | 9 | async function preflight(client: DrupalProxy) { 10 | try { 11 | const [tools, resources, templates] = await Promise.all([ 12 | client.tools(), 13 | client.resources(), 14 | client.templates(), 15 | ]); 16 | 17 | const available = [ 18 | { data: tools, key: "tools", schema: ListToolsRequestSchema }, 19 | { data: resources, key: "resources", schema: ListResourcesRequestSchema }, 20 | { 21 | data: templates, 22 | key: "resourceTemplates", 23 | schema: ListResourceTemplatesRequestSchema, 24 | }, 25 | ].filter(({ data }) => data.length); 26 | 27 | if (!available.length) { 28 | console.error( 29 | Formatter.error( 30 | "No available instruments were found during the preflight check" 31 | ) 32 | ); 33 | Deno.exit(1); 34 | } 35 | 36 | return available; 37 | } catch (error) { 38 | console.error(Formatter.error(error)); 39 | Deno.exit(1); 40 | } 41 | } 42 | 43 | export { preflight }; 44 | -------------------------------------------------------------------------------- /src/mod.ts: -------------------------------------------------------------------------------- 1 | import "@std/dotenv/load"; 2 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 3 | import { Server } from "./server.ts"; 4 | import { createDrupalProxy } from "./drupal/client.ts"; 5 | import { flags, setup } from "./cli/args.ts"; 6 | import { preflight } from "./drupal/preflight.ts"; 7 | import { 8 | CallToolRequestSchema, 9 | ReadResourceRequestSchema, 10 | } from "@modelcontextprotocol/sdk/types.js"; 11 | import { Formatter } from "./cli/format.ts"; 12 | import { Auth } from "./drupal/auth.ts"; 13 | 14 | if (import.meta.main) { 15 | setup(); 16 | Auth.validate(); 17 | 18 | const transport = new StdioServerTransport(); 19 | const auth = Auth.isEnabled() ? Auth.header() : undefined; 20 | const client = createDrupalProxy(flags["drupal-url"]!, auth); 21 | const instruments = await preflight(client); 22 | 23 | for (const { data, key, schema } of instruments) { 24 | // deno-lint-ignore require-await 25 | Server.setRequestHandler(schema, async () => { 26 | return { 27 | [key]: data, 28 | }; 29 | }); 30 | } 31 | 32 | Server.setRequestHandler(CallToolRequestSchema, async (request) => { 33 | return await client.call(request.params.name, request.params.arguments); 34 | }); 35 | 36 | Server.setRequestHandler(ReadResourceRequestSchema, async (request) => { 37 | return await client.read({ 38 | uri: request.params.uri, 39 | }); 40 | }); 41 | 42 | await Server.connect(transport) 43 | .then(() => { 44 | console.error(Formatter.info("Drupal MCP server is running on STDIO")); 45 | }) 46 | .catch((error) => { 47 | console.error(Formatter.error(error)); 48 | Deno.exit(1); 49 | }); 50 | } 51 | -------------------------------------------------------------------------------- /src/server.ts: -------------------------------------------------------------------------------- 1 | import { Server as MCPServer } from "@modelcontextprotocol/sdk/server/index.js"; 2 | import { flags } from "./cli/args.ts"; 3 | import { Formatter } from "./cli/format.ts"; 4 | 5 | const Server = new MCPServer( 6 | { 7 | name: "mcp-server-drupal", 8 | version: flags["build-app-version"]!, 9 | }, 10 | { 11 | capabilities: { 12 | tools: {}, 13 | resources: {}, 14 | }, 15 | }, 16 | ); 17 | 18 | Server.onerror = (error) => { 19 | console.error(Formatter.error(error)); 20 | }; 21 | 22 | Server.oninitialized = () => { 23 | console.error(Formatter.info("Initialization was successful")); 24 | }; 25 | 26 | export { Server }; 27 | --------------------------------------------------------------------------------