From bfae3f7a018b72b88dcefebd031b2e03a020b734 Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Thu, 28 Aug 2025 23:28:27 +0200 Subject: [PATCH 01/49] chore: bump dependencies to latest (#490) --- package-lock.json | 407 +++++++++++++++++++++++----------------------- package.json | 36 ++-- 2 files changed, 221 insertions(+), 222 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d9ac800d..89d966379 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,25 +9,24 @@ "version": "0.3.0", "license": "Apache-2.0", "dependencies": { - "@modelcontextprotocol/sdk": "^1.15.0", + "@modelcontextprotocol/sdk": "^1.17.4", "@mongodb-js/device-id": "^0.3.1", - "@mongodb-js/devtools-connect": "^3.9.2", - "@mongodb-js/devtools-proxy-support": "^0.5.1", + "@mongodb-js/devtools-connect": "^3.9.3", + "@mongodb-js/devtools-proxy-support": "^0.5.2", "@mongosh/arg-parser": "^3.14.0", - "@mongosh/service-provider-node-driver": "^3.10.2", + "@mongosh/service-provider-node-driver": "^3.12.0", "@vitest/eslint-plugin": "^1.3.4", "bson": "^6.10.4", "express": "^5.1.0", - "kerberos": "*", "lru-cache": "^11.1.0", - "mongodb": "^6.17.0", + "mongodb": "^6.19.0", "mongodb-connection-string-url": "^3.0.2", "mongodb-log-writer": "^2.4.1", "mongodb-redact": "^1.1.8", "mongodb-schema": "^12.6.2", "node-fetch": "^3.3.2", "node-machine-id": "1.1.12", - "oauth4webapi": "^3.6.0", + "oauth4webapi": "^3.8.0", "openapi-fetch": "^0.14.0", "yargs-parser": "^22.0.0", "zod": "^3.25.76" @@ -39,13 +38,13 @@ "@ai-sdk/azure": "^1.3.24", "@ai-sdk/google": "^1.2.22", "@ai-sdk/openai": "^1.3.23", - "@eslint/js": "^9.30.1", + "@eslint/js": "^9.34.0", "@modelcontextprotocol/inspector": "^0.16.5", "@mongodb-js/oidc-mock-provider": "^0.11.3", - "@redocly/cli": "^2.0.7", - "@types/express": "^5.0.1", + "@redocly/cli": "^2.0.8", + "@types/express": "^5.0.3", "@types/http-proxy": "^1.17.16", - "@types/node": "^24.0.12", + "@types/node": "^24.3.0", "@types/proper-lockfile": "^4.1.4", "@types/semver": "^7.7.0", "@types/simple-oauth2": "^5.0.7", @@ -53,24 +52,24 @@ "@vitest/coverage-v8": "^3.2.4", "ai": "^4.3.17", "duplexpair": "^1.0.2", - "eslint": "^9.30.1", - "eslint-config-prettier": "^10.1.5", - "eslint-plugin-prettier": "^5.5.1", + "eslint": "^9.34.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", "globals": "^16.3.0", "mongodb-runner": "^5.9.2", "ollama-ai-provider": "^1.2.0", "openapi-types": "^12.1.3", - "openapi-typescript": "^7.8.0", + "openapi-typescript": "^7.9.1", "prettier": "^3.6.2", "proper-lockfile": "^4.1.2", "semver": "^7.7.2", "simple-git": "^3.28.0", - "tsx": "^4.20.3", - "typescript": "^5.8.3", - "typescript-eslint": "^8.36.0", + "tsx": "^4.20.5", + "typescript": "^5.9.2", + "typescript-eslint": "^8.41.0", "uuid": "^11.1.0", "vitest": "^3.2.4", - "yaml": "^2.8.0" + "yaml": "^2.8.1" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >= 23.0.0" @@ -83,13 +82,13 @@ "extraneous": true }, "node_modules/@ai-sdk/azure": { - "version": "1.3.24", - "resolved": "https://registry.npmjs.org/@ai-sdk/azure/-/azure-1.3.24.tgz", - "integrity": "sha512-6zOG8mwmd8esSL/L9oYFZSyZWORRTxuG6on9A3RdPe7MRJ607Q6BWsuvul79kecbLf5xQ4bfP7LzXaBizsd8OA==", + "version": "1.3.25", + "resolved": "https://registry.npmjs.org/@ai-sdk/azure/-/azure-1.3.25.tgz", + "integrity": "sha512-cTME89A9UYrza0t5pbY9b80yYY02Q5ALQdB2WP3R7/Yl1PLwbFChx994Q3Un0G2XV5h3arlm4fZTViY10isjhQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@ai-sdk/openai": "1.3.23", + "@ai-sdk/openai": "1.3.24", "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8" }, @@ -118,9 +117,9 @@ } }, "node_modules/@ai-sdk/openai": { - "version": "1.3.23", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.3.23.tgz", - "integrity": "sha512-86U7rFp8yacUAOE/Jz8WbGcwMCqWvjK33wk5DXkfnAOEn3mx2r7tNSJdjukQFZbAK97VMXGPPHxF+aEARDXRXQ==", + "version": "1.3.24", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.3.24.tgz", + "integrity": "sha512-GYXnGJTHRTZc4gJMSmFRgEQudjqd4PUN0ZjQhPwOAYH1yOAvQoG/Ikqs+HyISRbLPCrhbZnPKCNHuRU4OfpW0Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1549,18 +1548,18 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -1627,9 +1626,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", - "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1648,12 +1647,12 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.1", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { @@ -2160,12 +2159,12 @@ "license": "Apache-2.0" }, "node_modules/@mongodb-js/devtools-connect": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.9.2.tgz", - "integrity": "sha512-nuWKXYTUhe/jZ561Nn4LQHlpo6GjanUZLDtklWTaGE1dboUspJRYHAeHF+wVVvccdjpAx47Vll9mDcameG8k7w==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.9.3.tgz", + "integrity": "sha512-qlvjgzZeIJQgF+C2D+T5zOfsat62vp/hgoib+gJrU5JcThN8Hbq9ZQaE9f5/mUg3DKW1R9VvdrzcCn2NEZRvKA==", "license": "Apache-2.0", "dependencies": { - "@mongodb-js/devtools-proxy-support": "^0.5.1", + "@mongodb-js/devtools-proxy-support": "^0.5.2", "@mongodb-js/oidc-http-server-pages": "1.1.6", "lodash.merge": "^4.6.2", "mongodb-connection-string-url": "^3.0.0", @@ -2184,9 +2183,9 @@ } }, "node_modules/@mongodb-js/devtools-proxy-support": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-proxy-support/-/devtools-proxy-support-0.5.1.tgz", - "integrity": "sha512-snIekrl3yj6fPnk6UfTIrBj8Wt43hvjqf7XhGaw1Qcn55BOClE7FgXcJjLXOIDsEMuzdGtLnJji+GbW2uD2ulg==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-proxy-support/-/devtools-proxy-support-0.5.2.tgz", + "integrity": "sha512-3zp/5Ui8ci8EK2pNZ+YKc73L8bPCIP0tkJNMCpsM3P9/I9L9woTpJtGGlS3GtwL1caOypeKc6pibDqQzkjQFCA==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/socksv5": "^0.0.10", @@ -4274,9 +4273,9 @@ } }, "node_modules/@redocly/cli": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@redocly/cli/-/cli-2.0.7.tgz", - "integrity": "sha512-n4r3spiDwNetQ1TmIKaiIUO4d5rXhbzmz1PgOpupYIo6XmE7LQvrX5ncG0qhP6Wl6rKdLoyQZ1bOwbRz2ce3qg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@redocly/cli/-/cli-2.0.8.tgz", + "integrity": "sha512-FWBhB2hvF8rXWViCVgbKT3AmQH9ChRDNCmN3SyLRaL0GQ5SLi10p9rV26/7GktcMAKetM9XC4ETQQJMup3CVQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4284,8 +4283,8 @@ "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-trace-node": "2.0.1", "@opentelemetry/semantic-conventions": "1.34.0", - "@redocly/openapi-core": "2.0.7", - "@redocly/respect-core": "2.0.7", + "@redocly/openapi-core": "2.0.8", + "@redocly/respect-core": "2.0.8", "abort-controller": "^3.0.0", "chokidar": "^3.5.1", "colorette": "^1.2.0", @@ -4317,9 +4316,9 @@ } }, "node_modules/@redocly/cli/node_modules/@redocly/config": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.28.0.tgz", - "integrity": "sha512-IdY4bSX9bbjXkDX91oO1OVwCzB00UNF0ozoygacTpS5Exa3ewYCB/6BcbA0tGCAvKDIwSY9Jor2cWQ/ycQfBTg==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.29.0.tgz", + "integrity": "sha512-AkP1Berx9GvD15aN6r0IcOo289ElHp52XgeFTxXCumJ4gaUXUmvzqfZTfFFJWDaGgZvUZvmQrs1UdaPjZEXeHA==", "dev": true, "license": "MIT", "dependencies": { @@ -4327,14 +4326,14 @@ } }, "node_modules/@redocly/cli/node_modules/@redocly/openapi-core": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.0.7.tgz", - "integrity": "sha512-OKSqhvJXPu2s4s6xB5ykUYXvAuQNubZcexd9AEdWse6dz8Ke3EqCmMEuAZkpFWaiunBReu7Wam8kE0vh4CrLBg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.0.8.tgz", + "integrity": "sha512-ShnpeEgcQY0YxopFDH/m94PWiHgCuWGa9FIcHchdHMZGA0mgV/Eojhi46A/hi2KP7TaVsgZc6+8u7GxTTeTC5g==", "dev": true, "license": "MIT", "dependencies": { "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.28.0", + "@redocly/config": "^0.29.0", "ajv-formats": "^2.1.1", "colorette": "^1.2.0", "js-levenshtein": "^1.1.6", @@ -4372,9 +4371,9 @@ "license": "MIT" }, "node_modules/@redocly/openapi-core": { - "version": "1.34.4", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.4.tgz", - "integrity": "sha512-hf53xEgpXIgWl3b275PgZU3OTpYh1RoD2LHdIfQ1JzBNTWsiNKczTEsI/4Tmh2N1oq9YcphhSMyk3lDh85oDjg==", + "version": "1.34.5", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.5.tgz", + "integrity": "sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==", "dev": true, "license": "MIT", "dependencies": { @@ -4394,16 +4393,16 @@ } }, "node_modules/@redocly/respect-core": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@redocly/respect-core/-/respect-core-2.0.7.tgz", - "integrity": "sha512-a3zY4baRzhdgCdcBdzSKJzHmq8JudniSjEyX/mgwZrq8IWcCyQ7RlgBmtnT1cXp0ebq59Mh8UGp3Ec7gUo/NWg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@redocly/respect-core/-/respect-core-2.0.8.tgz", + "integrity": "sha512-gKOjUn/UmoHYIDKHV7RanAvFkhQIgQh9oiA3qfYHMI/N4+tWGoJd03Soc+2bn3Zie8DTXjKwQIy0k5n2kZA7hw==", "dev": true, "license": "MIT", "dependencies": { "@faker-js/faker": "^7.6.0", "@noble/hashes": "^1.8.0", "@redocly/ajv": "8.11.2", - "@redocly/openapi-core": "2.0.7", + "@redocly/openapi-core": "2.0.8", "better-ajv-errors": "^1.2.0", "colorette": "^2.0.20", "jest-diff": "^29.3.1", @@ -4419,9 +4418,9 @@ } }, "node_modules/@redocly/respect-core/node_modules/@redocly/config": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.28.0.tgz", - "integrity": "sha512-IdY4bSX9bbjXkDX91oO1OVwCzB00UNF0ozoygacTpS5Exa3ewYCB/6BcbA0tGCAvKDIwSY9Jor2cWQ/ycQfBTg==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.29.0.tgz", + "integrity": "sha512-AkP1Berx9GvD15aN6r0IcOo289ElHp52XgeFTxXCumJ4gaUXUmvzqfZTfFFJWDaGgZvUZvmQrs1UdaPjZEXeHA==", "dev": true, "license": "MIT", "dependencies": { @@ -4429,14 +4428,14 @@ } }, "node_modules/@redocly/respect-core/node_modules/@redocly/openapi-core": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.0.7.tgz", - "integrity": "sha512-OKSqhvJXPu2s4s6xB5ykUYXvAuQNubZcexd9AEdWse6dz8Ke3EqCmMEuAZkpFWaiunBReu7Wam8kE0vh4CrLBg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.0.8.tgz", + "integrity": "sha512-ShnpeEgcQY0YxopFDH/m94PWiHgCuWGa9FIcHchdHMZGA0mgV/Eojhi46A/hi2KP7TaVsgZc6+8u7GxTTeTC5g==", "dev": true, "license": "MIT", "dependencies": { "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.28.0", + "@redocly/config": "^0.29.0", "ajv-formats": "^2.1.1", "colorette": "^1.2.0", "js-levenshtein": "^1.1.6", @@ -5488,13 +5487,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz", - "integrity": "sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~7.10.0" } }, "node_modules/@types/proper-lockfile": { @@ -5603,17 +5602,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", - "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz", + "integrity": "sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/type-utils": "8.38.0", - "@typescript-eslint/utils": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/type-utils": "8.41.0", + "@typescript-eslint/utils": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -5627,9 +5626,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.38.0", + "@typescript-eslint/parser": "^8.41.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -5643,16 +5642,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", - "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.41.0.tgz", + "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0", "debug": "^4.3.4" }, "engines": { @@ -5664,17 +5663,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", - "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", + "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.38.0", - "@typescript-eslint/types": "^8.38.0", + "@typescript-eslint/tsconfig-utils": "^8.41.0", + "@typescript-eslint/types": "^8.41.0", "debug": "^4.3.4" }, "engines": { @@ -5685,17 +5684,17 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", - "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", + "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0" + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5706,9 +5705,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", - "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", + "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5718,19 +5717,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", - "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz", + "integrity": "sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/utils": "8.38.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0", + "@typescript-eslint/utils": "8.41.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -5743,13 +5742,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", - "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", + "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5760,15 +5759,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", - "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", + "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.38.0", - "@typescript-eslint/tsconfig-utils": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/project-service": "8.41.0", + "@typescript-eslint/tsconfig-utils": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -5784,7 +5783,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { @@ -5803,15 +5802,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", - "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", + "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0" + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5822,16 +5821,16 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", - "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", + "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/types": "8.41.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -6083,9 +6082,9 @@ } }, "node_modules/ai": { - "version": "4.3.17", - "resolved": "https://registry.npmjs.org/ai/-/ai-4.3.17.tgz", - "integrity": "sha512-uWqIQ94Nb1GTYtYElGHegJMOzv3r2mCKNFlKrqkft9xrfvIahTI5OdcnD5U9612RFGuUNGmSDTO1/YRNFXobaQ==", + "version": "4.3.19", + "resolved": "https://registry.npmjs.org/ai/-/ai-4.3.19.tgz", + "integrity": "sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7789,19 +7788,19 @@ } }, "node_modules/eslint": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", - "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.31.0", - "@eslint/plugin-kit": "^0.3.1", + "@eslint/js": "9.34.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -7849,9 +7848,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz", - "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { @@ -7865,9 +7864,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.3.tgz", - "integrity": "sha512-NAdMYww51ehKfDyDhv59/eIItUVzU0Io9H2E8nHNGKEeeqlnci+1gCvrHib6EmZdf6GxF+LCV5K7UC65Ezvw7w==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, "license": "MIT", "dependencies": { @@ -8088,9 +8087,9 @@ } }, "node_modules/eventsource-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", - "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.5.tgz", + "integrity": "sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==", "license": "MIT", "engines": { "node": ">=20.0.0" @@ -8269,9 +8268,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { @@ -9565,9 +9564,9 @@ } }, "node_modules/jsondiffpatch/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", + "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", "dev": true, "license": "MIT", "engines": { @@ -10103,9 +10102,9 @@ } }, "node_modules/mongodb": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.18.0.tgz", - "integrity": "sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.19.0.tgz", + "integrity": "sha512-H3GtYujOJdeKIMLKBT9PwlDhGrQfplABNF1G904w6r5ZXKWyv77aB0X9B+rhmaAwjtllHzaEkvi9mkGVZxs2Bw==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.1.9", @@ -10121,7 +10120,7 @@ "gcp-metadata": "^5.2.0", "kerberos": "^2.0.1", "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", + "snappy": "^7.3.2", "socks": "^2.7.1" }, "peerDependenciesMeta": { @@ -10715,9 +10714,9 @@ } }, "node_modules/oauth4webapi": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.7.0.tgz", - "integrity": "sha512-Q52wTPUWPsVLVVmTViXPQFMW2h2xv2jnDGxypjpelCFKaOjLsm7AxYuOk1oQgFm95VNDbuggasu9htXrz6XwKw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.0.tgz", + "integrity": "sha512-RSu64fjsBIs6D7s9g5LOCnOohOkI0nnPtlIp/4rrHj2Vb8jGepq+fujkv2Srw4tuw9qa02aETXQzyQUle8nfnQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -10900,17 +10899,17 @@ "license": "MIT" }, "node_modules/openapi-typescript": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.8.0.tgz", - "integrity": "sha512-1EeVWmDzi16A+siQlo/SwSGIT7HwaFAVjvMA7/jG5HMLSnrUOzPL7uSTRZZa4v/LCRxHTApHKtNY6glApEoiUQ==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.9.1.tgz", + "integrity": "sha512-9gJtoY04mk6iPMbToPjPxEAtfXZ0dTsMZtsgUI8YZta0btPPig9DJFP4jlerQD/7QOwYgb0tl+zLUpDf7vb7VA==", "dev": true, "license": "MIT", "dependencies": { - "@redocly/openapi-core": "^1.34.3", + "@redocly/openapi-core": "^1.34.5", "ansi-colors": "^4.1.3", "change-case": "^5.4.4", "parse-json": "^8.3.0", - "supports-color": "^10.0.0", + "supports-color": "^10.1.0", "yargs-parser": "^21.1.1" }, "bin": { @@ -10927,9 +10926,9 @@ "license": "MIT" }, "node_modules/openapi-typescript/node_modules/supports-color": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.0.0.tgz", - "integrity": "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.0.tgz", + "integrity": "sha512-5eG9FQjEjDbAlI5+kdpdyPIBMRH4GfTVDGREVupaZHmVoppknhM29b/S9BkQz7cathp85BVgRi/As3Siln7e0Q==", "dev": true, "license": "MIT", "engines": { @@ -12691,9 +12690,9 @@ "license": "BSD-3-Clause" }, "node_modules/ssh2": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", - "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz", + "integrity": "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==", "hasInstallScript": true, "dependencies": { "asn1": "^0.2.6", @@ -12704,7 +12703,7 @@ }, "optionalDependencies": { "cpu-features": "~0.0.10", - "nan": "^2.20.0" + "nan": "^2.23.0" } }, "node_modules/stackback": { @@ -13016,9 +13015,9 @@ } }, "node_modules/swr": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz", - "integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", + "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", "dev": true, "license": "MIT", "dependencies": { @@ -13521,9 +13520,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", - "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", + "version": "4.20.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", + "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", "dev": true, "license": "MIT", "dependencies": { @@ -13614,9 +13613,9 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -13627,16 +13626,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz", - "integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.41.0.tgz", + "integrity": "sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.38.0", - "@typescript-eslint/parser": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/utils": "8.38.0" + "@typescript-eslint/eslint-plugin": "8.41.0", + "@typescript-eslint/parser": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0", + "@typescript-eslint/utils": "8.41.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -13647,7 +13646,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/uglify-js": { @@ -13686,9 +13685,9 @@ } }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "dev": true, "license": "MIT" }, @@ -14305,9 +14304,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, "license": "ISC", "bin": { diff --git a/package.json b/package.json index e26add686..67fbb68b8 100644 --- a/package.json +++ b/package.json @@ -61,13 +61,13 @@ "@ai-sdk/azure": "^1.3.24", "@ai-sdk/google": "^1.2.22", "@ai-sdk/openai": "^1.3.23", - "@eslint/js": "^9.30.1", + "@eslint/js": "^9.34.0", "@modelcontextprotocol/inspector": "^0.16.5", "@mongodb-js/oidc-mock-provider": "^0.11.3", - "@redocly/cli": "^2.0.7", - "@types/express": "^5.0.1", + "@redocly/cli": "^2.0.8", + "@types/express": "^5.0.3", "@types/http-proxy": "^1.17.16", - "@types/node": "^24.0.12", + "@types/node": "^24.3.0", "@types/proper-lockfile": "^4.1.4", "@types/semver": "^7.7.0", "@types/simple-oauth2": "^5.0.7", @@ -75,44 +75,44 @@ "@vitest/coverage-v8": "^3.2.4", "ai": "^4.3.17", "duplexpair": "^1.0.2", - "eslint": "^9.30.1", - "eslint-config-prettier": "^10.1.5", - "eslint-plugin-prettier": "^5.5.1", + "eslint": "^9.34.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", "globals": "^16.3.0", "mongodb-runner": "^5.9.2", "ollama-ai-provider": "^1.2.0", "openapi-types": "^12.1.3", - "openapi-typescript": "^7.8.0", + "openapi-typescript": "^7.9.1", "prettier": "^3.6.2", "proper-lockfile": "^4.1.2", "semver": "^7.7.2", "simple-git": "^3.28.0", - "tsx": "^4.20.3", - "typescript": "^5.8.3", - "typescript-eslint": "^8.36.0", + "tsx": "^4.20.5", + "typescript": "^5.9.2", + "typescript-eslint": "^8.41.0", "uuid": "^11.1.0", "vitest": "^3.2.4", - "yaml": "^2.8.0" + "yaml": "^2.8.1" }, "dependencies": { - "@modelcontextprotocol/sdk": "^1.15.0", + "@modelcontextprotocol/sdk": "^1.17.4", "@mongodb-js/device-id": "^0.3.1", - "@mongodb-js/devtools-connect": "^3.9.2", - "@mongodb-js/devtools-proxy-support": "^0.5.1", + "@mongodb-js/devtools-connect": "^3.9.3", + "@mongodb-js/devtools-proxy-support": "^0.5.2", "@mongosh/arg-parser": "^3.14.0", - "@mongosh/service-provider-node-driver": "^3.10.2", + "@mongosh/service-provider-node-driver": "^3.12.0", "@vitest/eslint-plugin": "^1.3.4", "bson": "^6.10.4", "express": "^5.1.0", "lru-cache": "^11.1.0", - "mongodb": "^6.17.0", + "mongodb": "^6.19.0", "mongodb-connection-string-url": "^3.0.2", "mongodb-log-writer": "^2.4.1", "mongodb-redact": "^1.1.8", "mongodb-schema": "^12.6.2", "node-fetch": "^3.3.2", "node-machine-id": "1.1.12", - "oauth4webapi": "^3.6.0", + "oauth4webapi": "^3.8.0", "openapi-fetch": "^0.14.0", "yargs-parser": "^22.0.0", "zod": "^3.25.76" From 1ae7f5ec5791924af8281be03f7f753beea49d89 Mon Sep 17 00:00:00 2001 From: Himanshu Singh Date: Fri, 29 Aug 2025 12:31:37 +0200 Subject: [PATCH 02/49] chore: allows ConnectionManager to be injected via TransportRunner MCP-131 (#481) --- eslint-rules/no-config-imports.js | 4 + src/common/connectionManager.ts | 155 ++++++++++++------ src/common/session.ts | 8 +- src/index.ts | 7 +- src/lib.ts | 15 +- src/transports/base.ts | 14 +- src/transports/stdio.ts | 22 ++- src/transports/streamableHttp.ts | 24 +-- tests/integration/build.test.ts | 19 ++- .../common/connectionManager.oidc.test.ts | 9 +- .../common/connectionManager.test.ts | 18 +- tests/integration/helpers.ts | 6 +- tests/integration/telemetry.test.ts | 4 +- .../transports/streamableHttp.test.ts | 9 +- tests/unit/common/session.test.ts | 4 +- tests/unit/resources/common/debug.test.ts | 4 +- 16 files changed, 203 insertions(+), 119 deletions(-) diff --git a/eslint-rules/no-config-imports.js b/eslint-rules/no-config-imports.js index 908dd5ae7..5c4efb7cb 100644 --- a/eslint-rules/no-config-imports.js +++ b/eslint-rules/no-config-imports.js @@ -10,6 +10,10 @@ const allowedConfigValueImportFiles = [ "src/index.ts", // Config resource definition that works with the some config values "src/resources/common/config.ts", + // The file exports, a factory function to create MCPConnectionManager and + // it relies on driver options generator and default driver options from + // config file. + "src/common/connectionManager.ts", ]; // Ref: https://eslint.org/docs/latest/extend/custom-rules diff --git a/src/common/connectionManager.ts b/src/common/connectionManager.ts index edb0b56ea..78e51edbc 100644 --- a/src/common/connectionManager.ts +++ b/src/common/connectionManager.ts @@ -1,17 +1,14 @@ -import type { UserConfig, DriverOptions } from "./config.js"; -import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver"; -import EventEmitter from "events"; -import { setAppNameParamIfMissing } from "../helpers/connectionOptions.js"; -import { packageInfo } from "./packageInfo.js"; -import ConnectionString from "mongodb-connection-string-url"; +import { EventEmitter } from "events"; import type { MongoClientOptions } from "mongodb"; -import { ErrorCodes, MongoDBError } from "./errors.js"; +import ConnectionString from "mongodb-connection-string-url"; +import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver"; +import { type ConnectionInfo, generateConnectionInfoFromCliArgs } from "@mongosh/arg-parser"; import type { DeviceId } from "../helpers/deviceId.js"; -import type { AppNameComponents } from "../helpers/connectionOptions.js"; -import type { CompositeLogger } from "./logger.js"; -import { LogId } from "./logger.js"; -import type { ConnectionInfo } from "@mongosh/arg-parser"; -import { generateConnectionInfoFromCliArgs } from "@mongosh/arg-parser"; +import { defaultDriverOptions, setupDriverConfig, type DriverOptions, type UserConfig } from "./config.js"; +import { MongoDBError, ErrorCodes } from "./errors.js"; +import { type LoggerBase, LogId } from "./logger.js"; +import { packageInfo } from "./packageInfo.js"; +import { type AppNameComponents, setAppNameParamIfMissing } from "../helpers/connectionOptions.js"; export interface AtlasClusterConnectionInfo { username: string; @@ -71,39 +68,76 @@ export interface ConnectionManagerEvents { "connection-error": [ConnectionStateErrored]; } -export class ConnectionManager extends EventEmitter { +/** + * For a few tests, we need the changeState method to force a connection state + * which is we have this type to typecast the actual ConnectionManager with + * public changeState (only to make TS happy). + */ +export type TestConnectionManager = ConnectionManager & { + changeState( + event: Event, + newState: State + ): State; +}; + +export abstract class ConnectionManager { + protected clientName: string; + protected readonly _events; + readonly events: Pick, "on" | "off" | "once">; private state: AnyConnectionState; + + constructor() { + this.clientName = "unknown"; + this.events = this._events = new EventEmitter(); + this.state = { tag: "disconnected" }; + } + + get currentConnectionState(): AnyConnectionState { + return this.state; + } + + protected changeState( + event: Event, + newState: State + ): State { + this.state = newState; + // TypeScript doesn't seem to be happy with the spread operator and generics + // eslint-disable-next-line + this._events.emit(event, ...([newState] as any)); + return newState; + } + + setClientName(clientName: string): void { + this.clientName = clientName; + } + + abstract connect(settings: ConnectionSettings): Promise; + + abstract disconnect(): Promise; +} + +export class MCPConnectionManager extends ConnectionManager { private deviceId: DeviceId; - private clientName: string; private bus: EventEmitter; constructor( private userConfig: UserConfig, private driverOptions: DriverOptions, - private logger: CompositeLogger, + private logger: LoggerBase, deviceId: DeviceId, bus?: EventEmitter ) { super(); - this.bus = bus ?? new EventEmitter(); - this.state = { tag: "disconnected" }; - this.bus.on("mongodb-oidc-plugin:auth-failed", this.onOidcAuthFailed.bind(this)); this.bus.on("mongodb-oidc-plugin:auth-succeeded", this.onOidcAuthSucceeded.bind(this)); - this.deviceId = deviceId; - this.clientName = "unknown"; - } - - setClientName(clientName: string): void { - this.clientName = clientName; } async connect(settings: ConnectionSettings): Promise { - this.emit("connection-request", this.state); + this._events.emit("connection-request", this.currentConnectionState); - if (this.state.tag === "connected" || this.state.tag === "connecting") { + if (this.currentConnectionState.tag === "connected" || this.currentConnectionState.tag === "connecting") { await this.disconnect(); } @@ -138,7 +172,7 @@ export class ConnectionManager extends EventEmitter { connectionInfo.driverOptions.proxy ??= { useEnvironmentVariableProxies: true }; connectionInfo.driverOptions.applyProxyToOIDC ??= true; - connectionStringAuthType = ConnectionManager.inferConnectionTypeFromSettings( + connectionStringAuthType = MCPConnectionManager.inferConnectionTypeFromSettings( this.userConfig, connectionInfo ); @@ -165,7 +199,10 @@ export class ConnectionManager extends EventEmitter { } try { - const connectionType = ConnectionManager.inferConnectionTypeFromSettings(this.userConfig, connectionInfo); + const connectionType = MCPConnectionManager.inferConnectionTypeFromSettings( + this.userConfig, + connectionInfo + ); if (connectionType.startsWith("oidc")) { void this.pingAndForget(serviceProvider); @@ -199,13 +236,13 @@ export class ConnectionManager extends EventEmitter { } async disconnect(): Promise { - if (this.state.tag === "disconnected" || this.state.tag === "errored") { - return this.state; + if (this.currentConnectionState.tag === "disconnected" || this.currentConnectionState.tag === "errored") { + return this.currentConnectionState; } - if (this.state.tag === "connected" || this.state.tag === "connecting") { + if (this.currentConnectionState.tag === "connected" || this.currentConnectionState.tag === "connecting") { try { - await this.state.serviceProvider?.close(true); + await this.currentConnectionState.serviceProvider?.close(true); } finally { this.changeState("connection-close", { tag: "disconnected", @@ -216,30 +253,21 @@ export class ConnectionManager extends EventEmitter { return { tag: "disconnected" }; } - get currentConnectionState(): AnyConnectionState { - return this.state; - } - - changeState( - event: Event, - newState: State - ): State { - this.state = newState; - // TypeScript doesn't seem to be happy with the spread operator and generics - // eslint-disable-next-line - this.emit(event, ...([newState] as any)); - return newState; - } - private onOidcAuthFailed(error: unknown): void { - if (this.state.tag === "connecting" && this.state.connectionStringAuthType?.startsWith("oidc")) { + if ( + this.currentConnectionState.tag === "connecting" && + this.currentConnectionState.connectionStringAuthType?.startsWith("oidc") + ) { void this.disconnectOnOidcError(error); } } private onOidcAuthSucceeded(): void { - if (this.state.tag === "connecting" && this.state.connectionStringAuthType?.startsWith("oidc")) { - this.changeState("connection-success", { ...this.state, tag: "connected" }); + if ( + this.currentConnectionState.tag === "connecting" && + this.currentConnectionState.connectionStringAuthType?.startsWith("oidc") + ) { + this.changeState("connection-success", { ...this.currentConnectionState, tag: "connected" }); } this.logger.info({ @@ -250,9 +278,12 @@ export class ConnectionManager extends EventEmitter { } private onOidcNotifyDeviceFlow(flowInfo: { verificationUrl: string; userCode: string }): void { - if (this.state.tag === "connecting" && this.state.connectionStringAuthType?.startsWith("oidc")) { + if ( + this.currentConnectionState.tag === "connecting" && + this.currentConnectionState.connectionStringAuthType?.startsWith("oidc") + ) { this.changeState("connection-request", { - ...this.state, + ...this.currentConnectionState, tag: "connecting", connectionStringAuthType: "oidc-device-flow", oidcLoginUrl: flowInfo.verificationUrl, @@ -329,3 +360,23 @@ export class ConnectionManager extends EventEmitter { } } } + +/** + * Consumers of MCP server library have option to bring their own connection + * management if they need to. To support that, we enable injecting connection + * manager implementation through a factory function. + */ +export type ConnectionManagerFactoryFn = (createParams: { + logger: LoggerBase; + deviceId: DeviceId; + userConfig: UserConfig; +}) => Promise; + +export const createMCPConnectionManager: ConnectionManagerFactoryFn = ({ logger, deviceId, userConfig }) => { + const driverOptions = setupDriverConfig({ + config: userConfig, + defaults: defaultDriverOptions, + }); + + return Promise.resolve(new MCPConnectionManager(userConfig, driverOptions, logger, deviceId)); +}; diff --git a/src/common/session.ts b/src/common/session.ts index 87113894c..c1f7b5a12 100644 --- a/src/common/session.ts +++ b/src/common/session.ts @@ -67,10 +67,10 @@ export class Session extends EventEmitter { this.apiClient = new ApiClient({ baseUrl: apiBaseUrl, credentials }, logger); this.exportsManager = exportsManager; this.connectionManager = connectionManager; - this.connectionManager.on("connection-success", () => this.emit("connect")); - this.connectionManager.on("connection-time-out", (error) => this.emit("connection-error", error)); - this.connectionManager.on("connection-close", () => this.emit("disconnect")); - this.connectionManager.on("connection-error", (error) => this.emit("connection-error", error)); + this.connectionManager.events.on("connection-success", () => this.emit("connect")); + this.connectionManager.events.on("connection-time-out", (error) => this.emit("connection-error", error)); + this.connectionManager.events.on("connection-close", () => this.emit("disconnect")); + this.connectionManager.events.on("connection-error", (error) => this.emit("connection-error", error)); } setMcpClient(mcpClient: Implementation | undefined): void { diff --git a/src/index.ts b/src/index.ts index b1ac4b489..6a7150e35 100644 --- a/src/index.ts +++ b/src/index.ts @@ -36,7 +36,7 @@ function enableFipsIfRequested(): void { enableFipsIfRequested(); import { ConsoleLogger, LogId } from "./common/logger.js"; -import { config, driverOptions } from "./common/config.js"; +import { config } from "./common/config.js"; import crypto from "crypto"; import { packageInfo } from "./common/packageInfo.js"; import { StdioRunner } from "./transports/stdio.js"; @@ -49,10 +49,7 @@ async function main(): Promise { assertHelpMode(); assertVersionMode(); - const transportRunner = - config.transport === "stdio" - ? new StdioRunner(config, driverOptions) - : new StreamableHttpRunner(config, driverOptions); + const transportRunner = config.transport === "stdio" ? new StdioRunner(config) : new StreamableHttpRunner(config); const shutdown = (): void => { transportRunner.logger.info({ id: LogId.serverCloseRequested, diff --git a/src/lib.ts b/src/lib.ts index 9fd921e4c..01dc8b887 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,7 +1,14 @@ export { Server, type ServerOptions } from "./server.js"; -export { Telemetry } from "./telemetry/telemetry.js"; export { Session, type SessionOptions } from "./common/session.js"; -export { type UserConfig, defaultUserConfig } from "./common/config.js"; +export { defaultUserConfig, type UserConfig } from "./common/config.js"; +export { LoggerBase, type LogPayload, type LoggerType, type LogLevel } from "./common/logger.js"; export { StreamableHttpRunner } from "./transports/streamableHttp.js"; -export { LoggerBase } from "./common/logger.js"; -export type { LogPayload, LoggerType, LogLevel } from "./common/logger.js"; +export { + ConnectionManager, + type AnyConnectionState, + type ConnectionState, + type ConnectionStateDisconnected, + type ConnectionStateErrored, + type ConnectionManagerFactoryFn, +} from "./common/connectionManager.js"; +export { Telemetry } from "./telemetry/telemetry.js"; diff --git a/src/transports/base.ts b/src/transports/base.ts index 485752e7b..d6fc53adc 100644 --- a/src/transports/base.ts +++ b/src/transports/base.ts @@ -1,4 +1,4 @@ -import type { DriverOptions, UserConfig } from "../common/config.js"; +import type { UserConfig } from "../common/config.js"; import { packageInfo } from "../common/packageInfo.js"; import { Server } from "../server.js"; import { Session } from "../common/session.js"; @@ -7,8 +7,8 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import type { LoggerBase } from "../common/logger.js"; import { CompositeLogger, ConsoleLogger, DiskLogger, McpLogger } from "../common/logger.js"; import { ExportsManager } from "../common/exportsManager.js"; -import { ConnectionManager } from "../common/connectionManager.js"; import { DeviceId } from "../helpers/deviceId.js"; +import { type ConnectionManagerFactoryFn } from "../common/connectionManager.js"; export abstract class TransportRunnerBase { public logger: LoggerBase; @@ -16,7 +16,7 @@ export abstract class TransportRunnerBase { protected constructor( protected readonly userConfig: UserConfig, - private readonly driverOptions: DriverOptions, + private readonly createConnectionManager: ConnectionManagerFactoryFn, additionalLoggers: LoggerBase[] ) { const loggers: LoggerBase[] = [...additionalLoggers]; @@ -38,7 +38,7 @@ export abstract class TransportRunnerBase { this.deviceId = DeviceId.create(this.logger); } - protected setupServer(): Server { + protected async setupServer(): Promise { const mcpServer = new McpServer({ name: packageInfo.mcpServerName, version: packageInfo.version, @@ -46,7 +46,11 @@ export abstract class TransportRunnerBase { const logger = new CompositeLogger(this.logger); const exportsManager = ExportsManager.init(this.userConfig, logger); - const connectionManager = new ConnectionManager(this.userConfig, this.driverOptions, logger, this.deviceId); + const connectionManager = await this.createConnectionManager({ + logger, + userConfig: this.userConfig, + deviceId: this.deviceId, + }); const session = new Session({ apiBaseUrl: this.userConfig.apiBaseUrl, diff --git a/src/transports/stdio.ts b/src/transports/stdio.ts index 0751cac7b..4ed941ef9 100644 --- a/src/transports/stdio.ts +++ b/src/transports/stdio.ts @@ -1,12 +1,12 @@ -import type { LoggerBase } from "../common/logger.js"; -import { LogId } from "../common/logger.js"; -import type { Server } from "../server.js"; -import { TransportRunnerBase } from "./base.js"; +import { EJSON } from "bson"; import type { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js"; import { JSONRPCMessageSchema } from "@modelcontextprotocol/sdk/types.js"; -import { EJSON } from "bson"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import type { DriverOptions, UserConfig } from "../common/config.js"; +import { type LoggerBase, LogId } from "../common/logger.js"; +import type { Server } from "../server.js"; +import { TransportRunnerBase } from "./base.js"; +import { type UserConfig } from "../common/config.js"; +import { createMCPConnectionManager, type ConnectionManagerFactoryFn } from "../common/connectionManager.js"; // This is almost a copy of ReadBuffer from @modelcontextprotocol/sdk // but it uses EJSON.parse instead of JSON.parse to handle BSON types @@ -55,13 +55,17 @@ export function createStdioTransport(): StdioServerTransport { export class StdioRunner extends TransportRunnerBase { private server: Server | undefined; - constructor(userConfig: UserConfig, driverOptions: DriverOptions, additionalLoggers: LoggerBase[] = []) { - super(userConfig, driverOptions, additionalLoggers); + constructor( + userConfig: UserConfig, + createConnectionManager: ConnectionManagerFactoryFn = createMCPConnectionManager, + additionalLoggers: LoggerBase[] = [] + ) { + super(userConfig, createConnectionManager, additionalLoggers); } async start(): Promise { try { - this.server = this.setupServer(); + this.server = await this.setupServer(); const transport = createStdioTransport(); diff --git a/src/transports/streamableHttp.ts b/src/transports/streamableHttp.ts index 1718252ca..4e8aebb8e 100644 --- a/src/transports/streamableHttp.ts +++ b/src/transports/streamableHttp.ts @@ -1,13 +1,13 @@ import express from "express"; import type http from "http"; +import { randomUUID } from "crypto"; import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js"; -import { TransportRunnerBase } from "./base.js"; -import type { DriverOptions, UserConfig } from "../common/config.js"; -import type { LoggerBase } from "../common/logger.js"; -import { LogId } from "../common/logger.js"; -import { randomUUID } from "crypto"; +import { LogId, type LoggerBase } from "../common/logger.js"; +import { type UserConfig } from "../common/config.js"; import { SessionStore } from "../common/sessionStore.js"; +import { TransportRunnerBase } from "./base.js"; +import { createMCPConnectionManager, type ConnectionManagerFactoryFn } from "../common/connectionManager.js"; const JSON_RPC_ERROR_CODE_PROCESSING_REQUEST_FAILED = -32000; const JSON_RPC_ERROR_CODE_SESSION_ID_REQUIRED = -32001; @@ -19,6 +19,14 @@ export class StreamableHttpRunner extends TransportRunnerBase { private httpServer: http.Server | undefined; private sessionStore!: SessionStore; + constructor( + userConfig: UserConfig, + createConnectionManager: ConnectionManagerFactoryFn = createMCPConnectionManager, + additionalLoggers: LoggerBase[] = [] + ) { + super(userConfig, createConnectionManager, additionalLoggers); + } + public get serverAddress(): string { const result = this.httpServer?.address(); if (typeof result === "string") { @@ -31,10 +39,6 @@ export class StreamableHttpRunner extends TransportRunnerBase { throw new Error("Server is not started yet"); } - constructor(userConfig: UserConfig, driverOptions: DriverOptions, additionalLoggers: LoggerBase[] = []) { - super(userConfig, driverOptions, additionalLoggers); - } - async start(): Promise { const app = express(); this.sessionStore = new SessionStore( @@ -113,7 +117,7 @@ export class StreamableHttpRunner extends TransportRunnerBase { return; } - const server = this.setupServer(); + const server = await this.setupServer(); let keepAliveLoop: NodeJS.Timeout; const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: (): string => randomUUID().toString(), diff --git a/tests/integration/build.test.ts b/tests/integration/build.test.ts index f5b26827e..7453cb3d9 100644 --- a/tests/integration/build.test.ts +++ b/tests/integration/build.test.ts @@ -41,13 +41,16 @@ describe("Build Test", () => { const esmKeys = Object.keys(esmModule).sort(); expect(cjsKeys).toEqual(esmKeys); - expect(cjsKeys).toIncludeSameMembers([ - "Server", - "Session", - "Telemetry", - "StreamableHttpRunner", - "defaultUserConfig", - "LoggerBase", - ]); + expect(cjsKeys).toEqual( + expect.arrayContaining([ + "ConnectionManager", + "LoggerBase", + "Server", + "Session", + "StreamableHttpRunner", + "Telemetry", + "defaultUserConfig", + ]) + ); }); }); diff --git a/tests/integration/common/connectionManager.oidc.test.ts b/tests/integration/common/connectionManager.oidc.test.ts index fe65e63d6..d4932995e 100644 --- a/tests/integration/common/connectionManager.oidc.test.ts +++ b/tests/integration/common/connectionManager.oidc.test.ts @@ -5,7 +5,11 @@ import process from "process"; import type { MongoDBIntegrationTestCase } from "../tools/mongodb/mongodbHelpers.js"; import { describeWithMongoDB, isCommunityServer, getServerVersion } from "../tools/mongodb/mongodbHelpers.js"; import { defaultTestConfig, responseAsText, timeout, waitUntil } from "../helpers.js"; -import type { ConnectionStateConnected, ConnectionStateConnecting } from "../../../src/common/connectionManager.js"; +import type { + ConnectionStateConnected, + ConnectionStateConnecting, + TestConnectionManager, +} from "../../../src/common/connectionManager.js"; import type { UserConfig } from "../../../src/common/config.js"; import { setupDriverConfig } from "../../../src/common/config.js"; import path from "path"; @@ -122,7 +126,8 @@ describe.skipIf(process.platform !== "linux")("ConnectionManager OIDC Tests", as } beforeEach(async () => { - const connectionManager = integration.mcpServer().session.connectionManager; + const connectionManager = integration.mcpServer().session + .connectionManager as TestConnectionManager; // disconnect on purpose doesn't change the state if it was failed to avoid losing // information in production. await connectionManager.disconnect(); diff --git a/tests/integration/common/connectionManager.test.ts b/tests/integration/common/connectionManager.test.ts index 5a8cb6dae..9771a1ec2 100644 --- a/tests/integration/common/connectionManager.test.ts +++ b/tests/integration/common/connectionManager.test.ts @@ -2,15 +2,16 @@ import type { ConnectionManagerEvents, ConnectionStateConnected, ConnectionStringAuthType, + TestConnectionManager, } from "../../../src/common/connectionManager.js"; -import { ConnectionManager } from "../../../src/common/connectionManager.js"; +import { MCPConnectionManager } from "../../../src/common/connectionManager.js"; import type { UserConfig } from "../../../src/common/config.js"; import { describeWithMongoDB } from "../tools/mongodb/mongodbHelpers.js"; import { describe, beforeEach, expect, it, vi, afterEach } from "vitest"; describeWithMongoDB("Connection Manager", (integration) => { - function connectionManager(): ConnectionManager { - return integration.mcpServer().session.connectionManager; + function connectionManager(): TestConnectionManager { + return integration.mcpServer().session.connectionManager as TestConnectionManager; } afterEach(async () => { @@ -43,7 +44,7 @@ describeWithMongoDB("Connection Manager", (integration) => { }; for (const [event, spy] of Object.entries(connectionManagerSpies)) { - connectionManager().on(event as keyof ConnectionManagerEvents, spy); + connectionManager().events.on(event as keyof ConnectionManagerEvents, spy); } await connectionManager().connect({ @@ -224,9 +225,12 @@ describe("Connection Manager connection type inference", () => { for (const { userConfig, connectionString, connectionType } of testCases) { it(`infers ${connectionType} from ${connectionString}`, () => { - const actualConnectionType = ConnectionManager.inferConnectionTypeFromSettings(userConfig as UserConfig, { - connectionString, - }); + const actualConnectionType = MCPConnectionManager.inferConnectionTypeFromSettings( + userConfig as UserConfig, + { + connectionString, + } + ); expect(actualConnectionType).toBe(connectionType); }); diff --git a/tests/integration/helpers.ts b/tests/integration/helpers.ts index b67fbc169..e4913f6de 100644 --- a/tests/integration/helpers.ts +++ b/tests/integration/helpers.ts @@ -10,8 +10,8 @@ import type { UserConfig, DriverOptions } from "../../src/common/config.js"; import { McpError, ResourceUpdatedNotificationSchema } from "@modelcontextprotocol/sdk/types.js"; import { config, driverOptions } from "../../src/common/config.js"; import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from "vitest"; -import type { ConnectionState } from "../../src/common/connectionManager.js"; -import { ConnectionManager } from "../../src/common/connectionManager.js"; +import type { ConnectionManager, ConnectionState } from "../../src/common/connectionManager.js"; +import { MCPConnectionManager } from "../../src/common/connectionManager.js"; import { DeviceId } from "../../src/helpers/deviceId.js"; interface ParameterInfo { @@ -72,7 +72,7 @@ export function setupIntegrationTest( const exportsManager = ExportsManager.init(userConfig, logger); deviceId = DeviceId.create(logger); - const connectionManager = new ConnectionManager(userConfig, driverOptions, logger, deviceId); + const connectionManager = new MCPConnectionManager(userConfig, driverOptions, logger, deviceId); const session = new Session({ apiBaseUrl: userConfig.apiBaseUrl, diff --git a/tests/integration/telemetry.test.ts b/tests/integration/telemetry.test.ts index cc51ed8bf..b63a3796f 100644 --- a/tests/integration/telemetry.test.ts +++ b/tests/integration/telemetry.test.ts @@ -4,7 +4,7 @@ import { config, driverOptions } from "../../src/common/config.js"; import { DeviceId } from "../../src/helpers/deviceId.js"; import { describe, expect, it } from "vitest"; import { CompositeLogger } from "../../src/common/logger.js"; -import { ConnectionManager } from "../../src/common/connectionManager.js"; +import { MCPConnectionManager } from "../../src/common/connectionManager.js"; import { ExportsManager } from "../../src/common/exportsManager.js"; describe("Telemetry", () => { @@ -19,7 +19,7 @@ describe("Telemetry", () => { apiBaseUrl: "", logger, exportsManager: ExportsManager.init(config, logger), - connectionManager: new ConnectionManager(config, driverOptions, logger, deviceId), + connectionManager: new MCPConnectionManager(config, driverOptions, logger, deviceId), }), config, deviceId diff --git a/tests/integration/transports/streamableHttp.test.ts b/tests/integration/transports/streamableHttp.test.ts index f45ce3cd3..462ba9330 100644 --- a/tests/integration/transports/streamableHttp.test.ts +++ b/tests/integration/transports/streamableHttp.test.ts @@ -2,9 +2,10 @@ import { StreamableHttpRunner } from "../../../src/transports/streamableHttp.js" import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; import { describe, expect, it, beforeAll, afterAll, beforeEach } from "vitest"; -import { config, driverOptions } from "../../../src/common/config.js"; +import { config } from "../../../src/common/config.js"; import type { LoggerType, LogLevel, LogPayload } from "../../../src/common/logger.js"; import { LoggerBase, LogId } from "../../../src/common/logger.js"; +import { createMCPConnectionManager } from "../../../src/common/connectionManager.js"; describe("StreamableHttpRunner", () => { let runner: StreamableHttpRunner; @@ -28,7 +29,7 @@ describe("StreamableHttpRunner", () => { describe(description, () => { beforeAll(async () => { config.httpHeaders = headers; - runner = new StreamableHttpRunner(config, driverOptions); + runner = new StreamableHttpRunner(config); await runner.start(); }); @@ -109,7 +110,7 @@ describe("StreamableHttpRunner", () => { try { for (let i = 0; i < 3; i++) { config.httpPort = 0; // Use a random port for each runner - const runner = new StreamableHttpRunner(config, driverOptions); + const runner = new StreamableHttpRunner(config); await runner.start(); runners.push(runner); } @@ -138,7 +139,7 @@ describe("StreamableHttpRunner", () => { it("can provide custom logger", async () => { const logger = new CustomLogger(); - const runner = new StreamableHttpRunner(config, driverOptions, [logger]); + const runner = new StreamableHttpRunner(config, createMCPConnectionManager, [logger]); await runner.start(); const messages = logger.messages; diff --git a/tests/unit/common/session.test.ts b/tests/unit/common/session.test.ts index 6b2b3552b..53129d9e9 100644 --- a/tests/unit/common/session.test.ts +++ b/tests/unit/common/session.test.ts @@ -4,7 +4,7 @@ import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver import { Session } from "../../../src/common/session.js"; import { config, driverOptions } from "../../../src/common/config.js"; import { CompositeLogger } from "../../../src/common/logger.js"; -import { ConnectionManager } from "../../../src/common/connectionManager.js"; +import { MCPConnectionManager } from "../../../src/common/connectionManager.js"; import { ExportsManager } from "../../../src/common/exportsManager.js"; import { DeviceId } from "../../../src/helpers/deviceId.js"; @@ -27,7 +27,7 @@ describe("Session", () => { apiBaseUrl: "https://api.test.com", logger, exportsManager: ExportsManager.init(config, logger), - connectionManager: new ConnectionManager(config, driverOptions, logger, mockDeviceId), + connectionManager: new MCPConnectionManager(config, driverOptions, logger, mockDeviceId), }); MockNodeDriverServiceProvider.connect = vi.fn().mockResolvedValue({} as unknown as NodeDriverServiceProvider); diff --git a/tests/unit/resources/common/debug.test.ts b/tests/unit/resources/common/debug.test.ts index 52f1dd826..d0621026b 100644 --- a/tests/unit/resources/common/debug.test.ts +++ b/tests/unit/resources/common/debug.test.ts @@ -4,7 +4,7 @@ import { Session } from "../../../../src/common/session.js"; import { Telemetry } from "../../../../src/telemetry/telemetry.js"; import { config, driverOptions } from "../../../../src/common/config.js"; import { CompositeLogger } from "../../../../src/common/logger.js"; -import { ConnectionManager } from "../../../../src/common/connectionManager.js"; +import { MCPConnectionManager } from "../../../../src/common/connectionManager.js"; import { ExportsManager } from "../../../../src/common/exportsManager.js"; import { DeviceId } from "../../../../src/helpers/deviceId.js"; @@ -15,7 +15,7 @@ describe("debug resource", () => { apiBaseUrl: "", logger, exportsManager: ExportsManager.init(config, logger), - connectionManager: new ConnectionManager(config, driverOptions, logger, deviceId), + connectionManager: new MCPConnectionManager(config, driverOptions, logger, deviceId), }); const telemetry = Telemetry.create(session, { ...config, telemetry: "disabled" }, deviceId); From f78fb4c7950e5629de3f92322b25905863c15715 Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Fri, 29 Aug 2025 12:37:07 +0200 Subject: [PATCH 03/49] chore: add some extra log level validations (#489) --- src/common/logger.ts | 4 ++-- src/server.ts | 6 +++++- tests/unit/logger.test.ts | 5 +++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/common/logger.ts b/src/common/logger.ts index 40b54cc66..2535b4025 100644 --- a/src/common/logger.ts +++ b/src/common/logger.ts @@ -250,7 +250,7 @@ export class DiskLogger extends LoggerBase<{ initialized: [] }> { } export class McpLogger extends LoggerBase { - private static readonly LOG_LEVELS: LogLevel[] = [ + public static readonly LOG_LEVELS: LogLevel[] = [ "debug", "info", "notice", @@ -259,7 +259,7 @@ export class McpLogger extends LoggerBase { "critical", "alert", "emergency", - ]; + ] as const; public constructor(private readonly server: Server) { super(); diff --git a/src/server.ts b/src/server.ts index 06a216948..ded916180 100644 --- a/src/server.ts +++ b/src/server.ts @@ -5,7 +5,7 @@ import { AtlasTools } from "./tools/atlas/tools.js"; import { MongoDbTools } from "./tools/mongodb/tools.js"; import { Resources } from "./resources/resources.js"; import type { LogLevel } from "./common/logger.js"; -import { LogId } from "./common/logger.js"; +import { LogId, McpLogger } from "./common/logger.js"; import type { Telemetry } from "./telemetry/telemetry.js"; import type { UserConfig } from "./common/config.js"; import { type ServerEvent } from "./telemetry/types.js"; @@ -107,6 +107,10 @@ export class Server { }); this.mcpServer.server.setRequestHandler(SetLevelRequestSchema, ({ params }) => { + if (!McpLogger.LOG_LEVELS.includes(params.level)) { + throw new Error(`Invalid log level: ${params.level}`); + } + this._mcpLogLevel = params.level; return {}; }); diff --git a/tests/unit/logger.test.ts b/tests/unit/logger.test.ts index 6bddc782d..e414ed481 100644 --- a/tests/unit/logger.test.ts +++ b/tests/unit/logger.test.ts @@ -7,6 +7,7 @@ import * as path from "path"; import * as fs from "fs/promises"; import { once } from "events"; import type { Server } from "../../src/server.js"; +import { LoggingMessageNotificationSchema } from "@modelcontextprotocol/sdk/types.js"; describe("Logger", () => { let consoleErrorSpy: MockInstance; @@ -332,5 +333,9 @@ describe("Logger", () => { expect(mcpLoggerSpy).toHaveBeenCalledTimes(2); expect(getLastMcpLogMessage()).toContain("Alert message"); }); + + it("MCPLogger.LOG_LEVELS contains all possible levels", () => { + expect(McpLogger.LOG_LEVELS).toEqual(LoggingMessageNotificationSchema.shape.params.shape.level.options); + }); }); }); From d1e0ee3309748c35ef5fb514cef4837800b3c8ea Mon Sep 17 00:00:00 2001 From: Bianca Lisle <40155621+blva@users.noreply.github.com> Date: Fri, 29 Aug 2025 18:17:48 +0100 Subject: [PATCH 04/49] ci: add ipAccessList after creating project (#496) --- .github/workflows/code_health.yaml | 2 +- tests/integration/helpers.ts | 2 +- tests/integration/tools/atlas/atlasHelpers.ts | 25 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/.github/workflows/code_health.yaml b/.github/workflows/code_health.yaml index 9a0b87dd9..9b79cba0d 100644 --- a/.github/workflows/code_health.yaml +++ b/.github/workflows/code_health.yaml @@ -54,7 +54,7 @@ jobs: MDB_MCP_API_CLIENT_ID: ${{ secrets.TEST_ATLAS_CLIENT_ID }} MDB_MCP_API_CLIENT_SECRET: ${{ secrets.TEST_ATLAS_CLIENT_SECRET }} MDB_MCP_API_BASE_URL: ${{ vars.TEST_ATLAS_BASE_URL }} - run: npm test -- --exclude "tests/unit/**" --exclude "tests/integration/tools/mongodb/**" --exclude "tests/integration/*.ts" + run: npm test -- tests/integration/tools/atlas - name: Upload test results uses: actions/upload-artifact@v4 if: always() diff --git a/tests/integration/helpers.ts b/tests/integration/helpers.ts index e4913f6de..4ad07c83c 100644 --- a/tests/integration/helpers.ts +++ b/tests/integration/helpers.ts @@ -84,7 +84,7 @@ export function setupIntegrationTest( }); // Mock hasValidAccessToken for tests - if (userConfig.apiClientId && userConfig.apiClientSecret) { + if (!userConfig.apiClientId && !userConfig.apiClientSecret) { const mockFn = vi.fn().mockResolvedValue(true); session.apiClient.validateAccessToken = mockFn; } diff --git a/tests/integration/tools/atlas/atlasHelpers.ts b/tests/integration/tools/atlas/atlasHelpers.ts index 38a69291d..7de5966f6 100644 --- a/tests/integration/tools/atlas/atlasHelpers.ts +++ b/tests/integration/tools/atlas/atlasHelpers.ts @@ -19,6 +19,7 @@ export function describeWithAtlas(name: string, fn: IntegrationTestFunction): vo ...defaultTestConfig, apiClientId: process.env.MDB_MCP_API_CLIENT_ID, apiClientSecret: process.env.MDB_MCP_API_CLIENT_SECRET, + apiBaseUrl: process.env.MDB_MCP_API_BASE_URL ?? "https://cloud-dev.mongodb.com", }), () => defaultDriverOptions ); @@ -39,6 +40,13 @@ export function withProject(integration: IntegrationTest, fn: ProjectTestFunctio beforeAll(async () => { const apiClient = integration.mcpServer().session.apiClient; + // check that it has credentials + if (!apiClient.hasCredentials()) { + throw new Error("No credentials available"); + } + + // validate access token + await apiClient.validateAccessToken(); try { const group = await createProject(apiClient); projectId = group.id; @@ -111,5 +119,22 @@ async function createProject(apiClient: ApiClient): Promise>; } From 4a544049cb94d4935f110f7653b06dc9668bbadf Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Mon, 1 Sep 2025 11:43:15 +0200 Subject: [PATCH 05/49] chore: warn about the usage of deprecated cli arguments MCP-107 (#493) --- src/common/config.ts | 29 ++++++++++++++++++++++ tests/unit/common/config.test.ts | 41 ++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/common/config.ts b/src/common/config.ts index 414e91589..4bc02efe9 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -253,6 +253,13 @@ function parseCliConfig(args: string[]): CliOptions { }; const positionalArguments = parsed._ ?? []; + + // we use console.warn here because we still don't have our logging system configured + // so we don't have a logger. For stdio, the warning will be received as a string in + // the client and IDEs like VSCode do show the message in the log window. For HTTP, + // it will be in the stdout of the process. + warnAboutDeprecatedCliArgs({ ...parsed, _: positionalArguments }, console.warn); + // if we have a positional argument that matches a connection string // store it as the connection specifier and remove it from the argument // list, so it doesn't get misunderstood by the mongosh args-parser @@ -264,6 +271,28 @@ function parseCliConfig(args: string[]): CliOptions { return parsed; } +export function warnAboutDeprecatedCliArgs( + args: CliOptions & + UserConfig & { + _?: string[]; + }, + warn: (msg: string) => void +): void { + let usedDeprecatedArgument = false; + // the first position argument should be used + // instead of --connectionString, as it's how the mongosh works. + if (args.connectionString) { + usedDeprecatedArgument = true; + warn( + "The --connectionString argument is deprecated. Prefer using the first positional argument for the connection string or the MDB_MCP_CONNECTION_STRING environment variable." + ); + } + + if (usedDeprecatedArgument) { + warn("Refer to https://www.mongodb.com/docs/mcp-server/get-started/ for setting up the MCP Server."); + } +} + function commaSeparatedToArray(str: string | string[] | undefined): T { if (str === undefined) { return [] as unknown as T; diff --git a/tests/unit/common/config.test.ts b/tests/unit/common/config.test.ts index 78257a3c0..789febff1 100644 --- a/tests/unit/common/config.test.ts +++ b/tests/unit/common/config.test.ts @@ -1,6 +1,7 @@ -import { describe, it, expect } from "vitest"; +import { describe, it, expect, vi, beforeEach } from "vitest"; import type { UserConfig } from "../../../src/common/config.js"; -import { setupUserConfig, defaultUserConfig } from "../../../src/common/config.js"; +import { setupUserConfig, defaultUserConfig, warnAboutDeprecatedCliArgs } from "../../../src/common/config.js"; +import type { CliOptions } from "@mongosh/arg-parser"; describe("config", () => { describe("env var parsing", () => { @@ -605,3 +606,39 @@ describe("config", () => { }); }); }); + +describe("Deprecated CLI arguments", () => { + const referDocMessage = + "Refer to https://www.mongodb.com/docs/mcp-server/get-started/ for setting up the MCP Server."; + + type TestCase = { readonly cliArg: keyof (CliOptions & UserConfig); readonly warning: string }; + const testCases = [ + { + cliArg: "connectionString", + warning: + "The --connectionString argument is deprecated. Prefer using the first positional argument for the connection string or the MDB_MCP_CONNECTION_STRING environment variable.", + }, + ] as TestCase[]; + + for (const { cliArg, warning } of testCases) { + describe(`deprecation behaviour of ${cliArg}`, () => { + let cliArgs: CliOptions & UserConfig & { _?: string[] }; + let warn: (msg: string) => void; + + beforeEach(() => { + cliArgs = { [cliArg]: "RandomString" } as unknown as CliOptions & UserConfig & { _?: string[] }; + warn = vi.fn(); + + warnAboutDeprecatedCliArgs(cliArgs, warn); + }); + + it(`warns the usage of ${cliArg} as it is deprecated`, () => { + expect(warn).toHaveBeenCalledWith(warning); + }); + + it(`shows the reference message when ${cliArg} was passed`, () => { + expect(warn).toHaveBeenCalledWith(referDocMessage); + }); + }); + } +}); From d471cdd0d39a4286b90206b794805919b9aef0c3 Mon Sep 17 00:00:00 2001 From: Bianca Lisle <40155621+blva@users.noreply.github.com> Date: Mon, 1 Sep 2025 17:31:04 +0100 Subject: [PATCH 06/49] fix: allow connect tool on readOnly mode (#499) --- src/tools/tool.ts | 2 +- tests/integration/common/connectionManager.oidc.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tools/tool.ts b/src/tools/tool.ts index 538d8c9bd..9a13eada0 100644 --- a/src/tools/tool.ts +++ b/src/tools/tool.ts @@ -149,7 +149,7 @@ export abstract class ToolBase { let errorClarification: string | undefined; // Check read-only mode first - if (this.config.readOnly && !["read", "metadata"].includes(this.operationType)) { + if (this.config.readOnly && !["read", "metadata", "connect"].includes(this.operationType)) { errorClarification = `read-only mode is enabled, its operation type, \`${this.operationType}\`,`; } else if (this.config.disabledTools.includes(this.category)) { errorClarification = `its category, \`${this.category}\`,`; diff --git a/tests/integration/common/connectionManager.oidc.test.ts b/tests/integration/common/connectionManager.oidc.test.ts index d4932995e..2e1741257 100644 --- a/tests/integration/common/connectionManager.oidc.test.ts +++ b/tests/integration/common/connectionManager.oidc.test.ts @@ -98,7 +98,7 @@ describe.skipIf(process.platform !== "linux")("ConnectionManager OIDC Tests", as ...defaultTestConfig, oidcRedirectURi: "http://localhost:0/", authenticationMechanism: "MONGODB-OIDC", - maxIdleTimeMS: "1", + maxIdleTimeMS: "10000", minPoolSize: "0", username: "testuser", browser: fetchBrowserFixture, From 47c0a09e0be765b3c51cf2bf224565e136374a38 Mon Sep 17 00:00:00 2001 From: Bianca Lisle <40155621+blva@users.noreply.github.com> Date: Tue, 2 Sep 2025 18:57:51 +0100 Subject: [PATCH 07/49] fix: start mcp even if connection fails - [MCP-140] (#503) --- src/common/logger.ts | 1 + src/server.ts | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/common/logger.ts b/src/common/logger.ts index 2535b4025..03b94f313 100644 --- a/src/common/logger.ts +++ b/src/common/logger.ts @@ -41,6 +41,7 @@ export const LogId = { mongodbConnectFailure: mongoLogId(1_004_001), mongodbDisconnectFailure: mongoLogId(1_004_002), + mongodbConnectTry: mongoLogId(1_004_003), toolUpdateFailure: mongoLogId(1_005_001), resourceUpdateFailure: mongoLogId(1_005_002), diff --git a/src/server.ts b/src/server.ts index ded916180..76399e986 100644 --- a/src/server.ts +++ b/src/server.ts @@ -20,6 +20,7 @@ import { import assert from "assert"; import type { ToolBase } from "./tools/tool.js"; import { validateConnectionString } from "./helpers/connectionOptions.js"; +import { packageInfo } from "./common/packageInfo.js"; export interface ServerOptions { session: Session; @@ -119,11 +120,10 @@ export class Server { this.session.setMcpClient(this.mcpServer.server.getClientVersion()); // Placed here to start the connection to the config connection string as soon as the server is initialized. void this.connectToConfigConnectionString(); - this.session.logger.info({ id: LogId.serverInitialized, context: "server", - message: `Server started with transport ${transport.constructor.name} and agent runner ${this.session.mcpClient?.name}`, + message: `Server with version ${packageInfo.version} started with transport ${transport.constructor.name} and agent runner ${JSON.stringify(this.session.mcpClient)}`, }); this.emitServerEvent("start", Date.now() - this.startTime); @@ -244,15 +244,21 @@ export class Server { private async connectToConfigConnectionString(): Promise { if (this.userConfig.connectionString) { try { + this.session.logger.info({ + id: LogId.mongodbConnectTry, + context: "server", + message: `Detected a MongoDB connection string in the configuration, trying to connect...`, + }); await this.session.connectToMongoDB({ connectionString: this.userConfig.connectionString, }); } catch (error) { - console.error( - "Failed to connect to MongoDB instance using the connection string from the config: ", - error - ); - throw new Error("Failed to connect to MongoDB instance using the connection string from the config"); + // We don't throw an error here because we want to allow the server to start even if the connection string is invalid. + this.session.logger.error({ + id: LogId.mongodbConnectFailure, + context: "server", + message: `Failed to connect to MongoDB instance using the connection string from the config: ${error instanceof Error ? error.message : String(error)}`, + }); } } } From 94dfc08cce83813b9a35f6554ac89ca75d4c3740 Mon Sep 17 00:00:00 2001 From: Himanshu Singh Date: Wed, 3 Sep 2025 12:22:50 +0200 Subject: [PATCH 08/49] chore: extend library interfaces to allow injecting a custom connection error handler MCP-132 (#502) --- src/common/connectionErrorHandler.ts | 82 +++++ src/common/errors.ts | 4 +- src/index.ts | 9 +- src/lib.ts | 7 + src/server.ts | 6 +- src/tools/mongodb/mongodbTool.ts | 69 +---- src/transports/base.ts | 31 +- src/transports/stdio.ts | 14 +- src/transports/streamableHttp.ts | 14 +- tests/integration/helpers.ts | 2 + .../tools/mongodb/mongodbTool.test.ts | 290 ++++++++++++++++++ .../transports/streamableHttp.test.ts | 10 +- 12 files changed, 450 insertions(+), 88 deletions(-) create mode 100644 src/common/connectionErrorHandler.ts create mode 100644 tests/integration/tools/mongodb/mongodbTool.test.ts diff --git a/src/common/connectionErrorHandler.ts b/src/common/connectionErrorHandler.ts new file mode 100644 index 000000000..9de63befe --- /dev/null +++ b/src/common/connectionErrorHandler.ts @@ -0,0 +1,82 @@ +import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; +import { ErrorCodes, type MongoDBError } from "./errors.js"; +import type { AnyConnectionState } from "./connectionManager.js"; +import type { ToolBase } from "../tools/tool.js"; + +export type ConnectionErrorHandler = ( + error: MongoDBError, + additionalContext: ConnectionErrorHandlerContext +) => ConnectionErrorUnhandled | ConnectionErrorHandled; + +export type ConnectionErrorHandlerContext = { availableTools: ToolBase[]; connectionState: AnyConnectionState }; +export type ConnectionErrorUnhandled = { errorHandled: false }; +export type ConnectionErrorHandled = { errorHandled: true; result: CallToolResult }; + +export const connectionErrorHandler: ConnectionErrorHandler = (error, { availableTools, connectionState }) => { + const connectTools = availableTools + .filter((t) => t.operationType === "connect") + .sort((a, b) => a.category.localeCompare(b.category)); // Sort Atlas tools before MongoDB tools + + // Find the first Atlas connect tool if available and suggest to the LLM to use it. + // Note: if we ever have multiple Atlas connect tools, we may want to refine this logic to select the most appropriate one. + const atlasConnectTool = connectTools?.find((t) => t.category === "atlas"); + const llmConnectHint = atlasConnectTool + ? `Note to LLM: prefer using the "${atlasConnectTool.name}" tool to connect to an Atlas cluster over using a connection string. Make sure to ask the user to specify a cluster name they want to connect to or ask them if they want to use the "list-clusters" tool to list all their clusters. Do not invent cluster names or connection strings unless the user has explicitly specified them. If they've previously connected to MongoDB using MCP, you can ask them if they want to reconnect using the same cluster/connection.` + : "Note to LLM: do not invent connection strings and explicitly ask the user to provide one. If they have previously connected to MongoDB using MCP, you can ask them if they want to reconnect using the same connection string."; + + const connectToolsNames = connectTools?.map((t) => `"${t.name}"`).join(", "); + const additionalPromptForConnectivity: { type: "text"; text: string }[] = []; + + if (connectionState.tag === "connecting" && connectionState.oidcConnectionType) { + additionalPromptForConnectivity.push({ + type: "text", + text: `The user needs to finish their OIDC connection by opening '${connectionState.oidcLoginUrl}' in the browser and use the following user code: '${connectionState.oidcUserCode}'`, + }); + } else { + additionalPromptForConnectivity.push({ + type: "text", + text: connectToolsNames + ? `Please use one of the following tools: ${connectToolsNames} to connect to a MongoDB instance or update the MCP server configuration to include a connection string. ${llmConnectHint}` + : "There are no tools available to connect. Please update the configuration to include a connection string and restart the server.", + }); + } + + switch (error.code) { + case ErrorCodes.NotConnectedToMongoDB: + return { + errorHandled: true, + result: { + content: [ + { + type: "text", + text: "You need to connect to a MongoDB instance before you can access its data.", + }, + ...additionalPromptForConnectivity, + ], + isError: true, + }, + }; + case ErrorCodes.MisconfiguredConnectionString: + return { + errorHandled: true, + result: { + content: [ + { + type: "text", + text: "The configured connection string is not valid. Please check the connection string and confirm it points to a valid MongoDB instance.", + }, + { + type: "text", + text: connectTools + ? `Alternatively, you can use one of the following tools: ${connectToolsNames} to connect to a MongoDB instance. ${llmConnectHint}` + : "Please update the configuration to use a valid connection string and restart the server.", + }, + ], + isError: true, + }, + }; + + default: + return { errorHandled: false }; + } +}; diff --git a/src/common/errors.ts b/src/common/errors.ts index d81867f09..084d45ca7 100644 --- a/src/common/errors.ts +++ b/src/common/errors.ts @@ -4,9 +4,9 @@ export enum ErrorCodes { ForbiddenCollscan = 1_000_002, } -export class MongoDBError extends Error { +export class MongoDBError extends Error { constructor( - public code: ErrorCodes, + public code: ErrorCode, message: string ) { super(message); diff --git a/src/index.ts b/src/index.ts index 6a7150e35..f7699518a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -49,7 +49,14 @@ async function main(): Promise { assertHelpMode(); assertVersionMode(); - const transportRunner = config.transport === "stdio" ? new StdioRunner(config) : new StreamableHttpRunner(config); + const transportRunner = + config.transport === "stdio" + ? new StdioRunner({ + userConfig: config, + }) + : new StreamableHttpRunner({ + userConfig: config, + }); const shutdown = (): void => { transportRunner.logger.info({ id: LogId.serverCloseRequested, diff --git a/src/lib.ts b/src/lib.ts index 01dc8b887..e6388b511 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -11,4 +11,11 @@ export { type ConnectionStateErrored, type ConnectionManagerFactoryFn, } from "./common/connectionManager.js"; +export type { + ConnectionErrorHandler, + ConnectionErrorHandled, + ConnectionErrorUnhandled, + ConnectionErrorHandlerContext, +} from "./common/connectionErrorHandler.js"; +export { ErrorCodes } from "./common/errors.js"; export { Telemetry } from "./telemetry/telemetry.js"; diff --git a/src/server.ts b/src/server.ts index 76399e986..914a823b9 100644 --- a/src/server.ts +++ b/src/server.ts @@ -21,12 +21,14 @@ import assert from "assert"; import type { ToolBase } from "./tools/tool.js"; import { validateConnectionString } from "./helpers/connectionOptions.js"; import { packageInfo } from "./common/packageInfo.js"; +import { type ConnectionErrorHandler } from "./common/connectionErrorHandler.js"; export interface ServerOptions { session: Session; userConfig: UserConfig; mcpServer: McpServer; telemetry: Telemetry; + connectionErrorHandler: ConnectionErrorHandler; } export class Server { @@ -35,6 +37,7 @@ export class Server { private readonly telemetry: Telemetry; public readonly userConfig: UserConfig; public readonly tools: ToolBase[] = []; + public readonly connectionErrorHandler: ConnectionErrorHandler; private _mcpLogLevel: LogLevel = "debug"; @@ -45,12 +48,13 @@ export class Server { private readonly startTime: number; private readonly subscriptions = new Set(); - constructor({ session, mcpServer, userConfig, telemetry }: ServerOptions) { + constructor({ session, mcpServer, userConfig, telemetry, connectionErrorHandler }: ServerOptions) { this.startTime = Date.now(); this.session = session; this.telemetry = telemetry; this.mcpServer = mcpServer; this.userConfig = userConfig; + this.connectionErrorHandler = connectionErrorHandler; } async connect(transport: Transport): Promise { diff --git a/src/tools/mongodb/mongodbTool.ts b/src/tools/mongodb/mongodbTool.ts index 5fff778a6..ded994ab3 100644 --- a/src/tools/mongodb/mongodbTool.ts +++ b/src/tools/mongodb/mongodbTool.ts @@ -56,63 +56,22 @@ export abstract class MongoDBToolBase extends ToolBase { args: ToolArgs ): Promise | CallToolResult { if (error instanceof MongoDBError) { - const connectTools = this.server?.tools - .filter((t) => t.operationType === "connect") - .sort((a, b) => a.category.localeCompare(b.category)); // Sort Altas tools before MongoDB tools - - // Find the first Atlas connect tool if available and suggest to the LLM to use it. - // Note: if we ever have multiple Atlas connect tools, we may want to refine this logic to select the most appropriate one. - const atlasConnectTool = connectTools?.find((t) => t.category === "atlas"); - const llmConnectHint = atlasConnectTool - ? `Note to LLM: prefer using the "${atlasConnectTool.name}" tool to connect to an Atlas cluster over using a connection string. Make sure to ask the user to specify a cluster name they want to connect to or ask them if they want to use the "list-clusters" tool to list all their clusters. Do not invent cluster names or connection strings unless the user has explicitly specified them. If they've previously connected to MongoDB using MCP, you can ask them if they want to reconnect using the same cluster/connection.` - : "Note to LLM: do not invent connection strings and explicitly ask the user to provide one. If they have previously connected to MongoDB using MCP, you can ask them if they want to reconnect using the same connection string."; - - const connectToolsNames = connectTools?.map((t) => `"${t.name}"`).join(", "); - const connectionStatus = this.session.connectionManager.currentConnectionState; - const additionalPromptForConnectivity: { type: "text"; text: string }[] = []; - - if (connectionStatus.tag === "connecting" && connectionStatus.oidcConnectionType) { - additionalPromptForConnectivity.push({ - type: "text", - text: `The user needs to finish their OIDC connection by opening '${connectionStatus.oidcLoginUrl}' in the browser and use the following user code: '${connectionStatus.oidcUserCode}'`, - }); - } else { - additionalPromptForConnectivity.push({ - type: "text", - text: connectToolsNames - ? `Please use one of the following tools: ${connectToolsNames} to connect to a MongoDB instance or update the MCP server configuration to include a connection string. ${llmConnectHint}` - : "There are no tools available to connect. Please update the configuration to include a connection string and restart the server.", - }); - } - switch (error.code) { case ErrorCodes.NotConnectedToMongoDB: - return { - content: [ - { - type: "text", - text: "You need to connect to a MongoDB instance before you can access its data.", - }, - ...additionalPromptForConnectivity, - ], - isError: true, - }; - case ErrorCodes.MisconfiguredConnectionString: - return { - content: [ - { - type: "text", - text: "The configured connection string is not valid. Please check the connection string and confirm it points to a valid MongoDB instance.", - }, - { - type: "text", - text: connectTools - ? `Alternatively, you can use one of the following tools: ${connectToolsNames} to connect to a MongoDB instance. ${llmConnectHint}` - : "Please update the configuration to use a valid connection string and restart the server.", - }, - ], - isError: true, - }; + case ErrorCodes.MisconfiguredConnectionString: { + const connectionError = error as MongoDBError< + ErrorCodes.NotConnectedToMongoDB | ErrorCodes.MisconfiguredConnectionString + >; + const outcome = this.server?.connectionErrorHandler(connectionError, { + availableTools: this.server?.tools ?? [], + connectionState: this.session.connectionManager.currentConnectionState, + }); + if (outcome?.errorHandled) { + return outcome.result; + } + + return super.handleError(error, args); + } case ErrorCodes.ForbiddenCollscan: return { content: [ diff --git a/src/transports/base.ts b/src/transports/base.ts index d6fc53adc..f870514b9 100644 --- a/src/transports/base.ts +++ b/src/transports/base.ts @@ -8,17 +8,35 @@ import type { LoggerBase } from "../common/logger.js"; import { CompositeLogger, ConsoleLogger, DiskLogger, McpLogger } from "../common/logger.js"; import { ExportsManager } from "../common/exportsManager.js"; import { DeviceId } from "../helpers/deviceId.js"; -import { type ConnectionManagerFactoryFn } from "../common/connectionManager.js"; +import { createMCPConnectionManager, type ConnectionManagerFactoryFn } from "../common/connectionManager.js"; +import { + type ConnectionErrorHandler, + connectionErrorHandler as defaultConnectionErrorHandler, +} from "../common/connectionErrorHandler.js"; + +export type TransportRunnerConfig = { + userConfig: UserConfig; + createConnectionManager?: ConnectionManagerFactoryFn; + connectionErrorHandler?: ConnectionErrorHandler; + additionalLoggers?: LoggerBase[]; +}; export abstract class TransportRunnerBase { public logger: LoggerBase; public deviceId: DeviceId; + protected readonly userConfig: UserConfig; + private readonly createConnectionManager: ConnectionManagerFactoryFn; + private readonly connectionErrorHandler: ConnectionErrorHandler; - protected constructor( - protected readonly userConfig: UserConfig, - private readonly createConnectionManager: ConnectionManagerFactoryFn, - additionalLoggers: LoggerBase[] - ) { + protected constructor({ + userConfig, + createConnectionManager = createMCPConnectionManager, + connectionErrorHandler = defaultConnectionErrorHandler, + additionalLoggers = [], + }: TransportRunnerConfig) { + this.userConfig = userConfig; + this.createConnectionManager = createConnectionManager; + this.connectionErrorHandler = connectionErrorHandler; const loggers: LoggerBase[] = [...additionalLoggers]; if (this.userConfig.loggers.includes("stderr")) { loggers.push(new ConsoleLogger()); @@ -68,6 +86,7 @@ export abstract class TransportRunnerBase { session, telemetry, userConfig: this.userConfig, + connectionErrorHandler: this.connectionErrorHandler, }); // We need to create the MCP logger after the server is constructed diff --git a/src/transports/stdio.ts b/src/transports/stdio.ts index 4ed941ef9..09a7490b9 100644 --- a/src/transports/stdio.ts +++ b/src/transports/stdio.ts @@ -2,11 +2,9 @@ import { EJSON } from "bson"; import type { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js"; import { JSONRPCMessageSchema } from "@modelcontextprotocol/sdk/types.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import { type LoggerBase, LogId } from "../common/logger.js"; +import { LogId } from "../common/logger.js"; import type { Server } from "../server.js"; -import { TransportRunnerBase } from "./base.js"; -import { type UserConfig } from "../common/config.js"; -import { createMCPConnectionManager, type ConnectionManagerFactoryFn } from "../common/connectionManager.js"; +import { TransportRunnerBase, type TransportRunnerConfig } from "./base.js"; // This is almost a copy of ReadBuffer from @modelcontextprotocol/sdk // but it uses EJSON.parse instead of JSON.parse to handle BSON types @@ -55,12 +53,8 @@ export function createStdioTransport(): StdioServerTransport { export class StdioRunner extends TransportRunnerBase { private server: Server | undefined; - constructor( - userConfig: UserConfig, - createConnectionManager: ConnectionManagerFactoryFn = createMCPConnectionManager, - additionalLoggers: LoggerBase[] = [] - ) { - super(userConfig, createConnectionManager, additionalLoggers); + constructor(config: TransportRunnerConfig) { + super(config); } async start(): Promise { diff --git a/src/transports/streamableHttp.ts b/src/transports/streamableHttp.ts index 4e8aebb8e..ad04ec732 100644 --- a/src/transports/streamableHttp.ts +++ b/src/transports/streamableHttp.ts @@ -3,11 +3,9 @@ import type http from "http"; import { randomUUID } from "crypto"; import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js"; -import { LogId, type LoggerBase } from "../common/logger.js"; -import { type UserConfig } from "../common/config.js"; +import { LogId } from "../common/logger.js"; import { SessionStore } from "../common/sessionStore.js"; -import { TransportRunnerBase } from "./base.js"; -import { createMCPConnectionManager, type ConnectionManagerFactoryFn } from "../common/connectionManager.js"; +import { TransportRunnerBase, type TransportRunnerConfig } from "./base.js"; const JSON_RPC_ERROR_CODE_PROCESSING_REQUEST_FAILED = -32000; const JSON_RPC_ERROR_CODE_SESSION_ID_REQUIRED = -32001; @@ -19,12 +17,8 @@ export class StreamableHttpRunner extends TransportRunnerBase { private httpServer: http.Server | undefined; private sessionStore!: SessionStore; - constructor( - userConfig: UserConfig, - createConnectionManager: ConnectionManagerFactoryFn = createMCPConnectionManager, - additionalLoggers: LoggerBase[] = [] - ) { - super(userConfig, createConnectionManager, additionalLoggers); + constructor(config: TransportRunnerConfig) { + super(config); } public get serverAddress(): string { diff --git a/tests/integration/helpers.ts b/tests/integration/helpers.ts index 4ad07c83c..8820476a7 100644 --- a/tests/integration/helpers.ts +++ b/tests/integration/helpers.ts @@ -13,6 +13,7 @@ import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from "vitest import type { ConnectionManager, ConnectionState } from "../../src/common/connectionManager.js"; import { MCPConnectionManager } from "../../src/common/connectionManager.js"; import { DeviceId } from "../../src/helpers/deviceId.js"; +import { connectionErrorHandler } from "../../src/common/connectionErrorHandler.js"; interface ParameterInfo { name: string; @@ -101,6 +102,7 @@ export function setupIntegrationTest( name: "test-server", version: "5.2.3", }), + connectionErrorHandler, }); await mcpServer.connect(serverTransport); diff --git a/tests/integration/tools/mongodb/mongodbTool.test.ts b/tests/integration/tools/mongodb/mongodbTool.test.ts new file mode 100644 index 000000000..7f8c76268 --- /dev/null +++ b/tests/integration/tools/mongodb/mongodbTool.test.ts @@ -0,0 +1,290 @@ +import { vi, it, describe, beforeEach, afterEach, type MockedFunction, afterAll, expect } from "vitest"; +import { type CallToolResult } from "@modelcontextprotocol/sdk/types.js"; +import { Client } from "@modelcontextprotocol/sdk/client/index.js"; +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { MongoDBToolBase } from "../../../../src/tools/mongodb/mongodbTool.js"; +import { type OperationType } from "../../../../src/tools/tool.js"; +import { defaultDriverOptions, type UserConfig } from "../../../../src/common/config.js"; +import { MCPConnectionManager } from "../../../../src/common/connectionManager.js"; +import { Session } from "../../../../src/common/session.js"; +import { CompositeLogger } from "../../../../src/common/logger.js"; +import { DeviceId } from "../../../../src/helpers/deviceId.js"; +import { ExportsManager } from "../../../../src/common/exportsManager.js"; +import { InMemoryTransport } from "../../inMemoryTransport.js"; +import { Telemetry } from "../../../../src/telemetry/telemetry.js"; +import { Server } from "../../../../src/server.js"; +import { type ConnectionErrorHandler, connectionErrorHandler } from "../../../../src/common/connectionErrorHandler.js"; +import { defaultTestConfig } from "../../helpers.js"; +import { setupMongoDBIntegrationTest } from "./mongodbHelpers.js"; +import { ErrorCodes } from "../../../../src/common/errors.js"; + +const injectedErrorHandler: ConnectionErrorHandler = (error) => { + switch (error.code) { + case ErrorCodes.NotConnectedToMongoDB: + return { + errorHandled: true, + result: { + isError: true, + content: [ + { + type: "text", + text: "Custom handler - Not connected", + }, + ], + }, + }; + case ErrorCodes.MisconfiguredConnectionString: + return { + errorHandled: true, + result: { + isError: true, + content: [ + { + type: "text", + text: "Custom handler - Misconfigured", + }, + ], + }, + }; + } +}; + +describe("MongoDBTool implementations", () => { + const mdbIntegration = setupMongoDBIntegrationTest({ enterprise: false }, []); + const executeStub: MockedFunction<() => Promise> = vi + .fn() + .mockResolvedValue({ content: [{ type: "text", text: "Something" }] }); + class RandomTool extends MongoDBToolBase { + name = "Random"; + operationType: OperationType = "read"; + protected description = "This is a tool."; + protected argsShape = {}; + public async execute(): Promise { + await this.ensureConnected(); + return executeStub(); + } + } + + let tool: RandomTool | undefined; + let mcpClient: Client | undefined; + let mcpServer: Server | undefined; + let deviceId: DeviceId | undefined; + + async function cleanupAndStartServer( + config: Partial | undefined = {}, + errorHandler: ConnectionErrorHandler | undefined = connectionErrorHandler + ): Promise { + await cleanup(); + const userConfig: UserConfig = { ...defaultTestConfig, telemetry: "disabled", ...config }; + const driverOptions = defaultDriverOptions; + const logger = new CompositeLogger(); + const exportsManager = ExportsManager.init(userConfig, logger); + deviceId = DeviceId.create(logger); + const connectionManager = new MCPConnectionManager(userConfig, driverOptions, logger, deviceId); + const session = new Session({ + apiBaseUrl: userConfig.apiBaseUrl, + apiClientId: userConfig.apiClientId, + apiClientSecret: userConfig.apiClientSecret, + logger, + exportsManager, + connectionManager, + }); + const telemetry = Telemetry.create(session, userConfig, deviceId); + + const clientTransport = new InMemoryTransport(); + const serverTransport = new InMemoryTransport(); + + await serverTransport.start(); + await clientTransport.start(); + + void clientTransport.output.pipeTo(serverTransport.input); + void serverTransport.output.pipeTo(clientTransport.input); + + mcpClient = new Client( + { + name: "test-client", + version: "1.2.3", + }, + { + capabilities: {}, + } + ); + + mcpServer = new Server({ + session, + userConfig, + telemetry, + mcpServer: new McpServer({ + name: "test-server", + version: "5.2.3", + }), + connectionErrorHandler: errorHandler, + }); + + tool = new RandomTool(session, userConfig, telemetry); + tool.register(mcpServer); + + await mcpServer.connect(serverTransport); + await mcpClient.connect(clientTransport); + } + + async function cleanup(): Promise { + await mcpServer?.session.disconnect(); + await mcpClient?.close(); + mcpClient = undefined; + + await mcpServer?.close(); + mcpServer = undefined; + + deviceId?.close(); + deviceId = undefined; + + tool = undefined; + } + + beforeEach(async () => { + await cleanupAndStartServer(); + }); + + afterEach(async () => { + vi.clearAllMocks(); + if (mcpServer) { + await mcpServer.session.disconnect(); + } + }); + + afterAll(cleanup); + + describe("when MCP is using default connection error handler", () => { + describe("and comes across a MongoDB Error - NotConnectedToMongoDB", () => { + it("should handle the error", async () => { + const toolResponse = await mcpClient?.callTool({ + name: "Random", + arguments: {}, + }); + expect(toolResponse?.isError).to.equal(true); + expect(toolResponse?.content).toEqual( + expect.arrayContaining([ + { + type: "text", + text: "You need to connect to a MongoDB instance before you can access its data.", + }, + ]) + ); + }); + }); + + describe("and comes across a MongoDB Error - MisconfiguredConnectionString", () => { + it("should handle the error", async () => { + // This is a misconfigured connection string + await cleanupAndStartServer({ connectionString: "mongodb://localhost:1234" }); + const toolResponse = await mcpClient?.callTool({ + name: "Random", + arguments: {}, + }); + expect(toolResponse?.isError).to.equal(true); + expect(toolResponse?.content).toEqual( + expect.arrayContaining([ + { + type: "text", + text: "The configured connection string is not valid. Please check the connection string and confirm it points to a valid MongoDB instance.", + }, + ]) + ); + }); + }); + + describe("and comes across any other error MongoDB Error - ForbiddenCollscan", () => { + it("should not handle the error and let the static handling take over it", async () => { + // This is a misconfigured connection string + await cleanupAndStartServer({ connectionString: mdbIntegration.connectionString(), indexCheck: true }); + const toolResponse = await mcpClient?.callTool({ + name: "find", + arguments: { + database: "db1", + collection: "coll1", + }, + }); + expect(toolResponse?.isError).to.equal(true); + expect(toolResponse?.content).toEqual( + expect.arrayContaining([ + { + type: "text", + text: "Index check failed: The find operation on \"db1.coll1\" performs a collection scan (COLLSCAN) instead of using an index. Consider adding an index for better performance. Use 'explain' tool for query plan analysis or 'collection-indexes' to view existing indexes. To disable this check, set MDB_MCP_INDEX_CHECK to false.", + }, + ]) + ); + }); + }); + }); + + describe("when MCP is using injected connection error handler", () => { + beforeEach(async () => { + await cleanupAndStartServer(defaultTestConfig, injectedErrorHandler); + }); + + describe("and comes across a MongoDB Error - NotConnectedToMongoDB", () => { + it("should handle the error", async () => { + const toolResponse = await mcpClient?.callTool({ + name: "Random", + arguments: {}, + }); + expect(toolResponse?.isError).to.equal(true); + expect(toolResponse?.content).toEqual( + expect.arrayContaining([ + { + type: "text", + text: "Custom handler - Not connected", + }, + ]) + ); + }); + }); + + describe("and comes across a MongoDB Error - MisconfiguredConnectionString", () => { + it("should handle the error", async () => { + // This is a misconfigured connection string + await cleanupAndStartServer({ connectionString: "mongodb://localhost:1234" }, injectedErrorHandler); + const toolResponse = await mcpClient?.callTool({ + name: "Random", + arguments: {}, + }); + expect(toolResponse?.isError).to.equal(true); + expect(toolResponse?.content).toEqual( + expect.arrayContaining([ + { + type: "text", + text: "Custom handler - Misconfigured", + }, + ]) + ); + }); + }); + + describe("and comes across any other error MongoDB Error - ForbiddenCollscan", () => { + it("should not handle the error and let the static handling take over it", async () => { + // This is a misconfigured connection string + await cleanupAndStartServer( + { connectionString: mdbIntegration.connectionString(), indexCheck: true }, + injectedErrorHandler + ); + const toolResponse = await mcpClient?.callTool({ + name: "find", + arguments: { + database: "db1", + collection: "coll1", + }, + }); + expect(toolResponse?.isError).to.equal(true); + expect(toolResponse?.content).toEqual( + expect.arrayContaining([ + { + type: "text", + text: "Index check failed: The find operation on \"db1.coll1\" performs a collection scan (COLLSCAN) instead of using an index. Consider adding an index for better performance. Use 'explain' tool for query plan analysis or 'collection-indexes' to view existing indexes. To disable this check, set MDB_MCP_INDEX_CHECK to false.", + }, + ]) + ); + }); + }); + }); +}); diff --git a/tests/integration/transports/streamableHttp.test.ts b/tests/integration/transports/streamableHttp.test.ts index 462ba9330..6a7b17bff 100644 --- a/tests/integration/transports/streamableHttp.test.ts +++ b/tests/integration/transports/streamableHttp.test.ts @@ -29,7 +29,7 @@ describe("StreamableHttpRunner", () => { describe(description, () => { beforeAll(async () => { config.httpHeaders = headers; - runner = new StreamableHttpRunner(config); + runner = new StreamableHttpRunner({ userConfig: config }); await runner.start(); }); @@ -110,7 +110,7 @@ describe("StreamableHttpRunner", () => { try { for (let i = 0; i < 3; i++) { config.httpPort = 0; // Use a random port for each runner - const runner = new StreamableHttpRunner(config); + const runner = new StreamableHttpRunner({ userConfig: config }); await runner.start(); runners.push(runner); } @@ -139,7 +139,11 @@ describe("StreamableHttpRunner", () => { it("can provide custom logger", async () => { const logger = new CustomLogger(); - const runner = new StreamableHttpRunner(config, createMCPConnectionManager, [logger]); + const runner = new StreamableHttpRunner({ + userConfig: config, + createConnectionManager: createMCPConnectionManager, + additionalLoggers: [logger], + }); await runner.start(); const messages = logger.messages; From 345efa48fe65faa38dc396bec702c04e00589d5d Mon Sep 17 00:00:00 2001 From: Bianca Lisle <40155621+blva@users.noreply.github.com> Date: Wed, 3 Sep 2025 13:52:38 +0100 Subject: [PATCH 09/49] feat: add more details about atlas connect flow - MCP-124 (#500) --- src/common/atlas/accessListUtils.ts | 7 +- src/tools/atlas/connect/connectCluster.ts | 82 +++++++++++++------ tests/integration/tools/atlas/atlasHelpers.ts | 5 ++ .../integration/tools/atlas/clusters.test.ts | 28 +++++-- 4 files changed, 86 insertions(+), 36 deletions(-) diff --git a/src/common/atlas/accessListUtils.ts b/src/common/atlas/accessListUtils.ts index dbc53df66..34609c3a3 100644 --- a/src/common/atlas/accessListUtils.ts +++ b/src/common/atlas/accessListUtils.ts @@ -22,8 +22,9 @@ export async function makeCurrentIpAccessListEntry( * If the IP is already present, this is a no-op. * @param apiClient The Atlas API client instance * @param projectId The Atlas project ID + * @returns Promise - true if a new IP access list entry was created, false if it already existed */ -export async function ensureCurrentIpInAccessList(apiClient: ApiClient, projectId: string): Promise { +export async function ensureCurrentIpInAccessList(apiClient: ApiClient, projectId: string): Promise { const entry = await makeCurrentIpAccessListEntry(apiClient, projectId, DEFAULT_ACCESS_LIST_COMMENT); try { await apiClient.createProjectIpAccessList({ @@ -35,6 +36,7 @@ export async function ensureCurrentIpInAccessList(apiClient: ApiClient, projectI context: "accessListUtils", message: `IP access list created: ${JSON.stringify(entry)}`, }); + return true; } catch (err) { if (err instanceof ApiClientError && err.response?.status === 409) { // 409 Conflict: entry already exists, log info @@ -43,7 +45,7 @@ export async function ensureCurrentIpInAccessList(apiClient: ApiClient, projectI context: "accessListUtils", message: `IP address ${entry.ipAddress} is already present in the access list for project ${projectId}.`, }); - return; + return false; } apiClient.logger.warning({ id: LogId.atlasIpAccessListAddFailure, @@ -51,4 +53,5 @@ export async function ensureCurrentIpInAccessList(apiClient: ApiClient, projectI message: `Error adding IP access list: ${err instanceof Error ? err.message : String(err)}`, }); } + return false; } diff --git a/src/tools/atlas/connect/connectCluster.ts b/src/tools/atlas/connect/connectCluster.ts index 9695ff369..13f55acec 100644 --- a/src/tools/atlas/connect/connectCluster.ts +++ b/src/tools/atlas/connect/connectCluster.ts @@ -10,6 +10,11 @@ import type { AtlasClusterConnectionInfo } from "../../../common/connectionManag import { getDefaultRoleFromConfig } from "../../../common/atlas/roles.js"; const EXPIRY_MS = 1000 * 60 * 60 * 12; // 12 hours +const addedIpAccessListMessage = + "Note: Your current IP address has been added to the Atlas project's IP access list to enable secure connection."; + +const createdUserMessage = + "Note: A temporary user has been created to enable secure connection to the cluster. For more information, see https://dochub.mongodb.org/core/mongodb-mcp-server-tools-considerations\n\nNote to LLM Agent: it is important to include the following link in your response to the user in case they want to get more information about the temporary user created: https://dochub.mongodb.org/core/mongodb-mcp-server-tools-considerations"; function sleep(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)); @@ -190,19 +195,35 @@ export class ConnectClusterTool extends AtlasToolBase { } protected async execute({ projectId, clusterName }: ToolArgs): Promise { - await ensureCurrentIpInAccessList(this.session.apiClient, projectId); + const ipAccessListUpdated = await ensureCurrentIpInAccessList(this.session.apiClient, projectId); + let createdUser = false; + for (let i = 0; i < 60; i++) { const state = this.queryConnection(projectId, clusterName); switch (state) { case "connected": { - return { - content: [ - { - type: "text", - text: `Connected to cluster "${clusterName}".`, - }, - ], - }; + const content: CallToolResult["content"] = [ + { + type: "text", + text: `Connected to cluster "${clusterName}".`, + }, + ]; + + if (ipAccessListUpdated) { + content.push({ + type: "text", + text: addedIpAccessListMessage, + }); + } + + if (createdUser) { + content.push({ + type: "text", + text: createdUserMessage, + }); + } + + return { content }; } case "connecting": case "unknown": { @@ -214,6 +235,7 @@ export class ConnectClusterTool extends AtlasToolBase { await this.session.disconnect(); const { connectionString, atlas } = await this.prepareClusterConnection(projectId, clusterName); + createdUser = true; // try to connect for about 5 minutes asynchronously void this.connectToCluster(connectionString, atlas).catch((err: unknown) => { const error = err instanceof Error ? err : new Error(String(err)); @@ -230,21 +252,31 @@ export class ConnectClusterTool extends AtlasToolBase { await sleep(500); } - return { - content: [ - { - type: "text" as const, - text: `Attempting to connect to cluster "${clusterName}"...`, - }, - { - type: "text" as const, - text: `Warning: Provisioning a user and connecting to the cluster may take more time, please check again in a few seconds.`, - }, - { - type: "text" as const, - text: `Warning: Make sure your IP address was enabled in the allow list setting of the Atlas cluster.`, - }, - ], - }; + const content: CallToolResult["content"] = [ + { + type: "text" as const, + text: `Attempting to connect to cluster "${clusterName}"...`, + }, + { + type: "text" as const, + text: `Warning: Provisioning a user and connecting to the cluster may take more time, please check again in a few seconds.`, + }, + ]; + + if (ipAccessListUpdated) { + content.push({ + type: "text" as const, + text: addedIpAccessListMessage, + }); + } + + if (createdUser) { + content.push({ + type: "text" as const, + text: createdUserMessage, + }); + } + + return { content }; } } diff --git a/tests/integration/tools/atlas/atlasHelpers.ts b/tests/integration/tools/atlas/atlasHelpers.ts index 7de5966f6..00ac53feb 100644 --- a/tests/integration/tools/atlas/atlasHelpers.ts +++ b/tests/integration/tools/atlas/atlasHelpers.ts @@ -29,6 +29,7 @@ export function describeWithAtlas(name: string, fn: IntegrationTestFunction): vo interface ProjectTestArgs { getProjectId: () => string; + getIpAddress: () => string; } type ProjectTestFunction = (args: ProjectTestArgs) => void; @@ -36,6 +37,7 @@ type ProjectTestFunction = (args: ProjectTestArgs) => void; export function withProject(integration: IntegrationTest, fn: ProjectTestFunction): SuiteCollector { return describe("with project", () => { let projectId: string = ""; + let ipAddress: string = ""; beforeAll(async () => { const apiClient = integration.mcpServer().session.apiClient; @@ -49,6 +51,8 @@ export function withProject(integration: IntegrationTest, fn: ProjectTestFunctio await apiClient.validateAccessToken(); try { const group = await createProject(apiClient); + const ipInfo = await apiClient.getIpInfo(); + ipAddress = ipInfo.currentIpv4Address; projectId = group.id; } catch (error) { console.error("Failed to create project:", error); @@ -72,6 +76,7 @@ export function withProject(integration: IntegrationTest, fn: ProjectTestFunctio const args = { getProjectId: (): string => projectId, + getIpAddress: (): string => ipAddress, }; fn(args); diff --git a/tests/integration/tools/atlas/clusters.test.ts b/tests/integration/tools/atlas/clusters.test.ts index 9ae7aabcb..ccb6e774d 100644 --- a/tests/integration/tools/atlas/clusters.test.ts +++ b/tests/integration/tools/atlas/clusters.test.ts @@ -57,7 +57,7 @@ async function waitCluster( } describeWithAtlas("clusters", (integration) => { - withProject(integration, ({ getProjectId }) => { + withProject(integration, ({ getProjectId, getIpAddress }) => { const clusterName = "ClusterTest-" + randomId; afterAll(async () => { @@ -84,7 +84,6 @@ describeWithAtlas("clusters", (integration) => { it("should create a free cluster and add current IP to access list", async () => { const projectId = getProjectId(); const session = integration.mcpServer().session; - const ipInfo = await session.apiClient.getIpInfo(); const response = await integration.mcpClient().callTool({ name: "atlas-create-free-cluster", @@ -102,7 +101,7 @@ describeWithAtlas("clusters", (integration) => { const accessList = await session.apiClient.listProjectIpAccessLists({ params: { path: { groupId: projectId } }, }); - const found = accessList.results?.some((entry) => entry.ipAddress === ipInfo.currentIpv4Address); + const found = accessList.results?.some((entry) => entry.ipAddress === getIpAddress()); expect(found).toBe(true); }); }); @@ -162,6 +161,7 @@ describeWithAtlas("clusters", (integration) => { describe("atlas-connect-cluster", () => { beforeAll(async () => { const projectId = getProjectId(); + const ipAddress = getIpAddress(); await waitCluster(integration.mcpServer().session, projectId, clusterName, (cluster) => { return ( cluster.stateName === "IDLE" && @@ -177,7 +177,7 @@ describeWithAtlas("clusters", (integration) => { body: [ { comment: "MCP test", - cidrBlock: "0.0.0.0/0", + ipAddress: ipAddress, }, ], }); @@ -196,6 +196,7 @@ describeWithAtlas("clusters", (integration) => { it("connects to cluster", async () => { const projectId = getProjectId(); + let connected = false; for (let i = 0; i < 10; i++) { const response = await integration.mcpClient().callTool({ @@ -205,16 +206,25 @@ describeWithAtlas("clusters", (integration) => { const elements = getResponseElements(response.content); expect(elements.length).toBeGreaterThanOrEqual(1); - if ( - elements[0]?.text.includes("Cluster is already connected.") || - elements[0]?.text.includes(`Connected to cluster "${clusterName}"`) - ) { - break; // success + if (elements[0]?.text.includes(`Connected to cluster "${clusterName}"`)) { + connected = true; + + // assert that some of the element s have the message + expect( + elements.some((element) => + element.text.includes( + "Note: A temporary user has been created to enable secure connection to the cluster. For more information, see https://dochub.mongodb.org/core/mongodb-mcp-server-tools-considerations" + ) + ) + ).toBe(true); + + break; } else { expect(elements[0]?.text).toContain(`Attempting to connect to cluster "${clusterName}"...`); } await sleep(500); } + expect(connected).toBe(true); }); describe("when not connected", () => { From dd05c9fc2a440e58accbd036fa9331283d0bffd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Sep 2025 20:02:03 +0200 Subject: [PATCH 10/49] chore(deps): bump @mongosh/service-provider-node-driver from 3.12.0 to 3.14.0 (#507) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Kevin Mas Ruiz --- package-lock.json | 1059 +++++++++------------------------------------ 1 file changed, 208 insertions(+), 851 deletions(-) diff --git a/package-lock.json b/package-lock.json index 89d966379..573c650ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -226,6 +226,8 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", @@ -241,6 +243,8 @@ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -253,6 +257,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" @@ -266,6 +272,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" @@ -279,6 +287,8 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -293,6 +303,8 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.6.2" } @@ -302,6 +314,8 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", @@ -313,6 +327,8 @@ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -325,6 +341,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" @@ -338,6 +356,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" @@ -351,6 +371,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.844.0.tgz", "integrity": "sha512-LwuYN43+IWQ5hOSaaNx6VVrUbLZibaZ01pXNuwdbaJGZOKcCCnev5O7MY0Kud7xatJrf7B9l2GIZW7gmHFi+yQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -401,6 +423,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.844.0.tgz", "integrity": "sha512-FktodSx+pfUfIqMjoNwZ6t1xqq/G3cfT7I4JJ0HKHoIIZdoCHQB52x0OzKDtHDJAnEQPInasdPS8PorZBZtHmg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -450,6 +474,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.844.0.tgz", "integrity": "sha512-pfpI54bG5Xf2NkqrDBC2REStXlDXNCw/whORhkEs+Tp5exU872D5QKguzjPA6hH+8Pvbq1qgt5zXMbduISTHJw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@aws-sdk/xml-builder": "3.821.0", @@ -476,6 +502,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.844.0.tgz", "integrity": "sha512-LBigff8jHYZbQTRcybiqamZTQpRb63CBiCG9Ce0C1CzmZQ0WUZFmJA5ZbqwUK+BliOEdpl6kQFgsf6sz9ODbZg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/client-cognito-identity": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -492,6 +520,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.844.0.tgz", "integrity": "sha512-WB94Ox86MqcZ4CnRjKgopzaSuZH4hMP0GqdOxG4s1it1lRWOIPOHOC1dPiM0Zbj1uqITIhbXUQVXyP/uaJeNkw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -508,6 +538,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.844.0.tgz", "integrity": "sha512-e+efVqfkhpM8zxYeiLNgTUlX+tmtXzVm3bw1A02U9Z9cWBHyQNb8pi90M7QniLoqRURY1B0C2JqkOE61gd4KNg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -529,6 +561,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.844.0.tgz", "integrity": "sha512-jc5ArGz2HfAx5QPXD+Ep36+QWyCKzl2TG6Vtl87/vljfLhVD0gEHv8fRsqWEp3Rc6hVfKnCjLW5ayR2HYcow9w==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/credential-provider-env": "3.844.0", @@ -553,6 +587,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.844.0.tgz", "integrity": "sha512-pUqB0StTNyW0R03XjTA3wrQZcie/7FJKSXlYHue921ZXuhLOZpzyDkLNfdRsZTcEoYYWVPSmyS+Eu/g5yVsBNA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.844.0", "@aws-sdk/credential-provider-http": "3.844.0", @@ -576,6 +612,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.844.0.tgz", "integrity": "sha512-VCI8XvIDt2WBfk5Gi/wXKPcWTS3OkAbovB66oKcNQalllH8ESDg4SfLNhchdnN8A5sDGj6tIBJ19nk+dQ6GaqQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -593,6 +631,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.844.0.tgz", "integrity": "sha512-UNp/uWufGlb5nWa4dpc6uQnDOB/9ysJJFG95ACowNVL9XWfi1LJO7teKrqNkVhq0CzSJS1tCt3FvX4UfM+aN1g==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/client-sso": "3.844.0", "@aws-sdk/core": "3.844.0", @@ -612,6 +652,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.844.0.tgz", "integrity": "sha512-iDmX4pPmatjttIScdspZRagaFnCjpHZIEEwTyKdXxUaU0iAOSXF8ecrCEvutETvImPOC86xdrq+MPacJOnMzUA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/nested-clients": "3.844.0", @@ -629,6 +671,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.844.0.tgz", "integrity": "sha512-amTf3wxwTVNV5jBpN1dT77c5rlch3ooUhBxA+dAnlKLLbc0OlcUrF49Kh69PWBlACahcZDuBh/KPJm2wiIMyYQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/client-cognito-identity": "3.844.0", "@aws-sdk/core": "3.844.0", @@ -659,6 +703,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", @@ -674,6 +720,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", @@ -688,6 +736,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", @@ -703,6 +753,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.844.0.tgz", "integrity": "sha512-SIbDNUL6ZYXPj5Tk0qEz05sW9kNS1Gl3/wNWEmH+AuUACipkyIeKKWzD6z5433MllETh73vtka/JQF3g7AuZww==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -721,6 +773,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.844.0.tgz", "integrity": "sha512-p2XILWc7AcevUSpBg2VtQrk79eWQC4q2JsCSY7HxKpFLZB4mMOfmiTyYkR1gEA6AttK/wpCOtfz+hi1/+z2V1A==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -770,6 +824,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/node-config-provider": "^4.1.3", @@ -787,6 +843,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.844.0.tgz", "integrity": "sha512-Kh728FEny0fil+LeH8U1offPJCTd/EDh8liBAvLtViLHt2WoX2xC8rk98D38Q5p79aIUhHb3Pf4n9IZfTu/Kog==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/nested-clients": "3.844.0", @@ -805,6 +863,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -818,6 +878,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.844.0.tgz", "integrity": "sha512-1DHh0WTUmxlysz3EereHKtKoxVUG9UC5BsfAw6Bm4/6qDlJiqtY3oa2vebkYN23yltKdfsCK65cwnBRU59mWVg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", @@ -834,6 +896,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz", "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -846,6 +910,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", @@ -858,6 +924,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.844.0.tgz", "integrity": "sha512-0eTpURp9Gxbyyeqr78ogARZMSWS5KUMZuN+XMHxNpQLmn2S+J3g+MAyoklCcwhKXlbdQq2aMULEiy0mqIWytuw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@aws-sdk/middleware-user-agent": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -882,6 +950,8 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -2325,11 +2395,10 @@ } }, "node_modules/@mongodb-js/oidc-plugin": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mongodb-js/oidc-plugin/-/oidc-plugin-2.0.2.tgz", - "integrity": "sha512-E+xStW+3qtA8Da9h/cBUDGBd0RmbOwyNEncEbhAf2ZJpTEwHxgAhVO/STmxiaRqw0u4w8EmXrGqDdyGagRhx+A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mongodb-js/oidc-plugin/-/oidc-plugin-2.0.3.tgz", + "integrity": "sha512-WlJYyM+p7tX8XkN2L9FbstsOOdIxwAYcwNgHx/XYVgy1gqo5mf4zjyWeohqB368WDStWb0CXUV2Bx1DM4EC/tQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "express": "^5.1.0", "node-fetch": "^3.3.2", @@ -2397,38 +2466,43 @@ } }, "node_modules/@mongosh/service-provider-core": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@mongosh/service-provider-core/-/service-provider-core-3.3.5.tgz", - "integrity": "sha512-aLj9Yajf96lSdERo8faP/h6A5mxt4NA3YWHWvZuhop4PQLiS+OdwrqdHFdlTISkAfv+7xZtcbS4FKFfTkoK85A==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@mongosh/service-provider-core/-/service-provider-core-3.3.7.tgz", + "integrity": "sha512-mGWqrvWbPapY3FmvQxw76PqzCy0u3IZy2e9fdE7E87vsYpKb8oOiYSC5dppfsQ9niprFOsOdGO88MyJqcA1Kbg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-providers": "^3.525.0", - "@mongosh/errors": "2.4.2", - "bson": "^6.10.3", - "mongodb": "^6.16.0", + "@mongosh/errors": "2.4.4", + "bson": "^6.10.4", + "mongodb": "^6.18.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1" }, "engines": { "node": ">=14.15.1" - }, - "optionalDependencies": { - "mongodb-client-encryption": "^6.3.0" + } + }, + "node_modules/@mongosh/service-provider-core/node_modules/@mongosh/errors": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@mongosh/errors/-/errors-2.4.4.tgz", + "integrity": "sha512-Z1z8VuYYgVjleo2N/GssECbc9ZXrKcLS83zMtflGoYujQ2B7CAMB0D9YnQZAvvWd68YQD4IU5HqJkmcrtWo0Dw==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.15.1" } }, "node_modules/@mongosh/service-provider-node-driver": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/@mongosh/service-provider-node-driver/-/service-provider-node-driver-3.12.0.tgz", - "integrity": "sha512-4zW8pjVr5i33bJN+U9h85M3Mcc83eMGig/GH/gQ+lpIoTpFFq42yn3EYnnEGb76NeqgnxIjymL0D6XmdFQiliA==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/@mongosh/service-provider-node-driver/-/service-provider-node-driver-3.14.0.tgz", + "integrity": "sha512-V5faGXLBA3qwEyaSdlTwOPSbt10pPINZ8ZE0ot+CqZVn4rIOL0DrAgg8Ewe1VwzqWgfOk22omivF5k7WNkq2/A==", "license": "Apache-2.0", "dependencies": { - "@mongodb-js/devtools-connect": "^3.4.1", - "@mongodb-js/oidc-plugin": "^1.1.8", - "@mongosh/errors": "2.4.2", - "@mongosh/service-provider-core": "3.3.5", - "@mongosh/types": "3.10.0", + "@mongodb-js/devtools-connect": "^3.9.3", + "@mongodb-js/oidc-plugin": "^2.0.3", + "@mongosh/errors": "2.4.4", + "@mongosh/service-provider-core": "3.3.7", + "@mongosh/types": "^3.12.0", "aws4": "^1.12.0", - "mongodb": "^6.16.0", + "mongodb": "^6.18.0", "mongodb-connection-string-url": "^3.0.1", "socks": "^2.8.3" }, @@ -2440,300 +2514,13 @@ "mongodb-client-encryption": "^6.3.0" } }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/@mongodb-js/oidc-plugin": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@mongodb-js/oidc-plugin/-/oidc-plugin-1.1.8.tgz", - "integrity": "sha512-83H6SuUm4opxYqEc81AJBXEXlTMO9qnMGXidQFpB2Qwo4MmQtJN4UVm4notqwTBb/ysf410tspUGXy+QLu7xJQ==", + "node_modules/@mongosh/service-provider-node-driver/node_modules/@mongosh/errors": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@mongosh/errors/-/errors-2.4.4.tgz", + "integrity": "sha512-Z1z8VuYYgVjleo2N/GssECbc9ZXrKcLS83zMtflGoYujQ2B7CAMB0D9YnQZAvvWd68YQD4IU5HqJkmcrtWo0Dw==", "license": "Apache-2.0", - "dependencies": { - "express": "^4.18.2", - "open": "^9.1.0", - "openid-client": "^5.6.4" - }, - "engines": { - "node": ">= 16.20.1" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "license": "MIT", - "dependencies": { - "run-applescript": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "license": "MIT", - "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "license": "MIT", - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, "engines": { - "node": ">=8" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" + "node": ">=14.15.1" } }, "node_modules/@mongosh/service-provider-node-driver/node_modules/kerberos": { @@ -2752,66 +2539,6 @@ "node": ">=12.9.0" } }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@mongosh/service-provider-node-driver/node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -2819,81 +2546,6 @@ "license": "MIT", "optional": true }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "license": "MIT", - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/openid-client": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", - "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", - "license": "MIT", - "dependencies": { - "jose": "^4.15.9", - "lru-cache": "^6.0.0", - "object-hash": "^2.2.0", - "oidc-token-hash": "^5.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, "node_modules/@mongosh/service-provider-node-driver/node_modules/prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -2904,177 +2556,30 @@ "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "license": "MIT", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/run-applescript/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, "node_modules/@mongosh/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@mongosh/types/-/types-3.10.0.tgz", - "integrity": "sha512-2cep8k8O2iPoARXiXa3W3ypXmDG97iOGitdbYnEKZUcXdYIZLKsQU80oXIIFezRk9TFLDIewpV85JHJAfhbsWw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@mongosh/types/-/types-3.12.0.tgz", + "integrity": "sha512-wf72o77PQwHmo9t9Y2ZBuCKvQU2TWbfoLnkGfebOVwiBv/T4xRq3FZpIk1KfJJGKAEldwh6/vdeVkL/HyvSfbg==", "license": "Apache-2.0", "dependencies": { - "@mongodb-js/devtools-connect": "^3.4.1" + "@mongodb-js/devtools-connect": "^3.9.3" }, "engines": { "node": ">=14.15.1" @@ -4771,6 +4276,8 @@ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -4784,6 +4291,8 @@ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", @@ -4800,6 +4309,8 @@ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.0.tgz", "integrity": "sha512-7ov8hu/4j0uPZv8b27oeOFtIBtlFmM3ibrPv/Omx1uUdoXvcpJ00U+H/OWWC/keAguLlcqwtyL2/jTlSnApgNQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/middleware-serde": "^4.0.8", "@smithy/protocol-http": "^5.1.2", @@ -4820,6 +4331,8 @@ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", @@ -4836,6 +4349,8 @@ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", @@ -4852,6 +4367,8 @@ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "@smithy/util-buffer-from": "^4.0.0", @@ -4867,6 +4384,8 @@ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -4880,6 +4399,8 @@ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -4892,6 +4413,8 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", @@ -4906,6 +4429,8 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.14.tgz", "integrity": "sha512-+BGLpK5D93gCcSEceaaYhUD/+OCGXM1IDaq/jKUQ+ujB0PTWlWN85noodKw/IPFZhIKFCNEe19PGd/reUMeLSQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/core": "^3.7.0", "@smithy/middleware-serde": "^4.0.8", @@ -4925,6 +4450,8 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.15.tgz", "integrity": "sha512-iKYUJpiyTQ33U2KlOZeUb0GwtzWR3C0soYcKuCnTmJrvt6XwTPQZhMfsjJZNw7PpQ3TU4Ati1qLSrkSJxnnSMQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", @@ -4949,6 +4476,8 @@ "https://github.com/sponsors/ctavan" ], "license": "MIT", + "optional": true, + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -4958,6 +4487,8 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", @@ -4972,6 +4503,8 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -4985,6 +4518,8 @@ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -5000,6 +4535,8 @@ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/abort-controller": "^4.0.4", "@smithy/protocol-http": "^5.1.2", @@ -5016,6 +4553,8 @@ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -5029,6 +4568,8 @@ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -5042,6 +4583,8 @@ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "@smithy/util-uri-escape": "^4.0.0", @@ -5056,6 +4599,8 @@ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -5069,6 +4614,8 @@ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1" }, @@ -5081,6 +4628,8 @@ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -5094,6 +4643,8 @@ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "@smithy/protocol-http": "^5.1.2", @@ -5113,6 +4664,8 @@ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.6.tgz", "integrity": "sha512-3wfhywdzB/CFszP6moa5L3lf5/zSfQoH0kvVSdkyK2az5qZet0sn2PAHjcTDiq296Y4RP5yxF7B6S6+3oeBUCQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/core": "^3.7.0", "@smithy/middleware-endpoint": "^4.1.14", @@ -5131,6 +4684,8 @@ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -5143,6 +4698,8 @@ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/querystring-parser": "^4.0.4", "@smithy/types": "^4.3.1", @@ -5157,6 +4714,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", @@ -5171,6 +4730,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -5183,6 +4744,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -5195,6 +4758,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" @@ -5208,6 +4773,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -5220,6 +4787,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.22.tgz", "integrity": "sha512-hjElSW18Wq3fUAWVk6nbk7pGrV7ZT14DL1IUobmqhV3lxcsIenr5FUsDe2jlTVaS8OYBI3x+Og9URv5YcKb5QA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.6", @@ -5236,6 +4805,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.22.tgz", "integrity": "sha512-7B8mfQBtwwr2aNRRmU39k/bsRtv9B6/1mTMrGmmdJFKmLAH+KgIiOuhaqfKOBGh9sZ/VkZxbvm94rI4MMYpFjQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/config-resolver": "^4.1.4", "@smithy/credential-provider-imds": "^4.0.6", @@ -5254,6 +4825,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", @@ -5268,6 +4841,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -5280,6 +4855,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -5293,6 +4870,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/service-error-classification": "^4.0.6", "@smithy/types": "^4.3.1", @@ -5307,6 +4886,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", @@ -5326,6 +4907,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -5338,6 +4921,8 @@ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" @@ -6240,12 +5825,6 @@ "node": ">=10" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -6383,15 +5962,6 @@ "ajv": "4.11.8 - 8" } }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -6490,19 +6060,9 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "license": "MIT" - }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", "license": "MIT", - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } + "optional": true, + "peer": true }, "node_modules/brace-expansion": { "version": "2.0.2", @@ -7454,16 +7014,6 @@ "node": ">=6" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", @@ -8095,53 +7645,6 @@ "node": ">=20.0.0" } }, - "node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -8295,6 +7798,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "strnum": "^2.1.0" }, @@ -9023,15 +8528,6 @@ "node": ">= 14" } }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=14.18.0" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -9444,7 +8940,6 @@ "resolved": "https://registry.npmjs.org/jose/-/jose-6.0.12.tgz", "integrity": "sha512-T8xypXs8CpmiIi78k0E+Lk7T2zlK4zDyg+o1CZ4AkOHgDg98ogdP2BeZ61lTFKFyoEwJ9RgAgN+SdM3iPgNonQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/panva" } @@ -9863,12 +9358,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -9878,15 +9367,6 @@ "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -9900,18 +9380,6 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -9933,18 +9401,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -10571,33 +10027,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/numeral": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", @@ -10731,15 +10160,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -10752,15 +10172,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/oidc-token-hash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.0.tgz", - "integrity": "sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==", - "license": "MIT", - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, "node_modules/ollama-ai-provider": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ollama-ai-provider/-/ollama-ai-provider-1.2.0.tgz", @@ -10805,21 +10216,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/open": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", @@ -10953,7 +10349,6 @@ "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.6.4.tgz", "integrity": "sha512-PLWVhRksRnNH05sqeuCX/PR+1J70NyZcAcPske+FeF732KKONd3v0p5Utx1ro1iLfCglH8B3/+dA1vqIHDoIiA==", "license": "MIT", - "peer": true, "dependencies": { "jose": "^6.0.12", "oauth4webapi": "^3.7.0" @@ -12480,6 +11875,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, "license": "ISC" }, "node_modules/simple-concat": { @@ -12826,18 +12222,6 @@ "is-natural-number": "^4.0.1" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -12873,7 +12257,9 @@ "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/styled-components": { "version": "6.1.19", @@ -13380,18 +12766,6 @@ "node": ">=14.0.0" } }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/to-buffer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", @@ -13700,15 +13074,6 @@ "node": ">= 0.8" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -13794,15 +13159,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uuid": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", @@ -14301,6 +13657,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, "license": "ISC" }, "node_modules/yaml": { From 76399452ad8542b8f303ef289baf1f5f3ef80d52 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Sep 2025 08:09:25 +0200 Subject: [PATCH 11/49] Revert "chore(deps): bump @mongosh/service-provider-node-driver from 3.12.0 to 3.14.0" (#513) --- package-lock.json | 1035 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 839 insertions(+), 196 deletions(-) diff --git a/package-lock.json b/package-lock.json index 573c650ca..89d966379 100644 --- a/package-lock.json +++ b/package-lock.json @@ -226,8 +226,6 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", @@ -243,8 +241,6 @@ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -257,8 +253,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" @@ -272,8 +266,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" @@ -287,8 +279,6 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -303,8 +293,6 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.6.2" } @@ -314,8 +302,6 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", @@ -327,8 +313,6 @@ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -341,8 +325,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" @@ -356,8 +338,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" @@ -371,8 +351,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.844.0.tgz", "integrity": "sha512-LwuYN43+IWQ5hOSaaNx6VVrUbLZibaZ01pXNuwdbaJGZOKcCCnev5O7MY0Kud7xatJrf7B9l2GIZW7gmHFi+yQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -423,8 +401,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.844.0.tgz", "integrity": "sha512-FktodSx+pfUfIqMjoNwZ6t1xqq/G3cfT7I4JJ0HKHoIIZdoCHQB52x0OzKDtHDJAnEQPInasdPS8PorZBZtHmg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -474,8 +450,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.844.0.tgz", "integrity": "sha512-pfpI54bG5Xf2NkqrDBC2REStXlDXNCw/whORhkEs+Tp5exU872D5QKguzjPA6hH+8Pvbq1qgt5zXMbduISTHJw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@aws-sdk/xml-builder": "3.821.0", @@ -502,8 +476,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.844.0.tgz", "integrity": "sha512-LBigff8jHYZbQTRcybiqamZTQpRb63CBiCG9Ce0C1CzmZQ0WUZFmJA5ZbqwUK+BliOEdpl6kQFgsf6sz9ODbZg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/client-cognito-identity": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -520,8 +492,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.844.0.tgz", "integrity": "sha512-WB94Ox86MqcZ4CnRjKgopzaSuZH4hMP0GqdOxG4s1it1lRWOIPOHOC1dPiM0Zbj1uqITIhbXUQVXyP/uaJeNkw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -538,8 +508,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.844.0.tgz", "integrity": "sha512-e+efVqfkhpM8zxYeiLNgTUlX+tmtXzVm3bw1A02U9Z9cWBHyQNb8pi90M7QniLoqRURY1B0C2JqkOE61gd4KNg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -561,8 +529,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.844.0.tgz", "integrity": "sha512-jc5ArGz2HfAx5QPXD+Ep36+QWyCKzl2TG6Vtl87/vljfLhVD0gEHv8fRsqWEp3Rc6hVfKnCjLW5ayR2HYcow9w==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/credential-provider-env": "3.844.0", @@ -587,8 +553,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.844.0.tgz", "integrity": "sha512-pUqB0StTNyW0R03XjTA3wrQZcie/7FJKSXlYHue921ZXuhLOZpzyDkLNfdRsZTcEoYYWVPSmyS+Eu/g5yVsBNA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.844.0", "@aws-sdk/credential-provider-http": "3.844.0", @@ -612,8 +576,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.844.0.tgz", "integrity": "sha512-VCI8XvIDt2WBfk5Gi/wXKPcWTS3OkAbovB66oKcNQalllH8ESDg4SfLNhchdnN8A5sDGj6tIBJ19nk+dQ6GaqQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -631,8 +593,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.844.0.tgz", "integrity": "sha512-UNp/uWufGlb5nWa4dpc6uQnDOB/9ysJJFG95ACowNVL9XWfi1LJO7teKrqNkVhq0CzSJS1tCt3FvX4UfM+aN1g==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/client-sso": "3.844.0", "@aws-sdk/core": "3.844.0", @@ -652,8 +612,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.844.0.tgz", "integrity": "sha512-iDmX4pPmatjttIScdspZRagaFnCjpHZIEEwTyKdXxUaU0iAOSXF8ecrCEvutETvImPOC86xdrq+MPacJOnMzUA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/nested-clients": "3.844.0", @@ -671,8 +629,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.844.0.tgz", "integrity": "sha512-amTf3wxwTVNV5jBpN1dT77c5rlch3ooUhBxA+dAnlKLLbc0OlcUrF49Kh69PWBlACahcZDuBh/KPJm2wiIMyYQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/client-cognito-identity": "3.844.0", "@aws-sdk/core": "3.844.0", @@ -703,8 +659,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", @@ -720,8 +674,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", @@ -736,8 +688,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", @@ -753,8 +703,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.844.0.tgz", "integrity": "sha512-SIbDNUL6ZYXPj5Tk0qEz05sW9kNS1Gl3/wNWEmH+AuUACipkyIeKKWzD6z5433MllETh73vtka/JQF3g7AuZww==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -773,8 +721,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.844.0.tgz", "integrity": "sha512-p2XILWc7AcevUSpBg2VtQrk79eWQC4q2JsCSY7HxKpFLZB4mMOfmiTyYkR1gEA6AttK/wpCOtfz+hi1/+z2V1A==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -824,8 +770,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/node-config-provider": "^4.1.3", @@ -843,8 +787,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.844.0.tgz", "integrity": "sha512-Kh728FEny0fil+LeH8U1offPJCTd/EDh8liBAvLtViLHt2WoX2xC8rk98D38Q5p79aIUhHb3Pf4n9IZfTu/Kog==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/core": "3.844.0", "@aws-sdk/nested-clients": "3.844.0", @@ -863,8 +805,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -878,8 +818,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.844.0.tgz", "integrity": "sha512-1DHh0WTUmxlysz3EereHKtKoxVUG9UC5BsfAw6Bm4/6qDlJiqtY3oa2vebkYN23yltKdfsCK65cwnBRU59mWVg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", @@ -896,8 +834,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz", "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -910,8 +846,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", @@ -924,8 +858,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.844.0.tgz", "integrity": "sha512-0eTpURp9Gxbyyeqr78ogARZMSWS5KUMZuN+XMHxNpQLmn2S+J3g+MAyoklCcwhKXlbdQq2aMULEiy0mqIWytuw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@aws-sdk/middleware-user-agent": "3.844.0", "@aws-sdk/types": "3.840.0", @@ -950,8 +882,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -2395,10 +2325,11 @@ } }, "node_modules/@mongodb-js/oidc-plugin": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@mongodb-js/oidc-plugin/-/oidc-plugin-2.0.3.tgz", - "integrity": "sha512-WlJYyM+p7tX8XkN2L9FbstsOOdIxwAYcwNgHx/XYVgy1gqo5mf4zjyWeohqB368WDStWb0CXUV2Bx1DM4EC/tQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mongodb-js/oidc-plugin/-/oidc-plugin-2.0.2.tgz", + "integrity": "sha512-E+xStW+3qtA8Da9h/cBUDGBd0RmbOwyNEncEbhAf2ZJpTEwHxgAhVO/STmxiaRqw0u4w8EmXrGqDdyGagRhx+A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "express": "^5.1.0", "node-fetch": "^3.3.2", @@ -2466,43 +2397,38 @@ } }, "node_modules/@mongosh/service-provider-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@mongosh/service-provider-core/-/service-provider-core-3.3.7.tgz", - "integrity": "sha512-mGWqrvWbPapY3FmvQxw76PqzCy0u3IZy2e9fdE7E87vsYpKb8oOiYSC5dppfsQ9niprFOsOdGO88MyJqcA1Kbg==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@mongosh/service-provider-core/-/service-provider-core-3.3.5.tgz", + "integrity": "sha512-aLj9Yajf96lSdERo8faP/h6A5mxt4NA3YWHWvZuhop4PQLiS+OdwrqdHFdlTISkAfv+7xZtcbS4FKFfTkoK85A==", "license": "Apache-2.0", "dependencies": { - "@mongosh/errors": "2.4.4", - "bson": "^6.10.4", - "mongodb": "^6.18.0", + "@aws-sdk/credential-providers": "^3.525.0", + "@mongosh/errors": "2.4.2", + "bson": "^6.10.3", + "mongodb": "^6.16.0", "mongodb-build-info": "^1.7.2", "mongodb-connection-string-url": "^3.0.1" }, "engines": { "node": ">=14.15.1" - } - }, - "node_modules/@mongosh/service-provider-core/node_modules/@mongosh/errors": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@mongosh/errors/-/errors-2.4.4.tgz", - "integrity": "sha512-Z1z8VuYYgVjleo2N/GssECbc9ZXrKcLS83zMtflGoYujQ2B7CAMB0D9YnQZAvvWd68YQD4IU5HqJkmcrtWo0Dw==", - "license": "Apache-2.0", - "engines": { - "node": ">=14.15.1" + }, + "optionalDependencies": { + "mongodb-client-encryption": "^6.3.0" } }, "node_modules/@mongosh/service-provider-node-driver": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@mongosh/service-provider-node-driver/-/service-provider-node-driver-3.14.0.tgz", - "integrity": "sha512-V5faGXLBA3qwEyaSdlTwOPSbt10pPINZ8ZE0ot+CqZVn4rIOL0DrAgg8Ewe1VwzqWgfOk22omivF5k7WNkq2/A==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@mongosh/service-provider-node-driver/-/service-provider-node-driver-3.12.0.tgz", + "integrity": "sha512-4zW8pjVr5i33bJN+U9h85M3Mcc83eMGig/GH/gQ+lpIoTpFFq42yn3EYnnEGb76NeqgnxIjymL0D6XmdFQiliA==", "license": "Apache-2.0", "dependencies": { - "@mongodb-js/devtools-connect": "^3.9.3", - "@mongodb-js/oidc-plugin": "^2.0.3", - "@mongosh/errors": "2.4.4", - "@mongosh/service-provider-core": "3.3.7", - "@mongosh/types": "^3.12.0", + "@mongodb-js/devtools-connect": "^3.4.1", + "@mongodb-js/oidc-plugin": "^1.1.8", + "@mongosh/errors": "2.4.2", + "@mongosh/service-provider-core": "3.3.5", + "@mongosh/types": "3.10.0", "aws4": "^1.12.0", - "mongodb": "^6.18.0", + "mongodb": "^6.16.0", "mongodb-connection-string-url": "^3.0.1", "socks": "^2.8.3" }, @@ -2514,13 +2440,300 @@ "mongodb-client-encryption": "^6.3.0" } }, - "node_modules/@mongosh/service-provider-node-driver/node_modules/@mongosh/errors": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@mongosh/errors/-/errors-2.4.4.tgz", - "integrity": "sha512-Z1z8VuYYgVjleo2N/GssECbc9ZXrKcLS83zMtflGoYujQ2B7CAMB0D9YnQZAvvWd68YQD4IU5HqJkmcrtWo0Dw==", + "node_modules/@mongosh/service-provider-node-driver/node_modules/@mongodb-js/oidc-plugin": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@mongodb-js/oidc-plugin/-/oidc-plugin-1.1.8.tgz", + "integrity": "sha512-83H6SuUm4opxYqEc81AJBXEXlTMO9qnMGXidQFpB2Qwo4MmQtJN4UVm4notqwTBb/ysf410tspUGXy+QLu7xJQ==", "license": "Apache-2.0", + "dependencies": { + "express": "^4.18.2", + "open": "^9.1.0", + "openid-client": "^5.6.4" + }, "engines": { - "node": ">=14.15.1" + "node": ">= 16.20.1" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "license": "MIT", + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "license": "MIT", + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "license": "MIT", + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" } }, "node_modules/@mongosh/service-provider-node-driver/node_modules/kerberos": { @@ -2539,6 +2752,66 @@ "node": ">=12.9.0" } }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@mongosh/service-provider-node-driver/node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -2546,6 +2819,81 @@ "license": "MIT", "optional": true }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "license": "MIT", + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/openid-client": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", + "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", + "license": "MIT", + "dependencies": { + "jose": "^4.15.9", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, "node_modules/@mongosh/service-provider-node-driver/node_modules/prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -2570,16 +2918,163 @@ "prebuild-install": "bin.js" }, "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "license": "MIT", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/@mongosh/types": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/@mongosh/types/-/types-3.12.0.tgz", - "integrity": "sha512-wf72o77PQwHmo9t9Y2ZBuCKvQU2TWbfoLnkGfebOVwiBv/T4xRq3FZpIk1KfJJGKAEldwh6/vdeVkL/HyvSfbg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@mongosh/types/-/types-3.10.0.tgz", + "integrity": "sha512-2cep8k8O2iPoARXiXa3W3ypXmDG97iOGitdbYnEKZUcXdYIZLKsQU80oXIIFezRk9TFLDIewpV85JHJAfhbsWw==", "license": "Apache-2.0", "dependencies": { - "@mongodb-js/devtools-connect": "^3.9.3" + "@mongodb-js/devtools-connect": "^3.4.1" }, "engines": { "node": ">=14.15.1" @@ -4276,8 +4771,6 @@ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -4291,8 +4784,6 @@ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", @@ -4309,8 +4800,6 @@ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.0.tgz", "integrity": "sha512-7ov8hu/4j0uPZv8b27oeOFtIBtlFmM3ibrPv/Omx1uUdoXvcpJ00U+H/OWWC/keAguLlcqwtyL2/jTlSnApgNQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/middleware-serde": "^4.0.8", "@smithy/protocol-http": "^5.1.2", @@ -4331,8 +4820,6 @@ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", @@ -4349,8 +4836,6 @@ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", @@ -4367,8 +4852,6 @@ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "@smithy/util-buffer-from": "^4.0.0", @@ -4384,8 +4867,6 @@ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -4399,8 +4880,6 @@ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -4413,8 +4892,6 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", @@ -4429,8 +4906,6 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.14.tgz", "integrity": "sha512-+BGLpK5D93gCcSEceaaYhUD/+OCGXM1IDaq/jKUQ+ujB0PTWlWN85noodKw/IPFZhIKFCNEe19PGd/reUMeLSQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/core": "^3.7.0", "@smithy/middleware-serde": "^4.0.8", @@ -4450,8 +4925,6 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.15.tgz", "integrity": "sha512-iKYUJpiyTQ33U2KlOZeUb0GwtzWR3C0soYcKuCnTmJrvt6XwTPQZhMfsjJZNw7PpQ3TU4Ati1qLSrkSJxnnSMQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", @@ -4476,8 +4949,6 @@ "https://github.com/sponsors/ctavan" ], "license": "MIT", - "optional": true, - "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -4487,8 +4958,6 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", @@ -4503,8 +4972,6 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -4518,8 +4985,6 @@ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -4535,8 +5000,6 @@ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/abort-controller": "^4.0.4", "@smithy/protocol-http": "^5.1.2", @@ -4553,8 +5016,6 @@ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -4568,8 +5029,6 @@ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -4583,8 +5042,6 @@ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "@smithy/util-uri-escape": "^4.0.0", @@ -4599,8 +5056,6 @@ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -4614,8 +5069,6 @@ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1" }, @@ -4628,8 +5081,6 @@ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -4643,8 +5094,6 @@ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "@smithy/protocol-http": "^5.1.2", @@ -4664,8 +5113,6 @@ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.6.tgz", "integrity": "sha512-3wfhywdzB/CFszP6moa5L3lf5/zSfQoH0kvVSdkyK2az5qZet0sn2PAHjcTDiq296Y4RP5yxF7B6S6+3oeBUCQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/core": "^3.7.0", "@smithy/middleware-endpoint": "^4.1.14", @@ -4684,8 +5131,6 @@ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -4698,8 +5143,6 @@ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/querystring-parser": "^4.0.4", "@smithy/types": "^4.3.1", @@ -4714,8 +5157,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", @@ -4730,8 +5171,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -4744,8 +5183,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -4758,8 +5195,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" @@ -4773,8 +5208,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -4787,8 +5220,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.22.tgz", "integrity": "sha512-hjElSW18Wq3fUAWVk6nbk7pGrV7ZT14DL1IUobmqhV3lxcsIenr5FUsDe2jlTVaS8OYBI3x+Og9URv5YcKb5QA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.6", @@ -4805,8 +5236,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.22.tgz", "integrity": "sha512-7B8mfQBtwwr2aNRRmU39k/bsRtv9B6/1mTMrGmmdJFKmLAH+KgIiOuhaqfKOBGh9sZ/VkZxbvm94rI4MMYpFjQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/config-resolver": "^4.1.4", "@smithy/credential-provider-imds": "^4.0.6", @@ -4825,8 +5254,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", @@ -4841,8 +5268,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -4855,8 +5280,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -4870,8 +5293,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/service-error-classification": "^4.0.6", "@smithy/types": "^4.3.1", @@ -4886,8 +5307,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", @@ -4907,8 +5326,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -4921,8 +5338,6 @@ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "license": "Apache-2.0", - "optional": true, - "peer": true, "dependencies": { "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" @@ -5825,6 +6240,12 @@ "node": ">=10" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -5962,6 +6383,15 @@ "ajv": "4.11.8 - 8" } }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -6060,9 +6490,19 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "license": "MIT" + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", "license": "MIT", - "optional": true, - "peer": true + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } }, "node_modules/brace-expansion": { "version": "2.0.2", @@ -7014,6 +7454,16 @@ "node": ">=6" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-libc": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", @@ -7645,6 +8095,53 @@ "node": ">=20.0.0" } }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -7798,8 +8295,6 @@ } ], "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "strnum": "^2.1.0" }, @@ -8528,6 +9023,15 @@ "node": ">= 14" } }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -8940,6 +9444,7 @@ "resolved": "https://registry.npmjs.org/jose/-/jose-6.0.12.tgz", "integrity": "sha512-T8xypXs8CpmiIi78k0E+Lk7T2zlK4zDyg+o1CZ4AkOHgDg98ogdP2BeZ61lTFKFyoEwJ9RgAgN+SdM3iPgNonQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/panva" } @@ -9358,6 +9863,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -9367,6 +9878,15 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -9380,6 +9900,18 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -9401,6 +9933,18 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -10027,6 +10571,33 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/numeral": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", @@ -10160,6 +10731,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -10172,6 +10752,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oidc-token-hash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.0.tgz", + "integrity": "sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, "node_modules/ollama-ai-provider": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ollama-ai-provider/-/ollama-ai-provider-1.2.0.tgz", @@ -10216,6 +10805,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/open": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", @@ -10349,6 +10953,7 @@ "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.6.4.tgz", "integrity": "sha512-PLWVhRksRnNH05sqeuCX/PR+1J70NyZcAcPske+FeF732KKONd3v0p5Utx1ro1iLfCglH8B3/+dA1vqIHDoIiA==", "license": "MIT", + "peer": true, "dependencies": { "jose": "^6.0.12", "oauth4webapi": "^3.7.0" @@ -11875,7 +12480,6 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, "license": "ISC" }, "node_modules/simple-concat": { @@ -12222,6 +12826,18 @@ "is-natural-number": "^4.0.1" } }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -12257,9 +12873,7 @@ "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/styled-components": { "version": "6.1.19", @@ -12766,6 +13380,18 @@ "node": ">=14.0.0" } }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/to-buffer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", @@ -13074,6 +13700,15 @@ "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -13159,6 +13794,15 @@ "devOptional": true, "license": "MIT" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", @@ -13657,7 +14301,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, "license": "ISC" }, "node_modules/yaml": { From 5a17126be79f26d641bf5c3eee0cef7b52bc6e33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 10:43:32 +0100 Subject: [PATCH 12/49] chore(deps): bump oauth4webapi from 3.8.0 to 3.8.1 (#509) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 89d966379..3e5486a76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10714,9 +10714,9 @@ } }, "node_modules/oauth4webapi": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.0.tgz", - "integrity": "sha512-RSu64fjsBIs6D7s9g5LOCnOohOkI0nnPtlIp/4rrHj2Vb8jGepq+fujkv2Srw4tuw9qa02aETXQzyQUle8nfnQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.8.1.tgz", + "integrity": "sha512-olkZDELNycOWQf9LrsELFq8n05LwJgV8UkrS0cburk6FOwf8GvLam+YB+Uj5Qvryee+vwWOfQVeI5Vm0MVg7SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" From 526fa3b2bf038c80122d3172a05eccf0b5c9c375 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Sep 2025 12:31:39 +0200 Subject: [PATCH 13/49] feat: add dictionary-based redaction for secrets in logs (#508) --- package-lock.json | 4475 +++++++++++------ package.json | 4 +- src/common/config.ts | 26 + src/common/connectionManager.ts | 12 +- src/common/keychain.ts | 40 + src/common/logger.ts | 32 +- src/common/session.ts | 6 + src/index.ts | 3 +- src/lib.ts | 2 + src/tools/atlas/connect/connectCluster.ts | 3 + src/tools/atlas/create/createDBUser.ts | 5 + src/transports/base.ts | 20 +- src/types/mongodb-redact.d.ts | 4 - tests/integration/helpers.ts | 2 + tests/integration/telemetry.test.ts | 2 + tests/integration/tools/atlas/dbUsers.test.ts | 37 + .../tools/mongodb/mongodbTool.test.ts | 2 + .../transports/streamableHttp.test.ts | 3 +- tests/unit/common/config.test.ts | 47 +- tests/unit/common/keychain.test.ts | 36 + tests/unit/common/session.test.ts | 2 + tests/unit/logger.test.ts | 59 +- tests/unit/resources/common/debug.test.ts | 2 + 23 files changed, 3110 insertions(+), 1714 deletions(-) create mode 100644 src/common/keychain.ts delete mode 100644 src/types/mongodb-redact.d.ts create mode 100644 tests/unit/common/keychain.test.ts diff --git a/package-lock.json b/package-lock.json index 3e5486a76..1385e8ca6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@mongodb-js/devtools-connect": "^3.9.3", "@mongodb-js/devtools-proxy-support": "^0.5.2", "@mongosh/arg-parser": "^3.14.0", - "@mongosh/service-provider-node-driver": "^3.12.0", + "@mongosh/service-provider-node-driver": "~3.12.0", "@vitest/eslint-plugin": "^1.3.4", "bson": "^6.10.4", "express": "^5.1.0", @@ -22,7 +22,7 @@ "mongodb": "^6.19.0", "mongodb-connection-string-url": "^3.0.2", "mongodb-log-writer": "^2.4.1", - "mongodb-redact": "^1.1.8", + "mongodb-redact": "^1.2.0", "mongodb-schema": "^12.6.2", "node-fetch": "^3.3.2", "node-machine-id": "1.1.12", @@ -78,9 +78,6 @@ "kerberos": "^2.2.2" } }, - "@himanshusinghs/ai-sdk-google": { - "extraneous": true - }, "node_modules/@ai-sdk/azure": { "version": "1.3.25", "resolved": "https://registry.npmjs.org/@ai-sdk/azure/-/azure-1.3.25.tgz", @@ -347,48 +344,48 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.844.0.tgz", - "integrity": "sha512-LwuYN43+IWQ5hOSaaNx6VVrUbLZibaZ01pXNuwdbaJGZOKcCCnev5O7MY0Kud7xatJrf7B9l2GIZW7gmHFi+yQ==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.879.0.tgz", + "integrity": "sha512-uMvvNmRs5shbbS2R3ZiouILpoyHUl4t2hPzp8rzqsdmvpr43SGy+L7ZKz1VxPK71xT6ZOZPU4+qEI657H3j3Yw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/credential-provider-node": "3.844.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.844.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-retry": "^4.1.15", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/credential-provider-node": "3.879.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.879.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.879.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-retry": "^4.1.20", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.22", - "@smithy/util-defaults-mode-node": "^4.0.22", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-defaults-mode-browser": "^4.0.27", + "@smithy/util-defaults-mode-node": "^4.0.27", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -397,47 +394,47 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.844.0.tgz", - "integrity": "sha512-FktodSx+pfUfIqMjoNwZ6t1xqq/G3cfT7I4JJ0HKHoIIZdoCHQB52x0OzKDtHDJAnEQPInasdPS8PorZBZtHmg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.879.0.tgz", + "integrity": "sha512-+Pc3OYFpRYpKLKRreovPM63FPPud1/SF9vemwIJfz6KwsBCJdvg7vYD1xLSIp5DVZLeetgf4reCyAA5ImBfZuw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.844.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-retry": "^4.1.15", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.879.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.879.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-retry": "^4.1.20", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.22", - "@smithy/util-defaults-mode-node": "^4.0.22", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-defaults-mode-browser": "^4.0.27", + "@smithy/util-defaults-mode-node": "^4.0.27", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -446,23 +443,23 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.844.0.tgz", - "integrity": "sha512-pfpI54bG5Xf2NkqrDBC2REStXlDXNCw/whORhkEs+Tp5exU872D5QKguzjPA6hH+8Pvbq1qgt5zXMbduISTHJw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.7.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.879.0.tgz", + "integrity": "sha512-AhNmLCrx980LsK+SfPXGh7YqTyZxsK0Qmy18mWmkfY0TSq7WLaSDB5zdQbgbnQCACCHy8DUYXbi4KsjlIhv3PA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@aws-sdk/xml-builder": "3.873.0", + "@smithy/core": "^3.9.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "@smithy/util-utf8": "^4.0.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" @@ -471,16 +468,46 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/core/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/core/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.844.0.tgz", - "integrity": "sha512-LBigff8jHYZbQTRcybiqamZTQpRb63CBiCG9Ce0C1CzmZQ0WUZFmJA5ZbqwUK+BliOEdpl6kQFgsf6sz9ODbZg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.879.0.tgz", + "integrity": "sha512-E1iQ4+eyDKJfWVuijIxxNZ+uhZ3LF3HXnYbkguq05jIbbazXmN/AXTfQoXreXYoGzOSJltxkje9X0H7rBJRxtg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/client-cognito-identity": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -488,15 +515,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.844.0.tgz", - "integrity": "sha512-WB94Ox86MqcZ4CnRjKgopzaSuZH4hMP0GqdOxG4s1it1lRWOIPOHOC1dPiM0Zbj1uqITIhbXUQVXyP/uaJeNkw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.879.0.tgz", + "integrity": "sha512-JgG7A8SSbr5IiCYL8kk39Y9chdSB5GPwBorDW8V8mr19G9L+qd6ohED4fAocoNFaDnYJ5wGAHhCfSJjzcsPBVQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -504,20 +531,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.844.0.tgz", - "integrity": "sha512-e+efVqfkhpM8zxYeiLNgTUlX+tmtXzVm3bw1A02U9Z9cWBHyQNb8pi90M7QniLoqRURY1B0C2JqkOE61gd4KNg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.879.0.tgz", + "integrity": "sha512-2hM5ByLpyK+qORUexjtYyDZsgxVCCUiJQZRMGkNXFEGz6zTpbjfTIWoh3zRgWHEBiqyPIyfEy50eIF69WshcuA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -525,23 +552,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.844.0.tgz", - "integrity": "sha512-jc5ArGz2HfAx5QPXD+Ep36+QWyCKzl2TG6Vtl87/vljfLhVD0gEHv8fRsqWEp3Rc6hVfKnCjLW5ayR2HYcow9w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/credential-provider-env": "3.844.0", - "@aws-sdk/credential-provider-http": "3.844.0", - "@aws-sdk/credential-provider-process": "3.844.0", - "@aws-sdk/credential-provider-sso": "3.844.0", - "@aws-sdk/credential-provider-web-identity": "3.844.0", - "@aws-sdk/nested-clients": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.879.0.tgz", + "integrity": "sha512-07M8zfb73KmMBqVO5/V3Ea9kqDspMX0fO0kaI1bsjWI6ngnMye8jCE0/sIhmkVAI0aU709VA0g+Bzlopnw9EoQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.879.0", + "@aws-sdk/credential-provider-env": "3.879.0", + "@aws-sdk/credential-provider-http": "3.879.0", + "@aws-sdk/credential-provider-process": "3.879.0", + "@aws-sdk/credential-provider-sso": "3.879.0", + "@aws-sdk/credential-provider-web-identity": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -549,22 +576,22 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.844.0.tgz", - "integrity": "sha512-pUqB0StTNyW0R03XjTA3wrQZcie/7FJKSXlYHue921ZXuhLOZpzyDkLNfdRsZTcEoYYWVPSmyS+Eu/g5yVsBNA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.844.0", - "@aws-sdk/credential-provider-http": "3.844.0", - "@aws-sdk/credential-provider-ini": "3.844.0", - "@aws-sdk/credential-provider-process": "3.844.0", - "@aws-sdk/credential-provider-sso": "3.844.0", - "@aws-sdk/credential-provider-web-identity": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.879.0.tgz", + "integrity": "sha512-FYaAqJbnSTrVL2iZkNDj2hj5087yMv2RN2GA8DJhe7iOJjzhzRojrtlfpWeJg6IhK0sBKDH+YXbdeexCzUJvtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.879.0", + "@aws-sdk/credential-provider-http": "3.879.0", + "@aws-sdk/credential-provider-ini": "3.879.0", + "@aws-sdk/credential-provider-process": "3.879.0", + "@aws-sdk/credential-provider-sso": "3.879.0", + "@aws-sdk/credential-provider-web-identity": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -572,16 +599,16 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.844.0.tgz", - "integrity": "sha512-VCI8XvIDt2WBfk5Gi/wXKPcWTS3OkAbovB66oKcNQalllH8ESDg4SfLNhchdnN8A5sDGj6tIBJ19nk+dQ6GaqQ==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.879.0.tgz", + "integrity": "sha512-7r360x1VyEt35Sm1JFOzww2WpnfJNBbvvnzoyLt7WRfK0S/AfsuWhu5ltJ80QvJ0R3AiSNbG+q/btG2IHhDYPQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -589,18 +616,18 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.844.0.tgz", - "integrity": "sha512-UNp/uWufGlb5nWa4dpc6uQnDOB/9ysJJFG95ACowNVL9XWfi1LJO7teKrqNkVhq0CzSJS1tCt3FvX4UfM+aN1g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.844.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/token-providers": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.879.0.tgz", + "integrity": "sha512-gd27B0NsgtKlaPNARj4IX7F7US5NuU691rGm0EUSkDsM7TctvJULighKoHzPxDQlrDbVI11PW4WtKS/Zg5zPlQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.879.0", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/token-providers": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -608,16 +635,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.844.0.tgz", - "integrity": "sha512-iDmX4pPmatjttIScdspZRagaFnCjpHZIEEwTyKdXxUaU0iAOSXF8ecrCEvutETvImPOC86xdrq+MPacJOnMzUA==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.879.0.tgz", + "integrity": "sha512-Jy4uPFfGzHk1Mxy+/Wr43vuw9yXsE2yiF4e4598vc3aJfO0YtA2nSfbKD3PNKRORwXbeKqWPfph9SCKQpWoxEg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/nested-clients": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -625,29 +652,29 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.844.0.tgz", - "integrity": "sha512-amTf3wxwTVNV5jBpN1dT77c5rlch3ooUhBxA+dAnlKLLbc0OlcUrF49Kh69PWBlACahcZDuBh/KPJm2wiIMyYQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.844.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/credential-provider-cognito-identity": "3.844.0", - "@aws-sdk/credential-provider-env": "3.844.0", - "@aws-sdk/credential-provider-http": "3.844.0", - "@aws-sdk/credential-provider-ini": "3.844.0", - "@aws-sdk/credential-provider-node": "3.844.0", - "@aws-sdk/credential-provider-process": "3.844.0", - "@aws-sdk/credential-provider-sso": "3.844.0", - "@aws-sdk/credential-provider-web-identity": "3.844.0", - "@aws-sdk/nested-clients": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "version": "3.880.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.880.0.tgz", + "integrity": "sha512-QJsAyjXFn/v0uvcVkT8hbIH8WeAUAQkuPLasOJkyi3TiTH8AxPWxY+YLeIKoyiVcTRunRca+29AoLX1F0TgMlg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.879.0", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/credential-provider-cognito-identity": "3.879.0", + "@aws-sdk/credential-provider-env": "3.879.0", + "@aws-sdk/credential-provider-http": "3.879.0", + "@aws-sdk/credential-provider-ini": "3.879.0", + "@aws-sdk/credential-provider-node": "3.879.0", + "@aws-sdk/credential-provider-process": "3.879.0", + "@aws-sdk/credential-provider-sso": "3.879.0", + "@aws-sdk/credential-provider-web-identity": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -655,14 +682,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz", + "integrity": "sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -670,13 +697,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz", + "integrity": "sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -684,14 +711,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz", + "integrity": "sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -699,17 +726,17 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.844.0.tgz", - "integrity": "sha512-SIbDNUL6ZYXPj5Tk0qEz05sW9kNS1Gl3/wNWEmH+AuUACipkyIeKKWzD6z5433MllETh73vtka/JQF3g7AuZww==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.879.0.tgz", + "integrity": "sha512-DDSV8228lQxeMAFKnigkd0fHzzn5aauZMYC3CSj6e5/qE7+9OwpkUcjHfb7HZ9KWG6L2/70aKZXHqiJ4xKhOZw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@smithy/core": "^3.7.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@smithy/core": "^3.9.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -717,47 +744,47 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.844.0.tgz", - "integrity": "sha512-p2XILWc7AcevUSpBg2VtQrk79eWQC4q2JsCSY7HxKpFLZB4mMOfmiTyYkR1gEA6AttK/wpCOtfz+hi1/+z2V1A==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.879.0.tgz", + "integrity": "sha512-7+n9NpIz9QtKYnxmw1fHi9C8o0GrX8LbBR4D50c7bH6Iq5+XdSuL5AFOWWQ5cMD0JhqYYJhK/fJsVau3nUtC4g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.844.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.844.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.844.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-retry": "^4.1.15", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.879.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.879.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-retry": "^4.1.20", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.22", - "@smithy/util-defaults-mode-node": "^4.0.22", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-defaults-mode-browser": "^4.0.27", + "@smithy/util-defaults-mode-node": "^4.0.27", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -766,16 +793,16 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz", + "integrity": "sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -783,17 +810,17 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.844.0.tgz", - "integrity": "sha512-Kh728FEny0fil+LeH8U1offPJCTd/EDh8liBAvLtViLHt2WoX2xC8rk98D38Q5p79aIUhHb3Pf4n9IZfTu/Kog==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.879.0.tgz", + "integrity": "sha512-47J7sCwXdnw9plRZNAGVkNEOlSiLb/kR2slnDIHRK9NB/ECKsoqgz5OZQJ9E2f0yqOs8zSNJjn3T01KxpgW8Qw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/nested-clients": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -801,12 +828,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -814,15 +841,15 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.844.0.tgz", - "integrity": "sha512-1DHh0WTUmxlysz3EereHKtKoxVUG9UC5BsfAw6Bm4/6qDlJiqtY3oa2vebkYN23yltKdfsCK65cwnBRU59mWVg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.879.0.tgz", + "integrity": "sha512-aVAJwGecYoEmbEFju3127TyJDF9qJsKDUUTRMDuS8tGn+QiWQFnfInmbt+el9GU1gEJupNTXV+E3e74y51fb7A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-endpoints": "^3.0.6", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-endpoints": "^3.0.7", "tslib": "^2.6.2" }, "engines": { @@ -830,9 +857,9 @@ } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz", - "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.873.0.tgz", + "integrity": "sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -842,27 +869,27 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz", + "integrity": "sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.844.0.tgz", - "integrity": "sha512-0eTpURp9Gxbyyeqr78ogARZMSWS5KUMZuN+XMHxNpQLmn2S+J3g+MAyoklCcwhKXlbdQq2aMULEiy0mqIWytuw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.879.0.tgz", + "integrity": "sha512-A5KGc1S+CJRzYnuxJQQmH1BtGsz46AgyHkqReKfGiNQA8ET/9y9LQ5t2ABqnSBHHIh3+MiCcQSkUZ0S3rTodrQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.844.0", - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-user-agent": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -878,12 +905,12 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.821.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", - "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.873.0.tgz", + "integrity": "sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -933,13 +960,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.28.2" }, "bin": { "parser": "bin/babel-parser.js" @@ -949,9 +976,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", "dev": true, "license": "MIT", "engines": { @@ -959,9 +986,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz", - "integrity": "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1031,9 +1058,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz", - "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", "cpu": [ "ppc64" ], @@ -1048,9 +1075,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz", - "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", "cpu": [ "arm" ], @@ -1065,9 +1092,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz", - "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", "cpu": [ "arm64" ], @@ -1082,9 +1109,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz", - "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", "cpu": [ "x64" ], @@ -1099,9 +1126,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz", - "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", "cpu": [ "arm64" ], @@ -1116,9 +1143,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz", - "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", "cpu": [ "x64" ], @@ -1133,9 +1160,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz", - "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", "cpu": [ "arm64" ], @@ -1150,9 +1177,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz", - "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", "cpu": [ "x64" ], @@ -1167,9 +1194,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz", - "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", "cpu": [ "arm" ], @@ -1184,9 +1211,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz", - "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", "cpu": [ "arm64" ], @@ -1201,9 +1228,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz", - "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", "cpu": [ "ia32" ], @@ -1218,9 +1245,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz", - "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", "cpu": [ "loong64" ], @@ -1235,9 +1262,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz", - "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", "cpu": [ "mips64el" ], @@ -1252,9 +1279,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz", - "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", "cpu": [ "ppc64" ], @@ -1269,9 +1296,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz", - "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", "cpu": [ "riscv64" ], @@ -1286,9 +1313,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz", - "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", "cpu": [ "s390x" ], @@ -1303,9 +1330,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz", - "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", "cpu": [ "x64" ], @@ -1320,9 +1347,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz", - "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", "cpu": [ "arm64" ], @@ -1337,9 +1364,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz", - "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", "cpu": [ "x64" ], @@ -1354,9 +1381,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz", - "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", "cpu": [ "arm64" ], @@ -1371,9 +1398,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz", - "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", "cpu": [ "x64" ], @@ -1388,9 +1415,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz", - "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", "cpu": [ "arm64" ], @@ -1405,9 +1432,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz", - "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", "cpu": [ "x64" ], @@ -1422,9 +1449,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz", - "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", "cpu": [ "arm64" ], @@ -1439,9 +1466,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz", - "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", "cpu": [ "ia32" ], @@ -1456,9 +1483,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz", - "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", "cpu": [ "x64" ], @@ -1473,9 +1500,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz", + "integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==", "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -1490,18 +1517,6 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", @@ -1525,16 +1540,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@eslint/config-array/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1591,16 +1596,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -1729,31 +1724,18 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1831,91 +1813,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -1940,9 +1837,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -1961,16 +1858,16 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "devOptional": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2022,9 +1919,9 @@ "license": "MIT" }, "node_modules/@modelcontextprotocol/inspector": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector/-/inspector-0.16.5.tgz", - "integrity": "sha512-3viCtcLn1p6ZYZG8L9DxnNx2XUw6damCZM37nBByKAd74stH7nZa2VxFAwLpUCjKylYqawCRthzYSyeSlWGf1g==", + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector/-/inspector-0.16.6.tgz", + "integrity": "sha512-6x6dzTf8MV6z/XIdzr/4EMK4elMn1XUzTJHxczsBePLg1G5VNAM/4g5abNFIB9bzuxJ/1VH8016Vv6S7sj/24Q==", "dev": true, "license": "MIT", "workspaces": [ @@ -2033,10 +1930,10 @@ "cli" ], "dependencies": { - "@modelcontextprotocol/inspector-cli": "^0.16.5", - "@modelcontextprotocol/inspector-client": "^0.16.5", - "@modelcontextprotocol/inspector-server": "^0.16.5", - "@modelcontextprotocol/sdk": "^1.17.3", + "@modelcontextprotocol/inspector-cli": "^0.16.6", + "@modelcontextprotocol/inspector-client": "^0.16.6", + "@modelcontextprotocol/inspector-server": "^0.16.6", + "@modelcontextprotocol/sdk": "^1.17.5", "concurrently": "^9.2.0", "open": "^10.2.0", "shell-quote": "^1.8.3", @@ -2052,13 +1949,13 @@ } }, "node_modules/@modelcontextprotocol/inspector-cli": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector-cli/-/inspector-cli-0.16.5.tgz", - "integrity": "sha512-6Flp9goLJutjUZTx6clDo4x/6TA7BwqeTGSYcC8ZeP8IEKjx+EZpvpYPVAV++rkHJYa0F5PViy02CMoGBGkzkg==", + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector-cli/-/inspector-cli-0.16.6.tgz", + "integrity": "sha512-28RAaGoN9XgKYvl8kOo9wTHBrLp5Th+biTt5mNGUzowMdcoG/FpI8mHROIhcgDyp+kj0SYR5fmwcb6GIxBnjUw==", "dev": true, "license": "MIT", "dependencies": { - "@modelcontextprotocol/sdk": "^1.17.3", + "@modelcontextprotocol/sdk": "^1.17.5", "commander": "^13.1.0", "spawn-rx": "^5.1.2" }, @@ -2067,13 +1964,13 @@ } }, "node_modules/@modelcontextprotocol/inspector-client": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector-client/-/inspector-client-0.16.5.tgz", - "integrity": "sha512-KjgtTRdFSDt964a9KtmF3aRpi4ntd+6wn3e4WUa5vcK7H8f34rq4wfIGF22dd/xoKbALP3zVVAsPqVN94SCGmg==", + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector-client/-/inspector-client-0.16.6.tgz", + "integrity": "sha512-2dwB0OXI02PTTsECCTIsB9DkERImIrsTAuZW6LlfUojtQMLI5NpuUID4Y4LaYPcdGnxkkkR1eddrPTsuzgabvg==", "dev": true, "license": "MIT", "dependencies": { - "@modelcontextprotocol/sdk": "^1.17.3", + "@modelcontextprotocol/sdk": "^1.17.5", "@radix-ui/react-checkbox": "^1.1.4", "@radix-ui/react-dialog": "^1.1.3", "@radix-ui/react-icons": "^1.3.0", @@ -2096,7 +1993,6 @@ "react-simple-code-editor": "^0.14.1", "serve-handler": "^6.1.6", "tailwind-merge": "^2.5.3", - "tailwindcss-animate": "^1.0.7", "zod": "^3.25.76" }, "bin": { @@ -2104,13 +2000,13 @@ } }, "node_modules/@modelcontextprotocol/inspector-server": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector-server/-/inspector-server-0.16.5.tgz", - "integrity": "sha512-mWKrEpimfNdSFOxMJGj3cYN1PxHANW9vjpek+tR0TLiP7ogq7DLV4bbsa+lPPGwOVogUIyUiXbffY8M1YHRZVA==", + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector-server/-/inspector-server-0.16.6.tgz", + "integrity": "sha512-BkE/4K2Y8ZcXK/cGBucG+rLTcTIUAaSyQabxqh0p+ErhkJDmepDvI+63OqQnauWUJydXPZYtBQyHppL4JN7RGw==", "dev": true, "license": "MIT", "dependencies": { - "@modelcontextprotocol/sdk": "^1.17.3", + "@modelcontextprotocol/sdk": "^1.17.5", "cors": "^2.8.5", "express": "^5.1.0", "ws": "^8.18.0", @@ -2121,9 +2017,9 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.4.tgz", - "integrity": "sha512-zq24hfuAmmlNZvik0FLI58uE5sriN0WWsQzIlYnzSuKDAHFqJtBFrl/LfB1NLgJT5Y7dEBzaX4yAKqOPrcetaw==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.5.tgz", + "integrity": "sha512-QakrKIGniGuRVfWBdMsDea/dx1PNE739QJ7gCM41s9q+qaCYTHCdsIBXQVVXry3mfWAiaM9kT22Hyz53Uw8mfg==", "license": "MIT", "dependencies": { "ajv": "^6.12.6", @@ -2159,12 +2055,12 @@ "license": "Apache-2.0" }, "node_modules/@mongodb-js/devtools-connect": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.9.3.tgz", - "integrity": "sha512-qlvjgzZeIJQgF+C2D+T5zOfsat62vp/hgoib+gJrU5JcThN8Hbq9ZQaE9f5/mUg3DKW1R9VvdrzcCn2NEZRvKA==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-connect/-/devtools-connect-3.9.4.tgz", + "integrity": "sha512-L/DyeoVUejkFqP9HOxJ9PgClkNL+z1We1eAzAvdseRtm0T4B7UJvBg2Fn4D84cC9mbQVuxkSRThTQnQkKW0jOA==", "license": "Apache-2.0", "dependencies": { - "@mongodb-js/devtools-proxy-support": "^0.5.2", + "@mongodb-js/devtools-proxy-support": "^0.5.3", "@mongodb-js/oidc-http-server-pages": "1.1.6", "lodash.merge": "^4.6.2", "mongodb-connection-string-url": "^3.0.0", @@ -2183,9 +2079,9 @@ } }, "node_modules/@mongodb-js/devtools-proxy-support": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-proxy-support/-/devtools-proxy-support-0.5.2.tgz", - "integrity": "sha512-3zp/5Ui8ci8EK2pNZ+YKc73L8bPCIP0tkJNMCpsM3P9/I9L9woTpJtGGlS3GtwL1caOypeKc6pibDqQzkjQFCA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@mongodb-js/devtools-proxy-support/-/devtools-proxy-support-0.5.3.tgz", + "integrity": "sha512-m5LzS86xh7iOuHA88ibbJvBkPZ6Qm/0B4N90s7epNEOvtMo0Jr8dYNxnLYobahFkvzbHp+oPRrCsztAKs0TZYQ==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/socksv5": "^0.0.10", @@ -2280,54 +2176,10 @@ "oidc-mock-provider": "bin/oidc-mock-provider.js" } }, - "node_modules/@mongodb-js/oidc-mock-provider/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@mongodb-js/oidc-mock-provider/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@mongodb-js/oidc-mock-provider/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/@mongodb-js/oidc-plugin": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mongodb-js/oidc-plugin/-/oidc-plugin-2.0.2.tgz", - "integrity": "sha512-E+xStW+3qtA8Da9h/cBUDGBd0RmbOwyNEncEbhAf2ZJpTEwHxgAhVO/STmxiaRqw0u4w8EmXrGqDdyGagRhx+A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mongodb-js/oidc-plugin/-/oidc-plugin-2.0.3.tgz", + "integrity": "sha512-WlJYyM+p7tX8XkN2L9FbstsOOdIxwAYcwNgHx/XYVgy1gqo5mf4zjyWeohqB368WDStWb0CXUV2Bx1DM4EC/tQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2362,13 +2214,13 @@ } }, "node_modules/@mongosh/arg-parser": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@mongosh/arg-parser/-/arg-parser-3.14.0.tgz", - "integrity": "sha512-ue7FtuO9rgmjrh2lFZdgtrVMrGXeqBG8mWDDTb/CZ2GZNtULhAdk9d+gdnjupQNH66fGWoKdLhuur466HuJrtw==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@mongosh/arg-parser/-/arg-parser-3.16.0.tgz", + "integrity": "sha512-b/ov/qPiPODgpdFD1pCd2GqLI1ZI9fTj8FUcceBeG1eZuajAibI7qQBbfVR2/ZfL3ygYME4l1Lork7LpQmV8Xw==", "license": "Apache-2.0", "dependencies": { - "@mongosh/errors": "2.4.2", - "@mongosh/i18n": "^2.15.2", + "@mongosh/errors": "2.4.4", + "@mongosh/i18n": "^2.15.4", "mongodb-connection-string-url": "^3.0.1" }, "engines": { @@ -2376,21 +2228,21 @@ } }, "node_modules/@mongosh/errors": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@mongosh/errors/-/errors-2.4.2.tgz", - "integrity": "sha512-p+LOHVj/VIt6cpJY1AvDmG/QLP7WZQ7q+32paU6qxjXaoC0kMqmemaqK5cUj8JWod1VEv9/Ol4T6OfWTwPG20A==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@mongosh/errors/-/errors-2.4.4.tgz", + "integrity": "sha512-Z1z8VuYYgVjleo2N/GssECbc9ZXrKcLS83zMtflGoYujQ2B7CAMB0D9YnQZAvvWd68YQD4IU5HqJkmcrtWo0Dw==", "license": "Apache-2.0", "engines": { "node": ">=14.15.1" } }, "node_modules/@mongosh/i18n": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/@mongosh/i18n/-/i18n-2.15.2.tgz", - "integrity": "sha512-E286cGq9/Cgg1TjkOvuKG5ymmIZI/gUpXatK83Ulp9EbQ+tqSwDsv+A3Z+unFyRHYvFuTLVlBCXFyHRDBn8Nww==", + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/@mongosh/i18n/-/i18n-2.15.4.tgz", + "integrity": "sha512-whgXLXh4uLcmoSsZdkKfRL9tHB1y9+GC5hkdfboCi3ai18zavV2Dru+FaeLZOP+T++nL49T7OIDi2JL0pa+CTA==", "license": "Apache-2.0", "dependencies": { - "@mongosh/errors": "2.4.2" + "@mongosh/errors": "2.4.4" }, "engines": { "node": ">=14.15.1" @@ -2416,6 +2268,15 @@ "mongodb-client-encryption": "^6.3.0" } }, + "node_modules/@mongosh/service-provider-core/node_modules/@mongosh/errors": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@mongosh/errors/-/errors-2.4.2.tgz", + "integrity": "sha512-p+LOHVj/VIt6cpJY1AvDmG/QLP7WZQ7q+32paU6qxjXaoC0kMqmemaqK5cUj8JWod1VEv9/Ol4T6OfWTwPG20A==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.15.1" + } + }, "node_modules/@mongosh/service-provider-node-driver": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/@mongosh/service-provider-node-driver/-/service-provider-node-driver-3.12.0.tgz", @@ -2454,6 +2315,15 @@ "node": ">= 16.20.1" } }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/@mongosh/errors": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@mongosh/errors/-/errors-2.4.2.tgz", + "integrity": "sha512-p+LOHVj/VIt6cpJY1AvDmG/QLP7WZQ7q+32paU6qxjXaoC0kMqmemaqK5cUj8JWod1VEv9/Ol4T6OfWTwPG20A==", + "license": "Apache-2.0", + "engines": { + "node": ">=14.15.1" + } + }, "node_modules/@mongosh/service-provider-node-driver/node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -3037,6 +2907,12 @@ "node": ">= 0.8.0" } }, + "node_modules/@mongosh/service-provider-node-driver/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/@mongosh/service-provider-node-driver/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -3349,9 +3225,9 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", - "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", "engines": { @@ -4256,9 +4132,9 @@ "license": "MIT" }, "node_modules/@redocly/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.3.tgz", + "integrity": "sha512-4P3iZse91TkBiY+Dx5DUgxQ9GXkVJf++cmI0MOyLDxV9b5MUBI4II6ES8zA5JCbO72nKAJxWrw4PUPW+YP3ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4315,81 +4191,140 @@ "npm": ">=10" } }, - "node_modules/@redocly/cli/node_modules/@redocly/config": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.29.0.tgz", - "integrity": "sha512-AkP1Berx9GvD15aN6r0IcOo289ElHp52XgeFTxXCumJ4gaUXUmvzqfZTfFFJWDaGgZvUZvmQrs1UdaPjZEXeHA==", + "node_modules/@redocly/cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "dependencies": { - "json-schema-to-ts": "2.7.2" + "engines": { + "node": ">=8" } }, - "node_modules/@redocly/cli/node_modules/@redocly/openapi-core": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.0.8.tgz", - "integrity": "sha512-ShnpeEgcQY0YxopFDH/m94PWiHgCuWGa9FIcHchdHMZGA0mgV/Eojhi46A/hi2KP7TaVsgZc6+8u7GxTTeTC5g==", + "node_modules/@redocly/cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.29.0", - "ajv-formats": "^2.1.1", - "colorette": "^1.2.0", - "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", - "minimatch": "^10.0.1", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" - }, - "engines": { - "node": ">=22.12.0 || >=20.19.0 <21.0.0", - "npm": ">=10" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/@redocly/cli/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "node_modules/@redocly/cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/@redocly/cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "20 || >=22" + "node": ">=8" + } + }, + "node_modules/@redocly/cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@redocly/cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@redocly/cli/node_modules/yargs": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz", + "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@redocly/cli/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" } }, "node_modules/@redocly/config": { - "version": "0.22.2", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz", - "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.29.0.tgz", + "integrity": "sha512-AkP1Berx9GvD15aN6r0IcOo289ElHp52XgeFTxXCumJ4gaUXUmvzqfZTfFFJWDaGgZvUZvmQrs1UdaPjZEXeHA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "json-schema-to-ts": "2.7.2" + } }, "node_modules/@redocly/openapi-core": { - "version": "1.34.5", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.5.tgz", - "integrity": "sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.0.8.tgz", + "integrity": "sha512-ShnpeEgcQY0YxopFDH/m94PWiHgCuWGa9FIcHchdHMZGA0mgV/Eojhi46A/hi2KP7TaVsgZc6+8u7GxTTeTC5g==", "dev": true, "license": "MIT", "dependencies": { "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.22.0", + "@redocly/config": "^0.29.0", + "ajv-formats": "^2.1.1", "colorette": "^1.2.0", - "https-proxy-agent": "^7.0.5", "js-levenshtein": "^1.1.6", "js-yaml": "^4.1.0", - "minimatch": "^5.0.1", + "minimatch": "^10.0.1", "pluralize": "^8.0.0", "yaml-ast-parser": "0.0.43" }, "engines": { - "node": ">=18.17.0", - "npm": ">=9.5.0" + "node": ">=22.12.0 || >=20.19.0 <21.0.0", + "npm": ">=10" } }, "node_modules/@redocly/respect-core": { @@ -4417,45 +4352,23 @@ "npm": ">=10" } }, - "node_modules/@redocly/respect-core/node_modules/@redocly/config": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.29.0.tgz", - "integrity": "sha512-AkP1Berx9GvD15aN6r0IcOo289ElHp52XgeFTxXCumJ4gaUXUmvzqfZTfFFJWDaGgZvUZvmQrs1UdaPjZEXeHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-schema-to-ts": "2.7.2" - } - }, - "node_modules/@redocly/respect-core/node_modules/@redocly/openapi-core": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.0.8.tgz", - "integrity": "sha512-ShnpeEgcQY0YxopFDH/m94PWiHgCuWGa9FIcHchdHMZGA0mgV/Eojhi46A/hi2KP7TaVsgZc6+8u7GxTTeTC5g==", + "node_modules/@redocly/respect-core/node_modules/@redocly/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", "dev": true, "license": "MIT", "dependencies": { - "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.29.0", - "ajv-formats": "^2.1.1", - "colorette": "^1.2.0", - "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", - "minimatch": "^10.0.1", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" }, - "engines": { - "node": ">=22.12.0 || >=20.19.0 <21.0.0", - "npm": ">=10" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@redocly/respect-core/node_modules/@redocly/openapi-core/node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true, - "license": "MIT" - }, "node_modules/@redocly/respect-core/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -4463,26 +4376,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@redocly/respect-core/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", - "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz", + "integrity": "sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==", "cpu": [ "arm" ], @@ -4494,9 +4391,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz", - "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz", + "integrity": "sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==", "cpu": [ "arm64" ], @@ -4508,9 +4405,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz", - "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz", + "integrity": "sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==", "cpu": [ "arm64" ], @@ -4522,9 +4419,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz", - "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz", + "integrity": "sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==", "cpu": [ "x64" ], @@ -4536,9 +4433,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz", - "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz", + "integrity": "sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==", "cpu": [ "arm64" ], @@ -4550,9 +4447,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz", - "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz", + "integrity": "sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==", "cpu": [ "x64" ], @@ -4564,9 +4461,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz", - "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz", + "integrity": "sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==", "cpu": [ "arm" ], @@ -4578,9 +4475,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz", - "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz", + "integrity": "sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==", "cpu": [ "arm" ], @@ -4592,9 +4489,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz", - "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz", + "integrity": "sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==", "cpu": [ "arm64" ], @@ -4606,9 +4503,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz", - "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz", + "integrity": "sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==", "cpu": [ "arm64" ], @@ -4620,9 +4517,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz", - "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz", + "integrity": "sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==", "cpu": [ "loong64" ], @@ -4633,10 +4530,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz", - "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz", + "integrity": "sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==", "cpu": [ "ppc64" ], @@ -4648,9 +4545,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz", - "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz", + "integrity": "sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==", "cpu": [ "riscv64" ], @@ -4662,9 +4559,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz", - "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz", + "integrity": "sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==", "cpu": [ "riscv64" ], @@ -4676,9 +4573,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz", - "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz", + "integrity": "sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==", "cpu": [ "s390x" ], @@ -4690,9 +4587,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", - "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz", + "integrity": "sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==", "cpu": [ "x64" ], @@ -4704,9 +4601,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz", - "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz", + "integrity": "sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==", "cpu": [ "x64" ], @@ -4717,10 +4614,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz", + "integrity": "sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz", - "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz", + "integrity": "sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==", "cpu": [ "arm64" ], @@ -4732,9 +4643,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz", - "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz", + "integrity": "sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==", "cpu": [ "ia32" ], @@ -4746,9 +4657,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", - "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz", + "integrity": "sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==", "cpu": [ "x64" ], @@ -4767,12 +4678,12 @@ "license": "MIT" }, "node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4780,15 +4691,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.5.tgz", + "integrity": "sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -4796,35 +4707,50 @@ } }, "node_modules/@smithy/core": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.0.tgz", - "integrity": "sha512-7ov8hu/4j0uPZv8b27oeOFtIBtlFmM3ibrPv/Omx1uUdoXvcpJ00U+H/OWWC/keAguLlcqwtyL2/jTlSnApgNQ==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.2.tgz", + "integrity": "sha512-H7H+dnfyHa/XXmZB3+IcqB1snIvbXaeGbV7//PMY69YKMOfGtuHPg6aukxsD0TyqmIU+bcX5nitR+nf/19nTlQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, + "node_modules/@smithy/core/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz", + "integrity": "sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -4832,14 +4758,14 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", - "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -4848,12 +4774,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.5.tgz", + "integrity": "sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -4863,12 +4789,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.5.tgz", + "integrity": "sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4888,13 +4814,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.5.tgz", + "integrity": "sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4902,18 +4828,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.14.tgz", - "integrity": "sha512-+BGLpK5D93gCcSEceaaYhUD/+OCGXM1IDaq/jKUQ+ujB0PTWlWN85noodKw/IPFZhIKFCNEe19PGd/reUMeLSQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.7.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "version": "4.1.21", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.21.tgz", + "integrity": "sha512-VCFE6LGSbnXs6uxLTdtar6dbkOHa9mrj692pZJx1mQVEzk0gvckAX9WB9BzlONUpv92QBWGezROz/+yEitQjAQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.9.2", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -4921,18 +4847,19 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.15.tgz", - "integrity": "sha512-iKYUJpiyTQ33U2KlOZeUb0GwtzWR3C0soYcKuCnTmJrvt6XwTPQZhMfsjJZNw7PpQ3TU4Ati1qLSrkSJxnnSMQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "version": "4.1.22", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.22.tgz", + "integrity": "sha512-mb6/wn4ixnSJCkKVLs51AKAyknbSTvwrHCM7cqgwGfYQ7/J6Qvv+49cBHe6Rl8Q0m3fROVYcSvM6bBiQtuhYWg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/smithy-client": "^4.5.2", + "@smithy/types": "^4.3.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -4954,13 +4881,13 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4968,12 +4895,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4981,14 +4908,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4996,15 +4923,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", - "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5012,12 +4939,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5025,12 +4952,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5038,12 +4965,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -5052,12 +4979,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5065,24 +4992,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", - "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.7.tgz", + "integrity": "sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1" + "@smithy/types": "^4.3.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5090,16 +5017,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.3.tgz", + "integrity": "sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -5109,17 +5036,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.6.tgz", - "integrity": "sha512-3wfhywdzB/CFszP6moa5L3lf5/zSfQoH0kvVSdkyK2az5qZet0sn2PAHjcTDiq296Y4RP5yxF7B6S6+3oeBUCQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.2.tgz", + "integrity": "sha512-WRdTJ7aNSJY0WuGpxrvVgRaFKGiuvtXX1Txhnu2BdynraSlH2bcP75riQ4SiQfawU1HNEKaPI5gf/ePm+Ro/Cw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.7.0", - "@smithy/middleware-endpoint": "^4.1.14", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "@smithy/core": "^3.9.2", + "@smithy/middleware-endpoint": "^4.1.21", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -5127,9 +5054,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5139,13 +5066,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5216,14 +5143,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.22.tgz", - "integrity": "sha512-hjElSW18Wq3fUAWVk6nbk7pGrV7ZT14DL1IUobmqhV3lxcsIenr5FUsDe2jlTVaS8OYBI3x+Og9URv5YcKb5QA==", + "version": "4.0.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.29.tgz", + "integrity": "sha512-awrIb21sWml3OMRhqf8e5GPLuZAcH3PRAHXVOPof/rBOKLxc6N01ZRs25154Ww6Ygm9oNP6G0tVvhcy8ktYXtw==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.5.2", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -5232,17 +5159,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.22.tgz", - "integrity": "sha512-7B8mfQBtwwr2aNRRmU39k/bsRtv9B6/1mTMrGmmdJFKmLAH+KgIiOuhaqfKOBGh9sZ/VkZxbvm94rI4MMYpFjQ==", + "version": "4.0.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.29.tgz", + "integrity": "sha512-DxBWCC059GwOQXc5nxVudhdGQLZHTDhU4rkK4rvaBQn8IWBw8G+3H2hWk897LaNv6zwwhh7kpfqF0rJ77DvlSg==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", + "@smithy/config-resolver": "^4.1.5", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.5.2", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5250,13 +5177,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz", + "integrity": "sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5276,12 +5203,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5289,13 +5216,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.7.tgz", + "integrity": "sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5303,14 +5230,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", - "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -5528,9 +5455,9 @@ "license": "MIT" }, "node_modules/@types/semver": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, "license": "MIT" }, @@ -5579,6 +5506,12 @@ "license": "MIT", "optional": true }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "license": "MIT" + }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", @@ -5602,17 +5535,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz", - "integrity": "sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.42.0.tgz", + "integrity": "sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/type-utils": "8.41.0", - "@typescript-eslint/utils": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/type-utils": "8.42.0", + "@typescript-eslint/utils": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -5626,7 +5559,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.41.0", + "@typescript-eslint/parser": "^8.42.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } @@ -5642,16 +5575,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.41.0.tgz", - "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.42.0.tgz", + "integrity": "sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", "debug": "^4.3.4" }, "engines": { @@ -5667,13 +5600,13 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", - "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.42.0.tgz", + "integrity": "sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==", "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.41.0", - "@typescript-eslint/types": "^8.41.0", + "@typescript-eslint/tsconfig-utils": "^8.42.0", + "@typescript-eslint/types": "^8.42.0", "debug": "^4.3.4" }, "engines": { @@ -5688,13 +5621,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", - "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.42.0.tgz", + "integrity": "sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0" + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5705,9 +5638,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", - "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.42.0.tgz", + "integrity": "sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5721,15 +5654,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz", - "integrity": "sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.42.0.tgz", + "integrity": "sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0", - "@typescript-eslint/utils": "8.41.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/utils": "8.42.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -5746,9 +5679,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", - "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.42.0.tgz", + "integrity": "sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5759,15 +5692,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", - "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.42.0.tgz", + "integrity": "sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==", "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.41.0", - "@typescript-eslint/tsconfig-utils": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/project-service": "8.42.0", + "@typescript-eslint/tsconfig-utils": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/visitor-keys": "8.42.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -5786,6 +5719,15 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -5802,15 +5744,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", - "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.42.0.tgz", + "integrity": "sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0" + "@typescript-eslint/scope-manager": "8.42.0", + "@typescript-eslint/types": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5825,12 +5767,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", - "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.42.0.tgz", + "integrity": "sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/types": "8.42.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -5841,6 +5783,18 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@vitest/coverage-v8": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", @@ -5876,11 +5830,12 @@ } }, "node_modules/@vitest/eslint-plugin": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.4.tgz", - "integrity": "sha512-EOg8d0jn3BAiKnR55WkFxmxfWA3nmzrbIIuOXyTe6A72duryNgyU+bdBEauA97Aab3ho9kLmAwgPX63Ckj4QEg==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.3.8.tgz", + "integrity": "sha512-+M0eRDo/UiIF4xZZbZBBAR2Resx0ihdLRNpYevkrDJ6F3xHuEXSAAJGt6Ahabd0eJC4mQKvLA1JY1qBM058Cag==", "license": "MIT", "dependencies": { + "@typescript-eslint/scope-manager": "^8.41.0", "@typescript-eslint/utils": "^8.24.1" }, "peerDependencies": { @@ -6176,13 +6131,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "devOptional": true, + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -6240,16 +6198,53 @@ "node": ">=10" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" @@ -6278,17 +6273,26 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.3.tgz", - "integrity": "sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.5.tgz", + "integrity": "sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.30", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -6300,7 +6304,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -6487,9 +6490,9 @@ } }, "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", + "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==", "license": "MIT" }, "node_modules/bplist-parser": { @@ -6505,12 +6508,13 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -6535,10 +6539,10 @@ } }, "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "devOptional": true, + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, "funding": [ { "type": "github", @@ -6556,7 +6560,7 @@ "license": "MIT", "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "node_modules/buffer-alloc": { @@ -6641,7 +6645,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -6712,9 +6715,9 @@ } }, "node_modules/chai": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", - "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -6829,15 +6832,81 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "devOptional": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/clsx": { @@ -6932,19 +7001,18 @@ "license": "MIT" }, "node_modules/concurrently": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", - "integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", @@ -6957,21 +7025,6 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/concurrently/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/concurrently/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -6988,35 +7041,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/concurrently/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/concurrently/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/content-disposition": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", @@ -7057,9 +7081,9 @@ } }, "node_modules/core-js": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.44.0.tgz", - "integrity": "sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==", + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7162,6 +7186,57 @@ "node": ">= 12" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -7385,7 +7460,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -7411,6 +7485,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/degenerator": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", @@ -7555,54 +7646,12 @@ "readable-stream": "^4.5.2" } }, - "node_modules/duplexpair/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/duplexpair/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" + "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", @@ -7611,10 +7660,10 @@ "license": "MIT" }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "devOptional": true, + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, "license": "MIT" }, "node_modules/encodeurl": { @@ -7636,6 +7685,74 @@ "once": "^1.4.0" } }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -7677,7 +7794,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -7689,6 +7805,23 @@ "node": ">= 0.4" } }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", @@ -7697,9 +7830,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", - "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", "devOptional": true, "hasInstallScript": true, "license": "MIT", @@ -7710,32 +7843,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.6", - "@esbuild/android-arm": "0.25.6", - "@esbuild/android-arm64": "0.25.6", - "@esbuild/android-x64": "0.25.6", - "@esbuild/darwin-arm64": "0.25.6", - "@esbuild/darwin-x64": "0.25.6", - "@esbuild/freebsd-arm64": "0.25.6", - "@esbuild/freebsd-x64": "0.25.6", - "@esbuild/linux-arm": "0.25.6", - "@esbuild/linux-arm64": "0.25.6", - "@esbuild/linux-ia32": "0.25.6", - "@esbuild/linux-loong64": "0.25.6", - "@esbuild/linux-mips64el": "0.25.6", - "@esbuild/linux-ppc64": "0.25.6", - "@esbuild/linux-riscv64": "0.25.6", - "@esbuild/linux-s390x": "0.25.6", - "@esbuild/linux-x64": "0.25.6", - "@esbuild/netbsd-arm64": "0.25.6", - "@esbuild/netbsd-x64": "0.25.6", - "@esbuild/openbsd-arm64": "0.25.6", - "@esbuild/openbsd-x64": "0.25.6", - "@esbuild/openharmony-arm64": "0.25.6", - "@esbuild/sunos-x64": "0.25.6", - "@esbuild/win32-arm64": "0.25.6", - "@esbuild/win32-ia32": "0.25.6", - "@esbuild/win32-x64": "0.25.6" + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" } }, "node_modules/escalade": { @@ -7911,6 +8044,18 @@ } }, "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", @@ -7922,16 +8067,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -7973,6 +8108,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -8087,12 +8234,12 @@ } }, "node_modules/eventsource-parser": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.5.tgz", - "integrity": "sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=18.0.0" } }, "node_modules/execa": { @@ -8142,6 +8289,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -8285,9 +8438,10 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "dev": true, "funding": [ { "type": "github", @@ -8296,7 +8450,7 @@ ], "license": "MIT", "dependencies": { - "strnum": "^2.1.0" + "strnum": "^1.1.1" }, "bin": { "fxparser": "src/cli/cli.js" @@ -8441,7 +8595,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -8477,19 +8630,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", @@ -8617,6 +8757,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -8688,6 +8857,23 @@ "node": ">=0.10.0" } }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-tsconfig": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", @@ -8767,65 +8953,6 @@ "node": ">= 6" } }, - "node_modules/glob/node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/glob/node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/globals": { "version": "16.3.0", "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", @@ -8839,6 +8966,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -8887,6 +9030,18 @@ "uglify-js": "^3.1.4" } }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8900,7 +9055,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -8909,6 +9063,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -8925,7 +9094,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -9125,15 +9293,29 @@ "license": "ISC", "optional": true }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "license": "MIT", "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, "engines": { "node": ">= 12" } @@ -9154,6 +9336,57 @@ "license": "MIT", "optional": true }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -9167,11 +9400,26 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9180,6 +9428,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", @@ -9204,6 +9485,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -9214,6 +9510,24 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -9244,6 +9558,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", @@ -9251,6 +9577,18 @@ "dev": true, "license": "MIT" }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -9260,12 +9598,73 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -9276,11 +9675,43 @@ "node": ">=0.10.0" } }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -9292,6 +9723,49 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", @@ -9311,7 +9785,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, "license": "MIT" }, "node_modules/isexe": { @@ -9368,9 +9841,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -9382,19 +9855,19 @@ } }, "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jest-diff": { @@ -9440,9 +9913,9 @@ } }, "node_modules/jose": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.0.12.tgz", - "integrity": "sha512-T8xypXs8CpmiIi78k0E+Lk7T2zlK4zDyg+o1CZ4AkOHgDg98ogdP2BeZ61lTFKFyoEwJ9RgAgN+SdM3iPgNonQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.0.tgz", + "integrity": "sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==", "license": "MIT", "peer": true, "funding": { @@ -9667,13 +10140,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -9708,16 +10174,16 @@ "license": "MIT" }, "node_modules/loupe": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", - "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "devOptional": true, "license": "MIT" }, "node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.1.tgz", + "integrity": "sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==", "license": "ISC", "engines": { "node": "20 || >=22" @@ -9763,13 +10229,13 @@ "optional": true }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", "devOptional": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/magicast": { @@ -9959,16 +10425,19 @@ } }, "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -9982,13 +10451,13 @@ } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minizlib": { @@ -10157,9 +10626,9 @@ } }, "node_modules/mongodb-client-encryption": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-6.4.0.tgz", - "integrity": "sha512-Un1W/5P4KjcUBPeJeSKFNaWH0/8PVsoSatDqyWM2bMK0Vu2Jjxy7ZTgDj1g+uChuqroB09s8LvppdsHpwxSTVA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-6.5.0.tgz", + "integrity": "sha512-Gj8EeyYKsssdko0NKhWRBGDif6uVFBbv+e+Nyn7E316UmRzApc4IP+p2NLm+av+fU+dFHVT5WqfzaQVDTh8i9w==", "hasInstallScript": true, "license": "Apache-2.0", "optional": true, @@ -10270,10 +10739,13 @@ "optional": true }, "node_modules/mongodb-redact": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/mongodb-redact/-/mongodb-redact-1.1.8.tgz", - "integrity": "sha512-EbZ+q7LsVz7q8n49mGIcXgP2UiBp6R6vHEVbmGnF21ThCnP6AIho7wqpHqyjqqGjg54DoXQJTCwHPSknsCHv6g==", - "license": "Apache-2.0" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mongodb-redact/-/mongodb-redact-1.2.0.tgz", + "integrity": "sha512-UVJBlVNEF/8UhZ/SwR+KJXqf6pVY0b0M9aBa+1cwdRAoFFqH5NZUhMdzaXCCvhY2hoPtZ32Z7vYMoDl6Msmm/g==", + "license": "Apache-2.0", + "dependencies": { + "regexp.escape": "^2.0.1" + } }, "node_modules/mongodb-runner": { "version": "5.9.2", @@ -10293,50 +10765,6 @@ "mongodb-runner": "bin/runner.js" } }, - "node_modules/mongodb-runner/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/mongodb-runner/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/mongodb-runner/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/mongodb-schema": { "version": "12.6.2", "resolved": "https://registry.npmjs.org/mongodb-schema/-/mongodb-schema-12.6.2.tgz", @@ -10360,50 +10788,6 @@ "yargs": "^17.6.2" } }, - "node_modules/mongodb-schema/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/mongodb-schema/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "optional": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/mongodb-schema/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "optional": true, - "engines": { - "node": ">=12" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10475,9 +10859,9 @@ } }, "node_modules/node-abi": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", - "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", + "version": "3.77.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.77.0.tgz", + "integrity": "sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==", "license": "MIT", "optional": true, "dependencies": { @@ -10752,10 +11136,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/oidc-token-hash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.0.tgz", - "integrity": "sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.1.tgz", + "integrity": "sha512-D7EmwxJV6DsEB6vOFLrBM2OzsVgQzgPWyHlV2OOAVj772n+WTXpudC9e9u5BVKQnYwaD30Ivhi9b+4UeBcGu9g==", "license": "MIT", "engines": { "node": "^10.13.0 || >=12.0.0" @@ -10859,38 +11272,6 @@ "json-pointer": "0.6.2" } }, - "node_modules/openapi-sampler/node_modules/fast-xml-parser": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", - "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.1.1" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/openapi-sampler/node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, "node_modules/openapi-types": { "version": "12.1.3", "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", @@ -10925,6 +11306,58 @@ "integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==", "license": "MIT" }, + "node_modules/openapi-typescript/node_modules/@redocly/config": { + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz", + "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/openapi-typescript/node_modules/@redocly/openapi-core": { + "version": "1.34.5", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.5.tgz", + "integrity": "sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/ajv": "^8.11.2", + "@redocly/config": "^0.22.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.5", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "minimatch": "^5.0.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" + } + }, + "node_modules/openapi-typescript/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/openapi-typescript/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/openapi-typescript/node_modules/supports-color": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.0.tgz", @@ -10949,14 +11382,14 @@ } }, "node_modules/openid-client": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.6.4.tgz", - "integrity": "sha512-PLWVhRksRnNH05sqeuCX/PR+1J70NyZcAcPske+FeF732KKONd3v0p5Utx1ro1iLfCglH8B3/+dA1vqIHDoIiA==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.7.1.tgz", + "integrity": "sha512-kOiE4q0kNogr90hXsxPrKeEDuY+V0kkZazvZScOwZkYept9slsaQ3usXTaKkm6I04vLNuw5caBoX7UfrwC6x8w==", "license": "MIT", "peer": true, "dependencies": { - "jose": "^6.0.12", - "oauth4webapi": "^3.7.0" + "jose": "^6.1.0", + "oauth4webapi": "^3.8.0" }, "funding": { "url": "https://github.com/sponsors/panva" @@ -11007,6 +11440,23 @@ "dev": true, "license": "MIT" }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -11155,36 +11605,30 @@ } }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "engines": { - "node": ">=16" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/pathe": { @@ -11307,7 +11751,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -11510,6 +11953,13 @@ "signal-exit": "^3.0.2" } }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/protobufjs": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", @@ -11623,18 +12073,34 @@ } }, "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", + "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", - "iconv-lite": "0.6.3", + "iconv-lite": "0.7.0", "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/rc": { @@ -11795,18 +12261,20 @@ } }, "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "devOptional": true, + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/readdirp": { @@ -11863,6 +12331,80 @@ "styled-components": "^4.1.1 || ^5.1.1 || ^6.0.5" } }, + "node_modules/redoc/node_modules/@redocly/config": { + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz", + "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/redoc/node_modules/@redocly/openapi-core": { + "version": "1.34.5", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.5.tgz", + "integrity": "sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/ajv": "^8.11.2", + "@redocly/config": "^0.22.0", + "colorette": "^1.2.0", + "https-proxy-agent": "^7.0.5", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "minimatch": "^5.0.1", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" + } + }, + "node_modules/redoc/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/redoc/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/reftools": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", @@ -11873,6 +12415,46 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, + "node_modules/regexp.escape": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexp.escape/-/regexp.escape-2.0.1.tgz", + "integrity": "sha512-JItRb4rmyTzmERBkAf6J87LjDPy/RscIwmaJQ3gsFlAzrmZbZU8LwBw5IydFZXW9hqpgbPlGbMhtpqtuAhMgtg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "for-each": "^0.3.3", + "safe-regex-test": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -11952,9 +12534,9 @@ } }, "node_modules/rollup": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", - "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.0.tgz", + "integrity": "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11968,26 +12550,27 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.45.1", - "@rollup/rollup-android-arm64": "4.45.1", - "@rollup/rollup-darwin-arm64": "4.45.1", - "@rollup/rollup-darwin-x64": "4.45.1", - "@rollup/rollup-freebsd-arm64": "4.45.1", - "@rollup/rollup-freebsd-x64": "4.45.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", - "@rollup/rollup-linux-arm-musleabihf": "4.45.1", - "@rollup/rollup-linux-arm64-gnu": "4.45.1", - "@rollup/rollup-linux-arm64-musl": "4.45.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-musl": "4.45.1", - "@rollup/rollup-linux-s390x-gnu": "4.45.1", - "@rollup/rollup-linux-x64-gnu": "4.45.1", - "@rollup/rollup-linux-x64-musl": "4.45.1", - "@rollup/rollup-win32-arm64-msvc": "4.45.1", - "@rollup/rollup-win32-ia32-msvc": "4.45.1", - "@rollup/rollup-win32-x64-msvc": "4.45.1", + "@rollup/rollup-android-arm-eabi": "4.50.0", + "@rollup/rollup-android-arm64": "4.50.0", + "@rollup/rollup-darwin-arm64": "4.50.0", + "@rollup/rollup-darwin-x64": "4.50.0", + "@rollup/rollup-freebsd-arm64": "4.50.0", + "@rollup/rollup-freebsd-x64": "4.50.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.0", + "@rollup/rollup-linux-arm-musleabihf": "4.50.0", + "@rollup/rollup-linux-arm64-gnu": "4.50.0", + "@rollup/rollup-linux-arm64-musl": "4.50.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.0", + "@rollup/rollup-linux-ppc64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-musl": "4.50.0", + "@rollup/rollup-linux-s390x-gnu": "4.50.0", + "@rollup/rollup-linux-x64-gnu": "4.50.0", + "@rollup/rollup-linux-x64-musl": "4.50.0", + "@rollup/rollup-openharmony-arm64": "4.50.0", + "@rollup/rollup-win32-arm64-msvc": "4.50.0", + "@rollup/rollup-win32-ia32-msvc": "4.50.0", + "@rollup/rollup-win32-x64-msvc": "4.50.0", "fsevents": "~2.3.2" } }, @@ -12052,6 +12635,25 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -12072,6 +12674,39 @@ ], "license": "MIT" }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -12166,17 +12801,6 @@ "range-parser": "1.2.0" } }, - "node_modules/serve-handler/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/serve-handler/node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -12276,7 +12900,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -12290,6 +12913,35 @@ "node": ">= 0.4" } }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12477,10 +13129,17 @@ "license": "ISC" }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/simple-concat": { "version": "1.0.1", @@ -12573,6 +13232,21 @@ "ws": "^7.4.2" } }, + "node_modules/simple-websocket/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/simple-websocket/node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", @@ -12616,12 +13290,12 @@ } }, "node_modules/socks": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz", - "integrity": "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -12643,6 +13317,15 @@ "node": ">= 14" } }, + "node_modules/socks/node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -12748,6 +13431,19 @@ "integrity": "sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==", "dev": true }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -12759,18 +13455,21 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { @@ -12789,11 +13488,28 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -12802,6 +13518,78 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", @@ -12816,6 +13604,16 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-dirs": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", @@ -12864,9 +13662,10 @@ } }, "node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "dev": true, "funding": [ { "type": "github", @@ -13029,13 +13828,13 @@ } }, "node_modules/synckit": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", - "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.4" + "@pkgr/core": "^0.2.9" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -13065,24 +13864,6 @@ "url": "https://github.com/sponsors/dcastil" } }, - "node_modules/tailwindcss": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz", - "integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", @@ -13126,6 +13907,31 @@ "readable-stream": "^3.4.0" } }, + "node_modules/tar-fs/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/tar-fs/node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -13133,6 +13939,21 @@ "license": "ISC", "optional": true }, + "node_modules/tar-fs/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/tar-fs/node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", @@ -13209,6 +14030,16 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, "node_modules/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", @@ -13224,6 +14055,16 @@ "node": ">=18" } }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/test-exclude/node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -13245,6 +14086,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/test-exclude/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/test-exclude/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/test-exclude/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -13261,14 +14125,21 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/test-exclude/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/test-exclude/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/throttleit": { @@ -13323,11 +14194,14 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "devOptional": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -13338,9 +14212,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "devOptional": true, "license": "MIT", "engines": { @@ -13577,39 +14451,98 @@ "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=16" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "license": "MIT", "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { @@ -13626,16 +14559,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.41.0.tgz", - "integrity": "sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.42.0.tgz", + "integrity": "sha512-ozR/rQn+aQXQxh1YgbCzQWDFrsi9mcg+1PM3l/z5o1+20P7suOIaNg515bpr/OYt6FObz/NHcBstydDLHWeEKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.41.0", - "@typescript-eslint/parser": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0", - "@typescript-eslint/utils": "8.41.0" + "@typescript-eslint/eslint-plugin": "8.42.0", + "@typescript-eslint/parser": "8.42.0", + "@typescript-eslint/typescript-estree": "8.42.0", + "@typescript-eslint/utils": "8.42.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -13663,6 +14596,24 @@ "node": ">=0.8.0" } }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -13674,6 +14625,31 @@ "through": "^2.3.8" } }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/undici": { "version": "6.21.3", "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", @@ -13834,17 +14810,17 @@ } }, "node_modules/vite": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.4.tgz", - "integrity": "sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz", + "integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==", "devOptional": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.6", - "picomatch": "^4.0.2", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", "postcss": "^8.5.6", - "rollup": "^4.40.0", + "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "bin": { @@ -13932,11 +14908,14 @@ } }, "node_modules/vite/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "devOptional": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -13947,9 +14926,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "devOptional": true, "license": "MIT", "engines": { @@ -14062,9 +15041,9 @@ } }, "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "devOptional": true, "license": "MIT", "engines": { @@ -14120,11 +15099,74 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -14198,18 +15240,18 @@ "license": "MIT" }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "devOptional": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -14234,6 +15276,64 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -14324,19 +15424,19 @@ "license": "Apache-2.0" }, "node_modules/yargs": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz", - "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==", - "dev": true, + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "devOptional": true, "license": "MIT", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" @@ -14351,14 +15451,59 @@ "node": "^20.19.0 || ^22.12.0 || >=23" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "devOptional": true, "license": "ISC", "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yauzl": { diff --git a/package.json b/package.json index 67fbb68b8..cc7e68cc9 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "@mongodb-js/devtools-connect": "^3.9.3", "@mongodb-js/devtools-proxy-support": "^0.5.2", "@mongosh/arg-parser": "^3.14.0", - "@mongosh/service-provider-node-driver": "^3.12.0", + "@mongosh/service-provider-node-driver": "~3.12.0", "@vitest/eslint-plugin": "^1.3.4", "bson": "^6.10.4", "express": "^5.1.0", @@ -108,7 +108,7 @@ "mongodb": "^6.19.0", "mongodb-connection-string-url": "^3.0.2", "mongodb-log-writer": "^2.4.1", - "mongodb-redact": "^1.1.8", + "mongodb-redact": "^1.2.0", "mongodb-schema": "^12.6.2", "node-fetch": "^3.3.2", "node-machine-id": "1.1.12", diff --git a/src/common/config.ts b/src/common/config.ts index 4bc02efe9..a4ff9c111 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -3,6 +3,8 @@ import os from "os"; import argv from "yargs-parser"; import type { CliOptions, ConnectionInfo } from "@mongosh/arg-parser"; import { generateConnectionInfoFromCliArgs } from "@mongosh/arg-parser"; +import { Keychain } from "./keychain.js"; +import type { Secret } from "./keychain.js"; // From: https://github.com/mongodb-js/mongosh/blob/main/packages/cli-repl/src/arg-parser.ts const OPTIONS = { @@ -316,6 +318,29 @@ function commaSeparatedToArray(str: string | string[] | unde return str as T; } +export function registerKnownSecretsInRootKeychain(userConfig: Partial): void { + const keychain = Keychain.root; + + const maybeRegister = (value: string | undefined, kind: Secret["kind"]): void => { + if (value) { + keychain.register(value, kind); + } + }; + + maybeRegister(userConfig.apiClientId, "user"); + maybeRegister(userConfig.apiClientSecret, "password"); + maybeRegister(userConfig.awsAccessKeyId, "password"); + maybeRegister(userConfig.awsIamSessionToken, "password"); + maybeRegister(userConfig.awsSecretAccessKey, "password"); + maybeRegister(userConfig.awsSessionToken, "password"); + maybeRegister(userConfig.password, "password"); + maybeRegister(userConfig.tlsCAFile, "url"); + maybeRegister(userConfig.tlsCRLFile, "url"); + maybeRegister(userConfig.tlsCertificateKeyFile, "url"); + maybeRegister(userConfig.tlsCertificateKeyFilePassword, "password"); + maybeRegister(userConfig.username, "user"); +} + export function setupUserConfig({ cli, env, @@ -369,6 +394,7 @@ export function setupUserConfig({ } } + registerKnownSecretsInRootKeychain(userConfig); return userConfig; } diff --git a/src/common/connectionManager.ts b/src/common/connectionManager.ts index 78e51edbc..15ad8e2d9 100644 --- a/src/common/connectionManager.ts +++ b/src/common/connectionManager.ts @@ -199,19 +199,15 @@ export class MCPConnectionManager extends ConnectionManager { } try { - const connectionType = MCPConnectionManager.inferConnectionTypeFromSettings( - this.userConfig, - connectionInfo - ); - if (connectionType.startsWith("oidc")) { + if (connectionStringAuthType.startsWith("oidc")) { void this.pingAndForget(serviceProvider); return this.changeState("connection-request", { tag: "connecting", connectedAtlasCluster: settings.atlas, serviceProvider, - connectionStringAuthType: connectionType, - oidcConnectionType: connectionType as OIDCConnectionAuthType, + connectionStringAuthType, + oidcConnectionType: connectionStringAuthType as OIDCConnectionAuthType, }); } @@ -221,7 +217,7 @@ export class MCPConnectionManager extends ConnectionManager { tag: "connected", connectedAtlasCluster: settings.atlas, serviceProvider, - connectionStringAuthType: connectionType, + connectionStringAuthType, }); } catch (error: unknown) { const errorReason = error instanceof Error ? error.message : `${error as string}`; diff --git a/src/common/keychain.ts b/src/common/keychain.ts new file mode 100644 index 000000000..3e4e180aa --- /dev/null +++ b/src/common/keychain.ts @@ -0,0 +1,40 @@ +import type { Secret } from "mongodb-redact"; +export type { Secret } from "mongodb-redact"; + +/** + * This class holds the secrets of a single server. Ideally, we might want to have a keychain + * per session, but right now the loggers are set up by server and are not aware of the concept + * of session and this would require a bigger refactor. + * + * Whenever we identify or create a secret (for example, Atlas login, CLI arguments...) we + * should register them in the root Keychain (`Keychain.root.register`) or preferably + * on the session keychain if available `this.session.keychain`. + **/ +export class Keychain { + private secrets: Secret[]; + private static rootKeychain: Keychain = new Keychain(); + + constructor() { + this.secrets = []; + } + + static get root(): Keychain { + return Keychain.rootKeychain; + } + + register(value: Secret["value"], kind: Secret["kind"]): void { + this.secrets.push({ value, kind }); + } + + clearAllSecrets(): void { + this.secrets = []; + } + + get allSecrets(): Secret[] { + return [...this.secrets]; + } +} + +export function registerGlobalSecretToRedact(value: Secret["value"], kind: Secret["kind"]): void { + Keychain.root.register(value, kind); +} diff --git a/src/common/logger.ts b/src/common/logger.ts index 03b94f313..bba350710 100644 --- a/src/common/logger.ts +++ b/src/common/logger.ts @@ -1,10 +1,11 @@ import fs from "fs/promises"; import type { MongoLogId, MongoLogWriter } from "mongodb-log-writer"; import { mongoLogId, MongoLogManager } from "mongodb-log-writer"; -import redact from "mongodb-redact"; +import { redact } from "mongodb-redact"; import type { LoggingMessageNotification } from "@modelcontextprotocol/sdk/types.js"; import { EventEmitter } from "events"; import type { Server } from "../lib.js"; +import type { Keychain } from "./keychain.js"; export type LogLevel = LoggingMessageNotification["params"]["level"]; @@ -84,6 +85,10 @@ type DefaultEventMap = [never]; export abstract class LoggerBase = DefaultEventMap> extends EventEmitter { private readonly defaultUnredactedLogger: LoggerType = "mcp"; + constructor(private readonly keychain: Keychain | undefined) { + super(); + } + public log(level: LogLevel, payload: LogPayload): void { // If no explicit value is supplied for unredacted loggers, default to "mcp" const noRedaction = payload.noRedaction !== undefined ? payload.noRedaction : this.defaultUnredactedLogger; @@ -122,7 +127,7 @@ export abstract class LoggerBase = DefaultEventMap> extend return message; } - return redact(message); + return redact(message, this.keychain?.allSecrets ?? []); } public info(payload: LogPayload): void { @@ -180,6 +185,10 @@ export abstract class LoggerBase = DefaultEventMap> extend export class ConsoleLogger extends LoggerBase { protected readonly type: LoggerType = "console"; + public constructor(keychain: Keychain) { + super(keychain); + } + protected logCore(level: LogLevel, payload: LogPayload): void { const { id, context, message } = payload; console.error( @@ -201,8 +210,8 @@ export class DiskLogger extends LoggerBase<{ initialized: [] }> { private bufferedMessages: { level: LogLevel; payload: LogPayload }[] = []; private logWriter?: MongoLogWriter; - public constructor(logPath: string, onError: (error: Error) => void) { - super(); + public constructor(logPath: string, onError: (error: Error) => void, keychain: Keychain) { + super(keychain); void this.initialize(logPath, onError); } @@ -262,8 +271,11 @@ export class McpLogger extends LoggerBase { "emergency", ] as const; - public constructor(private readonly server: Server) { - super(); + public constructor( + private readonly server: Server, + keychain: Keychain + ) { + super(keychain); } protected readonly type: LoggerType = "mcp"; @@ -295,7 +307,9 @@ export class CompositeLogger extends LoggerBase { private readonly attributes: Record = {}; constructor(...loggers: LoggerBase[]) { - super(); + // composite logger does not redact, only the actual delegates do the work + // so we don't need the Keychain here + super(undefined); this.loggers = loggers; } @@ -327,6 +341,10 @@ export class CompositeLogger extends LoggerBase { export class NullLogger extends LoggerBase { protected type?: LoggerType; + constructor() { + super(undefined); + } + protected logCore(): void { // No-op logger, does not log anything } diff --git a/src/common/session.ts b/src/common/session.ts index c1f7b5a12..24946b171 100644 --- a/src/common/session.ts +++ b/src/common/session.ts @@ -15,6 +15,7 @@ import type { import type { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver"; import { ErrorCodes, MongoDBError } from "./errors.js"; import type { ExportsManager } from "./exportsManager.js"; +import type { Keychain } from "./keychain.js"; export interface SessionOptions { apiBaseUrl: string; @@ -23,6 +24,7 @@ export interface SessionOptions { logger: CompositeLogger; exportsManager: ExportsManager; connectionManager: ConnectionManager; + keychain: Keychain; } export type SessionEvents = { @@ -37,6 +39,8 @@ export class Session extends EventEmitter { readonly exportsManager: ExportsManager; readonly connectionManager: ConnectionManager; readonly apiClient: ApiClient; + readonly keychain: Keychain; + mcpClient?: { name?: string; version?: string; @@ -52,9 +56,11 @@ export class Session extends EventEmitter { logger, connectionManager, exportsManager, + keychain, }: SessionOptions) { super(); + this.keychain = keychain; this.logger = logger; const credentials: ApiClientCredentials | undefined = apiClientId && apiClientSecret diff --git a/src/index.ts b/src/index.ts index f7699518a..c4013b4e7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -42,6 +42,7 @@ import { packageInfo } from "./common/packageInfo.js"; import { StdioRunner } from "./transports/stdio.js"; import { StreamableHttpRunner } from "./transports/streamableHttp.js"; import { systemCA } from "@mongodb-js/devtools-proxy-support"; +import { Keychain } from "./common/keychain.js"; async function main(): Promise { systemCA().catch(() => undefined); // load system CA asynchronously as in mongosh @@ -121,7 +122,7 @@ main().catch((error: unknown) => { // At this point, we may be in a very broken state, so we can't rely on the logger // being functional. Instead, create a brand new ConsoleLogger and log the error // to the console. - const logger = new ConsoleLogger(); + const logger = new ConsoleLogger(Keychain.root); logger.emergency({ id: LogId.serverStartFailure, context: "server", diff --git a/src/lib.ts b/src/lib.ts index e6388b511..bb2a631ea 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -19,3 +19,5 @@ export type { } from "./common/connectionErrorHandler.js"; export { ErrorCodes } from "./common/errors.js"; export { Telemetry } from "./telemetry/telemetry.js"; +export { Keychain, registerGlobalSecretToRedact } from "./common/keychain.js"; +export type { Secret } from "./common/keychain.js"; diff --git a/src/tools/atlas/connect/connectCluster.ts b/src/tools/atlas/connect/connectCluster.ts index 13f55acec..618f5483b 100644 --- a/src/tools/atlas/connect/connectCluster.ts +++ b/src/tools/atlas/connect/connectCluster.ts @@ -115,6 +115,9 @@ export class ConnectClusterTool extends AtlasToolBase { cn.password = password; cn.searchParams.set("authSource", "admin"); + this.session.keychain.register(username, "user"); + this.session.keychain.register(password, "password"); + return { connectionString: cn.toString(), atlas: connectedAtlasCluster }; } diff --git a/src/tools/atlas/create/createDBUser.ts b/src/tools/atlas/create/createDBUser.ts index 98d956980..a807c44f5 100644 --- a/src/tools/atlas/create/createDBUser.ts +++ b/src/tools/atlas/create/createDBUser.ts @@ -78,6 +78,11 @@ export class CreateDBUserTool extends AtlasToolBase { body: input, }); + this.session.keychain.register(username, "user"); + if (password) { + this.session.keychain.register(password, "password"); + } + return { content: [ { diff --git a/src/transports/base.ts b/src/transports/base.ts index f870514b9..5132b16c9 100644 --- a/src/transports/base.ts +++ b/src/transports/base.ts @@ -8,6 +8,7 @@ import type { LoggerBase } from "../common/logger.js"; import { CompositeLogger, ConsoleLogger, DiskLogger, McpLogger } from "../common/logger.js"; import { ExportsManager } from "../common/exportsManager.js"; import { DeviceId } from "../helpers/deviceId.js"; +import { Keychain } from "../common/keychain.js"; import { createMCPConnectionManager, type ConnectionManagerFactoryFn } from "../common/connectionManager.js"; import { type ConnectionErrorHandler, @@ -39,16 +40,20 @@ export abstract class TransportRunnerBase { this.connectionErrorHandler = connectionErrorHandler; const loggers: LoggerBase[] = [...additionalLoggers]; if (this.userConfig.loggers.includes("stderr")) { - loggers.push(new ConsoleLogger()); + loggers.push(new ConsoleLogger(Keychain.root)); } if (this.userConfig.loggers.includes("disk")) { loggers.push( - new DiskLogger(this.userConfig.logPath, (err) => { - // If the disk logger fails to initialize, we log the error to stderr and exit - console.error("Error initializing disk logger:", err); - process.exit(1); - }) + new DiskLogger( + this.userConfig.logPath, + (err) => { + // If the disk logger fails to initialize, we log the error to stderr and exit + console.error("Error initializing disk logger:", err); + process.exit(1); + }, + Keychain.root + ) ); } @@ -77,6 +82,7 @@ export abstract class TransportRunnerBase { logger, exportsManager, connectionManager, + keychain: Keychain.root, }); const telemetry = Telemetry.create(session, this.userConfig, this.deviceId); @@ -92,7 +98,7 @@ export abstract class TransportRunnerBase { // We need to create the MCP logger after the server is constructed // because it needs the server instance if (this.userConfig.loggers.includes("mcp")) { - logger.addLogger(new McpLogger(result)); + logger.addLogger(new McpLogger(result, Keychain.root)); } return result; diff --git a/src/types/mongodb-redact.d.ts b/src/types/mongodb-redact.d.ts deleted file mode 100644 index df8801439..000000000 --- a/src/types/mongodb-redact.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module "mongodb-redact" { - function redact(message: T): T; - export default redact; -} diff --git a/tests/integration/helpers.ts b/tests/integration/helpers.ts index 8820476a7..1f28995dd 100644 --- a/tests/integration/helpers.ts +++ b/tests/integration/helpers.ts @@ -14,6 +14,7 @@ import type { ConnectionManager, ConnectionState } from "../../src/common/connec import { MCPConnectionManager } from "../../src/common/connectionManager.js"; import { DeviceId } from "../../src/helpers/deviceId.js"; import { connectionErrorHandler } from "../../src/common/connectionErrorHandler.js"; +import { Keychain } from "../../src/common/keychain.js"; interface ParameterInfo { name: string; @@ -82,6 +83,7 @@ export function setupIntegrationTest( logger, exportsManager, connectionManager, + keychain: new Keychain(), }); // Mock hasValidAccessToken for tests diff --git a/tests/integration/telemetry.test.ts b/tests/integration/telemetry.test.ts index b63a3796f..110bb2e5b 100644 --- a/tests/integration/telemetry.test.ts +++ b/tests/integration/telemetry.test.ts @@ -6,6 +6,7 @@ import { describe, expect, it } from "vitest"; import { CompositeLogger } from "../../src/common/logger.js"; import { MCPConnectionManager } from "../../src/common/connectionManager.js"; import { ExportsManager } from "../../src/common/exportsManager.js"; +import { Keychain } from "../../src/common/keychain.js"; describe("Telemetry", () => { it("should resolve the actual device ID", async () => { @@ -20,6 +21,7 @@ describe("Telemetry", () => { logger, exportsManager: ExportsManager.init(config, logger), connectionManager: new MCPConnectionManager(config, driverOptions, logger, deviceId), + keychain: new Keychain(), }), config, deviceId diff --git a/tests/integration/tools/atlas/dbUsers.test.ts b/tests/integration/tools/atlas/dbUsers.test.ts index b6b055321..fee08b421 100644 --- a/tests/integration/tools/atlas/dbUsers.test.ts +++ b/tests/integration/tools/atlas/dbUsers.test.ts @@ -2,6 +2,7 @@ import { describeWithAtlas, withProject, randomId } from "./atlasHelpers.js"; import { expectDefined, getResponseElements } from "../../helpers.js"; import { ApiClientError } from "../../../../src/common/atlas/apiClientError.js"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { Keychain } from "../../../../src/common/keychain.js"; describeWithAtlas("db users", (integration) => { withProject(integration, ({ getProjectId }) => { @@ -53,6 +54,14 @@ describeWithAtlas("db users", (integration) => { }); describe("atlas-create-db-user", () => { + beforeEach(() => { + Keychain.root.clearAllSecrets(); + }); + + afterEach(() => { + Keychain.root.clearAllSecrets(); + }); + it("should have correct metadata", async () => { const { tools } = await integration.mcpClient().listTools(); const createDbUser = tools.find((tool) => tool.name === "atlas-create-db-user"); @@ -74,6 +83,16 @@ describeWithAtlas("db users", (integration) => { expect(elements[0]?.text).toContain("created successfully"); expect(elements[0]?.text).toContain(userName); expect(elements[0]?.text).not.toContain("testpassword"); + + expect(integration.mcpServer().session.keychain.allSecrets).toContainEqual({ + value: userName, + kind: "user", + }); + + expect(integration.mcpServer().session.keychain.allSecrets).toContainEqual({ + value: "testpassword", + kind: "password", + }); }); it("should create a database user with generated password", async () => { @@ -83,6 +102,24 @@ describeWithAtlas("db users", (integration) => { expect(elements[0]?.text).toContain("created successfully"); expect(elements[0]?.text).toContain(userName); expect(elements[0]?.text).toContain("with password: `"); + + const passwordStart = elements[0]?.text.lastIndexOf(":") ?? -1; + const passwordEnd = elements[0]?.text.length ?? 1 - 1; + + const password = elements[0]?.text + .substring(passwordStart + 1, passwordEnd - 1) + .replace(/`/g, "") + .trim(); + + expect(integration.mcpServer().session.keychain.allSecrets).toContainEqual({ + value: userName, + kind: "user", + }); + + expect(integration.mcpServer().session.keychain.allSecrets).toContainEqual({ + value: password, + kind: "password", + }); }); it("should add current IP to access list when creating a database user", async () => { diff --git a/tests/integration/tools/mongodb/mongodbTool.test.ts b/tests/integration/tools/mongodb/mongodbTool.test.ts index 7f8c76268..1759904e2 100644 --- a/tests/integration/tools/mongodb/mongodbTool.test.ts +++ b/tests/integration/tools/mongodb/mongodbTool.test.ts @@ -17,6 +17,7 @@ import { type ConnectionErrorHandler, connectionErrorHandler } from "../../../.. import { defaultTestConfig } from "../../helpers.js"; import { setupMongoDBIntegrationTest } from "./mongodbHelpers.js"; import { ErrorCodes } from "../../../../src/common/errors.js"; +import { Keychain } from "../../../../src/common/keychain.js"; const injectedErrorHandler: ConnectionErrorHandler = (error) => { switch (error.code) { @@ -88,6 +89,7 @@ describe("MongoDBTool implementations", () => { logger, exportsManager, connectionManager, + keychain: new Keychain(), }); const telemetry = Telemetry.create(session, userConfig, deviceId); diff --git a/tests/integration/transports/streamableHttp.test.ts b/tests/integration/transports/streamableHttp.test.ts index 6a7b17bff..b27f109b4 100644 --- a/tests/integration/transports/streamableHttp.test.ts +++ b/tests/integration/transports/streamableHttp.test.ts @@ -6,6 +6,7 @@ import { config } from "../../../src/common/config.js"; import type { LoggerType, LogLevel, LogPayload } from "../../../src/common/logger.js"; import { LoggerBase, LogId } from "../../../src/common/logger.js"; import { createMCPConnectionManager } from "../../../src/common/connectionManager.js"; +import { Keychain } from "../../../src/common/keychain.js"; describe("StreamableHttpRunner", () => { let runner: StreamableHttpRunner; @@ -138,7 +139,7 @@ describe("StreamableHttpRunner", () => { } it("can provide custom logger", async () => { - const logger = new CustomLogger(); + const logger = new CustomLogger(new Keychain()); const runner = new StreamableHttpRunner({ userConfig: config, createConnectionManager: createMCPConnectionManager, diff --git a/tests/unit/common/config.test.ts b/tests/unit/common/config.test.ts index 789febff1..a66c6e515 100644 --- a/tests/unit/common/config.test.ts +++ b/tests/unit/common/config.test.ts @@ -1,7 +1,14 @@ -import { describe, it, expect, vi, beforeEach } from "vitest"; +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import type { UserConfig } from "../../../src/common/config.js"; -import { setupUserConfig, defaultUserConfig, warnAboutDeprecatedCliArgs } from "../../../src/common/config.js"; +import { + setupUserConfig, + defaultUserConfig, + warnAboutDeprecatedCliArgs, + registerKnownSecretsInRootKeychain, +} from "../../../src/common/config.js"; import type { CliOptions } from "@mongosh/arg-parser"; +import { Keychain } from "../../../src/common/keychain.js"; +import type { Secret } from "../../../src/common/keychain.js"; describe("config", () => { describe("env var parsing", () => { @@ -641,4 +648,40 @@ describe("Deprecated CLI arguments", () => { }); }); } + + describe("keychain management", () => { + type TestCase = { readonly cliArg: keyof UserConfig; secretKind: Secret["kind"] }; + const testCases = [ + { cliArg: "apiClientId", secretKind: "user" }, + { cliArg: "apiClientSecret", secretKind: "password" }, + { cliArg: "awsAccessKeyId", secretKind: "password" }, + { cliArg: "awsIamSessionToken", secretKind: "password" }, + { cliArg: "awsSecretAccessKey", secretKind: "password" }, + { cliArg: "awsSessionToken", secretKind: "password" }, + { cliArg: "password", secretKind: "password" }, + { cliArg: "tlsCAFile", secretKind: "url" }, + { cliArg: "tlsCRLFile", secretKind: "url" }, + { cliArg: "tlsCertificateKeyFile", secretKind: "url" }, + { cliArg: "tlsCertificateKeyFilePassword", secretKind: "password" }, + { cliArg: "username", secretKind: "user" }, + ] as TestCase[]; + let keychain: Keychain; + + beforeEach(() => { + keychain = Keychain.root; + keychain.clearAllSecrets(); + }); + + afterEach(() => { + keychain.clearAllSecrets(); + }); + + for (const { cliArg, secretKind } of testCases) { + it(`should register ${cliArg} as a secret of kind ${secretKind} in the root keychain`, () => { + registerKnownSecretsInRootKeychain({ [cliArg]: cliArg }); + + expect(keychain.allSecrets).toEqual([{ value: cliArg, kind: secretKind }]); + }); + } + }); }); diff --git a/tests/unit/common/keychain.test.ts b/tests/unit/common/keychain.test.ts new file mode 100644 index 000000000..2f0e8d246 --- /dev/null +++ b/tests/unit/common/keychain.test.ts @@ -0,0 +1,36 @@ +import { Keychain, registerGlobalSecretToRedact } from "../../../src/common/keychain.js"; +import { describe, beforeEach, afterEach, it, expect } from "vitest"; + +describe("Keychain", () => { + let keychain: Keychain; + + beforeEach(() => { + keychain = Keychain.root; + keychain.clearAllSecrets(); + }); + + afterEach(() => { + keychain.clearAllSecrets(); + }); + + it("should register a new secret", () => { + keychain.register("123456", "password"); + expect(keychain.allSecrets).toEqual([{ value: "123456", kind: "password" }]); + }); + + it("should remove cleared secrets", () => { + keychain.register("123456", "password"); + expect(keychain.allSecrets).toEqual([{ value: "123456", kind: "password" }]); + + keychain.clearAllSecrets(); + keychain.register("654321", "user"); + expect(keychain.allSecrets).toEqual([{ value: "654321", kind: "user" }]); + }); + + describe("registerGlobalSecretToRedact", () => { + it("registers the secret in the root keychain", () => { + registerGlobalSecretToRedact("123456", "password"); + expect(keychain.allSecrets).toEqual([{ value: "123456", kind: "password" }]); + }); + }); +}); diff --git a/tests/unit/common/session.test.ts b/tests/unit/common/session.test.ts index 53129d9e9..a80520d89 100644 --- a/tests/unit/common/session.test.ts +++ b/tests/unit/common/session.test.ts @@ -7,6 +7,7 @@ import { CompositeLogger } from "../../../src/common/logger.js"; import { MCPConnectionManager } from "../../../src/common/connectionManager.js"; import { ExportsManager } from "../../../src/common/exportsManager.js"; import { DeviceId } from "../../../src/helpers/deviceId.js"; +import { Keychain } from "../../../src/common/keychain.js"; vi.mock("@mongosh/service-provider-node-driver"); @@ -28,6 +29,7 @@ describe("Session", () => { logger, exportsManager: ExportsManager.init(config, logger), connectionManager: new MCPConnectionManager(config, driverOptions, logger, mockDeviceId), + keychain: new Keychain(), }); MockNodeDriverServiceProvider.connect = vi.fn().mockResolvedValue({} as unknown as NodeDriverServiceProvider); diff --git a/tests/unit/logger.test.ts b/tests/unit/logger.test.ts index e414ed481..1868924e0 100644 --- a/tests/unit/logger.test.ts +++ b/tests/unit/logger.test.ts @@ -8,10 +8,12 @@ import * as fs from "fs/promises"; import { once } from "events"; import type { Server } from "../../src/server.js"; import { LoggingMessageNotificationSchema } from "@modelcontextprotocol/sdk/types.js"; +import { Keychain } from "../../src/common/keychain.js"; describe("Logger", () => { let consoleErrorSpy: MockInstance; let consoleLogger: ConsoleLogger; + let keychain: Keychain; let mcpLoggerSpy: MockInstance; let mcpLogger: McpLogger; @@ -20,25 +22,30 @@ describe("Logger", () => { beforeEach(() => { // Mock console.error before creating the ConsoleLogger consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {}); + keychain = Keychain.root; - consoleLogger = new ConsoleLogger(); + consoleLogger = new ConsoleLogger(keychain); mcpLoggerSpy = vi.fn(); minimumMcpLogLevel = "debug"; - mcpLogger = new McpLogger({ - mcpServer: { - server: { - sendLoggingMessage: mcpLoggerSpy, + mcpLogger = new McpLogger( + { + mcpServer: { + server: { + sendLoggingMessage: mcpLoggerSpy, + }, + isConnected: () => true, }, - isConnected: () => true, - }, - get mcpLogLevel() { - return minimumMcpLogLevel; - }, - } as unknown as Server); + get mcpLogLevel() { + return minimumMcpLogLevel; + }, + } as unknown as Server, + keychain + ); }); afterEach(() => { + keychain.clearAllSecrets(); vi.restoreAllMocks(); }); @@ -81,6 +88,16 @@ describe("Logger", () => { expectLogMessageRedaction(getLastMcpLogMessage(), false); }); + it("redacts sensitive information from the keychain", () => { + keychain.register("123456", "password"); + consoleLogger.info({ id: LogId.serverInitialized, context: "test", message: "Your password is 123456." }); + + expect(consoleErrorSpy).toHaveBeenCalledOnce(); + + expect(getLastConsoleMessage()).to.contain("Your password is "); + expect(getLastConsoleMessage()).to.not.contain("123456"); + }); + it("allows disabling redaction for all loggers", () => { const payload = { ...mockSensitivePayload, @@ -196,9 +213,13 @@ describe("Logger", () => { }; it("buffers messages during initialization", async () => { - const diskLogger = new DiskLogger(logPath, (err) => { - expect.fail(`Disk logger should not fail to initialize: ${err}`); - }); + const diskLogger = new DiskLogger( + logPath, + (err) => { + expect.fail(`Disk logger should not fail to initialize: ${err}`); + }, + keychain + ); diskLogger.info({ id: LogId.serverInitialized, context: "test", message: "Test message" }); await assertNoLogs(); @@ -212,9 +233,13 @@ describe("Logger", () => { }); it("includes attributes in the logs", async () => { - const diskLogger = new DiskLogger(logPath, (err) => { - expect.fail(`Disk logger should not fail to initialize: ${err}`); - }); + const diskLogger = new DiskLogger( + logPath, + (err) => { + expect.fail(`Disk logger should not fail to initialize: ${err}`); + }, + keychain + ); diskLogger.info({ id: LogId.serverInitialized, diff --git a/tests/unit/resources/common/debug.test.ts b/tests/unit/resources/common/debug.test.ts index d0621026b..e408dd4ba 100644 --- a/tests/unit/resources/common/debug.test.ts +++ b/tests/unit/resources/common/debug.test.ts @@ -7,6 +7,7 @@ import { CompositeLogger } from "../../../../src/common/logger.js"; import { MCPConnectionManager } from "../../../../src/common/connectionManager.js"; import { ExportsManager } from "../../../../src/common/exportsManager.js"; import { DeviceId } from "../../../../src/helpers/deviceId.js"; +import { Keychain } from "../../../../src/common/keychain.js"; describe("debug resource", () => { const logger = new CompositeLogger(); @@ -16,6 +17,7 @@ describe("debug resource", () => { logger, exportsManager: ExportsManager.init(config, logger), connectionManager: new MCPConnectionManager(config, driverOptions, logger, deviceId), + keychain: new Keychain(), }); const telemetry = Telemetry.create(session, { ...config, telemetry: "disabled" }, deviceId); From b26cd4635ba5747582adcfc9e3ce8530f048aaf8 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Sep 2025 12:43:41 +0200 Subject: [PATCH 14/49] fix(connection): support for multiple hosts urls #327 (#514) --- src/common/config.ts | 11 +++++++++-- tests/unit/common/config.test.ts | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/common/config.ts b/src/common/config.ts index a4ff9c111..9fa78ec0b 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -89,7 +89,7 @@ const OPTIONS = { "greedy-arrays": true, "short-option-groups": false, }, -}; +} as const; function isConnectionSpecifier(arg: string | undefined): boolean { return ( @@ -187,12 +187,19 @@ function getExportsPath(): string { // are prefixed with `MDB_MCP_` and the keys match the UserConfig keys, but are converted // to SNAKE_UPPER_CASE. function parseEnvConfig(env: Record): Partial { + const CONFIG_WITH_URLS: Set = new Set<(typeof OPTIONS)["string"][number]>(["connectionString"]); + function setValue(obj: Record, path: string[], value: string): void { const currentField = path.shift(); if (!currentField) { return; } if (path.length === 0) { + if (CONFIG_WITH_URLS.has(currentField)) { + obj[currentField] = value; + return; + } + const numberValue = Number(value); if (!isNaN(numberValue)) { obj[currentField] = numberValue; @@ -249,7 +256,7 @@ function SNAKE_CASE_toCamelCase(str: string): string { // whatever is in mongosh. function parseCliConfig(args: string[]): CliOptions { const programArgs = args.slice(2); - const parsed = argv(programArgs, OPTIONS) as unknown as CliOptions & + const parsed = argv(programArgs, OPTIONS as unknown as argv.Options) as unknown as CliOptions & UserConfig & { _?: string[]; }; diff --git a/tests/unit/common/config.test.ts b/tests/unit/common/config.test.ts index a66c6e515..f325461d7 100644 --- a/tests/unit/common/config.test.ts +++ b/tests/unit/common/config.test.ts @@ -12,6 +12,20 @@ import type { Secret } from "../../../src/common/keychain.js"; describe("config", () => { describe("env var parsing", () => { + describe("mongodb urls", () => { + it("should not try to parse a multiple-host urls", () => { + const actual = setupUserConfig({ + env: { + MDB_MCP_CONNECTION_STRING: "mongodb://user:password@host1,host2,host3/", + }, + cli: [], + defaults: defaultUserConfig, + }); + + expect(actual.connectionString).toEqual("mongodb://user:password@host1,host2,host3/"); + }); + }); + describe("string cases", () => { const testCases = [ { envVar: "MDB_MCP_API_BASE_URL", property: "apiBaseUrl", value: "http://test.com" }, @@ -67,6 +81,16 @@ describe("config", () => { }); describe("cli parsing", () => { + it("should not try to parse a multiple-host urls", () => { + const actual = setupUserConfig({ + cli: ["myself", "--", "--connectionString", "mongodb://user:password@host1,host2,host3/"], + env: {}, + defaults: defaultUserConfig, + }); + + expect(actual.connectionString).toEqual("mongodb://user:password@host1,host2,host3/"); + }); + describe("string use cases", () => { const testCases = [ { From dd05b486bd05139eca945d1d5edad5f3b7cc7622 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Sep 2025 13:38:21 +0200 Subject: [PATCH 15/49] chore: fix flakiness of exports by waiting to at least have 1 available (#516) --- src/common/exportsManager.ts | 2 +- tests/unit/common/exportsManager.test.ts | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/common/exportsManager.ts b/src/common/exportsManager.ts index 86b7cc57b..f83b07ee6 100644 --- a/src/common/exportsManager.ts +++ b/src/common/exportsManager.ts @@ -56,7 +56,7 @@ type StoredExport = ReadyExport | InProgressExport; * * Ref Cursor: https://forum.cursor.com/t/cursor-mcp-resource-feature-support/50987 * JIRA: https://jira.mongodb.org/browse/MCP-104 */ -type AvailableExport = Pick; +export type AvailableExport = Pick; export type ExportsManagerConfig = Pick; diff --git a/tests/unit/common/exportsManager.test.ts b/tests/unit/common/exportsManager.test.ts index 8ead40fb4..264d3230a 100644 --- a/tests/unit/common/exportsManager.test.ts +++ b/tests/unit/common/exportsManager.test.ts @@ -11,7 +11,7 @@ import { ExportsManager, validateExportName, } from "../../../src/common/exportsManager.js"; - +import type { AvailableExport } from "../../../src/common/exportsManager.js"; import { config } from "../../../src/common/config.js"; import { ROOT_DIR } from "../../accuracy/sdk/constants.js"; import { timeout } from "../../integration/helpers.js"; @@ -124,6 +124,15 @@ function timeoutPromise(timeoutMS: number, context: string): Promise { }); } +async function waitUntilThereIsAnExportAvailable(manager: ExportsManager): Promise { + return await vi.waitFor(() => { + const exports = manager.availableExports; + expect(exports.length).toBeGreaterThan(0); + + return exports; + }); +} + async function getExportAvailableNotifier( expectedExportURI: string, manager: ExportsManager, @@ -318,7 +327,8 @@ describe("ExportsManager unit test", () => { await cursorCloseNotification; // Updates available export - const availableExports = manager.availableExports; + // this is async code so we should wait and retry + const availableExports = await waitUntilThereIsAnExportAvailable(manager); expect(availableExports).toHaveLength(1); expect(availableExports).toContainEqual( expect.objectContaining({ @@ -352,7 +362,7 @@ describe("ExportsManager unit test", () => { const expectedExportName = exportName.endsWith(".json") ? exportName : `${exportName}.json`; // Updates available export - const availableExports = manager.availableExports; + const availableExports = await waitUntilThereIsAnExportAvailable(manager); expect(availableExports).toHaveLength(1); expect(availableExports).toContainEqual( expect.objectContaining({ @@ -387,7 +397,7 @@ describe("ExportsManager unit test", () => { const expectedExportName = exportName.endsWith(".json") ? exportName : `${exportName}.json`; // Updates available export - const availableExports = manager.availableExports; + const availableExports = await waitUntilThereIsAnExportAvailable(manager); expect(availableExports).toHaveLength(1); expect(availableExports).toContainEqual( expect.objectContaining({ From 6bfaad4fbbd3cb12558b042e7db7c1c421c17e4e Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Thu, 4 Sep 2025 14:40:13 +0200 Subject: [PATCH 16/49] fix: typings for mongodb-connection-string-url (#515) --- src/common/connectionManager.ts | 2 +- src/helpers/connectionOptions.ts | 2 +- src/types/mongodb-connection-string-url.d.ts | 69 -------------------- tsconfig.build.json | 7 +- 4 files changed, 8 insertions(+), 72 deletions(-) delete mode 100644 src/types/mongodb-connection-string-url.d.ts diff --git a/src/common/connectionManager.ts b/src/common/connectionManager.ts index 15ad8e2d9..ac7a9b5a1 100644 --- a/src/common/connectionManager.ts +++ b/src/common/connectionManager.ts @@ -1,6 +1,6 @@ import { EventEmitter } from "events"; import type { MongoClientOptions } from "mongodb"; -import ConnectionString from "mongodb-connection-string-url"; +import { ConnectionString } from "mongodb-connection-string-url"; import { NodeDriverServiceProvider } from "@mongosh/service-provider-node-driver"; import { type ConnectionInfo, generateConnectionInfoFromCliArgs } from "@mongosh/arg-parser"; import type { DeviceId } from "../helpers/deviceId.js"; diff --git a/src/helpers/connectionOptions.ts b/src/helpers/connectionOptions.ts index f0e86fe2e..4a63531d8 100644 --- a/src/helpers/connectionOptions.ts +++ b/src/helpers/connectionOptions.ts @@ -1,5 +1,5 @@ import type { MongoClientOptions } from "mongodb"; -import ConnectionString from "mongodb-connection-string-url"; +import { ConnectionString } from "mongodb-connection-string-url"; export interface AppNameComponents { appName: string; diff --git a/src/types/mongodb-connection-string-url.d.ts b/src/types/mongodb-connection-string-url.d.ts deleted file mode 100644 index 01a0cff2d..000000000 --- a/src/types/mongodb-connection-string-url.d.ts +++ /dev/null @@ -1,69 +0,0 @@ -declare module "mongodb-connection-string-url" { - import { URL } from "whatwg-url"; - import { redactConnectionString, ConnectionStringRedactionOptions } from "./redact"; - export { redactConnectionString, ConnectionStringRedactionOptions }; - declare class CaseInsensitiveMap extends Map { - delete(name: K): boolean; - get(name: K): string | undefined; - has(name: K): boolean; - set(name: K, value: any): this; - _normalizeKey(name: any): K; - } - declare abstract class URLWithoutHost extends URL { - abstract get host(): never; - abstract set host(value: never); - abstract get hostname(): never; - abstract set hostname(value: never); - abstract get port(): never; - abstract set port(value: never); - abstract get href(): string; - abstract set href(value: string); - } - export interface ConnectionStringParsingOptions { - looseValidation?: boolean; - } - export declare class ConnectionString extends URLWithoutHost { - _hosts: string[]; - constructor(uri: string, options?: ConnectionStringParsingOptions); - get host(): never; - set host(_ignored: never); - get hostname(): never; - set hostname(_ignored: never); - get port(): never; - set port(_ignored: never); - get href(): string; - set href(_ignored: string); - get isSRV(): boolean; - get hosts(): string[]; - set hosts(list: string[]); - toString(): string; - clone(): ConnectionString; - redact(options?: ConnectionStringRedactionOptions): ConnectionString; - typedSearchParams(): { - append(name: keyof T & string, value: any): void; - delete(name: keyof T & string): void; - get(name: keyof T & string): string | null; - getAll(name: keyof T & string): string[]; - has(name: keyof T & string): boolean; - set(name: keyof T & string, value: any): void; - keys(): IterableIterator; - values(): IterableIterator; - entries(): IterableIterator<[keyof T & string, string]>; - _normalizeKey(name: keyof T & string): string; - [Symbol.iterator](): IterableIterator<[keyof T & string, string]>; - sort(): void; - forEach( - callback: (this: THIS_ARG, value: string, name: string, searchParams: any) => void, - thisArg?: THIS_ARG | undefined - ): void; - readonly [Symbol.toStringTag]: "URLSearchParams"; - }; - } - export declare class CommaAndColonSeparatedRecord< - K extends {} = Record, - > extends CaseInsensitiveMap { - constructor(from?: string | null); - toString(): string; - } - export default ConnectionString; -} diff --git a/tsconfig.build.json b/tsconfig.build.json index b21c6771e..aa40521ba 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -17,7 +17,12 @@ "typeRoots": ["./node_modules/@types", "./src/types"], "noImplicitReturns": true, "declaration": true, - "declarationMap": true + "declarationMap": true, + "paths": { + "mongodb-connection-string-url": [ + "./node_modules/mongodb-connection-string-url/lib/index.d.ts" + ] + } }, "include": ["src/**/*.ts"] } From 1f68c3e5d5d5ca2ebd5a890aaa31a8492f8a7fad Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Fri, 5 Sep 2025 00:15:12 +0300 Subject: [PATCH 17/49] chore: expose a hook to specify telemetry hosting mode MCP-166 (#501) --- src/telemetry/telemetry.ts | 13 +- src/telemetry/types.ts | 61 ++++ src/transports/base.ts | 9 +- .../transports/streamableHttp.test.ts | 24 +- tests/unit/telemetry.test.ts | 271 ++++++++++-------- 5 files changed, 247 insertions(+), 131 deletions(-) diff --git a/src/telemetry/telemetry.ts b/src/telemetry/telemetry.ts index c820ec614..339ba419a 100644 --- a/src/telemetry/telemetry.ts +++ b/src/telemetry/telemetry.ts @@ -35,14 +35,21 @@ export class Telemetry { userConfig: UserConfig, deviceId: DeviceId, { - commonProperties = { ...MACHINE_METADATA }, + commonProperties = {}, eventCache = EventCache.getInstance(), }: { + commonProperties?: Partial; eventCache?: EventCache; - commonProperties?: CommonProperties; } = {} ): Telemetry { - const instance = new Telemetry(session, userConfig, commonProperties, { eventCache, deviceId }); + const mergedProperties = { + ...MACHINE_METADATA, + ...commonProperties, + }; + const instance = new Telemetry(session, userConfig, mergedProperties, { + eventCache, + deviceId, + }); void instance.setup(); return instance; diff --git a/src/telemetry/types.ts b/src/telemetry/types.ts index f919ab88f..f0392344e 100644 --- a/src/telemetry/types.ts +++ b/src/telemetry/types.ts @@ -53,11 +53,34 @@ export type ServerEvent = TelemetryEvent; * Interface for static properties, they can be fetched once and reused. */ export type CommonStaticProperties = { + /** + * The version of the MCP server (as read from package.json). + */ mcp_server_version: string; + + /** + * The name of the MCP server (as read from package.json). + */ mcp_server_name: string; + + /** + * The platform/OS the MCP server is running on. + */ platform: string; + + /** + * The architecture of the OS the server is running on. + */ arch: string; + + /** + * Same as platform. + */ os_type: string; + + /** + * The version of the OS the server is running on. + */ os_version?: string; }; @@ -65,12 +88,50 @@ export type CommonStaticProperties = { * Common properties for all events that might change. */ export type CommonProperties = { + /** + * The device id - will be populated with the machine id when it resolves. + */ device_id?: string; + + /** + * A boolean indicating whether the server is running in a container environment. + */ is_container_env?: boolean; + + /** + * The version of the MCP client as reported by the client on session establishment. + */ mcp_client_version?: string; + + /** + * The name of the MCP client as reported by the client on session establishment. + */ mcp_client_name?: string; + + /** + * The transport protocol used by the MCP server. + */ transport?: "stdio" | "http"; + + /** + * A boolean indicating whether Atlas credentials are configured. + */ config_atlas_auth?: TelemetryBoolSet; + + /** + * A boolean indicating whether a connection string is configured. + */ config_connection_string?: TelemetryBoolSet; + + /** + * The randomly generated session id. + */ session_id?: string; + + /** + * The way the MCP server is hosted - e.g. standalone for a server running independently or + * "vscode" if embedded in the VSCode extension. This field should be populated by the hosting + * application to differentiate events coming from an MCP server it's hosting. + */ + hosting_mode?: string; } & CommonStaticProperties; diff --git a/src/transports/base.ts b/src/transports/base.ts index 5132b16c9..7de433ae2 100644 --- a/src/transports/base.ts +++ b/src/transports/base.ts @@ -14,12 +14,14 @@ import { type ConnectionErrorHandler, connectionErrorHandler as defaultConnectionErrorHandler, } from "../common/connectionErrorHandler.js"; +import type { CommonProperties } from "../telemetry/types.js"; export type TransportRunnerConfig = { userConfig: UserConfig; createConnectionManager?: ConnectionManagerFactoryFn; connectionErrorHandler?: ConnectionErrorHandler; additionalLoggers?: LoggerBase[]; + telemetryProperties?: Partial; }; export abstract class TransportRunnerBase { @@ -28,16 +30,19 @@ export abstract class TransportRunnerBase { protected readonly userConfig: UserConfig; private readonly createConnectionManager: ConnectionManagerFactoryFn; private readonly connectionErrorHandler: ConnectionErrorHandler; + private readonly telemetryProperties: Partial; protected constructor({ userConfig, createConnectionManager = createMCPConnectionManager, connectionErrorHandler = defaultConnectionErrorHandler, additionalLoggers = [], + telemetryProperties = {}, }: TransportRunnerConfig) { this.userConfig = userConfig; this.createConnectionManager = createConnectionManager; this.connectionErrorHandler = connectionErrorHandler; + this.telemetryProperties = telemetryProperties; const loggers: LoggerBase[] = [...additionalLoggers]; if (this.userConfig.loggers.includes("stderr")) { loggers.push(new ConsoleLogger(Keychain.root)); @@ -85,7 +90,9 @@ export abstract class TransportRunnerBase { keychain: Keychain.root, }); - const telemetry = Telemetry.create(session, this.userConfig, this.deviceId); + const telemetry = Telemetry.create(session, this.userConfig, this.deviceId, { + commonProperties: this.telemetryProperties, + }); const result = new Server({ mcpServer, diff --git a/tests/integration/transports/streamableHttp.test.ts b/tests/integration/transports/streamableHttp.test.ts index b27f109b4..7f57135d8 100644 --- a/tests/integration/transports/streamableHttp.test.ts +++ b/tests/integration/transports/streamableHttp.test.ts @@ -1,7 +1,7 @@ import { StreamableHttpRunner } from "../../../src/transports/streamableHttp.js"; import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; -import { describe, expect, it, beforeAll, afterAll, beforeEach } from "vitest"; +import { describe, expect, it, beforeAll, afterAll, beforeEach, afterEach } from "vitest"; import { config } from "../../../src/common/config.js"; import type { LoggerType, LogLevel, LogPayload } from "../../../src/common/logger.js"; import { LoggerBase, LogId } from "../../../src/common/logger.js"; @@ -159,4 +159,26 @@ describe("StreamableHttpRunner", () => { expect(serverStartedMessage?.level).toBe("info"); }); }); + + describe("with telemetry properties", () => { + afterEach(async () => { + await runner.close(); + config.telemetry = oldTelemetry; + config.loggers = oldLoggers; + config.httpHeaders = {}; + }); + + it("merges them with the base properties", async () => { + config.telemetry = "enabled"; + runner = new StreamableHttpRunner({ + userConfig: config, + telemetryProperties: { hosting_mode: "vscode-extension" }, + }); + await runner.start(); + + const server = await runner["setupServer"](); + const properties = server["telemetry"].getCommonProperties(); + expect(properties.hosting_mode).toBe("vscode-extension"); + }); + }); }); diff --git a/tests/unit/telemetry.test.ts b/tests/unit/telemetry.test.ts index 8ce1de2d0..51341d56c 100644 --- a/tests/unit/telemetry.test.ts +++ b/tests/unit/telemetry.test.ts @@ -1,13 +1,14 @@ import { ApiClient } from "../../src/common/atlas/apiClient.js"; import type { Session } from "../../src/common/session.js"; import { Telemetry } from "../../src/telemetry/telemetry.js"; -import type { BaseEvent, TelemetryResult } from "../../src/telemetry/types.js"; +import type { BaseEvent, CommonProperties, TelemetryEvent, TelemetryResult } from "../../src/telemetry/types.js"; import { EventCache } from "../../src/telemetry/eventCache.js"; import { config } from "../../src/common/config.js"; import { afterEach, beforeEach, describe, it, vi, expect } from "vitest"; import { NullLogger } from "../../src/common/logger.js"; import type { MockedFunction } from "vitest"; import type { DeviceId } from "../../src/helpers/deviceId.js"; +import { expectDefined } from "../integration/helpers.js"; // Mock the ApiClient to avoid real API calls vi.mock("../../src/common/atlas/apiClient.js"); @@ -29,6 +30,7 @@ describe("Telemetry", () => { }; let session: Session; let telemetry: Telemetry; + let mockDeviceId: DeviceId; // Helper function to create properly typed test events function createTestEvent(options?: { @@ -115,7 +117,7 @@ describe("Telemetry", () => { mockEventCache.appendEvents = vi.fn().mockResolvedValue(undefined); MockEventCache.getInstance = vi.fn().mockReturnValue(mockEventCache as unknown as EventCache); - const mockDeviceId = { + mockDeviceId = { get: vi.fn().mockResolvedValue("test-device-id"), } as unknown as DeviceId; @@ -137,183 +139,200 @@ describe("Telemetry", () => { config.telemetry = "enabled"; }); - describe("sending events", () => { - describe("when telemetry is enabled", () => { - it("should send events successfully", async () => { - const testEvent = createTestEvent(); + describe("when telemetry is enabled", () => { + it("should send events successfully", async () => { + const testEvent = createTestEvent(); - await telemetry.setupPromise; + await telemetry.setupPromise; - await telemetry.emitEvents([testEvent]); + await telemetry.emitEvents([testEvent]); - verifyMockCalls({ - sendEventsCalls: 1, - clearEventsCalls: 1, - sendEventsCalledWith: [testEvent], - }); + verifyMockCalls({ + sendEventsCalls: 1, + clearEventsCalls: 1, + sendEventsCalledWith: [testEvent], }); + }); - it("should cache events when sending fails", async () => { - mockApiClient.sendEvents.mockRejectedValueOnce(new Error("API error")); + it("should cache events when sending fails", async () => { + mockApiClient.sendEvents.mockRejectedValueOnce(new Error("API error")); - const testEvent = createTestEvent(); + const testEvent = createTestEvent(); - await telemetry.setupPromise; + await telemetry.setupPromise; - await telemetry.emitEvents([testEvent]); + await telemetry.emitEvents([testEvent]); - verifyMockCalls({ - sendEventsCalls: 1, - appendEventsCalls: 1, - appendEventsCalledWith: [testEvent], - }); + verifyMockCalls({ + sendEventsCalls: 1, + appendEventsCalls: 1, + appendEventsCalledWith: [testEvent], }); + }); - it("should include cached events when sending", async () => { - const cachedEvent = createTestEvent({ - command: "cached-command", - component: "cached-component", - }); + it("should include cached events when sending", async () => { + const cachedEvent = createTestEvent({ + command: "cached-command", + component: "cached-component", + }); - const newEvent = createTestEvent({ - command: "new-command", - component: "new-component", - }); + const newEvent = createTestEvent({ + command: "new-command", + component: "new-component", + }); - // Set up mock to return cached events - mockEventCache.getEvents.mockReturnValueOnce([cachedEvent]); + // Set up mock to return cached events + mockEventCache.getEvents.mockReturnValueOnce([cachedEvent]); - await telemetry.setupPromise; + await telemetry.setupPromise; - await telemetry.emitEvents([newEvent]); + await telemetry.emitEvents([newEvent]); - verifyMockCalls({ - sendEventsCalls: 1, - clearEventsCalls: 1, - sendEventsCalledWith: [cachedEvent, newEvent], - }); + verifyMockCalls({ + sendEventsCalls: 1, + clearEventsCalls: 1, + sendEventsCalledWith: [cachedEvent, newEvent], }); + }); - it("should correctly add common properties to events", async () => { - await telemetry.setupPromise; + it("should correctly add common properties to events", async () => { + await telemetry.setupPromise; + + const commonProps = telemetry.getCommonProperties(); - const commonProps = telemetry.getCommonProperties(); + // Use explicit type assertion + const expectedProps: Record = { + mcp_client_version: "1.0.0", + mcp_client_name: "test-agent", + session_id: "test-session-id", + config_atlas_auth: "true", + config_connection_string: expect.any(String) as unknown as string, + device_id: "test-device-id", + }; - // Use explicit type assertion - const expectedProps: Record = { - mcp_client_version: "1.0.0", - mcp_client_name: "test-agent", - session_id: "test-session-id", - config_atlas_auth: "true", - config_connection_string: expect.any(String) as unknown as string, - device_id: "test-device-id", - }; + expect(commonProps).toMatchObject(expectedProps); + }); - expect(commonProps).toMatchObject(expectedProps); + it("should add hostingMode to events if set", async () => { + telemetry = Telemetry.create(session, config, mockDeviceId, { + eventCache: mockEventCache as unknown as EventCache, + commonProperties: { hosting_mode: "vscode-extension" }, }); + await telemetry.setupPromise; + + const commonProps = telemetry.getCommonProperties(); + expect(commonProps.hosting_mode).toBe("vscode-extension"); + + await telemetry.emitEvents([createTestEvent()]); + + const calls = mockApiClient.sendEvents.mock.calls; + expect(calls).toHaveLength(1); + const event = calls[0]?.[0][0]; + expectDefined(event); + expect((event as TelemetryEvent).properties.hosting_mode).toBe("vscode-extension"); + }); - describe("device ID resolution", () => { - beforeEach(() => { - vi.clearAllMocks(); - }); + describe("device ID resolution", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); - afterEach(() => { - vi.clearAllMocks(); - }); + afterEach(() => { + vi.clearAllMocks(); + }); - it("should successfully resolve the device ID", async () => { - const mockDeviceId = { - get: vi.fn().mockResolvedValue("test-device-id"), - } as unknown as DeviceId; + it("should successfully resolve the device ID", async () => { + const mockDeviceId = { + get: vi.fn().mockResolvedValue("test-device-id"), + } as unknown as DeviceId; - telemetry = Telemetry.create(session, config, mockDeviceId); + telemetry = Telemetry.create(session, config, mockDeviceId); - expect(telemetry["isBufferingEvents"]).toBe(true); - expect(telemetry.getCommonProperties().device_id).toBe(undefined); + expect(telemetry["isBufferingEvents"]).toBe(true); + expect(telemetry.getCommonProperties().device_id).toBe(undefined); - await telemetry.setupPromise; + await telemetry.setupPromise; - expect(telemetry["isBufferingEvents"]).toBe(false); - expect(telemetry.getCommonProperties().device_id).toBe("test-device-id"); - }); + expect(telemetry["isBufferingEvents"]).toBe(false); + expect(telemetry.getCommonProperties().device_id).toBe("test-device-id"); + }); - it("should handle device ID resolution failure gracefully", async () => { - const mockDeviceId = { - get: vi.fn().mockResolvedValue("unknown"), - } as unknown as DeviceId; + it("should handle device ID resolution failure gracefully", async () => { + const mockDeviceId = { + get: vi.fn().mockResolvedValue("unknown"), + } as unknown as DeviceId; - telemetry = Telemetry.create(session, config, mockDeviceId); + telemetry = Telemetry.create(session, config, mockDeviceId); - expect(telemetry["isBufferingEvents"]).toBe(true); - expect(telemetry.getCommonProperties().device_id).toBe(undefined); + expect(telemetry["isBufferingEvents"]).toBe(true); + expect(telemetry.getCommonProperties().device_id).toBe(undefined); - await telemetry.setupPromise; + await telemetry.setupPromise; - expect(telemetry["isBufferingEvents"]).toBe(false); - // Should use "unknown" as fallback when device ID resolution fails - expect(telemetry.getCommonProperties().device_id).toBe("unknown"); - }); + expect(telemetry["isBufferingEvents"]).toBe(false); + // Should use "unknown" as fallback when device ID resolution fails + expect(telemetry.getCommonProperties().device_id).toBe("unknown"); + }); - it("should handle device ID timeout gracefully", async () => { - const mockDeviceId = { - get: vi.fn().mockResolvedValue("unknown"), - } as unknown as DeviceId; + it("should handle device ID timeout gracefully", async () => { + const mockDeviceId = { + get: vi.fn().mockResolvedValue("unknown"), + } as unknown as DeviceId; - telemetry = Telemetry.create(session, config, mockDeviceId); + telemetry = Telemetry.create(session, config, mockDeviceId); - expect(telemetry["isBufferingEvents"]).toBe(true); - expect(telemetry.getCommonProperties().device_id).toBe(undefined); + expect(telemetry["isBufferingEvents"]).toBe(true); + expect(telemetry.getCommonProperties().device_id).toBe(undefined); - await telemetry.setupPromise; + await telemetry.setupPromise; - expect(telemetry["isBufferingEvents"]).toBe(false); - // Should use "unknown" as fallback when device ID times out - expect(telemetry.getCommonProperties().device_id).toBe("unknown"); - }); + expect(telemetry["isBufferingEvents"]).toBe(false); + // Should use "unknown" as fallback when device ID times out + expect(telemetry.getCommonProperties().device_id).toBe("unknown"); }); }); + }); - describe("when telemetry is disabled", () => { - beforeEach(() => { - config.telemetry = "disabled"; - }); + describe("when telemetry is disabled", () => { + beforeEach(() => { + config.telemetry = "disabled"; + }); - afterEach(() => { - config.telemetry = "enabled"; - }); + afterEach(() => { + config.telemetry = "enabled"; + }); - it("should not send events", async () => { - const testEvent = createTestEvent(); + it("should not send events", async () => { + const testEvent = createTestEvent(); - await telemetry.emitEvents([testEvent]); + await telemetry.emitEvents([testEvent]); - verifyMockCalls(); - }); + verifyMockCalls(); }); + }); - describe("when DO_NOT_TRACK environment variable is set", () => { - let originalEnv: string | undefined; + describe("when DO_NOT_TRACK environment variable is set", () => { + let originalEnv: string | undefined; - beforeEach(() => { - originalEnv = process.env.DO_NOT_TRACK; - process.env.DO_NOT_TRACK = "1"; - }); + beforeEach(() => { + originalEnv = process.env.DO_NOT_TRACK; + process.env.DO_NOT_TRACK = "1"; + }); - afterEach(() => { - if (originalEnv) { - process.env.DO_NOT_TRACK = originalEnv; - } else { - delete process.env.DO_NOT_TRACK; - } - }); + afterEach(() => { + if (originalEnv) { + process.env.DO_NOT_TRACK = originalEnv; + } else { + delete process.env.DO_NOT_TRACK; + } + }); - it("should not send events", async () => { - const testEvent = createTestEvent(); + it("should not send events", async () => { + const testEvent = createTestEvent(); - await telemetry.emitEvents([testEvent]); + await telemetry.emitEvents([testEvent]); - verifyMockCalls(); - }); + verifyMockCalls(); }); }); }); From 0912f39883a20078cbb9435286bb1005e0a98497 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Fri, 5 Sep 2025 10:12:46 +0200 Subject: [PATCH 18/49] feat(cli): notify when a flag is wrong and suggest a fix MCP-121 (#517) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- package-lock.json | 19 +++++--- package.json | 1 + src/common/config.ts | 84 ++++++++++++++++++++++++++++---- tests/unit/common/config.test.ts | 75 ++++++++++++++++++++++++++-- tsconfig.build.json | 3 +- 5 files changed, 163 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1385e8ca6..290e9600b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "node-machine-id": "1.1.12", "oauth4webapi": "^3.8.0", "openapi-fetch": "^0.14.0", + "ts-levenshtein": "^1.0.7", "yargs-parser": "^22.0.0", "zod": "^3.25.76" }, @@ -8407,12 +8408,6 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "license": "MIT" - }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -11412,6 +11407,12 @@ "node": ">= 0.8.0" } }, + "node_modules/optionator/node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, "node_modules/os-dns-native": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/os-dns-native/-/os-dns-native-1.2.1.tgz", @@ -14343,6 +14344,12 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-levenshtein/-/ts-levenshtein-1.0.7.tgz", + "integrity": "sha512-wautEf7gl2ITJuRTTYxnlrLjzUUcwFSdg46bcu4RlzoE/zQM++TJjBFRf2Xhil49GiHqKCqmpjf1lBkWnAHj0A==", + "license": "MIT" + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", diff --git a/package.json b/package.json index cc7e68cc9..7a9fc15f9 100644 --- a/package.json +++ b/package.json @@ -114,6 +114,7 @@ "node-machine-id": "1.1.12", "oauth4webapi": "^3.8.0", "openapi-fetch": "^0.14.0", + "ts-levenshtein": "^1.0.7", "yargs-parser": "^22.0.0", "zod": "^3.25.76" }, diff --git a/src/common/config.ts b/src/common/config.ts index 9fa78ec0b..9132a6c6f 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -5,6 +5,7 @@ import type { CliOptions, ConnectionInfo } from "@mongosh/arg-parser"; import { generateConnectionInfoFromCliArgs } from "@mongosh/arg-parser"; import { Keychain } from "./keychain.js"; import type { Secret } from "./keychain.js"; +import levenshtein from "ts-levenshtein"; // From: https://github.com/mongodb-js/mongosh/blob/main/packages/cli-repl/src/arg-parser.ts const OPTIONS = { @@ -91,6 +92,44 @@ const OPTIONS = { }, } as const; +const ALL_CONFIG_KEYS = new Set( + (OPTIONS.string as readonly string[]) + .concat(OPTIONS.array) + .concat(OPTIONS.boolean) + .concat(Object.keys(OPTIONS.alias)) +); + +export function validateConfigKey(key: string): { valid: boolean; suggestion?: string } { + if (ALL_CONFIG_KEYS.has(key)) { + return { valid: true }; + } + + let minLev = Number.MAX_VALUE; + let suggestion = ""; + + // find the closest match for a suggestion + for (const validKey of ALL_CONFIG_KEYS) { + // check if there is an exact case-insensitive match + if (validKey.toLowerCase() === key.toLowerCase()) { + return { valid: false, suggestion: validKey }; + } + + // else, infer something using levenshtein so we suggest a valid key + const lev = levenshtein.get(key, validKey); + if (lev < minLev) { + minLev = lev; + suggestion = validKey; + } + } + + if (minLev <= 2) { + // accept up to 2 typos + return { valid: false, suggestion }; + } + + return { valid: false }; +} + function isConnectionSpecifier(arg: string | undefined): boolean { return ( arg !== undefined && @@ -267,7 +306,13 @@ function parseCliConfig(args: string[]): CliOptions { // so we don't have a logger. For stdio, the warning will be received as a string in // the client and IDEs like VSCode do show the message in the log window. For HTTP, // it will be in the stdout of the process. - warnAboutDeprecatedCliArgs({ ...parsed, _: positionalArguments }, console.warn); + warnAboutDeprecatedOrUnknownCliArgs( + { ...parsed, _: positionalArguments }, + { + warn: (msg) => console.warn(msg), + exit: (status) => process.exit(status), + } + ); // if we have a positional argument that matches a connection string // store it as the connection specifier and remove it from the argument @@ -280,26 +325,47 @@ function parseCliConfig(args: string[]): CliOptions { return parsed; } -export function warnAboutDeprecatedCliArgs( - args: CliOptions & - UserConfig & { - _?: string[]; - }, - warn: (msg: string) => void +export function warnAboutDeprecatedOrUnknownCliArgs( + args: Record, + { warn, exit }: { warn: (msg: string) => void; exit: (status: number) => void | never } ): void { let usedDeprecatedArgument = false; + let usedInvalidArgument = false; + + const knownArgs = args as unknown as UserConfig & CliOptions; // the first position argument should be used // instead of --connectionString, as it's how the mongosh works. - if (args.connectionString) { + if (knownArgs.connectionString) { usedDeprecatedArgument = true; warn( "The --connectionString argument is deprecated. Prefer using the first positional argument for the connection string or the MDB_MCP_CONNECTION_STRING environment variable." ); } - if (usedDeprecatedArgument) { + for (const providedKey of Object.keys(args)) { + if (providedKey === "_") { + // positional argument + continue; + } + + const { valid, suggestion } = validateConfigKey(providedKey); + if (!valid) { + usedInvalidArgument = true; + if (suggestion) { + warn(`Invalid command line argument '${providedKey}'. Did you mean '${suggestion}'?`); + } else { + warn(`Invalid command line argument '${providedKey}'.`); + } + } + } + + if (usedInvalidArgument || usedDeprecatedArgument) { warn("Refer to https://www.mongodb.com/docs/mcp-server/get-started/ for setting up the MCP Server."); } + + if (usedInvalidArgument) { + exit(1); + } } function commaSeparatedToArray(str: string | string[] | undefined): T { diff --git a/tests/unit/common/config.test.ts b/tests/unit/common/config.test.ts index f325461d7..a497cb331 100644 --- a/tests/unit/common/config.test.ts +++ b/tests/unit/common/config.test.ts @@ -3,8 +3,8 @@ import type { UserConfig } from "../../../src/common/config.js"; import { setupUserConfig, defaultUserConfig, - warnAboutDeprecatedCliArgs, registerKnownSecretsInRootKeychain, + warnAboutDeprecatedOrUnknownCliArgs, } from "../../../src/common/config.js"; import type { CliOptions } from "@mongosh/arg-parser"; import { Keychain } from "../../../src/common/keychain.js"; @@ -638,7 +638,7 @@ describe("config", () => { }); }); -describe("Deprecated CLI arguments", () => { +describe("CLI arguments", () => { const referDocMessage = "Refer to https://www.mongodb.com/docs/mcp-server/get-started/ for setting up the MCP Server."; @@ -655,12 +655,14 @@ describe("Deprecated CLI arguments", () => { describe(`deprecation behaviour of ${cliArg}`, () => { let cliArgs: CliOptions & UserConfig & { _?: string[] }; let warn: (msg: string) => void; + let exit: (status: number) => void | never; beforeEach(() => { cliArgs = { [cliArg]: "RandomString" } as unknown as CliOptions & UserConfig & { _?: string[] }; warn = vi.fn(); + exit = vi.fn(); - warnAboutDeprecatedCliArgs(cliArgs, warn); + warnAboutDeprecatedOrUnknownCliArgs(cliArgs as unknown as Record, { warn, exit }); }); it(`warns the usage of ${cliArg} as it is deprecated`, () => { @@ -670,9 +672,76 @@ describe("Deprecated CLI arguments", () => { it(`shows the reference message when ${cliArg} was passed`, () => { expect(warn).toHaveBeenCalledWith(referDocMessage); }); + + it(`should not exit the process`, () => { + expect(exit).not.toHaveBeenCalled(); + }); }); } + describe("invalid arguments", () => { + let warn: (msg: string) => void; + let exit: (status: number) => void | never; + + beforeEach(() => { + warn = vi.fn(); + exit = vi.fn(); + }); + + it("should show a warning when an argument is not known", () => { + warnAboutDeprecatedOrUnknownCliArgs( + { + wakanda: "", + }, + { warn, exit } + ); + + expect(warn).toHaveBeenCalledWith("Invalid command line argument 'wakanda'."); + expect(warn).toHaveBeenCalledWith( + "Refer to https://www.mongodb.com/docs/mcp-server/get-started/ for setting up the MCP Server." + ); + }); + + it("should exit the process on unknown cli args", () => { + warnAboutDeprecatedOrUnknownCliArgs( + { + wakanda: "", + }, + { warn, exit } + ); + + expect(exit).toHaveBeenCalledWith(1); + }); + + it("should show a suggestion when is a simple typo", () => { + warnAboutDeprecatedOrUnknownCliArgs( + { + readonli: "", + }, + { warn, exit } + ); + + expect(warn).toHaveBeenCalledWith("Invalid command line argument 'readonli'. Did you mean 'readOnly'?"); + expect(warn).toHaveBeenCalledWith( + "Refer to https://www.mongodb.com/docs/mcp-server/get-started/ for setting up the MCP Server." + ); + }); + + it("should show a suggestion when the only change is on the case", () => { + warnAboutDeprecatedOrUnknownCliArgs( + { + readonly: "", + }, + { warn, exit } + ); + + expect(warn).toHaveBeenCalledWith("Invalid command line argument 'readonly'. Did you mean 'readOnly'?"); + expect(warn).toHaveBeenCalledWith( + "Refer to https://www.mongodb.com/docs/mcp-server/get-started/ for setting up the MCP Server." + ); + }); + }); + describe("keychain management", () => { type TestCase = { readonly cliArg: keyof UserConfig; secretKind: Secret["kind"] }; const testCases = [ diff --git a/tsconfig.build.json b/tsconfig.build.json index aa40521ba..06089861b 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -21,7 +21,8 @@ "paths": { "mongodb-connection-string-url": [ "./node_modules/mongodb-connection-string-url/lib/index.d.ts" - ] + ], + "ts-levenshtein": ["./node_modules/ts-levenshtein/dist/index.d.mts"] } }, "include": ["src/**/*.ts"] From 14176badbfdfb3c9fdef4aeaae3c0e0f413833c3 Mon Sep 17 00:00:00 2001 From: Kevin Mas Ruiz Date: Fri, 5 Sep 2025 15:41:28 +0200 Subject: [PATCH 19/49] fix(readOnly): Do not allow $out and $merge in readOnly mode (#525) --- src/common/errors.ts | 1 + src/tools/mongodb/read/aggregate.ts | 18 ++++++++++ .../tools/mongodb/read/aggregate.test.ts | 34 +++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/src/common/errors.ts b/src/common/errors.ts index 084d45ca7..1ef987de4 100644 --- a/src/common/errors.ts +++ b/src/common/errors.ts @@ -2,6 +2,7 @@ export enum ErrorCodes { NotConnectedToMongoDB = 1_000_000, MisconfiguredConnectionString = 1_000_001, ForbiddenCollscan = 1_000_002, + ForbiddenWriteOperation = 1_000_003, } export class MongoDBError extends Error { diff --git a/src/tools/mongodb/read/aggregate.ts b/src/tools/mongodb/read/aggregate.ts index 8492a61ce..c61603459 100644 --- a/src/tools/mongodb/read/aggregate.ts +++ b/src/tools/mongodb/read/aggregate.ts @@ -5,6 +5,7 @@ import type { ToolArgs, OperationType } from "../../tool.js"; import { formatUntrustedData } from "../../tool.js"; import { checkIndexUsage } from "../../../helpers/indexCheck.js"; import { EJSON } from "bson"; +import { ErrorCodes, MongoDBError } from "../../../common/errors.js"; export const AggregateArgs = { pipeline: z.array(z.object({}).passthrough()).describe("An array of aggregation stages to execute"), @@ -26,6 +27,8 @@ export class AggregateTool extends MongoDBToolBase { }: ToolArgs): Promise { const provider = await this.ensureConnected(); + this.assertOnlyUsesPermittedStages(pipeline); + // Check if aggregate operation uses an index if enabled if (this.config.indexCheck) { await checkIndexUsage(provider, database, collection, "aggregate", async () => { @@ -44,4 +47,19 @@ export class AggregateTool extends MongoDBToolBase { ), }; } + + private assertOnlyUsesPermittedStages(pipeline: Record[]): void { + if (!this.config.readOnly) { + return; + } + + for (const stage of pipeline) { + if (stage.$out || stage.$merge) { + throw new MongoDBError( + ErrorCodes.ForbiddenWriteOperation, + "In readOnly mode you can not run pipelines with $out or $merge stages." + ); + } + } + } } diff --git a/tests/integration/tools/mongodb/read/aggregate.test.ts b/tests/integration/tools/mongodb/read/aggregate.test.ts index fbe72ae80..643c5ef37 100644 --- a/tests/integration/tools/mongodb/read/aggregate.test.ts +++ b/tests/integration/tools/mongodb/read/aggregate.test.ts @@ -95,6 +95,40 @@ describeWithMongoDB("aggregate tool", (integration) => { ); }); + it("can not run $out stages in readOnly mode", async () => { + await integration.connectMcpClient(); + integration.mcpServer().userConfig.readOnly = true; + const response = await integration.mcpClient().callTool({ + name: "aggregate", + arguments: { + database: integration.randomDbName(), + collection: "people", + pipeline: [{ $out: "outpeople" }], + }, + }); + const content = getResponseContent(response); + expect(content).toEqual( + "Error running aggregate: In readOnly mode you can not run pipelines with $out or $merge stages." + ); + }); + + it("can not run $merge stages in readOnly mode", async () => { + await integration.connectMcpClient(); + integration.mcpServer().userConfig.readOnly = true; + const response = await integration.mcpClient().callTool({ + name: "aggregate", + arguments: { + database: integration.randomDbName(), + collection: "people", + pipeline: [{ $merge: "outpeople" }], + }, + }); + const content = getResponseContent(response); + expect(content).toEqual( + "Error running aggregate: In readOnly mode you can not run pipelines with $out or $merge stages." + ); + }); + validateAutoConnectBehavior(integration, "aggregate", () => { return { args: { From da2cac88e3ff96dbcf2d9512c323ec75e4ab5823 Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Fri, 5 Sep 2025 18:45:05 +0300 Subject: [PATCH 20/49] fix: don't wait for telemetry events MCP-179 (#521) Co-authored-by: Bianca Lisle --- src/common/connectionManager.ts | 2 +- src/common/logger.ts | 1 + src/server.ts | 2 +- src/telemetry/eventCache.ts | 22 ++++-- src/telemetry/telemetry.ts | 122 ++++++++++++++++++++----------- src/tools/tool.ts | 17 +++-- src/transports/streamableHttp.ts | 6 +- tests/unit/telemetry.test.ts | 42 +++++++---- 8 files changed, 140 insertions(+), 74 deletions(-) diff --git a/src/common/connectionManager.ts b/src/common/connectionManager.ts index ac7a9b5a1..ba7f4cb47 100644 --- a/src/common/connectionManager.ts +++ b/src/common/connectionManager.ts @@ -82,7 +82,7 @@ export type TestConnectionManager = ConnectionManager & { export abstract class ConnectionManager { protected clientName: string; - protected readonly _events; + protected readonly _events: EventEmitter; readonly events: Pick, "on" | "off" | "once">; private state: AnyConnectionState; diff --git a/src/common/logger.ts b/src/common/logger.ts index bba350710..5414fc934 100644 --- a/src/common/logger.ts +++ b/src/common/logger.ts @@ -35,6 +35,7 @@ export const LogId = { telemetryMetadataError: mongoLogId(1_002_005), deviceIdResolutionError: mongoLogId(1_002_006), deviceIdTimeout: mongoLogId(1_002_007), + telemetryClose: mongoLogId(1_002_008), toolExecute: mongoLogId(1_003_001), toolExecuteFailure: mongoLogId(1_003_002), diff --git a/src/server.ts b/src/server.ts index 914a823b9..d3cc9dbd6 100644 --- a/src/server.ts +++ b/src/server.ts @@ -193,7 +193,7 @@ export class Server { } } - this.telemetry.emitEvents([event]).catch(() => {}); + this.telemetry.emitEvents([event]); } private registerTools(): void { diff --git a/src/telemetry/eventCache.ts b/src/telemetry/eventCache.ts index c75547661..c6411bf54 100644 --- a/src/telemetry/eventCache.ts +++ b/src/telemetry/eventCache.ts @@ -34,11 +34,18 @@ export class EventCache { } /** - * Gets a copy of the currently cached events + * Gets the number of currently cached events + */ + public get size(): number { + return this.cache.size; + } + + /** + * Gets a copy of the currently cached events along with their ids * @returns Array of cached BaseEvent objects */ - public getEvents(): BaseEvent[] { - return Array.from(this.cache.values()); + public getEvents(): { id: number; event: BaseEvent }[] { + return Array.from(this.cache.entries()).map(([id, event]) => ({ id, event })); } /** @@ -53,10 +60,11 @@ export class EventCache { } /** - * Clears all cached events + * Removes cached events by their ids */ - public clearEvents(): void { - this.cache.clear(); - this.nextId = 0; + public removeEvents(ids: number[]): void { + for (const id of ids) { + this.cache.delete(id); + } } } diff --git a/src/telemetry/telemetry.ts b/src/telemetry/telemetry.ts index 339ba419a..bdba51a51 100644 --- a/src/telemetry/telemetry.ts +++ b/src/telemetry/telemetry.ts @@ -7,16 +7,25 @@ import { MACHINE_METADATA } from "./constants.js"; import { EventCache } from "./eventCache.js"; import { detectContainerEnv } from "../helpers/container.js"; import type { DeviceId } from "../helpers/deviceId.js"; +import { EventEmitter } from "events"; type EventResult = { success: boolean; error?: Error; }; +export interface TelemetryEvents { + "events-emitted": []; + "events-send-failed": []; + "events-skipped": []; +} + export class Telemetry { private isBufferingEvents: boolean = true; /** Resolves when the setup is complete or a timeout occurs */ public setupPromise: Promise<[string, boolean]> | undefined; + public readonly events: EventEmitter = new EventEmitter(); + private eventCache: EventCache; private deviceId: DeviceId; @@ -57,6 +66,12 @@ export class Telemetry { private async setup(): Promise { if (!this.isTelemetryEnabled()) { + this.session.logger.info({ + id: LogId.telemetryEmitFailure, + context: "telemetry", + message: "Telemetry is disabled.", + noRedaction: true, + }); return; } @@ -71,34 +86,47 @@ export class Telemetry { public async close(): Promise { this.isBufferingEvents = false; - await this.emitEvents(this.eventCache.getEvents()); + + this.session.logger.debug({ + id: LogId.telemetryClose, + message: `Closing telemetry and flushing ${this.eventCache.size} events`, + context: "telemetry", + }); + + // Wait up to 5 seconds for events to be sent before closing, but don't throw if it times out + const flushMaxWaitTime = 5000; + let flushTimeout: NodeJS.Timeout | undefined; + await Promise.race([ + new Promise((resolve) => { + flushTimeout = setTimeout(() => { + this.session.logger.debug({ + id: LogId.telemetryClose, + message: `Failed to flush remaining events within ${flushMaxWaitTime}ms timeout`, + context: "telemetry", + }); + resolve(); + }, flushMaxWaitTime); + flushTimeout.unref(); + }), + this.emit([]), + ]); + + clearTimeout(flushTimeout); } /** * Emits events through the telemetry pipeline * @param events - The events to emit */ - public async emitEvents(events: BaseEvent[]): Promise { - try { - if (!this.isTelemetryEnabled()) { - this.session.logger.info({ - id: LogId.telemetryEmitFailure, - context: "telemetry", - message: "Telemetry is disabled.", - noRedaction: true, - }); - return; - } - - await this.emit(events); - } catch { - this.session.logger.debug({ - id: LogId.telemetryEmitFailure, - context: "telemetry", - message: "Error emitting telemetry events.", - noRedaction: true, - }); + public emitEvents(events: BaseEvent[]): void { + if (!this.isTelemetryEnabled()) { + this.events.emit("events-skipped"); + return; } + + // Don't wait for events to be sent - we should not block regular server + // operations on telemetry + void this.emit(events); } /** @@ -144,32 +172,44 @@ export class Telemetry { return; } - const cachedEvents = this.eventCache.getEvents(); - const allEvents = [...cachedEvents, ...events]; + try { + const cachedEvents = this.eventCache.getEvents(); + const allEvents = [...cachedEvents.map((e) => e.event), ...events]; - this.session.logger.debug({ - id: LogId.telemetryEmitStart, - context: "telemetry", - message: `Attempting to send ${allEvents.length} events (${cachedEvents.length} cached)`, - }); + this.session.logger.debug({ + id: LogId.telemetryEmitStart, + context: "telemetry", + message: `Attempting to send ${allEvents.length} events (${cachedEvents.length} cached)`, + }); + + const result = await this.sendEvents(this.session.apiClient, allEvents); + if (result.success) { + this.eventCache.removeEvents(cachedEvents.map((e) => e.id)); + this.session.logger.debug({ + id: LogId.telemetryEmitSuccess, + context: "telemetry", + message: `Sent ${allEvents.length} events successfully: ${JSON.stringify(allEvents)}`, + }); + this.events.emit("events-emitted"); + return; + } - const result = await this.sendEvents(this.session.apiClient, allEvents); - if (result.success) { - this.eventCache.clearEvents(); this.session.logger.debug({ - id: LogId.telemetryEmitSuccess, + id: LogId.telemetryEmitFailure, context: "telemetry", - message: `Sent ${allEvents.length} events successfully: ${JSON.stringify(allEvents, null, 2)}`, + message: `Error sending event to client: ${result.error instanceof Error ? result.error.message : String(result.error)}`, }); - return; + this.eventCache.appendEvents(events); + this.events.emit("events-send-failed"); + } catch (error) { + this.session.logger.debug({ + id: LogId.telemetryEmitFailure, + context: "telemetry", + message: `Error emitting telemetry events: ${error instanceof Error ? error.message : String(error)}`, + noRedaction: true, + }); + this.events.emit("events-send-failed"); } - - this.session.logger.debug({ - id: LogId.telemetryEmitFailure, - context: "telemetry", - message: `Error sending event to client: ${result.error instanceof Error ? result.error.message : String(result.error)}`, - }); - this.eventCache.appendEvents(events); } /** diff --git a/src/tools/tool.ts b/src/tools/tool.ts index 9a13eada0..0115feb05 100644 --- a/src/tools/tool.ts +++ b/src/tools/tool.ts @@ -82,7 +82,14 @@ export abstract class ToolBase { }); const result = await this.execute(...args); - await this.emitToolEvent(startTime, result, ...args).catch(() => {}); + this.emitToolEvent(startTime, result, ...args); + + this.session.logger.debug({ + id: LogId.toolExecute, + context: "tool", + message: `Executed tool ${this.name}`, + noRedaction: true, + }); return result; } catch (error: unknown) { this.session.logger.error({ @@ -91,7 +98,7 @@ export abstract class ToolBase { message: `Error executing ${this.name}: ${error as string}`, }); const toolResult = await this.handleError(error, args[0] as ToolArgs); - await this.emitToolEvent(startTime, toolResult, ...args).catch(() => {}); + this.emitToolEvent(startTime, toolResult, ...args); return toolResult; } }; @@ -200,11 +207,11 @@ export abstract class ToolBase { * @param result - Whether the command succeeded or failed * @param args - The arguments passed to the tool */ - private async emitToolEvent( + private emitToolEvent( startTime: number, result: CallToolResult, ...args: Parameters> - ): Promise { + ): void { if (!this.telemetry.isTelemetryEnabled()) { return; } @@ -230,7 +237,7 @@ export abstract class ToolBase { event.properties.project_id = metadata.projectId; } - await this.telemetry.emitEvents([event]); + this.telemetry.emitEvents([event]); } } diff --git a/src/transports/streamableHttp.ts b/src/transports/streamableHttp.ts index ad04ec732..b3f8f9ad4 100644 --- a/src/transports/streamableHttp.ts +++ b/src/transports/streamableHttp.ts @@ -124,7 +124,7 @@ export class StreamableHttpRunner extends TransportRunnerBase { // eslint-disable-next-line @typescript-eslint/no-misused-promises keepAliveLoop = setInterval(async () => { try { - this.logger.debug({ + server.session.logger.debug({ id: LogId.streamableHttpTransportKeepAlive, context: "streamableHttpTransport", message: "Sending ping", @@ -138,7 +138,7 @@ export class StreamableHttpRunner extends TransportRunnerBase { } catch (err) { try { failedPings++; - this.logger.warning({ + server.session.logger.warning({ id: LogId.streamableHttpTransportKeepAliveFailure, context: "streamableHttpTransport", message: `Error sending ping (attempt #${failedPings}): ${err instanceof Error ? err.message : String(err)}`, @@ -162,7 +162,7 @@ export class StreamableHttpRunner extends TransportRunnerBase { this.logger.error({ id: LogId.streamableHttpTransportSessionCloseFailure, context: "streamableHttpTransport", - message: `Error closing session: ${error instanceof Error ? error.message : String(error)}`, + message: `Error closing session ${sessionId}: ${error instanceof Error ? error.message : String(error)}`, }); } }, diff --git a/tests/unit/telemetry.test.ts b/tests/unit/telemetry.test.ts index 51341d56c..9db8ea953 100644 --- a/tests/unit/telemetry.test.ts +++ b/tests/unit/telemetry.test.ts @@ -24,8 +24,8 @@ describe("Telemetry", () => { hasCredentials: MockedFunction<() => boolean>; }; let mockEventCache: { - getEvents: MockedFunction<() => BaseEvent[]>; - clearEvents: MockedFunction<() => Promise>; + getEvents: MockedFunction<() => { id: number; event: BaseEvent }[]>; + removeEvents: MockedFunction<(ids: number[]) => Promise>; appendEvents: MockedFunction<(events: BaseEvent[]) => Promise>; }; let session: Session; @@ -61,26 +61,36 @@ describe("Telemetry", () => { }; } + function emitEventsForTest(events: BaseEvent[]): Promise { + return new Promise((resolve) => { + telemetry.events.once("events-emitted", resolve); + telemetry.events.once("events-send-failed", resolve); + telemetry.events.once("events-skipped", resolve); + + telemetry.emitEvents(events); + }); + } + // Helper function to verify mock calls to reduce duplication function verifyMockCalls({ sendEventsCalls = 0, - clearEventsCalls = 0, + removeEventsCalls = 0, appendEventsCalls = 0, sendEventsCalledWith = undefined, appendEventsCalledWith = undefined, }: { sendEventsCalls?: number; - clearEventsCalls?: number; + removeEventsCalls?: number; appendEventsCalls?: number; sendEventsCalledWith?: BaseEvent[] | undefined; appendEventsCalledWith?: BaseEvent[] | undefined; } = {}): void { const { calls: sendEvents } = mockApiClient.sendEvents.mock; - const { calls: clearEvents } = mockEventCache.clearEvents.mock; + const { calls: removeEvents } = mockEventCache.removeEvents.mock; const { calls: appendEvents } = mockEventCache.appendEvents.mock; expect(sendEvents.length).toBe(sendEventsCalls); - expect(clearEvents.length).toBe(clearEventsCalls); + expect(removeEvents.length).toBe(removeEventsCalls); expect(appendEvents.length).toBe(appendEventsCalls); if (sendEventsCalledWith) { @@ -113,7 +123,7 @@ describe("Telemetry", () => { // Setup mocked EventCache mockEventCache = new MockEventCache() as unknown as typeof mockEventCache; mockEventCache.getEvents = vi.fn().mockReturnValue([]); - mockEventCache.clearEvents = vi.fn().mockResolvedValue(undefined); + mockEventCache.removeEvents = vi.fn().mockResolvedValue(undefined); mockEventCache.appendEvents = vi.fn().mockResolvedValue(undefined); MockEventCache.getInstance = vi.fn().mockReturnValue(mockEventCache as unknown as EventCache); @@ -145,11 +155,11 @@ describe("Telemetry", () => { await telemetry.setupPromise; - await telemetry.emitEvents([testEvent]); + await emitEventsForTest([testEvent]); verifyMockCalls({ sendEventsCalls: 1, - clearEventsCalls: 1, + removeEventsCalls: 1, sendEventsCalledWith: [testEvent], }); }); @@ -161,7 +171,7 @@ describe("Telemetry", () => { await telemetry.setupPromise; - await telemetry.emitEvents([testEvent]); + await emitEventsForTest([testEvent]); verifyMockCalls({ sendEventsCalls: 1, @@ -182,15 +192,15 @@ describe("Telemetry", () => { }); // Set up mock to return cached events - mockEventCache.getEvents.mockReturnValueOnce([cachedEvent]); + mockEventCache.getEvents.mockReturnValueOnce([{ id: 0, event: cachedEvent }]); await telemetry.setupPromise; - await telemetry.emitEvents([newEvent]); + await emitEventsForTest([newEvent]); verifyMockCalls({ sendEventsCalls: 1, - clearEventsCalls: 1, + removeEventsCalls: 1, sendEventsCalledWith: [cachedEvent, newEvent], }); }); @@ -223,7 +233,7 @@ describe("Telemetry", () => { const commonProps = telemetry.getCommonProperties(); expect(commonProps.hosting_mode).toBe("vscode-extension"); - await telemetry.emitEvents([createTestEvent()]); + await emitEventsForTest([createTestEvent()]); const calls = mockApiClient.sendEvents.mock.calls; expect(calls).toHaveLength(1); @@ -305,7 +315,7 @@ describe("Telemetry", () => { it("should not send events", async () => { const testEvent = createTestEvent(); - await telemetry.emitEvents([testEvent]); + await emitEventsForTest([testEvent]); verifyMockCalls(); }); @@ -330,7 +340,7 @@ describe("Telemetry", () => { it("should not send events", async () => { const testEvent = createTestEvent(); - await telemetry.emitEvents([testEvent]); + await emitEventsForTest([testEvent]); verifyMockCalls(); }); From 0dfcdee408288caae8953f7c1fe9ef5fa29c8de0 Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Mon, 8 Sep 2025 19:18:47 +0300 Subject: [PATCH 21/49] fix: report correct number of projects (#523) --- src/tools/atlas/read/listProjects.ts | 2 +- tests/integration/tools/atlas/projects.test.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tools/atlas/read/listProjects.ts b/src/tools/atlas/read/listProjects.ts index 720186ecf..d5d3931b0 100644 --- a/src/tools/atlas/read/listProjects.ts +++ b/src/tools/atlas/read/listProjects.ts @@ -55,7 +55,7 @@ export class ListProjectsTool extends AtlasToolBase { ----------------| ----------------| ----------------| ----------------| ---------------- ${rows}`; return { - content: formatUntrustedData(`Found ${rows.length} projects`, formattedProjects), + content: formatUntrustedData(`Found ${data.results.length} projects`, formattedProjects), }; } } diff --git a/tests/integration/tools/atlas/projects.test.ts b/tests/integration/tools/atlas/projects.test.ts index 631b00f87..de637a23a 100644 --- a/tests/integration/tools/atlas/projects.test.ts +++ b/tests/integration/tools/atlas/projects.test.ts @@ -61,7 +61,6 @@ describeWithAtlas("projects", (integration) => { const response = await integration.mcpClient().callTool({ name: "atlas-list-projects", arguments: {} }); const elements = getResponseElements(response); expect(elements).toHaveLength(2); - expect(elements[0]?.text).toMatch(/Found \d+ projects/); expect(elements[1]?.text).toContain(" { } } expect(found).toBe(true); + + expect(elements[0]?.text).toBe(`Found ${data.length} projects`); }); }); }); From 76aa332781917a6e0aa240931450c093ffcdb98f Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Mon, 8 Sep 2025 19:22:47 +0300 Subject: [PATCH 22/49] chore: add ability to release prerelease versions (#492) --- .github/workflows/publish.yaml | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 60c478f5a..ec5648251 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -12,6 +12,7 @@ jobs: outputs: VERSION_EXISTS: ${{ steps.check-version.outputs.VERSION_EXISTS }} VERSION: ${{ steps.get-version.outputs.VERSION }} + RELEASE_CHANNEL: ${{ steps.npm-tag.outputs.RELEASE_CHANNEL }} steps: - uses: GitHubSecurityLab/actions-permissions/monitor@v1 - uses: actions/checkout@v5 @@ -42,6 +43,20 @@ jobs: else echo "VERSION_EXISTS=false" >> "$GITHUB_OUTPUT" fi + - name: Get npm tag + id: npm-tag + run: | + $regex = "^v?(?0|[1-9]\d*)\.(?0|[1-9]\d*)\.(?0|[1-9]\d*)(?:-(?(?:[^.]*)))?" + $version = "${{ steps.get-version.outputs.VERSION }}" + $releaseChannel = $groups["prerelease"][0].value + + if ([string]::IsNullOrEmpty($releaseChannel)) { + $releaseChannel = "latest" + } + Write-Output "RELEASE_CHANNEL=$releaseChannel" >> $Env:GITHUB_OUTPUT + - name: Output deployment info + run: echo "::notice title=Deployment Info::Deploying version ${{ steps.get-version.outputs.VERSION }} to channel ${{ steps.npm-tag.outputs.RELEASE_CHANNEL }}" + publish: runs-on: ubuntu-latest environment: Production @@ -58,16 +73,17 @@ jobs: node-version-file: package.json registry-url: "https://registry.npmjs.org" cache: "npm" + - name: Build package run: | npm ci npm run build - name: Publish to NPM - run: npm publish + run: npm publish --tag ${{ needs.check.outputs.RELEASE_CHANNEL }} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Publish git release env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ needs.check.outputs.VERSION }} --title "${{ needs.check.outputs.VERSION }}" --generate-notes --target ${{ github.sha }} + gh release create ${{ needs.check.outputs.VERSION }} --title "${{ needs.check.outputs.VERSION }}" --generate-notes --target ${{ github.sha }} ${{ (steps.npm-tag.outputs.RELEASE_CHANNEL != 'latest' && '--prerelease') || ''}} From eaf34ae03a9a5fc1797a5983cfd95dad13073ce2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 11:55:31 +0000 Subject: [PATCH 23/49] chore(deps): bump actions/setup-node from 4 to 5 (#535) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/accuracy-tests.yml | 2 +- .github/workflows/check.yml | 6 +++--- .github/workflows/code_health.yaml | 6 +++--- .github/workflows/code_health_fork.yaml | 2 +- .github/workflows/prepare_release.yaml | 2 +- .github/workflows/publish.yaml | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/accuracy-tests.yml b/.github/workflows/accuracy-tests.yml index 3a03c558f..0b31b7c97 100644 --- a/.github/workflows/accuracy-tests.yml +++ b/.github/workflows/accuracy-tests.yml @@ -29,7 +29,7 @@ jobs: steps: - uses: GitHubSecurityLab/actions-permissions/monitor@v1 - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version-file: package.json cache: "npm" diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 74e0a9210..64570da62 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: GitHubSecurityLab/actions-permissions/monitor@v1 - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version-file: package.json cache: "npm" @@ -31,7 +31,7 @@ jobs: steps: - uses: GitHubSecurityLab/actions-permissions/monitor@v1 - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version-file: package.json cache: "npm" @@ -45,7 +45,7 @@ jobs: steps: - uses: GitHubSecurityLab/actions-permissions/monitor@v1 - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version-file: package.json cache: "npm" diff --git a/.github/workflows/code_health.yaml b/.github/workflows/code_health.yaml index 9b79cba0d..2dfba473d 100644 --- a/.github/workflows/code_health.yaml +++ b/.github/workflows/code_health.yaml @@ -21,7 +21,7 @@ jobs: - uses: GitHubSecurityLab/actions-permissions/monitor@v1 if: matrix.os == 'ubuntu-latest' - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version-file: package.json cache: "npm" @@ -43,7 +43,7 @@ jobs: steps: - uses: GitHubSecurityLab/actions-permissions/monitor@v1 - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version-file: package.json cache: "npm" @@ -69,7 +69,7 @@ jobs: needs: [run-tests, run-atlas-tests] steps: - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version-file: package.json cache: "npm" diff --git a/.github/workflows/code_health_fork.yaml b/.github/workflows/code_health_fork.yaml index 3bd34cd4f..f5ef5f763 100644 --- a/.github/workflows/code_health_fork.yaml +++ b/.github/workflows/code_health_fork.yaml @@ -20,7 +20,7 @@ jobs: - uses: GitHubSecurityLab/actions-permissions/monitor@v1 if: matrix.os == 'ubuntu-latest' - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version-file: package.json cache: "npm" diff --git a/.github/workflows/prepare_release.yaml b/.github/workflows/prepare_release.yaml index 96bb5b64c..bb497ab91 100644 --- a/.github/workflows/prepare_release.yaml +++ b/.github/workflows/prepare_release.yaml @@ -23,7 +23,7 @@ jobs: app-id: ${{ vars.DEVTOOLS_BOT_APP_ID }} private-key: ${{ secrets.DEVTOOLS_BOT_PRIVATE_KEY }} - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version-file: package.json registry-url: "https://registry.npmjs.org" diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index ec5648251..b012205db 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v5 with: fetch-depth: 0 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version-file: package.json registry-url: "https://registry.npmjs.org" @@ -68,7 +68,7 @@ jobs: steps: - uses: GitHubSecurityLab/actions-permissions/monitor@v1 - uses: actions/checkout@v5 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version-file: package.json registry-url: "https://registry.npmjs.org" From 019974982c7f38bb54d885a52402419288067ea8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 14:00:17 +0200 Subject: [PATCH 24/49] chore(deps): bump vite from 7.1.4 to 7.1.5 in the npm_and_yarn group across 1 directory (#537) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 290e9600b..afc714eb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14178,14 +14178,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "devOptional": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -14817,9 +14817,9 @@ } }, "node_modules/vite": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz", - "integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", + "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -14828,7 +14828,7 @@ "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", - "tinyglobby": "^0.2.14" + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" From 67bdaaacbb672ba7fed0b3d2198132156d105fae Mon Sep 17 00:00:00 2001 From: Himanshu Singh Date: Wed, 10 Sep 2025 14:35:50 +0200 Subject: [PATCH 25/49] chore: fix release channel detection script (#539) --- .github/workflows/publish.yaml | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index b012205db..0513b2220 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -45,15 +45,28 @@ jobs: fi - name: Get npm tag id: npm-tag + shell: bash run: | - $regex = "^v?(?0|[1-9]\d*)\.(?0|[1-9]\d*)\.(?0|[1-9]\d*)(?:-(?(?:[^.]*)))?" - $version = "${{ steps.get-version.outputs.VERSION }}" - $releaseChannel = $groups["prerelease"][0].value + set -e + VERSION="${{ steps.get-version.outputs.VERSION }}" + + # Extract the release channel (latest, alpha, beta, rc) + if [[ $VERSION =~ ^v?[0-9]+\.[0-9]+\.[0-9]+(-(.+))?$ ]]; then + if [[ -n "${BASH_REMATCH[2]}" ]]; then + CAPTURED_CHANNEL="${BASH_REMATCH[2]}" + # The captured channel might have more dots, cases like + # v1.2.3-alpha.1 For such cases we only want the channel relevant + # part which is alpha. + RELEASE_CHANNEL="${CAPTURED_CHANNEL%%.*}" + else + RELEASE_CHANNEL="latest" + fi + else + echo "::error title=Invalid Version::Encountered unexpected version ${{ steps.get-version.outputs.VERSION }}, cannot proceed!" + exit 1 + fi - if ([string]::IsNullOrEmpty($releaseChannel)) { - $releaseChannel = "latest" - } - Write-Output "RELEASE_CHANNEL=$releaseChannel" >> $Env:GITHUB_OUTPUT + echo "RELEASE_CHANNEL=${RELEASE_CHANNEL}" >> "$GITHUB_OUTPUT" - name: Output deployment info run: echo "::notice title=Deployment Info::Deploying version ${{ steps.get-version.outputs.VERSION }} to channel ${{ steps.npm-tag.outputs.RELEASE_CHANNEL }}" From 392217210885b4d0c1692be78db4b0288c053846 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 14:37:47 +0200 Subject: [PATCH 26/49] chore(deps): bump actions/github-script from 7 to 8 (#533) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/jira-issue.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jira-issue.yml b/.github/workflows/jira-issue.yml index afd73d739..3760b59c4 100644 --- a/.github/workflows/jira-issue.yml +++ b/.github/workflows/jira-issue.yml @@ -62,7 +62,7 @@ jobs: - name: Remove create-jira label if: github.event.action == 'labeled' && github.event.label.name == 'create-jira' - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | try { From cd095fce696852788a5313e428bd65fc0d81ef9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 14:38:29 +0200 Subject: [PATCH 27/49] chore(deps-dev): bump @eslint/js from 9.34.0 to 9.35.0 (#532) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index afc714eb3..2d2d62944 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1622,9 +1622,10 @@ } }, "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", + "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8056,6 +8057,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", From e523ffc64f56e77aec6fa0de6f430033ef0ad514 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 14:41:16 +0200 Subject: [PATCH 28/49] chore(deps-dev): bump @types/node from 24.3.0 to 24.3.1 (#529) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2d2d62944..ae882911d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5416,9 +5416,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "version": "24.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", + "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", "dev": true, "license": "MIT", "dependencies": { From 28bb418d75790d8c1d9c0318b92f68cc0b24b400 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 12:43:07 +0000 Subject: [PATCH 29/49] chore(deps): bump actions/stale from 9 to 10 (#534) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index fb2ec4d68..3e98ab943 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -15,7 +15,7 @@ jobs: pull-requests: write steps: - uses: GitHubSecurityLab/actions-permissions/monitor@v1 - - uses: actions/stale@v9 + - uses: actions/stale@v10 id: stale with: repo-token: ${{ secrets.GITHUB_TOKEN }} From 6916069cf87a57fcee6558a0901d8390d8b27dae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 12:45:53 +0000 Subject: [PATCH 30/49] chore(deps-dev): bump eslint from 9.34.0 to 9.35.0 (#530) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae882911d..dff859079 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1625,7 +1625,6 @@ "version": "9.35.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", - "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7923,18 +7922,18 @@ } }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", + "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", + "@eslint/js": "9.35.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -8057,18 +8056,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", From 008ad6ba4726c6ecd1493e4b1e59f401ab791fa9 Mon Sep 17 00:00:00 2001 From: "mongodb-devtools-bot[bot]" <189715634+mongodb-devtools-bot[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 13:19:48 +0000 Subject: [PATCH 31/49] chore: release v0.3.1-prerelease.1 (#540) Co-authored-by: mongodb-devtools-bot[bot] <189715634+mongodb-devtools-bot[bot]@users.noreply.github.com> --- package-lock.json | 4 ++-- package.json | 2 +- src/common/packageInfo.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index dff859079..089fd9998 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mongodb-mcp-server", - "version": "0.3.0", + "version": "0.3.1-prerelease.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mongodb-mcp-server", - "version": "0.3.0", + "version": "0.3.1-prerelease.1", "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "^1.17.4", diff --git a/package.json b/package.json index 7a9fc15f9..db065bb1e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mongodb-mcp-server", "description": "MongoDB Model Context Protocol Server", - "version": "0.3.0", + "version": "0.3.1-prerelease.1", "type": "module", "exports": { ".": { diff --git a/src/common/packageInfo.ts b/src/common/packageInfo.ts index 680859f2e..ee1e17867 100644 --- a/src/common/packageInfo.ts +++ b/src/common/packageInfo.ts @@ -1,5 +1,5 @@ // This file was generated by scripts/updatePackageVersion.ts - Do not edit it manually. export const packageInfo = { - version: "0.3.0", + version: "0.3.1-prerelease.1", mcpServerName: "MongoDB MCP Server", }; From dd7760b36d5f2c48e491e486e8e0b5f32634eb18 Mon Sep 17 00:00:00 2001 From: Bianca Lisle <40155621+blva@users.noreply.github.com> Date: Wed, 10 Sep 2025 14:48:18 +0100 Subject: [PATCH 32/49] chore: warn about insecure httpHost usage - MCP-184 (#541) --- src/common/logger.ts | 1 + src/transports/streamableHttp.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/common/logger.ts b/src/common/logger.ts index 5414fc934..7a3ebd99c 100644 --- a/src/common/logger.ts +++ b/src/common/logger.ts @@ -56,6 +56,7 @@ export const LogId = { streamableHttpTransportCloseFailure: mongoLogId(1_006_006), streamableHttpTransportKeepAliveFailure: mongoLogId(1_006_007), streamableHttpTransportKeepAlive: mongoLogId(1_006_008), + streamableHttpTransportHttpHostWarning: mongoLogId(1_006_009), exportCleanupError: mongoLogId(1_007_001), exportCreationError: mongoLogId(1_007_002), diff --git a/src/transports/streamableHttp.ts b/src/transports/streamableHttp.ts index b3f8f9ad4..0a20e59e8 100644 --- a/src/transports/streamableHttp.ts +++ b/src/transports/streamableHttp.ts @@ -205,6 +205,15 @@ export class StreamableHttpRunner extends TransportRunnerBase { message: `Server started on ${this.serverAddress}`, noRedaction: true, }); + + if (this.shouldWarnAboutHttpHost(this.userConfig.httpHost)) { + this.logger.warning({ + id: LogId.streamableHttpTransportHttpHostWarning, + context: "streamableHttpTransport", + message: `Binding to ${this.userConfig.httpHost} can expose the MCP Server to the entire local network, which allows other devices on the same network to potentially access the MCP Server. This is a security risk and could allow unauthorized access to your database context.`, + noRedaction: true, + }); + } } async closeTransport(): Promise { @@ -243,4 +252,10 @@ export class StreamableHttpRunner extends TransportRunnerBase { }); }; } + + private shouldWarnAboutHttpHost(httpHost: string): boolean { + const host = httpHost.trim(); + const safeHosts = new Set(["127.0.0.1", "localhost", "::1"]); + return host === "0.0.0.0" || host === "::" || (!safeHosts.has(host) && host !== ""); + } } From d022c5b92967f250314563fd18adca9c968ca341 Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Thu, 11 Sep 2025 17:31:56 +0300 Subject: [PATCH 33/49] fix: add untrusted data wrapper around logs response MCP-197 (#548) --- src/tools/mongodb/metadata/logs.ts | 25 ++++------- .../tools/mongodb/metadata/logs.test.ts | 42 +++++++++++++++---- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/tools/mongodb/metadata/logs.ts b/src/tools/mongodb/metadata/logs.ts index 844d0283f..b19fa72c2 100644 --- a/src/tools/mongodb/metadata/logs.ts +++ b/src/tools/mongodb/metadata/logs.ts @@ -1,6 +1,6 @@ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { MongoDBToolBase } from "../mongodbTool.js"; -import type { ToolArgs, OperationType } from "../../tool.js"; +import { type ToolArgs, type OperationType, formatUntrustedData } from "../../tool.js"; import { z } from "zod"; export class LogsTool extends MongoDBToolBase { @@ -33,23 +33,16 @@ export class LogsTool extends MongoDBToolBase { getLog: type, }); - const logs = (result.log as string[]).slice(0, limit); + // Trim ending newlines so that when we join the logs we don't insert empty lines + // between messages. + const logs = (result.log as string[]).slice(0, limit).map((l) => l.trimEnd()); + let message = `Found: ${result.totalLinesWritten} messages`; + if (result.totalLinesWritten > limit) { + message += ` (showing only the first ${limit})`; + } return { - content: [ - { - text: `Found: ${result.totalLinesWritten} messages`, - type: "text", - }, - - ...logs.map( - (log) => - ({ - text: log, - type: "text", - }) as const - ), - ], + content: formatUntrustedData(message, logs.join("\n")), }; } } diff --git a/tests/integration/tools/mongodb/metadata/logs.test.ts b/tests/integration/tools/mongodb/metadata/logs.test.ts index 27c1f0e28..aa7e4ea44 100644 --- a/tests/integration/tools/mongodb/metadata/logs.test.ts +++ b/tests/integration/tools/mongodb/metadata/logs.test.ts @@ -1,5 +1,10 @@ import { expect, it } from "vitest"; -import { validateToolMetadata, validateThrowsForInvalidArguments, getResponseElements } from "../../../helpers.js"; +import { + validateToolMetadata, + validateThrowsForInvalidArguments, + getResponseElements, + getDataFromUntrustedContent, +} from "../../../helpers.js"; import { describeWithMongoDB, validateAutoConnectBehavior } from "../mongodbHelpers.js"; describeWithMongoDB("logs tool", (integration) => { @@ -36,13 +41,27 @@ describeWithMongoDB("logs tool", (integration) => { const elements = getResponseElements(response); + expect(elements).toHaveLength(2); + expect(elements[1]?.text).toContain(" logs.length) { + expect(elements[0]?.text).toContain(`(showing only the first ${logs.length})`); + } - for (let i = 1; i < elements.length; i++) { + for (const message of logs) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const log = JSON.parse(elements[i]?.text ?? "{}"); + const log = JSON.parse(message ?? "{}"); expect(log).toHaveProperty("t"); expect(log).toHaveProperty("msg"); } @@ -58,9 +77,18 @@ describeWithMongoDB("logs tool", (integration) => { }); const elements = getResponseElements(response); - expect(elements.length).toBeLessThanOrEqual(51); - for (let i = 1; i < elements.length; i++) { - const log = JSON.parse(elements[i]?.text ?? "{}") as { tags: string[] }; + expect(elements).toHaveLength(2); + expect(elements[1]?.text).toContain(" Date: Thu, 11 Sep 2025 17:32:15 +0300 Subject: [PATCH 34/49] fix: prevent $out and $merge stages when create/update/delete operations are disabled MCP-196 (#545) --- src/tools/mongodb/read/aggregate.ts | 17 +++++--- .../tools/mongodb/read/aggregate.test.ts | 43 ++++++++++++++++++- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/tools/mongodb/read/aggregate.ts b/src/tools/mongodb/read/aggregate.ts index c61603459..45df45471 100644 --- a/src/tools/mongodb/read/aggregate.ts +++ b/src/tools/mongodb/read/aggregate.ts @@ -49,16 +49,23 @@ export class AggregateTool extends MongoDBToolBase { } private assertOnlyUsesPermittedStages(pipeline: Record[]): void { - if (!this.config.readOnly) { + const writeOperations: OperationType[] = ["update", "create", "delete"]; + let writeStageForbiddenError = ""; + + if (this.config.readOnly) { + writeStageForbiddenError = "In readOnly mode you can not run pipelines with $out or $merge stages."; + } else if (this.config.disabledTools.some((t) => writeOperations.includes(t as OperationType))) { + writeStageForbiddenError = + "When 'create', 'update', or 'delete' operations are disabled, you can not run pipelines with $out or $merge stages."; + } + + if (!writeStageForbiddenError) { return; } for (const stage of pipeline) { if (stage.$out || stage.$merge) { - throw new MongoDBError( - ErrorCodes.ForbiddenWriteOperation, - "In readOnly mode you can not run pipelines with $out or $merge stages." - ); + throw new MongoDBError(ErrorCodes.ForbiddenWriteOperation, writeStageForbiddenError); } } } diff --git a/tests/integration/tools/mongodb/read/aggregate.test.ts b/tests/integration/tools/mongodb/read/aggregate.test.ts index 643c5ef37..57c7f8c70 100644 --- a/tests/integration/tools/mongodb/read/aggregate.test.ts +++ b/tests/integration/tools/mongodb/read/aggregate.test.ts @@ -4,10 +4,15 @@ import { validateThrowsForInvalidArguments, getResponseContent, } from "../../../helpers.js"; -import { expect, it } from "vitest"; +import { expect, it, afterEach } from "vitest"; import { describeWithMongoDB, getDocsFromUntrustedContent, validateAutoConnectBehavior } from "../mongodbHelpers.js"; describeWithMongoDB("aggregate tool", (integration) => { + afterEach(() => { + integration.mcpServer().userConfig.readOnly = false; + integration.mcpServer().userConfig.disabledTools = []; + }); + validateToolMetadata(integration, "aggregate", "Run an aggregation against a MongoDB collection", [ ...databaseCollectionParameters, { @@ -129,6 +134,42 @@ describeWithMongoDB("aggregate tool", (integration) => { ); }); + for (const disabledOpType of ["create", "update", "delete"] as const) { + it(`can not run $out stages when ${disabledOpType} operation is disabled`, async () => { + await integration.connectMcpClient(); + integration.mcpServer().userConfig.disabledTools = [disabledOpType]; + const response = await integration.mcpClient().callTool({ + name: "aggregate", + arguments: { + database: integration.randomDbName(), + collection: "people", + pipeline: [{ $out: "outpeople" }], + }, + }); + const content = getResponseContent(response); + expect(content).toEqual( + "Error running aggregate: When 'create', 'update', or 'delete' operations are disabled, you can not run pipelines with $out or $merge stages." + ); + }); + + it(`can not run $merge stages when ${disabledOpType} operation is disabled`, async () => { + await integration.connectMcpClient(); + integration.mcpServer().userConfig.disabledTools = [disabledOpType]; + const response = await integration.mcpClient().callTool({ + name: "aggregate", + arguments: { + database: integration.randomDbName(), + collection: "people", + pipeline: [{ $merge: "outpeople" }], + }, + }); + const content = getResponseContent(response); + expect(content).toEqual( + "Error running aggregate: When 'create', 'update', or 'delete' operations are disabled, you can not run pipelines with $out or $merge stages." + ); + }); + } + validateAutoConnectBehavior(integration, "aggregate", () => { return { args: { From 17b544b69d5eac53d024a84b1a7383c8ba439c74 Mon Sep 17 00:00:00 2001 From: Bianca Lisle <40155621+blva@users.noreply.github.com> Date: Thu, 11 Sep 2025 16:45:52 +0100 Subject: [PATCH 35/49] fix: add argument validation - MCP-188 (#542) --- src/tools/args.ts | 70 ++++ src/tools/atlas/atlasTool.ts | 3 +- src/tools/atlas/connect/connectCluster.ts | 12 +- src/tools/atlas/create/createAccessList.ts | 27 +- src/tools/atlas/create/createDBUser.ts | 56 +-- src/tools/atlas/create/createFreeCluster.ts | 10 +- src/tools/atlas/create/createProject.ts | 12 +- src/tools/atlas/read/inspectAccessList.ts | 11 +- src/tools/atlas/read/inspectCluster.ts | 13 +- src/tools/atlas/read/listAlerts.ts | 11 +- src/tools/atlas/read/listClusters.ts | 8 +- src/tools/atlas/read/listDBUsers.ts | 8 +- src/tools/atlas/read/listProjects.ts | 8 +- tests/unit/args.test.ts | 397 ++++++++++++++++++++ 14 files changed, 573 insertions(+), 73 deletions(-) create mode 100644 src/tools/args.ts create mode 100644 tests/unit/args.test.ts diff --git a/src/tools/args.ts b/src/tools/args.ts new file mode 100644 index 000000000..165f3da0d --- /dev/null +++ b/src/tools/args.ts @@ -0,0 +1,70 @@ +import { z, type ZodString } from "zod"; + +const NO_UNICODE_REGEX = /^[\x20-\x7E]*$/; +export const NO_UNICODE_ERROR = "String cannot contain special characters or Unicode symbols"; + +const ALLOWED_USERNAME_CHARACTERS_REGEX = /^[a-zA-Z0-9._-]+$/; +export const ALLOWED_USERNAME_CHARACTERS_ERROR = + "Username can only contain letters, numbers, dots, hyphens, and underscores"; + +const ALLOWED_REGION_CHARACTERS_REGEX = /^[a-zA-Z0-9_-]+$/; +export const ALLOWED_REGION_CHARACTERS_ERROR = "Region can only contain letters, numbers, hyphens, and underscores"; + +const ALLOWED_CLUSTER_NAME_CHARACTERS_REGEX = /^[a-zA-Z0-9_-]+$/; +export const ALLOWED_CLUSTER_NAME_CHARACTERS_ERROR = + "Cluster names can only contain ASCII letters, numbers, and hyphens."; + +const ALLOWED_PROJECT_NAME_CHARACTERS_REGEX = /^[a-zA-Z0-9\s()@&+:._',-]+$/; +export const ALLOWED_PROJECT_NAME_CHARACTERS_ERROR = + "Project names can't be longer than 64 characters and can only contain letters, numbers, spaces, and the following symbols: ( ) @ & + : . _ - ' ,"; +export const CommonArgs = { + string: (): ZodString => z.string().regex(NO_UNICODE_REGEX, NO_UNICODE_ERROR), + + objectId: (fieldName: string): z.ZodString => + z + .string() + .min(1, `${fieldName} is required`) + .length(24, `${fieldName} must be exactly 24 characters`) + .regex(/^[0-9a-fA-F]+$/, `${fieldName} must contain only hexadecimal characters`), +}; + +export const AtlasArgs = { + projectId: (): z.ZodString => CommonArgs.objectId("projectId"), + + organizationId: (): z.ZodString => CommonArgs.objectId("organizationId"), + + clusterName: (): z.ZodString => + z + .string() + .min(1, "Cluster name is required") + .max(64, "Cluster name must be 64 characters or less") + .regex(ALLOWED_CLUSTER_NAME_CHARACTERS_REGEX, ALLOWED_CLUSTER_NAME_CHARACTERS_ERROR), + + projectName: (): z.ZodString => + z + .string() + .min(1, "Project name is required") + .max(64, "Project name must be 64 characters or less") + .regex(ALLOWED_PROJECT_NAME_CHARACTERS_REGEX, ALLOWED_PROJECT_NAME_CHARACTERS_ERROR), + + username: (): z.ZodString => + z + .string() + .min(1, "Username is required") + .max(100, "Username must be 100 characters or less") + .regex(ALLOWED_USERNAME_CHARACTERS_REGEX, ALLOWED_USERNAME_CHARACTERS_ERROR), + + ipAddress: (): z.ZodString => z.string().ip({ version: "v4" }), + + cidrBlock: (): z.ZodString => z.string().cidr(), + + region: (): z.ZodString => + z + .string() + .min(1, "Region is required") + .max(50, "Region must be 50 characters or less") + .regex(ALLOWED_REGION_CHARACTERS_REGEX, ALLOWED_REGION_CHARACTERS_ERROR), + + password: (): z.ZodString => + z.string().min(1, "Password is required").max(100, "Password must be 100 characters or less"), +}; diff --git a/src/tools/atlas/atlasTool.ts b/src/tools/atlas/atlasTool.ts index 452f2e794..b68eeafde 100644 --- a/src/tools/atlas/atlasTool.ts +++ b/src/tools/atlas/atlasTool.ts @@ -1,6 +1,5 @@ -import type { ToolCategory, TelemetryToolMetadata, ToolArgs } from "../tool.js"; -import { ToolBase } from "../tool.js"; import type { ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { ToolBase, type ToolArgs, type ToolCategory, type TelemetryToolMetadata } from "../tool.js"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { LogId } from "../../common/logger.js"; import { z } from "zod"; diff --git a/src/tools/atlas/connect/connectCluster.ts b/src/tools/atlas/connect/connectCluster.ts index 618f5483b..1baf0c6f7 100644 --- a/src/tools/atlas/connect/connectCluster.ts +++ b/src/tools/atlas/connect/connectCluster.ts @@ -1,13 +1,13 @@ -import { z } from "zod"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; +import { type OperationType, type ToolArgs } from "../../tool.js"; import { AtlasToolBase } from "../atlasTool.js"; -import type { ToolArgs, OperationType } from "../../tool.js"; import { generateSecurePassword } from "../../../helpers/generatePassword.js"; import { LogId } from "../../../common/logger.js"; import { inspectCluster } from "../../../common/atlas/cluster.js"; import { ensureCurrentIpInAccessList } from "../../../common/atlas/accessListUtils.js"; import type { AtlasClusterConnectionInfo } from "../../../common/connectionManager.js"; import { getDefaultRoleFromConfig } from "../../../common/atlas/roles.js"; +import { AtlasArgs } from "../../args.js"; const EXPIRY_MS = 1000 * 60 * 60 * 12; // 12 hours const addedIpAccessListMessage = @@ -20,13 +20,17 @@ function sleep(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)); } +export const ConnectClusterArgs = { + projectId: AtlasArgs.projectId().describe("Atlas project ID"), + clusterName: AtlasArgs.clusterName().describe("Atlas cluster name"), +}; + export class ConnectClusterTool extends AtlasToolBase { public name = "atlas-connect-cluster"; protected description = "Connect to MongoDB Atlas cluster"; public operationType: OperationType = "connect"; protected argsShape = { - projectId: z.string().describe("Atlas project ID"), - clusterName: z.string().describe("Atlas cluster name"), + ...ConnectClusterArgs, }; private queryConnection( diff --git a/src/tools/atlas/create/createAccessList.ts b/src/tools/atlas/create/createAccessList.ts index c7f5d43d8..0cf3b808e 100644 --- a/src/tools/atlas/create/createAccessList.ts +++ b/src/tools/atlas/create/createAccessList.ts @@ -1,26 +1,27 @@ import { z } from "zod"; +import { type OperationType, type ToolArgs } from "../../tool.js"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { AtlasToolBase } from "../atlasTool.js"; -import type { ToolArgs, OperationType } from "../../tool.js"; import { makeCurrentIpAccessListEntry, DEFAULT_ACCESS_LIST_COMMENT } from "../../../common/atlas/accessListUtils.js"; +import { AtlasArgs, CommonArgs } from "../../args.js"; + +export const CreateAccessListArgs = { + projectId: AtlasArgs.projectId().describe("Atlas project ID"), + ipAddresses: z.array(AtlasArgs.ipAddress()).describe("IP addresses to allow access from").optional(), + cidrBlocks: z.array(AtlasArgs.cidrBlock()).describe("CIDR blocks to allow access from").optional(), + currentIpAddress: z.boolean().describe("Add the current IP address").default(false), + comment: CommonArgs.string() + .describe("Comment for the access list entries") + .default(DEFAULT_ACCESS_LIST_COMMENT) + .optional(), +}; export class CreateAccessListTool extends AtlasToolBase { public name = "atlas-create-access-list"; protected description = "Allow Ip/CIDR ranges to access your MongoDB Atlas clusters."; public operationType: OperationType = "create"; protected argsShape = { - projectId: z.string().describe("Atlas project ID"), - ipAddresses: z - .array(z.string().ip({ version: "v4" })) - .describe("IP addresses to allow access from") - .optional(), - cidrBlocks: z.array(z.string().cidr()).describe("CIDR blocks to allow access from").optional(), - currentIpAddress: z.boolean().describe("Add the current IP address").default(false), - comment: z - .string() - .describe("Comment for the access list entries") - .default(DEFAULT_ACCESS_LIST_COMMENT) - .optional(), + ...CreateAccessListArgs, }; protected async execute({ diff --git a/src/tools/atlas/create/createDBUser.ts b/src/tools/atlas/create/createDBUser.ts index a807c44f5..18d22d358 100644 --- a/src/tools/atlas/create/createDBUser.ts +++ b/src/tools/atlas/create/createDBUser.ts @@ -1,41 +1,45 @@ import { z } from "zod"; +import type { ToolArgs, OperationType } from "../../tool.js"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { AtlasToolBase } from "../atlasTool.js"; -import type { ToolArgs, OperationType } from "../../tool.js"; import type { CloudDatabaseUser, DatabaseUserRole } from "../../../common/atlas/openapi.js"; import { generateSecurePassword } from "../../../helpers/generatePassword.js"; import { ensureCurrentIpInAccessList } from "../../../common/atlas/accessListUtils.js"; +import { AtlasArgs, CommonArgs } from "../../args.js"; + +export const CreateDBUserArgs = { + projectId: AtlasArgs.projectId().describe("Atlas project ID"), + username: AtlasArgs.username().describe("Username for the new user"), + // Models will generate overly simplistic passwords like SecurePassword123 or + // AtlasPassword123, which are easily guessable and exploitable. We're instructing + // the model not to try and generate anything and instead leave the field unset. + password: AtlasArgs.password() + .optional() + .nullable() + .describe( + "Password for the new user. IMPORTANT: If the user hasn't supplied an explicit password, leave it unset and under no circumstances try to generate a random one. A secure password will be generated by the MCP server if necessary." + ), + roles: z + .array( + z.object({ + roleName: CommonArgs.string().describe("Role name"), + databaseName: CommonArgs.string().describe("Database name").default("admin"), + collectionName: CommonArgs.string().describe("Collection name").optional(), + }) + ) + .describe("Roles for the new user"), + clusters: z + .array(AtlasArgs.clusterName()) + .describe("Clusters to assign the user to, leave empty for access to all clusters") + .optional(), +}; export class CreateDBUserTool extends AtlasToolBase { public name = "atlas-create-db-user"; protected description = "Create an MongoDB Atlas database user"; public operationType: OperationType = "create"; protected argsShape = { - projectId: z.string().describe("Atlas project ID"), - username: z.string().describe("Username for the new user"), - // Models will generate overly simplistic passwords like SecurePassword123 or - // AtlasPassword123, which are easily guessable and exploitable. We're instructing - // the model not to try and generate anything and instead leave the field unset. - password: z - .string() - .optional() - .nullable() - .describe( - "Password for the new user. IMPORTANT: If the user hasn't supplied an explicit password, leave it unset and under no circumstances try to generate a random one. A secure password will be generated by the MCP server if necessary." - ), - roles: z - .array( - z.object({ - roleName: z.string().describe("Role name"), - databaseName: z.string().describe("Database name").default("admin"), - collectionName: z.string().describe("Collection name").optional(), - }) - ) - .describe("Roles for the new user"), - clusters: z - .array(z.string()) - .describe("Clusters to assign the user to, leave empty for access to all clusters") - .optional(), + ...CreateDBUserArgs, }; protected async execute({ diff --git a/src/tools/atlas/create/createFreeCluster.ts b/src/tools/atlas/create/createFreeCluster.ts index 5a110d95d..6b1ac98eb 100644 --- a/src/tools/atlas/create/createFreeCluster.ts +++ b/src/tools/atlas/create/createFreeCluster.ts @@ -1,18 +1,18 @@ -import { z } from "zod"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; +import { type ToolArgs, type OperationType } from "../../tool.js"; import { AtlasToolBase } from "../atlasTool.js"; -import type { ToolArgs, OperationType } from "../../tool.js"; import type { ClusterDescription20240805 } from "../../../common/atlas/openapi.js"; import { ensureCurrentIpInAccessList } from "../../../common/atlas/accessListUtils.js"; +import { AtlasArgs } from "../../args.js"; export class CreateFreeClusterTool extends AtlasToolBase { public name = "atlas-create-free-cluster"; protected description = "Create a free MongoDB Atlas cluster"; public operationType: OperationType = "create"; protected argsShape = { - projectId: z.string().describe("Atlas project ID to create the cluster in"), - name: z.string().describe("Name of the cluster"), - region: z.string().describe("Region of the cluster").default("US_EAST_1"), + projectId: AtlasArgs.projectId().describe("Atlas project ID to create the cluster in"), + name: AtlasArgs.clusterName().describe("Name of the cluster"), + region: AtlasArgs.region().describe("Region of the cluster").default("US_EAST_1"), }; protected async execute({ projectId, name, region }: ToolArgs): Promise { diff --git a/src/tools/atlas/create/createProject.ts b/src/tools/atlas/create/createProject.ts index 60753b6b0..b981fd8e8 100644 --- a/src/tools/atlas/create/createProject.ts +++ b/src/tools/atlas/create/createProject.ts @@ -1,16 +1,20 @@ -import { z } from "zod"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; +import { type OperationType, type ToolArgs } from "../../tool.js"; import { AtlasToolBase } from "../atlasTool.js"; -import type { ToolArgs, OperationType } from "../../tool.js"; import type { Group } from "../../../common/atlas/openapi.js"; +import { AtlasArgs } from "../../args.js"; + +export const CreateProjectArgs = { + projectName: AtlasArgs.projectName().optional().describe("Name for the new project"), + organizationId: AtlasArgs.organizationId().optional().describe("Organization ID for the new project"), +}; export class CreateProjectTool extends AtlasToolBase { public name = "atlas-create-project"; protected description = "Create a MongoDB Atlas project"; public operationType: OperationType = "create"; protected argsShape = { - projectName: z.string().optional().describe("Name for the new project"), - organizationId: z.string().optional().describe("Organization ID for the new project"), + ...CreateProjectArgs, }; protected async execute({ projectName, organizationId }: ToolArgs): Promise { diff --git a/src/tools/atlas/read/inspectAccessList.ts b/src/tools/atlas/read/inspectAccessList.ts index 7eedf6ed7..6c8eaed30 100644 --- a/src/tools/atlas/read/inspectAccessList.ts +++ b/src/tools/atlas/read/inspectAccessList.ts @@ -1,15 +1,18 @@ -import { z } from "zod"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; +import { type OperationType, type ToolArgs, formatUntrustedData } from "../../tool.js"; import { AtlasToolBase } from "../atlasTool.js"; -import type { ToolArgs, OperationType } from "../../tool.js"; -import { formatUntrustedData } from "../../tool.js"; +import { AtlasArgs } from "../../args.js"; + +export const InspectAccessListArgs = { + projectId: AtlasArgs.projectId().describe("Atlas project ID"), +}; export class InspectAccessListTool extends AtlasToolBase { public name = "atlas-inspect-access-list"; protected description = "Inspect Ip/CIDR ranges with access to your MongoDB Atlas clusters."; public operationType: OperationType = "read"; protected argsShape = { - projectId: z.string().describe("Atlas project ID"), + ...InspectAccessListArgs, }; protected async execute({ projectId }: ToolArgs): Promise { diff --git a/src/tools/atlas/read/inspectCluster.ts b/src/tools/atlas/read/inspectCluster.ts index feb5f5ac2..56e1e5a8b 100644 --- a/src/tools/atlas/read/inspectCluster.ts +++ b/src/tools/atlas/read/inspectCluster.ts @@ -1,18 +1,21 @@ -import { z } from "zod"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; +import { type OperationType, type ToolArgs, formatUntrustedData } from "../../tool.js"; import { AtlasToolBase } from "../atlasTool.js"; -import type { ToolArgs, OperationType } from "../../tool.js"; -import { formatUntrustedData } from "../../tool.js"; import type { Cluster } from "../../../common/atlas/cluster.js"; import { inspectCluster } from "../../../common/atlas/cluster.js"; +import { AtlasArgs } from "../../args.js"; + +export const InspectClusterArgs = { + projectId: AtlasArgs.projectId().describe("Atlas project ID"), + clusterName: AtlasArgs.clusterName().describe("Atlas cluster name"), +}; export class InspectClusterTool extends AtlasToolBase { public name = "atlas-inspect-cluster"; protected description = "Inspect MongoDB Atlas cluster"; public operationType: OperationType = "read"; protected argsShape = { - projectId: z.string().describe("Atlas project ID"), - clusterName: z.string().describe("Atlas cluster name"), + ...InspectClusterArgs, }; protected async execute({ projectId, clusterName }: ToolArgs): Promise { diff --git a/src/tools/atlas/read/listAlerts.ts b/src/tools/atlas/read/listAlerts.ts index 8ab4666c7..d55a917f8 100644 --- a/src/tools/atlas/read/listAlerts.ts +++ b/src/tools/atlas/read/listAlerts.ts @@ -1,15 +1,18 @@ -import { z } from "zod"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; +import { type OperationType, type ToolArgs, formatUntrustedData } from "../../tool.js"; import { AtlasToolBase } from "../atlasTool.js"; -import type { ToolArgs, OperationType } from "../../tool.js"; -import { formatUntrustedData } from "../../tool.js"; +import { AtlasArgs } from "../../args.js"; + +export const ListAlertsArgs = { + projectId: AtlasArgs.projectId().describe("Atlas project ID to list alerts for"), +}; export class ListAlertsTool extends AtlasToolBase { public name = "atlas-list-alerts"; protected description = "List MongoDB Atlas alerts"; public operationType: OperationType = "read"; protected argsShape = { - projectId: z.string().describe("Atlas project ID to list alerts for"), + ...ListAlertsArgs, }; protected async execute({ projectId }: ToolArgs): Promise { diff --git a/src/tools/atlas/read/listClusters.ts b/src/tools/atlas/read/listClusters.ts index e3894b3f6..5c8e72a30 100644 --- a/src/tools/atlas/read/listClusters.ts +++ b/src/tools/atlas/read/listClusters.ts @@ -1,4 +1,3 @@ -import { z } from "zod"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { AtlasToolBase } from "../atlasTool.js"; import type { ToolArgs, OperationType } from "../../tool.js"; @@ -10,13 +9,18 @@ import type { PaginatedFlexClusters20241113, } from "../../../common/atlas/openapi.js"; import { formatCluster, formatFlexCluster } from "../../../common/atlas/cluster.js"; +import { AtlasArgs } from "../../args.js"; + +export const ListClustersArgs = { + projectId: AtlasArgs.projectId().describe("Atlas project ID to filter clusters").optional(), +}; export class ListClustersTool extends AtlasToolBase { public name = "atlas-list-clusters"; protected description = "List MongoDB Atlas clusters"; public operationType: OperationType = "read"; protected argsShape = { - projectId: z.string().describe("Atlas project ID to filter clusters").optional(), + ...ListClustersArgs, }; protected async execute({ projectId }: ToolArgs): Promise { diff --git a/src/tools/atlas/read/listDBUsers.ts b/src/tools/atlas/read/listDBUsers.ts index 26bb28b93..5ab23250c 100644 --- a/src/tools/atlas/read/listDBUsers.ts +++ b/src/tools/atlas/read/listDBUsers.ts @@ -1,16 +1,20 @@ -import { z } from "zod"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { AtlasToolBase } from "../atlasTool.js"; import type { ToolArgs, OperationType } from "../../tool.js"; import { formatUntrustedData } from "../../tool.js"; import type { DatabaseUserRole, UserScope } from "../../../common/atlas/openapi.js"; +import { AtlasArgs } from "../../args.js"; + +export const ListDBUsersArgs = { + projectId: AtlasArgs.projectId().describe("Atlas project ID to filter DB users"), +}; export class ListDBUsersTool extends AtlasToolBase { public name = "atlas-list-db-users"; protected description = "List MongoDB Atlas database users"; public operationType: OperationType = "read"; protected argsShape = { - projectId: z.string().describe("Atlas project ID to filter DB users"), + ...ListDBUsersArgs, }; protected async execute({ projectId }: ToolArgs): Promise { diff --git a/src/tools/atlas/read/listProjects.ts b/src/tools/atlas/read/listProjects.ts index d5d3931b0..3b7d24939 100644 --- a/src/tools/atlas/read/listProjects.ts +++ b/src/tools/atlas/read/listProjects.ts @@ -2,15 +2,19 @@ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { AtlasToolBase } from "../atlasTool.js"; import type { OperationType } from "../../tool.js"; import { formatUntrustedData } from "../../tool.js"; -import { z } from "zod"; import type { ToolArgs } from "../../tool.js"; +import { AtlasArgs } from "../../args.js"; + +export const ListProjectsArgs = { + orgId: AtlasArgs.organizationId().describe("Atlas organization ID to filter projects").optional(), +}; export class ListProjectsTool extends AtlasToolBase { public name = "atlas-list-projects"; protected description = "List MongoDB Atlas projects"; public operationType: OperationType = "read"; protected argsShape = { - orgId: z.string().describe("Atlas organization ID to filter projects").optional(), + ...ListProjectsArgs, }; protected async execute({ orgId }: ToolArgs): Promise { diff --git a/tests/unit/args.test.ts b/tests/unit/args.test.ts new file mode 100644 index 000000000..d7a5a1eb4 --- /dev/null +++ b/tests/unit/args.test.ts @@ -0,0 +1,397 @@ +import { describe, expect, it } from "vitest"; +import { + AtlasArgs, + CommonArgs, + ALLOWED_PROJECT_NAME_CHARACTERS_ERROR, + ALLOWED_USERNAME_CHARACTERS_ERROR, + ALLOWED_REGION_CHARACTERS_ERROR, + ALLOWED_CLUSTER_NAME_CHARACTERS_ERROR, + NO_UNICODE_ERROR, +} from "../../src/tools/args.js"; + +describe("Tool args", () => { + describe("CommonArgs", () => { + describe("string", () => { + it("should return a ZodString schema", () => { + const schema = CommonArgs.string(); + expect(schema).toBeDefined(); + expect(schema.parse("test")).toBe("test"); + }); + + it("should accept any string value", () => { + const schema = CommonArgs.string(); + expect(schema.parse("hello")).toBe("hello"); + expect(schema.parse("123")).toBe("123"); + expect(schema.parse("test@#$%")).toBe("test@#$%"); + }); + + it("should not allow special characters and unicode symbols", () => { + const schema = CommonArgs.string(); + + // Unicode characters + expect(() => schema.parse("héllo")).toThrow(NO_UNICODE_ERROR); + expect(() => schema.parse("测试")).toThrow(NO_UNICODE_ERROR); + expect(() => schema.parse("café")).toThrow(NO_UNICODE_ERROR); + + // Emojis + expect(() => schema.parse("🚀")).toThrow(NO_UNICODE_ERROR); + expect(() => schema.parse("hello😀")).toThrow(NO_UNICODE_ERROR); + + // Control characters (below ASCII 32) + expect(() => schema.parse("hello\nworld")).toThrow(NO_UNICODE_ERROR); + expect(() => schema.parse("hello\tworld")).toThrow(NO_UNICODE_ERROR); + expect(() => schema.parse("hello\0world")).toThrow(NO_UNICODE_ERROR); + + // Extended ASCII characters (above ASCII 126) + expect(() => schema.parse("hello\x80")).toThrow(NO_UNICODE_ERROR); + expect(() => schema.parse("hello\xFF")).toThrow(NO_UNICODE_ERROR); + }); + + it("should reject non-string values", () => { + const schema = CommonArgs.string(); + expect(() => schema.parse(123)).toThrow(); + expect(() => schema.parse(null)).toThrow(); + expect(() => schema.parse(undefined)).toThrow(); + expect(() => schema.parse({})).toThrow(); + }); + }); + + describe("objectId", () => { + it("should validate 24-character hexadecimal strings", () => { + const schema = CommonArgs.objectId("Test ID"); + const validId = "507f1f77bcf86cd799439011"; + expect(schema.parse(validId)).toBe(validId); + }); + + it("should reject invalid ObjectId formats", () => { + const schema = CommonArgs.objectId("Test ID"); + + // Too short + expect(() => schema.parse("507f1f77bcf86cd79943901")).toThrow(); + + // Too long + expect(() => schema.parse("507f1f77bcf86cd7994390111")).toThrow(); + + // Invalid characters + expect(() => schema.parse("507f1f77bcf86cd79943901g")).toThrow(); + expect(() => schema.parse("507f1f77bcf86cd79943901!")).toThrow(); + + // Empty string + expect(() => schema.parse("")).toThrow(); + }); + + it("should provide custom field name in error messages", () => { + const schema = CommonArgs.objectId("Custom Field"); + expect(() => schema.parse("invalid")).toThrow("Custom Field must be exactly 24 characters"); + }); + + it("should not fail if the value is optional", () => { + const schema = CommonArgs.objectId("Custom Field").optional(); + expect(schema.parse(undefined)).toBeUndefined(); + }); + + it("should not fail if the value is empty", () => { + const schema = CommonArgs.objectId("Custom Field"); + expect(() => schema.parse(undefined)).toThrow("Required"); + }); + }); + }); + + describe("AtlasArgs", () => { + describe("projectId", () => { + it("should validate project IDs", () => { + const schema = AtlasArgs.projectId(); + const validId = "507f1f77bcf86cd799439011"; + expect(schema.parse(validId)).toBe(validId); + }); + + it("should reject invalid project IDs", () => { + const schema = AtlasArgs.projectId(); + expect(() => schema.parse("invalid")).toThrow("projectId must be exactly 24 characters"); + expect(() => schema.parse("507f1f77bc*86cd79943901")).toThrow( + "projectId must contain only hexadecimal characters" + ); + expect(() => schema.parse("")).toThrow("projectId is required"); + expect(() => schema.parse("507f1f77/bcf86cd799439011")).toThrow( + "projectId must contain only hexadecimal characters" + ); + }); + }); + + describe("organizationId", () => { + it("should validate organization IDs", () => { + const schema = AtlasArgs.organizationId(); + const validId = "507f1f77bcf86cd799439011"; + expect(schema.parse(validId)).toBe(validId); + }); + + it("should reject invalid organization IDs", () => { + const schema = AtlasArgs.organizationId(); + expect(() => schema.parse("invalid")).toThrow("organizationId must be exactly 24 characters"); + }); + }); + + describe("clusterName", () => { + it("should validate valid cluster names", () => { + const schema = AtlasArgs.clusterName(); + const validNames = ["my-cluster", "cluster_1", "Cluster123", "test-cluster-2", "my_cluster_name"]; + + validNames.forEach((name) => { + expect(schema.parse(name)).toBe(name); + }); + }); + + it("should reject invalid cluster names", () => { + const schema = AtlasArgs.clusterName(); + + // Empty string + expect(() => schema.parse("")).toThrow("Cluster name is required"); + + // Too long (over 64 characters) + const longName = "a".repeat(65); + expect(() => schema.parse(longName)).toThrow("Cluster name must be 64 characters or less"); + + // Invalid characters + expect(() => schema.parse("cluster@name")).toThrow(ALLOWED_CLUSTER_NAME_CHARACTERS_ERROR); + expect(() => schema.parse("cluster name")).toThrow(ALLOWED_CLUSTER_NAME_CHARACTERS_ERROR); + expect(() => schema.parse("cluster.name")).toThrow(ALLOWED_CLUSTER_NAME_CHARACTERS_ERROR); + expect(() => schema.parse("cluster/name")).toThrow(ALLOWED_CLUSTER_NAME_CHARACTERS_ERROR); + }); + + it("should accept exactly 64 characters", () => { + const schema = AtlasArgs.clusterName(); + const maxLengthName = "a".repeat(64); + expect(schema.parse(maxLengthName)).toBe(maxLengthName); + }); + }); + + describe("username", () => { + it("should validate valid usernames", () => { + const schema = AtlasArgs.username(); + const validUsernames = ["user123", "user_name", "user.name", "user-name", "User123", "test.user_name"]; + + validUsernames.forEach((username) => { + expect(schema.parse(username)).toBe(username); + }); + }); + + it("should reject invalid usernames", () => { + const schema = AtlasArgs.username(); + + // Empty string + expect(() => schema.parse("")).toThrow("Username is required"); + + // Too long (over 100 characters) + const longUsername = "a".repeat(101); + expect(() => schema.parse(longUsername)).toThrow("Username must be 100 characters or less"); + + // Invalid characters + expect(() => schema.parse("user@name")).toThrow(ALLOWED_USERNAME_CHARACTERS_ERROR); + expect(() => schema.parse("user name")).toThrow(ALLOWED_USERNAME_CHARACTERS_ERROR); + }); + + it("should accept exactly 100 characters", () => { + const schema = AtlasArgs.username(); + const maxLengthUsername = "a".repeat(100); + expect(schema.parse(maxLengthUsername)).toBe(maxLengthUsername); + }); + }); + + describe("ipAddress", () => { + it("should validate valid IPv4 addresses", () => { + const schema = AtlasArgs.ipAddress(); + const validIPs = ["192.168.1.1", "10.0.0.1", "172.16.0.1", "127.0.0.1", "0.0.0.0", "255.255.255.255"]; + + validIPs.forEach((ip) => { + expect(schema.parse(ip)).toBe(ip); + }); + }); + + it("should reject invalid IP addresses", () => { + const schema = AtlasArgs.ipAddress(); + + // Invalid formats + expect(() => schema.parse("192.168.1")).toThrow(); + expect(() => schema.parse("192.168.1.1.1")).toThrow(); + expect(() => schema.parse("192.168.1.256")).toThrow(); + expect(() => schema.parse("192.168.1.-1")).toThrow(); + expect(() => schema.parse("not-an-ip")).toThrow(); + + // IPv6 (should be rejected since we only support IPv4) + expect(() => schema.parse("2001:0db8:85a3:0000:0000:8a2e:0370:7334")).toThrow(); + }); + }); + + describe("cidrBlock", () => { + it("should validate valid CIDR blocks", () => { + const schema = AtlasArgs.cidrBlock(); + const validCIDRs = ["192.168.1.0/24", "10.0.0.0/8", "172.16.0.0/12", "0.0.0.0/0", "192.168.1.1/32"]; + + validCIDRs.forEach((cidr) => { + expect(schema.parse(cidr)).toBe(cidr); + }); + }); + + it("should reject invalid CIDR blocks", () => { + const schema = AtlasArgs.cidrBlock(); + + // Invalid formats + expect(() => schema.parse("192.168.1.0")).toThrow("Invalid cidr"); + expect(() => schema.parse("192.168.1.0/")).toThrow("Invalid cidr"); + expect(() => schema.parse("192.168.1.0/33")).toThrow("Invalid cidr"); + expect(() => schema.parse("192.168.1.256/24")).toThrow("Invalid cidr"); + expect(() => schema.parse("not-a-cidr")).toThrow("Invalid cidr"); + }); + }); + + describe("region", () => { + it("should validate valid region names", () => { + const schema = AtlasArgs.region(); + const validRegions = [ + "US_EAST_1", + "us-west-2", + "eu-central-1", + "ap-southeast-1", + "region_123", + "test-region", + ]; + + validRegions.forEach((region) => { + expect(schema.parse(region)).toBe(region); + }); + }); + + it("should accept exactly 50 characters", () => { + const schema = AtlasArgs.region(); + const maxLengthRegion = "a".repeat(50); + expect(schema.parse(maxLengthRegion)).toBe(maxLengthRegion); + }); + + it("should reject invalid region names", () => { + const schema = AtlasArgs.region(); + + // Empty string + expect(() => schema.parse("")).toThrow("Region is required"); + + // Too long (over 50 characters) + const longRegion = "a".repeat(51); + expect(() => schema.parse(longRegion)).toThrow("Region must be 50 characters or less"); + + // Invalid characters + expect(() => schema.parse("US EAST 1")).toThrow(ALLOWED_REGION_CHARACTERS_ERROR); + expect(() => schema.parse("US.EAST.1")).toThrow(ALLOWED_REGION_CHARACTERS_ERROR); + expect(() => schema.parse("US@EAST#1")).toThrow(ALLOWED_REGION_CHARACTERS_ERROR); + }); + }); + + describe("projectName", () => { + it("should validate valid project names", () => { + const schema = AtlasArgs.projectName(); + const validNames = [ + "my-project", + "project_1", + "Project123", + "test-project-2", + "my_project_name", + "project with spaces", + "project(with)parentheses", + "project@with@at", + "project&with&ersand", + "project+with+plus", + "project:with:colon", + "project.with.dots", + "project'with'apostrophe", + "project,with,comma", + "complex project (with) @all &symbols+here:test.name'value,", + ]; + + validNames.forEach((name) => { + expect(schema.parse(name)).toBe(name); + }); + }); + + it("should reject invalid project names", () => { + const schema = AtlasArgs.projectName(); + + // Empty string + expect(() => schema.parse("")).toThrow("Project name is required"); + + // Too long (over 64 characters) + expect(() => schema.parse("a".repeat(65))).toThrow("Project name must be 64 characters or less"); + + // Invalid characters not in the allowed set + expect(() => schema.parse("project#with#hash")).toThrow(ALLOWED_PROJECT_NAME_CHARACTERS_ERROR); + expect(() => schema.parse("project$with$dollar")).toThrow(ALLOWED_PROJECT_NAME_CHARACTERS_ERROR); + expect(() => schema.parse("project!with!exclamation")).toThrow(ALLOWED_PROJECT_NAME_CHARACTERS_ERROR); + expect(() => schema.parse("project[with]brackets")).toThrow(ALLOWED_PROJECT_NAME_CHARACTERS_ERROR); + }); + + it("should accept exactly 64 characters", () => { + const schema = AtlasArgs.projectName(); + const maxLengthName = "a".repeat(64); + expect(schema.parse(maxLengthName)).toBe(maxLengthName); + }); + }); + + describe("password", () => { + it("should validate valid passwords", () => { + const schema = AtlasArgs.password().optional(); + const validPasswords = ["password123", "password_123", "Password123", "test-password-123"]; + validPasswords.forEach((password) => { + expect(schema.parse(password)).toBe(password); + }); + expect(schema.parse(undefined)).toBeUndefined(); + }); + + it("should reject invalid passwords", () => { + const schema = AtlasArgs.password(); + expect(() => schema.parse("")).toThrow("Password is required"); + expect(() => schema.parse("a".repeat(101))).toThrow("Password must be 100 characters or less"); + }); + }); + }); + + describe("Edge Cases and Security", () => { + it("should handle empty strings appropriately", () => { + const schema = CommonArgs.string(); + expect(schema.parse("")).toBe(""); + + // But AtlasArgs validators should reject empty strings + expect(() => AtlasArgs.clusterName().parse("")).toThrow(); + expect(() => AtlasArgs.username().parse("")).toThrow(); + }); + + it("should handle very long strings", () => { + const schema = CommonArgs.string(); + const longString = "a".repeat(10000); + expect(schema.parse(longString)).toBe(longString); + + // But AtlasArgs validators should enforce length limits + expect(() => AtlasArgs.clusterName().parse("a".repeat(65))).toThrow(); + expect(() => AtlasArgs.username().parse("a".repeat(101))).toThrow(); + }); + + it("should handle null and undefined values", () => { + const schema = CommonArgs.string(); + expect(() => schema.parse(null)).toThrow(); + expect(() => schema.parse(undefined)).toThrow(); + }); + }); + + describe("Error Messages", () => { + it("should provide clear error messages for validation failures", () => { + // Test specific error messages + expect(() => AtlasArgs.clusterName().parse("")).toThrow("Cluster name is required"); + expect(() => AtlasArgs.clusterName().parse("a".repeat(65))).toThrow( + "Cluster name must be 64 characters or less" + ); + expect(() => AtlasArgs.clusterName().parse("invalid@name")).toThrow(ALLOWED_CLUSTER_NAME_CHARACTERS_ERROR); + + expect(() => AtlasArgs.username().parse("")).toThrow("Username is required"); + expect(() => AtlasArgs.username().parse("a".repeat(101))).toThrow( + "Username must be 100 characters or less" + ); + expect(() => AtlasArgs.username().parse("invalid name")).toThrow(ALLOWED_USERNAME_CHARACTERS_ERROR); + }); + }); +}); From ed8c19f6bab291b8f26d72709394ccd85b0143c1 Mon Sep 17 00:00:00 2001 From: Himanshu Singh Date: Thu, 11 Sep 2025 18:00:18 +0200 Subject: [PATCH 36/49] chore: update readme following sec recommendations MCP-198 (#547) --- README.md | 152 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 108 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index d508b755d..77617e389 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,9 @@ node -v ### Quick Start -**Note:** When using Atlas API credentials, be sure to assign only the minimum required permissions to your service account. See [Atlas API Permissions](#atlas-api-permissions) for details. +> **🔒 Security Recommendation 1:** When using Atlas API credentials, be sure to assign only the minimum required permissions to your service account. See [Atlas API Permissions](#atlas-api-permissions) for details. + +> **🔒 Security Recommendation 2:** For enhanced security, we strongly recommend using environment variables to pass sensitive configuration such as connection strings and API credentials instead of command line arguments. Command line arguments can be visible in process lists and logged in various system locations, potentially exposing your secrets. Environment variables provide a more secure way to handle sensitive information. Most MCP clients require a configuration file to be created or modified to add the MCP server. @@ -60,22 +62,19 @@ Note: The configuration file syntax can be different across clients. Please refe > **Default Safety Notice:** All examples below include `--readOnly` by default to ensure safe, read-only access to your data. Remove `--readOnly` if you need to enable write operations. -#### Option 1: Connection String args +#### Option 1: Connection String -You can pass your connection string via args, make sure to use a valid username and password. +You can pass your connection string via environment variables, make sure to use a valid username and password. ```json { "mcpServers": { "MongoDB": { "command": "npx", - "args": [ - "-y", - "mongodb-mcp-server", - "--connectionString", - "mongodb://localhost:27017/myDatabase", - "--readOnly" - ] + "args": ["-y", "mongodb-mcp-server@latest", "--readOnly"], + "env": { + "MDB_MCP_CONNECTION_STRING": "mongodb://localhost:27017/myDatabase" + } } } } @@ -83,7 +82,7 @@ You can pass your connection string via args, make sure to use a valid username NOTE: The connection string can be configured to connect to any MongoDB cluster, whether it's a local instance or an Atlas cluster. -#### Option 2: Atlas API credentials args +#### Option 2: Atlas API Credentials Use your Atlas API Service Accounts credentials. Must follow all the steps in [Atlas API Access](#atlas-api-access) section. @@ -92,43 +91,37 @@ Use your Atlas API Service Accounts credentials. Must follow all the steps in [A "mcpServers": { "MongoDB": { "command": "npx", - "args": [ - "-y", - "mongodb-mcp-server", - "--apiClientId", - "your-atlas-service-accounts-client-id", - "--apiClientSecret", - "your-atlas-service-accounts-client-secret", - "--readOnly" - ] + "args": ["-y", "mongodb-mcp-server@latest", "--readOnly"], + "env": { + "MDB_MCP_API_CLIENT_ID": "your-atlas-service-accounts-client-id", + "MDB_MCP_API_CLIENT_SECRET": "your-atlas-service-accounts-client-secret" + } } } } ``` -#### Option 3: Standalone Service using command arguments +#### Option 3: Standalone Service using environment variables and command line arguments -Start Server using npx command: +You can source environment variables defined in a config file or explicitly set them like we do in the example below and run the server via npx. ```shell - npx -y mongodb-mcp-server@latest --apiClientId="your-atlas-service-accounts-client-id" --apiClientSecret="your-atlas-service-accounts-client-secret" --readOnly -``` - -- For a complete list of arguments see [Configuration Options](#configuration-options) -- To configure your Atlas Service Accounts credentials please refer to [Atlas API Access](#atlas-api-access) - -#### Option 4: Standalone Service using environment variables +# Set your credentials as environment variables first +export MDB_MCP_API_CLIENT_ID="your-atlas-service-accounts-client-id" +export MDB_MCP_API_CLIENT_SECRET="your-atlas-service-accounts-client-secret" -```shell - npx -y mongodb-mcp-server@latest --readOnly +# Then start the server +npx -y mongodb-mcp-server@latest --readOnly ``` -You can use environment variables in the config file or set them and run the server via npx. +> **💡 Platform Note:** The examples above use Unix/Linux/macOS syntax. For Windows users, see [Environment Variables](#environment-variables) for platform-specific instructions. +- For a complete list of configuration options see [Configuration Options](#configuration-options) +- To configure your Atlas Service Accounts credentials please refer to [Atlas API Access](#atlas-api-access) - Connection String via environment variables in the MCP file [example](#connection-string-with-environment-variables) - Atlas API credentials via environment variables in the MCP file [example](#atlas-api-credentials-with-environment-variables) -#### Option 5: Using Docker +#### Option 4: Using Docker You can run the MongoDB MCP Server in a Docker container, which provides isolation and doesn't require a local Node.js installation. @@ -146,22 +139,35 @@ docker run --rm -i \ ##### Option B: With MongoDB connection string ```shell +# Set your credentials as environment variables first +export MDB_MCP_CONNECTION_STRING="mongodb+srv://username:password@cluster.mongodb.net/myDatabase" + +# Then start the docker container docker run --rm -i \ - -e MDB_MCP_CONNECTION_STRING="mongodb+srv://username:password@cluster.mongodb.net/myDatabase" \ + -e MDB_MCP_CONNECTION_STRING \ -e MDB_MCP_READ_ONLY="true" \ mongodb/mongodb-mcp-server:latest ``` +> **💡 Platform Note:** The examples above use Unix/Linux/macOS syntax. For Windows users, see [Environment Variables](#environment-variables) for platform-specific instructions. + ##### Option C: With Atlas API credentials ```shell +# Set your credentials as environment variables first +export MDB_MCP_API_CLIENT_ID="your-atlas-service-accounts-client-id" +export MDB_MCP_API_CLIENT_SECRET="your-atlas-service-accounts-client-secret" + +# Then start the docker container docker run --rm -i \ - -e MDB_MCP_API_CLIENT_ID="your-atlas-service-accounts-client-id" \ - -e MDB_MCP_API_CLIENT_SECRET="your-atlas-service-accounts-client-secret" \ + -e MDB_MCP_API_CLIENT_ID \ + -e MDB_MCP_API_CLIENT_SECRET \ -e MDB_MCP_READ_ONLY="true" \ mongodb/mongodb-mcp-server:latest ``` +> **💡 Platform Note:** The examples above use Unix/Linux/macOS syntax. For Windows users, see [Environment Variables](#environment-variables) for platform-specific instructions. + ##### Docker in MCP Configuration File Without options: @@ -196,11 +202,14 @@ With connection string: "--rm", "-i", "-e", - "MDB_MCP_CONNECTION_STRING=mongodb+srv://username:password@cluster.mongodb.net/myDatabase", + "MDB_MCP_CONNECTION_STRING", "-e", "MDB_MCP_READ_ONLY=true", "mongodb/mongodb-mcp-server:latest" - ] + ], + "env": { + "MDB_MCP_CONNECTION_STRING": "mongodb+srv://username:password@cluster.mongodb.net/myDatabase" + } } } } @@ -220,17 +229,21 @@ With Atlas API credentials: "-e", "MDB_MCP_READ_ONLY=true", "-e", - "MDB_MCP_API_CLIENT_ID=your-atlas-service-accounts-client-id", + "MDB_MCP_API_CLIENT_ID", "-e", - "MDB_MCP_API_CLIENT_SECRET=your-atlas-service-accounts-client-secret", + "MDB_MCP_API_CLIENT_SECRET", "mongodb/mongodb-mcp-server:latest" - ] + ], + "env": { + "MDB_MCP_API_CLIENT_ID": "your-atlas-service-accounts-client-id", + "MDB_MCP_API_CLIENT_SECRET": "your-atlas-service-accounts-client-secret" + } } } } ``` -#### Option 6: Running as an HTTP Server +#### Option 5: Running as an HTTP Server > **⚠️ Security Notice:** This server now supports Streamable HTTP transport for remote connections. **HTTP transport is NOT recommended for production use without implementing proper authentication and security measures.** @@ -316,6 +329,8 @@ NOTE: atlas tools are only available when you set credentials on [configuration] ## Configuration +> **🔒 Security Best Practice:** We strongly recommend using environment variables for sensitive configuration such as API credentials (`MDB_MCP_API_CLIENT_ID`, `MDB_MCP_API_CLIENT_SECRET`) and connection strings (`MDB_MCP_CONNECTION_STRING`) instead of command-line arguments. Environment variables are not visible in process lists and provide better security for your sensitive data. + The MongoDB MCP Server can be configured using multiple methods, with the following precedence (highest to lowest): 1. Command-line arguments @@ -361,6 +376,8 @@ You can combine multiple loggers, e.g. `--loggers disk stderr` or `export MDB_MC export MDB_MCP_LOGGERS="disk,stderr" ``` +> **💡 Platform Note:** For Windows users, see [Environment Variables](#environment-variables) for platform-specific instructions. + ##### Example: Set logger via command-line argument ```shell @@ -411,6 +428,8 @@ You can enable read-only mode using: - **Environment variable**: `export MDB_MCP_READ_ONLY=true` - **Command-line argument**: `--readOnly` +> **💡 Platform Note:** For Windows users, see [Environment Variables](#environment-variables) for platform-specific instructions. + When read-only mode is active, you'll see a message in the server logs indicating which tools were prevented from registering due to this restriction. #### Index Check Mode @@ -424,6 +443,8 @@ You can enable index check mode using: - **Environment variable**: `export MDB_MCP_INDEX_CHECK=true` - **Command-line argument**: `--indexCheck` +> **💡 Platform Note:** For Windows users, see [Environment Variables](#environment-variables) for platform-specific instructions. + When index check mode is active, you'll see an error message if a query is rejected due to not using an index. #### Exports @@ -447,6 +468,8 @@ You can disable telemetry using: - **Command-line argument**: `--telemetry disabled` - **DO_NOT_TRACK environment variable**: `export DO_NOT_TRACK=1` +> **💡 Platform Note:** For Windows users, see [Environment Variables](#environment-variables) for platform-specific instructions. + ### Atlas API Access To use the Atlas API tools, you'll need to create a service account in MongoDB Atlas: @@ -500,7 +523,9 @@ For a full list of roles and their privileges, see the [Atlas User Roles documen Set environment variables with the prefix `MDB_MCP_` followed by the option name in uppercase with underscores: -```shell +**Linux/macOS (bash/zsh):** + +```bash # Set Atlas API credentials (via Service Accounts) export MDB_MCP_API_CLIENT_ID="your-atlas-service-accounts-client-id" export MDB_MCP_API_CLIENT_SECRET="your-atlas-service-accounts-client-secret" @@ -508,8 +533,33 @@ export MDB_MCP_API_CLIENT_SECRET="your-atlas-service-accounts-client-secret" # Set a custom MongoDB connection string export MDB_MCP_CONNECTION_STRING="mongodb+srv://username:password@cluster.mongodb.net/myDatabase" +# Set log path export MDB_MCP_LOG_PATH="/path/to/logs" +``` +**Windows Command Prompt (cmd):** + +```cmd +set "MDB_MCP_API_CLIENT_ID=your-atlas-service-accounts-client-id" +set "MDB_MCP_API_CLIENT_SECRET=your-atlas-service-accounts-client-secret" + +set "MDB_MCP_CONNECTION_STRING=mongodb+srv://username:password@cluster.mongodb.net/myDatabase" + +set "MDB_MCP_LOG_PATH=C:\path\to\logs" +``` + +**Windows PowerShell:** + +```powershell +# Set Atlas API credentials (via Service Accounts) +$env:MDB_MCP_API_CLIENT_ID="your-atlas-service-accounts-client-id" +$env:MDB_MCP_API_CLIENT_SECRET="your-atlas-service-accounts-client-secret" + +# Set a custom MongoDB connection string +$env:MDB_MCP_CONNECTION_STRING="mongodb+srv://username:password@cluster.mongodb.net/myDatabase" + +# Set log path +$env:MDB_MCP_LOG_PATH="C:\path\to\logs" ``` #### MCP configuration file examples @@ -551,14 +601,26 @@ export MDB_MCP_LOG_PATH="/path/to/logs" Pass configuration options as command-line arguments when starting the server: +> **🔒 Security Note:** For sensitive configuration like API credentials and connection strings, use environment variables instead of command-line arguments. + ```shell -npx -y mongodb-mcp-server@latest --apiClientId="your-atlas-service-accounts-client-id" --apiClientSecret="your-atlas-service-accounts-client-secret" --connectionString="mongodb+srv://username:password@cluster.mongodb.net/myDatabase" --logPath=/path/to/logs --readOnly --indexCheck +# Set sensitive data as environment variable +export MDB_MCP_API_CLIENT_ID="your-atlas-service-accounts-client-id" +export MDB_MCP_API_CLIENT_SECRET="your-atlas-service-accounts-client-secret" +export MDB_MCP_CONNECTION_STRING="mongodb+srv://username:password@cluster.mongodb.net/myDatabase" + +# Start the server with command line arguments +npx -y mongodb-mcp-server@latest --logPath=/path/to/logs --readOnly --indexCheck ``` +> **💡 Platform Note:** The examples above use Unix/Linux/macOS syntax. For Windows users, see [Environment Variables](#environment-variables) for platform-specific instructions. + #### MCP configuration file examples ##### Connection String with command-line arguments +> **🔒 Security Note:** We do not recommend passing connection string as command line argument. Connection string might contain credentials which can be visible in process lists and logged in various system locations, potentially exposing your credentials. Instead configure [connection string through environment variables](#connection-string-with-environment-variables) + ```json { "mcpServers": { @@ -578,6 +640,8 @@ npx -y mongodb-mcp-server@latest --apiClientId="your-atlas-service-accounts-clie ##### Atlas API credentials with command-line arguments +> **🔒 Security Note:** We do not recommend passing Atlas API credentials as command line argument. The provided credentials can be visible in process lists and logged in various system locations, potentially exposing your credentials. Instead configure [Atlas API credentials through environment variables](#atlas-api-credentials-with-environment-variables) + ```json { "mcpServers": { From d6b84c7bdb2b482bd487ff574d98cfa70fdb8161 Mon Sep 17 00:00:00 2001 From: Himanshu Singh Date: Thu, 11 Sep 2025 18:08:56 +0200 Subject: [PATCH 37/49] fix: remove dependency on export tool input for generating export name MCP-189 (#543) --- src/common/exportsManager.ts | 24 +++++------------- src/resources/common/exportedData.ts | 7 +++++- src/tools/mongodb/read/export.ts | 2 +- .../resources/exportedData.test.ts | 4 +-- tests/unit/common/exportsManager.test.ts | 25 +++---------------- 5 files changed, 18 insertions(+), 44 deletions(-) diff --git a/src/common/exportsManager.ts b/src/common/exportsManager.ts index f83b07ee6..ad90f8cc2 100644 --- a/src/common/exportsManager.ts +++ b/src/common/exportsManager.ts @@ -127,7 +127,7 @@ export class ExportsManager extends EventEmitter { public async readExport(exportName: string): Promise { try { this.assertIsNotShuttingDown(); - exportName = decodeURIComponent(exportName); + exportName = decodeAndNormalize(exportName); const exportHandle = this.storedExports[exportName]; if (!exportHandle) { throw new Error("Requested export has either expired or does not exist."); @@ -163,7 +163,7 @@ export class ExportsManager extends EventEmitter { }): Promise { try { this.assertIsNotShuttingDown(); - const exportNameWithExtension = validateExportName(ensureExtension(exportName, "json")); + const exportNameWithExtension = decodeAndNormalize(ensureExtension(exportName, "json")); if (this.storedExports[exportNameWithExtension]) { return Promise.reject( new Error("Export with same name is either already available or being generated.") @@ -363,6 +363,10 @@ export class ExportsManager extends EventEmitter { } } +export function decodeAndNormalize(text: string): string { + return decodeURIComponent(text).normalize("NFKC"); +} + /** * Ensures the path ends with the provided extension */ export function ensureExtension(pathOrName: string, extension: string): string { @@ -373,22 +377,6 @@ export function ensureExtension(pathOrName: string, extension: string): string { return `${pathOrName}${extWithDot}`; } -/** - * Small utility to decoding and validating provided export name for path - * traversal or no extension */ -export function validateExportName(nameWithExtension: string): string { - const decodedName = decodeURIComponent(nameWithExtension); - if (!path.extname(decodedName)) { - throw new Error("Provided export name has no extension"); - } - - if (decodedName.includes("..") || decodedName.includes("/") || decodedName.includes("\\")) { - throw new Error("Invalid export name: path traversal hinted"); - } - - return decodedName; -} - export function isExportExpired(createdAt: number, exportTimeoutMs: number): boolean { return Date.now() - createdAt > exportTimeoutMs; } diff --git a/src/resources/common/exportedData.ts b/src/resources/common/exportedData.ts index b1b5ed2cf..2ae4ba80e 100644 --- a/src/resources/common/exportedData.ts +++ b/src/resources/common/exportedData.ts @@ -72,7 +72,12 @@ export class ExportedData { private autoCompleteExportName: CompleteResourceTemplateCallback = (value) => { try { return this.session.exportsManager.availableExports - .filter(({ exportName }) => exportName.startsWith(value)) + .filter(({ exportName, exportTitle }) => { + const lcExportName = exportName.toLowerCase(); + const lcExportTitle = exportTitle.toLowerCase(); + const lcValue = value.toLowerCase(); + return lcExportName.startsWith(lcValue) || lcExportTitle.includes(lcValue); + }) .map(({ exportName }) => exportName); } catch (error) { this.session.logger.error({ diff --git a/src/tools/mongodb/read/export.ts b/src/tools/mongodb/read/export.ts index 784f0e14f..e2ac194b3 100644 --- a/src/tools/mongodb/read/export.ts +++ b/src/tools/mongodb/read/export.ts @@ -81,7 +81,7 @@ export class ExportTool extends MongoDBToolBase { }); } - const exportName = `${database}.${collection}.${new ObjectId().toString()}.json`; + const exportName = `${new ObjectId().toString()}.json`; const { exportURI, exportPath } = await this.session.exportsManager.createJSONExport({ input: cursor, diff --git a/tests/integration/resources/exportedData.test.ts b/tests/integration/resources/exportedData.test.ts index df48f515a..394bed254 100644 --- a/tests/integration/resources/exportedData.test.ts +++ b/tests/integration/resources/exportedData.test.ts @@ -155,10 +155,10 @@ describeWithMongoDB( }, argument: { name: "exportName", - value: "b", + value: "big", }, }); - expect(completeResponse.completion.total).toEqual(1); + expect(completeResponse.completion.total).toBeGreaterThanOrEqual(1); }); }); }, diff --git a/tests/unit/common/exportsManager.test.ts b/tests/unit/common/exportsManager.test.ts index 264d3230a..81759e0ad 100644 --- a/tests/unit/common/exportsManager.test.ts +++ b/tests/unit/common/exportsManager.test.ts @@ -5,12 +5,7 @@ import type { FindCursor } from "mongodb"; import { Long } from "mongodb"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { ExportsManagerConfig } from "../../../src/common/exportsManager.js"; -import { - ensureExtension, - isExportExpired, - ExportsManager, - validateExportName, -} from "../../../src/common/exportsManager.js"; +import { ensureExtension, isExportExpired, ExportsManager } from "../../../src/common/exportsManager.js"; import type { AvailableExport } from "../../../src/common/exportsManager.js"; import { config } from "../../../src/common/config.js"; import { ROOT_DIR } from "../../accuracy/sdk/constants.js"; @@ -30,14 +25,10 @@ const exportsManagerConfig: ExportsManagerConfig = { function getExportNameAndPath({ uniqueExportsId = new ObjectId().toString(), uniqueFileId = new ObjectId().toString(), - database = "foo", - collection = "bar", }: | { uniqueExportsId?: string; uniqueFileId?: string; - database?: string; - collection?: string; } | undefined = {}): { sessionExportsPath: string; @@ -46,7 +37,7 @@ function getExportNameAndPath({ exportURI: string; uniqueExportsId: string; } { - const exportName = `${database}.${collection}.${uniqueFileId}.json`; + const exportName = `${uniqueFileId}.json`; // This is the exports directory for a session. const sessionExportsPath = path.join(exportsPath, uniqueExportsId); const exportPath = path.join(sessionExportsPath, exportName); @@ -248,7 +239,7 @@ describe("ExportsManager unit test", () => { }); it("should handle encoded name", async () => { - const { exportName, exportURI } = getExportNameAndPath({ database: "some database", collection: "coll" }); + const { exportName, exportURI } = getExportNameAndPath({ uniqueFileId: "1FOO 2BAR" }); const { cursor } = createDummyFindCursor([]); const exportAvailableNotifier = getExportAvailableNotifier(encodeURI(exportURI), manager); await manager.createJSONExport({ @@ -611,16 +602,6 @@ describe("#ensureExtension", () => { }); }); -describe("#validateExportName", () => { - it("should return decoded name when name is valid", () => { - expect(validateExportName(encodeURIComponent("Test Name.json"))).toEqual("Test Name.json"); - }); - it("should throw when name is invalid", () => { - expect(() => validateExportName("NoExtension")).toThrow("Provided export name has no extension"); - expect(() => validateExportName("../something.json")).toThrow("Invalid export name: path traversal hinted"); - }); -}); - describe("#isExportExpired", () => { it("should return true if export is expired", () => { const createdAt = Date.now() - 1000; From 02fe6a246552cc3e1f48d6be347c28fd127e76a3 Mon Sep 17 00:00:00 2001 From: Jeroen Vervaeke <9132134+jeroenvervaeke@users.noreply.github.com> Date: Fri, 12 Sep 2025 10:55:09 +0100 Subject: [PATCH 38/49] feat: Allow configuration of temporary user timeout when connecting to atlas cluster (#544) --- README.md | 39 ++++++++++++----------- src/common/config.ts | 21 +++++++++--- src/tools/atlas/connect/connectCluster.ts | 3 +- tests/unit/common/config.test.ts | 9 ++++++ 4 files changed, 46 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 77617e389..5948b6c70 100644 --- a/README.md +++ b/README.md @@ -338,25 +338,26 @@ The MongoDB MCP Server can be configured using multiple methods, with the follow ### Configuration Options -| CLI Option | Environment Variable | Default | Description | -| ------------------------- | ------------------------------------ | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `apiClientId` | `MDB_MCP_API_CLIENT_ID` | | Atlas API client ID for authentication. Required for running Atlas tools. | -| `apiClientSecret` | `MDB_MCP_API_CLIENT_SECRET` | | Atlas API client secret for authentication. Required for running Atlas tools. | -| `connectionString` | `MDB_MCP_CONNECTION_STRING` | | MongoDB connection string for direct database connections. Optional, if not set, you'll need to call the `connect` tool before interacting with MongoDB data. | -| `loggers` | `MDB_MCP_LOGGERS` | disk,mcp | Comma separated values, possible values are `mcp`, `disk` and `stderr`. See [Logger Options](#logger-options) for details. | -| `logPath` | `MDB_MCP_LOG_PATH` | see note\* | Folder to store logs. | -| `disabledTools` | `MDB_MCP_DISABLED_TOOLS` | | An array of tool names, operation types, and/or categories of tools that will be disabled. | -| `readOnly` | `MDB_MCP_READ_ONLY` | false | When set to true, only allows read, connect, and metadata operation types, disabling create/update/delete operations. | -| `indexCheck` | `MDB_MCP_INDEX_CHECK` | false | When set to true, enforces that query operations must use an index, rejecting queries that perform a collection scan. | -| `telemetry` | `MDB_MCP_TELEMETRY` | enabled | When set to disabled, disables telemetry collection. | -| `transport` | `MDB_MCP_TRANSPORT` | stdio | Either 'stdio' or 'http'. | -| `httpPort` | `MDB_MCP_HTTP_PORT` | 3000 | Port number. | -| `httpHost` | `MDB_MCP_HTTP_HOST` | 127.0.0.1 | Host to bind the http server. | -| `idleTimeoutMs` | `MDB_MCP_IDLE_TIMEOUT_MS` | 600000 | Idle timeout for a client to disconnect (only applies to http transport). | -| `notificationTimeoutMs` | `MDB_MCP_NOTIFICATION_TIMEOUT_MS` | 540000 | Notification timeout for a client to be aware of diconnect (only applies to http transport). | -| `exportsPath` | `MDB_MCP_EXPORTS_PATH` | see note\* | Folder to store exported data files. | -| `exportTimeoutMs` | `MDB_MCP_EXPORT_TIMEOUT_MS` | 300000 | Time in milliseconds after which an export is considered expired and eligible for cleanup. | -| `exportCleanupIntervalMs` | `MDB_MCP_EXPORT_CLEANUP_INTERVAL_MS` | 120000 | Time in milliseconds between export cleanup cycles that remove expired export files. | +| CLI Option | Environment Variable | Default | Description | +| -------------------------------------- | --------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `apiClientId` | `MDB_MCP_API_CLIENT_ID` | | Atlas API client ID for authentication. Required for running Atlas tools. | +| `apiClientSecret` | `MDB_MCP_API_CLIENT_SECRET` | | Atlas API client secret for authentication. Required for running Atlas tools. | +| `connectionString` | `MDB_MCP_CONNECTION_STRING` | | MongoDB connection string for direct database connections. Optional, if not set, you'll need to call the `connect` tool before interacting with MongoDB data. | +| `loggers` | `MDB_MCP_LOGGERS` | disk,mcp | Comma separated values, possible values are `mcp`, `disk` and `stderr`. See [Logger Options](#logger-options) for details. | +| `logPath` | `MDB_MCP_LOG_PATH` | see note\* | Folder to store logs. | +| `disabledTools` | `MDB_MCP_DISABLED_TOOLS` | | An array of tool names, operation types, and/or categories of tools that will be disabled. | +| `readOnly` | `MDB_MCP_READ_ONLY` | false | When set to true, only allows read, connect, and metadata operation types, disabling create/update/delete operations. | +| `indexCheck` | `MDB_MCP_INDEX_CHECK` | false | When set to true, enforces that query operations must use an index, rejecting queries that perform a collection scan. | +| `telemetry` | `MDB_MCP_TELEMETRY` | enabled | When set to disabled, disables telemetry collection. | +| `transport` | `MDB_MCP_TRANSPORT` | stdio | Either 'stdio' or 'http'. | +| `httpPort` | `MDB_MCP_HTTP_PORT` | 3000 | Port number. | +| `httpHost` | `MDB_MCP_HTTP_HOST` | 127.0.0.1 | Host to bind the http server. | +| `idleTimeoutMs` | `MDB_MCP_IDLE_TIMEOUT_MS` | 600000 | Idle timeout for a client to disconnect (only applies to http transport). | +| `notificationTimeoutMs` | `MDB_MCP_NOTIFICATION_TIMEOUT_MS` | 540000 | Notification timeout for a client to be aware of diconnect (only applies to http transport). | +| `exportsPath` | `MDB_MCP_EXPORTS_PATH` | see note\* | Folder to store exported data files. | +| `exportTimeoutMs` | `MDB_MCP_EXPORT_TIMEOUT_MS` | 300000 | Time in milliseconds after which an export is considered expired and eligible for cleanup. | +| `exportCleanupIntervalMs` | `MDB_MCP_EXPORT_CLEANUP_INTERVAL_MS` | 120000 | Time in milliseconds between export cleanup cycles that remove expired export files. | +| `atlasTemporaryDatabaseUserLifetimeMs` | `MDB_MCP_ATLAS_TEMPORARY_DATABASE_USER_LIFETIME_MS` | 14400000 | Time in milliseconds that temporary database users created when connecting to MongoDB Atlas clusters will remain active before being automatically deleted. | #### Logger Options diff --git a/src/common/config.ts b/src/common/config.ts index 9132a6c6f..90d1fc807 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -48,6 +48,7 @@ const OPTIONS = { "tlsCertificateSelector", "tlsDisabledProtocols", "username", + "atlasTemporaryDatabaseUserLifetimeMs", ], boolean: [ "apiDeprecationErrors", @@ -90,7 +91,15 @@ const OPTIONS = { "greedy-arrays": true, "short-option-groups": false, }, -} as const; +} as Readonly; + +interface Options { + string: string[]; + boolean: string[]; + array: string[]; + alias: Record; + configuration: Record; +} const ALL_CONFIG_KEYS = new Set( (OPTIONS.string as readonly string[]) @@ -161,14 +170,15 @@ export interface UserConfig extends CliOptions { loggers: Array<"stderr" | "disk" | "mcp">; idleTimeoutMs: number; notificationTimeoutMs: number; + atlasTemporaryDatabaseUserLifetimeMs: number; } export const defaultUserConfig: UserConfig = { apiBaseUrl: "https://cloud.mongodb.com/", logPath: getLogPath(), exportsPath: getExportsPath(), - exportTimeoutMs: 300000, // 5 minutes - exportCleanupIntervalMs: 120000, // 2 minutes + exportTimeoutMs: 5 * 60 * 1000, // 5 minutes + exportCleanupIntervalMs: 2 * 60 * 1000, // 2 minutes disabledTools: [], telemetry: "enabled", readOnly: false, @@ -177,9 +187,10 @@ export const defaultUserConfig: UserConfig = { httpPort: 3000, httpHost: "127.0.0.1", loggers: ["disk", "mcp"], - idleTimeoutMs: 600000, // 10 minutes - notificationTimeoutMs: 540000, // 9 minutes + idleTimeoutMs: 10 * 60 * 1000, // 10 minutes + notificationTimeoutMs: 9 * 60 * 1000, // 9 minutes httpHeaders: {}, + atlasTemporaryDatabaseUserLifetimeMs: 4 * 60 * 60 * 1000, // 4 hours }; export const config = setupUserConfig({ diff --git a/src/tools/atlas/connect/connectCluster.ts b/src/tools/atlas/connect/connectCluster.ts index 1baf0c6f7..54f3ae8bd 100644 --- a/src/tools/atlas/connect/connectCluster.ts +++ b/src/tools/atlas/connect/connectCluster.ts @@ -9,7 +9,6 @@ import type { AtlasClusterConnectionInfo } from "../../../common/connectionManag import { getDefaultRoleFromConfig } from "../../../common/atlas/roles.js"; import { AtlasArgs } from "../../args.js"; -const EXPIRY_MS = 1000 * 60 * 60 * 12; // 12 hours const addedIpAccessListMessage = "Note: Your current IP address has been added to the Atlas project's IP access list to enable secure connection."; @@ -81,7 +80,7 @@ export class ConnectClusterTool extends AtlasToolBase { const username = `mcpUser${Math.floor(Math.random() * 100000)}`; const password = await generateSecurePassword(); - const expiryDate = new Date(Date.now() + EXPIRY_MS); + const expiryDate = new Date(Date.now() + this.config.atlasTemporaryDatabaseUserLifetimeMs); const role = getDefaultRoleFromConfig(this.config); await this.session.apiClient.createDatabaseUser({ diff --git a/tests/unit/common/config.test.ts b/tests/unit/common/config.test.ts index a497cb331..9e0a739f1 100644 --- a/tests/unit/common/config.test.ts +++ b/tests/unit/common/config.test.ts @@ -41,6 +41,11 @@ describe("config", () => { { envVar: "MDB_MCP_HTTP_HOST", property: "httpHost", value: "localhost" }, { envVar: "MDB_MCP_IDLE_TIMEOUT_MS", property: "idleTimeoutMs", value: 5000 }, { envVar: "MDB_MCP_NOTIFICATION_TIMEOUT_MS", property: "notificationTimeoutMs", value: 5000 }, + { + envVar: "MDB_MCP_ATLAS_TEMPORARY_DATABASE_USER_LIFETIME_MS", + property: "atlasTemporaryDatabaseUserLifetimeMs", + value: 12345, + }, ] as const; for (const { envVar, property, value } of testCases) { @@ -129,6 +134,10 @@ describe("config", () => { cli: ["--notificationTimeoutMs", "42"], expected: { notificationTimeoutMs: "42" }, }, + { + cli: ["--atlasTemporaryDatabaseUserLifetimeMs", "12345"], + expected: { atlasTemporaryDatabaseUserLifetimeMs: "12345" }, + }, { cli: ["--telemetry", "enabled"], expected: { telemetry: "enabled" }, From e71e2ba564c95c94c4f2d5539d5e95380367c45a Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Fri, 12 Sep 2025 13:41:00 +0300 Subject: [PATCH 39/49] fix: add untrusted data wrapper to the export resource MCP-197 (#550) --- src/common/exportsManager.ts | 75 +++++++++++-------- src/resources/common/exportedData.ts | 9 ++- .../resources/exportedData.test.ts | 37 +++++---- tests/unit/common/exportsManager.test.ts | 14 ++-- 4 files changed, 82 insertions(+), 53 deletions(-) diff --git a/src/common/exportsManager.ts b/src/common/exportsManager.ts index ad90f8cc2..f8ce94501 100644 --- a/src/common/exportsManager.ts +++ b/src/common/exportsManager.ts @@ -27,6 +27,7 @@ interface CommonExportData { interface ReadyExport extends CommonExportData { exportStatus: "ready"; exportCreatedAt: number; + docsTransformed: number; } interface InProgressExport extends CommonExportData { @@ -124,7 +125,7 @@ export class ExportsManager extends EventEmitter { } } - public async readExport(exportName: string): Promise { + public async readExport(exportName: string): Promise<{ content: string; docsTransformed: number }> { try { this.assertIsNotShuttingDown(); exportName = decodeAndNormalize(exportName); @@ -137,9 +138,12 @@ export class ExportsManager extends EventEmitter { throw new Error("Requested export is still being generated. Try again later."); } - const { exportPath } = exportHandle; + const { exportPath, docsTransformed } = exportHandle; - return fs.readFile(exportPath, { encoding: "utf8", signal: this.shutdownController.signal }); + return { + content: await fs.readFile(exportPath, { encoding: "utf8", signal: this.shutdownController.signal }), + docsTransformed, + }; } catch (error) { this.logger.error({ id: LogId.exportReadError, @@ -202,17 +206,15 @@ export class ExportsManager extends EventEmitter { }): Promise { try { let pipeSuccessful = false; + let docsTransformed = 0; try { await fs.mkdir(this.exportsDirectoryPath, { recursive: true }); const outputStream = createWriteStream(inProgressExport.exportPath); - await pipeline( - [ - input.stream(), - this.docToEJSONStream(this.getEJSONOptionsForFormat(jsonExportFormat)), - outputStream, - ], - { signal: this.shutdownController.signal } - ); + const ejsonTransform = this.docToEJSONStream(this.getEJSONOptionsForFormat(jsonExportFormat)); + await pipeline([input.stream(), ejsonTransform, outputStream], { + signal: this.shutdownController.signal, + }); + docsTransformed = ejsonTransform.docsTransformed; pipeSuccessful = true; } catch (error) { // If the pipeline errors out then we might end up with @@ -231,6 +233,7 @@ export class ExportsManager extends EventEmitter { ...inProgressExport, exportCreatedAt: Date.now(), exportStatus: "ready", + docsTransformed, }; this.emit("export-available", inProgressExport.exportURI); } @@ -256,33 +259,39 @@ export class ExportsManager extends EventEmitter { } } - private docToEJSONStream(ejsonOptions: EJSONOptions | undefined): Transform { + private docToEJSONStream(ejsonOptions: EJSONOptions | undefined): Transform & { docsTransformed: number } { let docsTransformed = 0; - return new Transform({ - objectMode: true, - transform(chunk: unknown, encoding, callback): void { - try { - const doc = EJSON.stringify(chunk, undefined, undefined, ejsonOptions); + const result = Object.assign( + new Transform({ + objectMode: true, + transform(chunk: unknown, encoding, callback): void { + try { + const doc = EJSON.stringify(chunk, undefined, undefined, ejsonOptions); + if (docsTransformed === 0) { + this.push("[" + doc); + } else { + this.push(",\n" + doc); + } + docsTransformed++; + callback(); + } catch (err) { + callback(err as Error); + } + }, + flush(callback): void { if (docsTransformed === 0) { - this.push("[" + doc); + this.push("[]"); } else { - this.push(",\n" + doc); + this.push("]"); } - docsTransformed++; + result.docsTransformed = docsTransformed; callback(); - } catch (err) { - callback(err as Error); - } - }, - flush(callback): void { - if (docsTransformed === 0) { - this.push("[]"); - } else { - this.push("]"); - } - callback(); - }, - }); + }, + }), + { docsTransformed } + ); + + return result; } private async cleanupExpiredExports(): Promise { diff --git a/src/resources/common/exportedData.ts b/src/resources/common/exportedData.ts index 2ae4ba80e..7fed7dbab 100644 --- a/src/resources/common/exportedData.ts +++ b/src/resources/common/exportedData.ts @@ -7,6 +7,7 @@ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js"; import type { Server } from "../../server.js"; import { LogId } from "../../common/logger.js"; import type { Session } from "../../common/session.js"; +import { formatUntrustedData } from "../../tools/tool.js"; export class ExportedData { private readonly name = "exported-data"; @@ -95,13 +96,17 @@ export class ExportedData { throw new Error("Cannot retrieve exported data, exportName not provided."); } - const content = await this.session.exportsManager.readExport(exportName); + const { content, docsTransformed } = await this.session.exportsManager.readExport(exportName); + + const text = formatUntrustedData(`The exported data contains ${docsTransformed} documents.`, content) + .map((t) => t.text) + .join("\n"); return { contents: [ { uri: url.href, - text: content, + text, mimeType: "application/json", }, ], diff --git a/tests/integration/resources/exportedData.test.ts b/tests/integration/resources/exportedData.test.ts index 394bed254..6e361bf03 100644 --- a/tests/integration/resources/exportedData.test.ts +++ b/tests/integration/resources/exportedData.test.ts @@ -1,9 +1,9 @@ import path from "path"; import fs from "fs/promises"; -import { Long } from "bson"; +import { EJSON, Long, ObjectId } from "bson"; import { describe, expect, it, beforeEach, afterAll } from "vitest"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; -import { defaultTestConfig, resourceChangedNotification, timeout } from "../helpers.js"; +import { defaultTestConfig, getDataFromUntrustedContent, resourceChangedNotification, timeout } from "../helpers.js"; import { describeWithMongoDB } from "../tools/mongodb/mongodbHelpers.js"; import { contentWithResourceURILink } from "../tools/mongodb/read/export.test.js"; import type { UserConfig } from "../../../src/lib.js"; @@ -18,15 +18,17 @@ const userConfig: UserConfig = { describeWithMongoDB( "exported-data resource", (integration) => { + let docs: { _id: ObjectId; name: string; longNumber?: Long; bigInt?: Long }[]; + let collection: string; + beforeEach(async () => { const mongoClient = integration.mongoClient(); - await mongoClient - .db("db") - .collection("coll") - .insertMany([ - { name: "foo", longNumber: new Long(1234) }, - { name: "bar", bigInt: new Long(123412341234) }, - ]); + collection = new ObjectId().toString(); + docs = [ + { name: "foo", longNumber: new Long(1234), _id: new ObjectId() }, + { name: "bar", bigInt: new Long(123412341234), _id: new ObjectId() }, + ]; + await mongoClient.db("db").collection(collection).insertMany(docs); }); afterAll(async () => { @@ -67,7 +69,7 @@ describeWithMongoDB( name: "export", arguments: { database: "db", - collection: "coll", + collection, exportTitle: "Export for db.coll", exportTarget: [{ name: "find", arguments: {} }], }, @@ -106,7 +108,7 @@ describeWithMongoDB( name: "export", arguments: { database: "db", - collection: "coll", + collection, exportTitle: "Export for db.coll", exportTarget: [{ name: "find", arguments: {} }], }, @@ -125,7 +127,16 @@ describeWithMongoDB( }); expect(response.isError).toBeFalsy(); expect(response.contents[0]?.mimeType).toEqual("application/json"); - expect(response.contents[0]?.text).toContain("foo"); + + expect(response.contents[0]?.text).toContain(`The exported data contains ${docs.length} documents.`); + expect(response.contents[0]?.text).toContain(" { @@ -134,7 +145,7 @@ describeWithMongoDB( name: "export", arguments: { database: "big", - collection: "coll", + collection, exportTitle: "Export for big.coll", exportTarget: [{ name: "find", arguments: {} }], }, diff --git a/tests/unit/common/exportsManager.test.ts b/tests/unit/common/exportsManager.test.ts index 81759e0ad..bfc1eba18 100644 --- a/tests/unit/common/exportsManager.test.ts +++ b/tests/unit/common/exportsManager.test.ts @@ -235,7 +235,9 @@ describe("ExportsManager unit test", () => { jsonExportFormat: "relaxed", }); await exportAvailableNotifier; - expect(await manager.readExport(exportName)).toEqual("[]"); + const { content, docsTransformed } = await manager.readExport(exportName); + expect(content).toEqual("[]"); + expect(docsTransformed).toEqual(0); }); it("should handle encoded name", async () => { @@ -249,7 +251,9 @@ describe("ExportsManager unit test", () => { jsonExportFormat: "relaxed", }); await exportAvailableNotifier; - expect(await manager.readExport(encodeURIComponent(exportName))).toEqual("[]"); + const { content, docsTransformed } = await manager.readExport(encodeURIComponent(exportName)); + expect(content).toEqual("[]"); + expect(docsTransformed).toEqual(0); }); }); @@ -332,7 +336,7 @@ describe("ExportsManager unit test", () => { expect(emitSpy).toHaveBeenCalledWith("export-available", exportURI); // Exports relaxed json - const jsonData = JSON.parse(await manager.readExport(exportName)) as unknown[]; + const jsonData = JSON.parse((await manager.readExport(exportName)).content) as unknown[]; expect(jsonData).toEqual([]); }); }); @@ -366,7 +370,7 @@ describe("ExportsManager unit test", () => { expect(emitSpy).toHaveBeenCalledWith("export-available", `exported-data://${expectedExportName}`); // Exports relaxed json - const jsonData = JSON.parse(await manager.readExport(expectedExportName)) as unknown[]; + const jsonData = JSON.parse((await manager.readExport(expectedExportName)).content) as unknown[]; expect(jsonData).toContainEqual(expect.objectContaining({ name: "foo", longNumber: 12 })); expect(jsonData).toContainEqual(expect.objectContaining({ name: "bar", longNumber: 123456 })); }); @@ -401,7 +405,7 @@ describe("ExportsManager unit test", () => { expect(emitSpy).toHaveBeenCalledWith("export-available", `exported-data://${expectedExportName}`); // Exports relaxed json - const jsonData = JSON.parse(await manager.readExport(expectedExportName)) as unknown[]; + const jsonData = JSON.parse((await manager.readExport(expectedExportName)).content) as unknown[]; expect(jsonData).toContainEqual( expect.objectContaining({ name: "foo", longNumber: { $numberLong: "12" } }) ); From bcbf8894915a1d65d11864007464e18d02995bc7 Mon Sep 17 00:00:00 2001 From: Gagik Amaryan Date: Fri, 12 Sep 2025 15:39:54 +0200 Subject: [PATCH 40/49] feat(elicitation): add option to require user confirmation for tool calls with elicitation MCP-185 (#551) Adds an option to require confirmation for certain tools using the new elicitation API. This is not supported by most popular clients yet, only notably VSCode. --- README.md | 49 +-- src/common/config.ts | 10 + src/elicitation.ts | 53 +++ src/server.ts | 14 +- src/telemetry/types.ts | 1 + src/tools/atlas/create/createAccessList.ts | 27 ++ src/tools/atlas/create/createDBUser.ts | 18 + src/tools/mongodb/connect/connect.ts | 9 +- src/tools/mongodb/delete/deleteMany.ts | 14 + src/tools/mongodb/delete/dropCollection.ts | 8 + src/tools/mongodb/delete/dropDatabase.ts | 8 + src/tools/tool.ts | 59 +++- src/transports/base.ts | 4 + tests/integration/elicitation.test.ts | 315 ++++++++++++++++++ tests/integration/helpers.ts | 34 +- .../tools/mongodb/mongodbTool.test.ts | 20 +- tests/unit/elicitation.test.ts | 137 ++++++++ tests/unit/toolBase.test.ts | 129 +++++++ tests/utils/elicitationMocks.ts | 67 ++++ 19 files changed, 931 insertions(+), 45 deletions(-) create mode 100644 src/elicitation.ts create mode 100644 tests/integration/elicitation.test.ts create mode 100644 tests/unit/elicitation.test.ts create mode 100644 tests/unit/toolBase.test.ts create mode 100644 tests/utils/elicitationMocks.ts diff --git a/README.md b/README.md index 5948b6c70..b91c1fbc4 100644 --- a/README.md +++ b/README.md @@ -338,26 +338,27 @@ The MongoDB MCP Server can be configured using multiple methods, with the follow ### Configuration Options -| CLI Option | Environment Variable | Default | Description | -| -------------------------------------- | --------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `apiClientId` | `MDB_MCP_API_CLIENT_ID` | | Atlas API client ID for authentication. Required for running Atlas tools. | -| `apiClientSecret` | `MDB_MCP_API_CLIENT_SECRET` | | Atlas API client secret for authentication. Required for running Atlas tools. | -| `connectionString` | `MDB_MCP_CONNECTION_STRING` | | MongoDB connection string for direct database connections. Optional, if not set, you'll need to call the `connect` tool before interacting with MongoDB data. | -| `loggers` | `MDB_MCP_LOGGERS` | disk,mcp | Comma separated values, possible values are `mcp`, `disk` and `stderr`. See [Logger Options](#logger-options) for details. | -| `logPath` | `MDB_MCP_LOG_PATH` | see note\* | Folder to store logs. | -| `disabledTools` | `MDB_MCP_DISABLED_TOOLS` | | An array of tool names, operation types, and/or categories of tools that will be disabled. | -| `readOnly` | `MDB_MCP_READ_ONLY` | false | When set to true, only allows read, connect, and metadata operation types, disabling create/update/delete operations. | -| `indexCheck` | `MDB_MCP_INDEX_CHECK` | false | When set to true, enforces that query operations must use an index, rejecting queries that perform a collection scan. | -| `telemetry` | `MDB_MCP_TELEMETRY` | enabled | When set to disabled, disables telemetry collection. | -| `transport` | `MDB_MCP_TRANSPORT` | stdio | Either 'stdio' or 'http'. | -| `httpPort` | `MDB_MCP_HTTP_PORT` | 3000 | Port number. | -| `httpHost` | `MDB_MCP_HTTP_HOST` | 127.0.0.1 | Host to bind the http server. | -| `idleTimeoutMs` | `MDB_MCP_IDLE_TIMEOUT_MS` | 600000 | Idle timeout for a client to disconnect (only applies to http transport). | -| `notificationTimeoutMs` | `MDB_MCP_NOTIFICATION_TIMEOUT_MS` | 540000 | Notification timeout for a client to be aware of diconnect (only applies to http transport). | -| `exportsPath` | `MDB_MCP_EXPORTS_PATH` | see note\* | Folder to store exported data files. | -| `exportTimeoutMs` | `MDB_MCP_EXPORT_TIMEOUT_MS` | 300000 | Time in milliseconds after which an export is considered expired and eligible for cleanup. | -| `exportCleanupIntervalMs` | `MDB_MCP_EXPORT_CLEANUP_INTERVAL_MS` | 120000 | Time in milliseconds between export cleanup cycles that remove expired export files. | -| `atlasTemporaryDatabaseUserLifetimeMs` | `MDB_MCP_ATLAS_TEMPORARY_DATABASE_USER_LIFETIME_MS` | 14400000 | Time in milliseconds that temporary database users created when connecting to MongoDB Atlas clusters will remain active before being automatically deleted. | +| CLI Option | Environment Variable | Default | Description | +| -------------------------------------- | --------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `apiClientId` | `MDB_MCP_API_CLIENT_ID` | | Atlas API client ID for authentication. Required for running Atlas tools. | +| `apiClientSecret` | `MDB_MCP_API_CLIENT_SECRET` | | Atlas API client secret for authentication. Required for running Atlas tools. | +| `connectionString` | `MDB_MCP_CONNECTION_STRING` | | MongoDB connection string for direct database connections. Optional, if not set, you'll need to call the `connect` tool before interacting with MongoDB data. | +| `loggers` | `MDB_MCP_LOGGERS` | disk,mcp | Comma separated values, possible values are `mcp`, `disk` and `stderr`. See [Logger Options](#logger-options) for details. | +| `logPath` | `MDB_MCP_LOG_PATH` | see note\* | Folder to store logs. | +| `disabledTools` | `MDB_MCP_DISABLED_TOOLS` | | An array of tool names, operation types, and/or categories of tools that will be disabled. | +| `confirmationRequiredTools` | `MDB_MCP_CONFIRMATION_REQUIRED_TOOLS` | create-access-list,create-db-user,drop-database,drop-collection,delete-many | An array of tool names that require user confirmation before execution. **Requires the client to support [elicitation](https://modelcontextprotocol.io/specification/draft/client/elicitation)**. | +| `readOnly` | `MDB_MCP_READ_ONLY` | false | When set to true, only allows read, connect, and metadata operation types, disabling create/update/delete operations. | +| `indexCheck` | `MDB_MCP_INDEX_CHECK` | false | When set to true, enforces that query operations must use an index, rejecting queries that perform a collection scan. | +| `telemetry` | `MDB_MCP_TELEMETRY` | enabled | When set to disabled, disables telemetry collection. | +| `transport` | `MDB_MCP_TRANSPORT` | stdio | Either 'stdio' or 'http'. | +| `httpPort` | `MDB_MCP_HTTP_PORT` | 3000 | Port number. | +| `httpHost` | `MDB_MCP_HTTP_HOST` | 127.0.0.1 | Host to bind the http server. | +| `idleTimeoutMs` | `MDB_MCP_IDLE_TIMEOUT_MS` | 600000 | Idle timeout for a client to disconnect (only applies to http transport). | +| `notificationTimeoutMs` | `MDB_MCP_NOTIFICATION_TIMEOUT_MS` | 540000 | Notification timeout for a client to be aware of diconnect (only applies to http transport). | +| `exportsPath` | `MDB_MCP_EXPORTS_PATH` | see note\* | Folder to store exported data files. | +| `exportTimeoutMs` | `MDB_MCP_EXPORT_TIMEOUT_MS` | 300000 | Time in milliseconds after which an export is considered expired and eligible for cleanup. | +| `exportCleanupIntervalMs` | `MDB_MCP_EXPORT_CLEANUP_INTERVAL_MS` | 120000 | Time in milliseconds between export cleanup cycles that remove expired export files. | +| `atlasTemporaryDatabaseUserLifetimeMs` | `MDB_MCP_ATLAS_TEMPORARY_DATABASE_USER_LIFETIME_MS` | 14400000 | Time in milliseconds that temporary database users created when connecting to MongoDB Atlas clusters will remain active before being automatically deleted. | #### Logger Options @@ -418,6 +419,14 @@ Operation types: - `metadata` - Tools that read metadata, such as list databases, list collections, collection schema, etc. - `connect` - Tools that allow you to connect or switch the connection to a MongoDB instance. If this is disabled, you will need to provide a connection string through the config when starting the server. +#### Require Confirmation + +If your client supports [elicitation](https://modelcontextprotocol.io/specification/draft/client/elicitation), you can set the MongoDB MCP server to request user confirmation before executing certain tools. + +When a tool is marked as requiring confirmation, the server will send an elicitation request to the client. The client with elicitation support will then prompt the user for confirmation and send the response back to the server. If the client does not support elicitation, the tool will execute without confirmation. + +You can set the `confirmationRequiredTools` configuration option to specify the names of tools which require confirmation. By default, the following tools have this setting enabled: `drop-database`, `drop-collection`, `delete-many`, `atlas-create-db-user`, `atlas-create-access-list`. + #### Read-Only Mode The `readOnly` configuration option allows you to restrict the MCP server to only use tools with "read", "connect", and "metadata" operation types. When enabled, all tools that have "create", "update" or "delete" operation types will not be registered with the server. diff --git a/src/common/config.ts b/src/common/config.ts index 90d1fc807..8702c96e2 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -160,7 +160,9 @@ export interface UserConfig extends CliOptions { exportTimeoutMs: number; exportCleanupIntervalMs: number; connectionString?: string; + // TODO: Use a type tracking all tool names. disabledTools: Array; + confirmationRequiredTools: Array; readOnly?: boolean; indexCheck?: boolean; transport: "stdio" | "http"; @@ -183,6 +185,13 @@ export const defaultUserConfig: UserConfig = { telemetry: "enabled", readOnly: false, indexCheck: false, + confirmationRequiredTools: [ + "atlas-create-access-list", + "atlas-create-db-user", + "drop-database", + "drop-collection", + "delete-many", + ], transport: "stdio", httpPort: 3000, httpHost: "127.0.0.1", @@ -442,6 +451,7 @@ export function setupUserConfig({ userConfig.disabledTools = commaSeparatedToArray(userConfig.disabledTools); userConfig.loggers = commaSeparatedToArray(userConfig.loggers); + userConfig.confirmationRequiredTools = commaSeparatedToArray(userConfig.confirmationRequiredTools); if (userConfig.connectionString && userConfig.connectionSpecifier) { const connectionInfo = generateConnectionInfoFromCliArgs(userConfig); diff --git a/src/elicitation.ts b/src/elicitation.ts new file mode 100644 index 000000000..c3d30d5b9 --- /dev/null +++ b/src/elicitation.ts @@ -0,0 +1,53 @@ +import type { ElicitRequest } from "@modelcontextprotocol/sdk/types.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; + +export class Elicitation { + private readonly server: McpServer["server"]; + constructor({ server }: { server: McpServer["server"] }) { + this.server = server; + } + + /** + * Checks if the client supports elicitation capabilities. + * @returns True if the client supports elicitation, false otherwise. + */ + public supportsElicitation(): boolean { + const clientCapabilities = this.server.getClientCapabilities(); + return clientCapabilities?.elicitation !== undefined; + } + + /** + * Requests a boolean confirmation from the user. + * @param message - The message to display to the user. + * @returns True if the user confirms the action or the client does not support elicitation, false otherwise. + */ + public async requestConfirmation(message: string): Promise { + if (!this.supportsElicitation()) { + return true; + } + + const result = await this.server.elicitInput({ + message, + requestedSchema: Elicitation.CONFIRMATION_SCHEMA, + }); + return result.action === "accept" && result.content?.confirmation === "Yes"; + } + + /** + * The schema for the confirmation question. + * TODO: In the future would be good to use Zod 4's toJSONSchema() to generate the schema. + */ + public static CONFIRMATION_SCHEMA: ElicitRequest["params"]["requestedSchema"] = { + type: "object", + properties: { + confirmation: { + type: "string", + title: "Would you like to confirm?", + description: "Would you like to confirm?", + enum: ["Yes", "No"], + enumNames: ["Yes, I confirm", "No, I do not confirm"], + }, + }, + required: ["confirmation"], + }; +} diff --git a/src/server.ts b/src/server.ts index d3cc9dbd6..2e6ac2c46 100644 --- a/src/server.ts +++ b/src/server.ts @@ -22,12 +22,14 @@ import type { ToolBase } from "./tools/tool.js"; import { validateConnectionString } from "./helpers/connectionOptions.js"; import { packageInfo } from "./common/packageInfo.js"; import { type ConnectionErrorHandler } from "./common/connectionErrorHandler.js"; +import type { Elicitation } from "./elicitation.js"; export interface ServerOptions { session: Session; userConfig: UserConfig; mcpServer: McpServer; telemetry: Telemetry; + elicitation: Elicitation; connectionErrorHandler: ConnectionErrorHandler; } @@ -36,6 +38,7 @@ export class Server { public readonly mcpServer: McpServer; private readonly telemetry: Telemetry; public readonly userConfig: UserConfig; + public readonly elicitation: Elicitation; public readonly tools: ToolBase[] = []; public readonly connectionErrorHandler: ConnectionErrorHandler; @@ -48,12 +51,13 @@ export class Server { private readonly startTime: number; private readonly subscriptions = new Set(); - constructor({ session, mcpServer, userConfig, telemetry, connectionErrorHandler }: ServerOptions) { + constructor({ session, mcpServer, userConfig, telemetry, connectionErrorHandler, elicitation }: ServerOptions) { this.startTime = Date.now(); this.session = session; this.telemetry = telemetry; this.mcpServer = mcpServer; this.userConfig = userConfig; + this.elicitation = elicitation; this.connectionErrorHandler = connectionErrorHandler; } @@ -184,6 +188,7 @@ export class Server { event.properties.startup_time_ms = commandDuration; event.properties.read_only_mode = this.userConfig.readOnly || false; event.properties.disabled_tools = this.userConfig.disabledTools || []; + event.properties.confirmation_required_tools = this.userConfig.confirmationRequiredTools || []; } if (command === "stop") { event.properties.runtime_duration_ms = Date.now() - this.startTime; @@ -198,7 +203,12 @@ export class Server { private registerTools(): void { for (const toolConstructor of [...AtlasTools, ...MongoDbTools]) { - const tool = new toolConstructor(this.session, this.userConfig, this.telemetry); + const tool = new toolConstructor({ + session: this.session, + config: this.userConfig, + telemetry: this.telemetry, + elicitation: this.elicitation, + }); if (tool.register(this)) { this.tools.push(tool); } diff --git a/src/telemetry/types.ts b/src/telemetry/types.ts index f0392344e..c1eced5af 100644 --- a/src/telemetry/types.ts +++ b/src/telemetry/types.ts @@ -45,6 +45,7 @@ export type ServerEventProperties = { runtime_duration_ms?: number; read_only_mode?: boolean; disabled_tools?: string[]; + confirmation_required_tools?: string[]; }; export type ServerEvent = TelemetryEvent; diff --git a/src/tools/atlas/create/createAccessList.ts b/src/tools/atlas/create/createAccessList.ts index 0cf3b808e..fe5a862ff 100644 --- a/src/tools/atlas/create/createAccessList.ts +++ b/src/tools/atlas/create/createAccessList.ts @@ -76,4 +76,31 @@ export class CreateAccessListTool extends AtlasToolBase { ], }; } + + protected getConfirmationMessage({ + projectId, + ipAddresses, + cidrBlocks, + comment, + currentIpAddress, + }: ToolArgs): string { + const accessDescription = []; + if (ipAddresses?.length) { + accessDescription.push(`- **IP addresses**: ${ipAddresses.join(", ")}`); + } + if (cidrBlocks?.length) { + accessDescription.push(`- **CIDR blocks**: ${cidrBlocks.join(", ")}`); + } + if (currentIpAddress) { + accessDescription.push("- **Current IP address**"); + } + + return ( + `You are about to add the following entries to the access list for Atlas project "${projectId}":\n\n` + + accessDescription.join("\n") + + `\n\n**Comment**: ${comment || DEFAULT_ACCESS_LIST_COMMENT}\n\n` + + "This will allow network access to your MongoDB Atlas clusters from these IP addresses/ranges. " + + "Do you want to proceed?" + ); + } } diff --git a/src/tools/atlas/create/createDBUser.ts b/src/tools/atlas/create/createDBUser.ts index 18d22d358..69c5edc4e 100644 --- a/src/tools/atlas/create/createDBUser.ts +++ b/src/tools/atlas/create/createDBUser.ts @@ -96,4 +96,22 @@ export class CreateDBUserTool extends AtlasToolBase { ], }; } + + protected getConfirmationMessage({ + projectId, + username, + password, + roles, + clusters, + }: ToolArgs): string { + return ( + `You are about to create a database user in Atlas project \`${projectId}\`:\n\n` + + `**Username**: \`${username}\`\n\n` + + `**Password**: ${password ? "(User-provided password)" : "(Auto-generated secure password)"}\n\n` + + `**Roles**: ${roles.map((role) => `${role.roleName}${role.collectionName ? ` on ${role.databaseName}.${role.collectionName}` : ` on ${role.databaseName}`}`).join(", ")}\n\n` + + `**Cluster Access**: ${clusters?.length ? clusters.join(", ") : "All clusters in the project"}\n\n` + + "This will create a new database user with the specified permissions. " + + "**Do you confirm the execution of the action?**" + ); + } } diff --git a/src/tools/mongodb/connect/connect.ts b/src/tools/mongodb/connect/connect.ts index 3fd6b48c3..d7ed16d26 100644 --- a/src/tools/mongodb/connect/connect.ts +++ b/src/tools/mongodb/connect/connect.ts @@ -1,11 +1,8 @@ import { z } from "zod"; import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { MongoDBToolBase } from "../mongodbTool.js"; -import type { ToolArgs, OperationType } from "../../tool.js"; +import type { ToolArgs, OperationType, ToolConstructorParams } from "../../tool.js"; import assert from "assert"; -import type { UserConfig } from "../../../common/config.js"; -import type { Telemetry } from "../../../telemetry/telemetry.js"; -import type { Session } from "../../../common/session.js"; import type { Server } from "../../../server.js"; const disconnectedSchema = z @@ -44,8 +41,8 @@ export class ConnectTool extends MongoDBToolBase { public operationType: OperationType = "connect"; - constructor(session: Session, config: UserConfig, telemetry: Telemetry) { - super(session, config, telemetry); + constructor({ session, config, telemetry, elicitation }: ToolConstructorParams) { + super({ session, config, telemetry, elicitation }); session.on("connect", () => { this.updateMetadata(); }); diff --git a/src/tools/mongodb/delete/deleteMany.ts b/src/tools/mongodb/delete/deleteMany.ts index 3f769f3ab..754b0381a 100644 --- a/src/tools/mongodb/delete/deleteMany.ts +++ b/src/tools/mongodb/delete/deleteMany.ts @@ -3,6 +3,7 @@ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { DbOperationArgs, MongoDBToolBase } from "../mongodbTool.js"; import type { ToolArgs, OperationType } from "../../tool.js"; import { checkIndexUsage } from "../../../helpers/indexCheck.js"; +import { EJSON } from "bson"; export class DeleteManyTool extends MongoDBToolBase { public name = "delete-many"; @@ -55,4 +56,17 @@ export class DeleteManyTool extends MongoDBToolBase { ], }; } + + protected getConfirmationMessage({ database, collection, filter }: ToolArgs): string { + const filterDescription = + filter && Object.keys(filter).length > 0 + ? "```json\n" + `{ "filter": ${EJSON.stringify(filter)} }\n` + "```\n\n" + : "- **All documents** (No filter)\n\n"; + return ( + `You are about to delete documents from the \`${collection}\` collection in the \`${database}\` database:\n\n` + + filterDescription + + "This operation will permanently remove all documents matching the filter.\n\n" + + "**Do you confirm the execution of the action?**" + ); + } } diff --git a/src/tools/mongodb/delete/dropCollection.ts b/src/tools/mongodb/delete/dropCollection.ts index ea46355ca..50bd008a7 100644 --- a/src/tools/mongodb/delete/dropCollection.ts +++ b/src/tools/mongodb/delete/dropCollection.ts @@ -24,4 +24,12 @@ export class DropCollectionTool extends MongoDBToolBase { ], }; } + + protected getConfirmationMessage({ database, collection }: ToolArgs): string { + return ( + `You are about to drop the \`${collection}\` collection from the \`${database}\` database:\n\n` + + "This operation will permanently remove the collection and all its data, including indexes.\n\n" + + "**Do you confirm the execution of the action?**" + ); + } } diff --git a/src/tools/mongodb/delete/dropDatabase.ts b/src/tools/mongodb/delete/dropDatabase.ts index b877bf67c..d33682ce3 100644 --- a/src/tools/mongodb/delete/dropDatabase.ts +++ b/src/tools/mongodb/delete/dropDatabase.ts @@ -23,4 +23,12 @@ export class DropDatabaseTool extends MongoDBToolBase { ], }; } + + protected getConfirmationMessage({ database }: ToolArgs): string { + return ( + `You are about to drop the \`${database}\` database:\n\n` + + "This operation will permanently remove the database and ALL its collections, documents, and indexes.\n\n" + + "**Do you confirm the execution of the action?**" + ); + } } diff --git a/src/tools/tool.ts b/src/tools/tool.ts index 0115feb05..8a9a0b9f5 100644 --- a/src/tools/tool.ts +++ b/src/tools/tool.ts @@ -8,8 +8,10 @@ import type { Telemetry } from "../telemetry/telemetry.js"; import { type ToolEvent } from "../telemetry/types.js"; import type { UserConfig } from "../common/config.js"; import type { Server } from "../server.js"; +import type { Elicitation } from "../elicitation.js"; export type ToolArgs = z.objectOutputType; +export type ToolCallbackArgs = Parameters>; export type OperationType = "metadata" | "read" | "create" | "delete" | "update" | "connect"; export type ToolCategory = "mongodb" | "atlas"; @@ -18,6 +20,13 @@ export type TelemetryToolMetadata = { orgId?: string; }; +export type ToolConstructorParams = { + session: Session; + config: UserConfig; + telemetry: Telemetry; + elicitation: Elicitation; +}; + export abstract class ToolBase { public abstract name: string; @@ -58,13 +67,35 @@ export abstract class ToolBase { return annotations; } - protected abstract execute(...args: Parameters>): Promise; + protected abstract execute(...args: ToolCallbackArgs): Promise; + + /** Get the confirmation message for the tool. Can be overridden to provide a more specific message. */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + protected getConfirmationMessage(...args: ToolCallbackArgs): string { + return `You are about to execute the \`${this.name}\` tool which requires additional confirmation. Would you like to proceed?`; + } + + /** Check if the user has confirmed the tool execution, if required by the configuration. + * Always returns true if confirmation is not required. + */ + public async verifyConfirmed(args: ToolCallbackArgs): Promise { + if (!this.config.confirmationRequiredTools.includes(this.name)) { + return true; + } - constructor( - protected readonly session: Session, - protected readonly config: UserConfig, - protected readonly telemetry: Telemetry - ) {} + return this.elicitation.requestConfirmation(this.getConfirmationMessage(...args)); + } + + protected readonly session: Session; + protected readonly config: UserConfig; + protected readonly telemetry: Telemetry; + protected readonly elicitation: Elicitation; + constructor({ session, config, telemetry, elicitation }: ToolConstructorParams) { + this.session = session; + this.config = config; + this.telemetry = telemetry; + this.elicitation = elicitation; + } public register(server: Server): boolean { if (!this.verifyAllowed()) { @@ -74,6 +105,22 @@ export abstract class ToolBase { const callback: ToolCallback = async (...args) => { const startTime = Date.now(); try { + if (!(await this.verifyConfirmed(args))) { + this.session.logger.debug({ + id: LogId.toolExecute, + context: "tool", + message: `User did not confirm the execution of the \`${this.name}\` tool so the operation was not performed.`, + noRedaction: true, + }); + return { + content: [ + { + type: "text", + text: `User did not confirm the execution of the \`${this.name}\` tool so the operation was not performed.`, + }, + ], + }; + } this.session.logger.debug({ id: LogId.toolExecute, context: "tool", diff --git a/src/transports/base.ts b/src/transports/base.ts index 7de433ae2..a70d23a2c 100644 --- a/src/transports/base.ts +++ b/src/transports/base.ts @@ -15,6 +15,7 @@ import { connectionErrorHandler as defaultConnectionErrorHandler, } from "../common/connectionErrorHandler.js"; import type { CommonProperties } from "../telemetry/types.js"; +import { Elicitation } from "../elicitation.js"; export type TransportRunnerConfig = { userConfig: UserConfig; @@ -94,12 +95,15 @@ export abstract class TransportRunnerBase { commonProperties: this.telemetryProperties, }); + const elicitation = new Elicitation({ server: mcpServer.server }); + const result = new Server({ mcpServer, session, telemetry, userConfig: this.userConfig, connectionErrorHandler: this.connectionErrorHandler, + elicitation, }); // We need to create the MCP logger after the server is constructed diff --git a/tests/integration/elicitation.test.ts b/tests/integration/elicitation.test.ts new file mode 100644 index 000000000..0626fd51a --- /dev/null +++ b/tests/integration/elicitation.test.ts @@ -0,0 +1,315 @@ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +import { describe, it, expect } from "vitest"; +import { defaultDriverOptions, type UserConfig } from "../../src/common/config.js"; +import { defaultTestConfig, setupIntegrationTest } from "./helpers.js"; +import { Elicitation } from "../../src/elicitation.js"; +import { createMockElicitInput } from "../utils/elicitationMocks.js"; + +describe("Elicitation Integration Tests", () => { + function createTestConfig(config: Partial = {}): UserConfig { + return { + ...defaultTestConfig, + telemetry: "disabled", + // Add fake API credentials so Atlas tools get registered + apiClientId: "test-client-id", + apiClientSecret: "test-client-secret", + ...config, + }; + } + + describe("with elicitation support", () => { + const mockElicitInput = createMockElicitInput(); + const integration = setupIntegrationTest( + () => createTestConfig(), + () => defaultDriverOptions, + { elicitInput: mockElicitInput } + ); + + describe("tools requiring confirmation by default", () => { + it("should request confirmation for drop-database tool and proceed when confirmed", async () => { + mockElicitInput.confirmYes(); + + const result = await integration.mcpClient().callTool({ + name: "drop-database", + arguments: { database: "test-db" }, + }); + + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + expect(mockElicitInput.mock).toHaveBeenCalledWith({ + message: expect.stringContaining("You are about to drop the `test-db` database"), + requestedSchema: Elicitation.CONFIRMATION_SCHEMA, + }); + + // Should attempt to execute (will fail due to no connection, but confirms flow worked) + expect(result.isError).toBe(true); + expect(result.content).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + type: "text", + text: expect.stringContaining("You need to connect to a MongoDB instance"), + }), + ]) + ); + }); + + it("should not proceed when user declines confirmation", async () => { + mockElicitInput.confirmNo(); + + const result = await integration.mcpClient().callTool({ + name: "drop-database", + arguments: { database: "test-db" }, + }); + + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + expect(result.isError).toBeFalsy(); + expect(result.content).toEqual([ + { + type: "text", + text: "User did not confirm the execution of the `drop-database` tool so the operation was not performed.", + }, + ]); + }); + + it("should request confirmation for drop-collection tool", async () => { + mockElicitInput.confirmYes(); + + await integration.mcpClient().callTool({ + name: "drop-collection", + arguments: { database: "test-db", collection: "test-collection" }, + }); + + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + expect(mockElicitInput.mock).toHaveBeenCalledWith({ + message: expect.stringContaining("You are about to drop the `test-collection` collection"), + requestedSchema: expect.objectContaining(Elicitation.CONFIRMATION_SCHEMA), + }); + }); + + it("should request confirmation for delete-many tool", async () => { + mockElicitInput.confirmYes(); + + await integration.mcpClient().callTool({ + name: "delete-many", + arguments: { + database: "test-db", + collection: "test-collection", + filter: { status: "inactive" }, + }, + }); + + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + expect(mockElicitInput.mock).toHaveBeenCalledWith({ + message: expect.stringContaining("You are about to delete documents"), + requestedSchema: expect.objectContaining(Elicitation.CONFIRMATION_SCHEMA), + }); + }); + + it("should request confirmation for create-db-user tool", async () => { + mockElicitInput.confirmYes(); + + await integration.mcpClient().callTool({ + name: "atlas-create-db-user", + arguments: { + projectId: "507f1f77bcf86cd799439011", // Valid 24-char hex string + username: "test-user", + roles: [{ roleName: "read", databaseName: "test-db" }], + }, + }); + + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + expect(mockElicitInput.mock).toHaveBeenCalledWith({ + message: expect.stringContaining("You are about to create a database user"), + requestedSchema: expect.objectContaining(Elicitation.CONFIRMATION_SCHEMA), + }); + }); + + it("should request confirmation for create-access-list tool", async () => { + mockElicitInput.confirmYes(); + + await integration.mcpClient().callTool({ + name: "atlas-create-access-list", + arguments: { + projectId: "507f1f77bcf86cd799439011", // Valid 24-char hex string + ipAddresses: ["192.168.1.1"], + }, + }); + + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + expect(mockElicitInput.mock).toHaveBeenCalledWith({ + message: expect.stringContaining("You are about to add the following entries to the access list"), + requestedSchema: expect.objectContaining(Elicitation.CONFIRMATION_SCHEMA), + }); + }); + }); + + describe("tools not requiring confirmation by default", () => { + it("should not request confirmation for read operations", async () => { + const result = await integration.mcpClient().callTool({ + name: "list-databases", + arguments: {}, + }); + + expect(mockElicitInput.mock).not.toHaveBeenCalled(); + // Should fail with connection error since we're not connected + expect(result.isError).toBe(true); + }); + + it("should not request confirmation for find operations", async () => { + const result = await integration.mcpClient().callTool({ + name: "find", + arguments: { + database: "test-db", + collection: "test-collection", + }, + }); + + expect(mockElicitInput.mock).not.toHaveBeenCalled(); + // Should fail with connection error since we're not connected + expect(result.isError).toBe(true); + }); + }); + }); + + describe("without elicitation support", () => { + const integration = setupIntegrationTest( + () => createTestConfig(), + () => defaultDriverOptions, + { getClientCapabilities: () => ({}) } + ); + + it("should proceed without confirmation for default confirmation-required tools when client lacks elicitation support", async () => { + const result = await integration.mcpClient().callTool({ + name: "drop-database", + arguments: { database: "test-db" }, + }); + + // Note: No mock assertions needed since elicitation is disabled + // Should fail with connection error since we're not connected, but confirms flow bypassed confirmation + expect(result.isError).toBe(true); + expect(result.content).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + type: "text", + text: expect.stringContaining("You need to connect to a MongoDB instance"), + }), + ]) + ); + }); + }); + + describe("custom confirmation configuration", () => { + const mockElicitInput = createMockElicitInput(); + const integration = setupIntegrationTest( + () => createTestConfig({ confirmationRequiredTools: ["list-databases"] }), + () => defaultDriverOptions, + { elicitInput: mockElicitInput } + ); + + it("should confirm with a generic message with custom configurations for other tools", async () => { + mockElicitInput.confirmYes(); + + await integration.mcpClient().callTool({ + name: "list-databases", + arguments: {}, + }); + + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + expect(mockElicitInput.mock).toHaveBeenCalledWith({ + message: expect.stringMatching( + /You are about to execute the `list-databases` tool which requires additional confirmation. Would you like to proceed\?/ + ), + requestedSchema: expect.objectContaining(Elicitation.CONFIRMATION_SCHEMA), + }); + }); + + it("should not request confirmation when tool is removed from default confirmationRequiredTools", async () => { + const result = await integration.mcpClient().callTool({ + name: "drop-database", + arguments: { database: "test-db" }, + }); + + expect(mockElicitInput.mock).not.toHaveBeenCalled(); + // Should fail with connection error since we're not connected + expect(result.isError).toBe(true); + }); + }); + + describe("confirmation message content validation", () => { + const mockElicitInput = createMockElicitInput(); + const integration = setupIntegrationTest( + () => createTestConfig(), + () => defaultDriverOptions, + { elicitInput: mockElicitInput } + ); + + it("should include specific details in create-db-user confirmation", async () => { + mockElicitInput.confirmYes(); + + await integration.mcpClient().callTool({ + name: "atlas-create-db-user", + arguments: { + projectId: "507f1f77bcf86cd799439011", // Valid 24-char hex string + username: "myuser", + password: "mypassword", + roles: [ + { roleName: "readWrite", databaseName: "mydb" }, + { roleName: "read", databaseName: "logs", collectionName: "events" }, + ], + clusters: ["cluster1", "cluster2"], + }, + }); + + expect(mockElicitInput.mock).toHaveBeenCalledWith({ + message: expect.stringMatching(/project.*507f1f77bcf86cd799439011/), + requestedSchema: expect.objectContaining(Elicitation.CONFIRMATION_SCHEMA), + }); + }); + + it("should include filter details in delete-many confirmation", async () => { + mockElicitInput.confirmYes(); + + await integration.mcpClient().callTool({ + name: "delete-many", + arguments: { + database: "mydb", + collection: "users", + filter: { status: "inactive", lastLogin: { $lt: "2023-01-01" } }, + }, + }); + + expect(mockElicitInput.mock).toHaveBeenCalledWith({ + message: expect.stringMatching(/mydb.*database/), + requestedSchema: expect.objectContaining(Elicitation.CONFIRMATION_SCHEMA), + }); + }); + }); + + describe("error handling in confirmation flow", () => { + const mockElicitInput = createMockElicitInput(); + const integration = setupIntegrationTest( + () => createTestConfig(), + () => defaultDriverOptions, + { elicitInput: mockElicitInput } + ); + + it("should handle confirmation errors gracefully", async () => { + mockElicitInput.rejectWith(new Error("Confirmation service unavailable")); + + const result = await integration.mcpClient().callTool({ + name: "drop-database", + arguments: { database: "test-db" }, + }); + + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + expect(result.isError).toBe(true); + expect(result.content).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + type: "text", + text: expect.stringContaining("Error running drop-database"), + }), + ]) + ); + }); + }); +}); diff --git a/tests/integration/helpers.ts b/tests/integration/helpers.ts index 1f28995dd..0a2ccfe84 100644 --- a/tests/integration/helpers.ts +++ b/tests/integration/helpers.ts @@ -15,6 +15,8 @@ import { MCPConnectionManager } from "../../src/common/connectionManager.js"; import { DeviceId } from "../../src/helpers/deviceId.js"; import { connectionErrorHandler } from "../../src/common/connectionErrorHandler.js"; import { Keychain } from "../../src/common/keychain.js"; +import { Elicitation } from "../../src/elicitation.js"; +import type { MockClientCapabilities, createMockElicitInput } from "../utils/elicitationMocks.js"; interface ParameterInfo { name: string; @@ -41,7 +43,14 @@ export const defaultDriverOptions: DriverOptions = { export function setupIntegrationTest( getUserConfig: () => UserConfig, - getDriverOptions: () => DriverOptions + getDriverOptions: () => DriverOptions, + { + elicitInput, + getClientCapabilities, + }: { + elicitInput?: ReturnType; + getClientCapabilities?: () => MockClientCapabilities; + } = {} ): IntegrationTest { let mcpClient: Client | undefined; let mcpServer: Server | undefined; @@ -50,6 +59,7 @@ export function setupIntegrationTest( beforeAll(async () => { const userConfig = getUserConfig(); const driverOptions = getDriverOptions(); + const clientCapabilities = getClientCapabilities?.() ?? (elicitInput ? { elicitation: {} } : {}); const clientTransport = new InMemoryTransport(); const serverTransport = new InMemoryTransport(); @@ -67,7 +77,7 @@ export function setupIntegrationTest( version: "1.2.3", }, { - capabilities: {}, + capabilities: clientCapabilities, } ); @@ -96,14 +106,24 @@ export function setupIntegrationTest( const telemetry = Telemetry.create(session, userConfig, deviceId); + const mcpServerInstance = new McpServer({ + name: "test-server", + version: "5.2.3", + }); + + // Mock elicitation if provided + if (elicitInput) { + Object.assign(mcpServerInstance.server, { elicitInput: elicitInput.mock }); + } + + const elicitation = new Elicitation({ server: mcpServerInstance.server }); + mcpServer = new Server({ session, userConfig, telemetry, - mcpServer: new McpServer({ - name: "test-server", - version: "5.2.3", - }), + mcpServer: mcpServerInstance, + elicitation, connectionErrorHandler, }); @@ -115,6 +135,8 @@ export function setupIntegrationTest( if (mcpServer) { await mcpServer.session.disconnect(); } + + vi.clearAllMocks(); }); afterAll(async () => { diff --git a/tests/integration/tools/mongodb/mongodbTool.test.ts b/tests/integration/tools/mongodb/mongodbTool.test.ts index 1759904e2..f2e4930a2 100644 --- a/tests/integration/tools/mongodb/mongodbTool.test.ts +++ b/tests/integration/tools/mongodb/mongodbTool.test.ts @@ -18,6 +18,7 @@ import { defaultTestConfig } from "../../helpers.js"; import { setupMongoDBIntegrationTest } from "./mongodbHelpers.js"; import { ErrorCodes } from "../../../../src/common/errors.js"; import { Keychain } from "../../../../src/common/keychain.js"; +import { Elicitation } from "../../../../src/elicitation.js"; const injectedErrorHandler: ConnectionErrorHandler = (error) => { switch (error.code) { @@ -112,18 +113,27 @@ describe("MongoDBTool implementations", () => { } ); + const internalMcpServer = new McpServer({ + name: "test-server", + version: "5.2.3", + }); + const elicitation = new Elicitation({ server: internalMcpServer.server }); + mcpServer = new Server({ session, userConfig, telemetry, - mcpServer: new McpServer({ - name: "test-server", - version: "5.2.3", - }), + mcpServer: internalMcpServer, connectionErrorHandler: errorHandler, + elicitation, }); - tool = new RandomTool(session, userConfig, telemetry); + tool = new RandomTool({ + session, + config: userConfig, + telemetry, + elicitation, + }); tool.register(mcpServer); await mcpServer.connect(serverTransport); diff --git a/tests/unit/elicitation.test.ts b/tests/unit/elicitation.test.ts new file mode 100644 index 000000000..eeaa81ae3 --- /dev/null +++ b/tests/unit/elicitation.test.ts @@ -0,0 +1,137 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { Elicitation } from "../../src/elicitation.js"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { createMockElicitInput, createMockGetClientCapabilities } from "../utils/elicitationMocks.js"; + +describe("Elicitation", () => { + let elicitation: Elicitation; + let mockGetClientCapabilities: ReturnType; + let mockElicitInput: ReturnType; + + beforeEach(() => { + mockGetClientCapabilities = createMockGetClientCapabilities(); + mockElicitInput = createMockElicitInput(); + elicitation = new Elicitation({ + server: { + getClientCapabilities: mockGetClientCapabilities, + elicitInput: mockElicitInput.mock, + } as unknown as McpServer["server"], + }); + }); + + describe("supportsElicitation", () => { + it("should return true when client supports elicitation", () => { + mockGetClientCapabilities.mockReturnValue({ elicitation: {} }); + + const result = elicitation.supportsElicitation(); + + expect(result).toBe(true); + expect(mockGetClientCapabilities).toHaveBeenCalledTimes(1); + }); + + it("should return false when client does not support elicitation", () => { + mockGetClientCapabilities.mockReturnValue({}); + + const result = elicitation.supportsElicitation(); + + expect(result).toBe(false); + expect(mockGetClientCapabilities).toHaveBeenCalledTimes(1); + }); + + it("should return false when client capabilities are undefined", () => { + mockGetClientCapabilities.mockReturnValue(undefined); + + const result = elicitation.supportsElicitation(); + + expect(result).toBe(false); + expect(mockGetClientCapabilities).toHaveBeenCalledTimes(1); + }); + + it("should return false when elicitation capability is explicitly undefined", () => { + mockGetClientCapabilities.mockReturnValue(undefined); + + const result = elicitation.supportsElicitation(); + + expect(result).toBe(false); + expect(mockGetClientCapabilities).toHaveBeenCalledTimes(1); + }); + }); + + describe("requestConfirmation", () => { + const testMessage = "Are you sure you want to proceed?"; + + it("should return true when client does not support elicitation", async () => { + mockGetClientCapabilities.mockReturnValue({}); + + const result = await elicitation.requestConfirmation(testMessage); + + expect(result).toBe(true); + expect(mockGetClientCapabilities).toHaveBeenCalledTimes(1); + expect(mockElicitInput.mock).not.toHaveBeenCalled(); + }); + + it("should return true when user confirms with 'Yes' and action is 'accept'", async () => { + mockGetClientCapabilities.mockReturnValue({ elicitation: {} }); + mockElicitInput.confirmYes(); + + const result = await elicitation.requestConfirmation(testMessage); + + expect(result).toBe(true); + expect(mockGetClientCapabilities).toHaveBeenCalledTimes(1); + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + expect(mockElicitInput.mock).toHaveBeenCalledWith({ + message: testMessage, + requestedSchema: Elicitation.CONFIRMATION_SCHEMA, + }); + }); + + it("should return false when user selects 'No' with action 'accept'", async () => { + mockGetClientCapabilities.mockReturnValue({ elicitation: {} }); + mockElicitInput.confirmNo(); + + const result = await elicitation.requestConfirmation(testMessage); + + expect(result).toBe(false); + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + }); + + it("should return false when content is undefined", async () => { + mockGetClientCapabilities.mockReturnValue({ elicitation: {} }); + mockElicitInput.acceptWith(undefined); + + const result = await elicitation.requestConfirmation(testMessage); + + expect(result).toBe(false); + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + }); + + it("should return false when confirmation field is missing", async () => { + mockGetClientCapabilities.mockReturnValue({ elicitation: {} }); + mockElicitInput.acceptWith({}); + + const result = await elicitation.requestConfirmation(testMessage); + + expect(result).toBe(false); + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + }); + + it("should return false when user cancels", async () => { + mockGetClientCapabilities.mockReturnValue({ elicitation: {} }); + mockElicitInput.cancel(); + + const result = await elicitation.requestConfirmation(testMessage); + + expect(result).toBe(false); + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + }); + + it("should handle elicitInput erroring", async () => { + mockGetClientCapabilities.mockReturnValue({ elicitation: {} }); + const error = new Error("Elicitation failed"); + mockElicitInput.rejectWith(error); + + await expect(elicitation.requestConfirmation(testMessage)).rejects.toThrow("Elicitation failed"); + expect(mockElicitInput.mock).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/tests/unit/toolBase.test.ts b/tests/unit/toolBase.test.ts new file mode 100644 index 000000000..0e7d958c8 --- /dev/null +++ b/tests/unit/toolBase.test.ts @@ -0,0 +1,129 @@ +import { describe, it, expect, vi, beforeEach, type MockedFunction } from "vitest"; +import { z } from "zod"; +import { ToolBase, type OperationType, type ToolCategory, type ToolConstructorParams } from "../../src/tools/tool.js"; +import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; +import type { Session } from "../../src/common/session.js"; +import type { UserConfig } from "../../src/common/config.js"; +import type { Telemetry } from "../../src/telemetry/telemetry.js"; +import type { Elicitation } from "../../src/elicitation.js"; +import type { CompositeLogger } from "../../src/common/logger.js"; +import type { TelemetryToolMetadata, ToolCallbackArgs } from "../../src/tools/tool.js"; + +describe("ToolBase", () => { + let mockSession: Session; + let mockLogger: CompositeLogger; + let mockConfig: UserConfig; + let mockTelemetry: Telemetry; + let mockElicitation: Elicitation; + let mockRequestConfirmation: MockedFunction<(message: string) => Promise>; + let testTool: TestTool; + + beforeEach(() => { + mockLogger = { + info: vi.fn(), + debug: vi.fn(), + warning: vi.fn(), + error: vi.fn(), + } as unknown as CompositeLogger; + + mockSession = { + logger: mockLogger, + } as Session; + + mockConfig = { + confirmationRequiredTools: [], + } as unknown as UserConfig; + + mockTelemetry = {} as Telemetry; + + mockRequestConfirmation = vi.fn(); + mockElicitation = { + requestConfirmation: mockRequestConfirmation, + } as unknown as Elicitation; + + const constructorParams: ToolConstructorParams = { + session: mockSession, + config: mockConfig, + telemetry: mockTelemetry, + elicitation: mockElicitation, + }; + + testTool = new TestTool(constructorParams); + }); + + describe("verifyConfirmed", () => { + it("should return true when tool is not in confirmationRequiredTools list", async () => { + mockConfig.confirmationRequiredTools = ["other-tool", "another-tool"]; + + const args = [ + { param1: "test" }, + {} as ToolCallbackArgs<(typeof testTool)["argsShape"]>[1], + ] as ToolCallbackArgs<(typeof testTool)["argsShape"]>; + const result = await testTool.verifyConfirmed(args); + + expect(result).toBe(true); + expect(mockRequestConfirmation).not.toHaveBeenCalled(); + }); + + it("should return true when confirmationRequiredTools list is empty", async () => { + mockConfig.confirmationRequiredTools = []; + + const args = [{ param1: "test" }, {} as ToolCallbackArgs<(typeof testTool)["argsShape"]>[1]]; + const result = await testTool.verifyConfirmed(args as ToolCallbackArgs<(typeof testTool)["argsShape"]>); + + expect(result).toBe(true); + expect(mockRequestConfirmation).not.toHaveBeenCalled(); + }); + + it("should call requestConfirmation when tool is in confirmationRequiredTools list", async () => { + mockConfig.confirmationRequiredTools = ["test-tool"]; + mockRequestConfirmation.mockResolvedValue(true); + + const args = [{ param1: "test", param2: 42 }, {} as ToolCallbackArgs<(typeof testTool)["argsShape"]>[1]]; + const result = await testTool.verifyConfirmed(args as ToolCallbackArgs<(typeof testTool)["argsShape"]>); + + expect(result).toBe(true); + expect(mockRequestConfirmation).toHaveBeenCalledTimes(1); + expect(mockRequestConfirmation).toHaveBeenCalledWith( + "You are about to execute the `test-tool` tool which requires additional confirmation. Would you like to proceed?" + ); + }); + + it("should return false when user declines confirmation", async () => { + mockConfig.confirmationRequiredTools = ["test-tool"]; + mockRequestConfirmation.mockResolvedValue(false); + + const args = [{ param1: "test" }, {} as ToolCallbackArgs<(typeof testTool)["argsShape"]>[1]]; + const result = await testTool.verifyConfirmed(args as ToolCallbackArgs<(typeof testTool)["argsShape"]>); + + expect(result).toBe(false); + expect(mockRequestConfirmation).toHaveBeenCalledTimes(1); + }); + }); +}); + +class TestTool extends ToolBase { + public name = "test-tool"; + public category: ToolCategory = "mongodb"; + public operationType: OperationType = "delete"; + protected description = "A test tool for verification tests"; + protected argsShape = { + param1: z.string().describe("Test parameter 1"), + param2: z.number().optional().describe("Test parameter 2"), + }; + + protected async execute(): Promise { + return Promise.resolve({ + content: [ + { + type: "text", + text: "Test tool executed successfully", + }, + ], + }); + } + + protected resolveTelemetryMetadata(): TelemetryToolMetadata { + return {}; + } +} diff --git a/tests/utils/elicitationMocks.ts b/tests/utils/elicitationMocks.ts new file mode 100644 index 000000000..da128fd90 --- /dev/null +++ b/tests/utils/elicitationMocks.ts @@ -0,0 +1,67 @@ +import type { MockedFunction } from "vitest"; +import { vi } from "vitest"; + +/** + * Mock types based on the MCP SDK types, but simplified for testing + */ +export type MockClientCapabilities = { + [x: string]: unknown; + elicitation?: { [x: string]: unknown }; +}; + +export type MockElicitInput = { + message: string; + requestedSchema: unknown; +}; + +export type MockElicitResult = { + action: string; + content?: { + confirmation?: string; + }; +}; + +/** + * Creates mock functions for elicitation testing + */ +export function createMockElicitInput(): { + mock: MockedFunction<() => Promise>; + confirmYes: () => void; + confirmNo: () => void; + acceptWith: (content: { confirmation?: string } | undefined) => void; + cancel: () => void; + rejectWith: (error: Error) => void; + clear: () => void; +} { + const mockFn = vi.fn(); + + return { + mock: mockFn, + confirmYes: () => + mockFn.mockResolvedValue({ + action: "accept", + content: { confirmation: "Yes" }, + }), + confirmNo: () => + mockFn.mockResolvedValue({ + action: "accept", + content: { confirmation: "No" }, + }), + acceptWith: (content: { confirmation?: string } | undefined) => + mockFn.mockResolvedValue({ + action: "accept", + content, + }), + cancel: () => + mockFn.mockResolvedValue({ + action: "cancel", + content: undefined, + }), + rejectWith: (error: Error) => mockFn.mockRejectedValue(error), + clear: () => mockFn.mockClear(), + }; +} + +export function createMockGetClientCapabilities(): MockedFunction<() => MockClientCapabilities | undefined> { + return vi.fn(); +} From 62a57d815107d6cfb9ec9a436b82abe376ca10f1 Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Fri, 12 Sep 2025 17:12:38 +0300 Subject: [PATCH 41/49] chore: update smithery dockerfile to be closer to the official one (#524) --- .smithery/Dockerfile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.smithery/Dockerfile b/.smithery/Dockerfile index a2f4aed9c..d6db33d6c 100644 --- a/.smithery/Dockerfile +++ b/.smithery/Dockerfile @@ -2,10 +2,11 @@ # ----- Build Stage ----- FROM node:lts-alpine AS builder -RUN adduser -D mcpuser -USER mcpuser +RUN addgroup -S mcp && adduser -S mcp -G mcp -s /sbin/nologin +RUN chown -R mcp:mcp /home/mcp +USER mcp -WORKDIR /app +WORKDIR /home/mcp # Copy package and configuration COPY ../package.json ../package-lock.json ../tsconfig.json ../tsconfig.build.json ./ @@ -18,9 +19,12 @@ RUN npm ci && npm run build # ----- Production Stage ----- FROM node:lts-alpine +RUN addgroup -S mcp && adduser -S mcp -G mcp -s /sbin/nologin +RUN chown -R mcp:mcp /dist +USER mcp # Copy built artifacts -COPY --from=builder /app/dist ./dist +COPY --from=builder /home/mcp/dist ./dist # Copy package.json for production install COPY ../package.json ../package-lock.json ./ From 7fa4a2f21865ac0bcd824bfb0875b0523afecfe2 Mon Sep 17 00:00:00 2001 From: Nikola Irinchev Date: Tue, 16 Sep 2025 10:35:05 +0200 Subject: [PATCH 42/49] fix: incorrect number of clusters found (#561) --- src/tools/atlas/read/listClusters.ts | 14 +++++++------- tests/integration/tools/atlas/clusters.test.ts | 9 ++++++--- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/tools/atlas/read/listClusters.ts b/src/tools/atlas/read/listClusters.ts index 5c8e72a30..60344f7d3 100644 --- a/src/tools/atlas/read/listClusters.ts +++ b/src/tools/atlas/read/listClusters.ts @@ -97,17 +97,17 @@ ${rows}`, } const formattedClusters = clusters?.results?.map((cluster) => formatCluster(cluster)) || []; const formattedFlexClusters = flexClusters?.results?.map((cluster) => formatFlexCluster(cluster)) || []; - const rows = [...formattedClusters, ...formattedFlexClusters] - .map((formattedCluster) => { - return `${formattedCluster.name || "Unknown"} | ${formattedCluster.instanceType} | ${formattedCluster.instanceSize || "N/A"} | ${formattedCluster.state || "UNKNOWN"} | ${formattedCluster.mongoDBVersion || "N/A"} | ${formattedCluster.connectionString || "N/A"}`; - }) - .join("\n"); + const allClusters = [...formattedClusters, ...formattedFlexClusters]; return { content: formatUntrustedData( - `Found ${rows.length} clusters in project "${project.name}" (${project.id}):`, + `Found ${allClusters.length} clusters in project "${project.name}" (${project.id}):`, `Cluster Name | Cluster Type | Tier | State | MongoDB Version | Connection String ----------------|----------------|----------------|----------------|----------------|---------------- -${rows}` +${allClusters + .map((formattedCluster) => { + return `${formattedCluster.name || "Unknown"} | ${formattedCluster.instanceType} | ${formattedCluster.instanceSize || "N/A"} | ${formattedCluster.state || "UNKNOWN"} | ${formattedCluster.mongoDBVersion || "N/A"} | ${formattedCluster.connectionString || "N/A"}`; + }) + .join("\n")}` ), }; } diff --git a/tests/integration/tools/atlas/clusters.test.ts b/tests/integration/tools/atlas/clusters.test.ts index ccb6e774d..5c50c570c 100644 --- a/tests/integration/tools/atlas/clusters.test.ts +++ b/tests/integration/tools/atlas/clusters.test.ts @@ -1,6 +1,6 @@ import type { Session } from "../../../../src/common/session.js"; -import { expectDefined, getResponseElements } from "../../helpers.js"; -import { describeWithAtlas, withProject, randomId } from "./atlasHelpers.js"; +import { expectDefined, getDataFromUntrustedContent, getResponseElements } from "../../helpers.js"; +import { describeWithAtlas, withProject, randomId, parseTable } from "./atlasHelpers.js"; import type { ClusterDescription20240805 } from "../../../../src/common/atlas/openapi.js"; import { afterAll, beforeAll, describe, expect, it } from "vitest"; @@ -152,9 +152,12 @@ describeWithAtlas("clusters", (integration) => { const elements = getResponseElements(response); expect(elements).toHaveLength(2); - expect(elements[0]?.text).toMatch(/Found \d+ clusters in project/); + expect(elements[1]?.text).toContain(" Date: Tue, 16 Sep 2025 12:01:13 +0200 Subject: [PATCH 43/49] fix: pin yargs-parser to 21 for VSCode compatibility (#562) --- package-lock.json | 30 +++++------------------------- package.json | 2 +- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 089fd9998..d7daf3995 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "oauth4webapi": "^3.8.0", "openapi-fetch": "^0.14.0", "ts-levenshtein": "^1.0.7", - "yargs-parser": "^22.0.0", + "yargs-parser": "^21.1.1", "zod": "^3.25.76" }, "bin": { @@ -11366,16 +11366,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/openapi-typescript/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/openid-client": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.7.1.tgz", @@ -15450,12 +15440,12 @@ } }, "node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node": ">=12" } }, "node_modules/yargs/node_modules/ansi-regex": { @@ -15503,16 +15493,6 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "devOptional": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index db065bb1e..204814f6f 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "oauth4webapi": "^3.8.0", "openapi-fetch": "^0.14.0", "ts-levenshtein": "^1.0.7", - "yargs-parser": "^22.0.0", + "yargs-parser": "^21.1.1", "zod": "^3.25.76" }, "engines": { From b75f7cc6e528b468f796335be2c0fed2d1a89581 Mon Sep 17 00:00:00 2001 From: "mongodb-devtools-bot[bot]" <189715634+mongodb-devtools-bot[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:24:32 +0100 Subject: [PATCH 44/49] chore: release v1.0.0-prerelease.1 (#563) Co-authored-by: mongodb-devtools-bot[bot] <189715634+mongodb-devtools-bot[bot]@users.noreply.github.com> --- package-lock.json | 4 ++-- package.json | 2 +- src/common/packageInfo.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index d7daf3995..34dfe1b6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mongodb-mcp-server", - "version": "0.3.1-prerelease.1", + "version": "1.0.0-prerelease.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mongodb-mcp-server", - "version": "0.3.1-prerelease.1", + "version": "1.0.0-prerelease.1", "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "^1.17.4", diff --git a/package.json b/package.json index 204814f6f..aaba4f18a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mongodb-mcp-server", "description": "MongoDB Model Context Protocol Server", - "version": "0.3.1-prerelease.1", + "version": "1.0.0-prerelease.1", "type": "module", "exports": { ".": { diff --git a/src/common/packageInfo.ts b/src/common/packageInfo.ts index ee1e17867..b136df898 100644 --- a/src/common/packageInfo.ts +++ b/src/common/packageInfo.ts @@ -1,5 +1,5 @@ // This file was generated by scripts/updatePackageVersion.ts - Do not edit it manually. export const packageInfo = { - version: "0.3.1-prerelease.1", + version: "1.0.0-prerelease.1", mcpServerName: "MongoDB MCP Server", }; From bb28bd6c41db424cdffe6b65c697abae4ae37c8b Mon Sep 17 00:00:00 2001 From: Melanija Cvetic <119604954+cveticm@users.noreply.github.com> Date: Tue, 16 Sep 2025 12:59:22 +0100 Subject: [PATCH 45/49] fix: Removes nullable from DBUser password (#564) --- src/tools/atlas/create/createDBUser.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/tools/atlas/create/createDBUser.ts b/src/tools/atlas/create/createDBUser.ts index 69c5edc4e..c8e8ea014 100644 --- a/src/tools/atlas/create/createDBUser.ts +++ b/src/tools/atlas/create/createDBUser.ts @@ -14,8 +14,7 @@ export const CreateDBUserArgs = { // AtlasPassword123, which are easily guessable and exploitable. We're instructing // the model not to try and generate anything and instead leave the field unset. password: AtlasArgs.password() - .optional() - .nullable() + .nullish() .describe( "Password for the new user. IMPORTANT: If the user hasn't supplied an explicit password, leave it unset and under no circumstances try to generate a random one. A secure password will be generated by the MCP server if necessary." ), From f5301235451fdcb88ac2aac28dcc557464c7a855 Mon Sep 17 00:00:00 2001 From: Himanshu Singh Date: Tue, 16 Sep 2025 14:18:33 +0200 Subject: [PATCH 46/49] chore: extend lib to provide configurable properties for VSCode (#565) --- src/common/config.ts | 2 +- src/lib.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/config.ts b/src/common/config.ts index 8702c96e2..f905c4f4e 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -101,7 +101,7 @@ interface Options { configuration: Record; } -const ALL_CONFIG_KEYS = new Set( +export const ALL_CONFIG_KEYS = new Set( (OPTIONS.string as readonly string[]) .concat(OPTIONS.array) .concat(OPTIONS.boolean) diff --git a/src/lib.ts b/src/lib.ts index bb2a631ea..c81472e0b 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,6 +1,6 @@ export { Server, type ServerOptions } from "./server.js"; export { Session, type SessionOptions } from "./common/session.js"; -export { defaultUserConfig, type UserConfig } from "./common/config.js"; +export { defaultUserConfig, type UserConfig, ALL_CONFIG_KEYS as configurableProperties } from "./common/config.js"; export { LoggerBase, type LogPayload, type LoggerType, type LogLevel } from "./common/logger.js"; export { StreamableHttpRunner } from "./transports/streamableHttp.js"; export { From 18ef230f60c28a3cdc2a7278a64c186d88b758d9 Mon Sep 17 00:00:00 2001 From: "mongodb-devtools-bot[bot]" <189715634+mongodb-devtools-bot[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 13:38:18 +0100 Subject: [PATCH 47/49] chore: release v1.0.0-prerelease.2 (#566) Co-authored-by: mongodb-devtools-bot[bot] <189715634+mongodb-devtools-bot[bot]@users.noreply.github.com> --- package-lock.json | 4 ++-- package.json | 2 +- src/common/packageInfo.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34dfe1b6c..97525439b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mongodb-mcp-server", - "version": "1.0.0-prerelease.1", + "version": "1.0.0-prerelease.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mongodb-mcp-server", - "version": "1.0.0-prerelease.1", + "version": "1.0.0-prerelease.2", "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "^1.17.4", diff --git a/package.json b/package.json index aaba4f18a..b4e260da8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mongodb-mcp-server", "description": "MongoDB Model Context Protocol Server", - "version": "1.0.0-prerelease.1", + "version": "1.0.0-prerelease.2", "type": "module", "exports": { ".": { diff --git a/src/common/packageInfo.ts b/src/common/packageInfo.ts index b136df898..e727f2d97 100644 --- a/src/common/packageInfo.ts +++ b/src/common/packageInfo.ts @@ -1,5 +1,5 @@ // This file was generated by scripts/updatePackageVersion.ts - Do not edit it manually. export const packageInfo = { - version: "1.0.0-prerelease.1", + version: "1.0.0-prerelease.2", mcpServerName: "MongoDB MCP Server", }; From d432be1eee6f26c33d8659c566d81502a2d24d52 Mon Sep 17 00:00:00 2001 From: Himanshu Singh Date: Tue, 16 Sep 2025 16:28:04 +0200 Subject: [PATCH 48/49] chore: add missing config properties for verification (#567) --- src/common/config.ts | 7 +++++-- tests/unit/common/config.test.ts | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/common/config.ts b/src/common/config.ts index f905c4f4e..d335fbb43 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -49,6 +49,9 @@ const OPTIONS = { "tlsDisabledProtocols", "username", "atlasTemporaryDatabaseUserLifetimeMs", + "exportsPath", + "exportTimeoutMs", + "exportCleanupIntervalMs", ], boolean: [ "apiDeprecationErrors", @@ -72,7 +75,7 @@ const OPTIONS = { "tlsFIPSMode", "version", ], - array: ["disabledTools", "loggers"], + array: ["disabledTools", "loggers", "confirmationRequiredTools"], alias: { h: "help", p: "password", @@ -358,7 +361,7 @@ export function warnAboutDeprecatedOrUnknownCliArgs( if (knownArgs.connectionString) { usedDeprecatedArgument = true; warn( - "The --connectionString argument is deprecated. Prefer using the first positional argument for the connection string or the MDB_MCP_CONNECTION_STRING environment variable." + "The --connectionString argument is deprecated. Prefer using the MDB_MCP_CONNECTION_STRING environment variable or the first positional argument for the connection string." ); } diff --git a/tests/unit/common/config.test.ts b/tests/unit/common/config.test.ts index 9e0a739f1..78a0382ef 100644 --- a/tests/unit/common/config.test.ts +++ b/tests/unit/common/config.test.ts @@ -656,7 +656,7 @@ describe("CLI arguments", () => { { cliArg: "connectionString", warning: - "The --connectionString argument is deprecated. Prefer using the first positional argument for the connection string or the MDB_MCP_CONNECTION_STRING environment variable.", + "The --connectionString argument is deprecated. Prefer using the MDB_MCP_CONNECTION_STRING environment variable or the first positional argument for the connection string.", }, ] as TestCase[]; From 9d0fda828e360b1b5575e81e3d9c82763eb361fb Mon Sep 17 00:00:00 2001 From: "mongodb-devtools-bot[bot]" <189715634+mongodb-devtools-bot[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 14:46:20 +0000 Subject: [PATCH 49/49] chore: release v1.0.0 (#568) Co-authored-by: mongodb-devtools-bot[bot] <189715634+mongodb-devtools-bot[bot]@users.noreply.github.com> --- package-lock.json | 4 ++-- package.json | 2 +- src/common/packageInfo.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97525439b..b0ca67ed7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mongodb-mcp-server", - "version": "1.0.0-prerelease.2", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mongodb-mcp-server", - "version": "1.0.0-prerelease.2", + "version": "1.0.0", "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "^1.17.4", diff --git a/package.json b/package.json index b4e260da8..c6da0bcbe 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mongodb-mcp-server", "description": "MongoDB Model Context Protocol Server", - "version": "1.0.0-prerelease.2", + "version": "1.0.0", "type": "module", "exports": { ".": { diff --git a/src/common/packageInfo.ts b/src/common/packageInfo.ts index e727f2d97..341558a96 100644 --- a/src/common/packageInfo.ts +++ b/src/common/packageInfo.ts @@ -1,5 +1,5 @@ // This file was generated by scripts/updatePackageVersion.ts - Do not edit it manually. export const packageInfo = { - version: "1.0.0-prerelease.2", + version: "1.0.0", mcpServerName: "MongoDB MCP Server", };