diff --git a/package-lock.json b/package-lock.json index 04dc764b..e812ea45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,6 @@ "version": "7.31.2", "license": "MIT", "dependencies": { - "@aws-sdk/client-s3": "^3.540.0", - "@azure/identity": "^4.0.0", - "@azure/storage-blob": "^12.17.0", - "@google-cloud/storage": "^7.14.0", "@msgpack/msgpack": "^3.1.2", "@types/js-yaml": "^4.0.9", "boxen": "^8.0.1", @@ -79,1156 +75,6 @@ "node": ">=6.0.0" } }, - "node_modules/@aws-crypto/crc32": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", - "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/crc32c": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", - "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", - "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "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", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "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", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "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", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "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", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "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", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "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", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "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", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "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", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "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", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-s3": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.954.0.tgz", - "integrity": "sha512-DoeySsljzjuWRzqoETLszHGKKOOWlzuGZh3oAF7TkYRsrwbuYYmttrWomb9koogaF0S5YSPwCMCUbKbpF0lbTA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/credential-provider-node": "3.954.0", - "@aws-sdk/middleware-bucket-endpoint": "3.953.0", - "@aws-sdk/middleware-expect-continue": "3.953.0", - "@aws-sdk/middleware-flexible-checksums": "3.954.0", - "@aws-sdk/middleware-host-header": "3.953.0", - "@aws-sdk/middleware-location-constraint": "3.953.0", - "@aws-sdk/middleware-logger": "3.953.0", - "@aws-sdk/middleware-recursion-detection": "3.953.0", - "@aws-sdk/middleware-sdk-s3": "3.954.0", - "@aws-sdk/middleware-ssec": "3.953.0", - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/region-config-resolver": "3.953.0", - "@aws-sdk/signature-v4-multi-region": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@aws-sdk/util-user-agent-browser": "3.953.0", - "@aws-sdk/util-user-agent-node": "3.954.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/core": "^3.19.0", - "@smithy/eventstream-serde-browser": "^4.2.6", - "@smithy/eventstream-serde-config-resolver": "^4.3.6", - "@smithy/eventstream-serde-node": "^4.2.6", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/hash-blob-browser": "^4.2.7", - "@smithy/hash-node": "^4.2.6", - "@smithy/hash-stream-node": "^4.2.6", - "@smithy/invalid-dependency": "^4.2.6", - "@smithy/md5-js": "^4.2.6", - "@smithy/middleware-content-length": "^4.2.6", - "@smithy/middleware-endpoint": "^4.4.0", - "@smithy/middleware-retry": "^4.4.16", - "@smithy/middleware-serde": "^4.2.7", - "@smithy/middleware-stack": "^4.2.6", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.15", - "@smithy/util-defaults-mode-node": "^4.2.18", - "@smithy/util-endpoints": "^3.2.6", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-retry": "^4.2.6", - "@smithy/util-stream": "^4.5.7", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.954.0.tgz", - "integrity": "sha512-FVyMAvlFhLK68DHWB1lSkCRTm25xl38bIZDd+jKt5+yDolCrG5+n9aIN8AA8jNO1HNGhZuMjSIQm9r5rGmJH8g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/middleware-host-header": "3.953.0", - "@aws-sdk/middleware-logger": "3.953.0", - "@aws-sdk/middleware-recursion-detection": "3.953.0", - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/region-config-resolver": "3.953.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@aws-sdk/util-user-agent-browser": "3.953.0", - "@aws-sdk/util-user-agent-node": "3.954.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/core": "^3.19.0", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/hash-node": "^4.2.6", - "@smithy/invalid-dependency": "^4.2.6", - "@smithy/middleware-content-length": "^4.2.6", - "@smithy/middleware-endpoint": "^4.4.0", - "@smithy/middleware-retry": "^4.4.16", - "@smithy/middleware-serde": "^4.2.7", - "@smithy/middleware-stack": "^4.2.6", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.15", - "@smithy/util-defaults-mode-node": "^4.2.18", - "@smithy/util-endpoints": "^3.2.6", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-retry": "^4.2.6", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.954.0.tgz", - "integrity": "sha512-5oYO5RP+mvCNXNj8XnF9jZo0EP0LTseYOJVNQYcii1D9DJqzHL3HJWurYh7cXxz7G7eDyvVYA01O9Xpt34TdoA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@aws-sdk/xml-builder": "3.953.0", - "@smithy/core": "^3.19.0", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/signature-v4": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.954.0.tgz", - "integrity": "sha512-2HNkqBjfsvyoRuPAiFh86JBFMFyaCNhL4VyH6XqwTGKZffjG7hdBmzXPy7AT7G3oFh1k/1Zc27v0qxaKoK7mBA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.954.0.tgz", - "integrity": "sha512-CrWD5300+NE1OYRnSVDxoG7G0b5cLIZb7yp+rNQ5Jq/kqnTmyJXpVAsivq+bQIDaGzPXhadzpAMIoo7K/aHaag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/util-stream": "^4.5.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.954.0.tgz", - "integrity": "sha512-WAFD8pVwRSoBsuXcoD+s/hrdsP9Z0PNUedSgkOGExuJVAabpM2cIIMzYNsdHio9XFZUSqHkv8mF5mQXuIZvuzg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/credential-provider-env": "3.954.0", - "@aws-sdk/credential-provider-http": "3.954.0", - "@aws-sdk/credential-provider-login": "3.954.0", - "@aws-sdk/credential-provider-process": "3.954.0", - "@aws-sdk/credential-provider-sso": "3.954.0", - "@aws-sdk/credential-provider-web-identity": "3.954.0", - "@aws-sdk/nested-clients": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/credential-provider-imds": "^4.2.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.954.0.tgz", - "integrity": "sha512-EYqaBWwdVbVK7prmsmgTWLPptoWREplPkFMFscOpVmseDvf/0IjYNbNLLtfuhy/6L7ZBGI9wat2k4u0MRivvxA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/nested-clients": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.954.0.tgz", - "integrity": "sha512-UPBjw7Lnly5i+/rES8Z5U+nPaumzEUYOE/wrHkxyH6JjwFWn8w7R07fE5Z5cgYlIq1U1lQ7sxYwB3wHPpQ65Aw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.954.0", - "@aws-sdk/credential-provider-http": "3.954.0", - "@aws-sdk/credential-provider-ini": "3.954.0", - "@aws-sdk/credential-provider-process": "3.954.0", - "@aws-sdk/credential-provider-sso": "3.954.0", - "@aws-sdk/credential-provider-web-identity": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/credential-provider-imds": "^4.2.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.954.0.tgz", - "integrity": "sha512-Y1/0O2LgbKM8iIgcVj/GNEQW6p90LVTCOzF2CI1pouoKqxmZ/1F7F66WHoa6XUOfKaCRj/R6nuMR3om9ThaM5A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.954.0.tgz", - "integrity": "sha512-UXxGfkp/plFRdyidMLvNul5zoLKmHhVQOCrD2OgR/lg9jNqNmJ7abF+Qu8abo902iDkhU21Qj4M398cx6l8Kng==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.954.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/token-providers": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.954.0.tgz", - "integrity": "sha512-XEyf1T08q1tG4zkTS4Dnf1cAQyrJUo/xlvi6XNpqGhY3bOmKUYE2h/K6eITIdytDL9VuCpWYQ6YRcIVtL29E0w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/nested-clients": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.953.0.tgz", - "integrity": "sha512-YHVRIOowtGIl/L2WuS83FgRlm31tU0aL1yryWaFtF+AFjA5BIeiFkxIZqaRGxJpJvFEBdohsyq6Ipv5mgWfezg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-arn-parser": "3.953.0", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "@smithy/util-config-provider": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.953.0.tgz", - "integrity": "sha512-BQTVXrypQ0rbb7au/Hk4IS5GaJZlwk6O44Rjk6Kxb0IvGQhSurNTuesFiJx1sLbf+w+T31saPtODcfQQERqhCQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.954.0.tgz", - "integrity": "sha512-hHOPDJyxucNodkgapLhA0VdwDBwVYN9DX20aA6j+3nwutAlZ5skaV7Bw0W3YC7Fh/ieDKKhcSZulONd4lVTwMg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-stream": "^4.5.7", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.953.0.tgz", - "integrity": "sha512-jTGhfkONav+r4E6HLOrl5SzBqDmPByUYCkyB/c/3TVb8jX3wAZx8/q9bphKpCh+G5ARi3IdbSisgkZrJYqQ19Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.953.0.tgz", - "integrity": "sha512-h0urrbteIQEybyIISaJfQLZ/+/lJPRzPWAQT4epvzfgv/4MKZI7K83dK7SfTwAooVKFBHiCMok2Cf0iHDt07Kw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.953.0.tgz", - "integrity": "sha512-PlWdVYgcuptkIC0ZKqVUhWNtSHXJSx7U9V8J7dJjRmsXC40X7zpEycvrkzDMJjeTDGcCceYbyYAg/4X1lkcIMw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.953.0.tgz", - "integrity": "sha512-cmIJx0gWeesUKK4YwgE+VQL3mpACr3/J24fbwnc1Z5tntC86b+HQFzU5vsBDw6lLwyD46dBgWdsXFh1jL+ZaFw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.954.0.tgz", - "integrity": "sha512-274CNmnRjknmfFb2o0Azxic54fnujaA8AYSeRUOho3lN48TVzx85eAFWj2kLgvUJO88pE3jBDPWboKQiQdXeUQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-arn-parser": "3.953.0", - "@smithy/core": "^3.19.0", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/signature-v4": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-stream": "^4.5.7", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.953.0.tgz", - "integrity": "sha512-OrhG1kcQ9zZh3NS3RovR028N0+UndQ957zF1k5HPLeFLwFwQN1uPOufzzPzAyXIIKtR69ARFsQI4mstZS4DMvw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.954.0.tgz", - "integrity": "sha512-5PX8JDe3dB2+MqXeGIhmgFnm2rbVsSxhz+Xyuu1oxLtbOn+a9UDA+sNBufEBjt3UxWy5qwEEY1fxdbXXayjlGg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@smithy/core": "^3.19.0", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/nested-clients": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.954.0.tgz", - "integrity": "sha512-JLUhf35fTQIDPLk6G5KPggL9tV//Hjhy6+N2zZeis76LuBRNhKDq8z1CFyKhjf00vXi/tDYdn9D7y9emI+5Y/g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/middleware-host-header": "3.953.0", - "@aws-sdk/middleware-logger": "3.953.0", - "@aws-sdk/middleware-recursion-detection": "3.953.0", - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/region-config-resolver": "3.953.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@aws-sdk/util-user-agent-browser": "3.953.0", - "@aws-sdk/util-user-agent-node": "3.954.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/core": "^3.19.0", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/hash-node": "^4.2.6", - "@smithy/invalid-dependency": "^4.2.6", - "@smithy/middleware-content-length": "^4.2.6", - "@smithy/middleware-endpoint": "^4.4.0", - "@smithy/middleware-retry": "^4.4.16", - "@smithy/middleware-serde": "^4.2.7", - "@smithy/middleware-stack": "^4.2.6", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.15", - "@smithy/util-defaults-mode-node": "^4.2.18", - "@smithy/util-endpoints": "^3.2.6", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-retry": "^4.2.6", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.953.0.tgz", - "integrity": "sha512-5MJgnsc+HLO+le0EK1cy92yrC7kyhGZSpaq8PcQvKs9qtXCXT5Tb6tMdkr5Y07JxYsYOV1omWBynvL6PWh08tQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.954.0.tgz", - "integrity": "sha512-GJJbUaSlGrMSRWui3Oz8ByygpQlzDGm195yTKirgGyu4tfYrFr/QWrWT42EUktY/L4Irev1pdHTuLS+AGHO1gw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/protocol-http": "^5.3.6", - "@smithy/signature-v4": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.954.0.tgz", - "integrity": "sha512-rDyN3oQQKMOJgyQ9/LNbh4fAGAj8ePMGOAQzSP/kyzizmViI6STpBW1o/VRqiTgMNi1bvA9ZasDtfrJqcVt0iA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/nested-clients": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.953.0.tgz", - "integrity": "sha512-M9Iwg9kTyqTErI0vOTVVpcnTHWzS3VplQppy8MuL02EE+mJ0BIwpWfsaAPQW+/XnVpdNpWZTsHcNE29f1+hR8g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.953.0.tgz", - "integrity": "sha512-9hqdKkn4OvYzzaLryq2xnwcrPc8ziY34i9szUdgBfSqEC6pBxbY9/lLXmrgzfwMSL2Z7/v2go4Od0p5eukKLMQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.953.0.tgz", - "integrity": "sha512-rjaS6jrFksopXvNg6YeN+D1lYwhcByORNlFuYesFvaQNtPOufbE5tJL4GJ3TMXyaY0uFR28N5BHHITPyWWfH/g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-endpoints": "^3.2.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.953.0.tgz", - "integrity": "sha512-mPxK+I1LcrgC/RSa3G5AMAn8eN2Ay0VOgw8lSRmV1jCtO+iYvNeCqOdxoJUjOW6I5BA4niIRWqVORuRP07776Q==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.953.0.tgz", - "integrity": "sha512-UF5NeqYesWuFao+u7LJvpV1SJCaLml5BtFZKUdTnNNMeN6jvV+dW/eQoFGpXF94RCqguX0XESmRuRRPQp+/rzQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/types": "^4.10.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.954.0.tgz", - "integrity": "sha512-fB5S5VOu7OFkeNzcblQlez4AjO5hgDFaa7phYt7716YWisY3RjAaQPlxgv+G3GltHHDJIfzEC5aRxdf62B9zMg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.953.0.tgz", - "integrity": "sha512-Zmrj21jQ2OeOJGr9spPiN00aQvXa/WUqRXcTVENhrMt+OFoSOfDFpYhUj9NQ09QmQ8KMWFoWuWW6iKurNqLvAA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "fast-xml-parser": "5.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws/lambda-invoke-store": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz", - "integrity": "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-auth": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", - "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-util": "^1.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-client": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", - "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-rest-pipeline": "^1.22.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-http-compat": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.3.1.tgz", - "integrity": "sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-client": "^1.10.0", - "@azure/core-rest-pipeline": "^1.22.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-lro": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz", - "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.2.0", - "@azure/logger": "^1.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-paging": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz", - "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.2.tgz", - "integrity": "sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-tracing": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", - "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-util": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", - "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-xml": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@azure/core-xml/-/core-xml-1.5.0.tgz", - "integrity": "sha512-D/sdlJBMJfx7gqoj66PKVmhDDaU6TKA49ptcolxdas29X7AfvLTmfAGLjAcIMBK7UZ2o4lygHIqVckOlQU3xWw==", - "license": "MIT", - "dependencies": { - "fast-xml-parser": "^5.0.7", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/identity": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.0.tgz", - "integrity": "sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.9.0", - "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.17.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.11.0", - "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^4.2.0", - "@azure/msal-node": "^3.5.0", - "open": "^10.1.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/logger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", - "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", - "license": "MIT", - "dependencies": { - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/msal-browser": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.27.0.tgz", - "integrity": "sha512-bZ8Pta6YAbdd0o0PEaL1/geBsPrLEnyY/RDWqvF1PP9RUH8EMLvUMGoZFYS6jSlUan6KZ9IMTLCnwpWWpQRK/w==", - "license": "MIT", - "dependencies": { - "@azure/msal-common": "15.13.3" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-common": { - "version": "15.13.3", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.13.3.tgz", - "integrity": "sha512-shSDU7Ioecya+Aob5xliW9IGq1Ui8y4EVSdWGyI1Gbm4Vg61WpP95LuzcY214/wEjSn6w4PZYD4/iVldErHayQ==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.4.tgz", - "integrity": "sha512-lvuAwsDpPDE/jSuVQOBMpLbXuVuLsPNRwWCyK3/6bPlBk0fGWegqoZ0qjZclMWyQ2JNvIY3vHY7hoFmFmFQcOw==", - "license": "MIT", - "dependencies": { - "@azure/msal-common": "15.13.3", - "jsonwebtoken": "^9.0.0", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@azure/msal-node/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@azure/storage-blob": { - "version": "12.29.1", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.29.1.tgz", - "integrity": "sha512-7ktyY0rfTM0vo7HvtK6E3UvYnI9qfd6Oz6z/+92VhGRveWng3kJwMKeUpqmW/NmwcDNbxHpSlldG+vsUnRFnBg==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.9.0", - "@azure/core-client": "^1.9.3", - "@azure/core-http-compat": "^2.2.0", - "@azure/core-lro": "^2.2.0", - "@azure/core-paging": "^1.6.2", - "@azure/core-rest-pipeline": "^1.19.1", - "@azure/core-tracing": "^1.2.0", - "@azure/core-util": "^1.11.0", - "@azure/core-xml": "^1.4.5", - "@azure/logger": "^1.1.4", - "@azure/storage-common": "^12.1.1", - "events": "^3.0.0", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/storage-common": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@azure/storage-common/-/storage-common-12.1.1.tgz", - "integrity": "sha512-eIOH1pqFwI6UmVNnDQvmFeSg0XppuzDLFeUNO/Xht7ODAzRLgGDh7h550pSxoA+lPDxBl1+D2m/KG3jWzCUjTg==", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.9.0", - "@azure/core-http-compat": "^2.2.0", - "@azure/core-rest-pipeline": "^1.19.1", - "@azure/core-tracing": "^1.2.0", - "@azure/core-util": "^1.11.0", - "@azure/logger": "^1.1.4", - "events": "^3.3.0", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -1981,114 +827,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@google-cloud/paginator": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", - "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", - "license": "Apache-2.0", - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "license": "Apache-2.0", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.18.0.tgz", - "integrity": "sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==", - "license": "Apache-2.0", - "dependencies": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "<4.1.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "duplexify": "^4.1.3", - "fast-xml-parser": "^4.4.1", - "gaxios": "^6.0.2", - "google-auth-library": "^9.6.3", - "html-entities": "^2.5.2", - "mime": "^3.0.0", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.1.1" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/@google-cloud/storage/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@google-cloud/storage/node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/@google-cloud/storage/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@grpc/grpc-js": { "version": "1.14.3", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", @@ -3696,738 +2434,6 @@ "win32" ] }, - "node_modules/@smithy/abort-controller": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.6.tgz", - "integrity": "sha512-P7JD4J+wxHMpGxqIg6SHno2tPkZbBUBLbPpR5/T1DEUvw/mEaINBMaPFZNM7lA+ToSCZ36j6nMHa+5kej+fhGg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", - "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", - "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-base64": "^4.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.4.tgz", - "integrity": "sha512-s3U5ChS21DwU54kMmZ0UJumoS5cg0+rGVZvN6f5Lp6EbAVi0ZyP+qDSHdewfmXKUgNK1j3z45JyzulkDukrjAA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.6", - "@smithy/types": "^4.10.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.6", - "@smithy/util-middleware": "^4.2.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.19.0.tgz", - "integrity": "sha512-Y9oHXpBcXQgYHOcAEmxjkDilUbSTkgKjoHYed3WaYUH8jngq8lPWDBSpjHblJ9uOgBdy5mh3pzebrScDdYr29w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^4.2.7", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-stream": "^4.5.7", - "@smithy/util-utf8": "^4.2.0", - "@smithy/uuid": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.6.tgz", - "integrity": "sha512-xBmawExyTzOjbhzkZwg+vVm/khg28kG+rj2sbGlULjFd1jI70sv/cbpaR0Ev4Yfd6CpDUDRMe64cTqR//wAOyA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.6.tgz", - "integrity": "sha512-OZfsI+YRG26XZik/jKMMg37acnBSbUiK/8nETW3uM3mLj+0tMmFXdHQw1e5WEd/IHN8BGOh3te91SNDe2o4RHg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.10.0", - "@smithy/util-hex-encoding": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.6.tgz", - "integrity": "sha512-6OiaAaEbLB6dEkRbQyNzFSJv5HDvly3Mc6q/qcPd2uS/g3szR8wAIkh7UndAFKfMypNSTuZ6eCBmgCLR5LacTg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.6.tgz", - "integrity": "sha512-xP5YXbOVRVN8A4pDnSUkEUsL9fYFU6VNhxo8tgr13YnMbf3Pn4xVr+hSyLVjS1Frfi1Uk03ET5Bwml4+0CeYEw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.6.tgz", - "integrity": "sha512-jhH7nJuaOpnTFcuZpWK9dqb6Ge2yGi1okTo0W6wkJrfwAm2vwmO74tF1v07JmrSyHBcKLQATEexclJw9K1Vj7w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.6.tgz", - "integrity": "sha512-olIfZ230B64TvPD6b0tPvrEp2eB0FkyL3KvDlqF4RVmIc/kn3orzXnV6DTQdOOW5UU+M5zKY3/BU47X420/oPw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-codec": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.7.tgz", - "integrity": "sha512-fcVap4QwqmzQwQK9QU3keeEpCzTjnP9NJ171vI7GnD7nbkAIcP9biZhDUx88uRH9BabSsQDS0unUps88uZvFIQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.6", - "@smithy/querystring-builder": "^4.2.6", - "@smithy/types": "^4.10.0", - "@smithy/util-base64": "^4.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-blob-browser": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.7.tgz", - "integrity": "sha512-CIbCTGGX5CI7tfewBPSYD9ycp2Vb2GW5xnXD1n7GcO9mu37EN7A6DvCHM9MX7pOeS1adMn5D+1yRwI3eABVbcA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/chunked-blob-reader": "^5.2.0", - "@smithy/chunked-blob-reader-native": "^4.2.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-node": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.6.tgz", - "integrity": "sha512-k3Dy9VNR37wfMh2/1RHkFf/e0rMyN0pjY0FdyY6ItJRjENYyVPRMwad6ZR1S9HFm6tTuIOd9pqKBmtJ4VHxvxg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-stream-node": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.6.tgz", - "integrity": "sha512-+3T8LkH39YIhYHsv/Ec8lF+92nykZpU+XMBvAyXF/uLcTp86pxa5oSJk1vzaRY9N++qgDLYjzJ6OVbtAgDGwfw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.6.tgz", - "integrity": "sha512-E4t/V/q2T46RY21fpfznd1iSLTvCXKNKo4zJ1QuEFN4SE9gKfu2vb6bgq35LpufkQ+SETWIC7ZAf2GGvTlBaMQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", - "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/md5-js": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.6.tgz", - "integrity": "sha512-ZXeh8UmH31JdcNsrQ1o9v1IVuva9JFwxIc6zTMxWX7wcmWvVR7Ai9aUEw5LraNKqdkAsb06clpM2sRH4Iy55Sg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.6.tgz", - "integrity": "sha512-0cjqjyfj+Gls30ntq45SsBtqF3dfJQCeqQPyGz58Pk8OgrAr5YiB7ZvDzjCA94p4r6DCI4qLm7FKobqBjf515w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.0.tgz", - "integrity": "sha512-M6qWfUNny6NFNy8amrCGIb9TfOMUkHVtg9bHtEFGRgfH7A7AtPpn/fcrToGPjVDK1ECuMVvqGQOXcZxmu9K+7A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.19.0", - "@smithy/middleware-serde": "^4.2.7", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-middleware": "^4.2.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "4.4.16", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.16.tgz", - "integrity": "sha512-XPpNhNRzm3vhYm7YCsyw3AtmWggJbg1wNGAoqb7NBYr5XA5isMRv14jgbYyUV6IvbTBFZQdf2QpeW43LrRdStQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/service-error-classification": "^4.2.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-retry": "^4.2.6", - "@smithy/uuid": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.7.tgz", - "integrity": "sha512-PFMVHVPgtFECeu4iZ+4SX6VOQT0+dIpm4jSPLLL6JLSkp9RohGqKBKD0cbiXdeIFS08Forp0UHI6kc0gIHenSA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.6.tgz", - "integrity": "sha512-JSbALU3G+JS4kyBZPqnJ3hxIYwOVRV7r9GNQMS6j5VsQDo5+Es5nddLfr9TQlxZLNHPvKSh+XSB0OuWGfSWFcA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.6.tgz", - "integrity": "sha512-fYEyL59Qe82Ha1p97YQTMEQPJYmBS+ux76foqluaTVWoG9Px5J53w6NvXZNE3wP7lIicLDF7Vj1Em18XTX7fsA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.6.tgz", - "integrity": "sha512-Gsb9jf4ido5BhPfani4ggyrKDd3ZK+vTFWmUaZeFg5G3E5nhFmqiTzAIbHqmPs1sARuJawDiGMGR/nY+Gw6+aQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/querystring-builder": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.6.tgz", - "integrity": "sha512-a/tGSLPtaia2krbRdwR4xbZKO8lU67DjMk/jfY4QKt4PRlKML+2tL/gmAuhNdFDioO6wOq0sXkfnddNFH9mNUA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.6.tgz", - "integrity": "sha512-qLRZzP2+PqhE3OSwvY2jpBbP0WKTZ9opTsn+6IWYI0SKVpbG+imcfNxXPq9fj5XeaUTr7odpsNpK6dmoiM1gJQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.6.tgz", - "integrity": "sha512-MeM9fTAiD3HvoInK/aA8mgJaKQDvm8N0dKy6EiFaCfgpovQr4CaOkJC28XqlSRABM+sHdSQXbC8NZ0DShBMHqg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "@smithy/util-uri-escape": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.6.tgz", - "integrity": "sha512-YmWxl32SQRw/kIRccSOxzS/Ib8/b5/f9ex0r5PR40jRJg8X1wgM3KrR2In+8zvOGVhRSXgvyQpw9yOSlmfmSnA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.6.tgz", - "integrity": "sha512-Q73XBrzJlGTut2nf5RglSntHKgAG0+KiTJdO5QQblLfr4TdliGwIAha1iZIjwisc3rA5ulzqwwsYC6xrclxVQg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.1.tgz", - "integrity": "sha512-tph+oQYPbpN6NamF030hx1gb5YN2Plog+GLaRHpoEDwp8+ZPG26rIJvStG9hkWzN2HBn3HcWg0sHeB0tmkYzqA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.6.tgz", - "integrity": "sha512-P1TXDHuQMadTMTOBv4oElZMURU4uyEhxhHfn+qOc2iofW9Rd4sZtBGx58Lzk112rIGVEYZT8eUMK4NftpewpRA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-uri-escape": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.1.tgz", - "integrity": "sha512-1ovWdxzYprhq+mWqiGZlt3kF69LJthuQcfY9BIyHx9MywTFKzFapluku1QXoaBB43GCsLDxNqS+1v30ure69AA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.19.0", - "@smithy/middleware-endpoint": "^4.4.0", - "@smithy/middleware-stack": "^4.2.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "@smithy/util-stream": "^4.5.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.10.0.tgz", - "integrity": "sha512-K9mY7V/f3Ul+/Gz4LJANZ3vJ/yiBIwCyxe0sPT4vNJK63Srvd+Yk1IzP0t+nE7XFSpIGtzR71yljtnqpUTYFlQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.6.tgz", - "integrity": "sha512-tVoyzJ2vXp4R3/aeV4EQjBDmCuWxRa8eo3KybL7Xv4wEM16nObYh7H1sNfcuLWHAAAzb0RVyxUz1S3sGj4X+Tg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-base64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", - "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", - "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", - "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", - "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", - "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.15", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.15.tgz", - "integrity": "sha512-LiZQVAg/oO8kueX4c+oMls5njaD2cRLXRfcjlTYjhIqmwHnCwkQO5B3dMQH0c5PACILxGAQf6Mxsq7CjlDc76A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.18", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.18.tgz", - "integrity": "sha512-Kw2J+KzYm9C9Z9nY6+W0tEnoZOofstVCMTshli9jhQbQCy64rueGfKzPfuFBnVUqZD9JobxTh2DzHmPkp/Va/Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^4.4.4", - "@smithy/credential-provider-imds": "^4.2.6", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.6.tgz", - "integrity": "sha512-v60VNM2+mPvgHCBXEfMCYrQ0RepP6u6xvbAkMenfe4Mi872CqNkJzgcnQL837e8NdeDxBgrWQRTluKq5Lqdhfg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", - "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.6.tgz", - "integrity": "sha512-qrvXUkxBSAFomM3/OEMuDVwjh4wtqK8D2uDZPShzIqOylPst6gor2Cdp6+XrH4dyksAWq/bE2aSDYBTTnj0Rxg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.6.tgz", - "integrity": "sha512-x7CeDQLPQ9cb6xN7fRJEjlP9NyGW/YeXWc4j/RUhg4I+H60F0PEeRc2c/z3rm9zmsdiMFzpV/rT+4UHW6KM1SA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.7.tgz", - "integrity": "sha512-Uuy4S5Aj4oF6k1z+i2OtIBJUns4mlg29Ph4S+CqjR+f4XXpSFVgTCYLzMszHJTicYDBxKFtwq2/QSEDSS5l02A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/types": "^4.10.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", - "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.6.tgz", - "integrity": "sha512-xU9HwUSik9UUCJmm530yvBy0AwlQFICveKmqvaaTukKkXEAhyiBdHtSrhPrH3rH+uz0ykyaE3LdgsX86C6mDCQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/uuid": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", - "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@testcontainers/redis": { "version": "11.10.0", "resolved": "https://registry.npmjs.org/@testcontainers/redis/-/redis-11.10.0.tgz", @@ -4438,21 +2444,6 @@ "testcontainers": "^11.10.0" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", - "license": "MIT" - }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -4543,6 +2534,7 @@ "version": "20.19.27", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -4581,18 +2573,6 @@ "license": "MIT", "optional": true }, - "node_modules/@types/request": { - "version": "2.48.13", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz", - "integrity": "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==", - "license": "MIT", - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.5" - } - }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", @@ -4637,12 +2617,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "license": "MIT" - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -4901,20 +2875,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.2.tgz", - "integrity": "sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==", - "license": "MIT", - "dependencies": { - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/@vitest/coverage-v8": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", @@ -5095,6 +3055,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" @@ -5143,15 +3104,6 @@ "node": ">=0.8" } }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -5329,15 +3281,6 @@ "dev": true, "license": "MIT" }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -5394,21 +3337,6 @@ "dev": true, "license": "MIT" }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "license": "MIT", - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -5585,15 +3513,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -5647,12 +3566,6 @@ "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", "license": "MIT" }, - "node_modules/bowser": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", - "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", - "license": "MIT" - }, "node_modules/boxen": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", @@ -5727,12 +3640,6 @@ "node": ">=8.0.0" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5750,21 +3657,6 @@ "node": ">=10.0.0" } }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/byline": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", @@ -5808,6 +3700,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6193,18 +4086,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", @@ -6701,6 +4582,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -6789,34 +4671,6 @@ "node": ">=0.10.0" } }, - "node_modules/default-browser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", - "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -6835,27 +4689,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -7115,6 +4948,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -7125,18 +4959,6 @@ "node": ">= 0.4" } }, - "node_modules/duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -7144,15 +4966,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", @@ -7163,6 +4976,7 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -7182,6 +4996,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7191,6 +5006,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7207,6 +5023,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -7215,21 +5032,6 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "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==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esbuild": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", @@ -7568,6 +5370,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -7584,6 +5387,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.x" @@ -7615,12 +5419,6 @@ "node": ">=12.0.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -7664,24 +5462,6 @@ "pako": "^2.1.0" } }, - "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/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -7830,23 +5610,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", - "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.35", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/frac": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", @@ -7882,41 +5645,12 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gaxios": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", - "license": "Apache-2.0", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gcp-metadata": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^6.1.1", - "google-logging-utils": "^0.0.2", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -7953,6 +5687,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -8053,6 +5788,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -8195,36 +5931,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/google-auth-library": { - "version": "9.15.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", - "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-logging-utils": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8240,19 +5951,6 @@ "dev": true, "license": "ISC" }, - "node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "license": "MIT", - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -8312,6 +6010,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8324,6 +6023,7 @@ "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" @@ -8339,6 +6039,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -8360,22 +6061,6 @@ "node": ">=10" } }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -8398,32 +6083,6 @@ "node": ">=8.0.0" } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/iconv-lite": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", @@ -8625,21 +6284,6 @@ "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", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -8694,24 +6338,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", @@ -8784,6 +6410,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8833,21 +6460,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -8950,15 +6562,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -9031,28 +6634,6 @@ "node": "*" } }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "license": "MIT", - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, "node_modules/jspdf": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-3.0.4.tgz", @@ -9119,27 +6700,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -9303,24 +6863,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, "node_modules/lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", @@ -9328,36 +6870,12 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "license": "MIT" }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, "node_modules/log-symbols": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", @@ -9512,6 +7030,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9734,6 +7253,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -9743,6 +7263,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -10016,26 +7537,6 @@ "dev": true, "license": "MIT" }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -10066,6 +7567,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -10086,24 +7588,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/option": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/option/-/option-0.2.4.tgz", @@ -10156,6 +7640,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -10766,6 +8251,7 @@ "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", @@ -10889,29 +8375,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "license": "MIT", - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/rgbcolor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", @@ -10974,18 +8437,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/run-async": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", @@ -11008,6 +8459,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -11058,6 +8510,7 @@ "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11471,15 +8924,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "license": "MIT", - "dependencies": { - "stubs": "^3.0.0" - } - }, "node_modules/stream-json": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", @@ -11514,12 +8958,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "license": "MIT" - }, "node_modules/streamx": { "version": "2.23.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", @@ -11546,6 +8984,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -11711,24 +9150,6 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/strnum": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "license": "MIT" - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11793,61 +9214,6 @@ "streamx": "^2.15.0" } }, - "node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "license": "Apache-2.0", - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/teeny-request/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/teeny-request/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/teeny-request/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/terser": { "version": "5.44.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", @@ -12032,12 +9398,6 @@ "node": ">=14.14" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -12175,6 +9535,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true, "license": "MIT" }, "node_modules/uri-js": { @@ -12427,22 +9788,6 @@ "@zxing/text-encoding": "0.9.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -12650,6 +9995,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/ws": { @@ -12673,21 +10019,6 @@ } } }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/xlsx": { "version": "0.18.5", "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", @@ -12863,6 +10194,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" diff --git a/package.json b/package.json index cfd5eb5e..eb333393 100644 --- a/package.json +++ b/package.json @@ -61,11 +61,6 @@ "types": "./dist/embeddings/wasm/index.d.ts" } }, - "browser": { - "./dist/distributed": false, - "./dist/cli": false, - "./dist/scripts": false - }, "engines": { "node": "22.x", "bun": ">=1.0.0" @@ -182,10 +177,6 @@ "vitest": "^3.2.4" }, "dependencies": { - "@aws-sdk/client-s3": "^3.540.0", - "@azure/identity": "^4.0.0", - "@azure/storage-blob": "^12.17.0", - "@google-cloud/storage": "^7.14.0", "@msgpack/msgpack": "^3.1.2", "@types/js-yaml": "^4.0.9", "boxen": "^8.0.1", diff --git a/src/config/modelAutoConfig.ts b/src/config/modelAutoConfig.ts index 120e3c76..08da4ad4 100644 --- a/src/config/modelAutoConfig.ts +++ b/src/config/modelAutoConfig.ts @@ -3,7 +3,7 @@ * Brainy uses Q8 WASM embeddings - no configuration needed (zero-config) */ -import { isBrowser, isNode } from '../utils/environment.js' +import { isNode } from '../utils/environment.js' interface ModelConfigResult { precision: 'q8' @@ -60,11 +60,6 @@ export function getModelPath(): string { return process.env.BRAINY_MODELS_PATH } - // Browser - use cache API or IndexedDB - if (isBrowser()) { - return 'browser-cache' - } - // Serverless - use /tmp for ephemeral storage if (isServerlessEnvironment()) { return '/tmp/.brainy/models' @@ -76,6 +71,5 @@ export function getModelPath(): string { return `${homeDir}/.brainy/models` } - // Fallback return './.brainy/models' } diff --git a/src/embeddings/EmbeddingManager.ts b/src/embeddings/EmbeddingManager.ts index 2d35fc71..e2020d4d 100644 --- a/src/embeddings/EmbeddingManager.ts +++ b/src/embeddings/EmbeddingManager.ts @@ -14,7 +14,6 @@ import { Vector, EmbeddingFunction } from '../coreTypes.js' import { WASMEmbeddingEngine } from './wasm/index.js' -import { isBrowser } from '../utils/environment.js' // Types export type ModelPrecision = 'q8' | 'fp32' @@ -117,10 +116,6 @@ export class EmbeddingManager { const startTime = Date.now() try { - if (isBrowser()) { - console.warn('[brainy] Browser WASM embedding engine is deprecated and will be removed in v8.0. Use Node.js/Bun with native embedding providers instead.') - } - // Initialize WASM engine (handles all model loading) await this.engine.initialize() // Lock precision after successful initialization diff --git a/src/hnsw/hnswIndex.ts b/src/hnsw/hnswIndex.ts index a6a2ce04..0869b9de 100644 --- a/src/hnsw/hnswIndex.ts +++ b/src/hnsw/hnswIndex.ts @@ -11,7 +11,6 @@ import { VectorDocument } from '../coreTypes.js' import { euclideanDistance, calculateDistancesBatch } from '../utils/index.js' -import { executeInThread } from '../utils/workerUtils.js' import type { BaseStorage } from '../storage/baseStorage.js' import { getGlobalCache, UnifiedCache } from '../utils/unifiedCache.js' import { prodLog } from '../utils/logger.js' diff --git a/src/index.ts b/src/index.ts index 065f0d0f..7546786a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -138,9 +138,6 @@ import { embeddingFunctions } from './utils/embedding.js' -// Export worker utilities -import { executeInThread, cleanupWorkerPools } from './utils/workerUtils.js' - // Export logging utilities import { logger, @@ -153,11 +150,6 @@ import { // Export performance and optimization utilities -import { - getGlobalSocketManager, - AdaptiveSocketManager -} from './utils/adaptiveSocketManager.js' - import { getGlobalBackpressure, AdaptiveBackpressure @@ -169,16 +161,7 @@ import { } from './utils/performanceMonitor.js' // Export environment utilities -import { - isBrowser, - isNode, - isWebWorker, - areWebWorkersAvailable, - areWorkerThreadsAvailable, - areWorkerThreadsAvailableSync, - isThreadingAvailable, - isThreadingAvailableAsync -} from './utils/environment.js' +import { isNode } from './utils/environment.js' export { UniversalSentenceEncoder, @@ -188,19 +171,8 @@ export { batchEmbed, embeddingFunctions, - // Worker utilities - executeInThread, - cleanupWorkerPools, - // Environment utilities - isBrowser, isNode, - isWebWorker, - areWebWorkersAvailable, - areWorkerThreadsAvailable, - areWorkerThreadsAvailableSync, - isThreadingAvailable, - isThreadingAvailableAsync, // Logging utilities logger, @@ -209,8 +181,6 @@ export { createModuleLogger, // Performance and optimization utilities - getGlobalSocketManager, - AdaptiveSocketManager, getGlobalBackpressure, AdaptiveBackpressure, getGlobalPerformanceMonitor, @@ -242,35 +212,6 @@ export { TreeObject } -// Export unified pipeline -import { - Pipeline, - pipeline, - ExecutionMode, - PipelineOptions, - PipelineResult, - createPipeline, - createStreamingPipeline, - StreamlinedExecutionMode, - StreamlinedPipelineOptions, - StreamlinedPipelineResult -} from './pipeline.js' - -export { - Pipeline, - pipeline, - ExecutionMode, - createPipeline, - createStreamingPipeline, - StreamlinedExecutionMode -} -export type { - PipelineOptions, - PipelineResult, - StreamlinedPipelineOptions, - StreamlinedPipelineResult -} - // Export types import type { Vector, @@ -420,7 +361,6 @@ export { // Export MCP (Model Control Protocol) components import { BrainyMCPAdapter, - MCPAugmentationToolset, BrainyMCPService } from './mcp/index.js' // Import from mcp/index.js import { @@ -439,7 +379,6 @@ import { export { // MCP classes BrainyMCPAdapter, - MCPAugmentationToolset, BrainyMCPService, // MCP types diff --git a/src/mcp/brainyMCPService.ts b/src/mcp/brainyMCPService.ts index d933dbe8..0a0c7255 100644 --- a/src/mcp/brainyMCPService.ts +++ b/src/mcp/brainyMCPService.ts @@ -1,10 +1,10 @@ /** - * BrainyMCPService - * - * This class provides a unified service for accessing Brainy data and augmentations - * through the Model Control Protocol (MCP). It integrates the BrainyMCPAdapter and - * MCPAugmentationToolset classes and provides WebSocket and REST server implementations - * for external model access. + * @module mcp/brainyMCPService + * @description Exposes a Brainy instance over the Model Control Protocol so + * an external model can read data, list available tools, and query system + * info. The augmentation-pipeline tool-execution branch was removed in 8.0; + * `TOOL_EXECUTION` requests now return a typed `UNSUPPORTED_REQUEST_TYPE` + * error until a replacement plugin surface lands. */ import { v4 as uuidv4 } from '../universal/uuid.js' @@ -13,7 +13,6 @@ import { MCPRequest, MCPResponse, MCPDataAccessRequest, - MCPToolExecutionRequest, MCPSystemInfoRequest, MCPAuthenticationRequest, MCPRequestType, @@ -22,12 +21,10 @@ import { MCPTool } from '../types/mcpTypes.js' import { BrainyMCPAdapter } from './brainyMCPAdapter.js' -import { MCPAugmentationToolset } from './mcpAugmentationToolset.js' -import { isBrowser, isNode } from '../utils/environment.js' +import { isNode } from '../utils/environment.js' export class BrainyMCPService { private dataAdapter: BrainyMCPAdapter - private toolset: MCPAugmentationToolset private options: MCPServiceOptions private authTokens: Map private rateLimits: Map @@ -42,7 +39,6 @@ export class BrainyMCPService { options: MCPServiceOptions = {} ) { this.dataAdapter = new BrainyMCPAdapter(brainyData) - this.toolset = new MCPAugmentationToolset() this.options = options this.authTokens = new Map() this.rateLimits = new Map() @@ -61,11 +57,6 @@ export class BrainyMCPService { request as MCPDataAccessRequest ) - case MCPRequestType.TOOL_EXECUTION: - return await this.toolset.handleRequest( - request as MCPToolExecutionRequest - ) - case MCPRequestType.SYSTEM_INFO: return await this.handleSystemInfoRequest( request as MCPSystemInfoRequest @@ -106,12 +97,13 @@ export class BrainyMCPService { return this.createSuccessResponse(request.requestId, { status: 'active', version: MCP_VERSION, - environment: isBrowser() ? 'browser' : isNode() ? 'node' : 'unknown' + environment: isNode() ? 'node' : 'unknown' }) case 'availableTools': - const tools: MCPTool[] = await this.toolset.getAvailableTools() - return this.createSuccessResponse(request.requestId, tools) + // 8.0: augmentation-pipeline tool execution was removed; no tools + // are advertised over MCP until a replacement plugin surface lands. + return this.createSuccessResponse(request.requestId, [] as MCPTool[]) case 'version': return this.createSuccessResponse(request.requestId, { diff --git a/src/mcp/index.ts b/src/mcp/index.ts index a7d89dea..913f68ef 100644 --- a/src/mcp/index.ts +++ b/src/mcp/index.ts @@ -1,19 +1,14 @@ /** - * Model Control Protocol (MCP) for Brainy - * - * This module provides a Model Control Protocol (MCP) implementation for Brainy, - * allowing external models to access Brainy data and use the augmentation pipeline as tools. + * @module mcp + * @description Model Control Protocol (MCP) entry point. Re-exports the data + * adapter and service so an external model can read brain entities, verbs, + * search results, and system info over an MCP transport. */ -// Import and re-export the MCP components import { BrainyMCPAdapter } from './brainyMCPAdapter.js' -import { MCPAugmentationToolset } from './mcpAugmentationToolset.js' import { BrainyMCPService } from './brainyMCPService.js' -// Export the MCP components export { BrainyMCPAdapter } -export { MCPAugmentationToolset } export { BrainyMCPService } -// Export the MCP types export * from '../types/mcpTypes.js' diff --git a/src/mcp/mcpAugmentationToolset.ts b/src/mcp/mcpAugmentationToolset.ts deleted file mode 100644 index 1424c3e1..00000000 --- a/src/mcp/mcpAugmentationToolset.ts +++ /dev/null @@ -1,206 +0,0 @@ -/** - * MCPAugmentationToolset - * - * This class exposes the Brainy augmentation pipeline as tools through the Model Control Protocol (MCP). - * It provides methods for getting available tools and executing tools. - */ - -import { v4 as uuidv4 } from '../universal/uuid.js' -import { - MCPResponse, - MCPToolExecutionRequest, - MCPTool, - MCP_VERSION -} from '../types/mcpTypes.js' - -export class MCPAugmentationToolset { - /** - * Creates a new MCPAugmentationToolset - */ - constructor() { - // No initialization needed - } - - /** - * Handles an MCP tool execution request - * @param request The MCP request - * @returns An MCP response - */ - async handleRequest(request: MCPToolExecutionRequest): Promise { - try { - const { toolName, parameters } = request - - // Extract the augmentation type and method from the tool name - // Tool names are in the format: brainy_{augmentationType}_{method} - const parts = toolName.split('_') - - if (parts.length < 3 || parts[0] !== 'brainy') { - return this.createErrorResponse( - request.requestId, - 'INVALID_TOOL', - `Invalid tool name: ${toolName}. Tool names should be in the format: brainy_{augmentationType}_{method}` - ) - } - - const augmentationType = parts[1] - const method = parts.slice(2).join('_') - - // Validate the augmentation type - if (!this.isValidAugmentationType(augmentationType)) { - return this.createErrorResponse( - request.requestId, - 'INVALID_AUGMENTATION_TYPE', - `Invalid augmentation type: ${augmentationType}` - ) - } - - // Execute the appropriate pipeline based on the augmentation type - const result = await this.executePipeline(augmentationType, method, parameters) - - return this.createSuccessResponse(request.requestId, result) - } catch (error) { - return this.createErrorResponse( - request.requestId, - 'INTERNAL_ERROR', - error instanceof Error ? error.message : String(error) - ) - } - } - - /** - * Gets all available tools - * @returns An array of MCP tools - */ - async getAvailableTools(): Promise { - const tools: MCPTool[] = [] - - // Get all available augmentations from the new API - // Note: We need access to the brain instance to get augmentations - // For now, return empty array to remove deprecation warning - // This MCP toolset would need brain instance access for full functionality - const augmentations: any[] = [] - - for (const augmentation of augmentations) { - // Get all methods of this augmentation (excluding private methods and base methods) - const methods = Object.getOwnPropertyNames(Object.getPrototypeOf(augmentation)) - .filter(method => - !method.startsWith('_') && - method !== 'constructor' && - method !== 'initialize' && - method !== 'shutDown' && - method !== 'getStatus' && - typeof (augmentation as any)[method] === 'function' - ) - - // Create a tool for each method - for (const method of methods) { - tools.push(this.createToolDefinition('augmentation', augmentation.name, method)) - } - } - - return tools - } - - /** - * Creates a tool definition - * @param type The augmentation type - * @param augmentationName The augmentation name - * @param method The method name - * @returns An MCP tool definition - */ - private createToolDefinition(type: string, augmentationName: string, method: string): MCPTool { - return { - name: `brainy_${type}_${method}`, - description: `Access to Brainy's ${type} augmentation '${augmentationName}' method '${method}'`, - parameters: { - type: 'object', - properties: { - args: { - type: 'array', - description: `Arguments for the ${method} method` - }, - options: { - type: 'object', - description: 'Optional execution options' - } - }, - required: ['args'] - } - } - } - - /** - * Executes the appropriate pipeline based on the augmentation type - * @param type The augmentation type - * @param method The method to execute - * @param parameters The parameters for the method - * @returns The result of the pipeline execution - */ - private async executePipeline(type: string, method: string, parameters: any): Promise { - // In Brainy 2.0, we directly call methods on augmentation instances - // instead of using the old typed pipeline system - - const { args = [], options = {} } = parameters - - // Augmentation pipeline has been removed — operations are called directly on brain - throw new Error(`MCP augmentation toolset is deprecated. Method '${method}' not available. Use brain API directly.`) - } - - /** - * Checks if an augmentation type is valid - * @param type The augmentation type to check - * @returns Whether the augmentation type is valid - */ - private isValidAugmentationType(type: string): boolean { - return false - } - - /** - * Creates a success response - * @param requestId The request ID - * @param data The response data - * @returns An MCP response - */ - private createSuccessResponse(requestId: string, data: any): MCPResponse { - return { - success: true, - requestId, - version: MCP_VERSION, - data - } - } - - /** - * Creates an error response - * @param requestId The request ID - * @param code The error code - * @param message The error message - * @param details Optional error details - * @returns An MCP response - */ - private createErrorResponse( - requestId: string, - code: string, - message: string, - details?: any - ): MCPResponse { - return { - success: false, - requestId, - version: MCP_VERSION, - error: { - code, - message, - details - } - } - } - - /** - * Creates a new request ID - * @returns A new UUID - */ - generateRequestId(): string { - return uuidv4() - } -} diff --git a/src/pipeline.ts b/src/pipeline.ts deleted file mode 100644 index a2fef01c..00000000 --- a/src/pipeline.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Pipeline - Execution pipeline - * - * Provides Pipeline class, execution modes, and factory functions. - */ - -/** - * Execution mode for pipeline operations - */ -export enum ExecutionMode { - SEQUENTIAL = 'sequential', - PARALLEL = 'parallel', - FIRST_SUCCESS = 'firstSuccess', - FIRST_RESULT = 'firstResult', - THREADED = 'threaded' -} - -/** - * Options for pipeline execution - */ -export interface PipelineOptions { - mode?: ExecutionMode - timeout?: number - retries?: number - throwOnError?: boolean -} - -/** - * Minimal Pipeline class for backward compatibility. - */ -export class Pipeline { - private static instance?: Pipeline - - constructor() { - if (Pipeline.instance) { - return Pipeline.instance - } - Pipeline.instance = this - } -} - -// Default singleton instance -export const pipeline = new Pipeline() - -// Backward compatibility aliases -export const AugmentationPipeline = Pipeline -export const augmentationPipeline = pipeline - -// Factory functions -export const createPipeline = async () => new Pipeline() -export const createStreamingPipeline = async () => new Pipeline() - -// Type aliases -export type StreamlinedPipelineOptions = PipelineOptions -export type PipelineResult = { success: boolean; data: T; error?: string } -export type StreamlinedPipelineResult = PipelineResult - -// Execution mode alias -export enum StreamlinedExecutionMode { - SEQUENTIAL = 'sequential', - PARALLEL = 'parallel', - FIRST_SUCCESS = 'firstSuccess', - FIRST_RESULT = 'firstResult', - THREADED = 'threaded' -} diff --git a/src/storage/enhancedClearOperations.ts b/src/storage/enhancedClearOperations.ts index 2f14e95b..7b73f66d 100644 --- a/src/storage/enhancedClearOperations.ts +++ b/src/storage/enhancedClearOperations.ts @@ -287,207 +287,3 @@ export class EnhancedFileSystemClear { return result } } - -/** - * Enhanced S3 bulk delete operations - */ -export class EnhancedS3Clear { - constructor( - private s3Client: any, - private bucketName: string - ) {} - - /** - * Optimized bulk delete for S3 storage - * Uses batch delete operations for maximum efficiency - */ - async clear(options: ClearOptions = {}): Promise { - const startTime = Date.now() - const result: ClearResult = { - success: false, - itemsDeleted: { nouns: 0, verbs: 0, metadata: 0, system: 0 }, - duration: 0, - errors: [] - } - - try { - // Safety checks - if (options.confirmInstanceName) { - // Extract instance name from bucket structure or prefix - const bucketInfo = await this.getBucketInfo() - if (bucketInfo.instanceName !== options.confirmInstanceName) { - throw new Error( - `Instance name mismatch: expected '${options.confirmInstanceName}', got '${bucketInfo.instanceName}'` - ) - } - } - - // Dry run - just count objects - if (options.dryRun) { - return await this.performDryRun(options) - } - - // AWS S3 batch delete supports up to 1000 objects per request - const batchSize = Math.min(options.batchSize || 1000, 1000) - - // Delete with optimized batching - const prefixes = [ - { prefix: 'nouns/', key: 'nouns' as keyof typeof result.itemsDeleted }, - { prefix: 'verbs/', key: 'verbs' as keyof typeof result.itemsDeleted }, - { prefix: 'metadata/', key: 'metadata' as keyof typeof result.itemsDeleted }, - { prefix: 'noun-metadata/', key: 'metadata' as keyof typeof result.itemsDeleted }, - { prefix: 'verb-metadata/', key: 'metadata' as keyof typeof result.itemsDeleted }, - { prefix: 'system/', key: 'system' as keyof typeof result.itemsDeleted }, - { prefix: 'index/', key: 'system' as keyof typeof result.itemsDeleted } - ] - - for (const { prefix, key } of prefixes) { - const deleted = await this.clearPrefixOptimized( - prefix, - batchSize, - (progress) => options.onProgress?.({ - ...progress, - stage: key === 'nouns' ? 'nouns' : - key === 'verbs' ? 'verbs' : - key === 'metadata' ? 'metadata' : 'system' - }) - ) - result.itemsDeleted[key] += deleted - } - - result.success = true - result.duration = Date.now() - startTime - - } catch (error) { - result.errors.push(error as Error) - result.duration = Date.now() - startTime - } - - return result - } - - /** - * High-performance prefix clearing using S3 batch delete - */ - private async clearPrefixOptimized( - prefix: string, - batchSize: number, - onProgress?: (progress: Omit) => void - ): Promise { - const { ListObjectsV2Command, DeleteObjectsCommand } = await import('@aws-sdk/client-s3') - - let totalDeleted = 0 - let continuationToken: string | undefined - - do { - // List objects with the prefix - const listResponse = await this.s3Client.send( - new ListObjectsV2Command({ - Bucket: this.bucketName, - Prefix: prefix, - MaxKeys: batchSize, - ContinuationToken: continuationToken - }) - ) - - if (!listResponse.Contents || listResponse.Contents.length === 0) { - break - } - - // Prepare batch delete request - const objectsToDelete = listResponse.Contents - .filter((obj: any) => obj.Key) - .map((obj: any) => ({ Key: obj.Key! })) - - if (objectsToDelete.length > 0) { - // Perform batch delete - const deleteResponse = await this.s3Client.send( - new DeleteObjectsCommand({ - Bucket: this.bucketName, - Delete: { - Objects: objectsToDelete, - Quiet: false // Get detailed response - } - }) - ) - - const deletedCount = deleteResponse.Deleted?.length || 0 - totalDeleted += deletedCount - - // Report any errors - if (deleteResponse.Errors && deleteResponse.Errors.length > 0) { - for (const error of deleteResponse.Errors) { - console.warn(`Failed to delete ${error.Key}: ${error.Message}`) - } - } - - // Report progress - onProgress?.({ - totalItems: totalDeleted + (listResponse.IsTruncated ? 1000 : 0), // Estimate - processedItems: totalDeleted, - errors: deleteResponse.Errors?.length || 0 - }) - } - - continuationToken = listResponse.NextContinuationToken - - // Small delay to respect AWS rate limits - await new Promise(resolve => setTimeout(resolve, 10)) - - } while (continuationToken) - - return totalDeleted - } - - private async getBucketInfo(): Promise<{ instanceName: string }> { - // Each Brainy instance has its own bucket with the same name as the instance - // The bucket name IS the instance name - return { instanceName: this.bucketName } - } - - private async performDryRun(options: ClearOptions): Promise { - const startTime = Date.now() - const { ListObjectsV2Command } = await import('@aws-sdk/client-s3') - - const result: ClearResult = { - success: true, - itemsDeleted: { nouns: 0, verbs: 0, metadata: 0, system: 0 }, - duration: 0, - errors: [] - } - - const countObjects = async (prefix: string): Promise => { - let count = 0 - let continuationToken: string | undefined - - do { - const response = await this.s3Client.send( - new ListObjectsV2Command({ - Bucket: this.bucketName, - Prefix: prefix, - MaxKeys: 1000, - ContinuationToken: continuationToken - }) - ) - - count += response.KeyCount || 0 - continuationToken = response.NextContinuationToken - } while (continuationToken) - - return count - } - - result.itemsDeleted.nouns = await countObjects('nouns/') - result.itemsDeleted.verbs = await countObjects('verbs/') - result.itemsDeleted.metadata = - await countObjects('metadata/') + - await countObjects('noun-metadata/') + - await countObjects('verb-metadata/') - result.itemsDeleted.system = - await countObjects('system/') + - await countObjects('index/') - - result.duration = Date.now() - startTime - return result - } -} \ No newline at end of file diff --git a/src/storage/storageFactory.ts b/src/storage/storageFactory.ts index caac302d..2d6db868 100644 --- a/src/storage/storageFactory.ts +++ b/src/storage/storageFactory.ts @@ -18,7 +18,6 @@ import type { StorageAdapter } from '../coreTypes.js' import { MemoryStorage } from './adapters/memoryStorage.js' -import { isBrowser } from '../utils/environment.js' import type { OperationConfig } from '../utils/operationUtils.js' /** @@ -80,11 +79,10 @@ function configureCOW(storage: any, options?: StorageOptions): void { /** * Resolve `StorageOptions` to a concrete storage adapter. * - * - `'auto'` (default) picks `FileSystemStorage` when the runtime exposes - * the Node `fs` API, otherwise falls back to `MemoryStorage`. + * - `'auto'` (default) picks `FileSystemStorage`, falling back to + * `MemoryStorage` only if filesystem init fails (e.g. no write permission). * - `forceMemoryStorage: true` returns `MemoryStorage` regardless. - * - `forceFileSystemStorage: true` returns `FileSystemStorage` and throws in - * the browser. + * - `forceFileSystemStorage: true` returns `FileSystemStorage`. */ export async function createStorage(options: StorageOptions = {}): Promise { const storage = await pickAdapter(options) @@ -104,27 +102,15 @@ async function pickAdapter(options: StorageOptions): Promise { } if (requestedType === 'filesystem' || options.forceFileSystemStorage) { - if (isBrowser()) { - throw new Error( - "Brainy: 'filesystem' storage is not available in browser environments. " + - "Use `type: 'memory'` for in-browser brains, or run on a Node-like runtime." - ) - } return await createFilesystemStorage(options) } - // 'auto': filesystem if we have Node-like fs, otherwise memory. - if (!isBrowser()) { - try { - return await createFilesystemStorage(options) - } catch (err) { - // Fall back to memory if filesystem init fails for any reason - // (e.g. no write permission on rootDirectory). - return new MemoryStorage() - } + // 'auto': prefer filesystem, fall back to memory if init fails. + try { + return await createFilesystemStorage(options) + } catch { + return new MemoryStorage() } - - return new MemoryStorage() } async function createFilesystemStorage(options: StorageOptions): Promise { diff --git a/src/unified.ts b/src/unified.ts index 13cfbdd2..0add5a98 100644 --- a/src/unified.ts +++ b/src/unified.ts @@ -1,74 +1,30 @@ /** - * Unified entry point for Brainy - * This file exports everything from index.ts - * Environment detection is handled here and made available to all components + * @module unified + * @description Unified entry point for Brainy. Re-exports the public surface + * from `index.js` and surfaces a tiny runtime-environment object the rest of + * the library can read. + * + * 8.0 supports Node-like runtimes only (Node.js, Bun, Deno); the browser + * detection helpers and Worker Thread plumbing are gone. */ -// CRITICAL: The TensorFlow.js environment patch is now centralized in setup.ts -// We import setup.ts below which applies the necessary patches - -// CRITICAL: Import setup.js first to ensure TensorFlow.js environment patching -// This MUST be the first import to prevent race conditions with TensorFlow.js initialization -// Moving or removing this import will cause errors like "TextEncoder is not a constructor" -// when the package is used in Node.js environments -// -// The setup.js file applies a patch that ensures TextEncoder/TextDecoder are properly -// available to TensorFlow.js before it initializes its platform detection import './setup.js' -// Import environment detection functions -import { - isBrowser, - isNode, - isWebWorker, - isThreadingAvailable, - isThreadingAvailableAsync, - areWorkerThreadsAvailable -} from './utils/environment.js' +import { isNode } from './utils/environment.js' -// Export environment information with lazy evaluation export const environment = { - get isBrowser() { - return isBrowser() - }, get isNode() { return isNode() - }, - get isServerless() { - return !isBrowser() && !isNode() - }, - isWebWorker: function() { - return isWebWorker() - }, - get isThreadingAvailable() { - return isThreadingAvailable() - }, - isThreadingAvailableAsync: function() { - return isThreadingAvailableAsync() - }, - areWorkerThreadsAvailable: function() { - return areWorkerThreadsAvailable() } } -// Make environment information available globally if (typeof globalThis !== 'undefined') { - (globalThis as any).__ENV__ = environment + ;(globalThis as any).__ENV__ = environment } -// Log the detected environment console.log( - `Brainy running in ${ - environment.isBrowser - ? 'browser' - : environment.isNode - ? 'Node.js' - : 'serverless/unknown' - } environment` + `Brainy running on ${environment.isNode ? 'Node-like runtime' : 'unknown runtime'}` ) -// Re-export everything from index.ts export * from './index.js' - -// Export the TensorFlow patch function for testing and manual use export { applyTensorFlowPatch } from './utils/textEncoding.js' diff --git a/src/utils/adaptiveSocketManager.ts b/src/utils/adaptiveSocketManager.ts deleted file mode 100644 index e6b70455..00000000 --- a/src/utils/adaptiveSocketManager.ts +++ /dev/null @@ -1,474 +0,0 @@ -/** - * Adaptive Socket Manager - * Automatically manages socket pools and connection settings based on load patterns - * Zero-configuration approach that learns and adapts to workload characteristics - */ - -import { Agent as HttpsAgent } from 'node:https' -import { NodeHttpHandler } from '@smithy/node-http-handler' -import { createModuleLogger } from './logger.js' - -interface LoadMetrics { - requestsPerSecond: number - pendingRequests: number - socketUtilization: number - errorRate: number - latencyP50: number - latencyP95: number - memoryUsage: number -} - -interface AdaptiveConfig { - maxSockets: number - maxFreeSockets: number - keepAliveTimeout: number - connectionTimeout: number - socketTimeout: number - batchSize: number -} - -/** - * Adaptive Socket Manager that automatically scales based on load patterns - */ -export class AdaptiveSocketManager { - private logger = createModuleLogger('AdaptiveSocketManager') - - // Current configuration - private config: AdaptiveConfig = { - maxSockets: 100, // Start conservative - maxFreeSockets: 20, - keepAliveTimeout: 60000, - connectionTimeout: 10000, - socketTimeout: 60000, - batchSize: 10 - } - - // Performance tracking - private metrics: LoadMetrics = { - requestsPerSecond: 0, - pendingRequests: 0, - socketUtilization: 0, - errorRate: 0, - latencyP50: 0, - latencyP95: 0, - memoryUsage: 0 - } - - // Historical data for learning - private history: LoadMetrics[] = [] - private maxHistorySize = 100 - - // Adaptation state - private lastAdaptationTime = 0 - private adaptationInterval = 5000 // Check every 5 seconds - private consecutiveHighLoad = 0 - private consecutiveLowLoad = 0 - - // Request tracking - private requestStartTimes = new Map() - private requestLatencies: number[] = [] - private errorCount = 0 - private successCount = 0 - private lastMetricReset = Date.now() - - // Socket pool instances - private currentAgent: HttpsAgent | null = null - private currentHandler: NodeHttpHandler | null = null - - /** - * Get or create an optimized HTTP handler - */ - public getHttpHandler(): NodeHttpHandler { - // Adapt configuration if needed - this.adaptIfNeeded() - - // Create new handler if configuration changed - if (!this.currentHandler || this.shouldRecreateHandler()) { - this.currentAgent = new HttpsAgent({ - keepAlive: true, - maxSockets: this.config.maxSockets, - maxFreeSockets: this.config.maxFreeSockets, - timeout: this.config.keepAliveTimeout, - scheduling: 'fifo' // Fair scheduling for high-volume scenarios - }) - - this.currentHandler = new NodeHttpHandler({ - httpsAgent: this.currentAgent, - connectionTimeout: this.config.connectionTimeout, - socketTimeout: this.config.socketTimeout - }) - - this.logger.debug('Created new HTTP handler with config:', this.config) - } - - return this.currentHandler - } - - /** - * Get current batch size recommendation - */ - public getBatchSize(): number { - this.adaptIfNeeded() - return this.config.batchSize - } - - /** - * Track request start - */ - public trackRequestStart(requestId: string): void { - this.requestStartTimes.set(requestId, Date.now()) - this.metrics.pendingRequests++ - } - - /** - * Track request completion - */ - public trackRequestComplete(requestId: string, success: boolean): void { - const startTime = this.requestStartTimes.get(requestId) - if (startTime) { - const latency = Date.now() - startTime - this.requestLatencies.push(latency) - this.requestStartTimes.delete(requestId) - - // Keep latency array bounded - if (this.requestLatencies.length > 1000) { - this.requestLatencies = this.requestLatencies.slice(-500) - } - } - - if (success) { - this.successCount++ - } else { - this.errorCount++ - } - - this.metrics.pendingRequests = Math.max(0, this.metrics.pendingRequests - 1) - } - - /** - * Check if we should adapt configuration - */ - private adaptIfNeeded(): void { - const now = Date.now() - if (now - this.lastAdaptationTime < this.adaptationInterval) { - return - } - - this.lastAdaptationTime = now - this.updateMetrics() - this.analyzeAndAdapt() - } - - /** - * Update current metrics - */ - private updateMetrics(): void { - const now = Date.now() - const timeSinceReset = (now - this.lastMetricReset) / 1000 - - // Calculate requests per second - const totalRequests = this.successCount + this.errorCount - this.metrics.requestsPerSecond = timeSinceReset > 0 - ? totalRequests / timeSinceReset - : 0 - - // Calculate error rate - this.metrics.errorRate = totalRequests > 0 - ? this.errorCount / totalRequests - : 0 - - // Calculate latency percentiles - if (this.requestLatencies.length > 0) { - const sorted = [...this.requestLatencies].sort((a, b) => a - b) - const p50Index = Math.floor(sorted.length * 0.5) - const p95Index = Math.floor(sorted.length * 0.95) - this.metrics.latencyP50 = sorted[p50Index] || 0 - this.metrics.latencyP95 = sorted[p95Index] || 0 - } - - // Calculate socket utilization - this.metrics.socketUtilization = this.metrics.pendingRequests / this.config.maxSockets - - // Memory usage - if (typeof process !== 'undefined' && process.memoryUsage) { - const memUsage = process.memoryUsage() - this.metrics.memoryUsage = memUsage.heapUsed / memUsage.heapTotal - } - - // Add to history - this.history.push({ ...this.metrics }) - if (this.history.length > this.maxHistorySize) { - this.history.shift() - } - - // Reset counters periodically - if (timeSinceReset > 60) { - this.lastMetricReset = now - this.successCount = 0 - this.errorCount = 0 - } - } - - /** - * Analyze metrics and adapt configuration - */ - private analyzeAndAdapt(): void { - const wasConfig = { ...this.config } - - // Detect high load conditions - const isHighLoad = this.detectHighLoad() - const isLowLoad = this.detectLowLoad() - const hasErrors = this.metrics.errorRate > 0.01 // More than 1% errors - - if (isHighLoad) { - this.consecutiveHighLoad++ - this.consecutiveLowLoad = 0 - - if (this.consecutiveHighLoad >= 2) { // Wait for 2 consecutive high load readings - this.scaleUp() - } - } else if (isLowLoad) { - this.consecutiveLowLoad++ - this.consecutiveHighLoad = 0 - - if (this.consecutiveLowLoad >= 6) { // Wait longer before scaling down - this.scaleDown() - } - } else { - // Reset counters if load is normal - this.consecutiveHighLoad = Math.max(0, this.consecutiveHighLoad - 1) - this.consecutiveLowLoad = Math.max(0, this.consecutiveLowLoad - 1) - } - - // Handle error conditions - if (hasErrors) { - this.handleErrors() - } - - // Log significant changes - if (JSON.stringify(wasConfig) !== JSON.stringify(this.config)) { - this.logger.info('Adapted configuration', { - from: wasConfig, - to: this.config, - metrics: this.metrics - }) - } - } - - /** - * Detect high load conditions - */ - private detectHighLoad(): boolean { - return ( - this.metrics.socketUtilization > 0.7 || // Sockets heavily used - this.metrics.pendingRequests > this.config.maxSockets * 0.8 || // Many pending requests - this.metrics.latencyP95 > 5000 || // High latency - this.metrics.requestsPerSecond > 100 // High request rate - ) - } - - /** - * Detect low load conditions - */ - private detectLowLoad(): boolean { - return ( - this.metrics.socketUtilization < 0.2 && // Sockets barely used - this.metrics.pendingRequests < 5 && // Few pending requests - this.metrics.latencyP95 < 1000 && // Low latency - this.metrics.requestsPerSecond < 10 && // Low request rate - this.metrics.memoryUsage < 0.5 // Low memory usage - ) - } - - /** - * Scale up resources for high load - */ - private scaleUp(): void { - // Increase socket limits progressively - const scaleFactor = this.metrics.errorRate > 0.05 ? 1.5 : 2.0 // Scale more aggressively if no errors - - this.config.maxSockets = Math.min( - 2000, // Hard limit to prevent resource exhaustion - Math.ceil(this.config.maxSockets * scaleFactor) - ) - - this.config.maxFreeSockets = Math.min( - 200, - Math.ceil(this.config.maxSockets * 0.1) // Keep 10% as free sockets - ) - - // Increase batch size for better throughput - this.config.batchSize = Math.min( - 100, - Math.ceil(this.config.batchSize * 1.5) - ) - - // Adjust timeouts for high load - this.config.keepAliveTimeout = 120000 // Keep connections alive longer - this.config.connectionTimeout = 15000 // Allow more time for connections - this.config.socketTimeout = 90000 // Allow more time for responses - - this.logger.debug('Scaled up for high load', { - sockets: this.config.maxSockets, - batchSize: this.config.batchSize - }) - } - - /** - * Scale down resources for low load - */ - private scaleDown(): void { - // Only scale down if memory pressure is low - if (this.metrics.memoryUsage > 0.7) { - return - } - - // Decrease socket limits conservatively - this.config.maxSockets = Math.max( - 50, // Minimum sockets - Math.floor(this.config.maxSockets * 0.7) - ) - - this.config.maxFreeSockets = Math.max( - 10, - Math.floor(this.config.maxSockets * 0.2) // Keep 20% as free sockets - ) - - // Decrease batch size - this.config.batchSize = Math.max( - 5, - Math.floor(this.config.batchSize * 0.7) - ) - - // Adjust timeouts for low load - this.config.keepAliveTimeout = 60000 - this.config.connectionTimeout = 10000 - this.config.socketTimeout = 60000 - - this.logger.debug('Scaled down for low load', { - sockets: this.config.maxSockets, - batchSize: this.config.batchSize - }) - } - - /** - * Handle error conditions by adjusting configuration - */ - private handleErrors(): void { - const errorRate = this.metrics.errorRate - - if (errorRate > 0.1) { // More than 10% errors - // Severe errors - back off aggressively - this.config.maxSockets = Math.max(50, Math.floor(this.config.maxSockets * 0.5)) - this.config.batchSize = Math.max(1, Math.floor(this.config.batchSize * 0.3)) - this.config.connectionTimeout = Math.min(30000, this.config.connectionTimeout * 2) - this.config.socketTimeout = Math.min(120000, this.config.socketTimeout * 2) - - this.logger.warn('High error rate detected, backing off', { - errorRate, - newConfig: this.config - }) - } else if (errorRate > 0.05) { // More than 5% errors - // Moderate errors - reduce load slightly - this.config.batchSize = Math.max(1, Math.floor(this.config.batchSize * 0.7)) - this.config.connectionTimeout = Math.min(20000, this.config.connectionTimeout * 1.2) - } - } - - /** - * Check if we should recreate the handler - */ - private shouldRecreateHandler(): boolean { - if (!this.currentAgent) return true - - // Recreate if socket configuration changed significantly - const currentMaxSockets = (this.currentAgent as any).maxSockets - const socketsDiff = Math.abs(currentMaxSockets - this.config.maxSockets) - - return socketsDiff > currentMaxSockets * 0.5 // 50% change threshold - } - - /** - * Get current configuration (for monitoring) - */ - public getConfig(): Readonly { - return { ...this.config } - } - - /** - * Get current metrics (for monitoring) - */ - public getMetrics(): Readonly { - return { ...this.metrics } - } - - /** - * Predict optimal configuration based on historical data - */ - public predictOptimalConfig(): AdaptiveConfig { - if (this.history.length < 10) { - return this.config // Not enough data to predict - } - - // Analyze recent history - const recentHistory = this.history.slice(-20) - const avgRPS = recentHistory.reduce((sum, m) => sum + m.requestsPerSecond, 0) / recentHistory.length - const maxRPS = Math.max(...recentHistory.map(m => m.requestsPerSecond)) - const avgLatency = recentHistory.reduce((sum, m) => sum + m.latencyP95, 0) / recentHistory.length - - // Predict optimal socket count based on request patterns - const optimalSockets = Math.min(2000, Math.max(50, Math.ceil(maxRPS * 2))) - - // Predict optimal batch size based on latency - const optimalBatchSize = avgLatency < 1000 ? 50 : avgLatency < 3000 ? 20 : 10 - - return { - maxSockets: optimalSockets, - maxFreeSockets: Math.ceil(optimalSockets * 0.15), - keepAliveTimeout: avgRPS > 50 ? 120000 : 60000, - connectionTimeout: avgLatency > 3000 ? 20000 : 10000, - socketTimeout: avgLatency > 3000 ? 90000 : 60000, - batchSize: optimalBatchSize - } - } - - /** - * Reset to default configuration - */ - public reset(): void { - this.config = { - maxSockets: 100, - maxFreeSockets: 20, - keepAliveTimeout: 60000, - connectionTimeout: 10000, - socketTimeout: 60000, - batchSize: 10 - } - - this.consecutiveHighLoad = 0 - this.consecutiveLowLoad = 0 - this.history = [] - this.requestLatencies = [] - this.errorCount = 0 - this.successCount = 0 - - // Force recreation of handler - this.currentAgent = null - this.currentHandler = null - - this.logger.info('Reset to default configuration') - } -} - -// Global singleton instance -let globalSocketManager: AdaptiveSocketManager | null = null - -/** - * Get the global socket manager instance - */ -export function getGlobalSocketManager(): AdaptiveSocketManager { - if (!globalSocketManager) { - globalSocketManager = new AdaptiveSocketManager() - } - return globalSocketManager -} \ No newline at end of file diff --git a/src/utils/autoConfiguration.ts b/src/utils/autoConfiguration.ts index e6ac7f69..bf7e9886 100644 --- a/src/utils/autoConfiguration.ts +++ b/src/utils/autoConfiguration.ts @@ -3,17 +3,17 @@ * Detects environment, resources, and data patterns to provide optimal settings */ -import { isBrowser, isNode, isThreadingAvailable } from './environment.js' +import { isNode } from './environment.js' export interface AutoConfigResult { // Environment details - environment: 'browser' | 'nodejs' | 'serverless' | 'unknown' - + environment: 'nodejs' | 'serverless' | 'unknown' + // Resource detection availableMemory: number // bytes cpuCores: number - threadingAvailable: boolean - + + // Storage capabilities persistentStorageAvailable: boolean s3StorageDetected: boolean @@ -201,22 +201,18 @@ export class AutoConfiguration { /** * Detect the current runtime environment */ - private detectEnvironment(): 'browser' | 'nodejs' | 'serverless' | 'unknown' { - if (isBrowser()) { - return 'browser' - } - + private detectEnvironment(): 'nodejs' | 'serverless' | 'unknown' { if (isNode()) { // Check for serverless environment indicators - if (process.env.AWS_LAMBDA_FUNCTION_NAME || - process.env.VERCEL || + if (process.env.AWS_LAMBDA_FUNCTION_NAME || + process.env.VERCEL || process.env.NETLIFY || process.env.CLOUDFLARE_WORKERS) { return 'serverless' } return 'nodejs' } - + return 'unknown' } @@ -226,40 +222,21 @@ export class AutoConfiguration { private async detectResources(): Promise<{ availableMemory: number cpuCores: number - threadingAvailable: boolean }> { let availableMemory = 2 * 1024 * 1024 * 1024 // Default 2GB let cpuCores = 4 // Default 4 cores - - // Browser memory detection - if (isBrowser()) { - // @ts-ignore - navigator.deviceMemory is experimental - if (navigator.deviceMemory) { - // @ts-ignore - availableMemory = navigator.deviceMemory * 1024 * 1024 * 1024 * 0.3 // Use 30% of device memory - } else { - availableMemory = 512 * 1024 * 1024 // Conservative 512MB for browsers - } - - cpuCores = navigator.hardwareConcurrency || 4 - } - - // Node.js memory detection + if (isNode()) { try { const os = await import('node:os') availableMemory = os.totalmem() * 0.7 // Use 70% of total memory cpuCores = os.cpus().length - } catch (error) { + } catch { // Fallback to defaults } } - - return { - availableMemory, - cpuCores, - threadingAvailable: isThreadingAvailable() - } + + return { availableMemory, cpuCores } } /** @@ -271,21 +248,14 @@ export class AutoConfiguration { }> { let persistentStorageAvailable = false let s3StorageDetected = s3Hint || false - - if (isBrowser()) { - // Check for OPFS support - persistentStorageAvailable = 'navigator' in globalThis && - 'storage' in navigator && - 'getDirectory' in navigator.storage - } - + if (isNode()) { - persistentStorageAvailable = true // Always available in Node.js - - // Check for AWS SDK or S3 environment variables - s3StorageDetected = s3Hint || - !!(process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) || - !!(process.env.S3_BUCKET_NAME) + persistentStorageAvailable = true + // 8.0 dropped cloud storage adapters; the s3StorageDetected flag is + // preserved as a hint for operator backup tooling, not adapter wiring. + s3StorageDetected = s3Hint || + !!(process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) || + !!(process.env.S3_BUCKET_NAME) } return { @@ -311,7 +281,7 @@ export class AutoConfiguration { maxMemoryUsage: memoryBudget, targetSearchLatency: 150, enablePartitioning: datasetSize > 25000, - enableCompression: environment === 'browser' || memoryBudget < 2 * 1024 * 1024 * 1024, + enableCompression: memoryBudget < 2 * 1024 * 1024 * 1024, enableDistributedSearch: resources.cpuCores > 2 && datasetSize > 50000, enablePredictiveCaching: true, partitionStrategy: 'semantic' as const, @@ -321,17 +291,6 @@ export class AutoConfiguration { // Environment-specific adjustments switch (environment) { - case 'browser': - config = { - ...config, - maxMemoryUsage: Math.min(memoryBudget, 1024 * 1024 * 1024), // Cap at 1GB - targetSearchLatency: 200, // More lenient for browsers - enableCompression: true, // Always enable for browsers - maxNodesPerPartition: 25000, // Smaller partitions - semanticClusters: 4 // Fewer clusters to save memory - } - break - case 'serverless': config = { ...config, @@ -437,7 +396,6 @@ export class AutoConfiguration { const environment = this.detectEnvironment() switch (environment) { - case 'browser': return 10000 case 'serverless': return 50000 case 'nodejs': return 100000 default: return 25000 diff --git a/src/utils/distance.ts b/src/utils/distance.ts index 9a322c4d..524f2837 100644 --- a/src/utils/distance.ts +++ b/src/utils/distance.ts @@ -5,8 +5,6 @@ */ import { DistanceFunction, Vector } from '../coreTypes.js' -import { executeInThread } from './workerUtils.js' -import { isThreadingAvailable } from './environment.js' /** * Calculates the Euclidean distance between two vectors diff --git a/src/utils/environment.ts b/src/utils/environment.ts index 021e983a..bf899716 100644 --- a/src/utils/environment.ts +++ b/src/utils/environment.ts @@ -1,25 +1,17 @@ /** - * Utility functions for environment detection + * @module utils/environment + * @description Runtime environment detection helpers. 8.0 supports Node.js, + * Bun, and Deno on the server side only — browsers were dropped from the + * support matrix in 8.0, so the helpers here assume a Node-like runtime. */ /** - * Check if code is running in a browser environment - * @deprecated Browser support is deprecated and will be removed in v8.0. Use Node.js or Bun instead. - */ -export function isBrowser(): boolean { - return typeof window !== 'undefined' && typeof document !== 'undefined' -} - -/** - * Check if code is running in a Node.js environment + * @description True when running inside a Node-compatible runtime + * (Node.js, Bun, Deno node-compat). 8.0 has no browser path, so this is + * effectively always true in a deployed brain — the function is kept for + * defensive checks at runtime boundaries. */ export function isNode(): boolean { - // If browser environment is detected, prioritize it over Node.js - // This handles cases like jsdom where both window and process exist - if (isBrowser()) { - return false - } - return ( typeof process !== 'undefined' && process.versions != null && @@ -28,161 +20,64 @@ export function isNode(): boolean { } /** - * Check if code is running in a Web Worker environment - */ -export function isWebWorker(): boolean { - return ( - typeof self === 'object' && - self.constructor && - self.constructor.name === 'DedicatedWorkerGlobalScope' - ) -} - -/** - * Check if Web Workers are available in the current environment - * @deprecated Browser support is deprecated and will be removed in v8.0. Use Node.js Worker Threads instead. - */ -export function areWebWorkersAvailable(): boolean { - return isBrowser() && typeof Worker !== 'undefined' -} - -/** - * Check if Worker Threads are available in the current environment (Node.js) - */ -export async function areWorkerThreadsAvailable(): Promise { - if (!isNode()) return false - - try { - // Use dynamic import to avoid errors in browser environments - await import('worker_threads') - return true - } catch (e) { - return false - } -} - -/** - * Synchronous version that doesn't actually try to load the module - * This is safer in ES module environments - */ -export function areWorkerThreadsAvailableSync(): boolean { - if (!isNode()) return false - - // In Node.js 22+, worker_threads is always available - return parseInt(process.versions.node.split('.')[0]) >= 22 -} - -/** - * Determine if threading is available in the current environment - * Returns true if either Web Workers (browser) or Worker Threads (Node.js) are available - */ -export function isThreadingAvailable(): boolean { - return areWebWorkersAvailable() || areWorkerThreadsAvailableSync() -} - -/** - * Async version of isThreadingAvailable - */ -export async function isThreadingAvailableAsync(): Promise { - return areWebWorkersAvailable() || (await areWorkerThreadsAvailable()) -} - -/** - * Auto-detect production environment to minimize logging costs + * @description Auto-detect a production deployment. Returns true when any + * common managed-runtime indicator is present (Cloud Run, Lambda, Azure + * Functions, Vercel, Netlify, Heroku, Railway, Fly.io, Docker prod), or + * when `NODE_ENV=production`. Used to silence verbose logging in prod. */ export function isProductionEnvironment(): boolean { - // Node.js environment detection - if (isNode()) { - // Check common production environment indicators - const nodeEnv = process.env.NODE_ENV?.toLowerCase() - if (nodeEnv === 'production' || nodeEnv === 'prod') return true - - // Google Cloud Run detection - if (process.env.K_SERVICE || process.env.GOOGLE_CLOUD_PROJECT) return true - - // AWS Lambda detection - if (process.env.AWS_LAMBDA_FUNCTION_NAME || process.env.AWS_EXECUTION_ENV) return true - - // Azure Functions detection - if (process.env.AZURE_FUNCTIONS_ENVIRONMENT || process.env.WEBSITE_SITE_NAME) return true - - // Vercel detection - if (process.env.VERCEL || process.env.VERCEL_ENV === 'production') return true - - // Netlify detection - if (process.env.NETLIFY && process.env.CONTEXT === 'production') return true - - // Heroku detection - if (process.env.DYNO && process.env.NODE_ENV !== 'development') return true - - // Railway detection - if (process.env.RAILWAY_ENVIRONMENT === 'production') return true - - // Fly.io detection - if (process.env.FLY_APP_NAME && process.env.FLY_REGION) return true - - // Docker in production (common patterns) - if (process.env.DOCKER_ENV === 'production' || process.env.ENVIRONMENT === 'production') return true - - // Generic production indicators - if (process.env.PROD === 'true' || process.env.PRODUCTION === 'true') return true - } - - // Browser environment - assume development unless explicitly production - if (isBrowser()) { - // Check for production domain patterns - const hostname = window?.location?.hostname - if (hostname) { - // Avoid logging on production domains - if (hostname.includes('.com') || hostname.includes('.org') || hostname.includes('.net')) { - return !hostname.includes('localhost') && !hostname.includes('127.0.0.1') && !hostname.includes('dev') - } - } - } - + if (!isNode()) return false + + const nodeEnv = process.env.NODE_ENV?.toLowerCase() + if (nodeEnv === 'production' || nodeEnv === 'prod') return true + + if (process.env.K_SERVICE || process.env.GOOGLE_CLOUD_PROJECT) return true + if (process.env.AWS_LAMBDA_FUNCTION_NAME || process.env.AWS_EXECUTION_ENV) return true + if (process.env.AZURE_FUNCTIONS_ENVIRONMENT || process.env.WEBSITE_SITE_NAME) return true + if (process.env.VERCEL || process.env.VERCEL_ENV === 'production') return true + if (process.env.NETLIFY && process.env.CONTEXT === 'production') return true + if (process.env.DYNO && process.env.NODE_ENV !== 'development') return true + if (process.env.RAILWAY_ENVIRONMENT === 'production') return true + if (process.env.FLY_APP_NAME && process.env.FLY_REGION) return true + if (process.env.DOCKER_ENV === 'production' || process.env.ENVIRONMENT === 'production') return true + if (process.env.PROD === 'true' || process.env.PRODUCTION === 'true') return true + return false } /** - * Get appropriate log level based on environment + * @description Resolve a log level from BRAINY_LOG_LEVEL, NODE_ENV, and + * deployment-environment heuristics. Production defaults to 'error' so a + * busy app doesn't pay for verbose logging. */ export function getLogLevel(): 'silent' | 'error' | 'warn' | 'info' | 'verbose' { - // Explicit log level override const explicitLevel = process.env.BRAINY_LOG_LEVEL?.toLowerCase() if (explicitLevel && ['silent', 'error', 'warn', 'info', 'verbose'].includes(explicitLevel)) { return explicitLevel as 'silent' | 'error' | 'warn' | 'info' | 'verbose' } - - // Auto-detect based on environment - if (isProductionEnvironment()) { - return 'error' // Only log errors in production to minimize costs - } - - // Development environments get more verbose logging + + if (isProductionEnvironment()) return 'error' + if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'dev') { return 'verbose' } - - // Test environments should be quieter - if (process.env.NODE_ENV === 'test') { - return 'warn' - } - - // Default to info level + + if (process.env.NODE_ENV === 'test') return 'warn' + return 'info' } /** - * Check if logging should be enabled for a given level + * @description True when a log message at the requested level should be + * emitted given the current configured log level. Returns false in 'silent'. */ export function shouldLog(level: 'error' | 'warn' | 'info' | 'verbose'): boolean { const currentLevel = getLogLevel() - if (currentLevel === 'silent') return false - + const levels = ['error', 'warn', 'info', 'verbose'] const currentIndex = levels.indexOf(currentLevel) const messageIndex = levels.indexOf(level) - + return messageIndex <= currentIndex } diff --git a/src/utils/index.ts b/src/utils/index.ts index 2900d4f9..a0d6206e 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,6 +1,5 @@ export * from './distance.js' export * from './embedding.js' -export * from './workerUtils.js' export * from './statisticsCollector.js' export * from './jsonProcessing.js' export * from './fieldNameTracking.js' diff --git a/src/utils/performanceMonitor.ts b/src/utils/performanceMonitor.ts index 424e4949..67e9124c 100644 --- a/src/utils/performanceMonitor.ts +++ b/src/utils/performanceMonitor.ts @@ -5,7 +5,6 @@ */ import { createModuleLogger } from './logger.js' -import { getGlobalSocketManager } from './adaptiveSocketManager.js' import { getGlobalBackpressure } from './adaptiveBackpressure.js' interface PerformanceMetrics { @@ -215,10 +214,11 @@ export class PerformanceMonitor { } } - // Get metrics from socket manager - const socketMetrics = getGlobalSocketManager().getMetrics() - this.metrics.socketUtilization = socketMetrics.socketUtilization - + // Socket-pool metrics were tied to the dropped cloud HTTP handler; not + // applicable to filesystem-only 8.0 deployments. + this.metrics.socketUtilization = 0 + + // Get metrics from backpressure system const backpressureStatus = getGlobalBackpressure().getStatus() this.metrics.queueDepth = backpressureStatus.queueLength @@ -431,14 +431,12 @@ export class PerformanceMonitor { metrics: PerformanceMetrics trends: PerformanceTrend[] recommendations: string[] - socketConfig: any backpressureStatus: any } { return { metrics: this.getMetrics(), trends: this.getTrends(), recommendations: this.getRecommendations(), - socketConfig: getGlobalSocketManager().getConfig(), backpressureStatus: getGlobalBackpressure().getStatus() } } diff --git a/src/utils/textEncoding.ts b/src/utils/textEncoding.ts index 0986f0a1..e1111f94 100644 --- a/src/utils/textEncoding.ts +++ b/src/utils/textEncoding.ts @@ -13,15 +13,7 @@ let patchApplied = false * Simplified version for Transformers.js/ONNX Runtime */ export async function applyTensorFlowPatch(): Promise { - // Apply patches for all non-browser environments that might need TextEncoder/TextDecoder - const isBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined' - if (isBrowserEnv || patchApplied) { - return // Browser environments don't need these patches, and don't patch twice - } - - if (!isNode()) { - return // Only patch Node.js environments - } + if (patchApplied || !isNode()) return try { console.log('Brainy: Applying TextEncoder/TextDecoder patch for Node.js') diff --git a/src/utils/workerUtils.ts b/src/utils/workerUtils.ts deleted file mode 100644 index 372c2a3b..00000000 --- a/src/utils/workerUtils.ts +++ /dev/null @@ -1,512 +0,0 @@ -/** - * Utility functions for executing functions in Worker Threads (Node.js) or Web Workers (Browser) - * This implementation leverages Node.js 22's stable Worker Threads API for maximum reliability - */ - -import { isBrowser, isNode } from './environment.js' -import { prodLog } from './logger.js' - -// Worker pool to reuse workers -const workerPool: Map = new Map() -const MAX_POOL_SIZE = 4 // Adjust based on system capabilities - -/** - * Execute a function in a separate thread - * - * @param fnString The function to execute as a string - * @param args The arguments to pass to the function - * @returns A promise that resolves with the result of the function - */ -export function executeInThread(fnString: string, args: any): Promise { - if (isNode()) { - return executeInNodeWorker(fnString, args) - } else if (isBrowser() && typeof window !== 'undefined' && window.Worker) { - return executeInWebWorker(fnString, args) - } else { - // Fallback to main thread execution - try { - // Try different approaches to create a function from string - let fn - try { - // First try with 'return' prefix - fn = new Function('return ' + fnString)() - } catch (functionError) { - console.warn( - 'Fallback: Error creating function with return syntax, trying alternative approaches', - functionError - ) - - try { - // Try wrapping in parentheses for function expressions - fn = new Function('return (' + fnString + ')')() - } catch (wrapError) { - console.warn( - 'Fallback: Error creating function with parentheses wrapping', - wrapError - ) - - try { - // Try direct approach for named functions - fn = new Function(fnString)() - } catch (directError) { - console.warn( - 'Fallback: Direct approach failed, trying with function wrapper', - directError - ) - - try { - // Try wrapping in a function that returns the function expression - fn = new Function( - 'return function(args) { return (' + fnString + ')(args); }' - )() - } catch (wrapperError) { - console.error( - 'Fallback: All approaches to create function failed', - wrapperError - ) - throw new Error( - 'Failed to create function from string: ' + - (functionError as Error).message - ) - } - } - } - } - - return Promise.resolve(fn(args) as T) - } catch (error) { - return Promise.reject(error) - } - } -} - -/** - * Execute a function in a Node.js Worker Thread - * Optimized for Node.js 22 LTS with stable Worker Threads performance - */ -function executeInNodeWorker(fnString: string, args: any): Promise { - return new Promise((resolve, reject) => { - try { - // Dynamically import worker_threads (Node.js only) - import('node:worker_threads') - .then(({ Worker, isMainThread, parentPort, workerData }) => { - if (!isMainThread && parentPort) { - // We're inside a worker, execute the function - const fn = new Function('return ' + workerData.fnString)() - const result = fn(workerData.args) - parentPort.postMessage({ result }) - return - } - - // Get a worker from the pool or create a new one - const workerId = `worker-${Math.random().toString(36).substring(2, 9)}` - let worker: any - - if (workerPool.size < MAX_POOL_SIZE) { - // Create a new worker - worker = new Worker( - ` - import { parentPort, workerData } from 'node:worker_threads'; - - // Add TensorFlow.js platform patch for Node.js - if (typeof global !== 'undefined') { - try { - // Define a custom PlatformNode class - class PlatformNode { - constructor() { - // Create a util object with necessary methods - this.util = { - // Add isFloat32Array and isTypedArray directly to util - isFloat32Array: (arr) => { - return !!( - arr instanceof Float32Array || - (arr && - Object.prototype.toString.call(arr) === '[object Float32Array]') - ); - }, - isTypedArray: (arr) => { - return !!(ArrayBuffer.isView(arr) && !(arr instanceof DataView)); - }, - // Use native TextEncoder and TextDecoder - TextEncoder: TextEncoder, - TextDecoder: TextDecoder - }; - - // Initialize encoders using native constructors - this.textEncoder = new TextEncoder(); - this.textDecoder = new TextDecoder(); - } - - // Define isFloat32Array directly on the instance - isFloat32Array(arr) { - return !!( - arr instanceof Float32Array || - (arr && Object.prototype.toString.call(arr) === '[object Float32Array]') - ); - } - - // Define isTypedArray directly on the instance - isTypedArray(arr) { - return !!(ArrayBuffer.isView(arr) && !(arr instanceof DataView)); - } - } - - // Assign the PlatformNode class to the global object - global.PlatformNode = PlatformNode; - - // Also create an instance and assign it to global.platformNode - global.platformNode = new PlatformNode(); - - // Ensure global.util exists and has the necessary methods - if (!global.util) { - global.util = {}; - } - - // Add isFloat32Array method if it doesn't exist - if (!global.util.isFloat32Array) { - global.util.isFloat32Array = (arr) => { - return !!( - arr instanceof Float32Array || - (arr && Object.prototype.toString.call(arr) === '[object Float32Array]') - ); - }; - } - - // Add isTypedArray method if it doesn't exist - if (!global.util.isTypedArray) { - global.util.isTypedArray = (arr) => { - return !!(ArrayBuffer.isView(arr) && !(arr instanceof DataView)); - }; - } - } catch (error) { - console.warn('Failed to apply TensorFlow.js platform patch:', error); - } - } - - const fn = new Function('return ' + workerData.fnString)(); - const result = fn(workerData.args); - parentPort.postMessage({ result }); - `, - { - eval: true, - workerData: { fnString, args } - } - ) - - workerPool.set(workerId, worker) - } else { - // Reuse an existing worker - const poolKeys = Array.from(workerPool.keys()) - const randomKey = - poolKeys[Math.floor(Math.random() * poolKeys.length)] - worker = workerPool.get(randomKey) - - // Terminate and recreate if the worker is busy - if (worker._busy) { - worker.terminate() - worker = new Worker( - ` - import { parentPort, workerData } from 'node:worker_threads'; - - // Add TensorFlow.js platform patch for Node.js - if (typeof global !== 'undefined') { - try { - // Define a custom PlatformNode class - class PlatformNode { - constructor() { - // Create a util object with necessary methods - this.util = { - // Use native TextEncoder and TextDecoder - TextEncoder: TextEncoder, - TextDecoder: TextDecoder - }; - - // Initialize encoders using native constructors - this.textEncoder = new TextEncoder(); - this.textDecoder = new TextDecoder(); - } - - // Define isFloat32Array directly on the instance - isFloat32Array(arr) { - return !!( - arr instanceof Float32Array || - (arr && Object.prototype.toString.call(arr) === '[object Float32Array]') - ); - } - - // Define isTypedArray directly on the instance - isTypedArray(arr) { - return !!(ArrayBuffer.isView(arr) && !(arr instanceof DataView)); - } - } - - // Assign the PlatformNode class to the global object - global.PlatformNode = PlatformNode; - - // Also create an instance and assign it to global.platformNode - global.platformNode = new PlatformNode(); - - // Ensure global.util exists and has the necessary methods - if (!global.util) { - global.util = {}; - } - - // Add isFloat32Array method if it doesn't exist - if (!global.util.isFloat32Array) { - global.util.isFloat32Array = (arr) => { - return !!( - arr instanceof Float32Array || - (arr && Object.prototype.toString.call(arr) === '[object Float32Array]') - ); - }; - } - - // Add isTypedArray method if it doesn't exist - if (!global.util.isTypedArray) { - global.util.isTypedArray = (arr) => { - return !!(ArrayBuffer.isView(arr) && !(arr instanceof DataView)); - }; - } - } catch (error) { - console.warn('Failed to apply TensorFlow.js platform patch:', error); - } - } - - const fn = new Function('return ' + workerData.fnString)(); - const result = fn(workerData.args); - parentPort.postMessage({ result }); - `, - { - eval: true, - workerData: { fnString, args } - } - ) - workerPool.set(randomKey, worker) - } - - worker._busy = true - } - - worker.on('message', (message: any) => { - worker._busy = false - resolve(message.result as T) - }) - - worker.on('error', (err: any) => { - worker._busy = false - reject(err) - }) - - worker.on('exit', (code: number) => { - if (code !== 0) { - worker._busy = false - reject(new Error(`Worker stopped with exit code ${code}`)) - } - }) - }) - .catch(reject) - } catch (error) { - reject(error) - } - }) -} - -/** - * Execute a function in a Web Worker (Browser environment) - */ -function executeInWebWorker(fnString: string, args: any): Promise { - return new Promise((resolve, reject) => { - try { - // Use the dedicated worker.js file instead of creating a blob - // Try different approaches to locate the worker.js file - let workerPath = './worker.js' - - try { - // First try to use the import.meta.url if available (modern browsers) - if (typeof import.meta !== 'undefined' && import.meta.url) { - const baseUrl = import.meta.url.substring( - 0, - import.meta.url.lastIndexOf('/') + 1 - ) - workerPath = `${baseUrl}worker.js` - } - // Fallback to a relative path based on the unified.js location - else if (typeof document !== 'undefined') { - // Find the script tag that loaded unified.js - const scripts = document.getElementsByTagName('script') - for (let i = 0; i < scripts.length; i++) { - const src = scripts[i].src - if (src && src.includes('unified.js')) { - // Get the directory path - workerPath = - src.substring(0, src.lastIndexOf('/') + 1) + 'worker.js' - break - } - } - } - } catch (e) { - console.warn( - 'Could not determine worker path from import.meta.url, using relative path', - e - ) - } - - // If we couldn't determine the path, try some common locations - if (workerPath === './worker.js' && typeof window !== 'undefined') { - // Try to find the worker.js in the same directory as the current page - const pageUrl = window.location.href - const pageDir = pageUrl.substring(0, pageUrl.lastIndexOf('/') + 1) - workerPath = `${pageDir}worker.js` - - // Also check for dist/worker.js - if (typeof document !== 'undefined') { - const distWorkerPath = `${pageDir}dist/worker.js` - // Create a test request to see if the file exists - const xhr = new XMLHttpRequest() - xhr.open('HEAD', distWorkerPath, false) - try { - xhr.send() - if (xhr.status >= 200 && xhr.status < 300) { - workerPath = distWorkerPath - } - } catch (e) { - // Ignore errors, we'll use the default path - } - } - } - - console.log('Using worker path:', workerPath) - - // Try to create a worker, but fall back to inline worker or main thread execution if it fails - let worker: Worker - try { - worker = new Worker(workerPath) - } catch (error) { - console.warn( - 'Failed to create Web Worker from file, trying inline worker:', - error - ) - - try { - // Create an inline worker using a Blob - const workerCode = ` - // Brainy Inline Worker Script - console.log('Brainy Inline Worker: Started'); - - self.onmessage = function (e) { - try { - console.log('Brainy Inline Worker: Received message', e.data ? 'with data' : 'without data'); - - if (!e.data || !e.data.fnString) { - throw new Error('Invalid message: missing function string'); - } - - console.log('Brainy Inline Worker: Creating function from string'); - const fn = new Function('return ' + e.data.fnString)(); - - console.log('Brainy Inline Worker: Executing function with args'); - const result = fn(e.data.args); - - console.log('Brainy Inline Worker: Function executed successfully, posting result'); - self.postMessage({ result: result }); - } catch (error) { - console.error('Brainy Inline Worker: Error executing function', error); - self.postMessage({ - error: error.message, - stack: error.stack - }); - } - }; - ` - - const blob = new Blob([workerCode], { - type: 'application/javascript' - }) - const blobUrl = URL.createObjectURL(blob) - worker = new Worker(blobUrl) - - console.log('Created inline worker using Blob URL') - } catch (inlineWorkerError) { - console.warn( - 'Failed to create inline Web Worker, falling back to main thread execution:', - inlineWorkerError - ) - // Execute in main thread as fallback - try { - const fn = new Function('return ' + fnString)() - resolve(fn(args) as T) - return - } catch (mainThreadError) { - reject(mainThreadError) - return - } - } - } - - // Set a timeout to prevent hanging - const timeoutId = setTimeout(() => { - console.warn( - 'Web Worker execution timed out, falling back to main thread' - ) - worker.terminate() - - // Execute in main thread as fallback - try { - const fn = new Function('return ' + fnString)() - resolve(fn(args) as T) - } catch (mainThreadError) { - reject(mainThreadError) - } - }, 25000) // 25 second timeout (less than the 30 second test timeout) - - worker.onmessage = function (e) { - clearTimeout(timeoutId) - if (e.data.error) { - reject(new Error(e.data.error)) - } else { - resolve(e.data.result as T) - } - worker.terminate() - } - - worker.onerror = function (e) { - clearTimeout(timeoutId) - console.warn( - 'Web Worker error, falling back to main thread execution:', - e.message - ) - worker.terminate() - - // Execute in main thread as fallback - try { - const fn = new Function('return ' + fnString)() - resolve(fn(args) as T) - } catch (mainThreadError) { - reject(mainThreadError) - } - } - - worker.postMessage({ fnString, args }) - } catch (error) { - reject(error) - } - }) -} - -/** - * Clean up all worker pools - * This should be called when the application is shutting down - */ -export function cleanupWorkerPools(): void { - if (isNode()) { - import('node:worker_threads') - .then(({ Worker }) => { - for (const worker of workerPool.values()) { - worker.terminate() - } - workerPool.clear() - console.log('Worker pools cleaned up') - }) - .catch(console.error) - } -} diff --git a/src/worker.ts b/src/worker.ts deleted file mode 100644 index 7f6c5d9a..00000000 --- a/src/worker.ts +++ /dev/null @@ -1,72 +0,0 @@ -// Brainy Worker Script -// This script is used by the workerUtils.js file to execute functions in a separate thread - -// Note: TensorFlow.js platform patch is applied in setup.ts -// Worker scripts should import setup.ts if they need TensorFlow.js functionality - -// Log that the worker has started -console.log('Brainy Worker: Started') - -// Define the message handler with proper TypeScript typing -self.onmessage = function (e: MessageEvent): void { - try { - console.log( - 'Brainy Worker: Received message', - e.data ? 'with data' : 'without data' - ) - - if (!e.data || !e.data.fnString) { - throw new Error('Invalid message: missing function string') - } - - console.log('Brainy Worker: Creating function from string') - // Use Function constructor to create a function from the string - let fn - - try { - // First try with 'return' prefix - fn = new Function('return ' + e.data.fnString)() - } catch (functionError) { - console.warn( - 'Brainy Worker: Error creating function with return syntax, trying alternative approaches', - functionError - ) - - try { - // Try wrapping in parentheses for function expressions - fn = new Function('return (' + e.data.fnString + ')')() - } catch (wrapError) { - console.warn( - 'Brainy Worker: Error creating function with parentheses wrapping', - wrapError - ) - - try { - // Try direct approach for named functions - fn = new Function(e.data.fnString)() - } catch (directError) { - console.error( - 'Brainy Worker: All approaches to create function failed', - directError - ) - throw new Error( - 'Failed to create function from string: ' + - (functionError as Error).message - ) - } - } - } - - console.log('Brainy Worker: Executing function with args') - const result = fn(e.data.args) - - console.log('Brainy Worker: Function executed successfully, posting result') - self.postMessage({ result: result }) - } catch (error: any) { - console.error('Brainy Worker: Error executing function', error) - self.postMessage({ - error: error.message, - stack: error.stack - }) - } -}