diff --git a/README.md b/README.md index 9536ce0..7acc236 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,34 @@ A proof-of-concept implementation of a multi-agent task management system that demonstrates hierarchical agent coordination and task based on [BeeAI Framework](https://i-am-bee.github.io/bee-agent-framework#/) ❤️. +## 🚀 Running the Project + +1. Start the Supervisor Agent and send him a message + +```sh +npm run start:dev <<< "Can you generate a poem about each of these topics: bee, hive, queen, sun, flowers?" +``` + +![Supervisor terminal](./media/supervisor.png) + +2. **Observe the process** in the Monitor UI. + +```sh +npm run monitor +``` + +![Monitor GUI](./media/monitor.png) + +> [!CAUTION] > **Outdated Documentation** +> The README and video are outdated and do not reflect the current state of the project, which has evolved significantly. +> Some of the latest features not covered include: +> +> - **Task Configurations** – Work similarly to agent configurations. +> - **CLI UI Monitor** – Provides real-time monitoring for agents and tasks. +> - **Workspaces** – Enables restoration of previous work. + +--- + ## Features - **Agent Registry**: Manages different types of agents and maintains agent pools diff --git a/media/monitor.png b/media/monitor.png new file mode 100644 index 0000000..72cd9ac Binary files /dev/null and b/media/monitor.png differ diff --git a/media/supervisor.png b/media/supervisor.png new file mode 100644 index 0000000..cf94fee Binary files /dev/null and b/media/supervisor.png differ diff --git a/package-lock.json b/package-lock.json index 64ae625..4220e3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,24 +1,31 @@ { - "name": "bee-empty", - "version": "0.0.1", + "name": "bee-supervisor", + "version": "0.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "bee-empty", - "version": "0.0.1", + "name": "bee-supervisor", + "version": "0.0.2", "dependencies": { "@google-cloud/vertexai": "^1.9.2", "@ibm-generative-ai/node-sdk": "^3.2.4", + "@modelcontextprotocol/sdk": "^1.5.0", "@opentelemetry/sdk-node": "^0.57.0", + "@types/blessed": "^0.1.25", "bee-agent-framework": "^0.0.61", "bee-observe-connector": "^0.0.6", + "blessed": "^0.1.81", + "chokidar": "^4.0.3", "dotenv": "^16.4.5", "groq-sdk": "^0.7.0", "ollama": "^0.5.11", "openai": "^4.77.0", "openai-chat-tokens": "^0.2.8", "pino": "^9.4.0", + "remeda": "^2.20.1", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.0.5", "zod": "^3.23.8" }, "devDependencies": { @@ -33,6 +40,7 @@ "pino-pretty": "^11.2.2", "prettier": "^3.3.3", "rimraf": "^5.0.10", + "tsc-alias": "^1.8.10", "tsx": "^4.19.1", "typescript": "~5.5.4", "typescript-eslint": "^8.6.0" @@ -51,9 +59,9 @@ } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", - "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", + "version": "11.9.1", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.1.tgz", + "integrity": "sha512-OvyhwtYaWSTfo8NfibmFlgl+pIMaBOmN0OwZ3CPaGscEK3B8FCVDuQ7zgxY8seU/1kfSvNWnyB0DtKJyNLxX7g==", "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", @@ -66,372 +74,1088 @@ "url": "https://github.com/sponsors/philsturgeon" } }, - "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "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==", + "optional": true, + "peer": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "dev": true, + "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==", "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" + "peer": true, + "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/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "dev": true, + "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==", "optional": true, - "os": [ - "android" - ], + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "dev": true, + "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==", "optional": true, - "os": [ - "android" - ], + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "dev": true, + "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==", "optional": true, - "os": [ - "android" - ], + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "dev": true, + "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==", "optional": true, - "os": [ - "darwin" - ], + "peer": true, + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "dev": true, + "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==", "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "tslib": "^2.6.2" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "dev": true, + "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==", "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "dev": true, + "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==", "optional": true, - "os": [ - "freebsd" - ], + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "dev": true, + "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==", "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "dev": true, + "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==", "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@aws-sdk/client-bedrock-runtime": { + "version": "3.751.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.751.0.tgz", + "integrity": "sha512-pKw4TDhO9oUnSvmTMLj2oG/SHZ1Q3tQb3DNkpdCbWqjBJ9pL0Dl+YZagLkHm0RZNp2jqAiHL7jiTCnfOAhPaBw==", "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-node": "3.750.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.750.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.4", + "@smithy/eventstream-serde-browser": "^4.0.1", + "@smithy/eventstream-serde-config-resolver": "^4.0.1", + "@smithy/eventstream-serde-node": "^4.0.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-stream": "^4.1.1", + "@smithy/util-utf8": "^4.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, "engines": { - "node": ">=18" + "node": ">=18.0.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/@aws-sdk/client-bedrock-runtime/node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "optional": true, - "os": [ - "linux" + "peer": true + }, + "node_modules/@aws-sdk/client-bedrock-runtime/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" ], - "engines": { - "node": ">=18" + "optional": true, + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "dev": true, + "node_modules/@aws-sdk/client-sso": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.750.0.tgz", + "integrity": "sha512-y0Rx6pTQXw0E61CaptpZF65qNggjqOgymq/RYZU5vWba5DGQ+iqGt8Yq8s+jfBoBBNXshxq8l8Dl5Uq/JTY1wg==", "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.750.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.4", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=18" + "node": ">=18.0.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/@aws-sdk/core": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.750.0.tgz", + "integrity": "sha512-bZ5K7N5L4+Pa2epbVpUQqd1XLG2uU8BGs/Sd+2nbgTf+lNQJyIxAg/Qsrjz9MzmY8zzQIeRQEkNmR6yVAfCmmQ==", "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.4", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=18" + "node": ">=18.0.0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" + "node_modules/@aws-sdk/core/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } ], - "dev": true, "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.750.0.tgz", + "integrity": "sha512-In6bsG0p/P31HcH4DBRKBbcDS/3SHvEPjfXV8ODPWZO/l3/p7IRoYBdQ07C9R+VMZU2D0+/Sc/DWK/TUNDk1+Q==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=18" + "node": ">=18.0.0" } }, - "node_modules/@esbuild/linux-s390x": { + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.750.0.tgz", + "integrity": "sha512-wFB9qqfa20AB0dElsQz5ZlZT5o+a+XzpEpmg0erylmGYqEOvh8NQWfDUVpRmQuGq9VbvW/8cIbxPoNqEbPtuWQ==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.750.0.tgz", + "integrity": "sha512-2YIZmyEr5RUd3uxXpxOLD9G67Bibm4I/65M6vKFP17jVMUT+R1nL7mKqmhEVO2p+BoeV+bwMyJ/jpTYG368PCg==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-env": "3.750.0", + "@aws-sdk/credential-provider-http": "3.750.0", + "@aws-sdk/credential-provider-process": "3.750.0", + "@aws-sdk/credential-provider-sso": "3.750.0", + "@aws-sdk/credential-provider-web-identity": "3.750.0", + "@aws-sdk/nested-clients": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.750.0.tgz", + "integrity": "sha512-THWHHAceLwsOiowPEmKyhWVDlEUxH07GHSw5AQFDvNQtGKOQl0HSIFO1mKObT2Q2Vqzji9Bq8H58SO5BFtNPRw==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.750.0", + "@aws-sdk/credential-provider-http": "3.750.0", + "@aws-sdk/credential-provider-ini": "3.750.0", + "@aws-sdk/credential-provider-process": "3.750.0", + "@aws-sdk/credential-provider-sso": "3.750.0", + "@aws-sdk/credential-provider-web-identity": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.750.0.tgz", + "integrity": "sha512-Q78SCH1n0m7tpu36sJwfrUSxI8l611OyysjQeMiIOliVfZICEoHcLHLcLkiR+tnIpZ3rk7d2EQ6R1jwlXnalMQ==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.750.0.tgz", + "integrity": "sha512-FGYrDjXN/FOQVi/t8fHSv8zCk+NEvtFnuc4cZUj5OIbM4vrfFc5VaPyn41Uza3iv6Qq9rZg0QOwWnqK8lNrqUw==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/client-sso": "3.750.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/token-providers": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.750.0.tgz", + "integrity": "sha512-Nz8zs3YJ+GOTSrq+LyzbbC1Ffpt7pK38gcOyNZv76pP5MswKTUKNYBJehqwa+i7FcFQHsCk3TdhR8MT1ZR23uA==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/nested-clients": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz", + "integrity": "sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz", + "integrity": "sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz", + "integrity": "sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.750.0.tgz", + "integrity": "sha512-YYcslDsP5+2NZoN3UwuhZGkhAHPSli7HlJHBafBrvjGV/I9f8FuOO1d1ebxGdEP4HyRXUGyh+7Ur4q+Psk0ryw==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@smithy/core": "^3.1.4", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.750.0.tgz", + "integrity": "sha512-OH68BRF0rt9nDloq4zsfeHI0G21lj11a66qosaljtEP66PWm7tQ06feKbFkXHT5E1K3QhJW3nVyK8v2fEBY5fg==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.750.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.4", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz", + "integrity": "sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.750.0.tgz", + "integrity": "sha512-X/KzqZw41iWolwNdc8e3RMcNSMR364viHv78u6AefXOO5eRM40c4/LuST1jDzq35/LpnqRhL7/MuixOetw+sFw==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/nested-clients": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.734.0.tgz", + "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.743.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.743.0.tgz", + "integrity": "sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "@smithy/util-endpoints": "^3.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz", + "integrity": "sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz", + "integrity": "sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.750.0.tgz", + "integrity": "sha512-84HJj9G9zbrHX2opLk9eHfDceB+UIHVrmflMzWHpsmo9fDuro/flIBqaVDlE021Osj6qIM0SJJcnL6s23j7JEw==", + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.750.0", + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", "cpu": [ - "s390x" + "ppc64" ], "dev": true, "optional": true, "os": [ - "linux" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/linux-x64": { + "node_modules/@esbuild/android-arm": { "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", "cpu": [ - "x64" + "arm" ], "dev": true, "optional": true, "os": [ - "linux" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/netbsd-x64": { + "node_modules/@esbuild/android-arm64": { "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "optional": true, "os": [ - "netbsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/openbsd-arm64": { + "node_modules/@esbuild/android-x64": { "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, "os": [ - "openbsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/openbsd-x64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", "cpu": [ - "x64" + "arm64" ], "dev": true, "optional": true, "os": [ - "openbsd" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/sunos-x64": { + "node_modules/@esbuild/darwin-x64": { "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "sunos" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-arm64": { + "node_modules/@esbuild/freebsd-arm64": { "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ - "win32" + "freebsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-ia32": { + "node_modules/@esbuild/freebsd-x64": { "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", "cpu": [ "ia32" @@ -802,6 +1526,11 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", @@ -907,9 +1636,24 @@ "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==" }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.5.0.tgz", + "integrity": "sha512-IJ+5iVVs8FCumIHxWqpwgkwOzyhtHVKy45s6Ug7Dv0MfRpaYisH8QQ87rIWeWdOzlk8sfhitZ7HCyQZk7d6b8w==", + "dependencies": { + "content-type": "^1.0.5", + "eventsource": "^3.0.2", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { @@ -1473,6 +2217,234 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz", + "integrity": "sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz", + "integrity": "sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz", + "integrity": "sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz", + "integrity": "sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz", + "integrity": "sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz", + "integrity": "sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz", + "integrity": "sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz", + "integrity": "sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz", + "integrity": "sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz", + "integrity": "sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz", + "integrity": "sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz", + "integrity": "sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz", + "integrity": "sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz", + "integrity": "sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz", + "integrity": "sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz", + "integrity": "sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz", + "integrity": "sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz", + "integrity": "sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz", + "integrity": "sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -1484,1693 +2456,3396 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@streamparser/json": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@streamparser/json/-/json-0.0.21.tgz", - "integrity": "sha512-v+49JBiG1kmc/9Ug79Lz9wyKaRocBgCnpRaLpdy7p0d3ICKtOAfc/H/Epa1j3F6YdnzjnZKKrnJ8xnh/v1P8Aw==" - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, + "node_modules/@smithy/abort-controller": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz", + "integrity": "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==", + "optional": true, + "peer": true, "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@types/eslint__js": { - "version": "8.42.3", - "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", - "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", - "dev": true, + "node_modules/@smithy/config-resolver": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.0.1.tgz", + "integrity": "sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==", + "optional": true, + "peer": true, "dependencies": { - "@types/eslint": "*" + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@types/eslint-config-prettier": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@types/eslint-config-prettier/-/eslint-config-prettier-6.11.3.tgz", - "integrity": "sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==", - "dev": true - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "node_modules/@types/lodash": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz", - "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "node_modules/@smithy/core": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.4.tgz", + "integrity": "sha512-wFExFGK+7r2wYriOqe7RRIBNpvxwiS95ih09+GSLRBdoyK/O1uZA7K7pKesj5CBvwJuSBeXwLyR88WwIAY+DGA==", + "optional": true, + "peer": true, "dependencies": { - "@types/lodash": "*" + "@smithy/middleware-serde": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.1.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@types/node": { - "version": "18.19.64", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", - "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", + "node_modules/@smithy/credential-provider-imds": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz", + "integrity": "sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==", + "optional": true, + "peer": true, "dependencies": { - "undici-types": "~5.26.4" + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "node_modules/@smithy/eventstream-codec": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz", + "integrity": "sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==", + "optional": true, + "peer": true, "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz", + "integrity": "sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==", "optional": true, - "peer": true - }, - "node_modules/@types/shimmer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==" + "peer": true, + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz", + "integrity": "sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==", "optional": true, - "peer": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz", - "integrity": "sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==", - "dev": true, + "peer": true, "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.14.0", - "@typescript-eslint/type-utils": "8.14.0", - "@typescript-eslint/utils": "8.14.0", - "@typescript-eslint/visitor-keys": "8.14.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.14.0.tgz", - "integrity": "sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==", - "dev": true, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz", + "integrity": "sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==", + "optional": true, + "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.14.0", - "@typescript-eslint/types": "8.14.0", - "@typescript-eslint/typescript-estree": "8.14.0", - "@typescript-eslint/visitor-keys": "8.14.0", - "debug": "^4.3.4" + "@smithy/eventstream-serde-universal": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz", - "integrity": "sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==", - "dev": true, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz", + "integrity": "sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==", + "optional": true, + "peer": true, "dependencies": { - "@typescript-eslint/types": "8.14.0", - "@typescript-eslint/visitor-keys": "8.14.0" + "@smithy/eventstream-codec": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz", - "integrity": "sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==", - "dev": true, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz", + "integrity": "sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==", + "optional": true, + "peer": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.14.0", - "@typescript-eslint/utils": "8.14.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.14.0.tgz", - "integrity": "sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node_modules/@smithy/hash-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.1.tgz", + "integrity": "sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz", - "integrity": "sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==", - "dev": true, + "node_modules/@smithy/invalid-dependency": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz", + "integrity": "sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==", + "optional": true, + "peer": true, "dependencies": { - "@typescript-eslint/types": "8.14.0", - "@typescript-eslint/visitor-keys": "8.14.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "optional": true, + "peer": true, "dependencies": { - "balanced-match": "^1.0.0" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, + "node_modules/@smithy/middleware-content-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz", + "integrity": "sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==", + "optional": true, + "peer": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.14.0.tgz", - "integrity": "sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==", - "dev": true, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.5.tgz", + "integrity": "sha512-cPzGZV7qStHwboFrm6GfrzQE+YDiCzWcTh4+7wKrP/ZQ4gkw+r7qDjV8GjM4N0UYsuUyLfpzLGg5hxsYTU11WA==", + "optional": true, + "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.14.0", - "@typescript-eslint/types": "8.14.0", - "@typescript-eslint/typescript-estree": "8.14.0" + "@smithy/core": "^3.1.4", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-middleware": "^4.0.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz", - "integrity": "sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==", - "dev": true, + "node_modules/@smithy/middleware-retry": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.6.tgz", + "integrity": "sha512-s8QzuOQnbdvRymD9Gt9c9zMq10wUQAHQ3z72uirrBHCwZcLTrL5iCOuVTMdka2IXOYhQE890WD5t6G24+F+Qcg==", + "optional": true, + "peer": true, "dependencies": { - "@typescript-eslint/types": "8.14.0", - "eslint-visitor-keys": "^3.4.3" + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "optional": true, + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/@smithy/middleware-serde": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.2.tgz", + "integrity": "sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==", + "optional": true, + "peer": true, "dependencies": { - "event-target-shim": "^5.0.0" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.5" + "node": ">=18.0.0" } }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "bin": { - "acorn": "bin/acorn" + "node_modules/@smithy/middleware-stack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz", + "integrity": "sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=0.4.0" + "node": ">=18.0.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peerDependencies": { - "acorn": "^8" + "node_modules/@smithy/node-config-provider": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz", + "integrity": "sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node_modules/@smithy/node-http-handler": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz", + "integrity": "sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/abort-controller": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/adm-zip": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "node_modules/@smithy/property-provider": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.1.tgz", + "integrity": "sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=12.0" + "node": ">=18.0.0" } }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "node_modules/@smithy/protocol-http": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", + "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 14" + "node": ">=18.0.0" } }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "node_modules/@smithy/querystring-builder": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz", + "integrity": "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==", + "optional": true, + "peer": true, "dependencies": { - "humanize-ms": "^1.2.1" + "@smithy/types": "^4.1.0", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 8.0.0" + "node": ">=18.0.0" } }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/@smithy/querystring-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz", + "integrity": "sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==", + "optional": true, + "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/@smithy/service-error-classification": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz", + "integrity": "sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==", + "optional": true, + "peer": true, "dependencies": { - "ajv": "^8.0.0" + "@smithy/types": "^4.1.0" }, - "peerDependencies": { - "ajv": "^8.0.0" + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz", + "integrity": "sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "engines": { + "node": ">=18.0.0" } }, - "node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, + "node_modules/@smithy/signature-v4": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.1.tgz", + "integrity": "sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==", + "optional": true, + "peer": true, "dependencies": { - "environment": "^1.0.0" + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18" + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.5.tgz", + "integrity": "sha512-DMXYoYeL4QkElr216n1yodTFeATbfb4jwYM9gKn71Rw/FNA1/Sm36tkTSCsZEs7mgpG3OINmkxL9vgVFzyGPaw==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/core": "^3.1.4", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.1", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, + "node_modules/@smithy/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", + "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=12" + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.1.tgz", + "integrity": "sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "optional": true, + "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8.0.0" + "node": ">=18.0.0" } }, - "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.6.tgz", + "integrity": "sha512-N8+VCt+piupH1A7DgSVDNrVHqRLz8r6DvBkpS7EWHiIxsUk4jqGuQLjqC/gnCzmwGkVBdNruHoYAzzaSQ8e80w==", + "optional": true, + "peer": true, "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.6.tgz", + "integrity": "sha512-9zhx1shd1VwSSVvLZB8CM3qQ3RPD3le7A3h/UPuyh/PC7g4OaWDi2xUNzamsVoSmCGtmUBONl56lM2EU6LcH7A==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/config-resolver": "^4.0.1", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.5", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/@smithy/util-endpoints": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz", + "integrity": "sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/bee-agent-framework": { - "version": "0.0.61", - "resolved": "https://registry.npmjs.org/bee-agent-framework/-/bee-agent-framework-0.0.61.tgz", - "integrity": "sha512-SnKlcPgBMQ9pJ83yso6CLnODme3Pzsu3Yc3fFlOalPRRfxgz75yo9+wIiCUQFFcGgx7UDBB4N44Bl5mfYdSk6w==", + "node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "optional": true, + "peer": true, "dependencies": { - "@ai-zen/node-fetch-event-source": "^2.1.4", - "@opentelemetry/api": "^1.9.0", - "@streamparser/json": "^0.0.21", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "duck-duck-scrape": "^2.2.7", - "fast-xml-parser": "^4.5.0", - "header-generator": "^2.1.57", - "joplin-turndown-plugin-gfm": "^1.0.12", - "js-yaml": "^4.1.0", - "json-schema-to-typescript": "^15.0.3", - "jsonrepair": "^3.11.1", - "mathjs": "^14.0.0", - "mustache": "^4.2.0", - "object-hash": "^3.0.0", - "p-queue-compat": "^1.0.227", - "p-throttle": "^7.0.0", - "pino": "^9.5.0", - "promise-based-task": "^3.1.1", - "remeda": "^2.17.4", - "serialize-error": "^11.0.3", - "string-comparison": "^1.3.0", - "string-strip-html": "^13.4.8", - "turndown": "^7.2.0", - "wikipedia": "^2.1.2", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.23.5" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.1.tgz", + "integrity": "sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.1.tgz", + "integrity": "sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/service-error-classification": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.1.1.tgz", + "integrity": "sha512-+Xvh8nhy0Wjv1y71rBVyV3eJU3356XsFQNI8dEZVNrQju7Eib8G31GWtO+zMa9kTCGd41Mflu+ZKfmQL/o2XzQ==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "optional": true, + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@streamparser/json": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@streamparser/json/-/json-0.0.21.tgz", + "integrity": "sha512-v+49JBiG1kmc/9Ug79Lz9wyKaRocBgCnpRaLpdy7p0d3ICKtOAfc/H/Epa1j3F6YdnzjnZKKrnJ8xnh/v1P8Aw==" + }, + "node_modules/@types/blessed": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@types/blessed/-/blessed-0.1.25.tgz", + "integrity": "sha512-kQsjBgtsbJLmG6CJA+Z6Nujj+tq1fcSE3UIowbDvzQI4wWmoTV7djUDhSo5lDjgwpIN0oRvks0SA5mMdKE5eFg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint__js": { + "version": "8.42.3", + "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", + "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", + "dev": true, + "dependencies": { + "@types/eslint": "*" + } + }, + "node_modules/@types/eslint-config-prettier": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/@types/eslint-config-prettier/-/eslint-config-prettier-6.11.3.tgz", + "integrity": "sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/lodash": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz", + "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "18.19.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", + "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "optional": true, + "peer": true + }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==" + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "optional": true, + "peer": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz", + "integrity": "sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.14.0", + "@typescript-eslint/type-utils": "8.14.0", + "@typescript-eslint/utils": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@aws-sdk/client-bedrock-runtime": "^3.687.0", - "@elastic/elasticsearch": "^8.0.0", - "@google-cloud/vertexai": "*", - "@googleapis/customsearch": "^3.2.0", - "@grpc/grpc-js": "^1.11.3", - "@grpc/proto-loader": "^0.7.13", - "@langchain/community": ">=0.2.28", - "@langchain/core": ">=0.2.27", - "@modelcontextprotocol/sdk": "^1.0.4", - "@zilliz/milvus2-sdk-node": "^2.4.9", - "google-auth-library": "*", - "groq-sdk": "^0.7.0", - "ollama": "^0.5.11", - "openai": "^4.67.3", - "openai-chat-tokens": "^0.2.8", - "sequelize": "^6.37.3", - "yaml": "^2.6.1" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { - "@aws-sdk/client-bedrock-runtime": { - "optional": true - }, - "@elastic/elasticsearch": { - "optional": true - }, - "@google-cloud/vertexai": { - "optional": true - }, - "@googleapis/customsearch": { - "optional": true - }, - "@grpc/grpc-js": { - "optional": true - }, - "@grpc/proto-loader": { - "optional": true - }, - "@langchain/community": { + "typescript": { "optional": true - }, - "@langchain/core": { + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.14.0.tgz", + "integrity": "sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.14.0", + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/typescript-estree": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { "optional": true - }, - "@modelcontextprotocol/sdk": { - "optional": true - }, - "@zilliz/milvus2-sdk-node": { - "optional": true - }, - "google-auth-library": { - "optional": true - }, - "groq-sdk": { - "optional": true - }, - "ollama": { + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz", + "integrity": "sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz", + "integrity": "sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.14.0", + "@typescript-eslint/utils": "8.14.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { "optional": true - }, - "openai": { + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.14.0.tgz", + "integrity": "sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz", + "integrity": "sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { "optional": true - }, - "openai-chat-tokens": { + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.14.0.tgz", + "integrity": "sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.14.0", + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/typescript-estree": "8.14.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz", + "integrity": "sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.14.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitest/expect": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.5.tgz", + "integrity": "sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==", + "dependencies": { + "@vitest/spy": "3.0.5", + "@vitest/utils": "3.0.5", + "chai": "^5.1.2", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.5.tgz", + "integrity": "sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==", + "dependencies": { + "@vitest/spy": "3.0.5", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { "optional": true }, - "sequelize": { + "vite": { "optional": true - }, - "yaml": { + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz", + "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.5.tgz", + "integrity": "sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==", + "dependencies": { + "@vitest/utils": "3.0.5", + "pathe": "^2.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.5.tgz", + "integrity": "sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==", + "dependencies": { + "@vitest/pretty-format": "3.0.5", + "magic-string": "^0.30.17", + "pathe": "^2.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.5.tgz", + "integrity": "sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.5.tgz", + "integrity": "sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==", + "dependencies": { + "@vitest/pretty-format": "3.0.5", + "loupe": "^3.1.2", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bee-agent-framework": { + "version": "0.0.61", + "resolved": "https://registry.npmjs.org/bee-agent-framework/-/bee-agent-framework-0.0.61.tgz", + "integrity": "sha512-SnKlcPgBMQ9pJ83yso6CLnODme3Pzsu3Yc3fFlOalPRRfxgz75yo9+wIiCUQFFcGgx7UDBB4N44Bl5mfYdSk6w==", + "deprecated": "WARNING: This project has been renamed to beeai-framework. Install using beeai-framework instead.", + "dependencies": { + "@ai-zen/node-fetch-event-source": "^2.1.4", + "@opentelemetry/api": "^1.9.0", + "@streamparser/json": "^0.0.21", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "duck-duck-scrape": "^2.2.7", + "fast-xml-parser": "^4.5.0", + "header-generator": "^2.1.57", + "joplin-turndown-plugin-gfm": "^1.0.12", + "js-yaml": "^4.1.0", + "json-schema-to-typescript": "^15.0.3", + "jsonrepair": "^3.11.1", + "mathjs": "^14.0.0", + "mustache": "^4.2.0", + "object-hash": "^3.0.0", + "p-queue-compat": "^1.0.227", + "p-throttle": "^7.0.0", + "pino": "^9.5.0", + "promise-based-task": "^3.1.1", + "remeda": "^2.17.4", + "serialize-error": "^11.0.3", + "string-comparison": "^1.3.0", + "string-strip-html": "^13.4.8", + "turndown": "^7.2.0", + "wikipedia": "^2.1.2", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.23.5" + }, + "peerDependencies": { + "@aws-sdk/client-bedrock-runtime": "^3.687.0", + "@elastic/elasticsearch": "^8.0.0", + "@google-cloud/vertexai": "*", + "@googleapis/customsearch": "^3.2.0", + "@grpc/grpc-js": "^1.11.3", + "@grpc/proto-loader": "^0.7.13", + "@langchain/community": ">=0.2.28", + "@langchain/core": ">=0.2.27", + "@modelcontextprotocol/sdk": "^1.0.4", + "@zilliz/milvus2-sdk-node": "^2.4.9", + "google-auth-library": "*", + "groq-sdk": "^0.7.0", + "ollama": "^0.5.11", + "openai": "^4.67.3", + "openai-chat-tokens": "^0.2.8", + "sequelize": "^6.37.3", + "yaml": "^2.6.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-bedrock-runtime": { + "optional": true + }, + "@elastic/elasticsearch": { + "optional": true + }, + "@google-cloud/vertexai": { + "optional": true + }, + "@googleapis/customsearch": { + "optional": true + }, + "@grpc/grpc-js": { + "optional": true + }, + "@grpc/proto-loader": { + "optional": true + }, + "@langchain/community": { + "optional": true + }, + "@langchain/core": { + "optional": true + }, + "@modelcontextprotocol/sdk": { + "optional": true + }, + "@zilliz/milvus2-sdk-node": { + "optional": true + }, + "google-auth-library": { + "optional": true + }, + "groq-sdk": { + "optional": true + }, + "ollama": { + "optional": true + }, + "openai": { + "optional": true + }, + "openai-chat-tokens": { + "optional": true + }, + "sequelize": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/bee-agent-framework/node_modules/p-queue-compat": { + "version": "1.0.227", + "resolved": "https://registry.npmjs.org/p-queue-compat/-/p-queue-compat-1.0.227.tgz", + "integrity": "sha512-uNKILAU2Wg6oj7hlvcDJgY4Xl1qzqqOEv/Mq8YtA0ApQQxJDa6DQoRElCPMa55mQ/A3jWeT6qSmcwzNI1cFSrA==", + "dependencies": { + "eventemitter3": "5.x", + "p-timeout-compat": "^1.0.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/bee-observe-connector": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/bee-observe-connector/-/bee-observe-connector-0.0.6.tgz", + "integrity": "sha512-KZhhOFwvw/dR2YN4DPf7dZkquJ4O41D0WhjAsU3+RApkvBnpSm6Y/TYTa7vOZKaJzbuJ0NqRVrhPD8dCuKXFMQ==", + "dependencies": { + "openapi-fetch": "^0.11.1", + "remeda": "^2.15.2" + }, + "peerDependencies": { + "bee-agent-framework": ">=0.0.27 <0.1.0" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/blessed": { + "version": "0.1.81", + "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", + "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==", + "bin": { + "blessed": "bin/tput.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "optional": true, + "peer": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "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==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==" + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/codsen-utils": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/codsen-utils/-/codsen-utils-1.6.4.tgz", + "integrity": "sha512-PDyvQ5f2PValmqZZIJATimcokDt4JjIev8cKbZgEOoZm+U1IJDYuLeTcxZPQdep99R/X0RIlQ6ReQgPOVnPbNw==", + "dependencies": { + "rfdc": "^1.3.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "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==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/complex.js": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.4.2.tgz", + "integrity": "sha512-qtx7HRhPGSCBtGiST4/WGHuW+zeaND/6Ld+db6PbrulIB1i2Ev/2UPiqcmpQNPSyfBKraC0EOvOKCB5dGZKt3g==", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/duck-duck-scrape": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/duck-duck-scrape/-/duck-duck-scrape-2.2.7.tgz", + "integrity": "sha512-BEcglwnfx5puJl90KQfX+Q2q5vCguqyMpZcSRPBWk8OY55qWwV93+E+7DbIkrGDW4qkqPfUvtOUdi0lXz6lEMQ==", + "dependencies": { + "html-entities": "^2.3.3", + "needle": "^3.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/Snazzah" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "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==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.58", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.58.tgz", + "integrity": "sha512-al2l4r+24ZFL7WzyPTlyD0fC33LLzvxqLCwurtBibVPghRGO9hSTl+tis8t1kD7biPiH/en4U0I7o/nQbYeoVA==" + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==" + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "devOptional": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", + "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.14.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { "optional": true } } }, - "node_modules/bee-agent-framework/node_modules/p-queue-compat": { - "version": "1.0.227", - "resolved": "https://registry.npmjs.org/p-queue-compat/-/p-queue-compat-1.0.227.tgz", - "integrity": "sha512-uNKILAU2Wg6oj7hlvcDJgY4Xl1qzqqOEv/Mq8YtA0ApQQxJDa6DQoRElCPMa55mQ/A3jWeT6qSmcwzNI1cFSrA==", + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, "dependencies": { - "eventemitter3": "5.x", - "p-timeout-compat": "^1.0.3" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/bee-observe-connector": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/bee-observe-connector/-/bee-observe-connector-0.0.6.tgz", - "integrity": "sha512-KZhhOFwvw/dR2YN4DPf7dZkquJ4O41D0WhjAsU3+RApkvBnpSm6Y/TYTa7vOZKaJzbuJ0NqRVrhPD8dCuKXFMQ==", + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { - "openapi-fetch": "^0.11.1", - "remeda": "^2.15.2" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "peerDependencies": { - "bee-agent-framework": ">=0.0.27 <0.1.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/braces": { + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.5.tgz", + "integrity": "sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==", + "dependencies": { + "eventsource-parser": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.0.tgz", + "integrity": "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { - "fill-range": "^7.1.1" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "engines": { + "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==" + }, + "node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==" + }, + "node_modules/fast-xml-parser": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", + "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" } ], "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" + "strnum": "^1.0.5" }, "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "fxparser": "src/cli/cli.js" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "reusify": "^1.0.4" } }, - "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==" + "node_modules/fetch-retry": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz", + "integrity": "sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==" }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, - "node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001680", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", - "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==" - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { - "restore-cursor": "^5.0.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">=18" + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=18" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, "engines": { - "node": ">=8" + "node": ">= 12.20" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/fraction.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.2.1.tgz", + "integrity": "sha512-Ah6t/7YCYjrPUFUFsOsRLMXAdnYM+aQwmojD2Ayb/Ezr82SwES0vuyQ8qZ3QO8n9j7W14VJuVZZet8U3bhSdQQ==", "engines": { - "node": ">=8" + "node": ">= 12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "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==", "dependencies": { - "ansi-regex": "^5.0.1" + "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": ">=8" + "node": ">=14" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/gaxios/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/codsen-utils": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/codsen-utils/-/codsen-utils-1.6.4.tgz", - "integrity": "sha512-PDyvQ5f2PValmqZZIJATimcokDt4JjIev8cKbZgEOoZm+U1IJDYuLeTcxZPQdep99R/X0RIlQ6ReQgPOVnPbNw==", - "dependencies": { - "rfdc": "^1.3.1" - }, - "engines": { - "node": ">=14.18.0" + "node_modules/gaxios/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", "dependencies": { - "color-name": "~1.1.4" + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=14" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "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==", + "node_modules/generative-bayesian-network": { + "version": "2.1.57", + "resolved": "https://registry.npmjs.org/generative-bayesian-network/-/generative-bayesian-network-2.1.57.tgz", + "integrity": "sha512-o6UqR+j/oQnG5imsdaYwSqcVVWLuVBjYI3jE+z+aRZ6RqAFnHPK3uV+y4HEOnCokbFhgq9x+TKcBMAoKagT9TQ==", "dependencies": { - "delayed-stream": "~1.0.0" - }, + "adm-zip": "^0.5.9", + "tslib": "^2.4.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { - "node": ">= 0.8" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "dev": true, "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/complex.js": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.4.2.tgz", - "integrity": "sha512-qtx7HRhPGSCBtGiST4/WGHuW+zeaND/6Ld+db6PbrulIB1i2Ev/2UPiqcmpQNPSyfBKraC0EOvOKCB5dGZKt3g==", + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, "engines": { - "node": "*" + "node": ">=16" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "devOptional": true, "dependencies": { - "node-fetch": "^2.6.12" + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">= 8" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" + "is-glob": "^4.0.3" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "optional": true, - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "dependencies": { - "is-obj": "^2.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://dotenvx.com" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/duck-duck-scrape": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/duck-duck-scrape/-/duck-duck-scrape-2.2.7.tgz", - "integrity": "sha512-BEcglwnfx5puJl90KQfX+Q2q5vCguqyMpZcSRPBWk8OY55qWwV93+E+7DbIkrGDW4qkqPfUvtOUdi0lXz6lEMQ==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { - "html-entities": "^2.3.3", - "needle": "^3.2.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/Snazzah" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" }, - "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==", + "node_modules/google-auth-library": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.0.tgz", + "integrity": "sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ==", "dependencies": { - "safe-buffer": "^5.0.1" + "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/electron-to-chromium": { - "version": "1.5.58", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.58.tgz", - "integrity": "sha512-al2l4r+24ZFL7WzyPTlyD0fC33LLzvxqLCwurtBibVPghRGO9hSTl+tis8t1kD7biPiH/en4U0I7o/nQbYeoVA==" - }, - "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, + "node_modules/groq-sdk": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/groq-sdk/-/groq-sdk-0.7.0.tgz", + "integrity": "sha512-OgPqrRtti5MjEVclR8sgBHrhSkTLdFCmi47yrEF29uJZaiCkX3s7bXpnMhq8Lwoe1f4AwgC0qGOeHXpeSgu5lg==", "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" } }, - "node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { - "node": ">=6" + "node": ">=14.0.0" } }, - "node_modules/escape-latex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", - "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" - }, - "node_modules/escape-string-regexp": { + "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/eslint": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", - "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", - "dev": true, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.7.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.14.0", - "@eslint/plugin-kit": "^0.2.0", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.0", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "function-bind": "^1.1.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" + "node": ">= 0.4" + } + }, + "node_modules/header-generator": { + "version": "2.1.57", + "resolved": "https://registry.npmjs.org/header-generator/-/header-generator-2.1.57.tgz", + "integrity": "sha512-QmFzEd5fw1PrLztvJT7JBtNRt7MYskE8basiAjxGX5MNcS//JaiNsMyk7b12IJG7yppO5pJzg3zAa0UFfcNIvA==", + "dependencies": { + "browserslist": "^4.21.1", + "generative-bayesian-network": "^2.1.57", + "ow": "^0.28.1", + "tslib": "^2.4.0" }, - "peerDependenciesMeta": { - "jiti": { - "optional": true + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "dev": true + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" } - } + ] }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "engines": { + "node": ">= 0.8" } }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, + "node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==" + }, + "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==", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 14" } }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=16.17.0" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "ms": "^2.0.0" } }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "node_modules/husky": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", + "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", "dev": true, - "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "bin": { + "husky": "bin.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "estraverse": "^5.1.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">= 4" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-shim": { - "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==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + "node_modules/import-in-the-middle": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.12.0.tgz", + "integrity": "sha512-yAgSE7GmtRcu4ZUSFX/4v69UGXwugFFSdIQJ14LHPOPPQrWv8Y7O9PHsw8Ovk7bKCLe4sjXMbZFqGFcLHpZ89w==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { - "node": ">=0.8.x" + "node": ">=0.8.19" } }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, + "node_modules/infobox-parser": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/infobox-parser/-/infobox-parser-3.6.4.tgz", + "integrity": "sha512-d2lTlxKZX7WsYxk9/UPt51nkmZv5tbC75SSw4hfHqZ3LpRAn6ug0oru9xI2X+S78va3aUAze3xl/UqMuwLmJUw==", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" + "camelcase": "^4.1.0" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "type": "individual", + "url": "https://www.buymeacoffee.com/2tmRKi9" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/fast-copy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", - "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", + "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { - "node": ">=8.6.0" + "node": ">=0.10.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { - "is-glob": "^4.0.1" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } }, - "node_modules/fast-redact": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", - "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==" - }, - "node_modules/fast-xml-parser": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", - "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, "dependencies": { - "strnum": "^1.0.5" + "@isaacs/cliui": "^8.0.2" }, - "bin": { - "fxparser": "src/cli/cli.js" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" }, - "node_modules/fetch-retry": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz", - "integrity": "sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==" + "node_modules/joplin-turndown-plugin-gfm": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/joplin-turndown-plugin-gfm/-/joplin-turndown-plugin-gfm-1.0.12.tgz", + "integrity": "sha512-qL4+1iycQjZ1fs8zk3jSRk7cg3ROBUHk7GKtiLAQLFzLPKErnILUvz5DLszSQvz3s1sTjPbywLDISVUtBY6HaA==" }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, "engines": { - "node": ">=16.0.0" + "node": ">=10" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, + "node_modules/js-tiktoken": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.15.tgz", + "integrity": "sha512-65ruOWWXDEZHHbAo7EjOcNxOGasQKbL4Fq3jEr2xsCqSsoOo6VVSqzWQb6PRIqypFSDcma4jO90YP0w5X8qVXQ==", "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "base64-js": "^1.5.1" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, + "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==", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" + "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", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-to-typescript": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", + "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^11.5.5", + "@types/json-schema": "^7.0.15", + "@types/lodash": "^4.17.7", + "is-glob": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "prettier": "^3.2.5", + "tinyglobby": "^0.2.9" + }, + "bin": { + "json2ts": "dist/src/cli.js" }, "engines": { - "node": ">=16" + "node": ">=16.0.0" } }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node_modules/jsonrepair": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.11.1.tgz", + "integrity": "sha512-9jej0NdRnXXv/n6oYxKbNhrKyPXM6SOrWEmNEpl5S+JpqzrmkxcX7gJCA+GMkgJiWd8KtH6G60+0gIlhZ4dMKQ==", + "bin": { + "jsonrepair": "bin/cli.js" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" } }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "json-buffer": "3.0.1" } }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "node_modules/langsmith": { + "version": "0.1.68", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.1.68.tgz", + "integrity": "sha512-otmiysWtVAqzMx3CJ4PrtUBhWRG5Co8Z4o7hSZENPjlit9/j3/vm3TSvbaxpDYakZxtMjhkcJTqrdYFipISEiQ==", + "optional": true, + "peer": true, "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" + "@types/uuid": "^10.0.0", + "commander": "^10.0.1", + "p-queue": "^6.6.2", + "p-retry": "4", + "semver": "^7.6.3", + "uuid": "^10.0.0" }, - "engines": { - "node": ">= 12.20" - } - }, - "node_modules/fraction.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.2.1.tgz", - "integrity": "sha512-Ah6t/7YCYjrPUFUFsOsRLMXAdnYM+aQwmojD2Ayb/Ezr82SwES0vuyQ8qZ3QO8n9j7W14VJuVZZet8U3bhSdQQ==", - "engines": { - "node": ">= 12" + "peerDependencies": { + "openai": "*" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" + "peerDependenciesMeta": { + "openai": { + "optional": true + } } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, + "node_modules/langsmith/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "optional": true, - "os": [ - "darwin" - ], + "peer": true, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=14" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/langsmith/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "optional": true, + "peer": true }, - "node_modules/gaxios": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "node_modules/langsmith/node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "optional": true, + "peer": true, "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" + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gaxios/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { "node": ">=8" }, @@ -3178,144 +5853,165 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gaxios/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "node_modules/langsmith/node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "optional": true, + "peer": true, "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" + "p-finally": "^1.0.0" }, "engines": { - "node": ">=14" - } - }, - "node_modules/generative-bayesian-network": { - "version": "2.1.57", - "resolved": "https://registry.npmjs.org/generative-bayesian-network/-/generative-bayesian-network-2.1.57.tgz", - "integrity": "sha512-o6UqR+j/oQnG5imsdaYwSqcVVWLuVBjYI3jE+z+aRZ6RqAFnHPK3uV+y4HEOnCokbFhgq9x+TKcBMAoKagT9TQ==", - "dependencies": { - "adm-zip": "^0.5.9", - "tslib": "^2.4.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=8" } }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "engines": { - "node": ">=18" + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, "engines": { - "node": ">=16" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "node_modules/lint-staged": { + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", "dev": true, "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" }, "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": ">=10.13.0" + "node": ">= 14" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/listr2": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "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==", + "dev": true + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, "engines": { "node": ">=18" }, @@ -3323,313 +6019,323 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/google-auth-library": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.0.tgz", - "integrity": "sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ==", - "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" - }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { - "node": ">=14" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/groq-sdk": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/groq-sdk/-/groq-sdk-0.7.0.tgz", - "integrity": "sha512-OgPqrRtti5MjEVclR8sgBHrhSkTLdFCmi47yrEF29uJZaiCkX3s7bXpnMhq8Lwoe1f4AwgC0qGOeHXpeSgu5lg==", + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gtoken": { + "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/header-generator": { - "version": "2.1.57", - "resolved": "https://registry.npmjs.org/header-generator/-/header-generator-2.1.57.tgz", - "integrity": "sha512-QmFzEd5fw1PrLztvJT7JBtNRt7MYskE8basiAjxGX5MNcS//JaiNsMyk7b12IJG7yppO5pJzg3zAa0UFfcNIvA==", + "node_modules/mathjs": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-14.0.0.tgz", + "integrity": "sha512-MR3me92c6pKBqzUXosqL5KMIZDrb1x0MGOy+Ss6fQllD1zhAFloG6DJnG6X5b0VYAMA9sgGfAR2tYi5HPNNQBQ==", "dependencies": { - "browserslist": "^4.21.1", - "generative-bayesian-network": "^2.1.57", - "ow": "^0.28.1", - "tslib": "^2.4.0" + "@babel/runtime": "^7.25.7", + "complex.js": "^2.2.5", + "decimal.js": "^10.4.3", + "escape-latex": "^1.2.0", + "fraction.js": "^5.2.1", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^4.2.1" + }, + "bin": { + "mathjs": "bin/cli.js" }, "engines": { - "node": ">=16.0.0" + "node": ">= 18" } }, - "node_modules/help-me": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", - "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/http-status-codes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==" + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } }, - "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==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">= 14" + "node": ">=8.6" } }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { - "node": ">=16.17.0" + "node": ">= 0.6" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "ms": "^2.0.0" + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/husky": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", - "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "bin": { - "husky": "bin.js" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, "engines": { "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/typicode" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/import-in-the-middle": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.12.0.tgz", - "integrity": "sha512-yAgSE7GmtRcu4ZUSFX/4v69UGXwugFFSdIQJ14LHPOPPQrWv8Y7O9PHsw8Ovk7bKCLe4sjXMbZFqGFcLHpZ89w==", - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/mylas": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", + "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==", "dev": true, "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/infobox-parser": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/infobox-parser/-/infobox-parser-3.6.4.tgz", - "integrity": "sha512-d2lTlxKZX7WsYxk9/UPt51nkmZv5tbC75SSw4hfHqZ3LpRAn6ug0oru9xI2X+S78va3aUAze3xl/UqMuwLmJUw==", - "dependencies": { - "camelcase": "^4.1.0" + "node": ">=12.0.0" }, "funding": { - "type": "individual", - "url": "https://www.buymeacoffee.com/2tmRKi9" + "type": "github", + "url": "https://github.com/sponsors/raouldeheer" } }, - "node_modules/is-core-module": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", - "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", - "dependencies": { - "hasown": "^2.0.2" + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 4.4.x" } }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.5.0" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "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==", "dependencies": { - "is-extglob": "^2.1.1" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -3637,2013 +6343,2308 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" - }, - "node_modules/joplin-turndown-plugin-gfm": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/joplin-turndown-plugin-gfm/-/joplin-turndown-plugin-gfm-1.0.12.tgz", - "integrity": "sha512-qL4+1iycQjZ1fs8zk3jSRk7cg3ROBUHk7GKtiLAQLFzLPKErnILUvz5DLszSQvz3s1sTjPbywLDISVUtBY6HaA==" - }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "engines": { - "node": ">=10" + "node": ">= 6" } }, - "node_modules/js-tiktoken": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.15.tgz", - "integrity": "sha512-65ruOWWXDEZHHbAo7EjOcNxOGasQKbL4Fq3jEr2xsCqSsoOo6VVSqzWQb6PRIqypFSDcma4jO90YP0w5X8qVXQ==", + "node_modules/ollama": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.5.11.tgz", + "integrity": "sha512-lDAKcpmBU3VAOGF05NcQipHNKTdpKfAHpZ7bjCsElkUkmX7SNZImi6lwIxz/l1zQtLq0S3wuLneRuiXxX2KIew==", "dependencies": { - "base64-js": "^1.5.1" + "whatwg-fetch": "^3.6.20" } }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" } }, - "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==", + "node_modules/once": { + "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, "dependencies": { - "bignumber.js": "^9.0.0" + "wrappy": "1" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-to-typescript": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.3.tgz", - "integrity": "sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA==", + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "dependencies": { - "@apidevtools/json-schema-ref-parser": "^11.5.5", - "@types/json-schema": "^7.0.15", - "@types/lodash": "^4.17.7", - "is-glob": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "prettier": "^3.2.5", - "tinyglobby": "^0.2.9" - }, - "bin": { - "json2ts": "dist/src/cli.js" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/jsonrepair": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.11.1.tgz", - "integrity": "sha512-9jej0NdRnXXv/n6oYxKbNhrKyPXM6SOrWEmNEpl5S+JpqzrmkxcX7gJCA+GMkgJiWd8KtH6G60+0gIlhZ4dMKQ==", + "node_modules/openai": { + "version": "4.77.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.77.0.tgz", + "integrity": "sha512-WWacavtns/7pCUkOWvQIjyOfcdr9X+9n9Vvb0zFeKVDAqwCMDHB+iSr24SVaBAhplvSG6JrRXFpcNM9gWhOGIw==", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, "bin": { - "jsonrepair": "bin/cli.js" + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } } }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "node_modules/openai-chat-tokens": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/openai-chat-tokens/-/openai-chat-tokens-0.2.8.tgz", + "integrity": "sha512-nW7QdFDIZlAYe6jsCT/VPJ/Lam3/w2DX9oxf/5wHpebBT49KI3TN43PPhYlq1klq2ajzXWKNOLY6U4FNZM7AoA==", "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" + "js-tiktoken": "^1.0.7" } }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "node_modules/openapi-fetch": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.11.3.tgz", + "integrity": "sha512-r18fERgpxFrI4pv79ABD1dqFetWz7pTfwRd7jQmRm/lFdCDpWF43kvHUiOqOZu+tWsMydDJMpJN1hlZ9inRvfA==", "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" + "openapi-typescript-helpers": "^0.0.13" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } + "node_modules/openapi-typescript-helpers": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.13.tgz", + "integrity": "sha512-z44WK2e7ygW3aUtAtiurfEACohf/Qt9g6BsejmIYgEoY4REHeRzgFJmO3ium0libsuzPc145I+8lE9aiiZrQvQ==" }, - "node_modules/langsmith": { - "version": "0.1.68", - "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.1.68.tgz", - "integrity": "sha512-otmiysWtVAqzMx3CJ4PrtUBhWRG5Co8Z4o7hSZENPjlit9/j3/vm3TSvbaxpDYakZxtMjhkcJTqrdYFipISEiQ==", - "optional": true, - "peer": true, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, "dependencies": { - "@types/uuid": "^10.0.0", - "commander": "^10.0.1", - "p-queue": "^6.6.2", - "p-retry": "4", - "semver": "^7.6.3", - "uuid": "^10.0.0" - }, - "peerDependencies": { - "openai": "*" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, - "peerDependenciesMeta": { - "openai": { - "optional": true - } - } - }, - "node_modules/langsmith/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "optional": true, - "peer": true, "engines": { - "node": ">=14" + "node": ">= 0.8.0" } }, - "node_modules/langsmith/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "optional": true, - "peer": true - }, - "node_modules/langsmith/node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "optional": true, - "peer": true, + "node_modules/ow": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.28.2.tgz", + "integrity": "sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==", "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" + "@sindresorhus/is": "^4.2.0", + "callsites": "^3.1.0", + "dot-prop": "^6.0.1", + "lodash.isequal": "^4.5.0", + "vali-date": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/langsmith/node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "optional": true, "peer": true, - "dependencies": { - "p-finally": "^1.0.0" - }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/antonk52" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lint-staged": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", - "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", - "dev": true, + "node_modules/p-queue-compat": { + "version": "1.0.225", + "resolved": "https://registry.npmjs.org/p-queue-compat/-/p-queue-compat-1.0.225.tgz", + "integrity": "sha512-SdfGSQSJJpD7ZR+dJEjjn9GuuBizHPLW/yarJpXnmrHRruzrq7YM8OqsikSrKeoPv+Pi1YXw9IIBSIg5WveQHA==", "dependencies": { - "chalk": "~5.3.0", - "commander": "~12.1.0", - "debug": "~4.3.6", - "execa": "~8.0.1", - "lilconfig": "~3.1.2", - "listr2": "~8.2.4", - "micromatch": "~4.0.8", - "pidtree": "~0.6.0", - "string-argv": "~0.3.2", - "yaml": "~2.5.0" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" + "eventemitter3": "5.x", + "p-timeout-compat": "^1.0.3" }, "engines": { - "node": ">=18.12.0" + "node": ">=12" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "optional": true, + "peer": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" }, - "funding": { - "url": "https://opencollective.com/lint-staged" + "engines": { + "node": ">=8" } }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, + "node_modules/p-throttle": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-7.0.0.tgz", + "integrity": "sha512-aio0v+S0QVkH1O+9x4dHtD4dgCExACcL+3EtNaGqC01GBudS9ijMuUsmN8OVScyV4OOp0jqdLShZFuSlbL/AsA==", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, + "node_modules/p-timeout-compat": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/p-timeout-compat/-/p-timeout-compat-1.0.5.tgz", + "integrity": "sha512-JUyLagABYj4bu58nXmMEO+JpHlimYomLY3xdatcPWKRRVVQ3ky55Ki4Mdj2OUGDfkV2BPt87zqSzISk0ztwruw==", "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/listr2": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", - "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" + "callsites": "^3.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=6" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "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==", - "dev": true + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=18" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=8" } }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, + "node_modules/pathe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", + "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14.16" } }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, "engines": { - "node": ">=18" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } }, - "node_modules/mathjs": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-14.0.0.tgz", - "integrity": "sha512-MR3me92c6pKBqzUXosqL5KMIZDrb1x0MGOy+Ss6fQllD1zhAFloG6DJnG6X5b0VYAMA9sgGfAR2tYi5HPNNQBQ==", + "node_modules/pino": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.5.0.tgz", + "integrity": "sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==", "dependencies": { - "@babel/runtime": "^7.25.7", - "complex.js": "^2.2.5", - "decimal.js": "^10.4.3", - "escape-latex": "^1.2.0", - "fraction.js": "^5.2.1", - "javascript-natural-sort": "^0.7.1", - "seedrandom": "^3.0.5", - "tiny-emitter": "^2.1.0", - "typed-function": "^4.2.1" + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" }, "bin": { - "mathjs": "bin/cli.js" - }, - "engines": { - "node": ">= 18" + "pino": "bin.js" } }, - "node_modules/merge-stream": { + "node_modules/pino-abstract-transport": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "dependencies": { + "split2": "^4.0.0" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/pino-pretty": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.3.0.tgz", + "integrity": "sha512-oXwn7ICywaZPHmu3epHGU2oJX4nPmKvHvB/bwrJHlGcbEWaVcotkpyVHMKLKmiVryWYByNp0jpgAcXpFJDXJzA==", "dev": true, "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" }, - "engines": { - "node": ">=8.6" + "bin": { + "pino-pretty": "bin.js" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "node_modules/plimit-lit": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", + "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", + "dev": true, + "dependencies": { + "queue-lit": "^1.5.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "mime-db": "1.52.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">= 0.6" + "node": "^10 || ^12 || >=14" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "bin": { + "prettier": "bin/prettier.cjs" + }, "engines": { - "node": ">=18" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">= 0.6.0" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, + "node_modules/promise-based-task": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/promise-based-task/-/promise-based-task-3.1.1.tgz", + "integrity": "sha512-67wj5yO49S47PxPV4vMCcqGPm/K8AMyE1uXCyRFSd9y/crUaRyJf/NHy8UMNsyWm/PEOWWOa27fXxu591/xLag==" + }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=12.0.0" } }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "bin": { - "mustache": "bin/mustache" + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, + "node_modules/queue-lit": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", + "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", + "dev": true, "engines": { - "node": ">= 4.4.x" + "node": ">=12" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/jimmywarting" + "url": "https://github.com/sponsors/feross" }, { - "type": "github", - "url": "https://paypal.me/jimmywarting" + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } - ], + ] + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/ranges-apply": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/ranges-apply/-/ranges-apply-7.0.16.tgz", + "integrity": "sha512-4rGJHOyA7qatiMDg3vcETkc/TVBPU86/xZRTXff6o7a2neYLmj0EXUUAlhLVuiWAzTPHDPHOQxtk8EDrIF4ohg==", + "dependencies": { + "ranges-merge": "^9.0.15", + "tiny-invariant": "^1.3.3" + }, "engines": { - "node": ">=10.5.0" + "node": ">=14.18.0" } }, - "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==", + "node_modules/ranges-merge": { + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/ranges-merge/-/ranges-merge-9.0.15.tgz", + "integrity": "sha512-hvt4hx0FKIaVfjd1oKx0poL57ljxdL2KHC6bXBrAdsx2iCsH+x7nO/5J0k2veM/isnOcFZKp0ZKkiCjCtzy74Q==", "dependencies": { - "whatwg-url": "^5.0.0" + "ranges-push": "^7.0.15", + "ranges-sort": "^6.0.11" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": ">=14.18.0" + } + }, + "node_modules/ranges-push": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/ranges-push/-/ranges-push-7.0.15.tgz", + "integrity": "sha512-gXpBYQ5Umf3uG6jkJnw5ddok2Xfo5p22rAJBLrqzNKa7qkj3q5AOCoxfRPXEHUVaJutfXc9K9eGXdIzdyQKPkw==", + "dependencies": { + "codsen-utils": "^1.6.4", + "ranges-sort": "^6.0.11", + "string-collapse-leading-whitespace": "^7.0.7", + "string-trim-spaces-only": "^5.0.10" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "engines": { + "node": ">=14.18.0" } }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "node_modules/ranges-sort": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/ranges-sort/-/ranges-sort-6.0.11.tgz", + "integrity": "sha512-fhNEG0vGi7bESitNNqNBAfYPdl2efB+1paFlI8BQDCNkruERKuuhG8LkQClDIVqUJLkrmKuOSPQ3xZHqVnVo3Q==", + "engines": { + "node": ">=14.18.0" + } }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", "dependencies": { - "path-key": "^4.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdirp": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "engines": { + "node": ">= 14.18.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "engines": { - "node": ">= 6" + "node": ">= 12.13.0" } }, - "node_modules/ollama": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.5.11.tgz", - "integrity": "sha512-lDAKcpmBU3VAOGF05NcQipHNKTdpKfAHpZ7bjCsElkUkmX7SNZImi6lwIxz/l1zQtLq0S3wuLneRuiXxX2KIew==", + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/remeda": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.20.1.tgz", + "integrity": "sha512-gsEsSmjE0CHkNp6xEsWsU/6JVNWq7rqw+ZfzNMbVV4YFIPtTj/i0FfxurTRI6Z9sAnQufU9de2Cb3xHsUTFTMA==", "dependencies": { - "whatwg-fetch": "^3.6.20" + "type-fest": "^4.33.0" } }, - "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { - "node": ">=14.0.0" + "node": ">=0.10.0" } }, - "node_modules/once": { - "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, - "dependencies": { - "wrappy": "1" + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, + "node_modules/require-in-the-middle": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz", + "integrity": "sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==", "dependencies": { - "mimic-fn": "^4.0.0" + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.6.0" } }, - "node_modules/openai": { - "version": "4.77.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.77.0.tgz", - "integrity": "sha512-WWacavtns/7pCUkOWvQIjyOfcdr9X+9n9Vvb0zFeKVDAqwCMDHB+iSr24SVaBAhplvSG6JrRXFpcNM9gWhOGIw==", + "node_modules/resolve": { + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz", + "integrity": "sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==", "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.23.8" + "resolve": "bin/resolve" }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/openai-chat-tokens": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/openai-chat-tokens/-/openai-chat-tokens-0.2.8.tgz", - "integrity": "sha512-nW7QdFDIZlAYe6jsCT/VPJ/Lam3/w2DX9oxf/5wHpebBT49KI3TN43PPhYlq1klq2ajzXWKNOLY6U4FNZM7AoA==", - "dependencies": { - "js-tiktoken": "^1.0.7" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/openapi-fetch": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.11.3.tgz", - "integrity": "sha512-r18fERgpxFrI4pv79ABD1dqFetWz7pTfwRd7jQmRm/lFdCDpWF43kvHUiOqOZu+tWsMydDJMpJN1hlZ9inRvfA==", - "dependencies": { - "openapi-typescript-helpers": "^0.0.13" + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" } }, - "node_modules/openapi-typescript-helpers": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.13.tgz", - "integrity": "sha512-z44WK2e7ygW3aUtAtiurfEACohf/Qt9g6BsejmIYgEoY4REHeRzgFJmO3ium0libsuzPc145I+8lE9aiiZrQvQ==" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "devOptional": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ow": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/ow/-/ow-0.28.2.tgz", - "integrity": "sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, "dependencies": { - "@sindresorhus/is": "^4.2.0", - "callsites": "^3.1.0", - "dot-prop": "^6.0.1", - "lodash.isequal": "^4.5.0", - "vali-date": "^1.0.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "optional": true, "peer": true, "engines": { - "node": ">=4" + "node": ">= 4" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "dev": true, "dependencies": { - "p-limit": "^3.0.2" + "glob": "^10.3.7" }, - "engines": { - "node": ">=10" + "bin": { + "rimraf": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/p-queue-compat": { - "version": "1.0.225", - "resolved": "https://registry.npmjs.org/p-queue-compat/-/p-queue-compat-1.0.225.tgz", - "integrity": "sha512-SdfGSQSJJpD7ZR+dJEjjn9GuuBizHPLW/yarJpXnmrHRruzrq7YM8OqsikSrKeoPv+Pi1YXw9IIBSIg5WveQHA==", + "node_modules/rollup": { + "version": "4.34.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz", + "integrity": "sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==", "dependencies": { - "eventemitter3": "5.x", - "p-timeout-compat": "^1.0.3" + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=12" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.6", + "@rollup/rollup-android-arm64": "4.34.6", + "@rollup/rollup-darwin-arm64": "4.34.6", + "@rollup/rollup-darwin-x64": "4.34.6", + "@rollup/rollup-freebsd-arm64": "4.34.6", + "@rollup/rollup-freebsd-x64": "4.34.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.6", + "@rollup/rollup-linux-arm-musleabihf": "4.34.6", + "@rollup/rollup-linux-arm64-gnu": "4.34.6", + "@rollup/rollup-linux-arm64-musl": "4.34.6", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.6", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.6", + "@rollup/rollup-linux-riscv64-gnu": "4.34.6", + "@rollup/rollup-linux-s390x-gnu": "4.34.6", + "@rollup/rollup-linux-x64-gnu": "4.34.6", + "@rollup/rollup-linux-x64-musl": "4.34.6", + "@rollup/rollup-win32-arm64-msvc": "4.34.6", + "@rollup/rollup-win32-ia32-msvc": "4.34.6", + "@rollup/rollup-win32-x64-msvc": "4.34.6", + "fsevents": "~2.3.2" } }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "optional": true, - "peer": true, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "dev": true + }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/p-throttle": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-7.0.0.tgz", - "integrity": "sha512-aio0v+S0QVkH1O+9x4dHtD4dgCExACcL+3EtNaGqC01GBudS9ijMuUsmN8OVScyV4OOp0jqdLShZFuSlbL/AsA==", + "node_modules/serialize-error": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz", + "integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==", + "dependencies": { + "type-fest": "^2.12.2" + }, "engines": { - "node": ">=18" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-timeout-compat": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/p-timeout-compat/-/p-timeout-compat-1.0.5.tgz", - "integrity": "sha512-JUyLagABYj4bu58nXmMEO+JpHlimYomLY3xdatcPWKRRVVQ3ky55Ki4Mdj2OUGDfkV2BPt87zqSzISk0ztwruw==", + "node_modules/serialize-error/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "engines": { - "node": ">=12" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "callsites": "^3.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, + "node_modules/sonic-boom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/pino": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.5.0.tgz", - "integrity": "sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==", - "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^2.0.0", - "pino-std-serializers": "^7.0.0", - "process-warning": "^4.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^4.0.1", - "thread-stream": "^3.0.0" - }, - "bin": { - "pino": "bin.js" + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" } }, - "node_modules/pino-abstract-transport": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", - "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" + }, + "node_modules/string_decoder": { + "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, "dependencies": { - "split2": "^4.0.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/pino-pretty": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.3.0.tgz", - "integrity": "sha512-oXwn7ICywaZPHmu3epHGU2oJX4nPmKvHvB/bwrJHlGcbEWaVcotkpyVHMKLKmiVryWYByNp0jpgAcXpFJDXJzA==", + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-collapse-leading-whitespace": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/string-collapse-leading-whitespace/-/string-collapse-leading-whitespace-7.0.7.tgz", + "integrity": "sha512-jF9eynJoE6ezTCdYI8Qb02/ij/DlU9ItG93Dty4SWfJeLFrotOr+wH9IRiWHTqO3mjCyqBWEiU3uSTIbxYbAEQ==", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/string-comparison": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string-comparison/-/string-comparison-1.3.0.tgz", + "integrity": "sha512-46aD+slEwybxAMPRII83ATbgMgTiz5P8mVd7Z6VJsCzSHFjdt1hkAVLeFxPIyEb11tc6ihpJTlIqoO0MCF6NPw==", + "engines": { + "node": "^16.0.0 || >=18.0.0" + } + }, + "node_modules/string-left-right": { + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/string-left-right/-/string-left-right-6.0.17.tgz", + "integrity": "sha512-nuyIV4D4ivnwT64E0TudmCRg52NfkumuEUilyoOrHb/Z2wEOF5I+9SI6P+veFKqWKZfGpAs6OqKe4nAjujARyw==", "dependencies": { - "colorette": "^2.0.7", - "dateformat": "^4.6.3", - "fast-copy": "^3.0.2", - "fast-safe-stringify": "^2.1.1", - "help-me": "^5.0.0", - "joycon": "^3.1.1", - "minimist": "^1.2.6", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^2.0.0", - "pump": "^3.0.0", - "readable-stream": "^4.0.0", - "secure-json-parse": "^2.4.0", - "sonic-boom": "^4.0.1", - "strip-json-comments": "^3.1.1" + "codsen-utils": "^1.6.4", + "rfdc": "^1.3.1" }, - "bin": { - "pino-pretty": "bin.js" + "engines": { + "node": ">=14.18.0" } }, - "node_modules/pino-std-serializers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + "node_modules/string-strip-html": { + "version": "13.4.8", + "resolved": "https://registry.npmjs.org/string-strip-html/-/string-strip-html-13.4.8.tgz", + "integrity": "sha512-vlcRAtx5DN6zXGUx3EYGFg0/JOQWM65mqLgDaBHviQPP+ovUFzqZ30iQ+674JHWr9wNgnzFGxx9TGipPZMnZXg==", + "dependencies": { + "@types/lodash-es": "^4.17.12", + "codsen-utils": "^1.6.4", + "html-entities": "^2.5.2", + "lodash-es": "^4.17.21", + "ranges-apply": "^7.0.16", + "ranges-push": "^7.0.15", + "string-left-right": "^6.0.17" + }, + "engines": { + "node": ">=14.18.0" + } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, + "node_modules/string-trim-spaces-only": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/string-trim-spaces-only/-/string-trim-spaces-only-5.0.10.tgz", + "integrity": "sha512-MhmjE5jNqb1Ylo+BARPRlsdChGLrnPpAUWrT1VOxo9WhWwKVUU6CbZTfjwKaQPYTGS/wsX/4Zek88FM2rEb5iA==", "engines": { - "node": ">= 0.8.0" + "node": ">=14.18.0" } }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "bin": { - "prettier": "bin/prettier.cjs" + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">= 0.6.0" + "node": ">=8" } }, - "node_modules/process-warning": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", - "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" - }, - "node_modules/promise-based-task": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/promise-based-task/-/promise-based-task-3.1.1.tgz", - "integrity": "sha512-67wj5yO49S47PxPV4vMCcqGPm/K8AMyE1uXCyRFSd9y/crUaRyJf/NHy8UMNsyWm/PEOWWOa27fXxu591/xLag==" - }, - "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { - "node": ">=12.0.0" + "node": ">=8" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "engines": { + "node": ">=8" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" - }, - "node_modules/ranges-apply": { - "version": "7.0.16", - "resolved": "https://registry.npmjs.org/ranges-apply/-/ranges-apply-7.0.16.tgz", - "integrity": "sha512-4rGJHOyA7qatiMDg3vcETkc/TVBPU86/xZRTXff6o7a2neYLmj0EXUUAlhLVuiWAzTPHDPHOQxtk8EDrIF4ohg==", "dependencies": { - "ranges-merge": "^9.0.15", - "tiny-invariant": "^1.3.3" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=14.18.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/ranges-merge": { - "version": "9.0.15", - "resolved": "https://registry.npmjs.org/ranges-merge/-/ranges-merge-9.0.15.tgz", - "integrity": "sha512-hvt4hx0FKIaVfjd1oKx0poL57ljxdL2KHC6bXBrAdsx2iCsH+x7nO/5J0k2veM/isnOcFZKp0ZKkiCjCtzy74Q==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { - "ranges-push": "^7.0.15", - "ranges-sort": "^6.0.11" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=14.18.0" + "node": ">=8" } }, - "node_modules/ranges-push": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/ranges-push/-/ranges-push-7.0.15.tgz", - "integrity": "sha512-gXpBYQ5Umf3uG6jkJnw5ddok2Xfo5p22rAJBLrqzNKa7qkj3q5AOCoxfRPXEHUVaJutfXc9K9eGXdIzdyQKPkw==", - "dependencies": { - "codsen-utils": "^1.6.4", - "ranges-sort": "^6.0.11", - "string-collapse-leading-whitespace": "^7.0.7", - "string-trim-spaces-only": "^5.0.10" - }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { - "node": ">=14.18.0" + "node": ">=8" } }, - "node_modules/ranges-sort": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/ranges-sort/-/ranges-sort-6.0.11.tgz", - "integrity": "sha512-fhNEG0vGi7bESitNNqNBAfYPdl2efB+1paFlI8BQDCNkruERKuuhG8LkQClDIVqUJLkrmKuOSPQ3xZHqVnVo3Q==", + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, "engines": { - "node": ">=14.18.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "has-flag": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { - "node": ">= 12.13.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, - "node_modules/remeda": { - "version": "2.17.4", - "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.17.4.tgz", - "integrity": "sha512-pviU2Ag7Qx9mOCAKO4voxDx/scfLzdhp3v85qDO4xxntQsU76uE9sgrAAdK1ATn4zzaOJqCXYMMNRP+O9F4Wiw==", + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", "dependencies": { - "type-fest": "^4.27.0" + "real-require": "^0.2.0" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" + }, + "node_modules/tinyglobby": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.11.tgz", + "integrity": "sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g==", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/require-in-the-middle": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz", - "integrity": "sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "engines": { - "node": ">=8.6.0" + "node": "^18.0.0 || >=20.0.0" } }, - "node_modules/resolve": { - "version": "1.22.9", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz", - "integrity": "sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==", + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "is-number": "^7.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.0" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { - "node": ">=4" + "node": ">=0.6" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-api-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" } }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "node_modules/tsc-alias": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.10.tgz", + "integrity": "sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw==", "dev": true, "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" + "chokidar": "^3.5.3", + "commander": "^9.0.0", + "globby": "^11.0.4", + "mylas": "^2.1.9", + "normalize-path": "^3.0.0", + "plimit-lit": "^1.2.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "tsc-alias": "dist/bin/index.js" } }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "node_modules/tsc-alias/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "dependencies": { - "mimic-function": "^5.0.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=18" + "node": ">= 8.10.0" }, "funding": { - "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==", - "optional": true, - "peer": true, - "engines": { - "node": ">= 4" + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/tsc-alias/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": "^12.20.0 || >=14" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" - }, - "node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "node_modules/tsc-alias/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" + "is-glob": "^4.0.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 6" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/tsc-alias/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "picomatch": "^2.2.1" + }, "engines": { - "node": ">=10" + "node": ">=8.10.0" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" - }, - "node_modules/secure-json-parse": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", - "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", - "dev": true - }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/tsconfck": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", + "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", "bin": { - "semver": "bin/semver.js" + "tsconfck": "bin/tsconfck.js" }, "engines": { - "node": ">=10" + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/serialize-error": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz", - "integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "devOptional": true, "dependencies": { - "type-fest": "^2.12.2" + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" }, "engines": { - "node": ">=14.16" + "node": ">=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/turndown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.0.tgz", + "integrity": "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==", + "dependencies": { + "@mixmark-io/domino": "^2.2.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, + "node_modules/type-fest": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", + "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, + "node_modules/typed-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.2.1.tgz", + "integrity": "sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 18" } }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": ">=14.17" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/typescript-eslint": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.14.0.tgz", + "integrity": "sha512-K8fBJHxVL3kxMmwByvz8hNdBJ8a0YqKzKDX6jRlrjMuNXyd5T2V02HIq37+OiWXvUUOXgOOGiSSOh26Mh8pC3w==", "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.14.0", + "@typescript-eslint/parser": "8.14.0", + "@typescript-eslint/utils": "8.14.0" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/sonic-boom": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", - "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", - "dependencies": { - "atomic-sleep": "^1.0.0" - } + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { - "node": ">= 10.x" + "node": ">= 0.8" } }, - "node_modules/string_decoder": { - "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, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "safe-buffer": "~5.2.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "engines": { - "node": ">=0.6.19" + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/string-collapse-leading-whitespace": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/string-collapse-leading-whitespace/-/string-collapse-leading-whitespace-7.0.7.tgz", - "integrity": "sha512-jF9eynJoE6ezTCdYI8Qb02/ij/DlU9ItG93Dty4SWfJeLFrotOr+wH9IRiWHTqO3mjCyqBWEiU3uSTIbxYbAEQ==", - "engines": { - "node": ">=14.18.0" + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "optional": true, + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/string-comparison": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string-comparison/-/string-comparison-1.3.0.tgz", - "integrity": "sha512-46aD+slEwybxAMPRII83ATbgMgTiz5P8mVd7Z6VJsCzSHFjdt1hkAVLeFxPIyEb11tc6ihpJTlIqoO0MCF6NPw==", + "node_modules/vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/string-left-right": { - "version": "6.0.17", - "resolved": "https://registry.npmjs.org/string-left-right/-/string-left-right-6.0.17.tgz", - "integrity": "sha512-nuyIV4D4ivnwT64E0TudmCRg52NfkumuEUilyoOrHb/Z2wEOF5I+9SI6P+veFKqWKZfGpAs6OqKe4nAjujARyw==", + "node_modules/vite": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz", + "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==", "dependencies": { - "codsen-utils": "^1.6.4", - "rfdc": "^1.3.1" + "esbuild": "^0.24.2", + "postcss": "^8.5.1", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=14.18.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/string-strip-html": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/string-strip-html/-/string-strip-html-13.4.8.tgz", - "integrity": "sha512-vlcRAtx5DN6zXGUx3EYGFg0/JOQWM65mqLgDaBHviQPP+ovUFzqZ30iQ+674JHWr9wNgnzFGxx9TGipPZMnZXg==", + "node_modules/vite-node": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.5.tgz", + "integrity": "sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==", "dependencies": { - "@types/lodash-es": "^4.17.12", - "codsen-utils": "^1.6.4", - "html-entities": "^2.5.2", - "lodash-es": "^4.17.21", - "ranges-apply": "^7.0.16", - "ranges-push": "^7.0.15", - "string-left-right": "^6.0.17" + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.2", + "vite": "^5.0.0 || ^6.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" }, "engines": { - "node": ">=14.18.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/string-trim-spaces-only": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/string-trim-spaces-only/-/string-trim-spaces-only-5.0.10.tgz", - "integrity": "sha512-MhmjE5jNqb1Ylo+BARPRlsdChGLrnPpAUWrT1VOxo9WhWwKVUU6CbZTfjwKaQPYTGS/wsX/4Zek88FM2rEb5iA==", + "node_modules/vite-node/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=14.18.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, + "node_modules/vite-tsconfig-paths": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", + "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thread-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", - "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", - "dependencies": { - "real-require": "^0.2.0" + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - }, - "node_modules/tinyglobby": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", - "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", - "dependencies": { - "fdir": "^6.4.2", - "picomatch": "^4.0.2" - }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.0.0" + "node": ">=18" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", - "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0" + "node": ">=18" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-api-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", - "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", - "dev": true, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" + "node": ">=18" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/tsx": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", - "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", - "dev": true, - "dependencies": { - "esbuild": "~0.23.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": ">=18" } }, - "node_modules/turndown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.0.tgz", - "integrity": "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==", - "dependencies": { - "@mixmark-io/domino": "^2.2.0" + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8.0" + "node": ">=18" } }, - "node_modules/type-fest": { - "version": "4.30.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.0.tgz", - "integrity": "sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/typed-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.2.1.tgz", - "integrity": "sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==", + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 18" + "node": ">=18" } }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, + "node_modules/vite/node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "hasInstallScript": true, "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.14.0.tgz", - "integrity": "sha512-K8fBJHxVL3kxMmwByvz8hNdBJ8a0YqKzKDX6jRlrjMuNXyd5T2V02HIq37+OiWXvUUOXgOOGiSSOh26Mh8pC3w==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.14.0", - "@typescript-eslint/parser": "8.14.0", - "@typescript-eslint/utils": "8.14.0" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/vitest": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.5.tgz", + "integrity": "sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==", + "dependencies": { + "@vitest/expect": "3.0.5", + "@vitest/mocker": "3.0.5", + "@vitest/pretty-format": "^3.0.5", + "@vitest/runner": "3.0.5", + "@vitest/snapshot": "3.0.5", + "@vitest/spy": "3.0.5", + "@vitest/utils": "3.0.5", + "chai": "^5.1.2", + "debug": "^4.4.0", + "expect-type": "^1.1.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.5", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.0.5", + "@vitest/ui": "3.0.5", + "happy-dom": "*", + "jsdom": "*" }, "peerDependenciesMeta": { - "typescript": { + "@edge-runtime/vm": { "optional": true - } - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "@types/debug": { + "optional": true }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, + "node_modules/vitest/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "optional": true, - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", + "ms": "^2.1.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/web-streams-polyfill": { @@ -5688,6 +8689,21 @@ "node": ">= 8" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wikipedia": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/wikipedia/-/wikipedia-2.1.2.tgz", @@ -5914,19 +8930,19 @@ } }, "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.23.5", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.5.tgz", - "integrity": "sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==", + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.1.tgz", + "integrity": "sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==", "peerDependencies": { - "zod": "^3.23.3" + "zod": "^3.24.1" } } } diff --git a/package.json b/package.json index 2b12a8c..ce3a906 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "bee-empty", + "name": "bee-supervisor", "type": "module", - "version": "0.0.1", + "version": "0.0.5", "private": true, "engines": { "node": ">=18.0.0", @@ -10,39 +10,70 @@ "files": [ "dist/**/*" ], - "main": "./dist/agent.js", - "types": "./dist/agent.d.ts", - "homepage": "https://github.com/i-am-bee/bee-agent-framework-starter#readme", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "./agents/*": { + "import": "./dist/agents/*", + "types": "./dist/agents/*.d.ts" + }, + "./tasks/*": { + "import": "./dist/tasks/*", + "types": "./dist/tasks/*.d.ts" + }, + "./workspaces/*": { + "import": "./dist/workspaces/*", + "types": "./dist/workspaces/*.d.ts" + }, + "./ui/*": { + "import": "./dist/ui/*", + "types": "./dist/ui/*.d.ts" + } + }, + "homepage": "https://github.com/aleskalfas/bee-supervisor-poc#readme", "repository": { "type": "git", - "url": "git+https://github.com/i-am-bee/bee-agent-framework-starter.git" + "url": "git+https://github.com/aleskalfas/bee-supervisor-poc.git" }, "bugs": { - "url": "https://github.com/i-am-bee/bee-agent-framework-starter/issues" + "url": "https://github.com/aleskalfas/bee-supervisor-poc/issues" }, "scripts": { - "start": "tsx --inspect --no-warnings src/agent.js", + "start:dev": "tsx --inspect --no-warnings src/main.js", + "monitor": "tsx --no-warnings src/ui/main.js", "ts:check": "tsc --noEmit --project tsconfig.json", - "build": "rimraf dist && tsc", + "build": "rimraf dist && tsc && tsc-alias", "lint": "eslint", "lint:fix": "eslint --fix", "format": "prettier --check .", "format:fix": "prettier --write .", "_ensure_env": "cp -n .env.template .env || true", - "prepare": "husky && npm run _ensure_env" + "prepare": "husky && npm run _ensure_env", + "test": "vitest --reporter=dot" }, "dependencies": { "@google-cloud/vertexai": "^1.9.2", "@ibm-generative-ai/node-sdk": "^3.2.4", + "@modelcontextprotocol/sdk": "^1.5.0", "@opentelemetry/sdk-node": "^0.57.0", + "@types/blessed": "^0.1.25", "bee-agent-framework": "^0.0.61", "bee-observe-connector": "^0.0.6", + "blessed": "^0.1.81", + "chokidar": "^4.0.3", "dotenv": "^16.4.5", "groq-sdk": "^0.7.0", "ollama": "^0.5.11", "openai": "^4.77.0", "openai-chat-tokens": "^0.2.8", "pino": "^9.4.0", + "remeda": "^2.20.1", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.0.5", "zod": "^3.23.8" }, "devDependencies": { @@ -57,6 +88,7 @@ "pino-pretty": "^11.2.2", "prettier": "^3.3.3", "rimraf": "^5.0.10", + "tsc-alias": "^1.8.10", "tsx": "^4.19.1", "typescript": "~5.5.4", "typescript-eslint": "^8.6.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..fdc53fb --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6690 @@ +lockfileVersion: "9.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + dependencies: + "@google-cloud/vertexai": + specifier: ^1.9.2 + version: 1.9.3 + "@ibm-generative-ai/node-sdk": + specifier: ^3.2.4 + version: 3.2.4 + "@modelcontextprotocol/sdk": + specifier: ^1.5.0 + version: 1.5.0 + "@opentelemetry/sdk-node": + specifier: ^0.57.0 + version: 0.57.2(@opentelemetry/api@1.9.0) + "@types/blessed": + specifier: ^0.1.25 + version: 0.1.25 + bee-agent-framework: + specifier: ^0.0.61 + version: 0.0.61(@google-cloud/vertexai@1.9.3)(@grpc/grpc-js@1.12.6)(@grpc/proto-loader@0.7.13)(@modelcontextprotocol/sdk@1.5.0)(google-auth-library@9.15.1)(groq-sdk@0.7.0)(ollama@0.5.13)(openai-chat-tokens@0.2.8)(openai@4.85.2(zod@3.24.2))(yaml@2.7.0) + bee-observe-connector: + specifier: ^0.0.6 + version: 0.0.6(bee-agent-framework@0.0.61(@google-cloud/vertexai@1.9.3)(@grpc/grpc-js@1.12.6)(@grpc/proto-loader@0.7.13)(@modelcontextprotocol/sdk@1.5.0)(google-auth-library@9.15.1)(groq-sdk@0.7.0)(ollama@0.5.13)(openai-chat-tokens@0.2.8)(openai@4.85.2(zod@3.24.2))(yaml@2.7.0)) + blessed: + specifier: ^0.1.81 + version: 0.1.81 + chokidar: + specifier: ^4.0.3 + version: 4.0.3 + dotenv: + specifier: ^16.4.5 + version: 16.4.7 + groq-sdk: + specifier: ^0.7.0 + version: 0.7.0 + ollama: + specifier: ^0.5.11 + version: 0.5.13 + openai: + specifier: ^4.77.0 + version: 4.85.2(zod@3.24.2) + openai-chat-tokens: + specifier: ^0.2.8 + version: 0.2.8 + pino: + specifier: ^9.4.0 + version: 9.6.0 + remeda: + specifier: ^2.20.1 + version: 2.20.2 + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.5.4)(vite@6.1.1(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0)) + vitest: + specifier: ^3.0.5 + version: 3.0.6(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0) + zod: + specifier: ^3.23.8 + version: 3.24.2 + devDependencies: + "@eslint/js": + specifier: ^9.10.0 + version: 9.20.0 + "@types/eslint-config-prettier": + specifier: ^6.11.3 + version: 6.11.3 + "@types/eslint__js": + specifier: ^8.42.3 + version: 8.42.3 + "@types/node": + specifier: ^18.15.3 + version: 18.19.76 + eslint: + specifier: ^9.10.0 + version: 9.20.1 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.20.1) + husky: + specifier: ^9.1.6 + version: 9.1.7 + lint-staged: + specifier: ^15.2.10 + version: 15.4.3 + pino-pretty: + specifier: ^11.2.2 + version: 11.3.0 + prettier: + specifier: ^3.3.3 + version: 3.5.1 + rimraf: + specifier: ^5.0.10 + version: 5.0.10 + tsx: + specifier: ^4.19.1 + version: 4.19.3 + typescript: + specifier: ~5.5.4 + version: 5.5.4 + typescript-eslint: + specifier: ^8.6.0 + version: 8.24.1(eslint@9.20.1)(typescript@5.5.4) + +packages: + "@ai-zen/node-fetch-event-source@2.1.4": + resolution: + { + integrity: sha512-OHFwPJecr+qwlyX5CGmTvKAKPZAdZaxvx/XDqS1lx4I2ZAk9riU0XnEaRGOOAEFrdcLZ98O5yWqubwjaQc0umg==, + } + + "@apidevtools/json-schema-ref-parser@11.9.1": + resolution: + { + integrity: sha512-OvyhwtYaWSTfo8NfibmFlgl+pIMaBOmN0OwZ3CPaGscEK3B8FCVDuQ7zgxY8seU/1kfSvNWnyB0DtKJyNLxX7g==, + } + engines: { node: ">= 16" } + + "@babel/runtime@7.26.9": + resolution: + { + integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==, + } + engines: { node: ">=6.9.0" } + + "@esbuild/aix-ppc64@0.24.2": + resolution: + { + integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==, + } + engines: { node: ">=18" } + cpu: [ppc64] + os: [aix] + + "@esbuild/aix-ppc64@0.25.0": + resolution: + { + integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==, + } + engines: { node: ">=18" } + cpu: [ppc64] + os: [aix] + + "@esbuild/android-arm64@0.24.2": + resolution: + { + integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm64@0.25.0": + resolution: + { + integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm@0.24.2": + resolution: + { + integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==, + } + engines: { node: ">=18" } + cpu: [arm] + os: [android] + + "@esbuild/android-arm@0.25.0": + resolution: + { + integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==, + } + engines: { node: ">=18" } + cpu: [arm] + os: [android] + + "@esbuild/android-x64@0.24.2": + resolution: + { + integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [android] + + "@esbuild/android-x64@0.25.0": + resolution: + { + integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [android] + + "@esbuild/darwin-arm64@0.24.2": + resolution: + { + integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-arm64@0.25.0": + resolution: + { + integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-x64@0.24.2": + resolution: + { + integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [darwin] + + "@esbuild/darwin-x64@0.25.0": + resolution: + { + integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [darwin] + + "@esbuild/freebsd-arm64@0.24.2": + resolution: + { + integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-arm64@0.25.0": + resolution: + { + integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.24.2": + resolution: + { + integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.25.0": + resolution: + { + integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [freebsd] + + "@esbuild/linux-arm64@0.24.2": + resolution: + { + integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm64@0.25.0": + resolution: + { + integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm@0.24.2": + resolution: + { + integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==, + } + engines: { node: ">=18" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-arm@0.25.0": + resolution: + { + integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==, + } + engines: { node: ">=18" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-ia32@0.24.2": + resolution: + { + integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==, + } + engines: { node: ">=18" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-ia32@0.25.0": + resolution: + { + integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==, + } + engines: { node: ">=18" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-loong64@0.24.2": + resolution: + { + integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==, + } + engines: { node: ">=18" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-loong64@0.25.0": + resolution: + { + integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==, + } + engines: { node: ">=18" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-mips64el@0.24.2": + resolution: + { + integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==, + } + engines: { node: ">=18" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-mips64el@0.25.0": + resolution: + { + integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==, + } + engines: { node: ">=18" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-ppc64@0.24.2": + resolution: + { + integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==, + } + engines: { node: ">=18" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-ppc64@0.25.0": + resolution: + { + integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==, + } + engines: { node: ">=18" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-riscv64@0.24.2": + resolution: + { + integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==, + } + engines: { node: ">=18" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-riscv64@0.25.0": + resolution: + { + integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==, + } + engines: { node: ">=18" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-s390x@0.24.2": + resolution: + { + integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==, + } + engines: { node: ">=18" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-s390x@0.25.0": + resolution: + { + integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==, + } + engines: { node: ">=18" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-x64@0.24.2": + resolution: + { + integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [linux] + + "@esbuild/linux-x64@0.25.0": + resolution: + { + integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [linux] + + "@esbuild/netbsd-arm64@0.24.2": + resolution: + { + integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [netbsd] + + "@esbuild/netbsd-arm64@0.25.0": + resolution: + { + integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [netbsd] + + "@esbuild/netbsd-x64@0.24.2": + resolution: + { + integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [netbsd] + + "@esbuild/netbsd-x64@0.25.0": + resolution: + { + integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [netbsd] + + "@esbuild/openbsd-arm64@0.24.2": + resolution: + { + integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [openbsd] + + "@esbuild/openbsd-arm64@0.25.0": + resolution: + { + integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [openbsd] + + "@esbuild/openbsd-x64@0.24.2": + resolution: + { + integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [openbsd] + + "@esbuild/openbsd-x64@0.25.0": + resolution: + { + integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [openbsd] + + "@esbuild/sunos-x64@0.24.2": + resolution: + { + integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [sunos] + + "@esbuild/sunos-x64@0.25.0": + resolution: + { + integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [sunos] + + "@esbuild/win32-arm64@0.24.2": + resolution: + { + integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-arm64@0.25.0": + resolution: + { + integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-ia32@0.24.2": + resolution: + { + integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==, + } + engines: { node: ">=18" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-ia32@0.25.0": + resolution: + { + integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==, + } + engines: { node: ">=18" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-x64@0.24.2": + resolution: + { + integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [win32] + + "@esbuild/win32-x64@0.25.0": + resolution: + { + integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [win32] + + "@eslint-community/eslint-utils@4.4.1": + resolution: + { + integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + "@eslint-community/regexpp@4.12.1": + resolution: + { + integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + "@eslint/config-array@0.19.2": + resolution: + { + integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/core@0.11.0": + resolution: + { + integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/eslintrc@3.2.0": + resolution: + { + integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/js@9.20.0": + resolution: + { + integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/object-schema@2.1.6": + resolution: + { + integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/plugin-kit@0.2.6": + resolution: + { + integrity: sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@google-cloud/vertexai@1.9.3": + resolution: + { + integrity: sha512-35o5tIEMLW3JeFJOaaMNR2e5sq+6rpnhrF97PuAxeOm0GlqVTESKhkGj7a5B5mmJSSSU3hUfIhcQCRRsw4Ipzg==, + } + engines: { node: ">=18.0.0" } + + "@grpc/grpc-js@1.12.6": + resolution: + { + integrity: sha512-JXUj6PI0oqqzTGvKtzOkxtpsyPRNsrmhh41TtIz/zEB6J+AUiZZ0dxWzcMwO9Ns5rmSPuMdghlTbUuqIM48d3Q==, + } + engines: { node: ">=12.10.0" } + + "@grpc/proto-loader@0.7.13": + resolution: + { + integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==, + } + engines: { node: ">=6" } + hasBin: true + + "@humanfs/core@0.19.1": + resolution: + { + integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, + } + engines: { node: ">=18.18.0" } + + "@humanfs/node@0.16.6": + resolution: + { + integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==, + } + engines: { node: ">=18.18.0" } + + "@humanwhocodes/module-importer@1.0.1": + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + "@humanwhocodes/retry@0.3.1": + resolution: + { + integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==, + } + engines: { node: ">=18.18" } + + "@humanwhocodes/retry@0.4.2": + resolution: + { + integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==, + } + engines: { node: ">=18.18" } + + "@ibm-generative-ai/node-sdk@3.2.4": + resolution: + { + integrity: sha512-HvJSYql3lOPYZcGb23mBw0kcWLlCX+n7EDRgJQxz7gIzx9WafUuDyl1IlTCXGfxolm0EhNIub79u9v7owtks0w==, + } + peerDependencies: + "@langchain/core": ">=0.1.0" + peerDependenciesMeta: + "@langchain/core": + optional: true + + "@isaacs/cliui@8.0.2": + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: ">=12" } + + "@jridgewell/sourcemap-codec@1.5.0": + resolution: + { + integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, + } + + "@js-sdsl/ordered-map@4.4.2": + resolution: + { + integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==, + } + + "@jsdevtools/ono@7.1.3": + resolution: + { + integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==, + } + + "@mixmark-io/domino@2.2.0": + resolution: + { + integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==, + } + + "@modelcontextprotocol/sdk@1.5.0": + resolution: + { + integrity: sha512-IJ+5iVVs8FCumIHxWqpwgkwOzyhtHVKy45s6Ug7Dv0MfRpaYisH8QQ87rIWeWdOzlk8sfhitZ7HCyQZk7d6b8w==, + } + engines: { node: ">=18" } + + "@nodelib/fs.scandir@2.1.5": + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.stat@2.0.5": + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.walk@1.2.8": + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + + "@opentelemetry/api-logs@0.57.2": + resolution: + { + integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==, + } + engines: { node: ">=14" } + + "@opentelemetry/api@1.9.0": + resolution: + { + integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==, + } + engines: { node: ">=8.0.0" } + + "@opentelemetry/context-async-hooks@1.30.1": + resolution: + { + integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + + "@opentelemetry/core@1.30.1": + resolution: + { + integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + + "@opentelemetry/exporter-logs-otlp-grpc@0.57.2": + resolution: + { + integrity: sha512-eovEy10n3umjKJl2Ey6TLzikPE+W4cUQ4gCwgGP1RqzTGtgDra0WjIqdy29ohiUKfvmbiL3MndZww58xfIvyFw==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/exporter-logs-otlp-http@0.57.2": + resolution: + { + integrity: sha512-0rygmvLcehBRp56NQVLSleJ5ITTduq/QfU7obOkyWgPpFHulwpw2LYTqNIz5TczKZuy5YY+5D3SDnXZL1tXImg==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/exporter-logs-otlp-proto@0.57.2": + resolution: + { + integrity: sha512-ta0ithCin0F8lu9eOf4lEz9YAScecezCHkMMyDkvd9S7AnZNX5ikUmC5EQOQADU+oCcgo/qkQIaKcZvQ0TYKDw==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/exporter-metrics-otlp-grpc@0.57.2": + resolution: + { + integrity: sha512-r70B8yKR41F0EC443b5CGB4rUaOMm99I5N75QQt6sHKxYDzSEc6gm48Diz1CI1biwa5tDPznpylTrywO/pT7qw==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/exporter-metrics-otlp-http@0.57.2": + resolution: + { + integrity: sha512-ttb9+4iKw04IMubjm3t0EZsYRNWr3kg44uUuzfo9CaccYlOh8cDooe4QObDUkvx9d5qQUrbEckhrWKfJnKhemA==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/exporter-metrics-otlp-proto@0.57.2": + resolution: + { + integrity: sha512-HX068Q2eNs38uf7RIkNN9Hl4Ynl+3lP0++KELkXMCpsCbFO03+0XNNZ1SkwxPlP9jrhQahsMPMkzNXpq3fKsnw==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/exporter-prometheus@0.57.2": + resolution: + { + integrity: sha512-VqIqXnuxWMWE/1NatAGtB1PvsQipwxDcdG4RwA/umdBcW3/iOHp0uejvFHTRN2O78ZPged87ErJajyUBPUhlDQ==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/exporter-trace-otlp-grpc@0.57.2": + resolution: + { + integrity: sha512-gHU1vA3JnHbNxEXg5iysqCWxN9j83d7/epTYBZflqQnTyCC4N7yZXn/dMM+bEmyhQPGjhCkNZLx4vZuChH1PYw==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/exporter-trace-otlp-http@0.57.2": + resolution: + { + integrity: sha512-sB/gkSYFu+0w2dVQ0PWY9fAMl172PKMZ/JrHkkW8dmjCL0CYkmXeE+ssqIL/yBUTPOvpLIpenX5T9RwXRBW/3g==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/exporter-trace-otlp-proto@0.57.2": + resolution: + { + integrity: sha512-awDdNRMIwDvUtoRYxRhja5QYH6+McBLtoz1q9BeEsskhZcrGmH/V1fWpGx8n+Rc+542e8pJA6y+aullbIzQmlw==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/exporter-zipkin@1.30.1": + resolution: + { + integrity: sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.0.0 + + "@opentelemetry/instrumentation@0.57.2": + resolution: + { + integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/otlp-exporter-base@0.57.2": + resolution: + { + integrity: sha512-XdxEzL23Urhidyebg5E6jZoaiW5ygP/mRjxLHixogbqwDy2Faduzb5N0o/Oi+XTIJu+iyxXdVORjXax+Qgfxag==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/otlp-grpc-exporter-base@0.57.2": + resolution: + { + integrity: sha512-USn173KTWy0saqqRB5yU9xUZ2xdgb1Rdu5IosJnm9aV4hMTuFFRTUsQxbgc24QxpCHeoKzzCSnS/JzdV0oM2iQ==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/otlp-transformer@0.57.2": + resolution: + { + integrity: sha512-48IIRj49gbQVK52jYsw70+Jv+JbahT8BqT2Th7C4H7RCM9d0gZ5sgNPoMpWldmfjvIsSgiGJtjfk9MeZvjhoig==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ^1.3.0 + + "@opentelemetry/propagator-b3@1.30.1": + resolution: + { + integrity: sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + + "@opentelemetry/propagator-jaeger@1.30.1": + resolution: + { + integrity: sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + + "@opentelemetry/resources@1.30.1": + resolution: + { + integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + + "@opentelemetry/sdk-logs@0.57.2": + resolution: + { + integrity: sha512-TXFHJ5c+BKggWbdEQ/inpgIzEmS2BGQowLE9UhsMd7YYlUfBQJ4uax0VF/B5NYigdM/75OoJGhAV3upEhK+3gg==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ">=1.4.0 <1.10.0" + + "@opentelemetry/sdk-metrics@1.30.1": + resolution: + { + integrity: sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.10.0" + + "@opentelemetry/sdk-node@0.57.2": + resolution: + { + integrity: sha512-8BaeqZyN5sTuPBtAoY+UtKwXBdqyuRKmekN5bFzAO40CgbGzAxfTpiL3PBerT7rhZ7p2nBdq7FaMv/tBQgHE4A==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.10.0" + + "@opentelemetry/sdk-trace-base@1.30.1": + resolution: + { + integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + + "@opentelemetry/sdk-trace-node@1.30.1": + resolution: + { + integrity: sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ==, + } + engines: { node: ">=14" } + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + + "@opentelemetry/semantic-conventions@1.28.0": + resolution: + { + integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==, + } + engines: { node: ">=14" } + + "@pkgjs/parseargs@0.11.0": + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: ">=14" } + + "@protobufjs/aspromise@1.1.2": + resolution: + { + integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==, + } + + "@protobufjs/base64@1.1.2": + resolution: + { + integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==, + } + + "@protobufjs/codegen@2.0.4": + resolution: + { + integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==, + } + + "@protobufjs/eventemitter@1.1.0": + resolution: + { + integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==, + } + + "@protobufjs/fetch@1.1.0": + resolution: + { + integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==, + } + + "@protobufjs/float@1.0.2": + resolution: + { + integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==, + } + + "@protobufjs/inquire@1.1.0": + resolution: + { + integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==, + } + + "@protobufjs/path@1.1.2": + resolution: + { + integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==, + } + + "@protobufjs/pool@1.1.0": + resolution: + { + integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==, + } + + "@protobufjs/utf8@1.1.0": + resolution: + { + integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==, + } + + "@rollup/rollup-android-arm-eabi@4.34.8": + resolution: + { + integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==, + } + cpu: [arm] + os: [android] + + "@rollup/rollup-android-arm64@4.34.8": + resolution: + { + integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==, + } + cpu: [arm64] + os: [android] + + "@rollup/rollup-darwin-arm64@4.34.8": + resolution: + { + integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==, + } + cpu: [arm64] + os: [darwin] + + "@rollup/rollup-darwin-x64@4.34.8": + resolution: + { + integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==, + } + cpu: [x64] + os: [darwin] + + "@rollup/rollup-freebsd-arm64@4.34.8": + resolution: + { + integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==, + } + cpu: [arm64] + os: [freebsd] + + "@rollup/rollup-freebsd-x64@4.34.8": + resolution: + { + integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==, + } + cpu: [x64] + os: [freebsd] + + "@rollup/rollup-linux-arm-gnueabihf@4.34.8": + resolution: + { + integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm-musleabihf@4.34.8": + resolution: + { + integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm64-gnu@4.34.8": + resolution: + { + integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-arm64-musl@4.34.8": + resolution: + { + integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-loongarch64-gnu@4.34.8": + resolution: + { + integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==, + } + cpu: [loong64] + os: [linux] + + "@rollup/rollup-linux-powerpc64le-gnu@4.34.8": + resolution: + { + integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==, + } + cpu: [ppc64] + os: [linux] + + "@rollup/rollup-linux-riscv64-gnu@4.34.8": + resolution: + { + integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==, + } + cpu: [riscv64] + os: [linux] + + "@rollup/rollup-linux-s390x-gnu@4.34.8": + resolution: + { + integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==, + } + cpu: [s390x] + os: [linux] + + "@rollup/rollup-linux-x64-gnu@4.34.8": + resolution: + { + integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-linux-x64-musl@4.34.8": + resolution: + { + integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-win32-arm64-msvc@4.34.8": + resolution: + { + integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==, + } + cpu: [arm64] + os: [win32] + + "@rollup/rollup-win32-ia32-msvc@4.34.8": + resolution: + { + integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==, + } + cpu: [ia32] + os: [win32] + + "@rollup/rollup-win32-x64-msvc@4.34.8": + resolution: + { + integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==, + } + cpu: [x64] + os: [win32] + + "@sindresorhus/is@4.6.0": + resolution: + { + integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, + } + engines: { node: ">=10" } + + "@streamparser/json@0.0.21": + resolution: + { + integrity: sha512-v+49JBiG1kmc/9Ug79Lz9wyKaRocBgCnpRaLpdy7p0d3ICKtOAfc/H/Epa1j3F6YdnzjnZKKrnJ8xnh/v1P8Aw==, + } + + "@types/blessed@0.1.25": + resolution: + { + integrity: sha512-kQsjBgtsbJLmG6CJA+Z6Nujj+tq1fcSE3UIowbDvzQI4wWmoTV7djUDhSo5lDjgwpIN0oRvks0SA5mMdKE5eFg==, + } + + "@types/eslint-config-prettier@6.11.3": + resolution: + { + integrity: sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==, + } + + "@types/eslint@9.6.1": + resolution: + { + integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==, + } + + "@types/eslint__js@8.42.3": + resolution: + { + integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==, + } + + "@types/estree@1.0.6": + resolution: + { + integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, + } + + "@types/json-schema@7.0.15": + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + + "@types/lodash-es@4.17.12": + resolution: + { + integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==, + } + + "@types/lodash@4.17.15": + resolution: + { + integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==, + } + + "@types/node-fetch@2.6.12": + resolution: + { + integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==, + } + + "@types/node@18.19.76": + resolution: + { + integrity: sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw==, + } + + "@types/shimmer@1.2.0": + resolution: + { + integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==, + } + + "@typescript-eslint/eslint-plugin@8.24.1": + resolution: + { + integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + + "@typescript-eslint/parser@8.24.1": + resolution: + { + integrity: sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + + "@typescript-eslint/scope-manager@8.24.1": + resolution: + { + integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/type-utils@8.24.1": + resolution: + { + integrity: sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + + "@typescript-eslint/types@8.24.1": + resolution: + { + integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/typescript-estree@8.24.1": + resolution: + { + integrity: sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <5.8.0" + + "@typescript-eslint/utils@8.24.1": + resolution: + { + integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + + "@typescript-eslint/visitor-keys@8.24.1": + resolution: + { + integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@vitest/expect@3.0.6": + resolution: + { + integrity: sha512-zBduHf/ja7/QRX4HdP1DSq5XrPgdN+jzLOwaTq/0qZjYfgETNFCKf9nOAp2j3hmom3oTbczuUzrzg9Hafh7hNg==, + } + + "@vitest/mocker@3.0.6": + resolution: + { + integrity: sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==, + } + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + "@vitest/pretty-format@3.0.6": + resolution: + { + integrity: sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==, + } + + "@vitest/runner@3.0.6": + resolution: + { + integrity: sha512-JopP4m/jGoaG1+CBqubV/5VMbi7L+NQCJTu1J1Pf6YaUbk7bZtaq5CX7p+8sY64Sjn1UQ1XJparHfcvTTdu9cA==, + } + + "@vitest/snapshot@3.0.6": + resolution: + { + integrity: sha512-qKSmxNQwT60kNwwJHMVwavvZsMGXWmngD023OHSgn873pV0lylK7dwBTfYP7e4URy5NiBCHHiQGA9DHkYkqRqg==, + } + + "@vitest/spy@3.0.6": + resolution: + { + integrity: sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==, + } + + "@vitest/utils@3.0.6": + resolution: + { + integrity: sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==, + } + + abort-controller@3.0.0: + resolution: + { + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, + } + engines: { node: ">=6.5" } + + acorn-import-attributes@1.9.5: + resolution: + { + integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==, + } + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: + { + integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + adm-zip@0.5.16: + resolution: + { + integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==, + } + engines: { node: ">=12.0" } + + agent-base@7.1.3: + resolution: + { + integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==, + } + engines: { node: ">= 14" } + + agentkeepalive@4.6.0: + resolution: + { + integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==, + } + engines: { node: ">= 8.0.0" } + + ajv-formats@3.0.1: + resolution: + { + integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==, + } + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + + ajv@8.17.1: + resolution: + { + integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, + } + + ansi-escapes@7.0.0: + resolution: + { + integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==, + } + engines: { node: ">=18" } + + ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + ansi-regex@6.1.0: + resolution: + { + integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, + } + engines: { node: ">=12" } + + ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + + ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } + + argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + assertion-error@2.0.1: + resolution: + { + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, + } + engines: { node: ">=12" } + + asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + + atomic-sleep@1.0.0: + resolution: + { + integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==, + } + engines: { node: ">=8.0.0" } + + axios@1.7.9: + resolution: + { + integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==, + } + + balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + bee-agent-framework@0.0.61: + resolution: + { + integrity: sha512-SnKlcPgBMQ9pJ83yso6CLnODme3Pzsu3Yc3fFlOalPRRfxgz75yo9+wIiCUQFFcGgx7UDBB4N44Bl5mfYdSk6w==, + } + deprecated: "WARNING: This project has been renamed to beeai-framework. Install using beeai-framework instead." + peerDependencies: + "@aws-sdk/client-bedrock-runtime": ^3.687.0 + "@elastic/elasticsearch": ^8.0.0 + "@google-cloud/vertexai": "*" + "@googleapis/customsearch": ^3.2.0 + "@grpc/grpc-js": ^1.11.3 + "@grpc/proto-loader": ^0.7.13 + "@langchain/community": ">=0.2.28" + "@langchain/core": ">=0.2.27" + "@modelcontextprotocol/sdk": ^1.0.4 + "@zilliz/milvus2-sdk-node": ^2.4.9 + google-auth-library: "*" + groq-sdk: ^0.7.0 + ollama: ^0.5.11 + openai: ^4.67.3 + openai-chat-tokens: ^0.2.8 + sequelize: ^6.37.3 + yaml: ^2.6.1 + peerDependenciesMeta: + "@aws-sdk/client-bedrock-runtime": + optional: true + "@elastic/elasticsearch": + optional: true + "@google-cloud/vertexai": + optional: true + "@googleapis/customsearch": + optional: true + "@grpc/grpc-js": + optional: true + "@grpc/proto-loader": + optional: true + "@langchain/community": + optional: true + "@langchain/core": + optional: true + "@modelcontextprotocol/sdk": + optional: true + "@zilliz/milvus2-sdk-node": + optional: true + google-auth-library: + optional: true + groq-sdk: + optional: true + ollama: + optional: true + openai: + optional: true + openai-chat-tokens: + optional: true + sequelize: + optional: true + yaml: + optional: true + + bee-observe-connector@0.0.6: + resolution: + { + integrity: sha512-KZhhOFwvw/dR2YN4DPf7dZkquJ4O41D0WhjAsU3+RApkvBnpSm6Y/TYTa7vOZKaJzbuJ0NqRVrhPD8dCuKXFMQ==, + } + peerDependencies: + bee-agent-framework: ">=0.0.27 <0.1.0" + + bignumber.js@9.1.2: + resolution: + { + integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==, + } + + blessed@0.1.81: + resolution: + { + integrity: sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==, + } + engines: { node: ">= 0.8.0" } + hasBin: true + + brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + + brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + + braces@3.0.3: + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: ">=8" } + + browserslist@4.24.4: + resolution: + { + integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + + buffer-equal-constant-time@1.0.1: + resolution: + { + integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==, + } + + buffer@6.0.3: + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, + } + + bytes@3.1.2: + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: ">= 0.8" } + + cac@6.7.14: + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: ">=8" } + + call-bind-apply-helpers@1.0.2: + resolution: + { + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, + } + engines: { node: ">= 0.4" } + + callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + camelcase@4.1.0: + resolution: + { + integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==, + } + engines: { node: ">=4" } + + caniuse-lite@1.0.30001700: + resolution: + { + integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==, + } + + chai@5.2.0: + resolution: + { + integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==, + } + engines: { node: ">=12" } + + chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + + chalk@5.4.1: + resolution: + { + integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + + check-error@2.1.1: + resolution: + { + integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==, + } + engines: { node: ">= 16" } + + chokidar@4.0.3: + resolution: + { + integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, + } + engines: { node: ">= 14.16.0" } + + cjs-module-lexer@1.4.3: + resolution: + { + integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==, + } + + cli-cursor@5.0.0: + resolution: + { + integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==, + } + engines: { node: ">=18" } + + cli-truncate@4.0.0: + resolution: + { + integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==, + } + engines: { node: ">=18" } + + cliui@8.0.1: + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: ">=12" } + + codsen-utils@1.6.4: + resolution: + { + integrity: sha512-PDyvQ5f2PValmqZZIJATimcokDt4JjIev8cKbZgEOoZm+U1IJDYuLeTcxZPQdep99R/X0RIlQ6ReQgPOVnPbNw==, + } + engines: { node: ">=14.18.0" } + + color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + + color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + colorette@2.0.20: + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } + + combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: ">= 0.8" } + + commander@13.1.0: + resolution: + { + integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==, + } + engines: { node: ">=18" } + + complex.js@2.4.2: + resolution: + { + integrity: sha512-qtx7HRhPGSCBtGiST4/WGHuW+zeaND/6Ld+db6PbrulIB1i2Ev/2UPiqcmpQNPSyfBKraC0EOvOKCB5dGZKt3g==, + } + + concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + content-type@1.0.5: + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: ">= 0.6" } + + cross-fetch@4.1.0: + resolution: + { + integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==, + } + + cross-spawn@7.0.6: + resolution: + { + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, + } + engines: { node: ">= 8" } + + dateformat@4.6.3: + resolution: + { + integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==, + } + + debug@4.4.0: + resolution: + { + integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.5.0: + resolution: + { + integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==, + } + + deep-eql@5.0.2: + resolution: + { + integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, + } + engines: { node: ">=6" } + + deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + + delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: ">=0.4.0" } + + depd@2.0.0: + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: ">= 0.8" } + + dot-prop@6.0.1: + resolution: + { + integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==, + } + engines: { node: ">=10" } + + dotenv@16.4.7: + resolution: + { + integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==, + } + engines: { node: ">=12" } + + duck-duck-scrape@2.2.7: + resolution: + { + integrity: sha512-BEcglwnfx5puJl90KQfX+Q2q5vCguqyMpZcSRPBWk8OY55qWwV93+E+7DbIkrGDW4qkqPfUvtOUdi0lXz6lEMQ==, + } + + dunder-proto@1.0.1: + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: ">= 0.4" } + + eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + + ecdsa-sig-formatter@1.0.11: + resolution: + { + integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==, + } + + electron-to-chromium@1.5.102: + resolution: + { + integrity: sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==, + } + + emoji-regex@10.4.0: + resolution: + { + integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==, + } + + emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + + end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + + environment@1.1.0: + resolution: + { + integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==, + } + engines: { node: ">=18" } + + es-define-property@1.0.1: + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: ">= 0.4" } + + es-errors@1.3.0: + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: ">= 0.4" } + + es-module-lexer@1.6.0: + resolution: + { + integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==, + } + + es-object-atoms@1.1.1: + resolution: + { + integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, + } + engines: { node: ">= 0.4" } + + es-set-tostringtag@2.1.0: + resolution: + { + integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, + } + engines: { node: ">= 0.4" } + + esbuild@0.24.2: + resolution: + { + integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==, + } + engines: { node: ">=18" } + hasBin: true + + esbuild@0.25.0: + resolution: + { + integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==, + } + engines: { node: ">=18" } + hasBin: true + + escalade@3.2.0: + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: ">=6" } + + escape-latex@1.2.0: + resolution: + { + integrity: sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==, + } + + escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + + eslint-config-prettier@9.1.0: + resolution: + { + integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==, + } + hasBin: true + peerDependencies: + eslint: ">=7.0.0" + + eslint-scope@8.2.0: + resolution: + { + integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + eslint-visitor-keys@4.2.0: + resolution: + { + integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + eslint@9.20.1: + resolution: + { + integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + hasBin: true + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: + { + integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + esquery@1.6.0: + resolution: + { + integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, + } + engines: { node: ">=0.10" } + + esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + + estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + estree-walker@3.0.3: + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } + + esutils@2.0.3: + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: ">=0.10.0" } + + event-target-shim@5.0.1: + resolution: + { + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, + } + engines: { node: ">=6" } + + eventemitter3@5.0.1: + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } + + events@3.3.0: + resolution: + { + integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, + } + engines: { node: ">=0.8.x" } + + eventsource-parser@3.0.0: + resolution: + { + integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==, + } + engines: { node: ">=18.0.0" } + + eventsource@3.0.5: + resolution: + { + integrity: sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==, + } + engines: { node: ">=18.0.0" } + + execa@8.0.1: + resolution: + { + integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, + } + engines: { node: ">=16.17" } + + expect-type@1.1.0: + resolution: + { + integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==, + } + engines: { node: ">=12.0.0" } + + extend@3.0.2: + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } + + fast-copy@3.0.2: + resolution: + { + integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==, + } + + fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + fast-glob@3.3.3: + resolution: + { + integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, + } + engines: { node: ">=8.6.0" } + + fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + fast-redact@3.5.0: + resolution: + { + integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==, + } + engines: { node: ">=6" } + + fast-safe-stringify@2.1.1: + resolution: + { + integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, + } + + fast-uri@3.0.6: + resolution: + { + integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==, + } + + fast-xml-parser@4.5.2: + resolution: + { + integrity: sha512-xmnYV9o0StIz/0ArdzmWTxn9oDy0lH8Z80/8X/TD2EUQKXY4DHxoT9mYBqgGIG17DgddCJtH1M6DriMbalNsAA==, + } + hasBin: true + + fastq@1.19.0: + resolution: + { + integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==, + } + + fdir@6.4.3: + resolution: + { + integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==, + } + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-retry@5.0.6: + resolution: + { + integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==, + } + + file-entry-cache@8.0.0: + resolution: + { + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, + } + engines: { node: ">=16.0.0" } + + fill-range@7.1.1: + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: ">=8" } + + find-up@5.0.0: + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: ">=10" } + + flat-cache@4.0.1: + resolution: + { + integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, + } + engines: { node: ">=16" } + + flatted@3.3.3: + resolution: + { + integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, + } + + follow-redirects@1.15.9: + resolution: + { + integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==, + } + engines: { node: ">=4.0" } + peerDependencies: + debug: "*" + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.0: + resolution: + { + integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==, + } + engines: { node: ">=14" } + + form-data-encoder@1.7.2: + resolution: + { + integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==, + } + + form-data@4.0.2: + resolution: + { + integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==, + } + engines: { node: ">= 6" } + + formdata-node@4.4.1: + resolution: + { + integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==, + } + engines: { node: ">= 12.20" } + + fraction.js@5.2.1: + resolution: + { + integrity: sha512-Ah6t/7YCYjrPUFUFsOsRLMXAdnYM+aQwmojD2Ayb/Ezr82SwES0vuyQ8qZ3QO8n9j7W14VJuVZZet8U3bhSdQQ==, + } + engines: { node: ">= 12" } + + fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + + function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + + gaxios@6.7.1: + resolution: + { + integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==, + } + engines: { node: ">=14" } + + gcp-metadata@6.1.1: + resolution: + { + integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==, + } + engines: { node: ">=14" } + + generative-bayesian-network@2.1.62: + resolution: + { + integrity: sha512-+zq1/AHdxb+0MXF34krM/IUu/N9gI6llzQg2gf7WMfuzh0nv6xbhb8QyfL48MOJihum7wSE90+/hMXK60X+Kpw==, + } + + get-caller-file@2.0.5: + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } + + get-east-asian-width@1.3.0: + resolution: + { + integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==, + } + engines: { node: ">=18" } + + get-intrinsic@1.2.7: + resolution: + { + integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==, + } + engines: { node: ">= 0.4" } + + get-proto@1.0.1: + resolution: + { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: ">= 0.4" } + + get-stream@8.0.1: + resolution: + { + integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, + } + engines: { node: ">=16" } + + get-tsconfig@4.10.0: + resolution: + { + integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==, + } + + glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + + glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + + glob@10.4.5: + resolution: + { + integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, + } + hasBin: true + + globals@14.0.0: + resolution: + { + integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, + } + engines: { node: ">=18" } + + globrex@0.1.2: + resolution: + { + integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==, + } + + google-auth-library@9.15.1: + resolution: + { + integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==, + } + engines: { node: ">=14" } + + google-logging-utils@0.0.2: + resolution: + { + integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==, + } + engines: { node: ">=14" } + + gopd@1.2.0: + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: ">= 0.4" } + + graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + + groq-sdk@0.7.0: + resolution: + { + integrity: sha512-OgPqrRtti5MjEVclR8sgBHrhSkTLdFCmi47yrEF29uJZaiCkX3s7bXpnMhq8Lwoe1f4AwgC0qGOeHXpeSgu5lg==, + } + + gtoken@7.1.0: + resolution: + { + integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==, + } + engines: { node: ">=14.0.0" } + + has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + has-symbols@1.1.0: + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: ">= 0.4" } + + has-tostringtag@1.0.2: + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: ">= 0.4" } + + hasown@2.0.2: + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: ">= 0.4" } + + header-generator@2.1.62: + resolution: + { + integrity: sha512-L4y1Fush4bkC/3zEurWjiwzeuekAH3HMYA508EZDmvk1wPmcbpV/mq3u3d3fxq7v4oPmaCfsRm1T5DUH19uikA==, + } + engines: { node: ">=16.0.0" } + + help-me@5.0.0: + resolution: + { + integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==, + } + + html-entities@2.5.2: + resolution: + { + integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==, + } + + http-errors@2.0.0: + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: ">= 0.8" } + + http-status-codes@2.3.0: + resolution: + { + integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==, + } + + https-proxy-agent@7.0.6: + resolution: + { + integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==, + } + engines: { node: ">= 14" } + + human-signals@5.0.0: + resolution: + { + integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, + } + engines: { node: ">=16.17.0" } + + humanize-ms@1.2.1: + resolution: + { + integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, + } + + husky@9.1.7: + resolution: + { + integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==, + } + engines: { node: ">=18" } + hasBin: true + + iconv-lite@0.6.3: + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: ">=0.10.0" } + + ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + + ignore@5.3.2: + resolution: + { + integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, + } + engines: { node: ">= 4" } + + import-fresh@3.3.1: + resolution: + { + integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, + } + engines: { node: ">=6" } + + import-in-the-middle@1.13.0: + resolution: + { + integrity: sha512-YG86SYDtrL/Yu8JgfWb7kjQ0myLeT1whw6fs/ZHFkXFcbk9zJU9lOCsSJHpvaPumU11nN3US7NW6x1YTk+HrUA==, + } + + imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + infobox-parser@3.6.4: + resolution: + { + integrity: sha512-d2lTlxKZX7WsYxk9/UPt51nkmZv5tbC75SSw4hfHqZ3LpRAn6ug0oru9xI2X+S78va3aUAze3xl/UqMuwLmJUw==, + } + + inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + is-core-module@2.16.1: + resolution: + { + integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, + } + engines: { node: ">= 0.4" } + + is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + + is-fullwidth-code-point@4.0.0: + resolution: + { + integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, + } + engines: { node: ">=12" } + + is-fullwidth-code-point@5.0.0: + resolution: + { + integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==, + } + engines: { node: ">=18" } + + is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + + is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + is-obj@2.0.0: + resolution: + { + integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, + } + engines: { node: ">=8" } + + is-stream@2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } + + is-stream@3.0.0: + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + jackspeak@3.4.3: + resolution: + { + integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, + } + + javascript-natural-sort@0.7.1: + resolution: + { + integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==, + } + + joplin-turndown-plugin-gfm@1.0.12: + resolution: + { + integrity: sha512-qL4+1iycQjZ1fs8zk3jSRk7cg3ROBUHk7GKtiLAQLFzLPKErnILUvz5DLszSQvz3s1sTjPbywLDISVUtBY6HaA==, + } + + joycon@3.1.1: + resolution: + { + integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, + } + engines: { node: ">=10" } + + js-tiktoken@1.0.19: + resolution: + { + integrity: sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g==, + } + + js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + + json-bigint@1.0.0: + resolution: + { + integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==, + } + + json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + json-schema-to-typescript@15.0.4: + resolution: + { + integrity: sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==, + } + engines: { node: ">=16.0.0" } + hasBin: true + + json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + json-schema-traverse@1.0.0: + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } + + json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + jsonrepair@3.12.0: + resolution: + { + integrity: sha512-SWfjz8SuQ0wZjwsxtSJ3Zy8vvLg6aO/kxcp9TWNPGwJKgTZVfhNEQBMk/vPOpYCDFWRxD6QWuI6IHR1t615f0w==, + } + hasBin: true + + jwa@2.0.0: + resolution: + { + integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==, + } + + jws@4.0.0: + resolution: + { + integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==, + } + + keyv@4.5.4: + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } + + levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + + lilconfig@3.1.3: + resolution: + { + integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, + } + engines: { node: ">=14" } + + lint-staged@15.4.3: + resolution: + { + integrity: sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g==, + } + engines: { node: ">=18.12.0" } + hasBin: true + + listr2@8.2.5: + resolution: + { + integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==, + } + engines: { node: ">=18.0.0" } + + locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + + lodash-es@4.17.21: + resolution: + { + integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, + } + + lodash.camelcase@4.3.0: + resolution: + { + integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, + } + + lodash.isequal@4.5.0: + resolution: + { + integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, + } + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + + log-update@6.1.0: + resolution: + { + integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==, + } + engines: { node: ">=18" } + + long@5.3.1: + resolution: + { + integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==, + } + + loupe@3.1.3: + resolution: + { + integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==, + } + + lru-cache@10.4.3: + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } + + magic-string@0.30.17: + resolution: + { + integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, + } + + math-intrinsics@1.1.0: + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: ">= 0.4" } + + mathjs@14.2.1: + resolution: + { + integrity: sha512-vARWETUx75+kR2K9qBV20n6NYtGXCuQKX8Zo4+AhJI5LX+ukSM1NYebv+wLnJG8KMvEe9H01sJUyC5bMciA4Tg==, + } + engines: { node: ">= 18" } + hasBin: true + + merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + + merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + + micromatch@4.0.8: + resolution: + { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: ">=8.6" } + + mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + + mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + + mimic-fn@4.0.0: + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: ">=12" } + + mimic-function@5.0.1: + resolution: + { + integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==, + } + engines: { node: ">=18" } + + minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + + minimatch@9.0.5: + resolution: + { + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, + } + engines: { node: ">=16 || 14 >=14.17" } + + minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + + minipass@7.1.2: + resolution: + { + integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, + } + engines: { node: ">=16 || 14 >=14.17" } + + module-details-from-path@1.0.3: + resolution: + { + integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==, + } + + ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + + mustache@4.2.0: + resolution: + { + integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, + } + hasBin: true + + nanoid@3.3.8: + resolution: + { + integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + needle@3.3.1: + resolution: + { + integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==, + } + engines: { node: ">= 4.4.x" } + hasBin: true + + node-domexception@1.0.0: + resolution: + { + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + } + engines: { node: ">=10.5.0" } + + node-fetch@2.7.0: + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.19: + resolution: + { + integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==, + } + + npm-run-path@5.3.0: + resolution: + { + integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + object-hash@3.0.0: + resolution: + { + integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, + } + engines: { node: ">= 6" } + + ollama@0.5.13: + resolution: + { + integrity: sha512-qK3eE2GjMYjCiTknEJfAHjbUzUqgVtf9qtzjxWrkwBZgBG7kOB6Z4+Ov4fbvDjmKKHv+rpuTsWFg4jZvVjNBtQ==, + } + + on-exit-leak-free@2.1.2: + resolution: + { + integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==, + } + engines: { node: ">=14.0.0" } + + once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + + onetime@6.0.0: + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: ">=12" } + + onetime@7.0.0: + resolution: + { + integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==, + } + engines: { node: ">=18" } + + openai-chat-tokens@0.2.8: + resolution: + { + integrity: sha512-nW7QdFDIZlAYe6jsCT/VPJ/Lam3/w2DX9oxf/5wHpebBT49KI3TN43PPhYlq1klq2ajzXWKNOLY6U4FNZM7AoA==, + } + + openai@4.85.2: + resolution: + { + integrity: sha512-ZQg3Q+K4A6M9dLFh5W36paZkZBQO+VbxMNJ1gUSyHsGiEWuXahdn02ermqNV68LhWQxdJQaWUFRAYpW/suTPWQ==, + } + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + openapi-fetch@0.11.3: + resolution: + { + integrity: sha512-r18fERgpxFrI4pv79ABD1dqFetWz7pTfwRd7jQmRm/lFdCDpWF43kvHUiOqOZu+tWsMydDJMpJN1hlZ9inRvfA==, + } + + openapi-fetch@0.8.2: + resolution: + { + integrity: sha512-4g+NLK8FmQ51RW6zLcCBOVy/lwYmFJiiT+ckYZxJWxUxH4XFhsNcX2eeqVMfVOi+mDNFja6qDXIZAz2c5J/RVw==, + } + + openapi-typescript-helpers@0.0.13: + resolution: + { + integrity: sha512-z44WK2e7ygW3aUtAtiurfEACohf/Qt9g6BsejmIYgEoY4REHeRzgFJmO3ium0libsuzPc145I+8lE9aiiZrQvQ==, + } + + openapi-typescript-helpers@0.0.5: + resolution: + { + integrity: sha512-MRffg93t0hgGZbYTxg60hkRIK2sRuEOHEtCUgMuLgbCC33TMQ68AmxskzUlauzZYD47+ENeGV/ElI7qnWqrAxA==, + } + + optionator@0.9.4: + resolution: + { + integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, + } + engines: { node: ">= 0.8.0" } + + ow@0.28.2: + resolution: + { + integrity: sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==, + } + engines: { node: ">=12" } + + p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + + p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + + p-queue-compat@1.0.225: + resolution: + { + integrity: sha512-SdfGSQSJJpD7ZR+dJEjjn9GuuBizHPLW/yarJpXnmrHRruzrq7YM8OqsikSrKeoPv+Pi1YXw9IIBSIg5WveQHA==, + } + engines: { node: ">=12" } + + p-queue-compat@1.0.229: + resolution: + { + integrity: sha512-w/jxEziXYIoQ4O93LijryeEWTfcx/dTshOzPtydQ9kfgr1nPZ+h7h2nvoL/1rYYL/Rg2uwUydZV8GDkAYPqV5w==, + } + engines: { node: ">=12" } + + p-throttle@7.0.0: + resolution: + { + integrity: sha512-aio0v+S0QVkH1O+9x4dHtD4dgCExACcL+3EtNaGqC01GBudS9ijMuUsmN8OVScyV4OOp0jqdLShZFuSlbL/AsA==, + } + engines: { node: ">=18" } + + p-timeout-compat@1.0.6: + resolution: + { + integrity: sha512-4Xj6j5oP1hYuBcl3iPhY972E8gm427UGqwV4UoXQB94ezqMY8VcRPV1rwAeENtSqCNjiEkEMwPgNdPpJdZV84w==, + } + engines: { node: ">=12" } + + package-json-from-dist@1.0.1: + resolution: + { + integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, + } + + parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + + path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + path-key@4.0.0: + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: ">=12" } + + path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + + path-scurry@1.11.1: + resolution: + { + integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, + } + engines: { node: ">=16 || 14 >=14.18" } + + pathe@2.0.3: + resolution: + { + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + } + + pathval@2.0.0: + resolution: + { + integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==, + } + engines: { node: ">= 14.16" } + + picocolors@1.1.1: + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } + + picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + picomatch@4.0.2: + resolution: + { + integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, + } + engines: { node: ">=12" } + + pidtree@0.6.0: + resolution: + { + integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, + } + engines: { node: ">=0.10" } + hasBin: true + + pino-abstract-transport@2.0.0: + resolution: + { + integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==, + } + + pino-pretty@11.3.0: + resolution: + { + integrity: sha512-oXwn7ICywaZPHmu3epHGU2oJX4nPmKvHvB/bwrJHlGcbEWaVcotkpyVHMKLKmiVryWYByNp0jpgAcXpFJDXJzA==, + } + hasBin: true + + pino-std-serializers@7.0.0: + resolution: + { + integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==, + } + + pino@9.6.0: + resolution: + { + integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==, + } + hasBin: true + + postcss@8.5.3: + resolution: + { + integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, + } + engines: { node: ^10 || ^12 || >=14 } + + prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + prettier@3.5.1: + resolution: + { + integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==, + } + engines: { node: ">=14" } + hasBin: true + + process-warning@4.0.1: + resolution: + { + integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==, + } + + process@0.11.10: + resolution: + { + integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, + } + engines: { node: ">= 0.6.0" } + + promise-based-task@3.1.1: + resolution: + { + integrity: sha512-67wj5yO49S47PxPV4vMCcqGPm/K8AMyE1uXCyRFSd9y/crUaRyJf/NHy8UMNsyWm/PEOWWOa27fXxu591/xLag==, + } + + protobufjs@7.4.0: + resolution: + { + integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==, + } + engines: { node: ">=12.0.0" } + + proxy-from-env@1.1.0: + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + } + + pump@3.0.2: + resolution: + { + integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==, + } + + punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } + + queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + quick-format-unescaped@4.0.4: + resolution: + { + integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==, + } + + ranges-apply@7.0.16: + resolution: + { + integrity: sha512-4rGJHOyA7qatiMDg3vcETkc/TVBPU86/xZRTXff6o7a2neYLmj0EXUUAlhLVuiWAzTPHDPHOQxtk8EDrIF4ohg==, + } + engines: { node: ">=14.18.0" } + + ranges-merge@9.0.15: + resolution: + { + integrity: sha512-hvt4hx0FKIaVfjd1oKx0poL57ljxdL2KHC6bXBrAdsx2iCsH+x7nO/5J0k2veM/isnOcFZKp0ZKkiCjCtzy74Q==, + } + engines: { node: ">=14.18.0" } + + ranges-push@7.0.15: + resolution: + { + integrity: sha512-gXpBYQ5Umf3uG6jkJnw5ddok2Xfo5p22rAJBLrqzNKa7qkj3q5AOCoxfRPXEHUVaJutfXc9K9eGXdIzdyQKPkw==, + } + engines: { node: ">=14.18.0" } + + ranges-sort@6.0.11: + resolution: + { + integrity: sha512-fhNEG0vGi7bESitNNqNBAfYPdl2efB+1paFlI8BQDCNkruERKuuhG8LkQClDIVqUJLkrmKuOSPQ3xZHqVnVo3Q==, + } + engines: { node: ">=14.18.0" } + + raw-body@3.0.0: + resolution: + { + integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==, + } + engines: { node: ">= 0.8" } + + readable-stream@4.7.0: + resolution: + { + integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + readdirp@4.1.2: + resolution: + { + integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, + } + engines: { node: ">= 14.18.0" } + + real-require@0.2.0: + resolution: + { + integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==, + } + engines: { node: ">= 12.13.0" } + + regenerator-runtime@0.14.1: + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } + + remeda@2.20.2: + resolution: + { + integrity: sha512-38pfm5aUq6mUkNYbt7TdY2WEk9mSqRVV+6UsoTjabwmbu8obLbh8sYYSX2WQ3W4u6EYp3XxUKqIiwGFZu+OY9g==, + } + + require-directory@2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: ">=0.10.0" } + + require-from-string@2.0.2: + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: ">=0.10.0" } + + require-in-the-middle@7.5.1: + resolution: + { + integrity: sha512-fgZEz/t3FDrU9o7EhI+iNNq1pNNpJImOvX72HUd6RoFiw8MaKd8/gR5tLuc8A0G0e55LMbP6ImjnmXY6zrTmjw==, + } + engines: { node: ">=8.6.0" } + + resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + resolve-pkg-maps@1.0.0: + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } + + resolve@1.22.10: + resolution: + { + integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, + } + engines: { node: ">= 0.4" } + hasBin: true + + restore-cursor@5.1.0: + resolution: + { + integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==, + } + engines: { node: ">=18" } + + reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + rfdc@1.4.1: + resolution: + { + integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, + } + + rimraf@5.0.10: + resolution: + { + integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==, + } + hasBin: true + + rollup@4.34.8: + resolution: + { + integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true + + run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + + safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + + safe-stable-stringify@2.5.0: + resolution: + { + integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==, + } + engines: { node: ">=10" } + + safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + + sax@1.4.1: + resolution: + { + integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==, + } + + secure-json-parse@2.7.0: + resolution: + { + integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==, + } + + seedrandom@3.0.5: + resolution: + { + integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==, + } + + semver@7.7.1: + resolution: + { + integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, + } + engines: { node: ">=10" } + hasBin: true + + serialize-error@11.0.3: + resolution: + { + integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==, + } + engines: { node: ">=14.16" } + + setprototypeof@1.2.0: + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } + + shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + + shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + shimmer@1.2.1: + resolution: + { + integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==, + } + + siginfo@2.0.0: + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } + + signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } + + slice-ansi@5.0.0: + resolution: + { + integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==, + } + engines: { node: ">=12" } + + slice-ansi@7.1.0: + resolution: + { + integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==, + } + engines: { node: ">=18" } + + sonic-boom@4.2.0: + resolution: + { + integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==, + } + + source-map-js@1.2.1: + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: ">=0.10.0" } + + split2@4.2.0: + resolution: + { + integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, + } + engines: { node: ">= 10.x" } + + stackback@0.0.2: + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } + + statuses@2.0.1: + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: ">= 0.8" } + + std-env@3.8.0: + resolution: + { + integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==, + } + + string-argv@0.3.2: + resolution: + { + integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, + } + engines: { node: ">=0.6.19" } + + string-collapse-leading-whitespace@7.0.7: + resolution: + { + integrity: sha512-jF9eynJoE6ezTCdYI8Qb02/ij/DlU9ItG93Dty4SWfJeLFrotOr+wH9IRiWHTqO3mjCyqBWEiU3uSTIbxYbAEQ==, + } + engines: { node: ">=14.18.0" } + + string-comparison@1.3.0: + resolution: + { + integrity: sha512-46aD+slEwybxAMPRII83ATbgMgTiz5P8mVd7Z6VJsCzSHFjdt1hkAVLeFxPIyEb11tc6ihpJTlIqoO0MCF6NPw==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + + string-left-right@6.0.17: + resolution: + { + integrity: sha512-nuyIV4D4ivnwT64E0TudmCRg52NfkumuEUilyoOrHb/Z2wEOF5I+9SI6P+veFKqWKZfGpAs6OqKe4nAjujARyw==, + } + engines: { node: ">=14.18.0" } + + string-strip-html@13.4.8: + resolution: + { + integrity: sha512-vlcRAtx5DN6zXGUx3EYGFg0/JOQWM65mqLgDaBHviQPP+ovUFzqZ30iQ+674JHWr9wNgnzFGxx9TGipPZMnZXg==, + } + engines: { node: ">=14.18.0" } + + string-trim-spaces-only@5.0.10: + resolution: + { + integrity: sha512-MhmjE5jNqb1Ylo+BARPRlsdChGLrnPpAUWrT1VOxo9WhWwKVUU6CbZTfjwKaQPYTGS/wsX/4Zek88FM2rEb5iA==, + } + engines: { node: ">=14.18.0" } + + string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } + + string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: ">=12" } + + string-width@7.2.0: + resolution: + { + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, + } + engines: { node: ">=18" } + + string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + + strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + + strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } + + strip-final-newline@3.0.0: + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: ">=12" } + + strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } + + strnum@1.0.5: + resolution: + { + integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, + } + + supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + + supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } + + thread-stream@3.1.0: + resolution: + { + integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==, + } + + tiny-emitter@2.1.0: + resolution: + { + integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==, + } + + tiny-invariant@1.3.3: + resolution: + { + integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==, + } + + tinybench@2.9.0: + resolution: + { + integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, + } + + tinyexec@0.3.2: + resolution: + { + integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, + } + + tinyglobby@0.2.11: + resolution: + { + integrity: sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g==, + } + engines: { node: ">=12.0.0" } + + tinypool@1.0.2: + resolution: + { + integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + + tinyrainbow@2.0.0: + resolution: + { + integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, + } + engines: { node: ">=14.0.0" } + + tinyspy@3.0.2: + resolution: + { + integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==, + } + engines: { node: ">=14.0.0" } + + to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + + toidentifier@1.0.1: + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: ">=0.6" } + + tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + + ts-api-utils@2.0.1: + resolution: + { + integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==, + } + engines: { node: ">=18.12" } + peerDependencies: + typescript: ">=4.8.4" + + tsconfck@3.1.5: + resolution: + { + integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==, + } + engines: { node: ^18 || >=20 } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.8.1: + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } + + tsx@4.19.3: + resolution: + { + integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==, + } + engines: { node: ">=18.0.0" } + hasBin: true + + turndown@7.2.0: + resolution: + { + integrity: sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==, + } + + type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + + type-fest@2.19.0: + resolution: + { + integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, + } + engines: { node: ">=12.20" } + + type-fest@4.35.0: + resolution: + { + integrity: sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==, + } + engines: { node: ">=16" } + + typed-function@4.2.1: + resolution: + { + integrity: sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==, + } + engines: { node: ">= 18" } + + typescript-eslint@8.24.1: + resolution: + { + integrity: sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + + typescript@5.5.4: + resolution: + { + integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==, + } + engines: { node: ">=14.17" } + hasBin: true + + undici-types@5.26.5: + resolution: + { + integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + } + + unpipe@1.0.0: + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: ">= 0.8" } + + update-browserslist-db@1.1.2: + resolution: + { + integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==, + } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + + uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + + uuid@9.0.1: + resolution: + { + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, + } + hasBin: true + + vali-date@1.0.0: + resolution: + { + integrity: sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==, + } + engines: { node: ">=0.10.0" } + + vite-node@3.0.6: + resolution: + { + integrity: sha512-s51RzrTkXKJrhNbUzQRsarjmAae7VmMPAsRT7lppVpIg6mK3zGthP9Hgz0YQQKuNcF+Ii7DfYk3Fxz40jRmePw==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + + vite-tsconfig-paths@5.1.4: + resolution: + { + integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==, + } + peerDependencies: + vite: "*" + peerDependenciesMeta: + vite: + optional: true + + vite@6.1.1: + resolution: + { + integrity: sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + peerDependencies: + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.0.6: + resolution: + { + integrity: sha512-/iL1Sc5VeDZKPDe58oGK4HUFLhw6b5XdY1MYawjuSaDA4sEfYlY9HnS6aCEG26fX+MgUi7MwlduTBHHAI/OvMA==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + peerDependencies: + "@edge-runtime/vm": "*" + "@types/debug": ^4.1.12 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.0.6 + "@vitest/ui": 3.0.6 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/debug": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + web-streams-polyfill@4.0.0-beta.3: + resolution: + { + integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==, + } + engines: { node: ">= 14" } + + webidl-conversions@3.0.1: + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } + + whatwg-fetch@3.6.20: + resolution: + { + integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==, + } + + whatwg-url@5.0.0: + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } + + which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + + why-is-node-running@2.3.0: + resolution: + { + integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, + } + engines: { node: ">=8" } + hasBin: true + + wikipedia@2.1.2: + resolution: + { + integrity: sha512-RAYaMpXC9/E873RaSEtlEa8dXK4e0p5k98GKOd210MtkE5emm6fcnwD+N6ZA4cuffjDWagvhaQKtp/mGp2BOVQ==, + } + engines: { node: ">=10" } + + word-wrap@1.2.5: + resolution: + { + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, + } + engines: { node: ">=0.10.0" } + + wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } + + wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: ">=12" } + + wrap-ansi@9.0.0: + resolution: + { + integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==, + } + engines: { node: ">=18" } + + wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + y18n@5.0.8: + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } + + yaml@2.7.0: + resolution: + { + integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==, + } + engines: { node: ">= 14" } + hasBin: true + + yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } + + yargs@17.7.2: + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: ">=12" } + + yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + zod-to-json-schema@3.24.1: + resolution: + { + integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==, + } + peerDependencies: + zod: ^3.24.1 + + zod@3.24.2: + resolution: + { + integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==, + } + +snapshots: + "@ai-zen/node-fetch-event-source@2.1.4": + dependencies: + cross-fetch: 4.1.0 + transitivePeerDependencies: + - encoding + + "@apidevtools/json-schema-ref-parser@11.9.1": + dependencies: + "@jsdevtools/ono": 7.1.3 + "@types/json-schema": 7.0.15 + js-yaml: 4.1.0 + + "@babel/runtime@7.26.9": + dependencies: + regenerator-runtime: 0.14.1 + + "@esbuild/aix-ppc64@0.24.2": + optional: true + + "@esbuild/aix-ppc64@0.25.0": + optional: true + + "@esbuild/android-arm64@0.24.2": + optional: true + + "@esbuild/android-arm64@0.25.0": + optional: true + + "@esbuild/android-arm@0.24.2": + optional: true + + "@esbuild/android-arm@0.25.0": + optional: true + + "@esbuild/android-x64@0.24.2": + optional: true + + "@esbuild/android-x64@0.25.0": + optional: true + + "@esbuild/darwin-arm64@0.24.2": + optional: true + + "@esbuild/darwin-arm64@0.25.0": + optional: true + + "@esbuild/darwin-x64@0.24.2": + optional: true + + "@esbuild/darwin-x64@0.25.0": + optional: true + + "@esbuild/freebsd-arm64@0.24.2": + optional: true + + "@esbuild/freebsd-arm64@0.25.0": + optional: true + + "@esbuild/freebsd-x64@0.24.2": + optional: true + + "@esbuild/freebsd-x64@0.25.0": + optional: true + + "@esbuild/linux-arm64@0.24.2": + optional: true + + "@esbuild/linux-arm64@0.25.0": + optional: true + + "@esbuild/linux-arm@0.24.2": + optional: true + + "@esbuild/linux-arm@0.25.0": + optional: true + + "@esbuild/linux-ia32@0.24.2": + optional: true + + "@esbuild/linux-ia32@0.25.0": + optional: true + + "@esbuild/linux-loong64@0.24.2": + optional: true + + "@esbuild/linux-loong64@0.25.0": + optional: true + + "@esbuild/linux-mips64el@0.24.2": + optional: true + + "@esbuild/linux-mips64el@0.25.0": + optional: true + + "@esbuild/linux-ppc64@0.24.2": + optional: true + + "@esbuild/linux-ppc64@0.25.0": + optional: true + + "@esbuild/linux-riscv64@0.24.2": + optional: true + + "@esbuild/linux-riscv64@0.25.0": + optional: true + + "@esbuild/linux-s390x@0.24.2": + optional: true + + "@esbuild/linux-s390x@0.25.0": + optional: true + + "@esbuild/linux-x64@0.24.2": + optional: true + + "@esbuild/linux-x64@0.25.0": + optional: true + + "@esbuild/netbsd-arm64@0.24.2": + optional: true + + "@esbuild/netbsd-arm64@0.25.0": + optional: true + + "@esbuild/netbsd-x64@0.24.2": + optional: true + + "@esbuild/netbsd-x64@0.25.0": + optional: true + + "@esbuild/openbsd-arm64@0.24.2": + optional: true + + "@esbuild/openbsd-arm64@0.25.0": + optional: true + + "@esbuild/openbsd-x64@0.24.2": + optional: true + + "@esbuild/openbsd-x64@0.25.0": + optional: true + + "@esbuild/sunos-x64@0.24.2": + optional: true + + "@esbuild/sunos-x64@0.25.0": + optional: true + + "@esbuild/win32-arm64@0.24.2": + optional: true + + "@esbuild/win32-arm64@0.25.0": + optional: true + + "@esbuild/win32-ia32@0.24.2": + optional: true + + "@esbuild/win32-ia32@0.25.0": + optional: true + + "@esbuild/win32-x64@0.24.2": + optional: true + + "@esbuild/win32-x64@0.25.0": + optional: true + + "@eslint-community/eslint-utils@4.4.1(eslint@9.20.1)": + dependencies: + eslint: 9.20.1 + eslint-visitor-keys: 3.4.3 + + "@eslint-community/regexpp@4.12.1": {} + + "@eslint/config-array@0.19.2": + dependencies: + "@eslint/object-schema": 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + "@eslint/core@0.11.0": + dependencies: + "@types/json-schema": 7.0.15 + + "@eslint/eslintrc@3.2.0": + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + "@eslint/js@9.20.0": {} + + "@eslint/object-schema@2.1.6": {} + + "@eslint/plugin-kit@0.2.6": + dependencies: + "@eslint/core": 0.11.0 + levn: 0.4.1 + + "@google-cloud/vertexai@1.9.3": + dependencies: + google-auth-library: 9.15.1 + transitivePeerDependencies: + - encoding + - supports-color + + "@grpc/grpc-js@1.12.6": + dependencies: + "@grpc/proto-loader": 0.7.13 + "@js-sdsl/ordered-map": 4.4.2 + + "@grpc/proto-loader@0.7.13": + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.1 + protobufjs: 7.4.0 + yargs: 17.7.2 + + "@humanfs/core@0.19.1": {} + + "@humanfs/node@0.16.6": + dependencies: + "@humanfs/core": 0.19.1 + "@humanwhocodes/retry": 0.3.1 + + "@humanwhocodes/module-importer@1.0.1": {} + + "@humanwhocodes/retry@0.3.1": {} + + "@humanwhocodes/retry@0.4.2": {} + + "@ibm-generative-ai/node-sdk@3.2.4": + dependencies: + "@ai-zen/node-fetch-event-source": 2.1.4 + fetch-retry: 5.0.6 + http-status-codes: 2.3.0 + openapi-fetch: 0.8.2 + p-queue-compat: 1.0.225 + yaml: 2.7.0 + transitivePeerDependencies: + - encoding + + "@isaacs/cliui@8.0.2": + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + "@jridgewell/sourcemap-codec@1.5.0": {} + + "@js-sdsl/ordered-map@4.4.2": {} + + "@jsdevtools/ono@7.1.3": {} + + "@mixmark-io/domino@2.2.0": {} + + "@modelcontextprotocol/sdk@1.5.0": + dependencies: + content-type: 1.0.5 + eventsource: 3.0.5 + raw-body: 3.0.0 + zod: 3.24.2 + zod-to-json-schema: 3.24.1(zod@3.24.2) + + "@nodelib/fs.scandir@2.1.5": + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + "@nodelib/fs.stat@2.0.5": {} + + "@nodelib/fs.walk@1.2.8": + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.19.0 + + "@opentelemetry/api-logs@0.57.2": + dependencies: + "@opentelemetry/api": 1.9.0 + + "@opentelemetry/api@1.9.0": {} + + "@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + + "@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/semantic-conventions": 1.28.0 + + "@opentelemetry/exporter-logs-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@grpc/grpc-js": 1.12.6 + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-grpc-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-transformer": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-logs": 0.57.2(@opentelemetry/api@1.9.0) + + "@opentelemetry/exporter-logs-otlp-http@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/api-logs": 0.57.2 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-transformer": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-logs": 0.57.2(@opentelemetry/api@1.9.0) + + "@opentelemetry/exporter-logs-otlp-proto@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/api-logs": 0.57.2 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-transformer": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-logs": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-trace-base": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/exporter-metrics-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@grpc/grpc-js": 1.12.6 + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-metrics-otlp-http": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-grpc-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-transformer": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-metrics": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/exporter-metrics-otlp-http@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-transformer": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-metrics": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/exporter-metrics-otlp-proto@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-metrics-otlp-http": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-transformer": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-metrics": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/exporter-prometheus@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-metrics": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/exporter-trace-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@grpc/grpc-js": 1.12.6 + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-grpc-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-transformer": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-trace-base": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/exporter-trace-otlp-http@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-transformer": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-trace-base": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/exporter-trace-otlp-proto@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-transformer": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-trace-base": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/exporter-zipkin@1.30.1(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-trace-base": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/semantic-conventions": 1.28.0 + + "@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/api-logs": 0.57.2 + "@types/shimmer": 1.2.0 + import-in-the-middle: 1.13.0 + require-in-the-middle: 7.5.1 + semver: 7.7.1 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + "@opentelemetry/otlp-exporter-base@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-transformer": 0.57.2(@opentelemetry/api@1.9.0) + + "@opentelemetry/otlp-grpc-exporter-base@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@grpc/grpc-js": 1.12.6 + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-exporter-base": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/otlp-transformer": 0.57.2(@opentelemetry/api@1.9.0) + + "@opentelemetry/otlp-transformer@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/api-logs": 0.57.2 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-logs": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-metrics": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-trace-base": 1.30.1(@opentelemetry/api@1.9.0) + protobufjs: 7.4.0 + + "@opentelemetry/propagator-b3@1.30.1(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/propagator-jaeger@1.30.1(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/semantic-conventions": 1.28.0 + + "@opentelemetry/sdk-logs@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/api-logs": 0.57.2 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + + "@opentelemetry/sdk-node@0.57.2(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/api-logs": 0.57.2 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-logs-otlp-grpc": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-logs-otlp-http": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-logs-otlp-proto": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-metrics-otlp-grpc": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-metrics-otlp-http": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-metrics-otlp-proto": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-prometheus": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-trace-otlp-grpc": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-trace-otlp-http": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-trace-otlp-proto": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/exporter-zipkin": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/instrumentation": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-logs": 0.57.2(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-metrics": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-trace-base": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-trace-node": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/semantic-conventions": 1.28.0 + transitivePeerDependencies: + - supports-color + + "@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/resources": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/semantic-conventions": 1.28.0 + + "@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)": + dependencies: + "@opentelemetry/api": 1.9.0 + "@opentelemetry/context-async-hooks": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/core": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/propagator-b3": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/propagator-jaeger": 1.30.1(@opentelemetry/api@1.9.0) + "@opentelemetry/sdk-trace-base": 1.30.1(@opentelemetry/api@1.9.0) + semver: 7.7.1 + + "@opentelemetry/semantic-conventions@1.28.0": {} + + "@pkgjs/parseargs@0.11.0": + optional: true + + "@protobufjs/aspromise@1.1.2": {} + + "@protobufjs/base64@1.1.2": {} + + "@protobufjs/codegen@2.0.4": {} + + "@protobufjs/eventemitter@1.1.0": {} + + "@protobufjs/fetch@1.1.0": + dependencies: + "@protobufjs/aspromise": 1.1.2 + "@protobufjs/inquire": 1.1.0 + + "@protobufjs/float@1.0.2": {} + + "@protobufjs/inquire@1.1.0": {} + + "@protobufjs/path@1.1.2": {} + + "@protobufjs/pool@1.1.0": {} + + "@protobufjs/utf8@1.1.0": {} + + "@rollup/rollup-android-arm-eabi@4.34.8": + optional: true + + "@rollup/rollup-android-arm64@4.34.8": + optional: true + + "@rollup/rollup-darwin-arm64@4.34.8": + optional: true + + "@rollup/rollup-darwin-x64@4.34.8": + optional: true + + "@rollup/rollup-freebsd-arm64@4.34.8": + optional: true + + "@rollup/rollup-freebsd-x64@4.34.8": + optional: true + + "@rollup/rollup-linux-arm-gnueabihf@4.34.8": + optional: true + + "@rollup/rollup-linux-arm-musleabihf@4.34.8": + optional: true + + "@rollup/rollup-linux-arm64-gnu@4.34.8": + optional: true + + "@rollup/rollup-linux-arm64-musl@4.34.8": + optional: true + + "@rollup/rollup-linux-loongarch64-gnu@4.34.8": + optional: true + + "@rollup/rollup-linux-powerpc64le-gnu@4.34.8": + optional: true + + "@rollup/rollup-linux-riscv64-gnu@4.34.8": + optional: true + + "@rollup/rollup-linux-s390x-gnu@4.34.8": + optional: true + + "@rollup/rollup-linux-x64-gnu@4.34.8": + optional: true + + "@rollup/rollup-linux-x64-musl@4.34.8": + optional: true + + "@rollup/rollup-win32-arm64-msvc@4.34.8": + optional: true + + "@rollup/rollup-win32-ia32-msvc@4.34.8": + optional: true + + "@rollup/rollup-win32-x64-msvc@4.34.8": + optional: true + + "@sindresorhus/is@4.6.0": {} + + "@streamparser/json@0.0.21": {} + + "@types/blessed@0.1.25": + dependencies: + "@types/node": 18.19.76 + + "@types/eslint-config-prettier@6.11.3": {} + + "@types/eslint@9.6.1": + dependencies: + "@types/estree": 1.0.6 + "@types/json-schema": 7.0.15 + + "@types/eslint__js@8.42.3": + dependencies: + "@types/eslint": 9.6.1 + + "@types/estree@1.0.6": {} + + "@types/json-schema@7.0.15": {} + + "@types/lodash-es@4.17.12": + dependencies: + "@types/lodash": 4.17.15 + + "@types/lodash@4.17.15": {} + + "@types/node-fetch@2.6.12": + dependencies: + "@types/node": 18.19.76 + form-data: 4.0.2 + + "@types/node@18.19.76": + dependencies: + undici-types: 5.26.5 + + "@types/shimmer@1.2.0": {} + + "@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1)(typescript@5.5.4))(eslint@9.20.1)(typescript@5.5.4)": + dependencies: + "@eslint-community/regexpp": 4.12.1 + "@typescript-eslint/parser": 8.24.1(eslint@9.20.1)(typescript@5.5.4) + "@typescript-eslint/scope-manager": 8.24.1 + "@typescript-eslint/type-utils": 8.24.1(eslint@9.20.1)(typescript@5.5.4) + "@typescript-eslint/utils": 8.24.1(eslint@9.20.1)(typescript@5.5.4) + "@typescript-eslint/visitor-keys": 8.24.1 + eslint: 9.20.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.1(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/parser@8.24.1(eslint@9.20.1)(typescript@5.5.4)": + dependencies: + "@typescript-eslint/scope-manager": 8.24.1 + "@typescript-eslint/types": 8.24.1 + "@typescript-eslint/typescript-estree": 8.24.1(typescript@5.5.4) + "@typescript-eslint/visitor-keys": 8.24.1 + debug: 4.4.0 + eslint: 9.20.1 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/scope-manager@8.24.1": + dependencies: + "@typescript-eslint/types": 8.24.1 + "@typescript-eslint/visitor-keys": 8.24.1 + + "@typescript-eslint/type-utils@8.24.1(eslint@9.20.1)(typescript@5.5.4)": + dependencies: + "@typescript-eslint/typescript-estree": 8.24.1(typescript@5.5.4) + "@typescript-eslint/utils": 8.24.1(eslint@9.20.1)(typescript@5.5.4) + debug: 4.4.0 + eslint: 9.20.1 + ts-api-utils: 2.0.1(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/types@8.24.1": {} + + "@typescript-eslint/typescript-estree@8.24.1(typescript@5.5.4)": + dependencies: + "@typescript-eslint/types": 8.24.1 + "@typescript-eslint/visitor-keys": 8.24.1 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/utils@8.24.1(eslint@9.20.1)(typescript@5.5.4)": + dependencies: + "@eslint-community/eslint-utils": 4.4.1(eslint@9.20.1) + "@typescript-eslint/scope-manager": 8.24.1 + "@typescript-eslint/types": 8.24.1 + "@typescript-eslint/typescript-estree": 8.24.1(typescript@5.5.4) + eslint: 9.20.1 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/visitor-keys@8.24.1": + dependencies: + "@typescript-eslint/types": 8.24.1 + eslint-visitor-keys: 4.2.0 + + "@vitest/expect@3.0.6": + dependencies: + "@vitest/spy": 3.0.6 + "@vitest/utils": 3.0.6 + chai: 5.2.0 + tinyrainbow: 2.0.0 + + "@vitest/mocker@3.0.6(vite@6.1.1(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0))": + dependencies: + "@vitest/spy": 3.0.6 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.1.1(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0) + + "@vitest/pretty-format@3.0.6": + dependencies: + tinyrainbow: 2.0.0 + + "@vitest/runner@3.0.6": + dependencies: + "@vitest/utils": 3.0.6 + pathe: 2.0.3 + + "@vitest/snapshot@3.0.6": + dependencies: + "@vitest/pretty-format": 3.0.6 + magic-string: 0.30.17 + pathe: 2.0.3 + + "@vitest/spy@3.0.6": + dependencies: + tinyspy: 3.0.2 + + "@vitest/utils@3.0.6": + dependencies: + "@vitest/pretty-format": 3.0.6 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-import-attributes@1.9.5(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + adm-zip@0.5.16: {} + + agent-base@7.1.3: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + argparse@2.0.1: {} + + assertion-error@2.0.1: {} + + asynckit@0.4.0: {} + + atomic-sleep@1.0.0: {} + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bee-agent-framework@0.0.61(@google-cloud/vertexai@1.9.3)(@grpc/grpc-js@1.12.6)(@grpc/proto-loader@0.7.13)(@modelcontextprotocol/sdk@1.5.0)(google-auth-library@9.15.1)(groq-sdk@0.7.0)(ollama@0.5.13)(openai-chat-tokens@0.2.8)(openai@4.85.2(zod@3.24.2))(yaml@2.7.0): + dependencies: + "@ai-zen/node-fetch-event-source": 2.1.4 + "@opentelemetry/api": 1.9.0 + "@streamparser/json": 0.0.21 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + duck-duck-scrape: 2.2.7 + fast-xml-parser: 4.5.2 + header-generator: 2.1.62 + joplin-turndown-plugin-gfm: 1.0.12 + js-yaml: 4.1.0 + json-schema-to-typescript: 15.0.4 + jsonrepair: 3.12.0 + mathjs: 14.2.1 + mustache: 4.2.0 + object-hash: 3.0.0 + p-queue-compat: 1.0.229 + p-throttle: 7.0.0 + pino: 9.6.0 + promise-based-task: 3.1.1 + remeda: 2.20.2 + serialize-error: 11.0.3 + string-comparison: 1.3.0 + string-strip-html: 13.4.8 + turndown: 7.2.0 + wikipedia: 2.1.2 + zod: 3.24.2 + zod-to-json-schema: 3.24.1(zod@3.24.2) + optionalDependencies: + "@google-cloud/vertexai": 1.9.3 + "@grpc/grpc-js": 1.12.6 + "@grpc/proto-loader": 0.7.13 + "@modelcontextprotocol/sdk": 1.5.0 + google-auth-library: 9.15.1 + groq-sdk: 0.7.0 + ollama: 0.5.13 + openai: 4.85.2(zod@3.24.2) + openai-chat-tokens: 0.2.8 + yaml: 2.7.0 + transitivePeerDependencies: + - debug + - encoding + + bee-observe-connector@0.0.6(bee-agent-framework@0.0.61(@google-cloud/vertexai@1.9.3)(@grpc/grpc-js@1.12.6)(@grpc/proto-loader@0.7.13)(@modelcontextprotocol/sdk@1.5.0)(google-auth-library@9.15.1)(groq-sdk@0.7.0)(ollama@0.5.13)(openai-chat-tokens@0.2.8)(openai@4.85.2(zod@3.24.2))(yaml@2.7.0)): + dependencies: + bee-agent-framework: 0.0.61(@google-cloud/vertexai@1.9.3)(@grpc/grpc-js@1.12.6)(@grpc/proto-loader@0.7.13)(@modelcontextprotocol/sdk@1.5.0)(google-auth-library@9.15.1)(groq-sdk@0.7.0)(ollama@0.5.13)(openai-chat-tokens@0.2.8)(openai@4.85.2(zod@3.24.2))(yaml@2.7.0) + openapi-fetch: 0.11.3 + remeda: 2.20.2 + + bignumber.js@9.1.2: {} + + blessed@0.1.81: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001700 + electron-to-chromium: 1.5.102 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + buffer-equal-constant-time@1.0.1: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + camelcase@4.1.0: {} + + caniuse-lite@1.0.30001700: {} + + chai@5.2.0: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + check-error@2.1.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + cjs-module-lexer@1.4.3: {} + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + codsen-utils@1.6.4: + dependencies: + rfdc: 1.4.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@13.1.0: {} + + complex.js@2.4.2: {} + + concat-map@0.0.1: {} + + content-type@1.0.5: {} + + cross-fetch@4.1.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + dateformat@4.6.3: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decimal.js@10.5.0: {} + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + + dotenv@16.4.7: {} + + duck-duck-scrape@2.2.7: + dependencies: + html-entities: 2.5.2 + needle: 3.3.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + electron-to-chromium@1.5.102: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + environment@1.1.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.6.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.24.2: + optionalDependencies: + "@esbuild/aix-ppc64": 0.24.2 + "@esbuild/android-arm": 0.24.2 + "@esbuild/android-arm64": 0.24.2 + "@esbuild/android-x64": 0.24.2 + "@esbuild/darwin-arm64": 0.24.2 + "@esbuild/darwin-x64": 0.24.2 + "@esbuild/freebsd-arm64": 0.24.2 + "@esbuild/freebsd-x64": 0.24.2 + "@esbuild/linux-arm": 0.24.2 + "@esbuild/linux-arm64": 0.24.2 + "@esbuild/linux-ia32": 0.24.2 + "@esbuild/linux-loong64": 0.24.2 + "@esbuild/linux-mips64el": 0.24.2 + "@esbuild/linux-ppc64": 0.24.2 + "@esbuild/linux-riscv64": 0.24.2 + "@esbuild/linux-s390x": 0.24.2 + "@esbuild/linux-x64": 0.24.2 + "@esbuild/netbsd-arm64": 0.24.2 + "@esbuild/netbsd-x64": 0.24.2 + "@esbuild/openbsd-arm64": 0.24.2 + "@esbuild/openbsd-x64": 0.24.2 + "@esbuild/sunos-x64": 0.24.2 + "@esbuild/win32-arm64": 0.24.2 + "@esbuild/win32-ia32": 0.24.2 + "@esbuild/win32-x64": 0.24.2 + + esbuild@0.25.0: + optionalDependencies: + "@esbuild/aix-ppc64": 0.25.0 + "@esbuild/android-arm": 0.25.0 + "@esbuild/android-arm64": 0.25.0 + "@esbuild/android-x64": 0.25.0 + "@esbuild/darwin-arm64": 0.25.0 + "@esbuild/darwin-x64": 0.25.0 + "@esbuild/freebsd-arm64": 0.25.0 + "@esbuild/freebsd-x64": 0.25.0 + "@esbuild/linux-arm": 0.25.0 + "@esbuild/linux-arm64": 0.25.0 + "@esbuild/linux-ia32": 0.25.0 + "@esbuild/linux-loong64": 0.25.0 + "@esbuild/linux-mips64el": 0.25.0 + "@esbuild/linux-ppc64": 0.25.0 + "@esbuild/linux-riscv64": 0.25.0 + "@esbuild/linux-s390x": 0.25.0 + "@esbuild/linux-x64": 0.25.0 + "@esbuild/netbsd-arm64": 0.25.0 + "@esbuild/netbsd-x64": 0.25.0 + "@esbuild/openbsd-arm64": 0.25.0 + "@esbuild/openbsd-x64": 0.25.0 + "@esbuild/sunos-x64": 0.25.0 + "@esbuild/win32-arm64": 0.25.0 + "@esbuild/win32-ia32": 0.25.0 + "@esbuild/win32-x64": 0.25.0 + + escalade@3.2.0: {} + + escape-latex@1.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.0(eslint@9.20.1): + dependencies: + eslint: 9.20.1 + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.20.1: + dependencies: + "@eslint-community/eslint-utils": 4.4.1(eslint@9.20.1) + "@eslint-community/regexpp": 4.12.1 + "@eslint/config-array": 0.19.2 + "@eslint/core": 0.11.0 + "@eslint/eslintrc": 3.2.0 + "@eslint/js": 9.20.0 + "@eslint/plugin-kit": 0.2.6 + "@humanfs/node": 0.16.6 + "@humanwhocodes/module-importer": 1.0.1 + "@humanwhocodes/retry": 0.4.2 + "@types/estree": 1.0.6 + "@types/json-schema": 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + "@types/estree": 1.0.6 + + esutils@2.0.3: {} + + event-target-shim@5.0.1: {} + + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + eventsource-parser@3.0.0: {} + + eventsource@3.0.5: + dependencies: + eventsource-parser: 3.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + expect-type@1.1.0: {} + + extend@3.0.2: {} + + fast-copy@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@3.0.6: {} + + fast-xml-parser@4.5.2: + dependencies: + strnum: 1.0.5 + + fastq@1.19.0: + dependencies: + reusify: 1.0.4 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fetch-retry@5.0.6: {} + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + follow-redirects@1.15.9: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data-encoder@1.7.2: {} + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + + fraction.js@5.2.1: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gaxios@6.7.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + is-stream: 2.0.1 + node-fetch: 2.7.0 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + gcp-metadata@6.1.1: + dependencies: + gaxios: 6.7.1 + google-logging-utils: 0.0.2 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + generative-bayesian-network@2.1.62: + dependencies: + adm-zip: 0.5.16 + tslib: 2.8.1 + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.3.0: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@8.0.1: {} + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@14.0.0: {} + + globrex@0.1.2: {} + + google-auth-library@9.15.1: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.7.1 + gcp-metadata: 6.1.1 + gtoken: 7.1.0 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + google-logging-utils@0.0.2: {} + + gopd@1.2.0: {} + + graphemer@1.4.0: {} + + groq-sdk@0.7.0: + dependencies: + "@types/node": 18.19.76 + "@types/node-fetch": 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + gtoken@7.1.0: + dependencies: + gaxios: 6.7.1 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + header-generator@2.1.62: + dependencies: + browserslist: 4.24.4 + generative-bayesian-network: 2.1.62 + ow: 0.28.2 + tslib: 2.8.1 + + help-me@5.0.0: {} + + html-entities@2.5.2: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-status-codes@2.3.0: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + human-signals@5.0.0: {} + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + husky@9.1.7: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-in-the-middle@1.13.0: + dependencies: + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.3 + + imurmurhash@0.1.4: {} + + infobox-parser@3.6.4: + dependencies: + camelcase: 4.1.0 + + inherits@2.0.4: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.3.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + "@isaacs/cliui": 8.0.2 + optionalDependencies: + "@pkgjs/parseargs": 0.11.0 + + javascript-natural-sort@0.7.1: {} + + joplin-turndown-plugin-gfm@1.0.12: {} + + joycon@3.1.1: {} + + js-tiktoken@1.0.19: + dependencies: + base64-js: 1.5.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.1.2 + + json-buffer@3.0.1: {} + + json-schema-to-typescript@15.0.4: + dependencies: + "@apidevtools/json-schema-ref-parser": 11.9.1 + "@types/json-schema": 7.0.15 + "@types/lodash": 4.17.15 + is-glob: 4.0.3 + js-yaml: 4.1.0 + lodash: 4.17.21 + minimist: 1.2.8 + prettier: 3.5.1 + tinyglobby: 0.2.11 + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsonrepair@3.12.0: {} + + jwa@2.0.0: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.0: + dependencies: + jwa: 2.0.0 + safe-buffer: 5.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lint-staged@15.4.3: + dependencies: + chalk: 5.4.1 + commander: 13.1.0 + debug: 4.4.0 + execa: 8.0.1 + lilconfig: 3.1.3 + listr2: 8.2.5 + micromatch: 4.0.8 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.7.0 + transitivePeerDependencies: + - supports-color + + listr2@8.2.5: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.17.21: {} + + lodash.camelcase@4.3.0: {} + + lodash.isequal@4.5.0: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + long@5.3.1: {} + + loupe@3.1.3: {} + + lru-cache@10.4.3: {} + + magic-string@0.30.17: + dependencies: + "@jridgewell/sourcemap-codec": 1.5.0 + + math-intrinsics@1.1.0: {} + + mathjs@14.2.1: + dependencies: + "@babel/runtime": 7.26.9 + complex.js: 2.4.2 + decimal.js: 10.5.0 + escape-latex: 1.2.0 + fraction.js: 5.2.1 + javascript-natural-sort: 0.7.1 + seedrandom: 3.0.5 + tiny-emitter: 2.1.0 + typed-function: 4.2.1 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + module-details-from-path@1.0.3: {} + + ms@2.1.3: {} + + mustache@4.2.0: {} + + nanoid@3.3.8: {} + + natural-compare@1.4.0: {} + + needle@3.3.1: + dependencies: + iconv-lite: 0.6.3 + sax: 1.4.1 + + node-domexception@1.0.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-releases@2.0.19: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-hash@3.0.0: {} + + ollama@0.5.13: + dependencies: + whatwg-fetch: 3.6.20 + + on-exit-leak-free@2.1.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + openai-chat-tokens@0.2.8: + dependencies: + js-tiktoken: 1.0.19 + + openai@4.85.2(zod@3.24.2): + dependencies: + "@types/node": 18.19.76 + "@types/node-fetch": 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + zod: 3.24.2 + transitivePeerDependencies: + - encoding + + openapi-fetch@0.11.3: + dependencies: + openapi-typescript-helpers: 0.0.13 + + openapi-fetch@0.8.2: + dependencies: + openapi-typescript-helpers: 0.0.5 + + openapi-typescript-helpers@0.0.13: {} + + openapi-typescript-helpers@0.0.5: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ow@0.28.2: + dependencies: + "@sindresorhus/is": 4.6.0 + callsites: 3.1.0 + dot-prop: 6.0.1 + lodash.isequal: 4.5.0 + vali-date: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-queue-compat@1.0.225: + dependencies: + eventemitter3: 5.0.1 + p-timeout-compat: 1.0.6 + + p-queue-compat@1.0.229: + dependencies: + eventemitter3: 5.0.1 + p-timeout-compat: 1.0.6 + + p-throttle@7.0.0: {} + + p-timeout-compat@1.0.6: {} + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + pathe@2.0.3: {} + + pathval@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pidtree@0.6.0: {} + + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-pretty@11.3.0: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pump: 3.0.2 + readable-stream: 4.7.0 + secure-json-parse: 2.7.0 + sonic-boom: 4.2.0 + strip-json-comments: 3.1.1 + + pino-std-serializers@7.0.0: {} + + pino@9.6.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 4.0.1 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + + postcss@8.5.3: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@3.5.1: {} + + process-warning@4.0.1: {} + + process@0.11.10: {} + + promise-based-task@3.1.1: {} + + protobufjs@7.4.0: + dependencies: + "@protobufjs/aspromise": 1.1.2 + "@protobufjs/base64": 1.1.2 + "@protobufjs/codegen": 2.0.4 + "@protobufjs/eventemitter": 1.1.0 + "@protobufjs/fetch": 1.1.0 + "@protobufjs/float": 1.0.2 + "@protobufjs/inquire": 1.1.0 + "@protobufjs/path": 1.1.2 + "@protobufjs/pool": 1.1.0 + "@protobufjs/utf8": 1.1.0 + "@types/node": 18.19.76 + long: 5.3.1 + + proxy-from-env@1.1.0: {} + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + ranges-apply@7.0.16: + dependencies: + ranges-merge: 9.0.15 + tiny-invariant: 1.3.3 + + ranges-merge@9.0.15: + dependencies: + ranges-push: 7.0.15 + ranges-sort: 6.0.11 + + ranges-push@7.0.15: + dependencies: + codsen-utils: 1.6.4 + ranges-sort: 6.0.11 + string-collapse-leading-whitespace: 7.0.7 + string-trim-spaces-only: 5.0.10 + + ranges-sort@6.0.11: {} + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdirp@4.1.2: {} + + real-require@0.2.0: {} + + regenerator-runtime@0.14.1: {} + + remeda@2.20.2: + dependencies: + type-fest: 4.35.0 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-in-the-middle@7.5.1: + dependencies: + debug: 4.4.0 + module-details-from-path: 1.0.3 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + + rollup@4.34.8: + dependencies: + "@types/estree": 1.0.6 + optionalDependencies: + "@rollup/rollup-android-arm-eabi": 4.34.8 + "@rollup/rollup-android-arm64": 4.34.8 + "@rollup/rollup-darwin-arm64": 4.34.8 + "@rollup/rollup-darwin-x64": 4.34.8 + "@rollup/rollup-freebsd-arm64": 4.34.8 + "@rollup/rollup-freebsd-x64": 4.34.8 + "@rollup/rollup-linux-arm-gnueabihf": 4.34.8 + "@rollup/rollup-linux-arm-musleabihf": 4.34.8 + "@rollup/rollup-linux-arm64-gnu": 4.34.8 + "@rollup/rollup-linux-arm64-musl": 4.34.8 + "@rollup/rollup-linux-loongarch64-gnu": 4.34.8 + "@rollup/rollup-linux-powerpc64le-gnu": 4.34.8 + "@rollup/rollup-linux-riscv64-gnu": 4.34.8 + "@rollup/rollup-linux-s390x-gnu": 4.34.8 + "@rollup/rollup-linux-x64-gnu": 4.34.8 + "@rollup/rollup-linux-x64-musl": 4.34.8 + "@rollup/rollup-win32-arm64-msvc": 4.34.8 + "@rollup/rollup-win32-ia32-msvc": 4.34.8 + "@rollup/rollup-win32-x64-msvc": 4.34.8 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + secure-json-parse@2.7.0: {} + + seedrandom@3.0.5: {} + + semver@7.7.1: {} + + serialize-error@11.0.3: + dependencies: + type-fest: 2.19.0 + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shimmer@1.2.1: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.2.1: {} + + split2@4.2.0: {} + + stackback@0.0.2: {} + + statuses@2.0.1: {} + + std-env@3.8.0: {} + + string-argv@0.3.2: {} + + string-collapse-leading-whitespace@7.0.7: {} + + string-comparison@1.3.0: {} + + string-left-right@6.0.17: + dependencies: + codsen-utils: 1.6.4 + rfdc: 1.4.1 + + string-strip-html@13.4.8: + dependencies: + "@types/lodash-es": 4.17.12 + codsen-utils: 1.6.4 + html-entities: 2.5.2 + lodash-es: 4.17.21 + ranges-apply: 7.0.16 + ranges-push: 7.0.15 + string-left-right: 6.0.17 + + string-trim-spaces-only@5.0.10: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strnum@1.0.5: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + tiny-emitter@2.1.0: {} + + tiny-invariant@1.3.3: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.11: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + tinypool@1.0.2: {} + + tinyrainbow@2.0.0: {} + + tinyspy@3.0.2: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + ts-api-utils@2.0.1(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + tsconfck@3.1.5(typescript@5.5.4): + optionalDependencies: + typescript: 5.5.4 + + tslib@2.8.1: {} + + tsx@4.19.3: + dependencies: + esbuild: 0.25.0 + get-tsconfig: 4.10.0 + optionalDependencies: + fsevents: 2.3.3 + + turndown@7.2.0: + dependencies: + "@mixmark-io/domino": 2.2.0 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@2.19.0: {} + + type-fest@4.35.0: {} + + typed-function@4.2.1: {} + + typescript-eslint@8.24.1(eslint@9.20.1)(typescript@5.5.4): + dependencies: + "@typescript-eslint/eslint-plugin": 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.20.1)(typescript@5.5.4))(eslint@9.20.1)(typescript@5.5.4) + "@typescript-eslint/parser": 8.24.1(eslint@9.20.1)(typescript@5.5.4) + "@typescript-eslint/utils": 8.24.1(eslint@9.20.1)(typescript@5.5.4) + eslint: 9.20.1 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + typescript@5.5.4: {} + + undici-types@5.26.5: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + uuid@9.0.1: {} + + vali-date@1.0.0: {} + + vite-node@3.0.6(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.3 + vite: 6.1.1(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0) + transitivePeerDependencies: + - "@types/node" + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite-tsconfig-paths@5.1.4(typescript@5.5.4)(vite@6.1.1(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0)): + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.5.4) + optionalDependencies: + vite: 6.1.1(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0) + transitivePeerDependencies: + - supports-color + - typescript + + vite@6.1.1(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0): + dependencies: + esbuild: 0.24.2 + postcss: 8.5.3 + rollup: 4.34.8 + optionalDependencies: + "@types/node": 18.19.76 + fsevents: 2.3.3 + tsx: 4.19.3 + yaml: 2.7.0 + + vitest@3.0.6(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0): + dependencies: + "@vitest/expect": 3.0.6 + "@vitest/mocker": 3.0.6(vite@6.1.1(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0)) + "@vitest/pretty-format": 3.0.6 + "@vitest/runner": 3.0.6 + "@vitest/snapshot": 3.0.6 + "@vitest/spy": 3.0.6 + "@vitest/utils": 3.0.6 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.1.1(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0) + vite-node: 3.0.6(@types/node@18.19.76)(tsx@4.19.3)(yaml@2.7.0) + why-is-node-running: 2.3.0 + optionalDependencies: + "@types/node": 18.19.76 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + web-streams-polyfill@4.0.0-beta.3: {} + + webidl-conversions@3.0.1: {} + + whatwg-fetch@3.6.20: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wikipedia@2.1.2: + dependencies: + axios: 1.7.9 + infobox-parser: 3.6.4 + transitivePeerDependencies: + - debug + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yaml@2.7.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + zod-to-json-schema@3.24.1(zod@3.24.2): + dependencies: + zod: 3.24.2 + + zod@3.24.2: {} diff --git a/src/access-control/dto.ts b/src/access-control/dto.ts new file mode 100644 index 0000000..c2641a6 --- /dev/null +++ b/src/access-control/dto.ts @@ -0,0 +1,4 @@ +import { z } from "zod"; + +export const PermissionSchema = z.enum(["read", "write", "execute"]); +export type Permission = z.infer; diff --git a/src/access-control/resources-access-control.ts b/src/access-control/resources-access-control.ts new file mode 100644 index 0000000..f7dcbe0 --- /dev/null +++ b/src/access-control/resources-access-control.ts @@ -0,0 +1,201 @@ +import { clone, difference } from "remeda"; +import { Permission } from "./dto.js"; +import { Logger } from "bee-agent-framework"; + +export type UserId = string; +export type ResourceId = string; + +export interface ResourcePermissions { + userPermissions: Map; + ownerId: UserId; +} +export interface ResourcesPermissionRegistry { + resources: Map; + admins: Set; +} + +export const ADMIN_USER = "@admin"; +export const REGISTRY_RESOURCE = "@registry"; +export const RESERVED_IDS = [ADMIN_USER, REGISTRY_RESOURCE]; + +export const FULL_ACCESS: Permission[] = ["read", "write", "execute"] as const; +export const READ_ONLY_ACCESS: Permission[] = ["read"] as const; +export const WRITE_ONLY_ACCESS: Permission[] = ["write"] as const; +export const READ_WRITE_ACCESS: Permission[] = ["read", "write"] as const; +export const READ_EXECUTE_ACCESS: Permission[] = ["read", "execute"] as const; + +export class PermissionError extends Error { + constructor( + public userId: string, + public requiredPermission: Permission, + public resourceOwnerId: string, + ) { + super( + `User ${userId} does not have ${requiredPermission} permission for resource owned by ${resourceOwnerId}`, + ); + this.name = "PermissionError"; + } +} + +export class ResourcesAccessControl { + private readonly logger: Logger; + private registry: ResourcesPermissionRegistry = { + admins: new Set(), + resources: new Map([[REGISTRY_RESOURCE, { ownerId: ADMIN_USER, userPermissions: new Map() }]]), + }; + + constructor(entityName: string, admins: UserId[] = []) { + this.logger = Logger.root.child({ name: `${entityName}AccessControl` }); + admins.forEach((adminId) => this.registry.admins.add(adminId)); + } + + private checkReservedConstants(...requestedIds: (UserId | ResourceId)[]) { + RESERVED_IDS.forEach((id) => { + requestedIds.forEach((requestedId) => { + if (requestedId === id) { + throw new Error(`${requestedId} is reserved for system purpose please chose another`); + } + }); + }); + } + + public getResourcePermissionsByAdmin(resourceId: ResourceId, actingUserId: UserId) { + this.checkPermission(REGISTRY_RESOURCE, actingUserId, ["read"]); + return clone(this.getResourcePermissions(resourceId)); + } + + private getResourcePermissions(resourceId: ResourceId, throwError = true) { + const resourcePermissions = this.registry.resources.get(resourceId); + if (!resourcePermissions && throwError) { + throw new Error(`Resource permissions for resourceId:${resourceId} was not found`); + } + return resourcePermissions; + } + + private destroyResourcePermissions(resourceId: ResourceId, throwError = true) { + this.logger.info({ resourceId }, `destroyResourcePermissions`); + const resourcePermissions = this.registry.resources.has(resourceId); + if (!resourcePermissions && throwError) { + throw new Error( + `Resource permissions for resourceId:${resourceId} was not found for destruction`, + ); + } + this.registry.resources.delete(resourceId); + } + + private isAdmin(userId: UserId) { + return this.registry.admins.has(userId); + } + + createPermissions( + resourceId: ResourceId, + userId: UserId, + permissions: Permission[], + actingUserId: UserId, + ) { + this.logger.info({ resourceId, userId, permissions, actingUserId }, `createPermissions`); + this.checkReservedConstants(resourceId, userId); + this.checkPermission(resourceId, actingUserId, ["write"]); + + const resourcePermissions = this.getResourcePermissions(resourceId)!; + resourcePermissions.userPermissions.set(userId, clone(permissions)); + } + + removePermissions( + resourceId: ResourceId, + userId: UserId, + actingUserId: UserId, + permissions?: Permission[], + ) { + this.logger.info({ resourceId, userId, permissions, actingUserId }, `removePermissions`); + this.checkPermission(resourceId, actingUserId, WRITE_ONLY_ACCESS); + + const resourcePermissions = this.getResourcePermissions(resourceId)!; + const userPermissions = resourcePermissions.userPermissions.get(userId); + if (!userPermissions) { + throw new Error(`User permissions for userId:${userId} was not found`); + } + + if (permissions == null) { + resourcePermissions.userPermissions.delete(userId); + } else { + const newPermissions = difference(permissions, userPermissions); + if (!newPermissions.length) { + resourcePermissions.userPermissions.delete(userId); + } else { + resourcePermissions.userPermissions.set(userId, clone(permissions)); + } + } + } + + createResource( + resourceId: ResourceId, + ownerId: UserId, + actingUserId: UserId, + parentResourceId?: ResourceId, + ) { + this.logger.info({ resourceId, ownerId, actingUserId, parentResourceId }, `createResource`); + this.checkReservedConstants(resourceId, ownerId); + if (parentResourceId) { + this.checkPermission(parentResourceId, actingUserId, WRITE_ONLY_ACCESS, false); + } + + let resourcePermissions = this.getResourcePermissions(resourceId, false); + if (resourcePermissions) { + throw new Error(`Resource permissions for resourceId: ${resourceId} already exist`); + } + resourcePermissions = { ownerId, userPermissions: new Map() } satisfies ResourcePermissions; + this.registry.resources.set(resourceId, resourcePermissions); + } + + removeResource(resourceId: ResourceId, actingUserId: UserId) { + this.logger.info({ resourceId, actingUserId }, `removeResource`); + this.checkPermission(resourceId, actingUserId, WRITE_ONLY_ACCESS, false); + this.destroyResourcePermissions(resourceId); + } + + checkPermission( + resourceId: ResourceId, + userId: UserId, + requestedPermissions: Permission[], + throwError = true, + ) { + const resourcePermissions = this.getResourcePermissions(resourceId, throwError)!; + + if (this.isAdmin(userId)) { + // He is an admin + return; + } + + if (resourcePermissions.ownerId === userId) { + // He is an owner + return; + } + + requestedPermissions.forEach((permission) => { + const userResourcePermissions = resourcePermissions.userPermissions.get(userId); + if (!userResourcePermissions || !userResourcePermissions.includes(permission)) { + throw new PermissionError(userId, permission, resourcePermissions.ownerId); + } + }); + } + + /** + * Safe version that returns boolean instead of throwing + */ + hasPermission( + resourceId: ResourceId, + userId: UserId, + requestedPermissions: Permission[], + ): boolean { + try { + this.checkPermission(resourceId, userId, requestedPermissions); + return true; + } catch (error) { + if (error instanceof PermissionError) { + return false; + } + throw error; + } + } +} diff --git a/src/agent.ts b/src/agent.ts deleted file mode 100644 index 31ce7e1..0000000 --- a/src/agent.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { BeeAgent } from "bee-agent-framework/agents/bee/agent"; -import { FrameworkError } from "bee-agent-framework/errors"; -import "dotenv/config.js"; - -import { createAgent } from "./agents/agent-factory.js"; -import { AgentKindSchema, AgentRegistry } from "./agents/agent-registry.js"; -import * as operator from "./agents/operator.js"; -import * as supervisor from "./agents/supervisor.js"; -import { createConsoleReader } from "./helpers/reader.js"; -import { TaskManager } from "./tasks/task-manager.js"; - -const registry = new AgentRegistry({ - async onCreate( - config, - poolStats, - toolsFactory, - ): Promise<{ agentId: string; instance: BeeAgent }> { - const { kind: agentKind, type: agentType, instructions, description } = config; - const num = poolStats.created + 1; - const agentId = `${agentKind}:${agentType}[${num}]`; - const tools = config.tools == null ? toolsFactory.getAvailableToolsNames() : config.tools; - const instance = createAgent( - { - agentKind, - agentType, - agentId, - description, - instructions, - tools, - }, - toolsFactory, - ); - - return { agentId, instance }; - }, - async onDestroy(instance) { - instance.destroy(); - }, -}); - -const taskManager = new TaskManager( - async (task, taskManager, { onAgentCreate, onAgentComplete, onAgentError }) => { - const agent = await registry.acquireAgent(task.agentKind, task.agentType); - onAgentCreate(task.id, agent.agentId, taskManager); - const { instance } = agent; - const prompt = task.input; - instance - .run( - { prompt }, - { - execution: { - maxIterations: 8, - maxRetriesPerStep: 2, - totalMaxRetries: 10, - }, - }, - ) - .observe((emitter) => { - emitter.on("update", (data, meta) => { - reader.write( - `${(meta.creator as any).input.meta.name} 🤖 (${data.update.key}) :`, - data.update.value, - ); - }); - emitter.on("error", (data, meta) => { - reader.write( - `${(meta.creator as any).input.meta.name} 🤖 (${data.error.name}) :`, - data.error.message, - ); - }); - }) - .then((resp) => onAgentComplete(resp.result.text, task.id, agent.agentId, taskManager)) - .catch((err) => onAgentError(err, task.id, agent.agentId, taskManager)) - .finally(async () => { - await registry.releaseAgent(agent.agentId); - }); - }, -); - -registry.registerToolsFactories([ - ["supervisor", new supervisor.ToolsFactory(registry, taskManager)], - ["operator", new operator.ToolsFactory()], -]); - -registry.registerAgentType({ - autoPopulatePool: false, - kind: AgentKindSchema.Enum.supervisor, - type: supervisor.AgentTypes.BOSS, - instructions: "", - description: "The boss supervisor agent that control whole app.", - maxPoolSize: 1, -}); - -const { instance: supervisorAgent } = await registry.acquireAgent( - AgentKindSchema.Enum.supervisor, - supervisor.AgentTypes.BOSS, -); - -// Can you create tasks to write poem about: sun, earth, mars and assign them to the right agent type and run them? -// Can you create agent type that will write the best poems on different topics, then create tasks to create poem about: sun, night, water. Assign them to the right agent types run all tasks and give me the created poems when it will be all finished? -// Can you create agent type that will write the best poems on different topics, then create tasks to create poem about: sun, night, water. Assign them to the right agent types? - -// Can you create agent type that will write the best poems on different topics with the pool size 2? -// Can you create tasks to create poem about: sun, night, water, hell, love, hate. Assign them to the right agent types? -// Can you runt these tasks? -// Can you list their results? - -// Can you generate poem for each of these topics: love, day, night? -// Can you get list of articles about each of these topics: deepseek, interstellar engine, agi? - -const reader = createConsoleReader({ fallback: "What is the current weather in Las Vegas?" }); -for await (const { prompt } of reader) { - try { - const response = await supervisorAgent - .run( - { - prompt, - }, - { - execution: { - maxIterations: 100, - maxRetriesPerStep: 2, - totalMaxRetries: 10, - }, - }, - ) - .observe((emitter) => { - emitter.on("update", (data, meta) => { - reader.write( - `${(meta.creator as any).input.meta.name} 🤖 (${data.update.key}) :`, - data.update.value, - ); - }); - }); - - reader.write(`Agent 🤖 :`, response.result.text); - } catch (error) { - reader.write(`Error`, FrameworkError.ensure(error).dump()); - } -} diff --git a/src/agents/agent-factory.ts b/src/agents/agent-factory.ts index 27850f4..aa5ae3d 100644 --- a/src/agents/agent-factory.ts +++ b/src/agents/agent-factory.ts @@ -1,13 +1,13 @@ -import { getChatLLM } from "src/helpers/llm.js"; -import { AgentKind } from "./agent-registry.js"; import * as supervisor from "./supervisor.js"; import { BeeAgent } from "bee-agent-framework/agents/bee/agent"; import { UnconstrainedMemory } from "bee-agent-framework/memory/unconstrainedMemory"; import { TokenMemory } from "bee-agent-framework/memory/tokenMemory"; -import { BaseToolsFactory } from "src/base/tools-factory.js"; +import { BaseToolsFactory } from "@/base/tools-factory.js"; +import { AgentKindEnum } from "./registry/dto.js"; +import { getChatLLM } from "@/helpers/llm.js"; export interface BaseCreateAgentInput { - agentKind: AgentKind; + agentKind: AgentKindEnum; agentType: string; agentId: string; instructions: string; @@ -22,7 +22,9 @@ export function createAgent( const llm = getChatLLM(input.agentKind); const generalInstructions = `You are a ${input.agentKind} kind of agent (agentId=${input.agentId}, agentType=${input.agentType}). ${input.instructions}`; switch (input.agentKind) { - case "supervisor": + case "supervisor": { + const tools = toolsFactory.createTools(input.tools); + return new BeeAgent({ meta: { name: input.agentId, @@ -30,14 +32,19 @@ export function createAgent( }, llm, memory: new UnconstrainedMemory(), - tools: toolsFactory.createTools(input.tools), + tools, templates: { system: (template) => template.fork((config) => { - config.defaults.instructions = `${supervisor.SUPERVISOR_INSTRUCTIONS(input.agentKind, input.agentType, input.agentId)}\n\n${generalInstructions}`; + config.defaults.instructions = supervisor.SUPERVISOR_INSTRUCTIONS( + input.agentKind, + input.agentType, + input.agentId, + ); }), }, }); + } case "operator": return new BeeAgent({ meta: { @@ -54,5 +61,7 @@ export function createAgent( }), }, }); + default: + throw new Error(`Undefined agent kind agentKind:${input.agentKind}`); } } diff --git a/src/agents/agent-id.ts b/src/agents/agent-id.ts new file mode 100644 index 0000000..8e19e2f --- /dev/null +++ b/src/agents/agent-id.ts @@ -0,0 +1,161 @@ +import { + EntityKindId, + EntityTypeId, + EntityVersionId, + EntityNumId, + EntityVersionNumId, + stringToEntityKind, + stringToEntityType, + stringToEntityVersion, + stringToEntityVersionNum, + entityToKindString, + entityToTypeIdString, + entityToVersionIdString, + entityToVersionNumIdString, +} from "@/base/entity-id.js"; +import { + AgentConfigIdValue, + AgentConfigVersionValue, + AgentIdValue, + AgentKindEnum, + AgentKindEnumSchema, + AgentKindValue, + AgentNumValue, + AgentTypeValue, +} from "./registry/dto.js"; + +// Agent specific interfaces with domain-specific naming +export interface AgentKindId { + agentKind: AgentKindEnum; +} + +export interface AgentTypeId extends AgentKindId { + agentType: AgentTypeValue; +} + +export interface AgentConfigId extends AgentTypeId { + agentConfigVersion: AgentConfigVersionValue; +} + +export interface AgentId extends AgentTypeId { + agentNum: AgentNumValue; + agentConfigVersion: AgentConfigVersionValue; +} + +// Public conversion functions to generic types +export function agentKindToEntityKindId(agentKindId: AgentKindId): EntityKindId { + return { + kind: agentKindId.agentKind, + }; +} + +export function agentTypeToEntityTypeId(agentTypeId: AgentTypeId): EntityTypeId { + return { + ...agentKindToEntityKindId(agentTypeId), + type: agentTypeId.agentType, + }; +} + +export function agentConfigToEntityVersionId( + agentConfigId: AgentConfigId, +): EntityVersionId { + return { + ...agentTypeToEntityTypeId(agentConfigId), + version: agentConfigId.agentConfigVersion, + }; +} + +export function agentToEntityNumId(agentId: AgentId): EntityNumId { + return { + ...agentTypeToEntityTypeId(agentId), + num: agentId.agentNum, + }; +} + +export function agentToEntityVersionNumId(agentId: AgentId): EntityVersionNumId { + return { + ...agentToEntityNumId(agentId), + version: agentId.agentConfigVersion, + }; +} + +// Agent ID validation +function validateAgentKind(kind: string): AgentKindEnum { + const result = AgentKindEnumSchema.safeParse(kind); + if (!result.success) { + throw new Error(`Invalid agent kind: ${kind}`); + } + return result.data; +} + +// Agent conversion functions from string +export function stringToAgentKind(str: string): AgentKindId { + const generic = stringToEntityKind(str, validateAgentKind); + return { + agentKind: generic.kind, + }; +} + +export function stringToAgentType(str: string): AgentTypeId { + const generic = stringToEntityType(str, validateAgentKind); + return { + agentKind: generic.kind, + agentType: generic.type, + }; +} + +export function stringToAgentConfig(str: string): AgentConfigId { + const generic = stringToEntityVersion(str, validateAgentKind); + return { + agentKind: generic.kind, + agentType: generic.type, + agentConfigVersion: generic.version, + }; +} + +export function stringToAgent(str: string): AgentId { + const generic = stringToEntityVersionNum(str, validateAgentKind); + return { + agentKind: generic.kind, + agentType: generic.type, + agentNum: generic.num, + agentConfigVersion: generic.version, + }; +} + +// String conversion functions +export function agentSomeIdToKindValue( + agentSomeId: AgentKindId | AgentTypeId | AgentConfigId | AgentId, +): AgentKindValue { + return entityToKindString(agentKindToEntityKindId(agentSomeId)); +} + +export function agentSomeIdToTypeValue( + agentSomeId: AgentTypeId | AgentConfigId | AgentId, +): AgentTypeValue { + return entityToTypeIdString(agentTypeToEntityTypeId(agentSomeId)); +} + +export function agentConfigIdToValue(agentConfigId: AgentConfigId): AgentConfigIdValue { + return entityToVersionIdString(agentConfigToEntityVersionId(agentConfigId)); +} + +export function agentIdToString(agentId: AgentId): AgentIdValue { + return entityToVersionNumIdString(agentToEntityVersionNumId(agentId)); +} + +// Generic conversion that handles any agent ID type +export function agentSomeIdToString( + agentSomeId: AgentKindId | AgentTypeId | AgentConfigId | AgentId, +): string { + if ("num" in agentSomeId) { + return agentIdToString(agentSomeId as AgentId); + } + if ("version" in agentSomeId) { + return agentConfigIdToValue(agentSomeId as AgentConfigId); + } + if ("agentType" in agentSomeId) { + return agentSomeIdToTypeValue(agentSomeId as AgentTypeId); + } + return agentSomeIdToKindValue(agentSomeId); +} diff --git a/src/agents/agent-registry.ts b/src/agents/agent-registry.ts deleted file mode 100644 index 51093b5..0000000 --- a/src/agents/agent-registry.ts +++ /dev/null @@ -1,542 +0,0 @@ -import { Logger } from "bee-agent-framework/logger/logger"; -import { BaseToolsFactory } from "src/base/tools-factory.js"; -import { z } from "zod"; - -export const AgentKindSchema = z - .enum(["supervisor", "operator"]) - .describe( - "Specifies the role type of an agent in the system. A 'supervisor' has administrative privileges and can oversee multiple operators, while an 'operator' handles day-to-day operational tasks.", - ); -export type AgentKind = z.infer; - -/** - * Schema for configuring an agent type. - * Defines the basic properties and requirements for creating agents of a specific type. - */ -export const AgentConfigSchema = z.object({ - kind: AgentKindSchema, - type: z.string().describe("Unique identifier for the agent type"), - instructions: z.string().describe("Provide detailed instructions on how the agent should act."), - description: z - .string() - .describe("Description of the agent's behavior and purpose of his existence."), - tools: z - .array(z.string()) - .nullish() - .describe( - "List of tool identifiers that this agent type can utilize. Null/undefined means all available. Empty array means no tools.", - ), - maxPoolSize: z - .number() - .int() - .min(0) - .default(0) - .describe("Maximum number of agents to maintain in the pool for this type."), - autoPopulatePool: z - .boolean() - .default(false) - .describe("Populates the agent pool for a specific type up to its configured size."), -}); -export type AgentConfig = z.infer; - -/** - * Schema for an individual agent instance. - * Represents a specific instance of an agent with its runtime state. - */ -export const AgentSchema = z.object({ - /** Unique identifier for this specific agent instance */ - agentId: z.string(), - /** The type of agent this instance represents */ - type: z.string(), - kind: AgentKindSchema, - /** Configuration settings for this agent */ - config: AgentConfigSchema, - /** - * Indicates whether this agent is currently being used - * Used for pool management to track available agents - */ - inUse: z.boolean().default(false), - instance: z.any(), -}); -export type Agent = z.infer; -export type AgentWithInstance = Omit & { - instance: TAgentInstance; -}; - -/** - * Schema for an available tool. - */ -export const AvailableToolSchema = z.object({ - name: z.string(), - description: z.string(), -}); - -export type AvailableTool = z.infer; - -/** - * Schema for pool statistics of an agent type - * Provides information about pool capacity and utilization - */ -export const PoolStatsSchema = z - .object({ - /** Maximum number of agents that can be in the pool */ - poolSize: z.number(), - /** Number of agents currently available in the pool */ - available: z.number(), - /** Number of agents currently in use from the pool */ - inUse: z.number(), - /** Number of created agents */ - created: z.number(), - }) - .describe("Statistics about an agent type's pool"); - -export type PoolStats = z.infer; - -/** - * Callbacks for managing agent lifecycle events. - * These callbacks allow customization of agent behavior at key points in their lifecycle. - */ -export interface AgentLifecycleCallbacks { - /** - * Called when a new agent needs to be created - * @param config - Configuration for the agent - * @param poolStats - Statistics of the agent pool - * @param toolsFactory - Factory to create tools - * @returns Promise resolving to the new agent's id and instance - */ - onCreate: ( - config: AgentConfig, - poolStats: PoolStats, - toolsFactory: BaseToolsFactory, - ) => Promise<{ agentId: string; instance: TAgentInstance }>; - - /** - * Called when an agent is being destroyed - * @param instance - Instance of the agent being destroyed - */ - onDestroy: (instance: TAgentInstance) => Promise; - - /** - * Optional callback when an agent is acquired from the pool - * Use this to prepare an agent for reuse - * @param agentId - ID of the agent being acquired - */ - onAcquire?: (agentId: string) => Promise; - - /** - * Optional callback when an agent is released back to the pool - * Use this to clean up agent state before returning to pool - * @param agentId - ID of the agent being released - */ - onRelease?: (agentId: string) => Promise; -} - -type AgentTypePoolMap = Map>; -type AgentConfigMap = Map; -export interface AgentInstanceRef { - agentId: string; - instance: TInstance; -} - -/** - * Registry for managing agent types, instances, and pools. - * Provides functionality for: - * - Registering and managing agent types - * - Creating and destroying agent instances - * - Managing pools of reusable agents - * - Tracking agent lifecycle and utilization - * - * Usage: - * - Whenever you need an agent first look if there already is an suitable agent type if not let register new one. - * - */ -export class AgentRegistry { - private readonly logger: Logger; - /** Map of registered agent kind and their configurations */ - private agentConfigs: Map; - /** Map of all agent instances */ - private agents = new Map(); - /** Map of agent pools by kind and type, containing sets of available agent IDs */ - private agentPools: Map; - /** Callbacks for agent lifecycle events */ - private callbacks: AgentLifecycleCallbacks; - /** Maps of tools factories for use by agents per agent kinds */ - private toolsFactory = new Map(); - - /** - * Creates a new AgentRegistry instance - * @param callbacks - Callbacks for handling agent lifecycle events - */ - constructor(callbacks: AgentLifecycleCallbacks) { - this.logger = Logger.root.child({ name: "AgentRegistry" }); - this.logger.info("Initializing AgentRegistry"); - this.callbacks = callbacks; - // Initialize agent pools for all agent kinds - this.agentConfigs = new Map(AgentKindSchema.options.map((kind) => [kind, new Map()])); - this.agentPools = new Map(AgentKindSchema.options.map((kind) => [kind, new Map()])); - } - - /** - * Register tools factory for a specific agent type - * @param tuples - */ - registerToolsFactories(tuples: [AgentKind, BaseToolsFactory][]) { - tuples.map(([kind, factory]) => this.toolsFactory.set(kind, factory)); - } - - private getAgentKindPoolMap(kind: AgentKind) { - const poolKind = this.agentPools.get(kind); - if (!poolKind) { - throw new Error(`There is missing pool for agent kind:${kind}`); - } - return poolKind; - } - - private getAgentPoolMap(kind: AgentKind, type: string) { - const poolKind = this.getAgentKindPoolMap(kind); - const pool = poolKind.get(type); - if (!poolKind) { - throw new Error(`There is missing pool for agent kind:${kind} type:${type}`); - } - return pool; - } - - private getAgentConfigMap(kind: AgentKind) { - const typesMap = this.agentConfigs.get(kind); - if (!typesMap) { - throw new Error(`There is missing types map for agent kind:${kind}`); - } - return typesMap; - } - - getToolsFactory(agentKind: AgentKind): BaseToolsFactory { - const factory = this.toolsFactory.get(agentKind); - if (!factory) { - this.logger.error(`There is missing tools factory for the '${agentKind}' agent kind.`, { - agentKind, - }); - throw new Error(`There is missing tools factory for the '${agentKind}' agent kind`); - } - - return factory; - } - - /** - * Registers a new agent type with the registry - * If the agent type has a pool size > 0, initializes and populates the pool - * @param config - Configuration for the new agent type - * @throws Error if agent type is already registered - */ - registerAgentType(config: AgentConfig): void { - const { kind, type, maxPoolSize, autoPopulatePool } = config; - this.logger.info("Registering new agent type", { - kind: kind, - type: type, - poolSize: maxPoolSize, - }); - - const agentTypesMap = this.getAgentConfigMap(kind); - if (agentTypesMap.has(type)) { - this.logger.error("Agent type already registered", { type: type }); - throw new Error(`Agent type '${type}' is already registered`); - } - - const toolsFactory = this.getToolsFactory(config.kind); - const availableTools = toolsFactory.getAvailableTools(); - if (config.tools?.filter((it) => !!it.length).length) { - const undefinedTools = config.tools.filter( - (tool) => !availableTools.some((at) => at.name === tool), - ); - if (undefinedTools.length) { - this.logger.error(`Tool wasn't found between available tools `, { - availableTools: availableTools.map((at) => at.name), - undefinedTools, - }); - throw new Error( - `Tools [${undefinedTools.join(",")}] weren't found between available tools [${availableTools.map((at) => at.name).join(",")}]`, - ); - } - } else { - config.tools = toolsFactory.getAvailableToolsNames(); - } - - agentTypesMap.set(type, config); - - // Initialize pool if pooling is enabled - if (maxPoolSize > 0) { - this.logger.debug("Initializing agent pool", { - kind, - type, - poolSize: maxPoolSize, - }); - - const kindPool = this.getAgentKindPoolMap(kind); - kindPool.set(type, new Set([])); - - if (autoPopulatePool) { - // Pre-populate pool - this.populatePool(kind, type).catch((error) => { - this.logger.error("Failed to populate pool", { type: type, error }); - }); - } - } - } - - /** - * Populates the agent pool for a specific type up to its configured size - * @param type - The agent type to populate pool for - * @private - */ - private async populatePool(kind: AgentKind, type: string): Promise { - this.logger.debug("Populating agent pool", { type }); - const config = this.getAgentTypeConfig(kind, type); - const pool = this.getAgentPoolMap(kind, type); - - if (!pool || config.maxPoolSize <= 0) { - this.logger.trace("Pool population skipped - no pool or size 0", { type }); - return; - } - - const currentPoolSize = pool.size; - const needed = config.maxPoolSize - currentPoolSize; - - this.logger.debug("Creating agents for pool", { - type, - needed, - currentPoolSize, - targetSize: config.maxPoolSize, - }); - - for (let i = 0; i < needed; i++) { - const agent = await this.createAgent(kind, type, true); - const { agentId } = agent; - pool.add(agentId); - this.logger.trace("Added agent to pool", { kind, type, agentId }); - } - } - - /** - * Returns list of all registered agent types - * @returns Array of agent type identifiers - */ - getAgentTypes(): string[] { - this.logger.trace("Getting registered agent types"); - return Array.from(this.agentConfigs.keys()); - } - - /** - * Retrieves configuration for a specific agent type - * @param kind - The agent kind to get configuration for - * @param type - The agent type to get configuration for - * @returns Configuration for the specified agent type - * @throws Error if agent type is not registered - */ - getAgentTypeConfig(kind: AgentKind, type: string): AgentConfig { - this.logger.trace("Getting agent type configuration", { type }); - const config = this.getAgentConfigMap(kind).get(type); - if (!config) { - this.logger.error("Agent type not found", { type }); - throw new Error(`Agent type '${type}' not found`); - } - return config; - } - - /** - * Acquires an agent instance from the pool or creates a new one - * @param kind - The kind of agent to acquire - * @param type - The type of agent to acquire - * @returns Promise resolving to the agent ID - * @throws Error if no agents are available and pool is at capacity - */ - async acquireAgent(kind: AgentKind, type: string): Promise> { - this.logger.debug("Attempting to acquire agent", { type }); - const config = this.getAgentTypeConfig(kind, type); - const pool = this.getAgentPoolMap(kind, type); - - if (!pool || config.maxPoolSize === 0) { - this.logger.debug("No pool available, creating new agent", { type }); - return this.createAgent(kind, type, false); - } - - // Try to get an available agent from the pool - for (const agentId of pool) { - const agent = this.agents.get(agentId); - if (agent && !agent.inUse) { - pool.delete(agentId); - agent.inUse = true; - - this.logger.debug("Acquired agent from pool", { type, agentId }); - - if (this.callbacks.onAcquire) { - this.logger.trace("Executing onAcquire callback", { agentId }); - await this.callbacks.onAcquire(agentId); - } - - return agent as AgentWithInstance; - } - } - - // No available agents in pool - if (pool.size < config.maxPoolSize) { - this.logger.debug("Pool not at capacity, creating new agent", { - kind, - type, - currentSize: pool.size, - maxSize: config.maxPoolSize, - }); - return this.createAgent(kind, type, false); - } - - this.logger.error("No available agents and pool at capacity", { - type, - poolSize: config.maxPoolSize, - }); - throw new Error(`No available agents of type '${type}' in pool and pool is at capacity`); - } - - /** - * Releases an agent back to its pool or destroys it - * @param agentId - ID of the agent to release - * @throws Error if agent is not found - */ - async releaseAgent(agentId: string): Promise { - this.logger.debug("Attempting to release agent", { agentId }); - const agent = this.agents.get(agentId); - if (!agent) { - this.logger.error("Agent not found for release", { agentId }); - throw new Error(`Agent with ID '${agentId}' not found`); - } - - const { kind, type, maxPoolSize } = this.getAgentTypeConfig(agent.kind, agent.type); - const pool = this.getAgentPoolMap(kind, type); - - if (!pool || maxPoolSize === 0) { - this.logger.debug("No pool available, destroying agent", { agentId }); - await this.destroyAgent(agentId); - return; - } - - if (this.callbacks.onRelease) { - this.logger.trace("Executing onRelease callback", { agentId }); - await this.callbacks.onRelease(agentId); - } - - // Return to pool - agent.inUse = false; - pool.add(agentId); - this.logger.debug("Agent released back to pool", { agentId, type: agent.type }); - } - - /** - * Creates a new agent instance - * @param type - The type of agent to create - * @param forPool - Whether this agent is being created for a pool - * @returns Promise resolving to the new agent's ID - * @private - */ - private async createAgent( - kind: AgentKind, - type: string, - forPool: boolean, - ): Promise> { - this.logger.debug("Creating new agent", { kind, type, forPool }); - const config = this.getAgentTypeConfig(kind, type); - const poolStats = this.getPoolStats(kind, type); - const toolsFactory = this.getToolsFactory(kind); - const { agentId, instance } = await this.callbacks.onCreate(config, poolStats, toolsFactory); - - const agent = { - agentId, - kind, - type, - config, - inUse: !forPool, - instance, - } satisfies Agent; - this.agents.set(agentId, agent); - - this.logger.info("Agent created successfully", { agentId, type, forPool }); - return agent; - } - - /** - * Destroys an existing agent instance - * @param agentId - ID of the agent to destroy - * @throws Error if agent is not found - */ - async destroyAgent(agentId: string): Promise { - this.logger.debug("Attempting to destroy agent", { agentId }); - const agent = this.agents.get(agentId); - if (!agent) { - this.logger.error("Agent not found for destruction", { agentId }); - throw new Error(`Agent with ID '${agentId}' not found`); - } - - // Remove from pool if it's in one - const pool = this.getAgentPoolMap(agent.kind, agent.type); - if (pool) { - pool.delete(agentId); - this.logger.trace("Removed agent from pool", { agentId, kind: agent.kind, type: agent.type }); - } - - await this.callbacks.onDestroy(agent.instance); - this.agents.delete(agentId); - this.logger.info("Agent destroyed successfully", { - agentId, - kind: agent.kind, - type: agent.type, - }); - } - - /** - * Returns list of all active agent instances - * @returns Array of active agents - */ - getActiveAgents(): Agent[] { - this.logger.trace("Getting active agents"); - return Array.from(this.agents.values()).filter((a) => a.inUse); - } - - /** - * Retrieves a specific agent instance by ID - * @param agentId - ID of the agent to retrieve - * @returns The requested agent instance - * @throws Error if agent is not found - */ - getAgent(agentId: string): Agent { - this.logger.trace("Getting agent by ID", { agentId }); - const agent = this.agents.get(agentId); - if (!agent) { - this.logger.error("Agent not found", { agentId }); - throw new Error(`Agent with ID '${agentId}' not found`); - } - return agent; - } - - /** - * Returns statistics about the agent pool for a specific type - * @param type - The agent type to get pool statistics for - * @returns Object containing pool statistics - */ - getPoolStats(kind: AgentKind, type: string): PoolStats { - this.logger.trace("Getting pool statistics", { type }); - const config = this.getAgentTypeConfig(kind, type); - const pool = this.getAgentPoolMap(kind, type); - - if (!pool || config.maxPoolSize === 0) { - return { poolSize: 0, available: 0, inUse: 0, created: 0 }; - } - - const available = Array.from(pool).filter((agentId) => !this.agents.get(agentId)?.inUse).length; - - const stats = { - poolSize: config.maxPoolSize, - available, - inUse: pool.size - available, - created: pool.size, - }; - - this.logger.debug("Pool statistics", { type, ...stats }); - return stats; - } -} diff --git a/src/agents/index.ts b/src/agents/index.ts new file mode 100644 index 0000000..59c1e10 --- /dev/null +++ b/src/agents/index.ts @@ -0,0 +1,6 @@ +import * as agentRegistry from "./registry/index.js"; +import * as stateLogger from "./state/logger.js"; +import * as supervisor from "./supervisor.js"; +import * as operator from "./operator.js"; + +export { agentRegistry, stateLogger, supervisor, operator }; diff --git a/src/agents/operator.ts b/src/agents/operator.ts index 2ebd561..d18ed21 100644 --- a/src/agents/operator.ts +++ b/src/agents/operator.ts @@ -1,9 +1,9 @@ import { ArXivTool } from "bee-agent-framework/tools/arxiv"; import { DuckDuckGoSearchTool } from "bee-agent-framework/tools/search/duckDuckGoSearch"; -import { BaseToolsFactory, ToolFactoryMethod } from "src/base/tools-factory.js"; +import { BaseToolsFactory, ToolFactoryMethod } from "@/base/tools-factory.js"; export class ToolsFactory extends BaseToolsFactory { - getFactoriesMethods(): ToolFactoryMethod[] { + async getFactoriesMethods(): Promise { return [() => new DuckDuckGoSearchTool(), () => new ArXivTool()]; } } diff --git a/src/agents/registry/dto.ts b/src/agents/registry/dto.ts new file mode 100644 index 0000000..539f275 --- /dev/null +++ b/src/agents/registry/dto.ts @@ -0,0 +1,123 @@ +import { z } from "zod"; + +export const AgentKindEnumSchema = z + .enum(["supervisor", "operator"]) + .describe( + "Specifies the role type of an agent in the system. A 'supervisor' has administrative privileges and can oversee multiple operators, while an 'operator' handles day-to-day operational tasks.", + ); +export type AgentKindEnum = z.infer; + +export const AgentKindValueSchema = z + .string() + .refine((value) => Object.values(AgentKindEnumSchema.enum).includes(value as AgentKindEnum), { + message: `Agent kind must be one of: ${Object.values(AgentKindEnumSchema.enum).join(", ")}`, + }) + .describe( + "Specifies the role type of an agent in the system. A 'supervisor' has administrative privileges and can oversee multiple operators, while an 'operator' handles day-to-day operational tasks.", + ); +export type AgentKindValue = z.infer; + +export const AgentTypeValueSchema = z + .string() + .describe("Specifies the type of an agent in the system."); +export type AgentTypeValue = z.infer; + +export const AgentIdValueSchema = z + .string() + .describe( + "Unique agent id composed of '{agentKind}:{agentType}[{instanceNum}]:{version}' e.g: 'supervisor:boss[1]:1' or 'operator:poem_generator[2]:3'", + ); +export type AgentIdValue = z.infer; + +export const AgentConfigIdValueSchema = z + .string() + .describe( + "Unique agent config id composed of '{agentKind}:{agentType}:{version}' e.g: 'supervisor:boss:1' or 'operator:poem_generator:3'", + ); +export type AgentConfigIdValue = z.infer; + +export const AgentNumValueSchema = z.number().describe("Agent instance number."); +export type AgentNumValue = z.infer; + +export const AgentConfigVersionValueSchema = z.number().describe("Agent config version number."); +export type AgentConfigVersionValue = z.infer; + +/** + * Schema for configuring an agent type. + * Defines the basic properties and requirements for creating agents of a specific type. + */ +export const AgentConfigSchema = z.object({ + agentConfigId: AgentConfigIdValueSchema, + agentConfigVersion: AgentConfigVersionValueSchema, + agentKind: AgentKindEnumSchema, + agentType: AgentTypeValueSchema, + instructions: z.string().describe("Provide detailed instructions on how the agent should act."), + description: z + .string() + .describe("Description of the agent's behavior and purpose of his existence."), + tools: z.array(z.string()).describe("List of tool identifiers that this agent type can utilize."), + maxPoolSize: z + .number() + .int() + .min(0) + .default(0) + .describe("Maximum number of agents to maintain in the pool for this type."), + autoPopulatePool: z + .boolean() + .default(false) + .describe("Populates the agent pool for a specific type up to its configured size."), +}); +export type AgentConfig = z.infer; + +/** + * Schema for an individual agent instance. + * Represents a specific instance of an agent with its runtime state. + */ +export const AgentSchema = z.object({ + agentId: AgentIdValueSchema, + agentKind: AgentKindEnumSchema, + agentType: AgentTypeValueSchema, + agentNum: AgentNumValueSchema, + agentConfigVersion: AgentConfigVersionValueSchema, + /** Configuration settings for this agent */ + config: AgentConfigSchema, + /** + * Indicates whether this agent is currently being used + * Used for pool management to track available agents + */ + inUse: z.boolean().default(false), + instance: z.any(), +}); +export type Agent = z.infer; +export type AgentWithInstance = Omit & { + instance: TAgentInstance; +}; + +/** + * Schema for an available tool. + */ +export const AvailableToolSchema = z.object({ + toolName: z.string(), + description: z.string(), +}); + +export type AvailableTool = z.infer; + +/** + * Schema for pool statistics of an agent type + * Provides information about pool capacity and utilization + */ +export const AgentConfigPoolStatsSchema = z + .object({ + /** Maximum number of agents that can be in the pool */ + poolSize: z.number(), + /** Number of agents currently available in the pool */ + available: z.number(), + /** Number of agents currently in use from the pool */ + active: z.number(), + /** Number of created agents */ + created: z.number(), + }) + .describe("Statistics about an agent config's pool"); + +export type AgentConfigPoolStats = z.infer; diff --git a/src/agents/registry/index.ts b/src/agents/registry/index.ts new file mode 100644 index 0000000..090c838 --- /dev/null +++ b/src/agents/registry/index.ts @@ -0,0 +1,2 @@ +export * from "./registry.js"; +export * from "./tool.js"; diff --git a/src/agents/registry/registry.ts b/src/agents/registry/registry.ts new file mode 100644 index 0000000..4af6799 --- /dev/null +++ b/src/agents/registry/registry.ts @@ -0,0 +1,1008 @@ +import { clone, isNonNullish } from "remeda"; +import { BaseToolsFactory } from "@/base/tools-factory.js"; +import { updateDeepPartialObject } from "@/utils/objects.js"; +import { + agentConfigIdToValue, + agentIdToString, + agentSomeIdToKindValue, + agentSomeIdToTypeValue, + stringToAgentConfig, +} from "../agent-id.js"; +import { + Agent, + AgentConfig, + AgentConfigIdValue, + AgentConfigPoolStats, + AgentConfigSchema, + AgentConfigVersionValue, + AgentIdValue, + AgentKindEnum, + AgentKindEnumSchema, + AgentTypeValue, + AgentWithInstance, +} from "./dto.js"; +import { AgentStateLogger } from "@agents/state/logger.js"; +import { WorkspaceRestorable } from "@workspaces/restore/restorable.js"; +import { WorkspaceResource } from "@workspaces/manager/index.js"; + +/** + * Callbacks for managing agent lifecycle events. + * These callbacks allow customization of agent behavior at key points in their lifecycle. + */ +export interface AgentLifecycleCallbacks { + /** + * Called when a new agent needs to be created + * @param config - Configuration for the agent + * @param agentId - Unique agent ID + * @param poolStats - Statistics of the agent pool + * @param toolsFactory - Factory to create tools + * @returns Promise resolving to the new agent's id and instance + */ + onCreate: ( + config: AgentConfig, + agentId: AgentIdValue, + toolsFactory: BaseToolsFactory, + ) => Promise<{ agentId: AgentIdValue; instance: TAgentInstance }>; + + /** + * Called when an agent is being destroyed + * @param instance - Instance of the agent being destroyed + */ + onDestroy: (instance: TAgentInstance) => Promise; + + /** + * Optional callback when an agent is acquired from the pool + * Use this to prepare an agent for reuse + * @param agentId - ID of the agent being acquired + */ + onAcquire?: (agentId: AgentIdValue) => Promise; + + /** + * Optional callback when an agent is released back to the pool + * Use this to clean up agent state before returning to pool + * @param agentId - ID of the agent being released + */ + onRelease?: (agentId: AgentIdValue) => Promise; +} + +type AgentRuntime = Agent & { instance: TInstance }; + +export interface AgentInstanceRef { + agentId: AgentIdValue; + instance: TInstance; +} + +export type AgentTypesMap = Map>; + +const AGENT_REGISTRY_USER = "agent_registry_user"; +const AGENT_REGISTRY_CONFIG_PATH = ["configs", "agent_registry.jsonl"] as const; + +export class AgentRegistry extends WorkspaceRestorable { + /** Map of registered agent kind and their configurations */ + private agentConfigs: Map>; + /** Map of all agent instances */ + private agents = new Map>(); + /** Map of agent pools by kind and type, containing sets of available agent IDs */ + private agentPools: Map< + AgentKindEnum, + Map][]> + >; + /** Callbacks for agent lifecycle events */ + private lifecycleCallbacks: AgentLifecycleCallbacks; + private onAgentConfigCreated: (agentKind: AgentKindEnum, agentType: AgentTypeValue) => void; + private onAgentAvailable: ( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + agentConfigVersion: AgentConfigVersionValue, + availableCount: number, + ) => void; + /** Maps of tools factories for use by agents per agent kinds */ + private toolsFactory = new Map(); + private poolsCleanupJobIntervalId: NodeJS.Timeout | null = null; + private poolsCleanupJobExecuting = false; + private poolsToCleanup: string[] = []; + private stateLogger: AgentStateLogger; + + constructor({ + agentLifecycle, + onAgentConfigCreated, + onAgentAvailable, + }: { + onAgentConfigCreated: (agentKind: AgentKindEnum, agentType: AgentTypeValue) => void; + onAgentAvailable: ( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + agentConfigVersion: AgentConfigVersionValue, + availableCount: number, + ) => void; + agentLifecycle: AgentLifecycleCallbacks; + }) { + super(AGENT_REGISTRY_CONFIG_PATH, AGENT_REGISTRY_USER); + this.logger.info("Initializing AgentRegistry"); + this.stateLogger = AgentStateLogger.getInstance(); + this.lifecycleCallbacks = agentLifecycle; + this.onAgentConfigCreated = onAgentConfigCreated; + this.onAgentAvailable = onAgentAvailable; + // Initialize agent pools for all agent kinds + this.agentConfigs = new Map(AgentKindEnumSchema.options.map((kind) => [kind, new Map()])); + this.agentPools = new Map(AgentKindEnumSchema.options.map((kind) => [kind, new Map()])); + } + + restore(): void { + super.restore(AGENT_REGISTRY_USER); + } + + protected restoreEntity(resource: WorkspaceResource, line: string): void { + this.logger.info(`Restoring previous state from ${resource.path}`); + + let parsed; + try { + parsed = JSON.parse(line); + } catch (e) { + this.logger.error(e); + throw new Error(`Failed to parse JSON: ${line}`); + } + + const agentConfigResult = AgentConfigSchema.safeParse(parsed); + if (agentConfigResult.success) { + this.createAgentConfig(agentConfigResult.data, false); + return; + } + + this.logger.error(agentConfigResult, `Can't restore agent config`); + throw new Error(`Can't restore`); + } + + protected getSerializedEntities(): string { + return Array.from(this.agentConfigs.entries()) + .map(([agentKind, typeMap]) => + Array.from(typeMap.entries()).map(([agentType, versions]) => { + const agentConfig = versions.at(-1); + if (!agentConfig) { + throw new Error( + `Agent config ${agentSomeIdToTypeValue({ agentKind, agentType })} has no version to serialize`, + ); + } + return JSON.stringify(agentConfig); + }), + ) + .flat() + .join("\n"); + } + + /** + * Register tools factory for a specific agent type + * @param tuples + */ + async registerToolsFactories(tuples: [AgentKindEnum, BaseToolsFactory][]) { + for (const [agentKind, factory] of tuples) { + await factory.init(); + this.toolsFactory.set(agentKind, factory); + this.stateLogger.logAvailableTools({ + agentKindId: agentSomeIdToKindValue({ agentKind }), + availableTools: factory.getAvailableTools(), + }); + } + } + + private getAgentKindPoolMap(agentKind: AgentKindEnum) { + const poolKind = this.agentPools.get(agentKind); + if (!poolKind) { + throw new Error(`There is missing pool for agent agentKind:${agentKind}`); + } + return poolKind; + } + + private getAgentTypeVersionSetsArray(agentKind: AgentKindEnum, agentType: AgentTypeValue) { + const poolKind = this.getAgentKindPoolMap(agentKind); + const pool = poolKind.get(agentType); + if (!pool) { + throw new Error( + `There is missing pool version sets array for agent agentKind:${agentKind} agentType:${agentType}`, + ); + } + return pool; + } + + private getAgentTypeVersionSet( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + agentConfigVersion: number, + ) { + const poolVersionSetsArray = this.getAgentTypeVersionSetsArray(agentKind, agentType); + const poolVersionSet = poolVersionSetsArray.find((it) => it[0] === agentConfigVersion); + if (!poolVersionSet) { + throw new Error( + `There is missing pool version set for agent agentKind:${agentKind} agentType:${agentType} version:${agentConfigVersion}`, + ); + } + return poolVersionSet[1]; + } + + private getAgentConfigMap(agentKind: AgentKindEnum) { + const typesMap = this.agentConfigs.get(agentKind); + if (!typesMap) { + throw new Error(`There is missing types map for agent agentKind:${agentKind}`); + } + return typesMap; + } + + private getAgentConfigTypeMap(agentKind: AgentKindEnum, agentType: string) { + const agentConfigTypeMap = this.getAgentConfigMap(agentKind); + const agentVersions = agentConfigTypeMap.get(agentType); + if (!agentVersions) { + this.logger.error({ agentKind, agentType }, "Agent config type map was not found"); + throw new Error(`Agent kind '${agentKind}' type '${agentType}' was not found`); + } + return agentVersions; + } + + getToolsFactory(agentKind: AgentKindEnum): BaseToolsFactory { + const factory = this.toolsFactory.get(agentKind); + if (!factory) { + this.logger.error( + { + agentKind, + }, + `There is missing tools factory for the '${agentKind}' agent kind.`, + ); + throw new Error(`There is missing tools factory for the '${agentKind}' agent kind`); + } + + return factory; + } + + createAgentConfig( + config: Omit, + persist = true, + ): AgentConfig { + const { agentKind, agentType, maxPoolSize } = config; + this.logger.info( + { + agentKind, + agentType, + maxPoolSize, + }, + "Create new agent config", + ); + + const agentTypesMap = this.getAgentConfigMap(agentKind); + if (agentTypesMap.has(agentType)) { + this.logger.error({ agentType }, "Agent type already registered"); + throw new Error(`Agent type '${agentType}' is already registered`); + } + + const toolsFactory = this.getToolsFactory(config.agentKind); + const availableTools = toolsFactory.getAvailableTools(); + if (config.tools.filter((it) => !!it.length).length) { + const undefinedTools = config.tools.filter( + (tool) => !availableTools.some((at) => at.toolName === tool), + ); + if (undefinedTools.length) { + this.logger.error( + { + availableTools: availableTools.map((at) => at.toolName), + undefinedTools, + }, + `Tool wasn't found between available tools `, + ); + throw new Error( + `Tools [${undefinedTools.join(",")}] weren't found between available tools [${availableTools.map((at) => at.toolName).join(",")}]`, + ); + } + } else { + config.tools = []; + } + + const agentConfigVersion = 1; + const agentConfigId = agentConfigIdToValue({ + ...config, + agentConfigVersion, + }); + const configVersioned = { ...config, agentConfigId, agentConfigVersion }; + agentTypesMap.set(agentType, [configVersioned]); + this.stateLogger.logAgentConfigCreate({ + agentConfigId, + agentType: agentSomeIdToTypeValue(configVersioned), + config: configVersioned, + }); + + this.initializeAgentPool(agentKind, agentType, agentConfigVersion); + this.onAgentConfigCreated(agentKind, agentType); + + if (persist) { + this.persist(); + } + + return configVersioned; + } + + updateAgentConfig( + update: Pick & + Partial< + Pick< + AgentConfig, + "tools" | "instructions" | "description" | "maxPoolSize" | "autoPopulatePool" + > + >, + ) { + const { agentKind, agentType } = update; + const config = this.getAgentConfig(update.agentKind, update.agentType); + + if (update.tools) { + // Check tools existence + const toolsFactory = this.getToolsFactory(config.agentKind); + const availableTools = toolsFactory.getAvailableTools(); + const undefinedTools = update.tools.filter( + (tool) => !availableTools.some((at) => at.toolName === tool), + ); + if (undefinedTools.length) { + this.logger.error( + { + availableTools: availableTools.map((at) => at.toolName), + undefinedTools, + }, + `Tool wasn't found between available tools `, + ); + throw new Error( + `Tools [${undefinedTools.join(",")}] weren't found between available tools [${availableTools.map((at) => at.toolName).join(",")}]`, + ); + } + } + + const newConfigVersion = clone(config); + + const agentConfigVersion = config.agentConfigVersion + 1; + const agentConfigId = agentConfigIdToValue({ + ...config, + agentConfigVersion: agentConfigVersion, + }); + updateDeepPartialObject(newConfigVersion, { + ...update, + agentConfigId, + agentConfigVersion, + }); + const configVersions = this.getAgentConfigTypeMap(agentKind, agentType); + configVersions.push(newConfigVersion); + + this.initializeAgentPool(agentKind, agentType, agentConfigVersion); + this.lookupPoolsToClean(); + + this.stateLogger.logAgentConfigUpdate({ + agentType: agentSomeIdToTypeValue(newConfigVersion), + agentConfigId: newConfigVersion.agentConfigId, + config: newConfigVersion, + }); + + return newConfigVersion; + } + + private initializeAgentPool( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + agentConfigVersion: AgentConfigVersionValue, + ) { + this.logger.debug( + { + agentKind, + agentType, + agentConfigVersion, + }, + "Initializing agent pool", + ); + + const kindPool = this.getAgentKindPoolMap(agentKind); + let typePool = kindPool.get(agentType); + if (!typePool) { + typePool = []; + kindPool.set(agentType, typePool); + } + typePool.push([agentConfigVersion, new Set([])]); + + this.populatePool(agentKind, agentType, agentConfigVersion).catch((error) => { + this.logger.error("Failed to populate pool", { agentType, error }); + }); + } + + /** + * Populates the agent pool for a specific type up to its configured size + * @param agentKind - The agent kind to populate pool for + * @param agentType - The agent type to populate pool for + * @param version - The agent version to populate pool for + * @private + */ + private async populatePool( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + version: number, + ): Promise { + this.logger.debug({ agentKind, agentType, version }, "Populating agent pool"); + const config = this.getAgentConfig(agentKind, agentType, version); + + if (config.maxPoolSize <= 0) { + this.logger.trace({ agentType }, "Pool population skipped - no pool or size 0"); + return; + } + + const pool = this.getAgentTypeVersionSet(agentKind, agentType, version); + if (config.autoPopulatePool) { + // Pre-populate pool + const currentPoolSize = pool.size; + const needed = config.maxPoolSize - currentPoolSize; + + this.logger.debug( + { + agentType, + needed, + currentPoolSize, + targetSize: config.maxPoolSize, + }, + "Creating agents for pool", + ); + + for (let i = 0; i < needed; i++) { + await this.createAgent(agentKind, agentType, version); + } + } + } + + private lookupPoolsToClean() { + this.logger.trace("Looking up pools to cleanup"); + this.poolsToCleanup.splice(0); + // Traverse through all pools and try to destroy all unused agents + Array.from(this.agentPools.entries()).forEach(([agentKind, typeMap]) => { + Array.from(typeMap.entries()).forEach(([agentType, versions]) => { + versions.forEach(([version], index, set) => { + const latestVersion = index + 1 >= set.length; + // Schedule + if (!latestVersion) { + this.poolsToCleanup.push( + agentConfigIdToValue({ agentKind, agentType, agentConfigVersion: version }), + ); + } + }); + }); + }); + + if (this.poolsToCleanup.length) { + this.startPoolsCleanupJob(); + } + } + + private startPoolsCleanupJob() { + this.logger.trace("Start cleanup job"); + if (this.poolsCleanupJobIntervalId != null) { + this.logger.warn(`Pool cleanup job is already running`); + } + this.poolsCleanupJobIntervalId = setInterval(async () => { + if (!this.poolsCleanupJobExecuting) { + this.poolsCleanupJobExecuting = true; + this.executePoolsCleanup().catch((err) => { + this.logger.error(err, "Execute pool cleanup job error"); + this.stopPoolsCleanupJob(); + }); + } + }, 1000); // Runs every 1s + } + + private async executePoolsCleanup() { + this.logger.trace("Executing pool cleanup"); + const poolsToCleanupClone = clone(this.poolsToCleanup); + + let isCleaned = true; + let index = 0; + for (const agentConfigIdStr of poolsToCleanupClone) { + const agentConfigId = stringToAgentConfig(agentConfigIdStr); + const agentTypeVersionPoolSet = this.getAgentTypeVersionSet( + agentConfigId.agentKind, + agentConfigId.agentType, + agentConfigId.agentConfigVersion, + ); + + let destroyed = 0; + for (const agentId of agentTypeVersionPoolSet.values()) { + const agent = this.getAgent(agentId); + if (!agent.inUse) { + try { + await this.destroyAgent(agent.agentId); + destroyed++; + } catch (err) { + this.logger.error(err, `Cleanup error for agent '${agent.agentId}'`); + } + } else { + this.logger.warn(`Can't cleanup agent '${agent.agentId}' he is in use`); + } + } + if (destroyed < agentTypeVersionPoolSet.size) { + isCleaned = false; + } else { + // Destroy unused agent config + this.destroyAgentConfig( + agentConfigId.agentKind, + agentConfigId.agentType, + agentConfigId.agentConfigVersion, + ); + this.poolsToCleanup.splice(index, 1); + } + index++; + } + + if (isCleaned) { + this.stopPoolsCleanupJob(); + } + } + + private stopPoolsCleanupJob() { + this.logger.debug("Stop cleanup job"); + if (this.poolsCleanupJobIntervalId == null) { + this.logger.warn(`Pool cleanup job is already stopped`); + } else { + clearInterval(this.poolsCleanupJobIntervalId); + this.poolsCleanupJobIntervalId = null; + } + } + + /** + * Returns list of all registered agent configs + * @returns Array of agent type identifiers + */ + getAllAgentConfigs(): AgentConfig[] { + this.logger.trace("Getting registered agent configs"); + return Array.from(this.agentConfigs.entries()) + .map(([, typeMap]) => + Array.from(typeMap.entries()) + .map(([, versions]) => versions.at(-1)) + .filter(isNonNullish), + ) + .flat(); + } + + isAgentConfigExists( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + agentConfigVersion?: number, + ) { + let exists = false; + try { + this.getAgentConfig(agentKind, agentType, agentConfigVersion); + exists = true; + } catch (err) { + this.logger.warn(err, `Agent config doesn't exist`); + } + + return exists; + } + + getAgentConfig( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + agentConfigVersion?: number, + ): AgentConfig { + this.logger.trace( + { + agentKind, + agentType, + agentConfigVersion, + }, + "Getting agent type configuration", + ); + const configVersions = this.getAgentConfigMap(agentKind).get(agentType); + if (!configVersions) { + this.logger.error({ agentType }, "Agent config not found"); + throw new Error(`Agent kind '${agentKind}' type '${agentType}' was not found`); + } + if (agentConfigVersion != null) { + const configVersion = configVersions.find((c) => c.agentConfigVersion === agentConfigVersion); + if (!configVersion) { + throw new Error( + `Agent kind '${agentKind}' type '${agentType}' version '${agentConfigVersion}' was not found`, + ); + } + return configVersion; + } + + const lastConfigVersion = configVersions.at(-1); + if (lastConfigVersion == null) { + throw new Error(`Agent kind '${agentKind}' type '${agentType}' last version was not found`); + } + return lastConfigVersion; + } + + private destroyAgentConfig( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + agentConfigVersion: number, + ): AgentConfig { + this.logger.trace( + { + agentKind, + agentType, + version: agentConfigVersion, + }, + "Destroying agent configuration", + ); + const configVersions = this.getAgentConfigMap(agentKind).get(agentType); + if (!configVersions) { + this.logger.error({ agentType }, "Agent config versions was not found"); + throw new Error( + `Agent kind '${agentKind}' type '${agentType}' config versions was not found`, + ); + } + + const configVersionAt = configVersions.findIndex( + (c) => c.agentConfigVersion === agentConfigVersion, + ); + if (configVersionAt < 0) { + throw new Error( + `Agent kind '${agentKind}' type '${agentType}' version '${agentConfigVersion}' was not found`, + ); + } + const stats = this.getPoolStatsByVersion(agentKind, agentType, agentConfigVersion); + if (stats.active) { + throw new Error( + `Agent config kind '${agentKind}' type '${agentType}' version '${agentConfigVersion}' can't be destroyed while it is still in use.`, + ); + } + + const destroyedConfig = configVersions.splice(configVersionAt, 1)[0]; + const { agentConfigId } = destroyedConfig; + this.logger.info({ agentConfigId }, "Agent config destroyed successfully"); + + if (!configVersions.length) { + this.getAgentConfigMap(agentKind).delete(agentType); + } + + if (!this.getAgentConfigMap(agentKind).size) { + this.agentConfigs.delete(agentKind); + } + + const agentTypeId = agentSomeIdToTypeValue({ + agentKind, + agentType, + }); + this.stateLogger.logAgentConfigDestroy({ + agentConfigId, + agentType: agentTypeId, + }); + return destroyedConfig; + } + + /** + * Acquires an agent instance from the pool or creates a new one + * @param agentKind - The kind of agent to acquire + * @param agentType - The type of agent to acquire + * @param version - The version of agent to acquire + * @returns Promise resolving to the agent ID + * @throws Error if no agents are available and pool is at capacity + */ + async acquireAgent( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + version?: number, + ): Promise> { + this.logger.debug({ agentKind, agentType, version }, "Attempting to acquire agent"); + const config = this.getAgentConfig(agentKind, agentType, version); + const pool = this.getAgentTypeVersionSet(agentKind, agentType, config.agentConfigVersion); + + if (!pool || config.maxPoolSize === 0) { + this.logger.debug({ agentType }, "No pool available, creating new agent"); + return this._acquireAgent( + await this.createAgent(agentKind, agentType, config.agentConfigVersion), + ); + } + + // Try to get an available agent from the pool + for (const agentId of pool) { + const agent = this.getAgent(agentId); + if (!agent.inUse) { + this.logger.debug({ agentType, agentId }, "Acquired agent from pool"); + return this._acquireAgent(agent); + } + } + + // No available agents in pool + if (pool.size < config.maxPoolSize) { + this.logger.debug( + { + agentKind, + agentType, + version: config.agentConfigVersion, + currentSize: pool.size, + maxSize: config.maxPoolSize, + }, + "Pool not at capacity, creating new agent", + ); + return this._acquireAgent( + await this.createAgent(agentKind, agentType, config.agentConfigVersion), + ); + } + + this.logger.error("No available agents and pool at capacity", { + agentKind, + agentType, + version: config.agentConfigVersion, + poolSize: config.maxPoolSize, + }); + throw new Error( + `No available agents of kind '${agentKind}' type '${agentType}' version '${config.agentConfigVersion}' in pool and pool is at capacity`, + ); + } + + private async _acquireAgent(agent: Agent) { + const { agentId } = agent; + agent.inUse = true; + + if (this.lifecycleCallbacks.onAcquire) { + this.logger.trace({ agentId }, "Executing onAcquire callback"); + await this.lifecycleCallbacks.onAcquire(agentId); + } + this.stateLogger.logAgentAcquire({ + agentId: agent.agentId, + }); + + const [poolStats, versions] = this.getPoolStats(agent.agentKind, agent.agentType); + this.stateLogger.logPoolChange({ + agentTypeId: agentSomeIdToTypeValue(agent), + poolStats, + versions, + }); + + return agent as AgentWithInstance; + } + + /** + * Releases an agent back to its pool or destroys it + * @param agentId - ID of the agent to release + * @throws Error if agent is not found + */ + async releaseAgent(agentId: AgentIdValue): Promise { + this.logger.debug({ agentId }, "Attempting to release agent"); + const agent = this.agents.get(agentId); + if (!agent) { + this.logger.error({ agentId }, "Agent not found for release"); + throw new Error(`Agent with ID '${agentId}' not found`); + } + + const { agentKind, agentType, agentConfigVersion, maxPoolSize } = agent.config; + const pool = this.getAgentTypeVersionSet(agentKind, agentType, agentConfigVersion); + + if (!pool || maxPoolSize === 0) { + this.logger.debug({ agentId }, "No pool available, destroying agent"); + await this.destroyAgent(agentId); + return; + } + + if (this.lifecycleCallbacks.onRelease) { + this.logger.trace({ agentId }, "Executing onRelease callback"); + await this.lifecycleCallbacks.onRelease(agentId); + } + + // Return to pool + agent.inUse = false; + pool.add(agentId); + this.logger.debug({ agentId, agentType: agent.agentType }, "Agent released back to pool"); + this.stateLogger.logAgentRelease({ + agentId: agent.agentId, + }); + + const [poolStats, versions] = this.getPoolStats(agent.agentKind, agent.agentType); + this.stateLogger.logPoolChange({ + agentTypeId: agentSomeIdToTypeValue(agent), + poolStats, + versions, + }); + + this.onAgentAvailable(agentKind, agentType, agentConfigVersion, 1); + } + + private async createAgent( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + agentConfigVersion: number, + ): Promise> { + this.logger.debug({ agentKind, agentType }, "Creating new agent"); + const config = this.getAgentConfig(agentKind, agentType, agentConfigVersion); + const versionPoolStats = this.getPoolStatsByVersion(agentKind, agentType, agentConfigVersion); + const toolsFactory = this.getToolsFactory(agentKind); + const agentNum = versionPoolStats.created + 1; + const agentId = agentIdToString({ + agentKind, + agentType, + agentNum: agentNum, + agentConfigVersion: agentConfigVersion, + }); + const { instance } = await this.lifecycleCallbacks.onCreate(config, agentId, toolsFactory); + + const agent = { + agentId, + agentKind, + agentType, + agentNum, + agentConfigVersion: config.agentConfigVersion, + config, + inUse: false, + instance, + } satisfies Agent; + this.agents.set(agentId, agent); + + const pool = this.getAgentTypeVersionSetsArray(agentKind, agentType); + let poolVersionSetArrayItem = pool.find((p) => p[0] === agentConfigVersion); + if (!poolVersionSetArrayItem) { + poolVersionSetArrayItem = [agentConfigVersion, new Set([])]; + pool.push(poolVersionSetArrayItem); + } + poolVersionSetArrayItem[1].add(agentId); + this.logger.trace({ agentKind, agentType, agentId }, "Added agent to pool"); + + this.logger.info({ agentId, agentType, agentKind }, "Agent created successfully"); + + this.stateLogger.logAgentCreate({ + agentId: agentId, + agentConfigId: config.agentConfigId, + }); + + const [poolStats, versions] = this.getPoolStats(agentKind, agentType); + this.stateLogger.logPoolChange({ + agentTypeId: agentSomeIdToTypeValue(agent), + poolStats, + versions, + }); + this.onAgentAvailable(agentKind, agentType, config.agentConfigVersion, 1); + return agent; + } + + private async destroyAgent(agentId: AgentIdValue): Promise { + this.logger.debug({ agentId }, "Attempting to destroy agent"); + const agent = this.agents.get(agentId); + if (!agent) { + this.logger.error({ agentId }, "Agent not found for destruction"); + throw new Error(`Agent with ID '${agentId}' not found`); + } + + const { agentKind, agentType, agentConfigVersion } = agent; + + await this.lifecycleCallbacks.onDestroy(agent.instance); + + // Remove from pool if it's in one + const pool = this.getAgentTypeVersionSet(agentKind, agentType, agentConfigVersion); + if (pool) { + pool.delete(agentId); + this.logger.trace( + { + agentId, + agentKind, + agentType, + agentConfigVersion, + }, + "Removed agent from pool", + ); + } else { + throw new Error(`Missing pool`); + } + + if (!pool.size) { + // Remove pool version array set item + const poolVersionSetsArray = this.getAgentTypeVersionSetsArray(agentKind, agentType); + const poolVersionSet = poolVersionSetsArray.findIndex((it) => it[0] === agentConfigVersion); + poolVersionSetsArray.splice(poolVersionSet, 1); + } + + this.agents.delete(agentId); + this.logger.info( + { + agentKind, + agentType, + agentConfigVersion, + }, + "Agent destroyed successfully", + ); + + this.stateLogger.logAgentDestroy({ + agentId, + }); + + const [poolStats, versions] = this.getPoolStats(agentKind, agentType); + this.stateLogger.logPoolChange({ + agentTypeId: agentSomeIdToTypeValue(agent), + poolStats, + versions, + }); + } + + /** + * Returns list of all active agent instances + * @returns Array of active agents + */ + getActiveAgents( + agentKind?: AgentKindEnum, + agentType?: AgentTypeValue, + agentConfigVersion?: number, + ): Agent[] { + this.logger.trace("Getting active agents"); + return Array.from(this.agents.values()).filter((a) => { + if (agentKind && agentKind !== a.agentKind) { + return false; + } + if (agentType && agentType !== a.agentType) { + return false; + } + if (agentConfigVersion != null && agentConfigVersion !== a.config.agentConfigVersion) { + return false; + } + return a.inUse; + }); + } + + getAgent(agentId: AgentIdValue): Agent { + this.logger.trace({ agentId }, "Getting agent by ID"); + const agent = this.agents.get(agentId); + if (!agent) { + this.logger.error({ agentId }, "Agent not found"); + throw new Error(`Agent with ID '${agentId}' not found`); + } + return agent; + } + + getPoolStats( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + ): [AgentConfigPoolStats, [number, AgentConfigPoolStats][]] { + this.logger.trace({ agentKind, agentType }, "Getting pool statistics"); + const pool = this.getAgentTypeVersionSetsArray(agentKind, agentType); + + if (!pool) { + return [{ poolSize: 0, available: 0, active: 0, created: 0 }, []]; + } + + const versionedAgents = pool.map( + ([version, set]) => [version, Array.from(set).map(this.getAgent.bind(this))] as const, + ); + const versions = versionedAgents.map(([version, agents]) => { + const available = agents.filter((agent) => !agent.inUse).length; + const config = this.getAgentConfig(agentKind, agentType, version); + const stats = { + poolSize: config.maxPoolSize, + available, + active: agents.length - available, + created: agents.length, + } satisfies AgentConfigPoolStats; + return [version, stats] as [number, AgentConfigPoolStats]; + }); + + const stats = versions.reduce( + (prev, [, curr]) => { + const sum = { + available: curr.available + prev.available, + created: curr.created + prev.created, + active: curr.active + prev.active, + poolSize: curr.poolSize + prev.poolSize, + } satisfies AgentConfigPoolStats; + return sum; + }, + { + poolSize: 0, + available: 0, + active: 0, + created: 0, + } satisfies AgentConfigPoolStats, + ); + + this.logger.debug({ agentType, ...stats }, "Pool statistics"); + return [stats, versions]; + } + + private getPoolStatsByVersion( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + version: number, + ) { + // FIXME Unoptimized + const [, versions] = this.getPoolStats(agentKind, agentType); + const found = versions.find(([currVersion]) => currVersion === version); + if (!found) { + return { poolSize: 0, available: 0, active: 0, created: 0 }; + } + const [, versionStats] = found; + return versionStats; + } +} diff --git a/src/agents/registry/tool.ts b/src/agents/registry/tool.ts new file mode 100644 index 0000000..db727f4 --- /dev/null +++ b/src/agents/registry/tool.ts @@ -0,0 +1,220 @@ +import { Emitter } from "bee-agent-framework/emitter/emitter"; +import { + BaseToolOptions, + JSONToolOutput, + Tool, + ToolEmitter, + ToolInput, +} from "bee-agent-framework/tools/base"; +import { z } from "zod"; +import { AgentInstanceRef, AgentRegistry } from "./registry.js"; +import { + Agent, + AgentConfig, + AgentConfigPoolStats, + AgentConfigSchema, + AgentKindEnumSchema, + AvailableTool, +} from "./dto.js"; + +export const TOOL_NAME = "agent_registry"; +export interface AgentRegistryToolInput extends BaseToolOptions { + registry: AgentRegistry; +} + +export type AgentRegistryToolResultData = + | string[] + | void + | AgentConfig + | string + | Agent[] + | AgentConfig[] + | Agent + | [AgentConfigPoolStats, [number, AgentConfigPoolStats][]] + | AgentInstanceRef + | AvailableTool[]; + +export interface AgentRegistryToolResult { + method: string; + success: boolean; + data: AgentRegistryToolResultData; +} + +export const GetAvailableToolsSchema = z + .object({ + method: z.literal("getAvailableTools"), + agentKind: AgentKindEnumSchema.default(AgentKindEnumSchema.enum.operator).describe( + "Kind of an agent.", + ), + }) + .describe( + "Get all available tools usable in agents. Use this always before try to assign any tool.", + ); + +export const CreateAgentConfigSchema = z + .object({ + method: z.literal("createAgentConfig"), + agentKind: z.literal(AgentKindEnumSchema.Enum.operator), + config: AgentConfigSchema.omit({ + agentKind: true, + agentConfigId: true, + agentConfigVersion: true, + }), + }) + .describe("Create a new agent configuration."); + +export const UpdateAgentConfigSchema = z + .object({ + method: z.literal("updateAgentConfig"), + agentKind: z.literal(AgentKindEnumSchema.Enum.operator), + agentType: z.string(), + config: AgentConfigSchema.partial().pick({ + instructions: true, + description: true, + tools: true, + autoPopulatePool: true, + maxPoolSize: true, + }), + }) + .describe("Update an existing agent configuration."); + +export const GetAllAgentConfigsSchema = z + .object({ + method: z.literal("getAllAgentConfigs"), + }) + .describe("Get all registered agent configs"); + +export const GetAgentConfigSchema = z + .object({ + method: z.literal("getAgentConfig"), + agentKind: AgentKindEnumSchema, + agentType: z.string(), + }) + .describe("Get latest agent configuration for a specific agent kind and type"); + +export const GetAgentConfigVersionSchema = z + .object({ + method: z.literal("getAgentConfigVersion"), + agentKind: AgentKindEnumSchema, + agentType: z.string(), + version: z.number().optional().describe(`Not specified means last version`), + }) + .describe("Get specific version of agent configuration"); + +export const GetActiveAgentsSchema = z + .object({ + method: z.literal("getActiveAgents"), + agentKind: AgentKindEnumSchema, + agentType: z.string(), + agentConfigVersion: z.number().optional().describe(`Not specified means any version`), + }) + .describe("Get all active agent instances"); + +export const GetAgentSchema = z + .object({ + method: z.literal("getAgent"), + agentId: z.string(), + }) + .describe("Get a specific agent instance by ID"); + +export const GetPoolStatsSchema = z + .object({ + method: z.literal("getPoolStats"), + agentKind: AgentKindEnumSchema, + agentType: z.string(), + }) + .describe( + "Get statistics about the agent's pool for a specific agent configuration kind and type", + ); + +/** + * Tool for interacting with the AgentRegistry + * Provides methods for managing agent types, instances, and pools + */ +export class AgentRegistryTool extends Tool< + JSONToolOutput, + AgentRegistryToolInput +> { + name = TOOL_NAME; + description = + "The registry is used for managing AI agent configurations, instances, and agent pools."; + + static { + this.register(); + } + + private registry: AgentRegistry; + + public readonly emitter: ToolEmitter, JSONToolOutput> = + Emitter.root.child({ + namespace: ["tool", "agent_registry"], + creator: this, + }); + + constructor(protected readonly input: AgentRegistryToolInput) { + super(input); + this.registry = input.registry; + } + + inputSchema() { + return z.discriminatedUnion("method", [ + GetAvailableToolsSchema, + CreateAgentConfigSchema, + UpdateAgentConfigSchema, + GetAllAgentConfigsSchema, + GetAgentConfigSchema, + GetAgentConfigVersionSchema, + GetActiveAgentsSchema, + GetAgentSchema, + GetPoolStatsSchema, + ]); + } + + protected async _run(input: ToolInput) { + let data: AgentRegistryToolResultData; + switch (input.method) { + case "getAvailableTools": + data = this.registry.getToolsFactory(input.agentKind || "operator").getAvailableTools(); + break; + case "createAgentConfig": + data = this.registry.createAgentConfig({ ...input.config, agentKind: input.agentKind }); + break; + case "updateAgentConfig": + data = this.registry.updateAgentConfig({ + ...input.config, + agentKind: input.agentKind, + agentType: input.agentType, + }); + break; + case "getAllAgentConfigs": + data = this.registry.getAllAgentConfigs(); + break; + case "getAgentConfig": + data = this.registry.getAgentConfig(input.agentKind, input.agentType); + break; + case "getAgentConfigVersion": + data = this.registry.getAgentConfig(input.agentKind, input.agentType, input.version); + break; + case "getActiveAgents": + data = this.registry.getActiveAgents( + input.agentKind, + input.agentType, + input.agentConfigVersion, + ); + data = data.map((it) => ({ ...it, instance: undefined })); + break; + case "getAgent": + data = this.registry.getAgent(input.agentId); + data = { ...data, instance: undefined }; + break; + case "getPoolStats": + data = this.registry.getPoolStats(input.agentKind, input.agentType); + break; + } + return new JSONToolOutput({ + method: input.method, + success: true, + data, + } satisfies AgentRegistryToolResult); + } +} diff --git a/src/agents/state/builder.ts b/src/agents/state/builder.ts new file mode 100644 index 0000000..8415396 --- /dev/null +++ b/src/agents/state/builder.ts @@ -0,0 +1,409 @@ +import { BaseStateBuilder } from "@/base/state/base-state-builder.js"; +import { agentSomeIdToKindValue, stringToAgentConfig, stringToAgentType } from "../agent-id.js"; +import { + AgentConfig, + AgentConfigIdValue, + AgentConfigPoolStats, + AgentIdValue, + AgentKindEnum, + AgentTypeValue, + AvailableTool, +} from "../registry/dto.js"; +import { + AgentAcquireEvent, + AgentConfigCreateEvent, + AgentConfigDestroyEvent, + AgentConfigUpdateEvent, + AgentCreateEvent, + AgentDestroyEvent, + AgentPoolChangeEvent, + AgentReleaseEvent, + AgentStateDataType, + AgentStateDataTypeSchema, + AvailableToolsEvent, + TaskAssignedEvent, + TaskHistoryEntryEvent, + TaskUnassignedEvent, +} from "./dto.js"; + +// Define update types as const to ensure type safety +export const StateUpdateType = { + AGENT_CONFIG: "agent_config", + AGENT: "agent", + POOL: "pool", + TOOLS: "tools", + ASSIGNMENT: "assignment", + FULL: "full", +} as const; + +// Define the type for the update types +export type StateUpdateType = (typeof StateUpdateType)[keyof typeof StateUpdateType]; + +interface Assignment { + assignmentId: string; + assignmentKind: string; + assignedSince: Date; + data: unknown; + history: unknown[]; +} + +export interface AgentInfo { + agentId: string; + agentConfigId: string; + agentConfigVersion: number; + inUse: boolean; + isDestroyed: boolean; + assignments: Map; +} + +export interface AgentPool { + agentType: AgentTypeValue; + poolStats: AgentConfigPoolStats; + versions: [number, AgentConfigPoolStats][]; +} + +export interface AgentState { + agentConfigs: Map; + agentPools: Map>; + agents: Map; + availableTools: Map; + allAvailableTools: Map; +} + +export class AgentStateBuilder extends BaseStateBuilder< + typeof AgentStateDataTypeSchema, + AgentState +> { + constructor() { + super(AgentStateDataTypeSchema, { + agentConfigs: new Map(), + agentPools: new Map(), + agents: new Map(), + availableTools: new Map(), + allAvailableTools: new Map(), + }); + } + + protected reset(): void { + this.state.agentConfigs.clear(); + this.state.agentPools.clear(); + this.state.agents.clear(); + this.state.availableTools.clear(); + this.state.allAvailableTools.clear(); + } + + protected processStateUpdate(data: AgentStateDataType): void { + switch (data.kind) { + case "agent_config_create": + this.handleAgentConfigCreate(data); + this.emit("state:updated", { + type: StateUpdateType.AGENT_CONFIG, + ids: [data.agentConfigId, data.agentType], + }); + break; + + case "agent_config_update": + this.handleAgentConfigUpdate(data); + this.emit("state:updated", { + type: StateUpdateType.AGENT_CONFIG, + ids: [data.agentConfigId, data.agentType], + }); + break; + + case "agent_config_destroy": + this.handleAgentConfigDestroy(data); + this.emit("state:updated", { + type: StateUpdateType.AGENT_CONFIG, + ids: [data.agentConfigId, data.agentType], + }); + break; + + case "pool_change": + this.handlePoolChange(data); + this.emit("state:updated", { + type: StateUpdateType.POOL, + ids: [data.agentTypeId], + }); + break; + + case "available_tools_register": + this.handleAvailableTools(data); + this.emit("state:updated", { + type: StateUpdateType.TOOLS, + ids: [data.agentKindId], + }); + break; + + case "agent_create": + case "agent_acquire": + case "agent_release": + case "agent_destroy": + this.handleAgentLifecycle(data); + this.emit("state:updated", { + type: StateUpdateType.AGENT, + ids: [data.agentId], + }); + break; + + case "assignment_assign": + this.handleAssignmentAssign(data); + this.emit("state:updated", { + type: StateUpdateType.ASSIGNMENT, + ids: [data.agentId, data.assignmentId], + }); + break; + + case "assignment_unassign": + this.handleAssignmentUnassign(data); + this.emit("state:updated", { + type: StateUpdateType.ASSIGNMENT, + ids: [data.agentId, data.assignmentId], + }); + break; + + case "assignment_history_entry": + this.handleAssignmentHistoryEntry(data); + this.emit("state:updated", { + type: StateUpdateType.ASSIGNMENT, + ids: [data.agentId, data.assignmentId], + }); + break; + } + } + + private handleAgentConfigCreate(data: AgentConfigCreateEvent): void { + const { agentType, config } = data; + + // Store the config + this.state.agentConfigs.set(agentType, [config]); + + // Initialize the pool if needed + let pool = this.state.agentPools.get(config.agentKind); + if (!pool) { + pool = new Map(); + this.state.agentPools.set(config.agentKind, pool); + } + + const poolType: AgentPool = { + agentType, + poolStats: { + available: 0, + created: 0, + active: 0, + poolSize: 0, + }, + versions: [], + }; + + pool.set(config.agentType, poolType); + } + + private handleAgentConfigUpdate(data: AgentConfigUpdateEvent): void { + const { agentType, config } = data; + + // Update existing config + const agentConfigVersions = this.state.agentConfigs.get(agentType); + if (!agentConfigVersions) { + throw new Error(`Config versions not found for agent pool type: ${agentType}`); + } + + agentConfigVersions.push(config); + } + + private handleAgentConfigDestroy(data: AgentConfigDestroyEvent): void { + const { agentType } = data; + const agentConfigId = stringToAgentConfig(data.agentConfigId); + + // Remove the config + if (!this.state.agentConfigs.has(agentType)) { + throw new Error(`Agent pool type: ${agentType} was not found for destruction`); + } + this.state.agentConfigs.delete(agentType); + + // Clean up related pool + const agentKindPool = this.state.agentPools.get(agentConfigId.agentKind); + if (agentKindPool) { + agentKindPool.delete(agentConfigId.agentType); + if (agentKindPool.size === 0) { + this.state.agentPools.delete(agentConfigId.agentKind); + } + } + } + + private handlePoolChange(data: AgentPoolChangeEvent): void { + const agentTypeId = stringToAgentType(data.agentTypeId); + const pool = this.state.agentPools.get(agentSomeIdToKindValue(agentTypeId) as AgentKindEnum); + if (!pool) { + throw new Error(`Missing pool for type: ${data.agentTypeId}`); + } + + const poolType = pool.get(agentTypeId.agentType); + if (!poolType) { + throw new Error(`Missing pool type: ${data.agentTypeId}`); + } + + poolType.poolStats = data.poolStats; + poolType.versions = data.versions; + } + + private handleAvailableTools(data: AvailableToolsEvent): void { + this.state.availableTools.set(data.agentKindId, data.availableTools); + + // Update the consolidated tools map + this.state.allAvailableTools.clear(); + Array.from(this.state.availableTools.values()) + .flat() + .forEach((tool) => { + this.state.allAvailableTools.set(tool.toolName, tool); + }); + } + + private handleAgentLifecycle( + data: AgentCreateEvent | AgentAcquireEvent | AgentReleaseEvent | AgentDestroyEvent, + ): void { + const { agentId } = data; + + switch (data.kind) { + case "agent_create": { + if (this.state.agents.has(agentId)) { + throw new Error(`Agent ${agentId} already exists`); + } + + const agentConfigId = stringToAgentConfig(data.agentConfigId); + + this.state.agents.set(agentId, { + agentId, + agentConfigId: data.agentConfigId, + agentConfigVersion: agentConfigId.agentConfigVersion, + inUse: false, + isDestroyed: false, + assignments: new Map(), + }); + break; + } + case "agent_destroy": { + const agent = this.state.agents.get(agentId); + if (!agent) { + throw new Error(`Agent ${agentId} doesn't exist for destroy`); + } + agent.isDestroyed = true; + break; + } + + case "agent_acquire": { + const agent = this.state.agents.get(agentId); + if (!agent) { + throw new Error(`Agent ${agentId} doesn't exist for acquire`); + } + agent.inUse = true; + break; + } + + case "agent_release": { + const agent = this.state.agents.get(agentId); + if (!agent) { + throw new Error(`Agent ${agentId} doesn't exist for release`); + } + agent.inUse = false; + break; + } + } + } + + private handleAssignmentAssign(data: TaskAssignedEvent): void { + const { agentId, assignmentId, assignmentKind, assignedSince, assignment } = data; + + const agent = this.state.agents.get(agentId); + if (!agent) { + throw new Error(`Undefined agent ${agentId}`); + } + + if (agent.assignments.has(assignmentId)) { + throw new Error(`Assignment ${assignmentId} already exists for agent ${agentId}`); + } + + agent.assignments.set(assignmentId, { + assignmentId, + assignmentKind, + assignedSince, + data: assignment, + history: [], + }); + } + + private handleAssignmentUnassign(data: TaskUnassignedEvent): void { + const { agentId, assignmentId } = data; + + const agent = this.state.agents.get(agentId); + if (!agent) { + throw new Error(`Undefined agent ${agentId}`); + } + + if (!agent.assignments.has(assignmentId)) { + throw new Error(`Assignment ${assignmentId} not found for agent ${agentId}`); + } + + agent.assignments.delete(assignmentId); + } + + private handleAssignmentHistoryEntry(data: TaskHistoryEntryEvent): void { + const { agentId, assignmentId, entry } = data; + + const agent = this.state.agents.get(agentId); + if (!agent) { + throw new Error(`Undefined agent ${agentId}`); + } + + const assignment = agent.assignments.get(assignmentId); + if (!assignment) { + throw new Error(`Assignment ${assignmentId} not found for agent ${agentId}`); + } + + assignment.history.push(entry); + } + + getAgent(agentId: string): AgentInfo | undefined { + return this.state.agents.get(agentId); + } + + getAllAgents(): AgentInfo[] { + return Array.from(this.state.agents.values()); + } + + getAgentConfig(agentTypeId: string, agentVersion?: number): AgentConfig | undefined { + const versions = this.state.agentConfigs.get(agentTypeId); + if (!versions) { + throw new Error(`Agent config versions not found for '${agentTypeId}'`); + } + if (agentVersion != null) { + return versions.find((v) => v.agentConfigVersion === agentVersion); + } + return versions.at(-1); + } + + private getAgentPoolsMap(agentKindId: AgentKindEnum): Map | undefined { + return this.state.agentPools.get(agentKindId); + } + + getAgentPool(agentKind: AgentKindEnum, agentType: string): AgentPool | undefined { + const map = this.getAgentPoolsMap(agentKind); + return map?.get(agentType); + } + + getAvailableTools(poolId: string): AvailableTool[] { + return this.state.availableTools.get(poolId) || []; + } + + getAllTools(): Map { + return this.state.allAvailableTools; + } + + getAgentAssignment(agentId: string, assignmentId: string): Assignment | undefined { + const agent = this.state.agents.get(agentId); + return agent?.assignments.get(assignmentId); + } + + getAgentAssignments(agentId: string): Map | undefined { + return this.state.agents.get(agentId)?.assignments; + } +} diff --git a/src/agents/state/dto.ts b/src/agents/state/dto.ts new file mode 100644 index 0000000..e08dd8c --- /dev/null +++ b/src/agents/state/dto.ts @@ -0,0 +1,170 @@ +import { TaskRunHistoryEntrySchema, TaskRunSchema } from "@/tasks/manager/dto.js"; +import { z } from "zod"; +import { + AgentConfigSchema, + AvailableToolSchema, + AgentConfigPoolStatsSchema, + AgentConfigIdValueSchema, + AgentTypeValueSchema, +} from "../registry/dto.js"; +import { DateStringSchema } from "@/base/dto.js"; + +// Base schemas +export const AgentEventKindEnum = z.enum([ + "available_tools_register", + "agent_config_create", + "agent_config_update", + "agent_config_destroy", + "pool_change", + "agent_create", + "agent_acquire", + "agent_release", + "agent_destroy", + "assignment_assign", + "assignment_unassign", + "assignment_history_entry", +]); + +export const BaseAgentEventSchema = z.object({ + kind: AgentEventKindEnum, +}); + +// Agent Config Events +export const BaseAgentConfigLifecycleEventSchema = BaseAgentEventSchema.extend({ + agentConfigId: AgentConfigIdValueSchema, + agentType: AgentTypeValueSchema, +}); +export type AgentConfigLifecycleEvent = z.infer; + +export const AgentConfigCreateEventSchema = BaseAgentConfigLifecycleEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.agent_config_create), + config: AgentConfigSchema, +}); +export type AgentConfigCreateEvent = z.infer; + +export const AgentConfigUpdateEventSchema = BaseAgentConfigLifecycleEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.agent_config_update), + config: AgentConfigSchema, +}); +export type AgentConfigUpdateEvent = z.infer; + +export const AgentConfigDestroyEventSchema = BaseAgentConfigLifecycleEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.agent_config_destroy), +}); +export type AgentConfigDestroyEvent = z.infer; + +// Agent Lifecycle Events +export const BaseAgentLifecycleEventSchema = BaseAgentEventSchema.extend({ + agentId: z.string(), +}); +export type AgentLifecycleEvent = z.infer; + +export const AgentCreateEventSchema = BaseAgentLifecycleEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.agent_create), + agentConfigId: z.string(), +}); +export type AgentCreateEvent = z.infer; + +export const AgentAcquireEventSchema = BaseAgentLifecycleEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.agent_acquire), +}); +export type AgentAcquireEvent = z.infer; + +export const AgentReleaseEventSchema = BaseAgentLifecycleEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.agent_release), +}); +export type AgentReleaseEvent = z.infer; + +export const AgentDestroyEventSchema = BaseAgentLifecycleEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.agent_destroy), +}); +export type AgentDestroyEvent = z.infer; + +// Assignment Events +export const AssignmentKindEnum = z.enum(["task"]); + +export const BaseAssignmentEventSchema = BaseAgentEventSchema.extend({ + agentId: z.string(), + assignmentId: z.string(), + assignmentKind: AssignmentKindEnum, +}); +export type BaseAssignmentEvent = z.infer; + +export const AssignedEventSchema = (assignmentSchema: TAssignment) => + BaseAssignmentEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.assignment_assign), + assignedSince: DateStringSchema, + assignment: assignmentSchema, + }); +export type AssignedEvent = z.infer< + ReturnType> +>; + +export const UnassignedEventSchema = BaseAssignmentEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.assignment_unassign), + unassignedAt: DateStringSchema, +}); +export type UnassignedEvent = z.infer; + +export const HistoryEntryCreateEventSchema = ( + historyEntrySchema: THistoryEntry, +) => + BaseAssignmentEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.assignment_history_entry), + entry: historyEntrySchema, + }); +export type HistoryEntryCreateEvent = z.infer< + ReturnType> +>; + +// Task-specific Assignment Events +export const TaskAssignedEventSchema = AssignedEventSchema(TaskRunSchema).extend({ + assignmentKind: z.literal(AssignmentKindEnum.enum.task), +}); +export type TaskAssignedEvent = z.infer; + +export const TaskUnassignedEventSchema = UnassignedEventSchema.extend({ + assignmentKind: z.literal(AssignmentKindEnum.enum.task), +}); +export type TaskUnassignedEvent = z.infer; + +export const TaskHistoryEntryEventSchema = HistoryEntryCreateEventSchema( + TaskRunHistoryEntrySchema, +).extend({ + assignmentKind: z.literal(AssignmentKindEnum.enum.task), +}); +export type TaskHistoryEntryEvent = z.infer; + +// Available Tools Events +export const AvailableToolsEventSchema = BaseAgentEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.available_tools_register), + agentKindId: z.string(), + availableTools: z.array(AvailableToolSchema), +}); +export type AvailableToolsEvent = z.infer; + +// Pool Events +export const AgentPoolChangeEventSchema = BaseAgentEventSchema.extend({ + kind: z.literal(AgentEventKindEnum.enum.pool_change), + agentTypeId: z.string(), + poolStats: AgentConfigPoolStatsSchema, + versions: z.array(z.tuple([z.number(), AgentConfigPoolStatsSchema])), +}); +export type AgentPoolChangeEvent = z.infer; + +// Union of all event types +export const AgentStateDataTypeSchema = z.discriminatedUnion("kind", [ + AvailableToolsEventSchema, + AgentConfigCreateEventSchema, + AgentConfigUpdateEventSchema, + AgentConfigDestroyEventSchema, + AgentCreateEventSchema, + AgentAcquireEventSchema, + AgentReleaseEventSchema, + AgentDestroyEventSchema, + AgentPoolChangeEventSchema, + TaskAssignedEventSchema, + TaskUnassignedEventSchema, + TaskHistoryEntryEventSchema, +]); +export type AgentStateDataType = z.infer; diff --git a/src/agents/state/logger.ts b/src/agents/state/logger.ts new file mode 100644 index 0000000..c5e68a1 --- /dev/null +++ b/src/agents/state/logger.ts @@ -0,0 +1,163 @@ +import { BaseStateLogger } from "../../base/state/base-state-logger.js"; +import { + AgentAcquireEvent, + AgentConfigCreateEvent, + AgentConfigDestroyEvent, + AgentConfigUpdateEvent, + AgentCreateEvent, + AgentDestroyEvent, + AgentEventKindEnum, + AgentPoolChangeEvent, + AgentReleaseEvent, + AgentStateDataTypeSchema, + AssignmentKindEnum, + AvailableToolsEvent, + TaskAssignedEvent, + TaskHistoryEntryEvent, + TaskUnassignedEvent, +} from "./dto.js"; + +export const DEFAULT_NAME = "agent_state"; +export const DEFAULT_PATH = ["logs"] as readonly string[]; + +export class AgentStateLogger extends BaseStateLogger { + private static instance?: AgentStateLogger; + + static init() { + if (this.instance) { + throw new Error(`Agent state logger is already initialized`); + } + this.instance = new AgentStateLogger(); + return this.instance; + } + + static getInstance() { + if (!this.instance) { + throw new Error(`Agent state logger wasn't initialized yet`); + } + return this.instance; + } + + constructor(logPath?: string) { + super(DEFAULT_PATH, DEFAULT_NAME, logPath); + } + + public logAvailableTools(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.enum.available_tools_register, + ...data, + }, + }); + } + + public logAgentConfigCreate(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.Values.agent_config_create, + ...data, + }, + }); + } + + public logAgentConfigUpdate(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.Values.agent_config_update, + ...data, + }, + }); + } + + public logAgentConfigDestroy(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.Values.agent_config_destroy, + ...data, + }, + }); + } + + public logAgentCreate(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.enum.agent_create, + ...data, + }, + }); + } + + public logAgentAcquire(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.enum.agent_acquire, + ...data, + }, + }); + } + + public logAgentRelease(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.enum.agent_release, + ...data, + }, + }); + } + + public logAgentDestroy(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.enum.agent_destroy, + ...data, + }, + }); + } + + public logPoolChange(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.Values.pool_change, + ...data, + }, + }); + } + + public logTaskAssigned(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.Values.assignment_assign, + assignmentKind: AssignmentKindEnum.enum.task, + ...data, + }, + }); + } + + public logTaskUnassigned(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.enum.assignment_unassign, + assignmentKind: AssignmentKindEnum.enum.task, + ...data, + }, + }); + } + + public logTaskHistoryEntry(data: Omit) { + this.logUpdate({ + data: { + kind: AgentEventKindEnum.enum.assignment_history_entry, + assignmentKind: AssignmentKindEnum.Values.task, + ...data, + }, + }); + } +} + +export function init() { + return AgentStateLogger.init(); +} + +export function instance() { + return AgentStateLogger.getInstance(); +} diff --git a/src/agents/supervisor.ts b/src/agents/supervisor.ts index fb56250..bb494b1 100644 --- a/src/agents/supervisor.ts +++ b/src/agents/supervisor.ts @@ -1,8 +1,9 @@ -import { BaseToolsFactory, ToolFactoryMethod } from "src/base/tools-factory.js"; -import { TaskManager } from "src/tasks/task-manager.js"; -import { TaskManagerTool, TOOL_NAME as taskManagerToolName } from "src/tasks/tool.js"; -import { AgentRegistry } from "./agent-registry.js"; -import { AgentRegistryTool, TOOL_NAME as agentRegistryToolName } from "./tool.js"; +import { TaskManager } from "@tasks/manager/manager.js"; +import { TaskManagerTool, TOOL_NAME as taskManagerToolName } from "@tasks/tool.js"; +import { WorkspaceManager } from "@workspaces/manager/manager.js"; +import { BaseToolsFactory, ToolFactoryMethod } from "@/base/tools-factory.js"; +import { AgentRegistry } from "./registry/index.js"; +import { AgentRegistryTool, TOOL_NAME as agentRegistryToolName } from "./registry/tool.js"; export enum AgentTypes { BOSS = "boss", @@ -12,69 +13,93 @@ export const SUPERVISOR_INSTRUCTIONS = ( agentKind: string, agentType: string, agentId: string, -) => `You are an AI Coordinator (agentKind: ${agentKind}, agentType: ${agentType}, agentId: ${agentId}) responsible for managing agent deployment and task execution across the system. You work with two primary systems: -- ${agentRegistryToolName}: Manages the pool of AI agents -- ${taskManagerToolName}: Handles task creation and execution +) => `You are a supervisor AI assistant (ID:${agentId}) who manages a multi-agent platform that consisted of two main systems: agent registry and task manager. +* **Agent registry** (tool:${agentRegistryToolName}) + * Serves to manage agents. + * Agent means in this context an umbrella name for agent configuration aka agent config and their instances aka agents. + * Agent config is a general definition of particular sort of agent instructed to solve a particular sort of tasks like an agent 'poem_generator' configured to generate poem on some topic (passed by task input). + * Agent config is a template for agent instances. Agent is an actual instance of an agent config. + * Agent config instructions is the core part of the agent setting it should be natural language text structured in the following format: + * Instructions should consists of three paragraphs **Context**, **Objective** and **Response format** + * **Context** This paragraph gives background information to help understand the situation. It includes key details, constraints, and relevant knowledge to ensure clarity and consistency. + * **Objective** This paragraph explains the main goal and what needs to be achieved. It sets clear expectations and guidelines to ensure a focused and structured approach. + * **Response format** This paragraph defines the expected structure and style of the response. It ensures consistency and alignment with the intended purpose by specifying format rules, length, organization, or stylistic elements. The response format may include fixed structures (e.g., syllable patterns, rhyme schemes) or flexible guidelines depending on the task requirements. + * Example: + You generate poems on a given topic. The topic will be provided as user input. + + The goal is to produce a well-crafted poem that aligns with the given topic and adheres to any specified constraints. The poem should be engaging, thematically consistent, and exhibit a clear structure. It should creatively explore the subject while demonstrating linguistic elegance, rhythm, and flow. If no constraints are provided, it should default to a balanced poetic form that enhances readability and aesthetic appeal. -The system automatically assigns agents from ${agentRegistryToolName} to tasks in ${taskManagerToolName} based on agent type and kind requirements. + The poem should have 4 stanzas with 4 lines each. The first paragraph of the instructions should provide background information on the topic, the second paragraph should explain the main goal and what needs to be achieved, and the third paragraph should define the expected structure and style of the response. + * Agent configs are divided into two main groups by agent kind: + * **supervisor** + * Agents like you who are able to manage multi-agent platform. + * **operator** + * Agents who serves to complete tasks. + * Each agent config has own unique agent type that corresponds to their purpose like 'poem_generator' who is an agent dedicated to generate poems task. + * Each agent has an unique ID composed of '{agentKind}:{agentType}[{instanceNum}]:{version}' like 'supervisor:boss[1]:1' or 'operator:poem_generator[2]:3'. + * ** Agent pool ** + * Each agent configuration automatically creates a pool of agent instances based on parameters of the pool setting. + * These agent instances are then available to be assigned to a related task. + * Each agent instance can work on exactly one task at time. If there is no enough instances to work on scheduled tasks you can extend the pool size or on the other hand, if there is many unused agent instance for long time, to shrink it. + * ** Remember ** + * Before creating a new agent config, you should check whether an existing agent config with the same functionality already exists (use function to list all configs). If it does, use it instead of creating a new one. However, be cautious when updating it—its purpose should not change, as there may be dependencies that rely on its original function. +* **Task manager** (tool:${taskManagerToolName}). + * Serves to manage tasks. + * Task means in this context an umbrella name for task configuration aka task config and their instances aka task runs. + * Task config is a general definition of particular sort of task that should solve some particular sort of problems like a task to generate poem on some topic like 'poem_generation' instead of task config to generate poem on specific topic like 'poem_love_generation'. + * Task config is a template for a task run. Task run is an actual instance of a task config. + * Each task config has own unique task type that corresponds to their purpose like 'poem_generation' which is a task dedicated to generate poems on some topic. The topic will be provided to the task run during instantiation like input:'black cat' to the task run instantiated from 'poem_generation' task config. + * Each task config is always assigned to the one specific agent config without version specification in this format '{agentKind}:{agentType}' like 'operator:poem_generator' that means when the task will run it will be assigned to the agent of 'operator' kind and 'poem_generator' type in the latest version. + * Each task run has an unique ID composed of 'task:{taskType}[{instanceNum}]:{version}' like 'task:poem_generation[1]:1' or 'task:text_summarization[2]:3'. + * Exclusive concurrency mode should be used only for tasks that should not run simultaneously, such as when multiple instances would compete for the same database resources, potentially causing deadlocks and slowing down the overall process. + * ** Task pool ** + * Task pool is different from agent pool because it doesn't auto-instantiate tasks it would be pointless because tasks need a specific input when they are instantiated and we don't know him ahead. + * Task pool also doesn't have pool size limit because tasks existence is not resource-intensive they can stay there until some agent is ready to execute it. + * ** Remember ** + * Before creating a new task config, you should check whether an existing task config with the same functionality already exists (use function to list all configs). If it does, use it instead of creating a new one. However, be cautious when updating it—its purpose should not change, as there may be dependencies that rely on its original function. +* **Task-agent relation** + * Task configs are assigned to the agent configs which secures that if task run is created it is put to the task pool and the platform will care about its assignment to the specific instance of the relevant agent. If the pool of relevant agent has an available agent it auto-assign him to the task run if not the task run will be wait until some will be available. -## Core Responsibilities +Your primary mission is to assist the user in achieving their goals, whether through direct conversation or by orchestrating tasks within the system. You must recognize when a task should be created and when it is unnecessary, ensuring that existing tasks and agents are utilized efficiently before initiating new ones. Task execution drives the platform—before creating a task, verify that a similar one does not already exist, and before creating an agent, ensure there is a task that necessitates it. Your role is to plan, coordinate, and optimize task execution, ensuring a seamless and intelligent workflow. -1. Agent Type Management - - Create appropriate agent types before task execution - - Configure each agent type with: - - Essential tools only (verified for availability) - - Each agent has llm capabilities so they don't need an extra tool for tasks like generation, summarization etc. - - Detailed step-by-step instructions - - Clear output format requirements - - Specific tool usage guidelines - - Set optimal pool size based on expected task parallelization needs - -2. Task Management - - Explicitly start tasks using appropriate functions - - Scheduling doesn't automatically run the task. - - Ensure each task has a clearly defined topic and purpose - - Monitor task status and execution details - - Verify task completion and agent release back to the pool - -## System Workflow -1. Agent Lifecycle: - - Agents are automatically assigned from pool when tasks start - - Agents return to pool upon task completion or failure - -2. Task Lifecycle: - - Task creation requires valid agent type - - Task execution triggers automatic agent assignment - - Task completion triggers automatic agent release - -## Best Practices -1. Pre-execution Verification - - Confirm entity existence before task/agent operations - - Validate tool availability for agent types - - Verify pool capacity for parallel execution - -2. Resource Optimization - - Maintain appropriate pool sizes - - Monitor agent utilization - - Ensure efficient task distribution - -## Notes -- Never use your capabilities on tasks intended to another agent. - -Your primary goal is to maximize system efficiency through proper agent coordination and resource management while maintaining system integrity and control.`; +REMEMBER: You should not solve tasks directly on your own but through specialized agents and their assigned tasks.`; export class ToolsFactory extends BaseToolsFactory { constructor( protected registry: AgentRegistry, protected taskManager: TaskManager, + protected workdir: string, ) { super(); } - getFactoriesMethods(): ToolFactoryMethod[] { + async getFactoriesMethods(): Promise { return [ () => new AgentRegistryTool({ registry: this.registry }), () => new TaskManagerTool({ taskManager: this.taskManager }), ]; } } + +export class Workdir { + static path = ["workdir"] as const; + + static getWorkdirPath() { + const workdirPath = WorkspaceManager.getInstance().getWorkspacePath( + Workdir.getWorkspacePathInput(), + ); + + return workdirPath; + } + + private static getWorkspacePathInput() { + return { + kind: "directory", + path: Workdir.path, + } as const; + } + + static registerWorkdir(supervisorId: string) { + WorkspaceManager.getInstance().registerResource(Workdir.getWorkspacePathInput(), supervisorId); + } +} diff --git a/src/agents/tool.ts b/src/agents/tool.ts deleted file mode 100644 index 86fd594..0000000 --- a/src/agents/tool.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { Emitter } from "bee-agent-framework/emitter/emitter"; -import { - BaseToolOptions, - JSONToolOutput, - Tool, - ToolEmitter, - ToolInput, -} from "bee-agent-framework/tools/base"; -import { z } from "zod"; -import { - Agent, - AgentConfig, - AgentConfigSchema, - AgentInstanceRef, - AgentKindSchema, - AgentRegistry, - AvailableTool, - PoolStats, -} from "./agent-registry.js"; - -export const TOOL_NAME = "agent_registry"; - -export interface AgentRegistryToolInput extends BaseToolOptions { - registry: AgentRegistry; -} - -export type AgentRegistryToolResultData = - | string[] - | void - | AgentConfig - | string - | Agent[] - | Agent - | PoolStats - | AgentInstanceRef - | AvailableTool[]; - -export interface AgentRegistryToolResult { - method: string; - success: boolean; - data: AgentRegistryToolResultData; -} - -export const GetAvailableToolsSchema = z - .object({ - method: z.literal("getAvailableTools"), - agentKind: AgentKindSchema.describe("Kind of agent is mandatory."), - }) - .describe("Get all available tools usable in agents"); - -export const RegisterAgentTypeSchema = z - .object({ - method: z.literal("registerAgentType"), - agentKind: z.literal(AgentKindSchema.Enum.operator), - config: AgentConfigSchema.omit({ - kind: true, - }), - }) - .describe("Register a new agent type with its configuration."); - -export const GetAgentTypesSchema = z - .object({ - method: z.literal("getAgentTypes"), - }) - .describe("Get all registered agent types"); - -export const GetAgentTypeConfigSchema = z - .object({ - method: z.literal("getAgentTypeConfig"), - agentKind: AgentKindSchema, - type: z.string(), - }) - .describe("Get configuration for a specific agent type"); - -export const DestroyAgentSchema = z - .object({ - method: z.literal("destroyAgent"), - agentId: z.string(), - }) - .describe("Destroy an existing agent instance"); - -export const GetActiveAgentsSchema = z - .object({ - method: z.literal("getActiveAgents"), - }) - .describe("Get all active agent instances"); - -export const GetAgentSchema = z - .object({ - method: z.literal("getAgent"), - agentId: z.string(), - }) - .describe("Get a specific agent instance by ID"); - -export const GetPoolStatsSchema = z - .object({ - method: z.literal("getPoolStats"), - agentKind: AgentKindSchema, - type: z.string(), - }) - .describe("Get statistics about the agent pool for a specific type"); - -/** - * Tool for interacting with the AgentRegistry - * Provides methods for managing agent types, instances, and pools - */ -export class AgentRegistryTool extends Tool< - JSONToolOutput, - AgentRegistryToolInput -> { - name = TOOL_NAME; - description = - "The registry is used for managing AI agent configurations, instances, and agent pools."; - - static { - this.register(); - } - - private registry: AgentRegistry; - - public readonly emitter: ToolEmitter, JSONToolOutput> = - Emitter.root.child({ - namespace: ["tool", "agent_registry"], - creator: this, - }); - - constructor(protected readonly input: AgentRegistryToolInput) { - super(input); - this.registry = input.registry; - } - - inputSchema() { - return z.discriminatedUnion("method", [ - GetAvailableToolsSchema, - RegisterAgentTypeSchema, - GetAgentTypesSchema, - GetAgentTypeConfigSchema, - DestroyAgentSchema, - GetActiveAgentsSchema, - GetAgentSchema, - GetPoolStatsSchema, - ]); - } - - protected async _run(input: ToolInput) { - let data: AgentRegistryToolResultData; - switch (input.method) { - case "getAvailableTools": - data = this.registry.getToolsFactory(input.agentKind).getAvailableTools(); - break; - case "registerAgentType": - data = this.registry.registerAgentType({ ...input.config, kind: input.agentKind }); - break; - case "getAgentTypes": - data = this.registry.getAgentTypes(); - break; - case "getAgentTypeConfig": - data = this.registry.getAgentTypeConfig(input.agentKind, input.type); - break; - case "destroyAgent": - data = await this.registry.destroyAgent(input.agentId); - break; - case "getActiveAgents": - data = this.registry.getActiveAgents(); - data = data.map((it) => ({ ...it, instance: undefined })); - break; - case "getAgent": - data = this.registry.getAgent(input.agentId); - data = { ...data, instance: undefined }; - break; - case "getPoolStats": - data = this.registry.getPoolStats(input.agentKind, input.type); - break; - } - return new JSONToolOutput({ - method: input.method, - success: true, - data, - } satisfies AgentRegistryToolResult); - } -} diff --git a/src/base/dto.ts b/src/base/dto.ts new file mode 100644 index 0000000..3526573 --- /dev/null +++ b/src/base/dto.ts @@ -0,0 +1,3 @@ +import { z } from "zod"; + +export const DateStringSchema = z.union([z.string().transform((str) => new Date(str)), z.date()]); diff --git a/src/base/entity-id.ts b/src/base/entity-id.ts new file mode 100644 index 0000000..8e6d32b --- /dev/null +++ b/src/base/entity-id.ts @@ -0,0 +1,198 @@ +// Base entity ID interfaces +export interface EntityKindId { + kind: TKind; +} + +export interface EntityTypeId extends EntityKindId { + type: string; +} + +// Version can exist without a number +export interface EntityVersionId extends EntityTypeId { + version: number; +} + +// Number is optional and can be combined with version +export interface EntityNumId extends EntityTypeId { + num: number; +} + +export interface EntityVersionNumId extends EntityVersionId { + num: number; +} + +// Type guards +export function hasType(entity: EntityKindId): entity is EntityTypeId { + return "type" in entity; +} + +export function hasNum( + entity: EntityKindId, +): entity is EntityNumId | EntityVersionNumId { + return "num" in entity; +} + +export function hasVersion( + entity: EntityKindId, +): entity is EntityVersionId | EntityVersionNumId { + return "version" in entity; +} + +// Base string conversion functions +function kindString(entity: EntityKindId): string { + return `${entity.kind}`; +} + +function typeString(entity: EntityTypeId): string { + return `${entity.type}`; +} + +function versionString(version: number): string { + return `${version}`; +} + +function numString(num: number): string { + return `[${num}]`; +} + +// Specific entity to string conversions +export function entityToKindString(entity: EntityKindId): string { + return kindString(entity); +} + +export function entityToTypeIdString(entity: EntityTypeId): string { + return `${kindString(entity)}:${typeString(entity)}`; +} + +export function entityToVersionIdString(entity: EntityVersionId): string { + return `${entityToTypeIdString(entity)}:${versionString(entity.version)}`; +} + +export function entityToNumIdString(entity: EntityNumId): string { + return `${entityToTypeIdString(entity)}${numString(entity.num)}`; +} + +export function entityToVersionNumIdString(entity: EntityVersionNumId): string { + return `${entityToTypeIdString(entity)}${numString(entity.num)}:${versionString(entity.version)}`; +} + +// Generic toString that handles any entity type and outputs full string +export function entityToString( + entity: + | EntityKindId + | EntityTypeId + | EntityVersionId + | EntityNumId + | EntityVersionNumId, +): string { + if (hasVersion(entity) && hasNum(entity)) { + return entityToVersionNumIdString(entity as EntityVersionNumId); + } + if (hasVersion(entity)) { + return entityToVersionIdString(entity as EntityVersionId); + } + if (hasNum(entity)) { + return entityToNumIdString(entity as EntityNumId); + } + if (hasType(entity)) { + return entityToTypeIdString(entity); + } + return entityToKindString(entity); +} + +// Generic parsing functions +export function stringToEntityKind( + str: string, + kindValidator: (kind: string) => TKind, +): EntityKindId { + return { + kind: kindValidator(str), + }; +} + +export function stringToEntityType( + str: string, + kindValidator: (kind: string) => TKind, +): EntityTypeId { + const [kind, type] = str.split(":"); + if (!type) { + throw new Error(`Invalid entity type ID format: ${str}`); + } + + return { + kind: kindValidator(kind), + type, + }; +} + +export function stringToEntityVersion( + str: string, + kindValidator: (kind: string) => TKind, +): EntityVersionId { + let kindPart: string; + let typePart: string; + let version: string; + const kindTypeParts = []; + const splitted = str.split(":"); + if (splitted.length > 2) { + [kindPart, typePart, version] = splitted; + kindTypeParts.push(kindPart, typePart); + } else { + [typePart, version] = splitted; + kindTypeParts.push(typePart); + } + + if (!version) { + throw new Error(`Invalid entity version ID format: ${str}`); + } + + const typeId = stringToEntityType(kindTypeParts.join(":"), kindValidator); + return { + ...typeId, + version: parseInt(version, 10), + }; +} + +export function stringToEntityNum( + str: string, + kindValidator: (kind: string) => TKind, +): EntityNumId { + const match = str.match(/^(.*?)\[(\d+)\]$/); + if (!match) { + throw new Error(`Invalid entity num ID format: ${str}`); + } + + const typeId = stringToEntityType(match[1], kindValidator); + return { + ...typeId, + num: parseInt(match[2], 10), + }; +} + +export function stringToEntityVersionNum( + str: string, + kindValidator: (kind: string) => TKind, +): EntityVersionNumId { + let kindPart: string; + let typePart: string; + let version: string; + const kindTypeParts = []; + const splitted = str.split(":"); + if (splitted.length > 2) { + [kindPart, typePart, version] = splitted; + kindTypeParts.push(kindPart, typePart); + } else { + [typePart, version] = splitted; + kindTypeParts.push(typePart); + } + + if (!version) { + throw new Error(`Invalid entity version num ID format: ${str}`); + } + + const numId = stringToEntityNum(kindTypeParts.join(":"), kindValidator); + return { + ...numId, + version: parseInt(version, 10), + }; +} diff --git a/src/base/state/base-state-builder.ts b/src/base/state/base-state-builder.ts new file mode 100644 index 0000000..cfd019e --- /dev/null +++ b/src/base/state/base-state-builder.ts @@ -0,0 +1,242 @@ +import { EventEmitter } from "events"; +import { createReadStream, FSWatcher, watch, statSync } from "fs"; +import { createInterface } from "readline"; +import { z } from "zod"; +import { LogInitSchema } from "./dto.js"; + +export interface StateUpdateEvent { + type: string; + ids?: string[]; +} + +interface StateBuilderEvents { + "log:reset": () => void; + "log:new_line": (line: string) => void; + "state:updated": (update: StateUpdateEvent) => void; + "error": (error: Error) => void; +} + +export abstract class BaseStateBuilder< + TSchema extends z.ZodType, + TState extends Record, +> extends EventEmitter { + protected state: TState; + private readonly updateSchema: z.ZodObject<{ + timestamp: z.ZodString; + data: TSchema; + }>; + private watcher: FSWatcher | null = null; + private currentPosition = 0; + private lastKnownSize = 0; + private isProcessing = false; + private processingQueue: (() => Promise)[] = []; + private isWatching = false; + + constructor( + protected readonly dataSchema: TSchema, + initialState: TState, + ) { + super(); + this.state = initialState; + this.updateSchema = z.object({ + timestamp: z.string(), + data: this.dataSchema, + }); + } + + public on(event: K, listener: StateBuilderEvents[K]): this { + return super.on(event, listener); + } + + public emit( + event: K, + ...args: Parameters + ): boolean { + return super.emit(event, ...args); + } + + public getState(): TState { + return this.state; + } + + private async processNextInQueue(): Promise { + if (this.isProcessing || this.processingQueue.length === 0) { + return; + } + + this.isProcessing = true; + try { + const nextProcess = this.processingQueue.shift(); + if (nextProcess) { + await nextProcess(); + } + } finally { + this.isProcessing = false; + if (this.processingQueue.length > 0) { + await this.processNextInQueue(); + } + } + } + + private queueProcess(process: () => Promise): void { + this.processingQueue.push(process); + if (!this.isProcessing) { + this.processNextInQueue().catch((error) => { + this.emit("error", new Error(`Queue processing error: ${error.message}`)); + }); + } + } + + public async watchLogFile(filePath: string): Promise { + if (this.isWatching) { + throw new Error("Already watching a file"); + } + + try { + this.isWatching = true; + + // Get initial file size + const stats = statSync(filePath); + this.lastKnownSize = stats.size; + + // Initial read of the entire file + await this.processEntireFile(filePath); + + // Set up file watcher + this.watcher = watch(filePath, { persistent: true }, async (eventType) => { + if (eventType === "change") { + this.queueProcess(async () => { + const currentStats = statSync(filePath); + const currentSize = currentStats.size; + + // Check if file was truncated + if (currentSize < this.lastKnownSize) { + // File was truncated, reset position and process entire file + this.currentPosition = 0; + await this.processEntireFile(filePath); + } else { + // Normal append case + await this.processFileChanges(filePath); + } + + this.lastKnownSize = currentSize; + }); + } + }); + + this.watcher.on("error", (error) => { + this.emit("error", new Error(`File watch error: ${error.message}`)); + }); + } catch (error) { + this.isWatching = false; + if (error instanceof Error) { + this.emit("error", new Error(`Failed to start file watching: ${error.message}`)); + } + throw error; + } + } + + public stopWatching(): void { + if (this.watcher) { + this.watcher.close(); + this.watcher = null; + } + this.isWatching = false; + this.processingQueue = []; + } + + private async processEntireFile(filePath: string): Promise { + try { + // Reset state before processing entire file + this.reset(); + + const fileStream = createReadStream(filePath); + const rl = createInterface({ + input: fileStream, + crlfDelay: Infinity, + }); + + this.currentPosition = 0; + + for await (const line of rl) { + this.currentPosition += Buffer.byteLength(line) + 1; // +1 for newline + await this.processLogLine(line); + } + + // Emit state update after processing entire file + this.emit("state:updated", { type: "full" }); + } catch (error) { + if (error instanceof Error) { + this.emit("error", new Error(`Failed to process entire file: ${error.message}`)); + } + throw error; + } + } + + private async processFileChanges(filePath: string): Promise { + try { + const fileStream = createReadStream(filePath, { + start: this.currentPosition, + }); + + const rl = createInterface({ + input: fileStream, + crlfDelay: Infinity, + }); + + let hasUpdates = false; + for await (const line of rl) { + this.currentPosition += Buffer.byteLength(line) + 1; // +1 for newline + await this.processLogLine(line); + hasUpdates = true; + } + + if (hasUpdates) { + this.emit("state:updated", { type: "full" }); + } + } catch (error) { + if (error instanceof Error) { + this.emit("error", new Error(`Failed to process file changes: ${error.message}`)); + } + throw error; + } + } + + private async processLogLine(line: string): Promise { + this.emit("log:new_line", line); + try { + let parsed: unknown; + try { + parsed = JSON.parse(line); + } catch (e) { + console.error(e); + this.emit("error", new Error(`Failed to parse JSON: ${line}`)); + return; + } + + // Try parsing as init log first + const initResult = LogInitSchema.safeParse(parsed); + if (initResult.success) { + this.reset(); + this.emit("log:reset"); + return; + } + + // If not init log, try parsing as update + const updateResult = this.updateSchema.safeParse(parsed); + if (updateResult.success) { + this.processStateUpdate(updateResult.data.data); + return; + } + + this.emit("error", new Error(`Invalid log entry - neither init nor update: ${line}`)); + } catch (error) { + if (error instanceof Error) { + this.emit("error", new Error(`Failed to process log line: ${error.message}`)); + } + } + } + + protected abstract processStateUpdate(data: z.infer): void; + protected abstract reset(): void; +} diff --git a/src/base/state/base-state-logger.ts b/src/base/state/base-state-logger.ts new file mode 100644 index 0000000..25bda56 --- /dev/null +++ b/src/base/state/base-state-logger.ts @@ -0,0 +1,49 @@ +import { appendFileSync, copyFileSync, existsSync, truncateSync, writeFileSync } from "fs"; +import { join } from "path"; +import { z } from "zod"; +import { LogInit, LogUpdate } from "./dto.js"; + +export class BaseStateLogger { + protected logPath: string; + + constructor(logFileDefaultPath: readonly string[], logFileDefaultName: string, logPath?: string) { + if (!logPath) { + this.logPath = join(process.cwd(), ...logFileDefaultPath, `${logFileDefaultName}.log`); + } else { + this.logPath = logPath; + } + this.rotateLogFileIfExists(); + this.logInit(); + } + + private rotateLogFileIfExists(): void { + if (existsSync(this.logPath)) { + // Generate timestamp for the backup file + const timestamp = new Date() + .toISOString() + .replace(/:/g, "-") // Replace colons with dashes for file name compatibility + .replace(/\./g, "-"); // Replace dots with dashes + + // Create backup file path + const backupPath = this.logPath.replace(".log", `.${timestamp}.log`); + + // Copy existing file to backup + copyFileSync(this.logPath, backupPath); + + // Clear the contents of the original file + truncateSync(this.logPath, 0); + } else { + // Create new empty log file if it doesn't exist + writeFileSync(this.logPath, ""); + } + } + + private logInit() { + this.logUpdate({ type: "@log_init" }); + } + + protected logUpdate(update: Omit, "timestamp"> | Omit) { + const timestamp = new Date().toISOString(); + appendFileSync(this.logPath, JSON.stringify({ ...update, timestamp }) + "\n"); + } +} diff --git a/src/base/state/dto.ts b/src/base/state/dto.ts new file mode 100644 index 0000000..3859876 --- /dev/null +++ b/src/base/state/dto.ts @@ -0,0 +1,14 @@ +import { z } from "zod"; + +export const LogUpdateSchema = (dataSchema: TData) => + z.object({ + timestamp: z.string(), + data: dataSchema, + }); +export type LogUpdate = z.infer>>; + +export const LogInitSchema = z.object({ + timestamp: z.string(), + type: z.literal("@log_init"), +}); +export type LogInit = z.infer; diff --git a/src/base/tools-factory.ts b/src/base/tools-factory.ts index a0978b4..d64958f 100644 --- a/src/base/tools-factory.ts +++ b/src/base/tools-factory.ts @@ -1,6 +1,6 @@ import { Logger } from "bee-agent-framework"; import { AnyTool } from "bee-agent-framework/tools/base"; -import { AvailableTool } from "src/agents/agent-registry.js"; +import { AvailableTool } from "@/agents/registry/dto.js"; export type ToolFactoryMethod = () => AnyTool; @@ -8,30 +8,46 @@ export abstract class BaseToolsFactory { protected readonly availableTools = new Map(); protected readonly factories = new Map(); private readonly logger: Logger; + private initialized = false; constructor() { this.logger = Logger.root.child({ name: this.constructor.name }); - for (const factory of this.getFactoriesMethods()) { + } + + async init() { + const methods = await this.getFactoriesMethods(); + for (const factory of methods) { const product = factory(); this.availableTools.set(product.name, { - name: product.name, + toolName: product.name, description: product.description, }); this.factories.set(product.name, factory); } + this.initialized = true; } - abstract getFactoriesMethods(): ToolFactoryMethod[]; + abstract getFactoriesMethods(): Promise; getAvailableTools(): AvailableTool[] { + this.checkInitialization(); return Array.from(this.availableTools.values()); } getAvailableToolsNames(): string[] { + this.checkInitialization(); return Array.from(this.availableTools.keys()); } + private checkInitialization() { + if (!this.initialized) { + throw new Error(`Uninitialized tools factory`); + } + } + createTools(tools: string[]): AnyTool[] { + this.checkInitialization(); + return tools.map((t) => { const factory = this.factories.get(t); if (!factory) { diff --git a/src/helpers/llm.ts b/src/helpers/llm.ts index 7d0e1f7..c84a8d8 100644 --- a/src/helpers/llm.ts +++ b/src/helpers/llm.ts @@ -1,16 +1,16 @@ -import { ChatLLM, ChatLLMOutput } from "bee-agent-framework/llms/chat"; -import { getEnv, parseEnv } from "bee-agent-framework/internals/env"; -import { z } from "zod"; -import { WatsonXChatLLM } from "bee-agent-framework/adapters/watsonx/chat"; -import { OpenAIChatLLM } from "bee-agent-framework/adapters/openai/chat"; -import { OllamaChatLLM } from "bee-agent-framework/adapters/ollama/chat"; import { GroqChatLLM } from "bee-agent-framework/adapters/groq/chat"; -import { VertexAIChatLLM } from "bee-agent-framework/adapters/vertexai/chat"; import { IBMVllmChatLLM } from "bee-agent-framework/adapters/ibm-vllm/chat"; -import { Ollama } from "ollama"; +import { OllamaChatLLM } from "bee-agent-framework/adapters/ollama/chat"; +import { OpenAIChatLLM } from "bee-agent-framework/adapters/openai/chat"; +import { VertexAIChatLLM } from "bee-agent-framework/adapters/vertexai/chat"; +import { WatsonXChatLLM } from "bee-agent-framework/adapters/watsonx/chat"; +import { getEnv, parseEnv } from "bee-agent-framework/internals/env"; +import { ChatLLM, ChatLLMOutput } from "bee-agent-framework/llms/chat"; import Groq from "groq-sdk"; -import { AgentKind } from "src/agents/agent-registry.js"; +import { Ollama } from "ollama"; import OpenAI from "openai"; +import { AgentKindEnum } from "@/agents/registry/dto.js"; +import { z } from "zod"; export const Providers = { WATSONX: "watsonx", @@ -24,17 +24,17 @@ export const Providers = { } as const; type Provider = (typeof Providers)[keyof typeof Providers]; -const env = (name: string, type: AgentKind) => `${name}_${type.toUpperCase()}`; +const env = (name: string, type: AgentKindEnum) => `${name}_${type.toUpperCase()}`; -export const LLMFactories: Record ChatLLM> = { - [Providers.GROQ]: (type: AgentKind) => +export const LLMFactories: Record ChatLLM> = { + [Providers.GROQ]: (type: AgentKindEnum) => new GroqChatLLM({ modelId: getEnv(env(`GROQ_MODEL`, type)) || "llama-3.1-70b-versatile", client: new Groq({ apiKey: getEnv("GROQ_API_KEY"), }), }), - [Providers.OPENAI]: (type: AgentKind) => + [Providers.OPENAI]: (type: AgentKindEnum) => new OpenAIChatLLM({ modelId: getEnv(env("OPENAI_MODEL", type)) || "gpt-4o", parameters: { @@ -42,7 +42,7 @@ export const LLMFactories: Record ChatLLM + [Providers.IBM_RITS]: (type: AgentKindEnum) => new OpenAIChatLLM({ client: new OpenAI({ baseURL: getEnv(env("IBM_RITS_URL", type)), @@ -53,7 +53,7 @@ export const LLMFactories: Record ChatLLM + [Providers.OLLAMA]: (type: AgentKindEnum) => new OllamaChatLLM({ modelId: getEnv(env("OLLAMA_MODEL", type)) || "llama3.1:8b", parameters: { @@ -63,7 +63,7 @@ export const LLMFactories: Record ChatLLM + [Providers.WATSONX]: (type: AgentKindEnum) => WatsonXChatLLM.fromPreset( getEnv(env("WATSONX_MODEL", type)) || "meta-llama/llama-3-1-70b-instruct", { @@ -72,7 +72,7 @@ export const LLMFactories: Record ChatLLM + [Providers.AZURE]: (type: AgentKindEnum) => new OpenAIChatLLM({ modelId: getEnv(env("OPENAI_MODEL", type)) || "gpt-4o-mini", azure: true, @@ -81,18 +81,18 @@ export const LLMFactories: Record ChatLLM + [Providers.VERTEXAI]: (type: AgentKindEnum) => new VertexAIChatLLM({ modelId: getEnv(env("VERTEXAI_MODEL", type)) || "gemini-1.5-flash-001", location: getEnv("VERTEXAI_LOCATION") || "us-central1", project: getEnv("VERTEXAI_PROJECT"), parameters: {}, }), - [Providers.IBM_VLLM]: (type: AgentKind) => + [Providers.IBM_VLLM]: (type: AgentKindEnum) => IBMVllmChatLLM.fromPreset(getEnv(env("IBM_VLLM_MODEL", type))), }; -export function getChatLLM(type: AgentKind, provider?: Provider): ChatLLM { +export function getChatLLM(type: AgentKindEnum, provider?: Provider): ChatLLM { if (!provider) { provider = parseEnv("LLM_BACKEND", z.nativeEnum(Providers), Providers.OLLAMA); } diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..56118ae --- /dev/null +++ b/src/index.ts @@ -0,0 +1,164 @@ +import "dotenv/config"; +import { createAgent } from "@agents/agent-factory.js"; +import { AgentKindEnumSchema } from "@agents/registry/dto.js"; +import { AgentRegistry } from "@agents/registry/registry.js"; +import { AgentStateLogger } from "@agents/state/logger.js"; +import { TaskManager } from "@tasks/manager/manager.js"; +import { TaskStateLogger } from "@tasks/state/logger.js"; +import { WorkspaceManager } from "@workspaces/manager/manager.js"; +import { BeeAgent } from "bee-agent-framework/agents/bee/agent"; +import { supervisor, operator } from "./agents/index.js"; + +export async function createBeeSupervisor(workspace = "default") { + // Reset audit logs + AgentStateLogger.init(); + TaskStateLogger.init(); + + // Setup workspace + WorkspaceManager.init(["workspaces"], workspace); + + const registry = new AgentRegistry({ + agentLifecycle: { + async onCreate( + config, + agentId, + toolsFactory, + ): Promise<{ agentId: string; instance: BeeAgent }> { + const { agentKind, agentType, instructions, description } = config; + const tools = config.tools == null ? toolsFactory.getAvailableToolsNames() : config.tools; + const instance = createAgent( + { + agentKind, + agentType, + agentId, + description, + instructions, + tools, + }, + toolsFactory, + ); + + return { agentId, instance }; + }, + async onDestroy(instance) { + instance.destroy(); + }, + }, + onAgentConfigCreated(agentKind, agentType) { + taskManager.registerAgentType(agentKind, agentType); + }, + onAgentAvailable(agentKind, agentType, agentConfigVersion, availableCount) { + taskManager.agentAvailable(agentKind, agentType, agentConfigVersion, availableCount); + }, + }); + + const taskManager = new TaskManager( + async ( + taskRun, + taskManager, + { onAwaitingAgentAcquired, onAgentAcquired, onAgentComplete, onAgentError }, + ) => { + let agent; + try { + agent = await registry.acquireAgent(taskRun.config.agentKind, taskRun.config.agentType); + } catch { + onAwaitingAgentAcquired(taskRun.taskRunId, taskManager); + return; + } + + onAgentAcquired(taskRun.taskRunId, agent.agentId, taskManager); + const { instance } = agent; + const prompt = taskRun.taskRunInput; + instance + .run( + { prompt }, + { + execution: { + maxIterations: 8, + maxRetriesPerStep: 2, + totalMaxRetries: 10, + }, + }, + ) + // .observe((emitter) => { + // emitter.on("update", (data, meta) => { + // reader.write( + // `${(meta.creator as any).input.meta.name} 🤖 (${data.update.key}) :`, + // data.update.value, + // ); + // }); + // emitter.on("error", (data, meta) => { + // reader.write( + // `${(meta.creator as any).input.meta.name} 🤖 (${data.error.name}) :`, + // data.error.message, + // ); + // }); + // }) + .then((resp) => + onAgentComplete(resp.result.text, taskRun.taskRunId, agent.agentId, taskManager), + ) + .catch((err) => { + onAgentError(err, taskRun.taskRunId, agent.agentId, taskManager); + }) + .finally(() => { + registry.releaseAgent(agent.agentId); + }); + }, + ); + + await registry.registerToolsFactories([ + [ + "supervisor", + new supervisor.ToolsFactory( + registry, + taskManager, + supervisor.Workdir.getWorkdirPath().validPath, + ), + ], + ["operator", new operator.ToolsFactory()], + ]); + + registry.restore(); + + if ( + !registry.isAgentConfigExists(AgentKindEnumSchema.Enum.supervisor, supervisor.AgentTypes.BOSS) + ) { + registry.createAgentConfig({ + autoPopulatePool: false, + agentKind: AgentKindEnumSchema.Enum.supervisor, + agentType: supervisor.AgentTypes.BOSS, + instructions: "", + tools: registry.getToolsFactory(AgentKindEnumSchema.Enum.supervisor).getAvailableToolsNames(), + description: "The boss supervisor agent that control whole app.", + maxPoolSize: 1, + }); + } + + const { instance: supervisorAgent, agentId: supervisorAgentId } = await registry.acquireAgent( + AgentKindEnumSchema.Enum.supervisor, + supervisor.AgentTypes.BOSS, + ); + + taskManager.registerAdminAgent(supervisorAgentId); + taskManager.restore(supervisorAgentId); + + supervisor.Workdir.registerWorkdir(supervisorAgentId); + + // Can you create tasks to write poem about: sun, earth, mars and assign them to the right agent type and run them? + // Can you create agent type that will write the best poems on different topics, then create tasks to create poem about: sun, night, water. Assign them to the right agent types run all tasks and give me the created poems when it will be all finished? + // Can you create agent type that will write the best poems on different topics, then create tasks to create poem about: sun, night, water. Assign them to the right agent types? + + // Can you create agent type that will write the best poems on different topics with the pool size 2? + // Can you create tasks to create poem about: sun, night, water, hell, love, hate. Assign them to the right agent types? + // Can you runt these tasks? + // Can you list their results? + + // Can you generate poem for each of these topics: love, day, night? + // Can you get list of articles about each of these topics: deepseek, interstellar engine, agi? + + // Can you create different kinds of specialized agents that will do a research on different aspects of person profile from internet? You should be very specific and explanatory in their instructions. Don't create any tasks. + // Base on these agents can you prepare related tasks. And one extra agent and task that will summarize task outputs other tasks. + // Can you create a personal profile of Dario Gil? + + return supervisorAgent; +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..da836c0 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,38 @@ +import { FrameworkError } from "bee-agent-framework"; +import { createConsoleReader } from "./helpers/reader.js"; +import { createBeeSupervisor } from "./index.js"; + +const args = process.argv.slice(2); +const workspace = args[0]; + +const reader = createConsoleReader({ fallback: "What is the current weather in Las Vegas?" }); +const supervisorAgent = await createBeeSupervisor(workspace); +for await (const { prompt } of reader) { + try { + const response = await supervisorAgent + .run( + { + prompt, + }, + { + execution: { + maxIterations: 100, + maxRetriesPerStep: 2, + totalMaxRetries: 10, + }, + }, + ) + .observe((emitter) => { + emitter.on("update", (data, meta) => { + reader.write( + `${(meta.creator as any).input.meta.name} 🤖 (${data.update.key}) :`, + data.update.value, + ); + }); + }); + + reader.write(`Agent 🤖 :`, response.result.text); + } catch (error) { + reader.write(`Error`, FrameworkError.ensure(error).dump()); + } +} diff --git a/src/tasks/index.ts b/src/tasks/index.ts new file mode 100644 index 0000000..77670f5 --- /dev/null +++ b/src/tasks/index.ts @@ -0,0 +1,2 @@ +export * as tasksTool from "./tool.js"; +export * as tasksStateLogger from "./state/logger.js"; diff --git a/src/tasks/manager/dto.ts b/src/tasks/manager/dto.ts new file mode 100644 index 0000000..c930c5f --- /dev/null +++ b/src/tasks/manager/dto.ts @@ -0,0 +1,233 @@ +import { + AgentConfigVersionValueSchema, + AgentIdValueSchema, + AgentKindEnumSchema, + AgentNumValueSchema, + AgentTypeValueSchema, +} from "@/agents/registry/dto.js"; +import { DateStringSchema } from "@/base/dto.js"; +import { z } from "zod"; + +export const TaskKindEnumSchema = AgentKindEnumSchema.describe( + "Specifies the kind of a task in the system. A 'supervisor' kind of tasks are executed by supervisor kind of agents, while a 'operator' handles tasks managed by operators.", +); +export type TaskKindEnum = z.infer; + +export const TaskKindValueSchema = z + .string() + .refine((value) => Object.values(TaskKindEnumSchema.enum).includes(value as TaskKindEnum), { + message: `Task kind must be one of: ${Object.values(TaskKindEnumSchema.enum).join(", ")}`, + }) + .describe( + "Specifies the kind of a task in the system. A 'supervisor' kind of tasks are executed by supervisor kind of agents, while a 'operator' handles tasks managed by operators.", + ); +export type TaskKindValue = z.infer; + +export const TaskTypeValueSchema = z.string().describe("Unique short name of the task type."); +export type TaskTypeValue = z.infer; + +export const TaskRunNumValueSchema = z.number().describe("Task run instance number."); +export type TaskRunNumValue = z.infer; + +export const TaskConfigIdValueSchema = z + .string() + .describe( + "Unique task config id composed of '{taskKind}:{taskType}:{version}' e.g: 'task:poem_generation:1' or 'task:web_scrap:3'", + ); +export type TaskConfigIdValue = z.infer; + +export const TaskConfigVersionValueSchema = z.number().describe("Task config version number."); +export type TaskConfigVersionValue = z.infer; + +export const TaskConcurrencyModeEnumSchema = z + .enum(["EXCLUSIVE", "PARALLEL"]) + .describe( + "Defines whether multiple instances of the task can run simultaneously. EXCLUSIVE allows only one instance to run at a time, while PARALLEL allows multiple concurrent executions", + ); +export type TaskConcurrencyModeEnum = z.infer; + +export const TaskConfigSchema = z + .object({ + taskKind: TaskKindEnumSchema, + taskType: TaskTypeValueSchema, + taskConfigId: TaskConfigIdValueSchema, + taskConfigVersion: z.number().describe("Version number for the task configuration"), + taskConfigInput: z + .string() + .describe( + "Task config input should serves as a template for task run input for derived task runs.", + ), + description: z.string().describe("Detail information about the task and its context"), + intervalMs: z.number().describe("Interval between task executions in milliseconds"), + runImmediately: z.boolean().describe("Whether to run the task immediately upon starting"), + maxRetries: z + .number() + .describe( + "Maximum number of retry attempts if task execution fails. undefined if no retries.", + ) + .nullish(), + retryDelayMs: z.number().describe("Delay between retry attempts in milliseconds").nullish(), + ownerAgentId: z.string().describe("Identifier of who owns/manages this task"), + agentKind: AgentKindEnumSchema, + agentType: AgentTypeValueSchema, + agentNum: AgentNumValueSchema, + agentVersion: AgentConfigVersionValueSchema, + concurrencyMode: TaskConcurrencyModeEnumSchema, + maxRepeats: z + .number() + .describe( + "Maximum number of times the task can execute. If not set, the task can run indefinitely", + ) + .nullish(), + }) + .describe("Represents a periodic task configuration."); + +export type TaskConfig = z.infer; + +export const TaskConfigOwnedResourceSchema = z.object({ + taskConfig: TaskConfigSchema, + ownerId: z.string(), +}); +export type TaskConfigOwnedResource = z.infer; + +export const TaskRunTerminalStatusEnumSchema = z.enum(["STOPPED", "FAILED", "COMPLETED"]); +export type TaskRunTerminalStatusEnum = z.infer; + +export const TaskRunHistoryEntrySchema = z + .object({ + timestamp: DateStringSchema.describe("When this task execution occurred"), + terminalStatus: TaskRunTerminalStatusEnumSchema, + output: z.unknown().describe("Output produced by the task callback"), + error: z.string().optional().describe("Error message if execution failed"), + runNumber: z.number().describe("Which run number this was (1-based)"), + maxRuns: z + .number() + .describe("Maximum number of times this task should execute. Undefined means infinite runs.") + .nullish(), + retryAttempt: z.number().describe("How many retries were needed for this execution"), + maxRepeats: z + .number() + .describe( + "Maximum number of retry attempts if task execution fails. undefined if no retries.", + ) + .nullish(), + agentId: z.string().nullable().describe("ID of agent that executed the task, if occupied"), + executionTimeMs: z.number().describe("How long the task execution took in milliseconds"), + }) + .describe("Records details about a single execution of a task"); + +export type TaskRunHistoryEntry = z.infer; + +export const TaskRunStatusEnumSchema = z.enum([ + "CREATED", + "SCHEDULED", + "EXECUTING", + "PENDING", + "AWAITING_AGENT", + "STOPPED", + "FAILED", + "COMPLETED", +]); +export type TaskRunStatusEnum = z.infer; + +export const TaskRunIdValueSchema = z + .string() + .describe( + "Unique task run id composed of '{taskKind}:{taskType}[{instanceNum}]:{version}' e.g: 'task:poem_generation[1]:1' or 'task:web_scrap[2]:3'", + ); +export type TaskRunIdValue = z.infer; + +export const TaskRunSchema = z + .object({ + taskKind: TaskKindEnumSchema, + taskType: TaskTypeValueSchema, + taskRunId: TaskRunIdValueSchema, + taskRunNum: TaskRunNumValueSchema, + taskConfigVersion: TaskConfigVersionValueSchema, + taskRunInput: z + .string() + .describe( + "Input data specific for this task run should follow task config input of the related task config.", + ), + config: TaskConfigSchema, + status: TaskRunStatusEnumSchema.describe("The status of the task."), + isOccupied: z + .boolean() + .describe("Indicates if the task is currently being operated on by an agent"), + occupiedSince: DateStringSchema.optional() + .nullable() + .describe("Timestamp when the task was marked as occupied. undefined if not occupied"), + startRunAt: DateStringSchema.optional().describe("Timestamp of the execution start."), + lastRunAt: DateStringSchema.optional().describe("Timestamp of the last successful execution"), + nextRunAt: DateStringSchema.optional().describe( + "Expected timestamp of the next scheduled execution", + ), + errorCount: z.number().int().describe("Count of consecutive execution failures"), + currentRetryAttempt: z + .number() + .describe("Current retry count. Maximum retries configured via maxRepeats"), + ownerAgentId: AgentIdValueSchema.describe("ID of the agent who owns/manages this task"), + currentAgentId: z + .string() + .optional() + .nullable() + .describe("ID of the agent currently operating on the task. undefined if not occupied"), + completedRuns: z + .number() + .int() + .describe("Number of times this task has been successfully executed"), + history: z.array(TaskRunHistoryEntrySchema).describe("History of task executions"), + maxHistoryEntries: z + .number() + .optional() + .describe("Maximum number of history entries to keep. Undefined means keep all history."), + }) + .describe("Represents the current status and execution state of a task"); + +export type TaskRun = z.infer; + +export const TaskConfigPoolStatsSchema = z + .object({ + poolSize: z.number(), + created: z.number(), + terminated: z.number(), + completed: z.number(), + running: z.number(), + + pending: z.number(), + awaiting_agent: z.number(), + stopped: z.number(), + failed: z.number(), + active: z.number(), + total: z.number(), + }) + .describe("Statistics about task runs"); +export type TaskConfigPoolStats = z.infer; + +// Status helpers +const ACTIVE_STATUSES = [ + TaskRunStatusEnumSchema.enum.SCHEDULED, + TaskRunStatusEnumSchema.enum.PENDING, + TaskRunStatusEnumSchema.enum.AWAITING_AGENT, + TaskRunStatusEnumSchema.enum.EXECUTING, +] as const; +type ActiveStatus = (typeof ACTIVE_STATUSES)[number]; + +export const isTaskRunActiveStatus = (status: TaskRunStatusEnum): status is ActiveStatus => + ACTIVE_STATUSES.includes(status as ActiveStatus); + +const TERMINATION_STATUSES = [ + TaskRunStatusEnumSchema.enum.STOPPED, + TaskRunStatusEnumSchema.enum.FAILED, + TaskRunStatusEnumSchema.enum.COMPLETED, +] as const; +type TerminationStatus = (typeof TERMINATION_STATUSES)[number]; + +export const isTaskRunTerminationStatus = ( + status: TaskRunStatusEnum, +): status is TerminationStatus => TERMINATION_STATUSES.includes(status as TerminationStatus); + +export const ActingAgentIdValueSchema = AgentIdValueSchema.describe( + "ID of the agent performing this operation.", +); +export type ActingAgentIdValue = z.infer; diff --git a/src/tasks/manager/manager.ts b/src/tasks/manager/manager.ts new file mode 100644 index 0000000..a9d7c9d --- /dev/null +++ b/src/tasks/manager/manager.ts @@ -0,0 +1,1365 @@ +import { + FULL_ACCESS, + READ_EXECUTE_ACCESS, + READ_ONLY_ACCESS, + READ_WRITE_ACCESS, + ResourcesAccessControl, + WRITE_ONLY_ACCESS, +} from "@/access-control/resources-access-control.js"; +import { agentSomeIdToTypeValue } from "@/agents/agent-id.js"; +import { + AgentConfigVersionValue, + AgentIdValue, + AgentKindEnum, + AgentTypeValue, +} from "@/agents/registry/dto.js"; +import { updateDeepPartialObject } from "@/utils/objects.js"; +import { AgentStateLogger } from "@agents/state/logger.js"; +import { TaskStateLogger } from "@tasks/state/logger.js"; +import { WorkspaceResource } from "@workspaces/manager/index.js"; +import { WorkspaceRestorable } from "@workspaces/restore/index.js"; +import { FrameworkError } from "bee-agent-framework"; +import { clone, isNonNullish, omit } from "remeda"; +import { taskConfigIdToValue, taskRunIdToString, taskSomeIdToTypeValue } from "../task-id.js"; +import { + isTaskRunActiveStatus, + isTaskRunTerminationStatus, + TaskConfig, + TaskConfigIdValue, + TaskConfigOwnedResource, + TaskConfigOwnedResourceSchema, + TaskConfigPoolStats, + TaskConfigVersionValue, + TaskKindEnum, + TaskKindEnumSchema, + TaskRun, + TaskRunHistoryEntry, + TaskRunIdValue, + TaskRunStatusEnumSchema, + TaskRunTerminalStatusEnum, + TaskTypeValue, +} from "./dto.js"; + +export type TaskRunRuntime = TaskRun & { + intervalId: NodeJS.Timeout | null; +}; + +const TASK_MANAGER_RESOURCE = "task_manager"; +const TASK_MANAGER_USER = "task_manager_user"; +const TASK_MANAGER_CONFIG_PATH = ["configs", "task_manager.jsonl"] as const; + +const MAX_POOL_SIZE = 100; + +export class TaskManager extends WorkspaceRestorable { + /** Map of registered task type and their configurations */ + private taskConfigs: Map>; + private taskRuns = new Map(); + /** Map of task run pools by task config and task run IDs */ + private taskPools: Map< + TaskKindEnum, + Map][]> + >; + private scheduledTasksToStart: { taskRunId: TaskRunIdValue; actingAgentId: AgentIdValue }[] = []; + private taskStartIntervalId: NodeJS.Timeout | null = null; + private awaitingTasksForAgents: { + taskRunId: TaskRunIdValue; + agentTypeId: string; + }[] = []; + private registeredAgentTypes = new Map(); + private ac: ResourcesAccessControl; + private stateLogger: TaskStateLogger; + private agentStateLogger: AgentStateLogger; + + constructor( + private onTaskStart: ( + taskRun: TaskRun, + taskManager: TaskManager, + callbacks: { + onAwaitingAgentAcquired: (taskRunId: TaskRunIdValue, taskManage: TaskManager) => void; + onAgentAcquired: ( + taskRunId: TaskRunIdValue, + agentId: AgentIdValue, + taskManage: TaskManager, + ) => void; + onAgentComplete: ( + output: string, + taskRunId: TaskRunIdValue, + agentId: AgentIdValue, + taskManage: TaskManager, + ) => void; + onAgentError: ( + err: Error, + taskRunId: TaskRunIdValue, + agentId: AgentIdValue, + taskManage: TaskManager, + ) => void; + }, + ) => Promise, + private options: { + errorHandler?: (error: Error, taskRunId: TaskRunIdValue) => void; + occupancyTimeoutMs?: number; + adminIds?: string[]; + maxHistoryEntries?: number; + } = {}, + ) { + super(TASK_MANAGER_CONFIG_PATH, TASK_MANAGER_USER); + this.logger.info("Initializing TaskManager"); + this.stateLogger = TaskStateLogger.getInstance(); + this.agentStateLogger = AgentStateLogger.getInstance(); + + this.ac = new ResourcesAccessControl(this.constructor.name, [TASK_MANAGER_USER]); + this.ac.createResource(TASK_MANAGER_RESOURCE, TASK_MANAGER_USER, TASK_MANAGER_USER); + + this.options = { + errorHandler: (error: Error, taskRunId: TaskRunIdValue) => { + this.logger.error({ taskRunId, error }, "Task error occurred"); + }, + occupancyTimeoutMs: 30 * 60 * 1000, + adminIds: [], + maxHistoryEntries: 100, // Default to keeping last 100 entries + ...options, + }; + + // Initialize task pools for all task kinds + this.taskConfigs = new Map(TaskKindEnumSchema.options.map((kind) => [kind, new Map()])); + this.taskPools = new Map(TaskKindEnumSchema.options.map((kind) => [kind, new Map()])); + + this.taskStartIntervalId = setInterval(async () => { + try { + await this.processNextStartTask(); // Your async function + } catch (err) { + this.logger.error(err, "Process next start task error"); + } + }, 100); // Runs every 100ms (0.1 second) + } + + protected restoreEntity( + resource: WorkspaceResource, + line: string, + actingAgentId: AgentIdValue, + ): void { + this.logger.info(`Restoring previous state from ${resource.path}`); + let parsed; + try { + parsed = JSON.parse(line); + } catch (e) { + this.logger.error(e); + throw new Error(`Failed to parse JSON: ${line}`); + } + const taskConfigResult = TaskConfigOwnedResourceSchema.safeParse(parsed); + if (taskConfigResult.success) { + this.createTaskConfig( + taskConfigResult.data.taskConfig, + taskConfigResult.data.ownerId, + actingAgentId, + false, + ); + return; + } + + this.logger.error(taskConfigResult, `Can't restore task config`); + throw new Error(`Can't restore`); + } + + protected getSerializedEntities(): string { + return Array.from(this.taskConfigs.entries()) + .map(([taskKind, typeMap]) => + Array.from(typeMap.entries()).map(([taskType, versions]) => { + const taskConfig = versions.at(-1); + if (!taskConfig) { + throw new Error( + `Task ${taskSomeIdToTypeValue({ taskKind, taskType })} has no version to serialize`, + ); + } + const { ownerId } = this.ac.getResourcePermissionsByAdmin( + taskConfig.taskConfigId, + TASK_MANAGER_USER, + )!; + const config = { ownerId, taskConfig } satisfies TaskConfigOwnedResource; + return JSON.stringify(config); + }), + ) + .flat() + .join("\n"); + } + + registerAdminAgent(agentId: AgentIdValue) { + this.ac.createPermissions(TASK_MANAGER_RESOURCE, agentId, FULL_ACCESS, TASK_MANAGER_USER); + } + + registerAgentType(agentKind: AgentKindEnum, agentType: string): void { + let types = this.registeredAgentTypes.get(agentKind); + if (!types) { + types = [agentType]; + this.registeredAgentTypes.set(agentKind, types); + } else { + if (types.includes(agentType)) { + throw new Error(`Agent type duplicity for agentKind:${agentKind}, agentType:${agentType}`); + } + types.push(agentType); + } + this.stateLogger.logAgentTypeRegister({ + agentTypeId: agentSomeIdToTypeValue({ agentKind, agentType }), + }); + } + + getTaskRun( + taskRunId: TaskRunIdValue, + actingAgentId: AgentIdValue, + permissions = READ_ONLY_ACCESS, + ): TaskRunRuntime { + this.logger.trace({ taskRunId }, "Getting task run by ID"); + this.ac.checkPermission(taskRunId, actingAgentId, permissions); + + const taskRun = this.taskRuns.get(taskRunId); + if (!taskRun) { + this.logger.error({ taskRunId }, "Task run not found"); + throw new Error(`Task run with ID '${taskRunId}' not found`); + } + return taskRun; + } + + getPoolStats( + taskKind: TaskKindEnum, + taskType: TaskTypeValue, + actingAgentId: AgentIdValue, + ): [TaskConfigPoolStats, [number, TaskConfigPoolStats][]] { + this.logger.trace({ taskKind, taskType, actingAgentId }, "Getting pool statistics"); + + this.ac.checkPermission(TASK_MANAGER_RESOURCE, actingAgentId, READ_ONLY_ACCESS); + + const pool = this.getTaskTypeVersionSetsArray(taskKind, taskType, false); + if (!pool) { + return [ + { + poolSize: 0, + created: 0, + running: 0, + pending: 0, + awaiting_agent: 0, + stopped: 0, + failed: 0, + completed: 0, + terminated: 0, + active: 0, + total: 0, + }, + [], + ]; + } + + const versionedTaskRuns = pool.map( + ([version, set]) => + [ + version, + Array.from(set) + .map((t) => { + if (this.ac.hasPermission(t, actingAgentId, READ_ONLY_ACCESS)) { + return this.getTaskRun(t, actingAgentId, READ_ONLY_ACCESS); + } + }) + .filter(isNonNullish), + ] as const, + ); + const versions = versionedTaskRuns.map(([version, taskRuns]) => { + const config = this.getTaskConfig(taskKind, taskType, actingAgentId, version); + const stats = { + poolSize: config.concurrencyMode === "EXCLUSIVE" ? 1 : MAX_POOL_SIZE, + active: taskRuns.filter((t) => isTaskRunActiveStatus(t.status)).length, + terminated: taskRuns.filter((t) => isTaskRunTerminationStatus(t.status)).length, + completed: taskRuns.filter((t) => t.status === "COMPLETED").length, + running: taskRuns.filter((t) => t.status === "EXECUTING").length, + failed: taskRuns.filter((t) => t.status === "FAILED").length, + stopped: taskRuns.filter((t) => t.status === "STOPPED").length, + pending: taskRuns.filter((t) => t.status === "PENDING").length, + awaiting_agent: taskRuns.filter((t) => t.status === "AWAITING_AGENT").length, + created: taskRuns.filter((t) => t.status === "CREATED").length, + total: taskRuns.length, + } satisfies TaskConfigPoolStats; + return [version, stats] as [number, TaskConfigPoolStats]; + }); + + const stats = versions.reduce( + (prev, [, curr]) => { + const sum = { + poolSize: curr.poolSize + prev.poolSize, + active: curr.active + prev.active, + terminated: curr.terminated + prev.terminated, + completed: curr.completed + prev.completed, + running: curr.running + prev.running, + failed: curr.failed + prev.failed, + stopped: curr.stopped + prev.stopped, + pending: curr.pending + prev.pending, + awaiting_agent: curr.awaiting_agent + prev.awaiting_agent, + created: curr.created + prev.created, + total: curr.total + prev.total, + } satisfies TaskConfigPoolStats; + return sum; + }, + { + poolSize: 0, + active: 0, + terminated: 0, + completed: 0, + running: 0, + failed: 0, + stopped: 0, + pending: 0, + awaiting_agent: 0, + created: 0, + total: 0, + } satisfies TaskConfigPoolStats, + ); + + this.logger.trace({ taskType: taskType, ...stats }, "Pool statistics"); + return [stats, versions]; + } + + private getPoolStatsByVersion( + taskKind: TaskKindEnum, + taskType: TaskTypeValue, + taskConfigVersion: number, + actingAgentId: AgentIdValue, + ) { + // FIXME Unoptimized + const [, versions] = this.getPoolStats(taskKind, taskType, actingAgentId); + const found = versions.find(([currVersion]) => currVersion === taskConfigVersion); + if (!found) { + return { + poolSize: 0, + active: 0, + terminated: 0, + completed: 0, + running: 0, + failed: 0, + stopped: 0, + pending: 0, + awaiting_agent: 0, + created: 0, + total: 0, + } satisfies TaskConfigPoolStats; + } + const [, versionStats] = found; + return versionStats; + } + + private getTaskKindPoolMap(taskKind: TaskKindEnum) { + const poolKind = this.taskPools.get(taskKind); + if (!poolKind) { + throw new Error(`There is missing pool for task taskKind:${taskKind}`); + } + return poolKind; + } + + private getTaskTypeVersionSetsArray( + taskKind: TaskKindEnum, + taskType: AgentTypeValue, + throwError = true, + ) { + const poolKind = this.getTaskKindPoolMap(taskKind); + const pool = poolKind.get(taskType); + if (!pool && throwError) { + throw new Error( + `There is missing pool version sets array for agent agentKind:${taskKind} agentType:${taskType}`, + ); + } + return pool; + } + + private getTaskTypeVersionSet( + taskKind: TaskKindEnum, + taskType: TaskTypeValue, + taskConfigVersion: number, + ) { + const poolVersionSetsArray = this.getTaskTypeVersionSetsArray(taskKind, taskType)!; + const poolVersionSet = poolVersionSetsArray.find((it) => it[0] === taskConfigVersion); + if (!poolVersionSet) { + throw new Error( + `There is missing pool version set for task taskKind:${taskKind} taskType:${taskType} version:${taskConfigVersion}`, + ); + } + return poolVersionSet[1]; + } + + createTaskConfig( + config: Omit, + ownerAgentId: string, + actingAgentId: AgentIdValue, + persist = true, + ): TaskConfig { + const { taskKind, taskType, maxRepeats: maxRuns } = config; + this.logger.info( + { + taskKind, + taskType, + maxRuns, + }, + "Create new task config", + ); + this.ac.checkPermission(TASK_MANAGER_RESOURCE, actingAgentId, WRITE_ONLY_ACCESS); + + const taskTypesMap = this.getTaskConfigMap(taskKind); + if (taskTypesMap.has(taskType)) { + this.logger.error({ taskType }, "Task type already registered"); + throw new Error(`Task type '${taskType}' is already registered`); + } + + if (!this.registeredAgentTypes.get(config.agentKind)?.includes(config.agentType)) { + throw new Error( + `Agent kind: ${config.agentKind} type: ${config.agentType} wasn't yet registered`, + ); + } + + const taskConfigVersion = 1; + const taskConfigId = taskConfigIdToValue({ + ...config, + taskConfigVersion, + }); + const configVersioned = { + ...config, + taskConfigId, + ownerAgentId, + taskConfigVersion, + } satisfies TaskConfig; + taskTypesMap.set(taskType, [configVersioned]); + + // Permissions + this.ac.createResource(taskConfigId, ownerAgentId, actingAgentId); + this.ac.createPermissions(taskConfigId, ownerAgentId, READ_EXECUTE_ACCESS, actingAgentId); + + this.stateLogger.logTaskConfigCreate({ + taskConfigId, + taskType: taskSomeIdToTypeValue(configVersioned), + config: configVersioned, + }); + + this.initializeTaskPool(taskKind, taskType, taskConfigVersion); + + if (persist) { + this.persist(); + } + + return configVersioned; + } + + private initializeTaskPool(taskKind: TaskKindEnum, taskType: TaskTypeValue, version: number) { + this.logger.debug( + { + taskKind, + taskType, + version, + }, + "Initializing task pool", + ); + + const kindPool = this.getTaskKindPoolMap(taskKind); + let typePool = kindPool.get(taskType); + if (!typePool) { + typePool = []; + kindPool.set(taskType, typePool); + } + typePool.push([version, new Set([])]); + } + + private getTaskConfigMap(taskKind: TaskKindEnum) { + const typesMap = this.taskConfigs.get(taskKind); + if (!typesMap) { + throw new Error(`There is missing types map for task taskKind:${taskKind}`); + } + return typesMap; + } + + private getTaskConfigTypeMap(taskKind: TaskKindEnum, taskType: TaskTypeValue) { + const taskConfigTypeMap = this.getTaskConfigMap(taskKind); + const taskConfigVersions = taskConfigTypeMap.get(taskType); + if (!taskConfigVersions) { + this.logger.error({ taskKind, taskType }, "Task config type map was not found"); + throw new Error(`Task kind '${taskKind}' type '${taskType}' was not found`); + } + return taskConfigVersions; + } + + getTaskConfig( + taskKind: TaskKindEnum, + taskType: TaskTypeValue, + actingAgentId: AgentIdValue, + taskConfigVersion?: number, + permissions = READ_ONLY_ACCESS, + ): TaskConfig { + const configVersions = this.getTaskConfigMap(taskKind).get(taskType); + if (!configVersions) { + this.logger.error({ taskKind, taskType }, "Task config not found"); + throw new Error(`Task kind '${taskKind}' type '${taskType}' was not found`); + } + + let result; + if (taskConfigVersion != null) { + const configVersion = configVersions.find((c) => c.taskConfigVersion === taskConfigVersion); + if (!configVersion) { + this.logger.error( + { taskKind, taskType, taskConfigVersion }, + "Task config version not found", + ); + throw new Error( + `Task kind '${taskKind}' type '${taskType}' version '${taskConfigVersion}' was not found`, + ); + } + result = configVersion; + } + + const lastConfigVersion = configVersions.at(-1); + if (lastConfigVersion == null) { + this.logger.error( + { taskKind, taskType, taskConfigVersion }, + "Task config last version was not found", + ); + throw new Error(`Task kind '${taskKind}' type '${taskType}' last version was not found`); + } + result = lastConfigVersion; + this.ac.checkPermission(lastConfigVersion.taskConfigId, actingAgentId, permissions); + return result; + } + + updateTaskConfig( + update: Pick & + Partial< + Pick< + TaskConfig, + | "description" + | "intervalMs" + | "taskConfigInput" + | "runImmediately" + | "maxRepeats" + | "maxRetries" + | "retryDelayMs" + | "concurrencyMode" + > + >, + actingAgentId: AgentIdValue, + ) { + const { taskKind, taskType } = update; + + const config = this.getTaskConfig( + taskKind, + taskType, + actingAgentId, + undefined, + READ_WRITE_ACCESS, + ); + + const newConfigVersion = clone(config); + + const taskConfigVersion = config.taskConfigVersion + 1; + const taskConfigId = taskConfigIdToValue({ + ...config, + taskConfigVersion, + }); + updateDeepPartialObject(newConfigVersion, { + ...update, + taskConfigId, + taskConfigVersion, + }); + const configVersions = this.getTaskConfigTypeMap(taskKind, taskType); + configVersions.push(newConfigVersion); + + this.ac.createResource(taskConfigId, config.ownerAgentId, actingAgentId); + this.ac.createPermissions( + taskConfigId, + config.ownerAgentId, + READ_EXECUTE_ACCESS, + actingAgentId, + ); + + this.stateLogger.logTaskConfigUpdate({ + taskType: taskSomeIdToTypeValue(newConfigVersion), + taskConfigId: newConfigVersion.taskConfigId, + config: newConfigVersion, + }); + + this.persist(); + return newConfigVersion; + } + + destroyTaskConfig( + taskKind: TaskKindEnum, + taskType: TaskTypeValue, + actingAgentId: AgentIdValue, + ): void { + this.logger.trace({ taskKind, taskType, actingAgentId }, "Destroying agent configuration"); + + const configVersions = this.getTaskConfigMap(taskKind).get(taskType); + if (!configVersions) { + this.logger.error({ taskKind, taskType }, "Task config versions was not found"); + throw new Error(`Task kind '${taskKind}' type '${taskType}' config versions was not found`); + } + + let index = 0; + for (const { taskConfigVersion, taskConfigId } of configVersions) { + this.ac.checkPermission(taskConfigId, actingAgentId, READ_WRITE_ACCESS); + const stats = this.getPoolStatsByVersion( + taskKind, + taskType, + taskConfigVersion, + actingAgentId, + ); + if (stats.active) { + this.logger.error( + { taskKind, taskType, stats }, + "Task config can't be destroyed while it is still has active runs", + ); + throw new Error( + `Task config kind '${taskKind}' type '${taskType}' version '${taskConfigVersion}' can't be destroyed while it is still has active runs.`, + ); + } + configVersions.splice(index, 1)[0]; + this.logger.info( + { + taskConfigId, + taskKind, + taskType, + taskConfigVersion, + }, + "Task config destroyed successfully", + ); + + this.stateLogger.logTaskConfigDestroy({ + taskConfigId, + taskType, + }); + + this.ac.removeResource(taskConfigId, actingAgentId); + + const [poolStats, versions] = this.getPoolStats(taskKind, taskType, actingAgentId); + this.stateLogger.logPoolChange({ + taskTypeId: taskSomeIdToTypeValue({ taskKind, taskType }), + poolStats, + versions, + }); + + index++; + } + + if (!configVersions.length) { + this.getTaskConfigMap(taskKind).delete(taskType); + this.ac.removeResource(taskSomeIdToTypeValue({ taskKind, taskType }), actingAgentId); + } + + if (!this.getTaskConfigMap(taskKind).size) { + this.taskConfigs.delete(taskKind); + } + + this.persist(); + } + + createTaskRun( + taskKind: TaskKindEnum, + taskType: TaskTypeValue, + taskRunInput: string, + actingAgentId: AgentIdValue, + ): TaskRun { + this.logger.debug( + { + taskKind, + taskType, + actingAgentId, + }, + "Creating new task run", + ); + + const config = this.getTaskConfig( + taskKind, + taskType, + actingAgentId, + undefined, + READ_EXECUTE_ACCESS, + ); + + this.ac.checkPermission(config.taskConfigId, actingAgentId, READ_EXECUTE_ACCESS); + + const { taskConfigVersion } = config; + const versionPoolStats = this.getPoolStatsByVersion( + taskKind, + taskType, + taskConfigVersion, + actingAgentId, + ); + const taskRunNum = versionPoolStats.created + 1; + const taskRunId = taskRunIdToString({ + taskKind, + taskType, + taskRunNum, + taskConfigVersion, + }); + + const types = this.registeredAgentTypes.get(config.agentKind); + if (!types || !types.includes(config.agentType)) { + throw new Error( + `Unregistered task type for task.agentKind:${config.agentKind} task.agentType: ${config.agentType}`, + ); + } + + const taskRun: TaskRun = { + taskKind, + taskType, + taskRunId, + taskConfigVersion: config.taskConfigVersion, + taskRunNum, + taskRunInput: taskRunInput, + config: clone(config), + status: "CREATED", + currentRetryAttempt: 0, + isOccupied: false, + errorCount: 0, + ownerAgentId: config.ownerAgentId, + completedRuns: 0, + history: [], + }; + this.taskRuns.set(taskRunId, { + intervalId: null, + ...taskRun, + }); + + this.stateLogger.logTaskRunCreate({ + taskConfigId: taskRun.config.taskConfigId, + taskRunId, + taskRun, + }); + + this.ac.createResource(taskRunId, actingAgentId, actingAgentId); + + const pool = this.getTaskTypeVersionSetsArray(taskKind, taskType)!; + let poolVersionSetArrayItem = pool.find((p) => p[0] === taskConfigVersion); + if (!poolVersionSetArrayItem) { + poolVersionSetArrayItem = [taskConfigVersion, new Set([])]; + pool.push(poolVersionSetArrayItem); + } + poolVersionSetArrayItem[1].add(taskRunId); + this.logger.trace({ taskKind, taskType, taskConfigVersion, taskRunId }, "Added task to pool"); + + const [poolStats, versions] = this.getPoolStats(taskKind, taskType, actingAgentId); + this.stateLogger.logPoolChange({ + taskTypeId: taskSomeIdToTypeValue({ taskKind, taskType }), + poolStats, + versions, + }); + + if (config.runImmediately) { + this.scheduleStartTaskRun(taskRunId, actingAgentId); + } + + return taskRun; + } + + /** + * Schedule task to start as soon as possible. + * Only owners and admins can start/stop tasks. + */ + scheduleStartTaskRun(taskRunId: TaskRunIdValue, actingAgentId: AgentIdValue): void { + this.logger.info({ taskRunId, actingAgentId }, "Schedule task run start"); + this.ac.checkPermission(taskRunId, actingAgentId, FULL_ACCESS); + + const taskRun = this.taskRuns.get(taskRunId); + if (!taskRun) { + this.logger.error({ taskRunId }, "Task run not found"); + throw new Error(`Task run ${taskRunId} not found`); + } + + const { taskKind, taskType, taskConfigVersion } = taskRun; + + const versionPoolStats = this.getPoolStatsByVersion( + taskKind, + taskType, + taskConfigVersion, + actingAgentId, + ); + + if (versionPoolStats.active >= versionPoolStats.poolSize) { + this.logger.trace({ taskKind, taskType, taskConfigVersion }, "Task pool population is full"); + return; + } + + this._updateTaskRun(taskRunId, taskRun, { + status: "SCHEDULED", + }); + this.scheduledTasksToStart.push({ taskRunId, actingAgentId }); + } + + async processNextStartTask() { + if (!this.scheduledTasksToStart.length) { + return; + } + const { taskRunId, actingAgentId } = this.scheduledTasksToStart.shift()!; + + this.logger.info({ taskRunId, actingAgentId }, "Starting scheduled task run"); + + const taskRun = this.getTaskRun(taskRunId, actingAgentId, FULL_ACCESS); + if (taskRun.status === "EXECUTING") { + this.logger.warn({ taskRunId }, "Task is already executing"); + throw new Error(`Task ${taskRunId} is already executing`); + } + + if (taskRun.config.runImmediately || !taskRun.config.intervalMs) { + this.logger.debug({ taskRunId }, "Executing task immediately"); + await this.executeTask(taskRunId, actingAgentId); + } + + if ( + taskRun.config.intervalMs && + (taskRun.config.maxRepeats == null || taskRun.completedRuns < taskRun.config.maxRepeats) + ) { + this.logger.debug( + { + taskRunId, + intervalMs: taskRun.config.intervalMs, + }, + "Setting up task interval", + ); + const self = this; + taskRun.intervalId = setInterval(async () => { + self.executeTask(taskRunId, actingAgentId); + }, taskRun.config.intervalMs); + + this._updateTaskRun(taskRunId, taskRun, { + status: "PENDING", + nextRunAt: new Date(Date.now() + taskRun.config.intervalMs), + }); + } + + this.logger.info({ taskRunId }, "Task started successfully"); + } + + stopTaskRun(taskRunId: TaskRunIdValue, actingAgentId: AgentIdValue, isCompleted = false): void { + this.logger.info({ taskRunId, actingAgentId }, "Stopping task"); + this.ac.checkPermission(taskRunId, actingAgentId, READ_WRITE_ACCESS); + + const taskRun = this.getTaskRun(taskRunId, actingAgentId); + if (taskRun.status === "STOPPED") { + this.logger.debug({ taskRunId }, "Task already stopped"); + return; + } + + if (taskRun.intervalId) { + this.logger.debug({ taskRunId }, "Clearing task interval"); + clearInterval(taskRun.intervalId); + taskRun.intervalId = null; + } + + if (taskRun.isOccupied) { + this.logger.debug({ taskRunId }, "Releasing task occupancy before stop"); + this.releaseTaskRunOccupancy(taskRunId, actingAgentId); + } + + this._updateTaskRun(taskRunId, taskRun, { + status: isCompleted ? "COMPLETED" : "STOPPED", + nextRunAt: undefined, + }); + this.logger.info({ taskRunId }, "Task stopped successfully"); + } + + destroyTaskRun(taskRunId: TaskRunIdValue, actingAgentId: AgentIdValue): void { + this.logger.info({ taskRunId, actingAgentId }, "Attempting to destroy task run"); + this.ac.checkPermission(taskRunId, actingAgentId, WRITE_ONLY_ACCESS); + + const taskRun = this.taskRuns.get(taskRunId); + if (!taskRun) { + this.logger.error({ taskRunId }, "Task run not found for destruction"); + throw new Error(`Task run with ID '${taskRunId}' not found`); + } + + if (taskRun.status === "EXECUTING") { + this.logger.debug({ taskRunId }, "Stopping executing task before removal"); + this.stopTaskRun(taskRunId, actingAgentId); + } + + if (taskRun.isOccupied) { + this.logger.debug({ taskRunId }, "Releasing task occupancy before removal"); + this.releaseTaskRunOccupancy(taskRunId, actingAgentId); + } + + const { + config: { taskKind, taskType, taskConfigVersion }, + } = taskRun; + + // Remove from pool if it's in one + const poolSet = this.getTaskTypeVersionSet(taskKind, taskType, taskConfigVersion); + if (poolSet) { + poolSet.delete(taskRunId); + this.logger.trace( + { + taskRunId, + taskKind, + taskType, + taskConfigVersion, + }, + "Removed task run from pool", + ); + } else { + throw new Error(`Missing pool`); + } + + if (!poolSet.size) { + // Remove pool version array set item + const poolVersionSetsArray = this.getTaskTypeVersionSetsArray(taskKind, taskType)!; + const poolVersionSet = poolVersionSetsArray.findIndex((it) => it[0] === taskConfigVersion); + poolVersionSetsArray.splice(poolVersionSet, 1); + } + + this.taskRuns.delete(taskRunId); + this.logger.info( + { + taskKind, + taskType, + taskConfigVersion, + }, + "Task run destroyed successfully", + ); + + this.stateLogger.logTaskRunDestroy({ + taskRunId, + }); + + const [poolStats, versions] = this.getPoolStats(taskKind, taskType, actingAgentId); + this.stateLogger.logPoolChange({ + taskTypeId: taskSomeIdToTypeValue(taskRun), + poolStats, + versions, + }); + } + + private setTaskRunAwaitingAgent(taskRunId: TaskRunIdValue) { + this.logger.info({ taskRunId }, "Setting task run awaiting agent"); + + const taskRun = this.getTaskRun(taskRunId, TASK_MANAGER_USER); + if (taskRun.status === TaskRunStatusEnumSchema.enum.AWAITING_AGENT) { + this.logger.debug({ taskRunId }, "It's already awaiting - skip"); + return; + } + + this._updateTaskRun(taskRunId, taskRun, { + status: TaskRunStatusEnumSchema.enum.AWAITING_AGENT, + }); + + this.awaitingTasksForAgents.push({ + taskRunId, + agentTypeId: agentSomeIdToTypeValue({ + agentKind: taskRun.config.agentKind, + agentType: taskRun.config.agentType, + agentConfigVersion: taskRun.config.agentVersion, + }), + }); + } + + /** + * Sets task as occupied. + * Only authorized agents can occupy tasks. + */ + private setTaskRunOccupied(taskRunId: TaskRunIdValue, actingAgentId: AgentIdValue): boolean { + this.logger.info({ taskRunId, agentId: actingAgentId }, "Setting task run as occupied"); + this.ac.createPermissions(taskRunId, actingAgentId, FULL_ACCESS, TASK_MANAGER_USER); + + const taskRun = this.getTaskRun(taskRunId, actingAgentId); + if (taskRun.isOccupied) { + this.logger.debug( + { + taskRunId, + exists: !!taskRun, + }, + "Task not available for occupancy", + ); + return false; + } + + const occupiedSince = new Date(); + this._updateTaskRun(taskRunId, taskRun, { + isOccupied: true, + occupiedSince, + currentAgentId: actingAgentId, + }); + + const assignment = clone(omit(taskRun, ["intervalId"])); + + this.agentStateLogger.logTaskAssigned({ + agentId: actingAgentId, + assignment, + assignmentId: taskRunId, + assignedSince: occupiedSince, + }); + + if (this.options.occupancyTimeoutMs) { + this.logger.debug( + { + taskRunId, + timeoutMs: this.options.occupancyTimeoutMs, + }, + "Setting occupancy timeout", + ); + setTimeout(() => { + this.releaseTaskRunOccupancy(taskRunId, actingAgentId); + }, this.options.occupancyTimeoutMs); + } + + this.logger.info({ taskRunId, actingAgentId }, "Task occupied successfully"); + return true; + } + + /** + * Releases task run occupancy. + * Only the current agent or owners can release occupancy. + */ + private releaseTaskRunOccupancy(taskRunId: TaskRunIdValue, actingAgentId: AgentIdValue): boolean { + this.logger.info({ taskRunId, agentId: actingAgentId }, "Releasing task occupancy"); + + const taskRun = this.getTaskRun(taskRunId, actingAgentId); + if (!taskRun || !taskRun.isOccupied) { + this.logger.debug({ taskRunId, exists: !!taskRun }, "Task not available for release"); + return false; + } + + const unassignedAt = new Date(); + this._updateTaskRun(taskRunId, taskRun, { + isOccupied: false, + occupiedSince: null, + currentAgentId: null, + }); + + this.ac.removePermissions(taskRunId, actingAgentId, TASK_MANAGER_USER); + + this.agentStateLogger.logTaskUnassigned({ + agentId: actingAgentId, + assignmentId: taskRunId, + unassignedAt, + }); + + this.logger.info({ taskRunId }, "Task occupancy released successfully"); + return true; + } + + agentAvailable( + agentKind: AgentKindEnum, + agentType: AgentTypeValue, + agentConfigVersion: AgentConfigVersionValue, + availableCount: number, + ) { + if (!this.agentAvailable.length) { + return; + } + let rest = availableCount; + let index = 0; + const awaitingTasks = clone(this.awaitingTasksForAgents); + for (const { taskRunId, agentTypeId } of awaitingTasks) { + if (agentTypeId !== agentSomeIdToTypeValue({ agentKind, agentType, agentConfigVersion })) { + index++; + continue; + } + this.awaitingTasksForAgents.splice(index, 1); + this.scheduleStartTaskRun(taskRunId, TASK_MANAGER_USER); + rest--; + if (!rest) { + return; + } + index++; + } + } + + /** + * Update task status + */ + updateTaskRun( + taskRunId: TaskRunIdValue, + update: Partial>, + actingAgentId: AgentIdValue, + ) { + this.logger.info({ taskRunId, actingAgentId, update }, "Updating task status"); + const status = this.getTaskRun(taskRunId, actingAgentId, WRITE_ONLY_ACCESS); + return this._updateTaskRun(taskRunId, status, update); + } + + // Just for auditlog + private _updateTaskRun( + taskRunId: TaskRunIdValue, + taskRun: TaskRun, + update: Partial, + ): TaskRun { + updateDeepPartialObject(taskRun, update); + this.stateLogger.logTaskRunUpdate({ taskRunId, taskRun: update }); + if (update.status) { + const { taskKind, taskType } = taskRun; + const [poolStats, versions] = this.getPoolStats(taskKind, taskType, TASK_MANAGER_USER); + this.stateLogger.logPoolChange({ + taskTypeId: taskSomeIdToTypeValue({ taskKind, taskType }), + poolStats, + versions, + }); + } + return taskRun; + } + + /** + * Gets all task runs visible to the agent. + */ + getAllTaskRuns(agentId: AgentIdValue): TaskRun[] { + this.logger.info({ agentId }, "Getting all task runs"); + + const taskRuns = Array.from(this.taskRuns.values()).filter((taskRun) => + this.ac.hasPermission(taskRun.taskRunId, agentId, READ_ONLY_ACCESS), + ); + + this.logger.debug({ agentId, count: taskRuns.length }, "Retrieved task runs"); + return taskRuns; + } + + /** + * Checks if a task is currently occupied. + */ + isTaskRunOccupied(taskRunId: TaskRunIdValue, agentId: AgentIdValue): boolean { + this.logger.debug({ taskRunId, agentId }, "Checking task occupancy"); + this.ac.checkPermission(taskRunId, agentId, READ_ONLY_ACCESS); + + const task = this.taskRuns.get(taskRunId); + if (!task) { + this.logger.error({ taskRunId }, "Task not found"); + throw new Error(`Undefined taskRunId: ${taskRunId}`); + } + + return task.isOccupied; + } + + /** + * Executes a task with retry logic and records history. + * @private + */ + private async executeTask(taskRunId: TaskRunIdValue, actingAgentId: AgentIdValue): Promise { + this.logger.info({ taskRunId, agentId: actingAgentId }, "Executing task"); + this.ac.checkPermission(taskRunId, actingAgentId, READ_EXECUTE_ACCESS); + + const taskRun = this.getTaskRun(taskRunId, actingAgentId); + const retryAttempt = taskRun.currentRetryAttempt; + if (retryAttempt > 0) { + this.logger.debug({ retryAttempt, maxRetries: taskRun.config.maxRetries }, "Retry attempt"); + if (!!taskRun.config.maxRetries && retryAttempt >= taskRun.config.maxRetries) { + this.logger.warn({ taskRunId }, "Last retry attempt"); + } + } + + if (taskRun.status === "COMPLETED" || taskRun.isOccupied) { + this.logger.debug( + { + taskRunId, + reason: taskRun.status === "COMPLETED" ? "completed" : "occupied", + }, + "Skipping task execution", + ); + return; + } + const startAt = new Date(); + const startTime = startAt.getTime(); + + this._updateTaskRun(taskRunId, taskRun, { + status: "EXECUTING", + startRunAt: startAt, + lastRunAt: startAt, + nextRunAt: + taskRun.config.maxRepeats != null && taskRun.completedRuns < taskRun.config.maxRepeats + ? new Date(Date.now() + taskRun.config.intervalMs) + : undefined, + }); + + this.logger.debug( + { + taskRunId, + lastRunAt: taskRun.lastRunAt, + nextRunAt: taskRun.nextRunAt, + }, + "Executing task callback", + ); + + await this.onTaskStart(taskRun, this, { + onAwaitingAgentAcquired(taskRunId, taskManager) { + taskManager.setTaskRunAwaitingAgent(taskRunId); + }, + onAgentAcquired(taskRunId, agentId, taskManager) { + taskManager.setTaskRunOccupied(taskRunId, agentId); + }, + onAgentComplete(output, taskRunId, agentId, taskManager) { + const taskRun = taskManager.getTaskRun(taskRunId, agentId, READ_WRITE_ACCESS); + taskManager._updateTaskRun(taskRunId, taskRun, { + completedRuns: taskRun.completedRuns + 1, + }); + + // Record history entry + taskManager.addHistoryEntry(taskRunId, agentId, { + timestamp: new Date(), + terminalStatus: "COMPLETED", + output, + runNumber: taskRun.completedRuns, + maxRuns: taskRun.config.maxRepeats, + retryAttempt: taskRun.currentRetryAttempt, + maxRepeats: taskRun.config.maxRepeats, + agentId: agentId, + executionTimeMs: Date.now() - startTime, + }); + + taskManager.logger.debug( + { + taskRunId, + completedRuns: taskRun.completedRuns, + maxRuns: taskRun.config.maxRepeats, + }, + "Task executed successfully", + ); + + // Check if we've reached maxRuns + if ( + !taskRun.config.maxRepeats || + (taskRun.config.maxRepeats && taskRun.completedRuns >= taskRun.config.maxRepeats) + ) { + taskManager.stopTaskRun(taskRunId, agentId); + taskManager.logger.info( + { + taskRunId, + completedRuns: taskRun.completedRuns, + maxRuns: taskRun.config.maxRepeats, + }, + "Task reached maximum runs and has been stopped", + ); + } else { + taskManager.releaseTaskRunOccupancy(taskRunId, agentId); + } + }, + async onAgentError(err, taskRunId, agentId, taskManager) { + let error; + if (err instanceof FrameworkError) { + error = err.explain(); + } else { + error = err instanceof Error ? err.message : String(err); + } + + const taskRun = taskManager.getTaskRun(taskRunId, agentId); + taskManager._updateTaskRun(taskRunId, taskRun, { + errorCount: taskRun.errorCount + 1, + completedRuns: taskRun.completedRuns + 1, + }); + const retryAttempt = taskRun.currentRetryAttempt; + + // Record history entry + taskManager.addHistoryEntry(taskRunId, agentId, { + timestamp: new Date(), + terminalStatus: "FAILED", + error, + runNumber: taskRun.completedRuns, + maxRuns: taskRun.config.maxRepeats, + retryAttempt, + maxRepeats: taskRun.config.maxRepeats, + agentId: agentId, + executionTimeMs: Date.now() - startTime, + }); + + taskManager.logger.error( + { + taskRunId, + runNumber: taskRun.completedRuns, + maxRuns: taskRun.config.maxRepeats, + retryAttempt, + maxRepeats: taskRun.config.maxRepeats, + errorCount: taskRun.errorCount, + error, + }, + `Task execution failed ${error}`, + ); + + if (taskManager.options.errorHandler) { + taskManager.options.errorHandler(err as Error, taskRunId); + } + + taskManager.logger.debug({ taskRunId }, "Releasing task occupancy before removal"); + taskManager.releaseTaskRunOccupancy(taskRunId, agentId); + if (taskRun.config.maxRepeats) { + if (retryAttempt >= taskRun.config.maxRepeats) { + taskManager.stopTaskRun(taskRunId, taskRun.config.ownerAgentId); + } else { + taskManager._updateTaskRun(taskRunId, taskRun, { + currentRetryAttempt: retryAttempt + 1, + }); + } + } + }, + }); + } + + /** + * Add a history entry for a task + * @private + */ + private addHistoryEntry( + taskRunId: TaskRunIdValue, + actingAgentId: AgentIdValue, + entry: TaskRunHistoryEntry, + ): void { + const taskRun = this.getTaskRun(taskRunId, actingAgentId); + taskRun.history.push(entry); + this.stateLogger.logTaskHistoryEntryCreate({ taskRunId, entry }); + this.agentStateLogger.logTaskHistoryEntry({ + agentId: actingAgentId, + entry, + assignmentId: taskRunId, + }); + + // Trim history if it exceeds maximum entries + const maxEntries = taskRun.maxHistoryEntries ?? this.options.maxHistoryEntries; + if (maxEntries && taskRun.history.length > maxEntries) { + taskRun.history = taskRun.history.slice(-maxEntries); + } + } + + /** + * Gets task history entries + * Agents can only view history for their authorized tasks + */ + getTaskRunHistory( + taskRunId: TaskRunIdValue, + actingAgentId: AgentIdValue, + options: { + limit?: number; + startDate?: Date; + endDate?: Date; + status?: TaskRunTerminalStatusEnum; + } = {}, + ): TaskRunHistoryEntry[] { + this.logger.trace( + { + taskRunId, + agentId: actingAgentId, + options, + }, + "Getting task history", + ); + this.ac.checkPermission(taskRunId, actingAgentId, READ_ONLY_ACCESS); + + const taskRun = this.getTaskRun(taskRunId, actingAgentId); + let history = taskRun.history; + + // Apply filters + if (options.startDate) { + history = history.filter((entry) => entry.timestamp >= options.startDate!); + } + if (options.endDate) { + history = history.filter((entry) => entry.timestamp <= options.endDate!); + } + if (options.status) { + history = history.filter((entry) => entry.terminalStatus === status); + } + if (options.limit) { + history = history.slice(-options.limit); + } + + return history; + } + + destroy() { + this.logger.debug("Destroy"); + if (this.taskStartIntervalId) { + clearInterval(this.taskStartIntervalId); + this.taskStartIntervalId = null; + } + } +} diff --git a/src/tasks/state/builder.ts b/src/tasks/state/builder.ts new file mode 100644 index 0000000..7bd2895 --- /dev/null +++ b/src/tasks/state/builder.ts @@ -0,0 +1,298 @@ +import { AgentKindEnum, AgentTypeValue } from "@/agents/registry/dto.js"; +import { BaseStateBuilder } from "@/base/state/base-state-builder.js"; +import { + AgentTypeRegisterEvent, + TaskConfigCreateEvent, + TaskConfigDestroyEvent, + TaskConfigUpdateEvent, + TaskHistoryEntryCreateEvent, + TaskPoolChangeEvent, + TaskRunCreateEvent, + TaskRunDestroyEvent, + TaskRunUpdateEvent, + TaskStateDataType, + TaskStateDataTypeSchema, +} from "./dto.js"; +import { stringToAgentType } from "@/agents/agent-id.js"; +import { + TaskConfigIdValue, + TaskConfig, + TaskTypeValue, + TaskConfigPoolStats, + TaskKindEnum, + TaskRunIdValue, + TaskRun, +} from "../manager/dto.js"; +import { stringToTaskConfig, stringToTaskType, taskSomeIdToKindValue } from "../task-id.js"; +import { clone } from "remeda"; +import { updateDeepPartialObject } from "@/utils/objects.js"; + +// Define update types as const to ensure type safety +export const StateUpdateType = { + AGENT_TYPE: "agent_type", + TASK_CONFIG: "task_config", + TASK_RUN: "task_config", + POOL: "pool", + HISTORY_ENTRY: "history_entry", + FULL: "full", +} as const; + +// Define the type for the update types +export type StateUpdateType = (typeof StateUpdateType)[keyof typeof StateUpdateType]; + +export interface TaskRunInfo { + taskRunId: string; + taskConfigId: string; + taskConfigVersion: number; + taskRun: TaskRun; + isDestroyed: boolean; +} + +export interface TaskPool { + taskType: TaskTypeValue; + poolStats: TaskConfigPoolStats; + versions: [number, TaskConfigPoolStats][]; +} + +export interface TaskState { + registeredAgentTypes: Map>; + taskConfigs: Map; + taskRunPools: Map>; + taskRuns: Map; +} + +export class TaskStateBuilder extends BaseStateBuilder { + constructor() { + super(TaskStateDataTypeSchema, { + registeredAgentTypes: new Map(), + taskConfigs: new Map(), + taskRunPools: new Map(), + taskRuns: new Map(), + }); + } + + protected processStateUpdate(data: TaskStateDataType): void { + switch (data.kind) { + case "agent_type_register": + this.handleAgentTypeRegister(data); + this.emit("state:updated", { + type: StateUpdateType.AGENT_TYPE, + ids: [data.agentTypeId], + }); + break; + case "task_config_create": + this.handleTaskConfigCreate(data); + this.emit("state:updated", { + type: StateUpdateType.TASK_CONFIG, + ids: [data.taskConfigId, data.taskType], + }); + break; + case "task_config_update": + this.handleTaskConfigUpdate(data); + this.emit("state:updated", { + type: StateUpdateType.TASK_CONFIG, + ids: [data.taskConfigId, data.taskType], + }); + break; + case "task_config_destroy": + this.handleTaskConfigDestroy(data); + this.emit("state:updated", { + type: StateUpdateType.TASK_CONFIG, + ids: [data.taskConfigId, data.taskType], + }); + break; + case "pool_change": + this.handlePoolChange(data); + this.emit("state:updated", { + type: StateUpdateType.POOL, + ids: [data.taskTypeId], + }); + break; + case "task_run_create": + case "task_run_update": + case "task_run_destroy": + this.handleTaskRunLifecycle(data); + this.emit("state:updated", { + type: StateUpdateType.TASK_RUN, + ids: [data.taskRunId], + }); + break; + case "history_entry_create": + this.handleHistoryEntryCreate(data); + this.emit("state:updated", { + type: StateUpdateType.HISTORY_ENTRY, + ids: [data.taskRunId], + }); + break; + } + } + handleHistoryEntryCreate(data: TaskHistoryEntryCreateEvent) { + const { taskRunId, entry } = data; + const taskRun = this.state.taskRuns.get(taskRunId); + if (!taskRun) { + throw new Error(`Task run ${taskRunId} was not found`); + } + + taskRun.taskRun.history.push(entry); + } + + private handleTaskRunLifecycle( + data: TaskRunCreateEvent | TaskRunUpdateEvent | TaskRunDestroyEvent, + ): void { + const { taskRunId } = data; + + switch (data.kind) { + case "task_run_create": { + if (this.state.taskRuns.has(taskRunId)) { + throw new Error(`Task run ${taskRunId} already exists`); + } + + const taskConfigId = stringToTaskConfig(data.taskConfigId); + + this.state.taskRuns.set(taskRunId, { + taskRunId, + taskConfigId: data.taskConfigId, + taskConfigVersion: taskConfigId.taskConfigVersion, + taskRun: clone(data.taskRun), + isDestroyed: false, + }); + break; + } + case "task_run_update": { + const taskRunInfo = this.state.taskRuns.get(taskRunId); + if (!taskRunInfo) { + throw new Error(`Task run info ${taskRunId} doesn't exist for update`); + } + + updateDeepPartialObject(taskRunInfo.taskRun, data.taskRun); + break; + } + case "task_run_destroy": { + const taskRunInfo = this.state.taskRuns.get(taskRunId); + if (!taskRunInfo) { + throw new Error(`Task run info ${taskRunId} doesn't exist for destroy`); + } + taskRunInfo.isDestroyed = true; + break; + } + } + } + + handlePoolChange(data: TaskPoolChangeEvent) { + const taskTypeId = stringToTaskType(data.taskTypeId); + const pool = this.state.taskRunPools.get(taskSomeIdToKindValue(taskTypeId) as TaskKindEnum); + if (!pool) { + throw new Error(`Missing pool for type: ${data.taskTypeId}`); + } + + const poolType = pool.get(taskTypeId.taskType); + if (!poolType) { + throw new Error(`Missing pool type: ${data.taskTypeId}`); + } + + poolType.poolStats = data.poolStats; + poolType.versions = data.versions; + } + + handleTaskConfigDestroy(data: TaskConfigDestroyEvent) { + const { taskConfigId: taskConfigIdStr, taskType } = data; + + // Remove the config + if (!this.state.taskConfigs.has(taskConfigIdStr)) { + throw new Error(`Task config not found for task pool type: ${taskType}`); + } + this.state.taskConfigs.delete(taskConfigIdStr); + const taskConfigId = stringToTaskConfig(taskConfigIdStr); + + // Clean up related pool + const taskKindPool = this.state.taskRunPools.get(taskConfigId.taskKind); + if (taskKindPool) { + taskKindPool.delete(taskConfigId.taskType); + if (taskKindPool.size === 0) { + this.state.taskRunPools.delete(taskConfigId.taskKind); + } + } + } + handleTaskConfigUpdate(data: TaskConfigUpdateEvent) { + const { config, taskConfigId, taskType: taskTypeId } = data; + + // Update existing config + const taskConfigsVersions = this.state.taskConfigs.get(taskConfigId); + if (!taskConfigsVersions) { + throw new Error(`Task config versions not found for task type: ${taskTypeId}`); + } + taskConfigsVersions.push(config); + } + handleTaskConfigCreate(data: TaskConfigCreateEvent) { + const { config, taskType } = data; + + // Store the config + this.state.taskConfigs.set(taskType, [config]); + + // Initialize the pool if needed + let pool = this.state.taskRunPools.get(config.taskKind); + if (!pool) { + pool = new Map(); + this.state.taskRunPools.set(config.taskKind, pool); + } + + const poolType: TaskPool = { + taskType, + poolStats: { + poolSize: 0, + active: 0, + terminated: 0, + completed: 0, + running: 0, + failed: 0, + stopped: 0, + pending: 0, + awaiting_agent: 0, + created: 0, + total: 0, + }, + versions: [], + }; + + pool.set(config.taskType, poolType); + } + handleAgentTypeRegister(data: AgentTypeRegisterEvent) { + const agentTypeId = stringToAgentType(data.agentTypeId); + let kindSet = this.state.registeredAgentTypes.get(agentTypeId.agentKind); + if (!kindSet) { + kindSet = new Set(); + this.state.registeredAgentTypes.set(agentTypeId.agentKind, kindSet); + } + kindSet.add(agentTypeId.agentType); + } + protected reset(): void { + this.state.registeredAgentTypes.clear(); + this.state.taskConfigs.clear(); + this.state.taskRunPools.clear(); + this.state.taskRuns.clear(); + } + + getAllTaskRuns(): TaskRunInfo[] { + return Array.from(this.state.taskRuns.values()); + } + + getTaskConfig(taskTypeId: string, taskConfigVersion?: number): TaskConfig | undefined { + const versions = this.state.taskConfigs.get(taskTypeId); + if (!versions) { + throw new Error(`Task config versions not found for '${taskTypeId}'`); + } + if (taskConfigVersion != null) { + return versions.find((v) => v.taskConfigVersion === taskConfigVersion); + } + return versions.at(-1); + } + + private getTaskPoolsMap(agentKindId: TaskKindEnum): Map | undefined { + return this.state.taskRunPools.get(agentKindId); + } + + getTaskPool(agentKind: TaskKindEnum, agentType: string): TaskPool | undefined { + const map = this.getTaskPoolsMap(agentKind); + return map?.get(agentType); + } +} diff --git a/src/tasks/state/dto.ts b/src/tasks/state/dto.ts new file mode 100644 index 0000000..e2c5839 --- /dev/null +++ b/src/tasks/state/dto.ts @@ -0,0 +1,115 @@ +import { z } from "zod"; +import { + TaskConfigIdValueSchema, + TaskConfigPoolStatsSchema, + TaskConfigSchema, + TaskRunHistoryEntrySchema, + TaskRunIdValueSchema, + TaskRunSchema, + TaskTypeValueSchema, +} from "../manager/dto.js"; + +// Base schemas +export const TaskEventKindEnum = z.enum([ + "agent_type_register", + "task_config_create", + "task_config_update", + "task_config_destroy", + "pool_change", + "task_run_create", + "task_run_update", + "task_run_destroy", + "history_entry_create", +]); + +export const BaseTaskEventSchema = z.object({ + kind: TaskEventKindEnum, +}); + +// Agent Types Events +export const AgentTypeRegisterEventSchema = BaseTaskEventSchema.extend({ + kind: z.literal(TaskEventKindEnum.enum.agent_type_register), + agentTypeId: z.string(), +}); +export type AgentTypeRegisterEvent = z.infer; + +// Task Config Events + +export const BaseTaskConfigLifecycleEventSchema = BaseTaskEventSchema.extend({ + taskConfigId: TaskConfigIdValueSchema, + taskType: TaskTypeValueSchema, +}); +export type BaseTaskConfigLifecycleEvent = z.infer; + +export const TaskConfigCreateEventSchema = BaseTaskConfigLifecycleEventSchema.extend({ + kind: z.literal(TaskEventKindEnum.enum.task_config_create), + config: TaskConfigSchema, +}); +export type TaskConfigCreateEvent = z.infer; + +export const TaskConfigUpdateEventSchema = BaseTaskConfigLifecycleEventSchema.extend({ + kind: z.literal(TaskEventKindEnum.enum.task_config_update), + config: TaskConfigSchema, +}); +export type TaskConfigUpdateEvent = z.infer; + +export const TaskConfigDestroyEventSchema = BaseTaskConfigLifecycleEventSchema.extend({ + kind: z.literal(TaskEventKindEnum.enum.task_config_destroy), +}); +export type TaskConfigDestroyEvent = z.infer; + +// Task Status Lifecycle Events + +export const BaseTaskRunLifecycleEventSchema = BaseTaskEventSchema.extend({ + taskRunId: TaskRunIdValueSchema, +}); +export type BaseTaskRunLifecycleEvent = z.infer; + +export const TaskRunCreateEventSchema = BaseTaskRunLifecycleEventSchema.extend({ + kind: z.literal(TaskEventKindEnum.enum.task_run_create), + taskConfigId: TaskConfigIdValueSchema, + taskRun: TaskRunSchema, +}); +export type TaskRunCreateEvent = z.infer; + +export const TaskRunUpdateEventSchema = BaseTaskRunLifecycleEventSchema.extend({ + kind: z.literal(TaskEventKindEnum.enum.task_run_update), + taskRun: TaskRunSchema.omit({ history: true }).partial(), +}); +export type TaskRunUpdateEvent = z.infer; + +export const TaskRunDestroyEventSchema = BaseTaskRunLifecycleEventSchema.extend({ + kind: z.literal(TaskEventKindEnum.enum.task_run_destroy), +}); +export type TaskRunDestroyEvent = z.infer; + +// Task History Entry +export const TaskHistoryEntryCreateEventSchema = BaseTaskEventSchema.extend({ + kind: z.literal(TaskEventKindEnum.enum.history_entry_create), + taskRunId: TaskRunIdValueSchema, + entry: TaskRunHistoryEntrySchema, +}); +export type TaskHistoryEntryCreateEvent = z.infer; + +// Pool Events +export const TaskPoolChangeEventSchema = BaseTaskEventSchema.extend({ + kind: z.literal(TaskEventKindEnum.enum.pool_change), + taskTypeId: z.string(), + poolStats: TaskConfigPoolStatsSchema, + versions: z.array(z.tuple([z.number(), TaskConfigPoolStatsSchema])), +}); +export type TaskPoolChangeEvent = z.infer; + +// Union of all event types +export const TaskStateDataTypeSchema = z.discriminatedUnion("kind", [ + AgentTypeRegisterEventSchema, + TaskConfigCreateEventSchema, + TaskConfigUpdateEventSchema, + TaskConfigDestroyEventSchema, + TaskRunCreateEventSchema, + TaskRunUpdateEventSchema, + TaskRunDestroyEventSchema, + TaskHistoryEntryCreateEventSchema, + TaskPoolChangeEventSchema, +]); +export type TaskStateDataType = z.infer; diff --git a/src/tasks/state/logger.ts b/src/tasks/state/logger.ts new file mode 100644 index 0000000..d1d4cf9 --- /dev/null +++ b/src/tasks/state/logger.ts @@ -0,0 +1,129 @@ +import { BaseStateLogger } from "../../base/state/base-state-logger.js"; +import { + AgentTypeRegisterEvent, + TaskConfigCreateEvent, + TaskConfigDestroyEvent, + TaskConfigUpdateEvent, + TaskEventKindEnum, + TaskHistoryEntryCreateEvent, + TaskPoolChangeEvent, + TaskRunCreateEvent, + TaskRunDestroyEvent, + TaskRunUpdateEvent, + TaskStateDataTypeSchema, +} from "./dto.js"; + +export const DEFAULT_NAME = "task_state"; +export const DEFAULT_PATH = ["logs"] as readonly string[]; + +export class TaskStateLogger extends BaseStateLogger { + private static instance?: TaskStateLogger; + + static init() { + if (this.instance) { + throw new Error(`Task state logger is already initialized`); + } + this.instance = new TaskStateLogger(); + return this.instance; + } + + static getInstance() { + if (!this.instance) { + throw new Error(`Task state logger wasn't initialized yet`); + } + return this.instance; + } + + constructor(logPath?: string) { + super(DEFAULT_PATH, DEFAULT_NAME, logPath); + } + + public logAgentTypeRegister(data: Omit) { + this.logUpdate({ + data: { + kind: TaskEventKindEnum.Values.agent_type_register, + ...data, + }, + }); + } + + public logTaskConfigCreate(data: Omit) { + this.logUpdate({ + data: { + kind: TaskEventKindEnum.Values.task_config_create, + ...data, + }, + }); + } + + public logTaskConfigUpdate(data: Omit) { + this.logUpdate({ + data: { + kind: TaskEventKindEnum.Values.task_config_update, + ...data, + }, + }); + } + + public logTaskConfigDestroy(data: Omit) { + this.logUpdate({ + data: { + kind: TaskEventKindEnum.Values.task_config_destroy, + ...data, + }, + }); + } + + public logTaskRunCreate(data: Omit) { + this.logUpdate({ + data: { + kind: TaskEventKindEnum.Values.task_run_create, + ...data, + }, + }); + } + + public logTaskRunUpdate(data: Omit) { + this.logUpdate({ + data: { + kind: TaskEventKindEnum.Values.task_run_update, + ...data, + }, + }); + } + + public logTaskRunDestroy(data: Omit) { + this.logUpdate({ + data: { + kind: TaskEventKindEnum.Values.task_run_destroy, + ...data, + }, + }); + } + + public logTaskHistoryEntryCreate(data: Omit) { + this.logUpdate({ + data: { + kind: TaskEventKindEnum.Values.history_entry_create, + ...data, + }, + }); + } + + public logPoolChange(data: Omit) { + this.logUpdate({ + data: { + kind: TaskEventKindEnum.Values.pool_change, + ...data, + }, + }); + } +} + +export function init() { + return TaskStateLogger.init(); +} + +export function instance() { + return TaskStateLogger.getInstance(); +} diff --git a/src/tasks/task-id.ts b/src/tasks/task-id.ts new file mode 100644 index 0000000..3d77804 --- /dev/null +++ b/src/tasks/task-id.ts @@ -0,0 +1,158 @@ +import { + EntityKindId, + EntityNumId, + entityToKindString, + entityToTypeIdString, + entityToVersionIdString, + entityToVersionNumIdString, + EntityTypeId, + EntityVersionId, + EntityVersionNumId, + stringToEntityKind, + stringToEntityType, + stringToEntityVersion, + stringToEntityVersionNum, +} from "@/base/entity-id.js"; +import { + TaskConfigIdValue, + TaskKindEnum, + TaskKindEnumSchema, + TaskKindValue, + TaskRunIdValue, + TaskTypeValue, +} from "./manager/dto.js"; + +// Task specific interfaces with domain-specific naming +export interface TaskKindId { + taskKind: TaskKindEnum; +} + +export interface TaskTypeId extends TaskKindId { + taskType: string; +} + +export interface TaskConfigId extends TaskTypeId { + taskConfigVersion: number; +} + +export interface TaskRunId extends TaskConfigId { + taskRunNum: number; +} + +// Public conversion functions to generic types +export function taskKindToEntityKindId(taskKindId: TaskKindId): EntityKindId { + return { + kind: taskKindId.taskKind, + }; +} + +export function taskTypeToEntityTypeId(taskTypeId: TaskTypeId): EntityTypeId { + return { + ...taskKindToEntityKindId(taskTypeId), + type: taskTypeId.taskType, + }; +} + +export function taskConfigToEntityVersionId( + taskConfigId: TaskConfigId, +): EntityVersionId { + return { + ...taskTypeToEntityTypeId(taskConfigId), + version: taskConfigId.taskConfigVersion, + }; +} + +export function taskRunToEntityNumId(taskRunId: TaskRunId): EntityNumId { + return { + ...taskTypeToEntityTypeId(taskRunId), + num: taskRunId.taskRunNum, + }; +} + +export function taskRunToEntityVersionNumId( + taskRunId: TaskRunId, +): EntityVersionNumId { + return { + ...taskRunToEntityNumId(taskRunId), + version: taskRunId.taskConfigVersion, + }; +} + +// Task ID validation +function validateTaskKind(kind: string): TaskKindEnum { + const result = TaskKindEnumSchema.safeParse(kind); + if (!result.success) { + throw new Error(`Invalid task kind: ${kind}`); + } + return result.data; +} + +// Task conversion functions from string +export function stringToTaskKind(str: string): TaskKindId { + const generic = stringToEntityKind(str, validateTaskKind); + return { + taskKind: generic.kind, + }; +} + +export function stringToTaskType(str: string): TaskTypeId { + const generic = stringToEntityType(str, validateTaskKind); + return { + taskKind: generic.kind, + taskType: generic.type, + }; +} + +export function stringToTaskConfig(str: string): TaskConfigId { + const generic = stringToEntityVersion(str, validateTaskKind); + return { + taskKind: generic.kind, + taskType: generic.type, + taskConfigVersion: generic.version, + }; +} + +export function stringToTaskRun(str: string): TaskRunId { + const generic = stringToEntityVersionNum(str, validateTaskKind); + return { + taskKind: generic.kind, + taskType: generic.type, + taskRunNum: generic.num, + taskConfigVersion: generic.version, + }; +} + +// String conversion functions +export function taskSomeIdToKindValue( + task: TaskKindId | TaskTypeId | TaskConfigId | TaskRunId, +): TaskKindValue { + return entityToKindString(taskKindToEntityKindId(task)); +} + +export function taskSomeIdToTypeValue(task: TaskTypeId | TaskConfigId | TaskRunId): TaskTypeValue { + return entityToTypeIdString(taskTypeToEntityTypeId(task)); +} + +export function taskConfigIdToValue(taskConfigId: TaskConfigId): TaskConfigIdValue { + return entityToVersionIdString(taskConfigToEntityVersionId(taskConfigId)); +} + +export function taskRunIdToString(taskId: TaskRunId): TaskRunIdValue { + return entityToVersionNumIdString(taskRunToEntityVersionNumId(taskId)); +} + +// Generic conversion that handles any task ID type +export function taskSomeIdToString( + taskSomeId: TaskKindId | TaskTypeId | TaskConfigId | TaskRunId, +): string { + if ("num" in taskSomeId) { + return taskRunIdToString(taskSomeId as TaskRunId); + } + if ("version" in taskSomeId) { + return taskConfigIdToValue(taskSomeId as TaskConfigId); + } + if ("agentType" in taskSomeId) { + return taskSomeIdToTypeValue(taskSomeId as TaskTypeId); + } + return taskSomeIdToKindValue(taskSomeId); +} diff --git a/src/tasks/task-manager.ts b/src/tasks/task-manager.ts deleted file mode 100644 index 47a8d38..0000000 --- a/src/tasks/task-manager.ts +++ /dev/null @@ -1,742 +0,0 @@ -import { FrameworkError } from "bee-agent-framework"; -import { Logger } from "bee-agent-framework/logger/logger"; -import { AgentKindSchema } from "src/agents/agent-registry.js"; -import { z } from "zod"; - -export const TaskConfigSchema = z - .object({ - id: z.string().describe("Unique identifier for the task"), - input: z.string().describe("Input data for the task."), - description: z.string().describe("Detail information about the task and its context."), - intervalMs: z.number().describe("Interval between task executions in milliseconds"), - runImmediately: z.boolean().describe("Whether to run the task immediately upon starting"), - maxRetries: z - .number() - .describe( - "Maximum number of retry attempts if task execution fails. undefined if no retries.", - ) - .nullish(), - retryDelayMs: z.number().describe("Delay between retry attempts in milliseconds").nullish(), - ownerAgentId: z.string().describe("Identifier of who owns/manages this task"), - agentKind: AgentKindSchema, - agentType: z.string().describe("Agent type that is allowed to execute this task"), - maxRuns: z - .number() - .describe("Maximum number of times this task should execute. undefined if infinite runs.") - .nullish(), - }) - .describe("Represents a periodic task configuration."); - -export type TaskConfig = z.infer; - -export const TaskTerminalStatusEnumSchema = z.enum(["STOPPED", "FAILED", "COMPLETED"]); -export type TaskTerminalStatusEnum = z.infer; - -export const TaskHistoryEntrySchema = z - .object({ - timestamp: z.date().describe("When this task execution occurred"), - terminalStatus: TaskTerminalStatusEnumSchema, - output: z.unknown().describe("Output produced by the task callback"), - error: z.string().optional().describe("Error message if execution failed"), - runNumber: z.number().describe("Which run number this was (1-based)"), - maxRuns: z - .number() - .describe("Maximum number of times this task should execute. Undefined means infinite runs.") - .nullish(), - retryAttempt: z.number().describe("How many retries were needed for this execution"), - maxRetries: z - .number() - .describe( - "Maximum number of retry attempts if task execution fails. undefined if no retries.", - ) - .nullish(), - agentId: z.string().optional().describe("ID of agent that executed the task, if occupied"), - executionTimeMs: z.number().describe("How long the task execution took in milliseconds"), - }) - .describe("Records details about a single execution of a task"); - -export type TaskHistoryEntry = z.infer; - -export const TaskStatusEnumSchema = z.enum([ - "SCHEDULED", - "RUNNING", - "WAITING", - "STOPPED", - "FAILED", - "COMPLETED", -]); -export type TaskStatusEnum = z.infer; - -// Update existing TaskStatus schema to include history -export const TaskStatusSchema = z - .object({ - id: z - .string() - .min(1, "Task ID cannot be empty") - .describe("Unique identifier matching the corresponding AgentTask"), - status: TaskStatusEnumSchema.describe("The status of the task."), - isOccupied: z - .boolean() - .describe("Indicates if the task is currently being operated on by an agent"), - occupiedSince: z - .date() - .optional() - .describe("Timestamp when the task was marked as occupied. undefined if not occupied"), - lastRunAt: z.date().optional().describe("Timestamp of the last successful execution"), - nextRunAt: z.date().optional().describe("Expected timestamp of the next scheduled execution"), - errorCount: z.number().int().describe("Count of consecutive execution failures"), - currentRetryAttempt: z - .number() - .describe("Current retry count. Maximum retries configured via maxRetries"), - ownerAgentId: z.string().describe("ID of the agent who owns/manages this task"), - currentAgentId: z - .string() - .optional() - .describe("ID of the agent currently operating on the task. undefined if not occupied"), - completedRuns: z - .number() - .int() - .describe("Number of times this task has been successfully executed"), - history: z.array(TaskHistoryEntrySchema).describe("History of task executions"), - maxHistoryEntries: z - .number() - .optional() - .describe("Maximum number of history entries to keep. Undefined means keep all history."), - }) - .describe("Represents the current status and execution state of a task"); - -export type TaskStatus = z.infer; - -export const TaskSchema = z - .object({ - id: z.string().describe("Unique identifier for the task"), - status: TaskStatusSchema, - config: TaskConfigSchema, - }) - .describe("Represents a periodic task configuration."); -export type Task = z.infer; - -export class PermissionError extends Error { - constructor(message: string) { - super(message); - this.name = "PermissionError"; - } -} - -export class TaskManager { - private readonly logger: Logger; - private tasks = new Map< - string, - Task & { - intervalId: NodeJS.Timeout | null; - } - >(); - private scheduledTasksToStart: { taskId: string; agentId: string }[] = []; - private taskStartIntervalId: NodeJS.Timeout | null = null; - - constructor( - private onTaskStart: ( - task: TaskConfig, - taskManager: TaskManager, - callbacks: { - onAgentCreate: (taskId: string, agentId: string, taskManage: TaskManager) => void; - onAgentComplete: ( - output: string, - taskId: string, - agentId: string, - taskManage: TaskManager, - ) => void; - onAgentError: ( - err: Error, - taskId: string, - agentId: string, - taskManage: TaskManager, - ) => void; - }, - ) => Promise, - private options: { - errorHandler?: (error: Error, taskId: string) => void; - occupancyTimeoutMs?: number; - adminIds?: string[]; - maxHistoryEntries?: number; - } = {}, - ) { - this.logger = Logger.root.child({ name: "TaskManager" }); - this.logger.info("Initializing TaskManager"); - - this.options = { - errorHandler: (error: Error, taskId: string) => { - this.logger.error("Task error occurred", { taskId, error }); - }, - occupancyTimeoutMs: 30 * 60 * 1000, - adminIds: [], - maxHistoryEntries: 100, // Default to keeping last 100 entries - ...options, - }; - - this.taskStartIntervalId = setInterval(async () => { - try { - await this.processNextStartTask(); // Your async function - } catch (err) { - this.logger.error("Process next start task error", err); - } - }, 100); // Runs every 100ms (0.1 second) - } - - /** - * Add a history entry for a task - * @private - */ - private addHistoryEntry(taskId: string, entry: TaskHistoryEntry): void { - const task = this.tasks.get(taskId); - if (!task) { - return; - } - - task.status.history.push(entry); - - // Trim history if it exceeds maximum entries - const maxEntries = task.status.maxHistoryEntries ?? this.options.maxHistoryEntries; - if (maxEntries && task.status.history.length > maxEntries) { - task.status.history = task.status.history.slice(-maxEntries); - } - } - - /** - * Gets task history entries - * Agents can only view history for their authorized tasks - */ - getTaskHistory( - taskId: string, - agentId: string, - options: { - limit?: number; - startDate?: Date; - endDate?: Date; - status?: TaskTerminalStatusEnum; - } = {}, - ): TaskHistoryEntry[] { - this.logger.trace("Getting task history", { taskId, agentId, options }); - - if (!this.hasAgentPermission(taskId, agentId)) { - this.logger.error("Permission denied for viewing task history", { taskId, agentId }); - throw new PermissionError(`Agent ${agentId} does not have permission to view task ${taskId}`); - } - - const task = this.tasks.get(taskId); - if (!task) { - this.logger.error("Task not found", { taskId }); - throw new Error(`Task ${taskId} not found`); - } - - let history = task.status.history; - - // Apply filters - if (options.startDate) { - history = history.filter((entry) => entry.timestamp >= options.startDate!); - } - if (options.endDate) { - history = history.filter((entry) => entry.timestamp <= options.endDate!); - } - if (options.status) { - history = history.filter((entry) => entry.terminalStatus === status); - } - if (options.limit) { - history = history.slice(-options.limit); - } - - return history; - } - - /** - * Checks if an agent has owner-level permissions for a task - */ - private hasOwnerPermission(taskId: string, agentId: string): boolean { - this.logger.trace("Checking owner permission", { taskId, agentId }); - - const task = this.tasks.get(taskId); - if (!task) { - this.logger.debug("Task not found for permission check", { taskId }); - return false; - } - - const hasPermission = - task.config.ownerAgentId === agentId || this.options.adminIds?.includes(agentId) || false; - this.logger.debug("Owner permission check result", { taskId, agentId, hasPermission }); - return hasPermission; - } - - /** - * Checks if an agent has execution permissions for a task - */ - private hasAgentPermission(taskId: string, agentId: string): boolean { - this.logger.trace("Checking agent permission", { taskId, agentId }); - - const task = this.tasks.get(taskId); - if (!task) { - this.logger.debug("Task not found for permission check", { taskId }); - return false; - } - - const hasPermission = - agentId.includes(`:${task.config.agentType}[`) || this.hasOwnerPermission(taskId, agentId); - this.logger.debug("Agent permission check result", { taskId, agentId, hasPermission }); - return hasPermission; - } - - /** - * Schedules a new task. - * Only owners and admins can schedule tasks. - */ - scheduleTask(task: TaskConfig, agentId: string): void { - this.logger.info("Scheduling new task", { taskId: task.id, agentId }); - - if (task.ownerAgentId !== agentId && !this.options.adminIds?.includes(agentId)) { - this.logger.error("Permission denied for task scheduling", { - taskId: task.id, - agentId, - ownerAgentId: task.ownerAgentId, - }); - throw new PermissionError( - `Agent ${agentId} cannot create task with owner ${task.ownerAgentId}`, - ); - } - - if (this.tasks.has(task.id)) { - this.logger.error("Task already exists", { taskId: task.id }); - throw new Error(`Task with id ${task.id} already exists`); - } - - const status: TaskStatus = { - id: task.id, - status: "SCHEDULED", - currentRetryAttempt: 0, - isOccupied: false, - errorCount: 0, - ownerAgentId: task.ownerAgentId, - completedRuns: 0, - history: [], - }; - - this.tasks.set(task.id, { - id: task.id, - intervalId: null, - status, - config: task, - }); - - this.logger.info("Task scheduled successfully", { taskId: task.id }); - } - - /** - * Schedule task to start as soon as possible. - * Only owners and admins can start/stop tasks. - */ - scheduleTaskStart(taskId: string, agentId: string): void { - this.logger.info("Schedule task start", { taskId, agentId }); - this.scheduledTasksToStart.push({ taskId, agentId }); - } - - async processNextStartTask() { - if (!this.scheduledTasksToStart.length) { - return; - } - const { taskId, agentId } = this.scheduledTasksToStart.shift()!; - - this.logger.info("Starting task", { taskId, agentId }); - - const task = this.tasks.get(taskId); - if (!task) { - this.logger.error("Task not found", { taskId }); - throw new Error(`Task ${taskId} not found`); - } - - if (!this.hasOwnerPermission(taskId, agentId)) { - this.logger.error("Permission denied for starting task", { taskId, agentId }); - throw new PermissionError( - `Agent ${agentId} does not have permission to start task ${taskId}`, - ); - } - - if (task.status.status === "RUNNING") { - this.logger.warn("Task already running", { taskId }); - throw new Error(`Task ${taskId} is already running`); - } - - task.status.status = "RUNNING"; - task.status.nextRunAt = new Date(Date.now() + task.config.intervalMs); - - if (task.config.runImmediately) { - this.logger.debug("Executing task immediately", { taskId }); - // TODO Parallelism - await this.executeTask(taskId); - } - - if (!task.config.maxRuns || 1 < task.config.maxRuns) { - this.logger.debug("Setting up task interval", { taskId, intervalMs: task.config.intervalMs }); - const self = this; - task.intervalId = setInterval(async () => { - await self.executeTask(taskId); - }, task.config.intervalMs); - task.status.status = "WAITING"; - } - - this.logger.info("Task started successfully", { taskId }); - } - - /** - * Stops a task. - * Only owners and admins can start/stop tasks. - */ - stopTask(taskId: string, agentId: string): void { - this.logger.info("Stopping task", { taskId, agentId }); - - if (!this.hasOwnerPermission(taskId, agentId)) { - this.logger.error("Permission denied for stopping task", { taskId, agentId }); - throw new PermissionError(`Agent ${agentId} does not have permission to stop task ${taskId}`); - } - - const task = this.tasks.get(taskId); - if (!task) { - this.logger.error("Task not found", { taskId }); - throw new Error(`Task ${taskId} not found`); - } - - if (task.status.status === "STOPPED") { - this.logger.debug("Task already stopped", { taskId }); - return; - } - - if (task.intervalId) { - this.logger.debug("Clearing task interval", { taskId }); - clearInterval(task.intervalId); - task.intervalId = null; - } - - if (task.status.isOccupied) { - this.logger.debug("Releasing task occupancy before stop", { taskId }); - this.releaseTaskOccupancy(taskId, agentId); - } - - task.status.status = "STOPPED"; - task.status.nextRunAt = undefined; - this.logger.info("Task stopped successfully", { taskId }); - } - - /** - * Removes a task completely. - * Only owners and admins can remove tasks. - */ - removeTask(taskId: string, agentId: string): void { - this.logger.info("Removing task", { taskId, agentId }); - - if (!this.hasOwnerPermission(taskId, agentId)) { - this.logger.error("Permission denied for removing task", { taskId, agentId }); - throw new PermissionError( - `Agent ${agentId} does not have permission to remove task ${taskId}`, - ); - } - - const task = this.tasks.get(taskId); - if (!task) { - this.logger.error("Task not found", { taskId }); - throw new Error(`Task ${taskId} not found`); - } - - if (task.status.status === "RUNNING") { - this.logger.debug("Stopping running task before removal", { taskId }); - this.stopTask(taskId, agentId); - } - - if (task.status.isOccupied) { - this.logger.debug("Releasing task occupancy before removal", { taskId }); - this.releaseTaskOccupancy(taskId, agentId); - } - - this.tasks.delete(taskId); - this.logger.info("Task removed successfully", { taskId }); - } - - /** - * Sets task as occupied. - * Only authorized agents can occupy tasks. - */ - setTaskOccupied(taskId: string, agentId: string): boolean { - this.logger.info("Setting task as occupied", { taskId, agentId }); - - if (!this.hasAgentPermission(taskId, agentId)) { - this.logger.error("Permission denied for occupying task", { taskId, agentId }); - throw new PermissionError(`Agent ${agentId} is not authorized to operate on task ${taskId}`); - } - - const task = this.tasks.get(taskId); - if (!task || task.status.isOccupied) { - this.logger.debug("Task not available for occupancy", { taskId, exists: !!task }); - return false; - } - - task.status.isOccupied = true; - task.status.occupiedSince = new Date(); - task.status.currentAgentId = agentId; - - if (this.options.occupancyTimeoutMs) { - this.logger.debug("Setting occupancy timeout", { - taskId, - timeoutMs: this.options.occupancyTimeoutMs, - }); - setTimeout(() => { - this.releaseTaskOccupancy(taskId, agentId); - }, this.options.occupancyTimeoutMs); - } - - this.logger.info("Task occupied successfully", { taskId, agentId }); - return true; - } - - /** - * Releases task occupancy. - * Only the current agent or owners can release occupancy. - */ - releaseTaskOccupancy(taskId: string, agentId: string): boolean { - this.logger.info("Releasing task occupancy", { taskId, agentId }); - - const task = this.tasks.get(taskId); - if (!task || !task.status.isOccupied) { - this.logger.debug("Task not available for release", { taskId, exists: !!task }); - return false; - } - - if (task.status.currentAgentId !== agentId && !this.hasOwnerPermission(taskId, agentId)) { - this.logger.error("Permission denied for releasing task occupancy", { taskId, agentId }); - throw new PermissionError(`Agent ${agentId} cannot release occupancy of task ${taskId}`); - } - - task.status.isOccupied = false; - task.status.occupiedSince = undefined; - task.status.currentAgentId = undefined; - - this.logger.info("Task occupancy released successfully", { taskId }); - return true; - } - - /** - * Gets task status. - * Agents can only view their authorized tasks. - */ - getTaskStatus(taskId: string, agentId: string): TaskStatus { - this.logger.trace("Getting task status", { taskId, agentId }); - - const task = this.tasks.get(taskId); - if (!task) { - this.logger.error("Task not found", { taskId }); - throw new Error(`Undefined taskId: ${taskId}`); - } - - if (!this.hasAgentPermission(taskId, agentId)) { - this.logger.error("Permission denied for viewing task status", { taskId, agentId }); - throw new PermissionError(`Agent ${agentId} does not have permission to view task ${taskId}`); - } - - return task.status; - } - - /** - * Update task status - */ - updateTaskStatus( - taskId: string, - agentId: string, - update: Partial< - Pick - >, - ) { - this.logger.trace("Updating task status", { taskId, agentId, update }); - const status = this.getTaskStatus(taskId, agentId); - status.errorCount = update.errorCount ?? status.errorCount; - status.completedRuns = update.completedRuns ?? status.completedRuns; - status.status = update.status ?? status.status; - status.lastRunAt = update.lastRunAt ?? status.lastRunAt; - status.nextRunAt = update.nextRunAt ?? status.nextRunAt; - - return status; - } - - /** - * Gets all task statuses visible to the agent. - */ - getAllTaskStatuses(agentId: string): TaskStatus[] { - this.logger.trace("Getting all task statuses", { agentId }); - - const statuses = Array.from(this.tasks.values()) - .filter((task) => this.hasAgentPermission(task.status.id, agentId)) - .map((task) => task.status); - - this.logger.debug("Retrieved task statuses", { agentId, count: statuses.length }); - return statuses; - } - - /** - * Checks if a task is currently occupied. - */ - isTaskOccupied(taskId: string, agentId: string): boolean { - this.logger.trace("Checking task occupancy", { taskId, agentId }); - - const task = this.tasks.get(taskId); - if (!task) { - this.logger.error("Task not found", { taskId }); - throw new Error(`Undefined taskId: ${taskId}`); - } - - if (!this.hasAgentPermission(taskId, agentId)) { - this.logger.error("Permission denied for checking task occupancy", { taskId, agentId }); - throw new PermissionError(`Agent ${agentId} does not have permission to view task ${taskId}`); - } - - return task.status.isOccupied; - } - - /** - * Executes a task with retry logic and records history. - * @private - */ - private async executeTask(taskId: string): Promise { - this.logger.debug("Executing task", { taskId }); - - const task = this.tasks.get(taskId); - if (!task) { - this.logger.warn("Task not found for execution", { taskId }); - return; - } - - const retryAttempt = task.status.currentRetryAttempt; - if (retryAttempt > 0) { - this.logger.debug("Retry attempt", { retryAttempt, maxRetries: task.config.maxRetries }); - if (!!task.config.maxRetries && retryAttempt >= task.config.maxRetries) { - this.logger.warn("Last retry attempt", { taskId }); - } - } - - if (task.status.status === "COMPLETED" || task.status.isOccupied) { - this.logger.debug("Skipping task execution", { - taskId, - reason: task.status.status === "COMPLETED" ? "completed" : "occupied", - }); - return; - } - - const startTime = Date.now(); - - task.status.lastRunAt = new Date(); - task.status.nextRunAt = new Date(Date.now() + task.config.intervalMs); - - this.logger.debug("Executing task callback", { - taskId, - lastRunAt: task.status.lastRunAt, - nextRunAt: task.status.nextRunAt, - }); - - // TODO Parallelism - await this.onTaskStart(task.config, this, { - onAgentCreate(taskId, agentId, taskManager) { - taskManager.setTaskOccupied(taskId, agentId); - }, - onAgentComplete(output, taskId, agentId, taskManager) { - const status = taskManager.getTaskStatus(taskId, agentId); - taskManager.updateTaskStatus(taskId, agentId, { - completedRuns: status.completedRuns + 1, - }); - - // Record history entry - taskManager.addHistoryEntry(taskId, { - timestamp: new Date(), - terminalStatus: "COMPLETED", - output, - runNumber: task.status.completedRuns, - maxRuns: task.config.maxRuns, - retryAttempt: status.currentRetryAttempt, - maxRetries: task.config.maxRetries, - agentId: task.status.currentAgentId, - executionTimeMs: Date.now() - startTime, - }); - - taskManager.logger.debug("Task executed successfully", { - taskId, - completedRuns: task.status.completedRuns, - maxRuns: task.config.maxRuns, - }); - - taskManager.releaseTaskOccupancy(taskId, agentId); - // Check if we've reached maxRuns - if (task.config.maxRuns && task.status.completedRuns >= task.config.maxRuns) { - task.status.status = "COMPLETED"; - taskManager.stopTask(taskId, task.config.ownerAgentId); - taskManager.logger.info("Task reached maximum runs and has been stopped", { - taskId, - completedRuns: task.status.completedRuns, - maxRuns: task.config.maxRuns, - }); - } - }, - async onAgentError(err, taskId, agentId, taskManager) { - let error; - if (err instanceof FrameworkError) { - error = err.explain(); - } else { - error = err instanceof Error ? err.message : String(err); - } - - const status = taskManager.getTaskStatus(taskId, agentId); - taskManager.updateTaskStatus(taskId, agentId, { - errorCount: status.errorCount + 1, - completedRuns: task.status.completedRuns + 1, - }); - const retryAttempt = status.currentRetryAttempt; - - // Record history entry - taskManager.addHistoryEntry(taskId, { - timestamp: new Date(), - terminalStatus: "FAILED", - error, - runNumber: task.status.completedRuns, - maxRuns: task.config.maxRuns, - retryAttempt, - maxRetries: task.config.maxRetries, - agentId: task.status.currentAgentId, - executionTimeMs: Date.now() - startTime, - }); - - taskManager.logger.error(`Task execution failed ${error}`, { - taskId, - runNumber: task.status.completedRuns, - maxRuns: task.config.maxRuns, - retryAttempt, - maxRetries: task.config.maxRetries, - errorCount: task.status.errorCount, - error, - }); - - if (taskManager.options.errorHandler) { - taskManager.options.errorHandler(err as Error, taskId); - } - - taskManager.logger.debug("Releasing task occupancy before removal", { taskId }); - taskManager.releaseTaskOccupancy(taskId, agentId); - if (task.config.maxRetries) { - if (retryAttempt >= task.config.maxRetries) { - taskManager.stopTask(taskId, task.config.ownerAgentId); - } else { - status.currentRetryAttempt = retryAttempt + 1; - } - } - }, - }); - } - - destroy() { - this.logger.debug("Destroy"); - if (this.taskStartIntervalId) { - clearInterval(this.taskStartIntervalId); - this.taskStartIntervalId = null; - } - } -} diff --git a/src/tasks/tool.ts b/src/tasks/tool.ts index 1c519c9..7c65b1f 100644 --- a/src/tasks/tool.ts +++ b/src/tasks/tool.ts @@ -7,7 +7,18 @@ import { ToolInput, } from "bee-agent-framework/tools/base"; import { z } from "zod"; -import { TaskConfigSchema, TaskHistoryEntry, TaskManager, TaskStatus } from "./task-manager.js"; +import { + ActingAgentIdValueSchema, + TaskConfig, + TaskConfigPoolStats, + TaskConfigSchema, + TaskKindEnumSchema, + TaskRun, + TaskRunHistoryEntry, + TaskRunIdValueSchema, + TaskTypeValueSchema, +} from "./manager/dto.js"; +import { TaskManager } from "./manager/manager.js"; export const TOOL_NAME = "task_runner"; @@ -18,9 +29,11 @@ export interface TaskManagerToolInput extends BaseToolOptions { export type TaskManagerToolResultData = | void | boolean - | TaskStatus - | TaskStatus[] - | TaskHistoryEntry[]; + | TaskConfig + | [TaskConfigPoolStats, [number, TaskConfigPoolStats][]] + | TaskRun + | TaskRun[] + | TaskRunHistoryEntry[]; export interface TaskManagerToolResult { method: string; @@ -28,68 +41,128 @@ export interface TaskManagerToolResult { data: TaskManagerToolResultData; } -export const ScheduleTaskSchema = z +export const CreateTaskConfigSchema = z + .object({ + method: z.literal("createTaskConfig"), + taskConfig: TaskConfigSchema.omit({ + taskConfigId: true, + taskConfigVersion: true, + ownerAgentId: true, + }), + actingAgentId: ActingAgentIdValueSchema, + }) + .describe("Creates a new task configuration."); + +export const GetTaskConfigSchema = z .object({ - method: z.literal("scheduleTask"), - task: TaskConfigSchema, - supervisorAgentId: z.string(), + method: z.literal("getTaskConfig"), + taskKind: z.literal(TaskKindEnumSchema.Enum.operator), + taskType: TaskTypeValueSchema, + actingAgentId: ActingAgentIdValueSchema, + }) + .describe("Get latest task configuration for specific task kind and type."); + +export const UpdateTaskConfigSchema = z + .object({ + method: z.literal("updateTaskConfig"), + taskKind: z.literal(TaskKindEnumSchema.Enum.operator), + taskType: TaskTypeValueSchema, + update: TaskConfigSchema.partial().pick({ + taskConfigInput: true, + description: true, + intervalMs: true, + runImmediately: true, + maxRepeats: true, + maxRetries: true, + retryDelayMs: true, + concurrencyMode: true, + }), + actingAgentId: ActingAgentIdValueSchema, + }) + .describe("Update an existing task configuration."); + +export const DestroyTaskConfigSchema = z + .object({ + method: z.literal("destroyTaskConfig"), + taskKind: z.literal(TaskKindEnumSchema.Enum.operator), + taskType: TaskTypeValueSchema, + actingAgentId: ActingAgentIdValueSchema, + }) + .describe("Destroy an existing task configuration with all related task runs."); + +export const GetPoolStatsSchema = z + .object({ + method: z.literal("getPoolStats"), + taskKind: z.literal(TaskKindEnumSchema.Enum.operator), + taskType: TaskTypeValueSchema, + actingAgentId: ActingAgentIdValueSchema, }) .describe( - "Creates a new task with specified configuration. Requires owner or admin permissions.", + "Get statistics about the task run's pool for a specific task configuration kind and type", ); -export const StartTaskSchema = z +export const CreateTaskRunSchema = z + .object({ + method: z.literal("createTaskRun"), + taskKind: z.literal(TaskKindEnumSchema.Enum.operator), + taskType: TaskTypeValueSchema, + taskRunInput: z.string().describe(`Task input specific for the run.`), + actingAgentId: ActingAgentIdValueSchema, + }) + .describe("Creates a new task run from task configuration."); + +export const ScheduleStartTaskRunSchema = z .object({ - method: z.literal("startTask"), - taskId: z.string(), - supervisorAgentId: z.string(), + method: z.literal("scheduleStartTaskRun"), + taskRunId: TaskRunIdValueSchema, + actingAgentId: ActingAgentIdValueSchema, }) - .describe("Starts periodic execution of a task. Requires owner or admin permissions."); + .describe("Starts a task run."); -export const StopTaskSchema = z +export const StopTaskRunSchema = z .object({ - method: z.literal("stopTask"), - taskId: z.string(), - supervisorAgentId: z.string(), + method: z.literal("stopTaskRun"), + taskRunId: z.string(), + actingAgentId: ActingAgentIdValueSchema, }) - .describe("Stops periodic execution of a task. Requires owner or admin permissions."); + .describe("Stop a task run."); -export const RemoveTaskSchema = z +export const RemoveTaskRunSchema = z .object({ - method: z.literal("removeTask"), - taskId: z.string(), - supervisorAgentId: z.string(), + method: z.literal("removeTaskRun"), + taskRunId: z.string(), + actingAgentId: ActingAgentIdValueSchema, }) - .describe("Removes a task completely. Requires owner or admin permissions."); + .describe("Removes task run."); -export const GetTaskStatusSchema = z +export const GetTaskRunSchema = z .object({ - method: z.literal("getTaskStatus"), - taskId: z.string(), - supervisorAgentId: z.string(), + method: z.literal("getTaskRun"), + taskRunId: z.string(), + actingAgentId: ActingAgentIdValueSchema, }) - .describe("Gets current status of a task. Requires agent permissions."); + .describe("Gets current state of the task run."); -export const GetAllTaskStatusesSchema = z +export const GetAllTaskRunsSchema = z .object({ - method: z.literal("getAllTaskStatuses"), - supervisorAgentId: z.string(), + method: z.literal("getAllTaskRuns"), + actingAgentId: ActingAgentIdValueSchema, }) - .describe("Gets status of all accessible tasks. Requires agent permissions."); + .describe("Gets current state of all accessible task runs."); -export const IsTaskOccupiedSchema = z +export const IsTaskRunOccupiedSchema = z .object({ - method: z.literal("isTaskOccupied"), - taskId: z.string(), - supervisorAgentId: z.string(), + method: z.literal("isTaskRunOccupied"), + taskRunId: z.string(), + actingAgentId: ActingAgentIdValueSchema, }) - .describe("Checks if a task is currently occupied. Requires current agent or owner permissions."); + .describe("Checks if a task run is currently occupied."); -export const GetTaskHistorySchema = z +export const GetTaskRunHistorySchema = z .object({ - method: z.literal("getTaskHistory"), - taskId: z.string(), - supervisorAgentId: z.string(), + method: z.literal("getTaskRunHistory"), + taskRunId: z.string(), + actingAgentId: ActingAgentIdValueSchema, options: z .object({ limit: z.number().optional(), @@ -128,48 +201,75 @@ export class TaskManagerTool extends Tool< inputSchema() { return z.discriminatedUnion("method", [ - ScheduleTaskSchema, - StartTaskSchema, - StopTaskSchema, - RemoveTaskSchema, - GetTaskStatusSchema, - GetAllTaskStatusesSchema, - IsTaskOccupiedSchema, - GetTaskHistorySchema, + CreateTaskConfigSchema, + UpdateTaskConfigSchema, + GetTaskConfigSchema, + DestroyTaskConfigSchema, + GetPoolStatsSchema, + CreateTaskRunSchema, + ScheduleStartTaskRunSchema, + StopTaskRunSchema, + RemoveTaskRunSchema, + GetTaskRunSchema, + GetAllTaskRunsSchema, + IsTaskRunOccupiedSchema, + GetTaskRunHistorySchema, ]); } protected async _run(input: ToolInput) { let data: TaskManagerToolResultData; switch (input.method) { - case "scheduleTask": - data = this.taskManager.scheduleTask(input.task, input.supervisorAgentId); + case "createTaskConfig": { + const { actingAgentId, taskConfig } = input; + data = this.taskManager.createTaskConfig(taskConfig, actingAgentId, actingAgentId); + break; + } + case "getTaskConfig": { + const { taskKind, taskType, actingAgentId } = input; + data = this.taskManager.getTaskConfig(taskKind, taskType, actingAgentId); + break; + } + case "updateTaskConfig": { + const { update: config, taskKind, taskType, actingAgentId } = input; + data = this.taskManager.updateTaskConfig({ ...config, taskKind, taskType }, actingAgentId); + break; + } + case "destroyTaskConfig": { + const { taskKind, taskType, actingAgentId } = input; + data = this.taskManager.destroyTaskConfig(taskKind, taskType, actingAgentId); + break; + } + case "getPoolStats": { + const { taskKind, taskType, actingAgentId } = input; + data = this.taskManager.getPoolStats(taskKind, taskType, actingAgentId); + break; + } + case "createTaskRun": { + const { taskKind, taskType, taskRunInput, actingAgentId } = input; + data = this.taskManager.createTaskRun(taskKind, taskType, taskRunInput, actingAgentId); break; - case "startTask": - this.taskManager.scheduleTaskStart(input.taskId, input.supervisorAgentId); - data = true; + } + case "scheduleStartTaskRun": + data = this.taskManager.scheduleStartTaskRun(input.taskRunId, input.actingAgentId); break; - case "stopTask": - data = this.taskManager.stopTask(input.taskId, input.supervisorAgentId); + case "stopTaskRun": + data = this.taskManager.stopTaskRun(input.taskRunId, input.actingAgentId); break; - case "removeTask": - data = this.taskManager.removeTask(input.taskId, input.supervisorAgentId); + case "removeTaskRun": + data = this.taskManager.destroyTaskRun(input.taskRunId, input.actingAgentId); break; - case "getTaskStatus": - data = this.taskManager.getTaskStatus(input.taskId, input.supervisorAgentId); + case "getTaskRun": + data = this.taskManager.getTaskRun(input.taskRunId, input.actingAgentId); break; - case "getAllTaskStatuses": - data = this.taskManager.getAllTaskStatuses(input.supervisorAgentId); + case "getAllTaskRuns": + data = this.taskManager.getAllTaskRuns(input.actingAgentId); break; - case "isTaskOccupied": - data = this.taskManager.isTaskOccupied(input.taskId, input.supervisorAgentId); + case "isTaskRunOccupied": + data = this.taskManager.isTaskRunOccupied(input.taskRunId, input.actingAgentId); break; - case "getTaskHistory": - data = this.taskManager.getTaskHistory( - input.taskId, - input.supervisorAgentId, - input.options, - ); + case "getTaskRunHistory": + data = this.taskManager.getTaskRunHistory(input.taskRunId, input.actingAgentId); break; } return new JSONToolOutput({ diff --git a/src/ui/agent-monitor/monitor.ts b/src/ui/agent-monitor/monitor.ts new file mode 100644 index 0000000..b994451 --- /dev/null +++ b/src/ui/agent-monitor/monitor.ts @@ -0,0 +1,590 @@ +import blessed from "blessed"; +import { join } from "path"; +import { clone } from "remeda"; +import { + AgentConfigId, + AgentKindId, + agentSomeIdToTypeValue, + AgentTypeId, + stringToAgent, + stringToAgentConfig, + stringToAgentKind, +} from "@/agents/agent-id.js"; +import { AgentConfig, AgentKindEnumSchema, AvailableTool } from "@/agents/registry/dto.js"; +import { AgentInfo, AgentStateBuilder, StateUpdateType } from "@/agents/state/builder.js"; +import * as st from "../config.js"; +import { BaseMonitor, ParentInput, ScreenInput } from "../base/monitor.js"; + +const AGENT_LIST_DEFAULT_TEXT = "Select pool to view agents"; +const AGENT_VERSION_DEFAULT_TEXT = "Select pool to view versions"; +const AGENT_TEMPLATE_DETAIL_DEFAULT_TEXT = "Select agent pool to view agent config detail"; +const AGENT_DETAIL_DEFAULT_TEXT = "Select agent to view agent detail"; +const AGENT_LIFECYCLE_HISTORY_DEFAULT_TEXT = "Select agent to view lifecycle events"; + +export class AgentMonitor extends BaseMonitor { + private stateBuilder: AgentStateBuilder; + private agentPoolList: blessed.Widgets.ListElement; + private agentPoolListItemsData: { + agentTypeId: AgentTypeId | AgentKindId; + itemContent: string; + }[] = []; + private agentPoolListSelectedIndex: number | null = null; + + private agentVersionsList: blessed.Widgets.ListElement; + private agentVersionsListItemsData: { + agentTypeId: AgentConfigId; + itemContent: string; + }[] = []; + private agentVersionsListSelectedIndex: number | null = null; + + private agentList: blessed.Widgets.ListElement; + private agentListItemsData: { + agent: AgentInfo; + itemContent: string; + }[] = []; + private agentListSelectedIndex: number | null = null; + + private agentConfigDetail: blessed.Widgets.BoxElement; + private agentDetail: blessed.Widgets.BoxElement; + private lifecycleHistory: blessed.Widgets.BoxElement; + private logBox: blessed.Widgets.Log; + + private lifecycleEvents = new Map< + string, + { timestamp: string; event: string; success: boolean; error?: string }[] + >(); + + constructor(arg: ParentInput | ScreenInput) { + super(arg); + this.stateBuilder = new AgentStateBuilder(); + this.stateBuilder.on("log:reset", () => { + this.reset(); + }); + this.stateBuilder.on("log:new_line", (line) => { + this.logBox.log(`${new Date().toLocaleString()} - ${line}`); + }); + this.stateBuilder.on("state:updated", (update) => { + switch (update.type) { + case StateUpdateType.TOOLS: + case StateUpdateType.AGENT_CONFIG: + case StateUpdateType.POOL: + this.updateAgentPoolsList(false); + break; + case StateUpdateType.AGENT: + this.updateAgentVersionsList(false); + this.updateAgentDetails(); + break; + case StateUpdateType.ASSIGNMENT: + this.updateAgentDetails(); + break; + case StateUpdateType.FULL: + // Full refresh + // this.reset(); + break; + } + }); + + this.stateBuilder.on("error", (error: Error) => { + // OK + console.error("Error occurred:", error); + }); + + // Left column - Pools and Agents (30%) + this.agentPoolList = blessed.list({ + parent: this.parent, + width: "30%", + height: "20%", + left: 0, + top: 0, + border: { type: "line" }, + label: " Agent Pools ", + style: st.UIConfig.list, + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + this.agentVersionsList = blessed.list({ + parent: this.parent, + width: "30%", + height: "20%", + left: 0, + top: "20%", + border: { type: "line" }, + label: " Agent Versions ", + content: AGENT_VERSION_DEFAULT_TEXT, + style: st.UIConfig.list, + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + this.agentList = blessed.list({ + parent: this.parent, + width: "30%", + height: "50%", + left: 0, + top: "40%", + border: { type: "line" }, + label: " Agents ", + content: AGENT_LIST_DEFAULT_TEXT, + style: st.UIConfig.list, + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + // Center column - Details and Tools (40%) + this.agentConfigDetail = blessed.box({ + parent: this.parent, + width: "40%", + height: "40%", + left: "30%", + top: 0, + border: { type: "line" }, + label: " Agent Config ", + content: AGENT_TEMPLATE_DETAIL_DEFAULT_TEXT, + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + this.agentDetail = blessed.box({ + parent: this.parent, + width: "40%", + height: "50%", + left: "30%", + top: "40%", + border: { type: "line" }, + label: " Agent Detail ", + content: AGENT_DETAIL_DEFAULT_TEXT, + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + // Right column - Lifecycle History (30%) + this.lifecycleHistory = blessed.box({ + parent: this.parent, + width: "30%", + height: "90%", + left: "70%", + top: 0, + border: { type: "line" }, + label: " Lifecycle Events ", + content: AGENT_LIFECYCLE_HISTORY_DEFAULT_TEXT, + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + // Bottom - Live Updates + this.logBox = blessed.log({ + parent: this.parent, + width: "100%", + height: "10%", + left: 0, + top: "90%", + border: { type: "line" }, + label: " Live Updates ", + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + this.setupEventHandlers(); + this.screen.render(); + } + + private setupEventHandlers() { + this.screen.key(["escape", "q", "C-c"], () => process.exit(0)); + + this.agentPoolList.on("select", (_, selectedIndex) => { + this.agentPoolListSelectedIndex = selectedIndex; + const itemData = this.agentPoolListItemsData[this.agentPoolListSelectedIndex]; + if (!itemData) { + throw new Error( + `Missing data for selected pool on index:${this.agentPoolListSelectedIndex}`, + ); + } + let agentConfig; + const agentTypeId = itemData.agentTypeId; + if ((agentTypeId as AgentTypeId).agentType) { + agentConfig = this.stateBuilder.getAgentConfig( + agentSomeIdToTypeValue(agentTypeId as AgentTypeId), + ); + } + + this.updateAgentConfig(agentConfig, false); + this.updateAgentVersionsList(); + }); + + this.agentVersionsList.on("select", (_, selectedIndex) => { + this.agentVersionsListSelectedIndex = selectedIndex; + const itemData = this.agentVersionsListItemsData[this.agentVersionsListSelectedIndex]; + if (!itemData) { + throw new Error(`Missing data for selectedIndex:${this.agentVersionsListSelectedIndex}`); + } + + const agentConfigId = itemData.agentTypeId as AgentConfig; + const agentConfig = this.stateBuilder.getAgentConfig( + agentSomeIdToTypeValue(agentConfigId), + agentConfigId.agentConfigVersion, + ); + + this.updateAgentConfig(agentConfig, false); + this.updateAgentVersionsList(); + }); + + this.agentList.on("select", (_, selectedIndex) => { + this.agentListSelectedIndex = selectedIndex; + const itemData = this.agentListItemsData[this.agentListSelectedIndex]; + if (!itemData) { + throw new Error(`Missing data for selectedIndex:${this.agentPoolListSelectedIndex}`); + } + const { agent } = itemData; + const agentConfigId = stringToAgentConfig(agent.agentConfigId); + const agentTypeId = agentSomeIdToTypeValue(agentConfigId); + const agentConfig = this.stateBuilder.getAgentConfig( + agentTypeId, + agentConfigId.agentConfigVersion, + ); + this.updateAgentConfig(agentConfig, false); + this.updateAgentDetails(itemData.agent); + }); + + // Mouse scrolling for all components + [ + this.agentPoolList, + this.agentList, + this.agentConfigDetail, + this.agentDetail, + this.lifecycleHistory, + ].forEach((component) => { + component.on("mouse", (data) => { + if (data.action === "wheelup") { + component.scroll(-1); + this.screen.render(); + } else if (data.action === "wheeldown") { + component.scroll(1); + this.screen.render(); + } + }); + }); + } + + private reset(shouldRender = true): void { + // Reset selections + this.agentListSelectedIndex = null; + this.agentPoolListSelectedIndex = null; + this.agentVersionsListSelectedIndex = null; + + // Update content + this.updateAgentPoolsList(false); + this.updateAgentConfig(undefined, false); + this.updateAgentList(false); + + // Reset log box + this.logBox.setContent(""); + this.logBox.log("Reading initial state from log..."); + + // Render + if (shouldRender) { + this.screen.render(); + } + } + + private updateAgentPoolsList(shouldRender = true): void { + this.agentPoolListItemsData.splice(0); + const state = this.stateBuilder.getState(); + Array.from(state.agentPools.entries()) + .sort(([a], [b]) => { + // Sort agent kind + const aPoolId = stringToAgentKind(a); + const bPoolId = stringToAgentKind(b); + const aSuper = aPoolId.agentKind === AgentKindEnumSchema.Values.supervisor; + const bSuper = bPoolId.agentKind === AgentKindEnumSchema.Values.supervisor; + if (aSuper && !bSuper) { + return -1; + } else if (!aSuper && bSuper) { + return 1; + } else { + return aPoolId.agentKind.localeCompare(bPoolId.agentKind); + } + }) + .forEach(([agentKindStr, agentTypePools]) => { + const agentKindId = stringToAgentKind(agentKindStr); + this.agentPoolListItemsData.push({ + agentTypeId: agentKindId, + itemContent: st.agentKindId(agentKindId), + }); + Array.from(agentTypePools.entries()) + .sort(([a], [b]) => { + // Sort agent type + return a.localeCompare(b); + }) + .forEach(([agentTypeStr, agentPool]) => { + this.agentPoolListItemsData.push({ + agentTypeId: { agentKind: agentKindId.agentKind, agentType: agentTypeStr }, + itemContent: st.agentPool(agentPool), + }); + }); + }); + + if (this.agentPoolListSelectedIndex == null && this.agentPoolListItemsData.length) { + this.agentPoolListSelectedIndex = 0; + this.agentPoolList.select(this.agentPoolListSelectedIndex); + } + this.agentPoolList.setItems(this.agentPoolListItemsData.map((it) => it.itemContent)); + + this.updateAgentVersionsList(false); + if (shouldRender) { + this.screen.render(); + } + } + + private updateAgentVersionsList(shouldRender = true): void { + this.agentVersionsListItemsData.splice(0); + + if (this.agentPoolListSelectedIndex != null) { + // Get versions of selected agent pool + const itemData = this.agentPoolListItemsData[this.agentPoolListSelectedIndex]; + if (!itemData) { + throw new Error( + `Missing data for selected pool on index:${this.agentPoolListSelectedIndex}`, + ); + } + + const agentPoolTypeId = itemData.agentTypeId as AgentTypeId; + if (agentPoolTypeId.agentType != null) { + // List versions + const agentPool = this.stateBuilder.getAgentPool( + agentPoolTypeId.agentKind, + agentPoolTypeId.agentType, + ); + if (agentPool) { + const hasMultipleVersions = agentPool.versions.length > 1; + if (hasMultipleVersions) { + this.agentPoolListItemsData.push({ + agentTypeId: { + agentKind: agentPoolTypeId.agentKind, + agentType: agentPoolTypeId.agentType, + }, + itemContent: st.versionAgentPoolStats("all"), + }); + } + + clone(agentPool.versions) + .reverse() + .forEach(([agentConfigVersion, poolStats]) => { + const agentTypeId = { + agentKind: agentPoolTypeId.agentKind, + agentType: agentPoolTypeId.agentType, + agentConfigVersion, + }; + this.agentVersionsListItemsData.push({ + agentTypeId, + itemContent: st.versionAgentPoolStats(st.versionNum(agentConfigVersion), poolStats), + }); + }); + } + } + } + + this.agentVersionsList.setItems(this.agentVersionsListItemsData.map((it) => it.itemContent)); + this.agentVersionsList.setContent( + this.agentVersionsListItemsData.length ? "" : AGENT_VERSION_DEFAULT_TEXT, + ); + this.updateAgentList(false); + if (shouldRender) { + this.screen.render(); + } + } + + private updateAgentList(shouldRender = true): void { + this.agentListItemsData.splice(0); + if (this.agentVersionsListSelectedIndex != null) { + Array.from(this.stateBuilder.getAllAgents()) + .filter((a) => { + if (this.agentVersionsListSelectedIndex == null) { + return false; + } + + const agentId = stringToAgent(a.agentId); + const agentPoolListItem = + this.agentVersionsListItemsData[this.agentVersionsListSelectedIndex]; + if (agentPoolListItem && agentPoolListItem.agentTypeId.agentKind === agentId.agentKind) { + if ((agentPoolListItem.agentTypeId as AgentTypeId).agentType != null) { + if ((agentPoolListItem.agentTypeId as AgentTypeId).agentType == agentId.agentType) { + if ((agentPoolListItem.agentTypeId as AgentConfigId).agentConfigVersion != null) { + return ( + (agentPoolListItem.agentTypeId as AgentConfigId).agentConfigVersion === + agentId.agentConfigVersion + ); + } + } else { + return false; + } + } + return true; + } + return false; + }) + .sort((a, b) => { + const aAgentId = stringToAgent(a.agentId); + const bAgentId = stringToAgent(b.agentId); + + if (aAgentId.agentConfigVersion != bAgentId.agentConfigVersion) { + return Math.sign(aAgentId.agentConfigVersion - bAgentId.agentConfigVersion); + } + + const comp = aAgentId.agentType.localeCompare(bAgentId.agentType); + if (comp === 0) { + return Math.sign(aAgentId.agentNum - bAgentId.agentNum); + } else { + return comp; + } + }) + .forEach((agent) => { + this.agentListItemsData.push({ + agent, + itemContent: st.agent(agent), + }); + }); + } + + this.agentList.setItems(this.agentListItemsData.map((it) => it.itemContent)); + this.agentList.setContent(this.agentListItemsData.length ? "" : AGENT_LIST_DEFAULT_TEXT); + if (shouldRender) { + this.screen.render(); + } + } + + private updateAgentConfig(agentConfig?: AgentConfig, shouldRender = true): void { + if (!agentConfig) { + this.agentConfigDetail.setContent(AGENT_TEMPLATE_DETAIL_DEFAULT_TEXT); + if (shouldRender) { + this.screen.render(); + } + return; + } + + const details = [ + `{bold}Id:{/bold} ${st.agentConfigId(agentConfig.agentConfigId)}`, + `{bold}Version:{/bold} ${st.versionNum(agentConfig.agentConfigVersion)}`, + `{bold}Agent Kind:{/bold} ${st.agentKind(agentConfig.agentKind)}`, + `{bold}Agent Type:{/bold} ${st.agentType(agentConfig.agentType)}`, + `{bold}Max Pool Size:{/bold} ${st.num(agentConfig.maxPoolSize)}`, + `{bold}Auto-populate pool:{/bold} ${st.bool(agentConfig.autoPopulatePool)}`, + "", + "{bold}Description:{/bold}", + st.desc(agentConfig.description), + "", + "{bold}Instructions:{/bold}", + st.desc(agentConfig.instructions), + "", + ...(agentConfig.tools.length + ? ["{bold}Tools:{/bold}", st.tools(this.mapTools(agentConfig.tools))] + : []), + ].join("\n"); + this.agentConfigDetail.setContent(details); + if (shouldRender) { + this.screen.render(); + } + } + + private mapTools(tools: string[]): AvailableTool[] { + return tools.map( + (t) => + this.stateBuilder.getAllTools().get(t) ?? { + toolName: "Undefined", + description: "Lorem ipsum....", + }, + ); + } + + private updateAgentDetails(agent?: AgentInfo, shouldRender = true): void { + if (!agent) { + this.agentDetail.setContent(AGENT_DETAIL_DEFAULT_TEXT); + if (shouldRender) { + this.screen.render(); + } + return; + } + + const details = [ + `${st.label("Id")}: ${st.agentId(stringToAgent(agent.agentId))}`, + `${st.label("In Use")}: ${st.bool(agent.inUse, "busy_idle")}`, + `${st.label("Is destroyed")}: ${st.bool(agent.isDestroyed, "inverse_color")}`, + // ...(agent.assignedTaskConfig + // ? [ + // "", + // `${st.label("Task")}: ${st.taskId(agent.assignedTaskConfig.id)}`, + // `${st.label("Description")}:`, + // `${st.desc(agent.assignedTaskConfig.description)}`, + // `${st.label("Input")}:`, + // `${st.input(agent.assignedTaskConfig.input)}`, + // ] + // : []), + ].join("\n"); + this.agentDetail.setContent(details); + if (shouldRender) { + this.screen.render(); + } + } + + private updateLifecycleHistory(agentId?: string, shouldRender = true): void { + if (!agentId) { + this.lifecycleHistory.setContent(AGENT_LIFECYCLE_HISTORY_DEFAULT_TEXT); + if (shouldRender) { + this.screen.render(); + } + return; + } + + const events = this.lifecycleEvents.get(agentId) || []; + const content = events.length + ? events + .map( + ({ timestamp, event, success, error }) => + `${st.timestamp(timestamp)} ` + + `${st.eventType(event)} ` + + `${st.bool(success)}` + + (error ? `\n ${st.error(error)}` : ""), + ) + .join("\n") + : "No lifecycle events recorded"; + + this.lifecycleHistory.setContent(content); + if (shouldRender) { + this.screen.render(); + } + } + + public async start(): Promise { + const logPath = join(process.cwd(), "logs", "agent_state.log"); + // First read the entire log to build initial state + await this.stateBuilder.watchLogFile(logPath); + } +} diff --git a/src/ui/base/monitor.ts b/src/ui/base/monitor.ts new file mode 100644 index 0000000..9cb2bcb --- /dev/null +++ b/src/ui/base/monitor.ts @@ -0,0 +1,30 @@ +import blessed from "blessed"; + +export interface ParentInput { + screen: blessed.Widgets.Screen; + parent: blessed.Widgets.BoxElement; +} + +export interface ScreenInput { + title: string; +} + +export abstract class BaseMonitor { + protected screen: blessed.Widgets.Screen; + protected parent: blessed.Widgets.Node; + + constructor(arg: ParentInput | ScreenInput) { + if ((arg as ScreenInput).title) { + this.screen = blessed.screen({ + smartCSR: true, + title: (arg as ScreenInput).title, + debug: true, + }); + this.parent = this.screen; + } else { + const { screen, parent } = arg as ParentInput; + this.screen = screen; + this.parent = parent; + } + } +} diff --git a/src/ui/colors.ts b/src/ui/colors.ts new file mode 100644 index 0000000..28e4bd4 --- /dev/null +++ b/src/ui/colors.ts @@ -0,0 +1,360 @@ +// Source: https://encycolorpedia.com/named + +export const RedColors = { + red: "#FF0000", + crimson: "#DC143C", + fire_brick: "#B22222", + dark_red: "#8B0000", + blood_red: "#660000", + burgundy: "#800020", + cardinal: "#C41E3A", + carmine: "#960018", + cornell_red: "#B31B1B", + dark_candy_apple_red: "#A40000", + electric_red: "#E60000", + falu_red: "#801818", + imperial_red: "#ED2939", + indian_red: "#CD5C5C", + light_carmine_pink: "#E66771", + madder_lake: "#CC3336", + ou_crimson_red: "#841617", + persian_red: "#CC3333", + rose_madder: "#E32636", + rosewood: "#65000B", + rufous: "#A81C07", + rusty_red: "#DA2C43", + upsdell_red: "#AE2029", + venetian_red: "#C80815", + vivid_red: "#F70D1A", +} as const; + +export const PinkColors = { + pink: "#FFC0CB", + light_pink: "#FFB6C1", + hot_pink: "#FF69B4", + deep_pink: "#FF1493", + medium_violet_red: "#C71585", + pale_violet_red: "#DB7093", + amaranth_pink: "#F19CBB", + baker_miller_pink: "#FF91AF", + charm_pink: "#E68FAC", + cherry_blossom_pink: "#FFB7C5", + cotton_candy: "#FFBCD9", + flamingo_pink: "#FC8EAC", + french_pink: "#FD6C9E", + lavender_pink: "#FBAED2", + magenta_pink: "#CC338B", + orchid_pink: "#F2BDCD", + persian_pink: "#F77FBE", + piggy_pink: "#FDDDE6", + rose_pink: "#FF66CC", + shocking_pink: "#FC0FC0", + steel_pink: "#CC33CC", + tickle_me_pink: "#FC89AC", +} as const; + +export const OrangeColors = { + orange: "#FFA500", + asda_orange: "#C86500", + dark_orange: "#FF8C00", + burnt_orange: "#CC5500", + coral: "#FF7F50", + international_orange: "#FF4F00", + orange_peel: "#FF9F00", + princeton_orange: "#F58025", + safety_orange: "#FF6700", + spanish_orange: "#E86100", + tangerine: "#F28500", + tigers_eye: "#E08D3C", + ut_orange: "#FF8200", + blush_orange: "#FF6F5E", + carrot_orange: "#ED9121", + flame: "#E25822", + giants_orange: "#FE5A1D", + mandarin: "#F37A48", + orange_red: "#FF4500", + pumpkin: "#FF7518", + tangelo: "#F94D00", +} as const; + +export const YellowColors = { + yellow: "#EEFF00", + dark_yellow: "#999900", + light_yellow: "#FFFFE0", + lemon_chiffon: "#FFFACD", + cream: "#FFFDD0", + corn: "#FBEC5D", + golden_yellow: "#FFDF00", + icterine: "#FCF75E", + jasmine: "#F8DE7E", + jonquil: "#F4CA16", + lemon: "#FFF700", + lemon_yellow: "#FFF44F", + maize: "#FBEC5D", + maximum_yellow: "#FAFA37", + naples_yellow: "#FADA5E", + school_bus_yellow: "#FFD800", + selective_yellow: "#FFBA00", + sunglow: "#FFCC33", + unmellow_yellow: "#FFFF66", + yellow_rose: "#FFF000", + canary_yellow: "#FFEF00", +} as const; + +export const PurpleColors = { + purple: "#800080", + rebecca_purple: "#663399", + dark_purple: "#301934", + electric_purple: "#BF00FF", + fuchsia: "#FF00FF", + heliotrope: "#DF73FF", + lavender: "#E6E6FA", + magenta: "#FF00FF", + mauve: "#E0B0FF", + orchid: "#DA70D6", + plum: "#8E4585", + purple_heart: "#69359C", + purple_mountain_majesty: "#9678B6", + purple_pizzazz: "#FE4EDA", + purple_taupe: "#50404D", + royal_purple: "#7851A9", + twilight_lavender: "#8A496B", + tyrian_purple: "#66023C", + violet: "#8601AF", + wisteria: "#C9A0DC", +} as const; + +export const GreenColors = { + green: "#008000", + dark_green: "#006400", + forest_green: "#228B22", + lime_green: "#32CD32", + pale_green: "#98FB98", + sea_green: "#2E8B57", + spring_green: "#00FF7F", + teal: "#008080", + army_green: "#4B5320", + asparagus: "#87A96B", + bottle_green: "#006A4E", + british_racing_green: "#004225", + brunswick_green: "#1B4D3E", + cambridge_blue: "#A3C1AD", + celadon: "#ACE1AF", + dartmouth_green: "#00703C", + emerald: "#50C878", + feldgrau: "#4D5D53", + fern_green: "#4F7942", + hunter_green: "#355E3B", + india_green: "#138808", + jungle_green: "#29AB87", + kelly_green: "#4CBB17", + malachite: "#0BDA51", + mint: "#3EB489", + moss_green: "#8A9A5B", + msu_green: "#18453B", + office_green: "#008000", + pakistan_green: "#006600", + persian_green: "#00A693", + pine_green: "#01796F", + sap_green: "#507D2A", + shamrock_green: "#009E60", + viridian: "#40826D", +} as const; + +export const BlueColors = { + blue: "#0000FF", + navy_blue: "#000080", + powder_blue: "#B0E0E6", + royal_blue: "#4169E1", + sky_blue: "#87CEEB", + steel_blue: "#4682B4", + alice_blue: "#F0F8FF", + azure: "#007FFF", + baby_blue: "#89CFF0", + carolina_blue: "#56A0D3", + celeste: "#B2FFFF", + cerulean: "#2A52BE", + cerulean_frost: "#6D9BC3", + cobalt_blue: "#0047AB", + columbia_blue: "#C4D8E2", + cornflower_blue: "#6495ED", + cyan: "#00FFFF", + denim: "#1560BD", + egyptian_blue: "#1034A6", + electric_blue: "#7DF9FF", + glaucous: "#6082B6", + international_klein_blue: "#002FA7", + maya_blue: "#73C2FB", + midnight_blue: "#191970", + oxford_blue: "#002147", + persian_blue: "#1C39BB", + sapphire: "#0F52BA", + teal_blue: "#367588", + true_blue: "#2D68C4", + turquoise: "#40E0D0", + ultramarine: "#120A8F", + yale_blue: "#0F4D92", +} as const; + +export const BrownColors = { + brown: "#964B00", + chocolate: "#7B3F00", + copper: "#B87333", + desert_sand: "#EDC9AF", + khaki: "#C3B091", + saddle_brown: "#8B4513", + sandy_brown: "#F4A460", + beaver: "#9F8170", + beige: "#F5F5DC", + bistre: "#3D2B1F", + bronze: "#CD7F32", + buff: "#F0DC82", + burgundy: "#800020", + burnt_sienna: "#E97451", + burnt_umber: "#8A3324", + cafe_au_lait: "#A67B5B", + camel: "#C19A6B", + chestnut: "#954535", + cinnamon: "#D2691E", + cocoa_brown: "#D2691E", + coffee: "#6F4E37", + dark_brown: "#654321", + desert: "#C19A6B", + dirt: "#9B7653", + fawn: "#E5AA70", + field_drab: "#6C541E", + golden_brown: "#996515", + liver: "#674C47", + mahogany: "#C04000", + maroon: "#800000", + ochre: "#CC7722", + raw_umber: "#826644", + redwood: "#A45A52", + rosy_brown: "#BC8F8F", + russet: "#80461B", + rust: "#B7410E", + sepia: "#704214", + sienna: "#882D17", + tan: "#D2B48C", + taupe: "#483C32", + umber: "#635147", + walnut_brown: "#5C5248", + wood_brown: "#C19A6B", +} as const; + +export const WhiteColors = { + white: "#FFFFFF", + snow: "#FFFAFA", + honeydew: "#F0FFF0", + mint_cream: "#F5FFFA", + azure: "#F0FFFF", + alice_blue: "#F0F8FF", + ghost_white: "#F8F8FF", + white_smoke: "#F5F5F5", + seashell: "#FFF5EE", + beige: "#F5F5DC", + old_lace: "#FDF5E6", + floral_white: "#FFFAF0", + ivory: "#FFFFF0", + antique_white: "#FAEBD7", + linen: "#FAF0E6", + lavender_blush: "#FFF0F5", + misty_rose: "#FFE4E1", + cosmic_latte: "#FFF8E7", + cream: "#FFFDD0", + eggshell: "#F0EAD6", + champagne: "#F7E7CE", + vanilla: "#F3E5AB", +} as const; + +export const GrayColors = { + gray: "#202020", + dim_gray: "#696969", + light_gray: "#D3D3D3", + slate_gray: "#708090", + dark_gray: "#A9A9A9", + silver: "#C0C0C0", + gainsboro: "#DCDCDC", + ash_gray: "#B2BEB5", + battleship_gray: "#848482", + cadet_gray: "#91A3B0", + charcoal: "#36454F", + cinereous: "#98817B", + cool_gray: "#8C92AC", + davy_gray: "#555555", + feldgrau: "#4D5D53", + granite_gray: "#676767", + gunmetal: "#2A3439", + marengo: "#4C5866", + nickel: "#727472", + onyx: "#353839", + outer_space: "#414A4C", + payne_gray: "#536878", + platinum: "#E5E4E2", + quick_silver: "#A6A6A6", + roman_silver: "#838996", + silver_sand: "#BFC1C2", + sonic_silver: "#757575", + taupe: "#483C32", + timberwolf: "#DBD7D2", +} as const; + +export const BlackColors = { + black: "#000000", + eerie_black: "#1B1B1B", + jet: "#343434", + licorice: "#1A1110", + night: "#0C090A", + onyx: "#353839", + raisin_black: "#242124", + charleston_green: "#232B2B", + ebony: "#555D50", + dark_jungle_green: "#1A2421", + vampire_black: "#080808", + black_olive: "#3B3C36", + black_leather_jacket: "#253529", +} as const; + +export type RedColorsType = typeof RedColors; +export type PinkColorsType = typeof PinkColors; +export type OrangeColorsType = typeof OrangeColors; +export type YellowColorsType = typeof YellowColors; +export type PurpleColorsType = typeof PurpleColors; +export type GreenColorsType = typeof GreenColors; +export type BlueColorsType = typeof BlueColors; +export type BrownColorsType = typeof BrownColors; +export type WhiteColorsType = typeof WhiteColors; +export type GrayColorsType = typeof GrayColors; +export type BlackColorsType = typeof BlackColors; + +export type RedColorNames = keyof typeof RedColors; +export type PinkColorNames = keyof typeof PinkColors; +export type OrangeColorNames = keyof typeof OrangeColors; +export type YellowColorNames = keyof typeof YellowColors; +export type PurpleColorNames = keyof typeof PurpleColors; +export type GreenColorNames = keyof typeof GreenColors; +export type BlueColorNames = keyof typeof BlueColors; +export type BrownColorNames = keyof typeof BrownColors; +export type WhiteColorNames = keyof typeof WhiteColors; +export type GrayColorNames = keyof typeof GrayColors; +export type BlackColorNames = keyof typeof BlackColors; + +export const UIColors = { + red: RedColors, + pink: PinkColors, + orange: OrangeColors, + yellow: YellowColors, + purple: PurpleColors, + green: GreenColors, + blue: BlueColors, + brown: BrownColors, + white: WhiteColors, + gray: GrayColors, + black: BlackColors, +} as const; + +// Type for the UIColors object +export type UIColorsType = typeof UIColors; + +// Type for the color names +export type UIColorNames = keyof typeof UIColors; diff --git a/src/ui/config.ts b/src/ui/config.ts new file mode 100644 index 0000000..9991e8e --- /dev/null +++ b/src/ui/config.ts @@ -0,0 +1,411 @@ +import { clone } from "remeda"; +import { + AgentId, + AgentKindId, + AgentTypeId, + stringToAgent, + stringToAgentType, +} from "@/agents/agent-id.js"; +import { + AgentConfigPoolStats, + AgentKindEnum, + AgentKindEnumSchema, + AgentKindValue, + AgentTypeValue, + AvailableTool, +} from "@/agents/registry/dto.js"; +import { AgentInfo } from "@/agents/state/builder.js"; +import { + TaskConfigIdValue, + TaskConfigPoolStats, + TaskKindEnum, + TaskKindEnumSchema, + TaskKindValue, + TaskRunStatusEnum, + TaskTypeValue, +} from "@/tasks/manager/dto.js"; +import { + stringToTaskRun, + stringToTaskType, + TaskKindId, + TaskRunId, + TaskTypeId, +} from "@/tasks/task-id.js"; +import { UIColors } from "./colors.js"; +import { TaskRunInfo } from "@/tasks/state/builder.js"; + +export interface StyleItem { + fg?: string; + bold?: boolean; + icon?: string; +} +export type StyleItemVersioned = Record; +export type StyleItemValue = StyleItem | StyleItemVersioned; + +export type StyleCategory = Record; + +export const DEFAULT_VERSION = "default"; +export const BUSY_IDLE = "busy_idle"; +export const INVERSE_COLOR = "inverse_color"; +export const AMBIENT_VERSION = "ambient"; + +export const UIConfig = { + labels: { + default: { fg: UIColors.white.white, bold: true }, + taskId: { fg: UIColors.orange.asda_orange, bold: true }, + status: { fg: UIColors.white.white, bold: true }, + agentKind: { fg: UIColors.purple.magenta, bold: true }, + taskKind: { fg: UIColors.purple.magenta, bold: true }, + agentType: { fg: UIColors.blue.cyan, bold: true }, + taskType: { fg: UIColors.blue.cyan, bold: true }, + agentId: { + [AgentKindEnumSchema.Values.supervisor]: { + fg: UIColors.brown.saddle_brown, + bold: true, + icon: "⬢", + }, + [AgentKindEnumSchema.Values.operator]: { + fg: UIColors.brown.saddle_brown, + bold: true, + icon: "⬡", + }, + }, + taskRunId: { + [TaskKindEnumSchema.Values.supervisor]: { + fg: UIColors.brown.saddle_brown, + bold: true, + icon: "■", + }, + [TaskKindEnumSchema.Values.operator]: { + fg: UIColors.brown.saddle_brown, + bold: true, + icon: "□", + }, + }, + agentTypeId: { fg: UIColors.white.white }, + taskTypeId: { fg: UIColors.white.white }, + owner: { fg: UIColors.brown.saddle_brown, bold: true }, + description: { fg: UIColors.blue.cerulean, bold: false }, + input: { + [DEFAULT_VERSION]: { fg: UIColors.yellow.yellow, bold: false }, + [AMBIENT_VERSION]: { fg: UIColors.yellow.corn, bold: false }, + }, + output: { + [DEFAULT_VERSION]: { fg: UIColors.green.green, bold: false }, + [AMBIENT_VERSION]: { fg: UIColors.green.sea_green, bold: false }, + }, + error: { fg: UIColors.red.red, bold: true }, + executionTime: { fg: UIColors.yellow.yellow }, + timestamp: { fg: UIColors.gray.gray }, + tool: { fg: UIColors.blue.cyan, icon: "⚒" }, + eventType: { + fg: UIColors.yellow.yellow, + bold: true, + icon: "⚡", + }, + version: { fg: UIColors.gray.cool_gray, bold: false }, + } satisfies StyleCategory, + + status: { + CREATED: { fg: UIColors.yellow.yellow, icon: "◆" }, // Diamond + EXECUTING: { fg: UIColors.green.green, icon: "▶" }, // Play triangle + SCHEDULED: { fg: UIColors.blue.cyan, icon: "◇" }, // Hollow diamond + PENDING: { fg: UIColors.blue.cyan, icon: "◆" }, // Hollow diamond + AWAITING_AGENT: { fg: UIColors.blue.steel_blue, icon: "◇" }, // Hollow diamond + FAILED: { fg: UIColors.red.red, icon: "×" }, // Square + COMPLETED: { fg: UIColors.blue.blue, icon: "●" }, // Circle + STOPPED: { fg: UIColors.gray.gray, icon: "◼" }, // Filled square + } satisfies StyleCategory, + + BUSY: { + fg: UIColors.red.red, + bg: null, + bold: true, + prefix: "⚡", + suffix: "", + }, + IDLE: { + fg: UIColors.green.green, + bg: null, + bold: false, + prefix: "○", + suffix: "", + }, + + boolean: { + TRUE: { + [DEFAULT_VERSION]: { fg: UIColors.green.green, icon: "[✓]" }, + [INVERSE_COLOR]: { fg: UIColors.red.red, icon: "[✓]" }, + [BUSY_IDLE]: { + fg: UIColors.red.red, + bold: true, + icon: "⚡", + }, + }, + FALSE: { + [DEFAULT_VERSION]: { fg: UIColors.red.red, icon: "[✕]" }, + [INVERSE_COLOR]: { fg: UIColors.green.green, icon: "[✕]" }, + [BUSY_IDLE]: { + fg: UIColors.green.green, + bold: false, + icon: "○", + }, + }, + } satisfies StyleCategory, + + borders: { + type: "line", + fg: UIColors.white.white, + }, + + list: { + selected: { bg: UIColors.blue.blue, fg: UIColors.white.white }, + border: { fg: UIColors.white.white }, + item: { + hover: { bg: UIColors.blue.blue }, + }, + }, + + scrollbar: { + ch: " ", + track: { bg: UIColors.gray.gray }, + style: { inverse: true }, + }, + number: { + positive: { fg: UIColors.green.green, bold: true }, + neutral: { fg: UIColors.gray.battleship_gray, bold: false }, + negative: { fg: UIColors.red.red, bold: true }, + } satisfies StyleCategory, +}; + +export const applyStyle = ( + text: string, + styleItem: StyleItem | StyleItemVersioned, + version = "default", +) => { + let style; + if (version && Object.keys(styleItem).includes(version)) { + style = (styleItem as StyleItemVersioned)[version]; + } else { + style = styleItem; + } + + let styled = text; + if (style.fg) { + styled = `{${style.fg}-fg}${styled}{/${style.fg}-fg}`; + } + if (style.bold) { + styled = `{bold}${styled}{/bold}`; + } + return styled; +}; + +export function applyStatusStyle(status: TaskRunStatusEnum, value?: string) { + const { fg, icon } = (UIConfig.status as any)[status]; + return applyStyle(`${icon} ${value ?? status}`, { ...UIConfig.labels.status, fg }); +} + +export function applyNumberStyle(count: number, inverse = false) { + let style; + if (count === 0) { + style = UIConfig.number.neutral; + } else if (count > 0) { + style = inverse ? UIConfig.number.negative : UIConfig.number.positive; + } else { + style = inverse ? UIConfig.number.positive : UIConfig.number.negative; + } + + return applyStyle(String(count), style); +} + +export function applyBooleanStyle( + value: boolean, + version?: typeof DEFAULT_VERSION | typeof BUSY_IDLE | typeof INVERSE_COLOR, +) { + const styleVersions = value ? UIConfig.boolean.TRUE : UIConfig.boolean.FALSE; + const style = styleVersions[version ?? DEFAULT_VERSION]; + return applyStyle(style.icon, { ...style }, version); +} + +export function applyAgentKindIdStyle(agentKindId: AgentKindId) { + const style = UIConfig.labels.agentTypeId; + return applyStyle(agentKindId.agentKind, clone(style)); +} + +export function applyAgentIdStyle(agentId: AgentId | AgentTypeId) { + const style = UIConfig.labels.agentId[agentId.agentKind as AgentKindEnum]; + const isAgentId = (agentId as AgentId).agentNum != null; + return applyStyle( + `${style.icon} ${agentId.agentType}${isAgentId ? `[${(agentId as AgentId).agentNum}]` : ""}`, + { ...style }, + ); +} + +export function applyToolsStyle(tools: AvailableTool[]) { + return tools + .map((t) => [ + applyToolNameStyle(t.toolName), + applyStyle(t.description, UIConfig.labels.description), + "", + ]) + .join("\n"); +} + +export function applyToolNameStyle(toolName: string) { + const style = UIConfig.labels.tool; + return applyStyle(`${style.icon} ${toolName}`, style); +} + +export function bool( + value: boolean, + version?: typeof DEFAULT_VERSION | typeof BUSY_IDLE | typeof INVERSE_COLOR, +) { + return applyBooleanStyle(value, version); +} + +export function num(value: number, inverse = false) { + return applyNumberStyle(value, inverse); +} + +export function label(value: string) { + return applyStyle(value, UIConfig.labels.default); +} + +export function agentConfigId(value: string) { + return label(value); +} + +export function versionAgentPoolStats(value: string, poolStats?: AgentConfigPoolStats) { + return `${applyStyle(value, UIConfig.labels.version)}${poolStats ? ` ${agentPoolStats(poolStats)}` : ""}`; +} + +export function versionNum(value: number) { + return applyStyle(`v${String(value)}`, UIConfig.labels.version); +} + +export function agentKindId(value: AgentKindId) { + return applyAgentKindIdStyle(value); +} +export function agentTypeId(value: AgentTypeId) { + return applyAgentIdStyle(value); +} +export function agentId(value: AgentId | AgentTypeId) { + return applyAgentIdStyle(value); +} +export function agentKind(value: AgentKindValue) { + return applyStyle(value, UIConfig.labels.agentKind); +} +export function agentType(value: AgentTypeValue) { + return applyStyle(value, UIConfig.labels.agentType); +} +export function desc(description: string) { + return applyStyle(description, UIConfig.labels.description); +} +export function tools(tools: AvailableTool[]) { + return applyToolsStyle(tools); +} + +export function timestamp(timestamp: string | Date) { + let value; + if (typeof timestamp === "string") { + value = new Date(timestamp).toLocaleString(); + } else { + value = timestamp.toLocaleString(); + } + + return applyStyle(value, UIConfig.labels.timestamp); +} + +export function eventType(event: string) { + return applyStyle(event, UIConfig.labels.eventType); +} +export function error(error: string) { + return applyStyle(error, UIConfig.labels.error); +} + +export function input(input: string, version?: typeof DEFAULT_VERSION | typeof AMBIENT_VERSION) { + const style = UIConfig.labels.input[version ?? DEFAULT_VERSION]; + return applyStyle(input, style); +} + +export function output(output: string) { + return applyStyle(output, UIConfig.labels.output); +} + +export function agentPoolStats(poolStats: AgentConfigPoolStats) { + return `[${num(poolStats.available)}/${num(poolStats.poolSize)}]`; +} + +export function agentPool(agentPool: { + agentType: string; + poolStats: AgentConfigPoolStats; + agentConfigVersion?: number; +}): string { + return `${agentId(stringToAgentType(agentPool.agentType))} ${(agentPool.agentConfigVersion && `${versionNum(agentPool.agentConfigVersion)} `) || ""}${agentPoolStats(agentPool.poolStats)}`; +} + +export function agent(agent: AgentInfo) { + return `${agentId(stringToAgent(agent.agentId))} ${versionNum(agent.agentConfigVersion)} ${bool(agent.inUse, agent.inUse ? DEFAULT_VERSION : BUSY_IDLE)}`; +} + +export function applyTaskKindIdStyle(taskKindId: TaskKindId) { + const style = UIConfig.labels.taskTypeId; + return applyStyle(taskKindId.taskKind, clone(style)); +} + +export function applyTaskRunIdStyle(taskRunId: TaskRunId | TaskTypeId) { + const style = UIConfig.labels.taskRunId[taskRunId.taskKind as TaskKindEnum]; + const isTaskRunId = (taskRunId as TaskRunId).taskRunNum != null; + return applyStyle( + `${style.icon} ${taskRunId.taskType}${isTaskRunId ? `[${(taskRunId as TaskRunId).taskRunNum}]` : ""}`, + { ...style }, + ); +} + +export function taskKind(taskKind: TaskKindValue) { + return applyStyle(taskKind, UIConfig.labels.taskKind); +} + +export function taskType(taskType: TaskTypeValue) { + return applyStyle(taskType, UIConfig.labels.taskType); +} + +export function concurrencyMode(concurrencyMode: string) { + return applyStyle(concurrencyMode, UIConfig.labels.default); +} + +export function taskKindId(taskKindId: TaskKindId): string { + return applyTaskKindIdStyle(taskKindId); +} + +export function taskRunId(value: TaskRunId | TaskTypeId) { + return applyTaskRunIdStyle(value); +} + +export function taskPoolStats(poolStats: TaskConfigPoolStats) { + return `[${num(poolStats.active)}/${num(poolStats.poolSize)}]`; +} + +export function taskPool(taskPool: { + taskType: TaskTypeValue; + poolStats: TaskConfigPoolStats; + taskConfigVersion?: number; +}): string { + return `${taskRunId(stringToTaskType(taskPool.taskType))} ${(taskPool.taskConfigVersion && `${versionNum(taskPool.taskConfigVersion)} `) || ""}${taskPoolStats(taskPool.poolStats)}`; +} + +export function task(taskRunInfo: TaskRunInfo) { + return `${taskRunId(stringToTaskRun(taskRunInfo.taskRunId))} ${versionNum(taskRunInfo.taskConfigVersion)} ${applyStatusStyle(taskRunInfo.taskRun.status)}`; +} + +export function taskConfigId(value: TaskConfigIdValue) { + return label(value); +} + +export function versionTaskPoolStats(value: string, poolStats?: TaskConfigPoolStats) { + return `${applyStyle(value, UIConfig.labels.version)}${poolStats ? ` ${taskPoolStats(poolStats)}` : ""}`; +} + +export function taskRunStatus(status: TaskRunStatusEnum) { + return applyStatusStyle(status); +} diff --git a/src/ui/index.ts b/src/ui/index.ts new file mode 100644 index 0000000..c9b73fe --- /dev/null +++ b/src/ui/index.ts @@ -0,0 +1,3 @@ +export * from "./agent-monitor/monitor.js"; +export * from "./task-monitor/monitor.js"; +export * from "./monitor.js"; diff --git a/src/ui/main.ts b/src/ui/main.ts new file mode 100644 index 0000000..1e1355a --- /dev/null +++ b/src/ui/main.ts @@ -0,0 +1,3 @@ +import { Monitor } from "./monitor.js"; + +new Monitor().start(); diff --git a/src/ui/monitor.ts b/src/ui/monitor.ts new file mode 100644 index 0000000..f522b0e --- /dev/null +++ b/src/ui/monitor.ts @@ -0,0 +1,49 @@ +import blessed from "blessed"; +import { TaskMonitor } from "./task-monitor/monitor.js"; +import { AgentMonitor } from "./agent-monitor/monitor.js"; +import { BaseMonitor } from "./base/monitor.js"; + +export class Monitor extends BaseMonitor { + private agentMonitor: AgentMonitor; + private taskMonitor: TaskMonitor; + + constructor(title = "Bee Supervisor Monitor") { + super({ title }); + this.agentMonitor = new AgentMonitor({ + screen: this.screen, + parent: blessed.box({ + parent: this.screen, + width: "50%", + height: "100%", + left: 0, + top: 0, + mouse: true, + keys: true, + vi: true, + border: { type: "bg" }, + label: "■■■ AGENT MONITOR ■■■", + }), + }); + + this.taskMonitor = new TaskMonitor({ + screen: this.screen, + parent: blessed.box({ + parent: this.screen, + width: "50%", + height: "100%", + left: "50%", + top: 0, + mouse: true, + keys: true, + vi: true, + border: { type: "bg" }, + label: "■■■ TASK MONITOR ■■■", + }), + }); + } + + start() { + this.agentMonitor.start(); + this.taskMonitor.start(); + } +} diff --git a/src/ui/task-monitor/monitor.ts b/src/ui/task-monitor/monitor.ts new file mode 100644 index 0000000..6ecdf0b --- /dev/null +++ b/src/ui/task-monitor/monitor.ts @@ -0,0 +1,555 @@ +import blessed from "blessed"; +import { join } from "path"; +import { clone } from "remeda"; +import { stringToAgent } from "@/agents/agent-id.js"; +import { isTaskRunActiveStatus, TaskConfig, TaskKindEnumSchema } from "@/tasks/manager/dto.js"; +import { StateUpdateType, TaskRunInfo, TaskStateBuilder } from "@/tasks/state/builder.js"; +import { + stringToTaskConfig, + stringToTaskKind, + stringToTaskRun, + TaskConfigId, + TaskKindId, + taskSomeIdToTypeValue, + TaskTypeId, +} from "@/tasks/task-id.js"; +import { BaseMonitor, ParentInput, ScreenInput } from "../base/monitor.js"; +import * as st from "../config.js"; + +const TASK_CONFIG_DETAIL_DEFAULT_TEXT = "Select task pool to view task config detail"; +const TASK_VERSION_DEFAULT_TEXT = "Select pool to view versions"; +const TASK_RUN_LIST_DEFAULT_TEXT = "Select pool to view tasks"; +const TASK_RUN_DETAIL_DEFAULT_TEXT = "Select task run to view task run detail"; +// const TASK_LIFECYCLE_HISTORY_DEFAULT_TEXT = "Select task run to view lifecycle events"; + +export class TaskMonitor extends BaseMonitor { + private stateBuilder: TaskStateBuilder; + private taskPoolList: blessed.Widgets.ListElement; + private taskPoolListItemsData: { + taskTypeId: TaskTypeId | TaskKindId; + itemContent: string; + }[] = []; + private taskPoolListSelectedIndex: number | null = null; + + private taskVersionsList: blessed.Widgets.ListElement; + private taskVersionsListItemsData: { + taskTypeId: TaskConfigId; + itemContent: string; + }[] = []; + private taskVersionsListSelectedIndex: number | null = null; + + private taskRunList: blessed.Widgets.ListElement; + private taskRunListItemsData: { + taskRun: TaskRunInfo; + itemContent: string; + }[] = []; + private taskRunListSelectedIndex: number | null = null; + + private taskConfigDetail: blessed.Widgets.BoxElement; + private taskRunDetail: blessed.Widgets.BoxElement; + private logBox: blessed.Widgets.Log; + + constructor(arg: ParentInput | ScreenInput) { + super(arg); + this.stateBuilder = new TaskStateBuilder(); + this.stateBuilder.on("log:reset", () => { + this.reset(); + }); + this.stateBuilder.on("log:new_line", (line) => { + this.logBox.log(`${new Date().toLocaleString()} - ${line}`); + }); + this.stateBuilder.on("state:updated", (update) => { + switch (update.type) { + case StateUpdateType.TASK_CONFIG: + case StateUpdateType.POOL: + this.updateTaskPoolsList(false); + break; + case StateUpdateType.TASK_RUN: + this.updateTaskVersionsList(false); + break; + case StateUpdateType.HISTORY_ENTRY: + this.updateTaskRunDetails(undefined, false); + break; + // case StateUpdateType.AGENT: + // this.updateAgentVersionsList(false); + // this.updateAgentDetails(); + // break; + // case StateUpdateType.ASSIGNMENT: + // this.updateAgentDetails(); + // break; + // case StateUpdateType.FULL: + // // Full refresh + // // this.reset(); + // break; + } + }); + + this.stateBuilder.on("error", (error: Error) => { + this.logBox.log(`Error occurred: ${JSON.stringify(error)}`); + }); + + // Left column - Pools and Task Runs (70%) + this.taskPoolList = blessed.list({ + parent: this.parent, + width: "30%", + height: "20%", + left: 0, + top: 0, + border: { type: "line" }, + label: " Task Pools ", + style: st.UIConfig.list, + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + this.taskVersionsList = blessed.list({ + parent: this.parent, + width: "30%", + height: "30%", + left: 0, + top: "20%", + border: { type: "line" }, + label: " Task Runs Versions ", + content: TASK_VERSION_DEFAULT_TEXT, + style: st.UIConfig.list, + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + this.taskRunList = blessed.list({ + parent: this.parent, + width: "30%", + height: "40%", + left: 0, + top: "50%", + border: { type: "line" }, + label: " Task Runs ", + content: TASK_RUN_LIST_DEFAULT_TEXT, + style: st.UIConfig.list, + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + // Center column - Details and Tools (40%) + this.taskConfigDetail = blessed.box({ + parent: this.parent, + width: "40%", + height: "30%", + left: "30%", + top: 0, + border: { type: "line" }, + label: " Task Config ", + content: TASK_CONFIG_DETAIL_DEFAULT_TEXT, + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + this.taskRunDetail = blessed.box({ + parent: this.parent, + width: "40%", + height: "60%", + left: "30%", + top: "30%", + border: { type: "line" }, + label: " Task Run Detail ", + content: TASK_RUN_DETAIL_DEFAULT_TEXT, + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + // Bottom - Live Updates + this.logBox = blessed.log({ + parent: this.parent, + width: "100%", + height: "10%", + left: 0, + top: "90%", + border: { type: "line" }, + label: " Live Updates ", + tags: true, + scrollable: true, + mouse: true, + keys: true, + vi: true, + scrollbar: st.UIConfig.scrollbar, + }); + + this.setupEventHandlers(); + this.screen.render(); + } + + private setupEventHandlers() { + this.screen.key(["escape", "q", "C-c"], () => process.exit(0)); + + this.taskPoolList.on("select", (_, selectedIndex) => { + this.taskPoolListSelectedIndex = selectedIndex; + const itemData = this.taskPoolListItemsData[this.taskPoolListSelectedIndex]; + if (!itemData) { + throw new Error( + `Missing data for selected pool on index:${this.taskPoolListSelectedIndex}`, + ); + } + let taskConfig; + const taskTypeId = itemData.taskTypeId; + if ((taskTypeId as TaskTypeId).taskType) { + taskConfig = this.stateBuilder.getTaskConfig( + taskSomeIdToTypeValue(taskTypeId as TaskTypeId), + ); + } + + this.updateTaskConfig(taskConfig, false); + this.updateTaskVersionsList(); + }); + + this.taskVersionsList.on("select", (_, selectedIndex) => { + this.taskVersionsListSelectedIndex = selectedIndex; + const itemData = this.taskVersionsListItemsData[this.taskVersionsListSelectedIndex]; + if (!itemData) { + throw new Error(`Missing data for selectedIndex:${this.taskVersionsListSelectedIndex}`); + } + + const taskConfigId = itemData.taskTypeId as TaskConfig; + const taskConfig = this.stateBuilder.getTaskConfig( + taskSomeIdToTypeValue(taskConfigId), + taskConfigId.taskConfigVersion, + ); + + this.updateTaskConfig(taskConfig, false); + this.updateTaskVersionsList(); + }); + + this.taskRunList.on("select", (_, selectedIndex) => { + this.taskRunListSelectedIndex = selectedIndex; + const itemData = this.taskRunListItemsData[this.taskRunListSelectedIndex]; + if (!itemData) { + throw new Error(`Missing data for selectedIndex:${this.taskPoolListSelectedIndex}`); + } + const { taskRun } = itemData; + const taskRunConfigId = stringToTaskConfig(taskRun.taskConfigId); + const taskRunTypeId = taskSomeIdToTypeValue(taskRunConfigId); + const taskRunConfig = this.stateBuilder.getTaskConfig( + taskRunTypeId, + taskRunConfigId.taskConfigVersion, + ); + this.updateTaskConfig(taskRunConfig, false); + this.updateTaskRunDetails(itemData.taskRun); + }); + + // Mouse scrolling for all components + [ + this.taskPoolList, + this.taskRunList, + this.taskConfigDetail, + this.taskRunDetail, + // this.lifecycleHistory, + ].forEach((component) => { + component.on("mouse", (data) => { + if (data.action === "wheelup") { + component.scroll(-1); + this.screen.render(); + } else if (data.action === "wheeldown") { + component.scroll(1); + this.screen.render(); + } + }); + }); + } + + updateTaskPoolsList(shouldRender = true): void { + this.taskPoolListItemsData.splice(0); + const state = this.stateBuilder.getState(); + Array.from(state.taskRunPools.entries()) + .sort(([a], [b]) => { + // Sort task kind + const aPoolId = stringToTaskKind(a); + const bPoolId = stringToTaskKind(b); + const aSuper = aPoolId.taskKind === TaskKindEnumSchema.Values.supervisor; + const bSuper = bPoolId.taskKind === TaskKindEnumSchema.Values.supervisor; + if (aSuper && !bSuper) { + return -1; + } else if (!aSuper && bSuper) { + return 1; + } else { + return aPoolId.taskKind.localeCompare(bPoolId.taskKind); + } + }) + .forEach(([taskKindStr, taskTypePools]) => { + const taskKindId = stringToTaskKind(taskKindStr); + this.taskPoolListItemsData.push({ + taskTypeId: taskKindId, + itemContent: st.taskKindId(taskKindId), + }); + Array.from(taskTypePools.entries()) + .sort(([a], [b]) => { + // Sort task type + return a.localeCompare(b); + }) + .forEach(([taskTypeStr, taskPool]) => { + this.taskPoolListItemsData.push({ + taskTypeId: { taskKind: taskKindId.taskKind, taskType: taskTypeStr }, + itemContent: st.taskPool(taskPool), + }); + }); + }); + + if (this.taskPoolListSelectedIndex == null && this.taskPoolListItemsData.length) { + this.taskPoolListSelectedIndex = 0; + this.taskPoolList.select(this.taskPoolListSelectedIndex); + } + this.taskPoolList.setItems(this.taskPoolListItemsData.map((it) => it.itemContent)); + + this.updateTaskVersionsList(false); + if (shouldRender) { + this.screen.render(); + } + } + + private updateTaskVersionsList(shouldRender = true): void { + this.taskVersionsListItemsData.splice(0); + + if (this.taskPoolListSelectedIndex != null) { + // Get versions of selected task pool + const itemData = this.taskPoolListItemsData[this.taskPoolListSelectedIndex]; + if (!itemData) { + throw new Error( + `Missing data for selected pool on index:${this.taskPoolListSelectedIndex}`, + ); + } + + const taskPoolTypeId = itemData.taskTypeId as TaskTypeId; + if (taskPoolTypeId.taskType != null) { + // List versions + const taskPool = this.stateBuilder.getTaskPool( + taskPoolTypeId.taskKind, + taskPoolTypeId.taskType, + ); + if (taskPool) { + const hasMultipleVersions = taskPool.versions.length > 1; + if (hasMultipleVersions) { + this.taskPoolListItemsData.push({ + taskTypeId: { + taskKind: taskPoolTypeId.taskKind, + taskType: taskPoolTypeId.taskType, + }, + itemContent: st.versionAgentPoolStats("all"), + }); + } + + clone(taskPool.versions) + .reverse() + .forEach(([taskConfigVersion, poolStats]) => { + const taskTypeId = { + taskKind: taskPoolTypeId.taskKind, + taskType: taskPoolTypeId.taskType, + taskConfigVersion, + }; + this.taskVersionsListItemsData.push({ + taskTypeId, + itemContent: st.versionTaskPoolStats(st.versionNum(taskConfigVersion), poolStats), + }); + }); + } + } + } + + this.taskVersionsList.setItems(this.taskVersionsListItemsData.map((it) => it.itemContent)); + this.taskVersionsList.setContent( + this.taskVersionsListItemsData.length ? "" : TASK_VERSION_DEFAULT_TEXT, + ); + this.updateTaskList(false); + if (shouldRender) { + this.screen.render(); + } + } + + private updateTaskList(shouldRender = true): void { + this.taskRunListItemsData.splice(0); + if (this.taskVersionsListSelectedIndex != null) { + Array.from(this.stateBuilder.getAllTaskRuns()) + .filter((a) => { + if (this.taskVersionsListSelectedIndex == null) { + return false; + } + + const taskRunId = stringToTaskRun(a.taskRunId); + const taskRunPoolListItem = + this.taskVersionsListItemsData[this.taskVersionsListSelectedIndex]; + if ( + taskRunPoolListItem && + taskRunPoolListItem.taskTypeId.taskKind === taskRunId.taskKind + ) { + if ((taskRunPoolListItem.taskTypeId as TaskTypeId).taskType != null) { + if ((taskRunPoolListItem.taskTypeId as TaskTypeId).taskType == taskRunId.taskType) { + if ((taskRunPoolListItem.taskTypeId as TaskConfigId).taskConfigVersion != null) { + return ( + (taskRunPoolListItem.taskTypeId as TaskConfigId).taskConfigVersion === + taskRunId.taskConfigVersion + ); + } + } else { + return false; + } + } + return true; + } + return false; + }) + .sort((a, b) => { + const aTaskRunId = stringToTaskRun(a.taskRunId); + const bTaskRunId = stringToTaskRun(b.taskRunId); + + if (aTaskRunId.taskConfigVersion != bTaskRunId.taskConfigVersion) { + return Math.sign(aTaskRunId.taskConfigVersion - bTaskRunId.taskConfigVersion); + } + + const comp = aTaskRunId.taskType.localeCompare(bTaskRunId.taskType); + if (comp === 0) { + return Math.sign(aTaskRunId.taskRunNum - bTaskRunId.taskRunNum); + } else { + return comp; + } + }) + .forEach((task) => { + this.taskRunListItemsData.push({ + taskRun: task, + itemContent: st.task(task), + }); + }); + } + + this.taskRunList.setItems(this.taskRunListItemsData.map((it) => it.itemContent)); + this.taskRunList.setContent(this.taskRunListItemsData.length ? "" : TASK_RUN_LIST_DEFAULT_TEXT); + if (shouldRender) { + this.screen.render(); + } + } + + private updateTaskConfig(taskConfig?: TaskConfig, shouldRender = true): void { + if (!taskConfig) { + this.taskConfigDetail.setContent(TASK_CONFIG_DETAIL_DEFAULT_TEXT); + if (shouldRender) { + this.screen.render(); + } + return; + } + + const details = [ + `${st.label("Id")}: ${st.taskConfigId(taskConfig.taskConfigId)}`, + `${st.label("Version")}: ${st.versionNum(taskConfig.taskConfigVersion)}`, + `${st.label("Task Kind")}: ${st.taskKind(taskConfig.taskKind)}`, + `${st.label("Task Type")}: ${st.taskType(taskConfig.taskType)}`, + `${st.label("Max Repeats")}: ${st.num(taskConfig.maxRepeats || 0)}`, + `${st.label("Interval ms")}: ${st.num(taskConfig.intervalMs)}`, + `${st.label("Concurrency Mode")}: ${st.concurrencyMode(taskConfig.concurrencyMode)}`, + "", + `${st.label("Description")}: `, + st.desc(taskConfig.description), + "", + `${st.label("Input")}: `, + st.input(taskConfig.taskConfigInput, "ambient"), + ].join("\n"); + this.taskConfigDetail.setContent(details); + if (shouldRender) { + this.screen.render(); + } + } + + private updateTaskRunDetails(taskRunInfo?: TaskRunInfo, shouldRender = true): void { + if (!taskRunInfo) { + this.taskRunDetail.setContent(TASK_RUN_DETAIL_DEFAULT_TEXT); + if (shouldRender) { + this.screen.render(); + } + return; + } + + const { + taskRunId, + status, + isOccupied, + currentAgentId, + ownerAgentId, + completedRuns, + errorCount, + lastRunAt, + nextRunAt, + history, + taskRunInput, + } = taskRunInfo.taskRun; + + const { isDestroyed } = taskRunInfo; + + const details = [ + `${st.label("Id")}: ${st.taskRunId(stringToTaskRun(taskRunId))}`, + `${st.label("In Use")}: ${st.bool(isTaskRunActiveStatus(status), "busy_idle")}`, + `${st.label("Status")}: ${st.taskRunStatus(status)}`, + `${st.label("Is Destroyed")}: ${st.bool(isDestroyed, "inverse_color")}`, + `${st.label("Is Occupied")}: ${st.bool(isOccupied)}${currentAgentId ? st.agentId(stringToAgent(currentAgentId)) : ""}`, + `${st.label("Owner")}: ${st.agentId(stringToAgent(ownerAgentId))}`, + `${st.label("Completed Runs")}: ${st.num(completedRuns)}`, + `${st.label("Error Count")}: ${st.num(errorCount, true)}`, + lastRunAt ? `${st.label("Last Run")}: ${st.timestamp(lastRunAt)}` : null, + nextRunAt ? `${st.label("Next Run")}: ${st.timestamp(nextRunAt)}` : null, + "", + `${st.label("Input")}:`, + `${st.input(taskRunInput)}`, + "", + history.at(-1)?.output + ? `${st.label("Output")}: \n${st.output(String(history.at(-1)?.output))}` + : null, + "", + "", + history.at(-1)?.error + ? `${st.label("Error")}: \n${st.error(String(history.at(-1)?.error))}` + : null, + "", + ].join("\n"); + this.taskRunDetail.setContent(details); + if (shouldRender) { + this.screen.render(); + } + } + + reset(shouldRender = true): void { + // Reset selections + this.taskPoolListSelectedIndex = null; + + // Update content + this.updateTaskPoolsList(false); + + // Reset log box + this.logBox.setContent(""); + this.logBox.log("Reading initial state from log..."); + + // Render + if (shouldRender) { + this.screen.render(); + } + } + + public async start(): Promise { + const logPath = join(process.cwd(), "logs", "task_state.log"); + // First read the entire log to build initial state + await this.stateBuilder.watchLogFile(logPath); + } +} diff --git a/src/utils/file.ts b/src/utils/file.ts new file mode 100644 index 0000000..4d6e65a --- /dev/null +++ b/src/utils/file.ts @@ -0,0 +1,17 @@ +import { join, normalize, relative } from "path"; + +export function validatePath(parentDir: string, targetPath: string): string { + // Normalize paths to remove any '..' or '.' segments and resolve relative paths + const normalizedParent = normalize(parentDir); + const normalizedTarget = normalize(join(normalizedParent, targetPath)); + + // Get relative path to check if it stays within parent + const relativePath = relative(normalizedParent, normalizedTarget); + + if (relativePath.startsWith("..") || targetPath.startsWith("/")) { + throw new Error(`Path traversal attempt detected for path: "${targetPath}"`); + } + + // Return the clean relative path + return relativePath; +} diff --git a/src/utils/objects.ts b/src/utils/objects.ts new file mode 100644 index 0000000..60ad98b --- /dev/null +++ b/src/utils/objects.ts @@ -0,0 +1,39 @@ +type DeepPartial = { + [P in keyof T]?: T[P] extends object ? DeepPartial : T[P]; +}; + +/** + * Recursively updates original object with values from update object + * @param original The original object to update + * @param update Partial object containing updates + * @returns The updated original object + */ +export function updateDeepPartialObject(original: T, update: DeepPartial): T { + const keys = Object.keys(update) as (keyof T)[]; + + for (const key of keys) { + const updateValue = update[key]; + + // Special case for Date objects + if (updateValue instanceof Date) { + original[key] = updateValue as T[keyof T]; + } + // Handle nested objects recursively + else if ( + updateValue !== null && + typeof updateValue === "object" && + !Array.isArray(updateValue) && + typeof original[key] === "object" && + !(original[key] instanceof Date) // Don't treat Date as a regular object + ) { + original[key] = { + ...(original[key] as object), + ...updateDeepPartialObject(original[key] as object, updateValue as DeepPartial), + } as T[keyof T]; + } else { + original[key] = updateValue as T[keyof T]; + } + } + + return original; +} diff --git a/src/utils/text.ts b/src/utils/text.ts new file mode 100644 index 0000000..2ae0c8e --- /dev/null +++ b/src/utils/text.ts @@ -0,0 +1,6 @@ +export function truncateText(text: string, maxLength: number): string { + if (text.length <= maxLength) { + return text; + } + return text.substring(0, maxLength - 3) + "..."; +} diff --git a/src/utils/time.ts b/src/utils/time.ts new file mode 100644 index 0000000..c0d0222 --- /dev/null +++ b/src/utils/time.ts @@ -0,0 +1,17 @@ +export function formatDuration(ms: number): string { + const seconds = Math.floor(ms / 1000); + const minutes = Math.floor(seconds / 60); + const hours = Math.floor(minutes / 60); + const days = Math.floor(hours / 24); + + if (days > 0) { + return `${days}d ${hours % 24}h`; + } + if (hours > 0) { + return `${hours}h ${minutes % 60}m`; + } + if (minutes > 0) { + return `${minutes}m ${seconds % 60}s`; + } + return `${seconds}s`; +} diff --git a/src/workspaces/index.ts b/src/workspaces/index.ts new file mode 100644 index 0000000..80549c0 --- /dev/null +++ b/src/workspaces/index.ts @@ -0,0 +1,7 @@ +import * as workspaceManager from "./manager/index.js"; +import * as restoration from "./restore/index.js"; + +export default { + workspaceManager, + restoration, +} as const; diff --git a/src/workspaces/manager/index.ts b/src/workspaces/manager/index.ts new file mode 100644 index 0000000..4a5b5dd --- /dev/null +++ b/src/workspaces/manager/index.ts @@ -0,0 +1 @@ +export * from "./manager.js"; diff --git a/src/workspaces/manager/manager.ts b/src/workspaces/manager/manager.ts new file mode 100644 index 0000000..4f36486 --- /dev/null +++ b/src/workspaces/manager/manager.ts @@ -0,0 +1,284 @@ +import { Logger } from "bee-agent-framework"; +import EventEmitter from "events"; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; +import path, { basename } from "path"; +import { clone } from "remeda"; +import { validatePath } from "@/utils/file.js"; + +export const WORKSPACES_DIR_PATH = ["..", "..", "workspaces"] as const; +export const DEFAULT_WORKSPACE_DIR_NAME = "default"; + +interface WorkspaceManagerEvents { + "workspace:reset": () => void; + "workspace:change": (resource: WorkspaceResource) => void; +} + +export interface WorkspaceResource { + isDirectory: boolean; + name: string; + path: string; + ownerId: string; +} + +type DirPath = string; + +export interface CreateResourceInput { + kind: "file" | "directory"; + path: readonly string[]; +} + +export interface CreateDirectoryResourceInput extends CreateResourceInput { + kind: "directory"; +} + +export interface CreateFileResourceInput extends CreateResourceInput { + kind: "file"; +} + +export class WorkspaceManager extends EventEmitter { + private logger: Logger; + private static instance: WorkspaceManager; + private _workspacesDirPath?: string; + private _workspaceName?: string; + private _workspacePath?: string; + private resources = new Map(); + + static init(dirPath: string[], workspace: string) { + if (this.instance) { + throw new Error(`Workspace manager is already initialized`); + } + this.instance = new WorkspaceManager(); + this.instance.setWorkspaceDirPath(dirPath); + this.instance.setWorkspace(workspace); + return this.instance; + } + + static getInstance() { + if (!this.instance) { + throw new Error(`Workspace manager wasn't initialized yet`); + } + return this.instance; + } + + get workspaceName() { + if (!this._workspaceName) { + throw Error(`Workspace wasn't set yet`); + } + + return this._workspaceName; + } + + get workspacesDirPath() { + if (!this._workspacesDirPath) { + throw Error(`Workspace dir path wasn't set yet`); + } + + return this._workspacesDirPath; + } + + get workspacePath() { + if (!this._workspacePath) { + throw Error(`Workspace path wasn't set yet`); + } + + return this._workspacePath; + } + + setWorkspaceDirPath(dirPath: string[]) { + const joinedPath = path.join(...dirPath); + const dir = path.dirname(joinedPath); + if (!existsSync(dir)) { + throw new Error(`Workspace directory ${joinedPath} doesn't exists`); + } + this._workspacesDirPath = joinedPath; + } + + private constructor() { + super(); + this.logger = Logger.root.child({ name: "WorkspaceManager" }); + } + + private ensureDirectoryExists(dirPath: string) { + const validDirPath = validatePath(this.workspacesDirPath, dirPath); + + try { + if (!existsSync(validDirPath)) { + mkdirSync(validDirPath, { recursive: true }); + this.logger.info(`Created directory: ${dirPath}`); + } + } catch (error) { + this.logger.error(`Error creating directory: ${dirPath}`); + throw error; + } + } + + public on( + event: K, + listener: WorkspaceManagerEvents[K], + ): this { + return super.on(event, listener); + } + + public emit( + event: K, + ...args: Parameters + ): boolean { + return super.emit(event, ...args); + } + + setWorkspace(workspaceName: string) { + const workspaceNameSanitized = basename(workspaceName); + const workspacePathSanitized = path.join(this.workspacesDirPath, workspaceNameSanitized); + this.ensureDirectoryExists(workspacePathSanitized); + this._workspaceName = workspaceNameSanitized; + this._workspacePath = workspacePathSanitized; + } + + registerResource( + input: CreateFileResourceInput | CreateDirectoryResourceInput, + ownerId: string, + ): WorkspaceResource { + const { inputJoinedPath, validPath } = this.getWorkspacePath(input); + const name = basename(validPath); + + // Check if resource already exists in our tracking + const existingResource = this.resources.get(inputJoinedPath); + if (existingResource) { + throw new Error( + `Resource on path ${inputJoinedPath} already exists and is owned by ${existingResource.ownerId}`, + ); + } + + try { + if (input.kind === "directory") { + if (!existsSync(validPath)) { + // Create directory with all subdirectories only if it doesn't exist + mkdirSync(validPath, { recursive: true }); + this.logger.info(`Created directory: ${input.path}`); + } else { + this.logger.info(`Directory already exists, skipping creation: ${input.path}`); + } + } else { + if (!existsSync(validPath)) { + // For files, first ensure parent directory exists + const parentDir = path.dirname(validPath); + if (!existsSync(parentDir)) { + mkdirSync(parentDir, { recursive: true }); + } + + // Create empty file only if it doesn't exist + writeFileSync(validPath, ""); + this.logger.info(`Created file: ${input.path}`); + } else { + this.logger.info(`File already exists, skipping creation: ${input.path}`); + } + } + + const resource = { + name, + path: validPath, + ownerId, + isDirectory: input.kind === "directory", + }; + // Track the new resource + this.resources.set(inputJoinedPath, resource); + return clone(resource); + } catch (error) { + this.logger.error(`Error creating resource: ${inputJoinedPath} owned by ${ownerId}`, error); + throw error; + } + } + + /** + * Reads the content of a file resource + * @param path Path to the resource + * @param ownerId ID of the resource owner + * @param onLine Callback to handle the resource content + * @throws Error if resource doesn't exist, belongs to different owner, is a directory, or can't be read + */ + readResource( + resourcePath: string, + ownerId: string, + onLine: (resource: WorkspaceResource, content: string) => void, + ): void { + // Check if resource exists in our tracking + const resource = this.resources.get(resourcePath); + if (!resource) { + throw new Error(`Resource not found: ${resourcePath}`); + } + + // Verify ownership + if (resource.ownerId !== ownerId) { + throw new Error(`Access denied: Resource ${resourcePath} is owned by ${resource.ownerId}`); + } + + // Check if it's a directory + if (resource.isDirectory) { + throw new Error(`Cannot read content of directory: ${resourcePath}`); + } + + try { + // Read file content synchronously + const content = readFileSync(resource.path, { encoding: "utf8" }); + if (content.length === 0) { + // Nothing to parse + return; + } + + // Split content into lines and process each line + const lines = content.split(/\r?\n/); + for (const line of lines) { + onLine(resource, line); + } + + this.logger.info(`Successfully read file: ${resourcePath}`); + } catch (error) { + this.logger.error(`Error setting up file read: ${resourcePath}`, error); + throw new Error(`Failed to read file ${resourcePath}: ${error.message}`); + } + } + + /** + * Writes content to a file resource + * @param resourcePath Path to the resource + * @param resourceOwnerId ID of the resource owner + * @param content Content to write to the file + * @throws Error if resource doesn't exist, belongs to different owner, is a directory, or can't be written + */ + writeResource(resourcePath: string, resourceOwnerId: string, content: string): void { + // Check if resource exists in our tracking + const resource = this.resources.get(resourcePath); + if (!resource) { + throw new Error(`Resource not found: ${resourcePath}`); + } + + // Verify ownership + if (resource.ownerId !== resourceOwnerId) { + throw new Error(`Access denied: Resource ${resourcePath} is owned by ${resource.ownerId}`); + } + + // Check if it's a directory + if (resource.isDirectory) { + throw new Error(`Cannot write content to directory: ${resourcePath}`); + } + + try { + // Write content to file + writeFileSync(resource.path, content, "utf8"); + + this.logger.info(`Successfully wrote to file: ${resourcePath}`); + + // Emit change event with the updated resource + this.emit("workspace:change", clone(resource)); + } catch (error) { + this.logger.error(`Error writing to file: ${resourcePath}`, error); + throw new Error(`Failed to write to file ${resourcePath}: ${error.message}`); + } + } + + getWorkspacePath(input: CreateFileResourceInput | CreateDirectoryResourceInput) { + const inputJoinedPath = path.join(this.workspacePath, ...input.path); + const validPath = validatePath(this.workspacePath, inputJoinedPath); + return { inputJoinedPath, validPath }; + } +} diff --git a/src/workspaces/restore/index.ts b/src/workspaces/restore/index.ts new file mode 100644 index 0000000..e5bd1b2 --- /dev/null +++ b/src/workspaces/restore/index.ts @@ -0,0 +1 @@ +export * from "./restorable.js"; diff --git a/src/workspaces/restore/restorable.ts b/src/workspaces/restore/restorable.ts new file mode 100644 index 0000000..ab51675 --- /dev/null +++ b/src/workspaces/restore/restorable.ts @@ -0,0 +1,46 @@ +import { WorkspaceManager, WorkspaceResource } from "@workspaces/manager/manager.js"; +import { Logger } from "bee-agent-framework"; +import { AgentIdValue } from "@/agents/registry/dto.js"; + +export abstract class WorkspaceRestorable { + protected readonly logger: Logger; + protected workspaceManager: WorkspaceManager; + protected resource: WorkspaceResource; + protected resourceOwnerId: string; + + constructor(path: readonly string[], resourceOwnerId: string) { + this.logger = Logger.root.child({ name: this.constructor.name }); + this.resourceOwnerId = resourceOwnerId; + this.workspaceManager = WorkspaceManager.getInstance(); + this.resource = this.workspaceManager.registerResource( + { + kind: "file", + path, + }, + resourceOwnerId, + ); + } + + persist(): void { + const entities = this.getSerializedEntities(); + this.workspaceManager.writeResource(this.resource.path, this.resourceOwnerId, entities); + } + + protected abstract getSerializedEntities(): string; + + restore(actingAgentId: AgentIdValue): void { + this.workspaceManager.readResource( + this.resource.path, + this.resourceOwnerId, + (resource, content) => { + this.restoreEntity(resource, content, actingAgentId); + }, + ); + } + + protected abstract restoreEntity( + resource: WorkspaceResource, + line: string, + actingAgentId: AgentIdValue, + ): void; +} diff --git a/tsconfig.json b/tsconfig.json index b0ba404..e9c9332 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,8 @@ "incremental": false, "moduleDetection": "auto", "types": ["node"], + "declaration": true, + "declarationMap": true, "sourceMap": true, "allowJs": true, "outDir": "./dist", @@ -18,7 +20,16 @@ "useUnknownInCatchVariables": false, "strict": true, "skipLibCheck": true, - "strictNullChecks": true + "strictNullChecks": true, + "removeComments": false, + "forceConsistentCasingInFileNames": true, + "paths": { + "@/*": ["./src/*"], + "@agents/*": ["./src/agents/*"], + "@tasks/*": ["./src/tasks/*"], + "@workspaces/*": ["./src/workspaces/*"], + "@ui/*": ["./src/ui/*"] + } }, "include": ["src"] } diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..d89dbd8 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + test: { + testTimeout: 60_000 * 5, + setupFiles: ["dotenv/config"], + fileParallelism: false, + // pool: "threads", + // poolOptions: { + // threads: { minThreads: 1, maxThreads: 8 }, + // // forks: { minForks: 7, maxForks: 8 }, + // }, + isolate: false, + retry: 0, + }, +}); diff --git a/vitest.workspace.ts b/vitest.workspace.ts new file mode 100644 index 0000000..d85a198 --- /dev/null +++ b/vitest.workspace.ts @@ -0,0 +1,3 @@ +import { defineWorkspace } from "vitest/config"; + +export default defineWorkspace(["./vite.config.ts"]); diff --git a/workspaces/default/configs/agent_registry.jsonl b/workspaces/default/configs/agent_registry.jsonl new file mode 100644 index 0000000..d9b80d0 --- /dev/null +++ b/workspaces/default/configs/agent_registry.jsonl @@ -0,0 +1,2 @@ +{"autoPopulatePool":false,"agentKind":"supervisor","agentType":"boss","instructions":"","tools":["agent_registry","task_runner"],"description":"The boss supervisor agent that control whole app.","maxPoolSize":1,"agentConfigId":"supervisor:boss:1","agentConfigVersion":1} +{"agentType":"poem_generator","instructions":"You generate poems on a given topic. The topic will be provided as user input. \n\nThe goal is to produce a well-crafted poem that aligns with the given topic and adheres to any specified constraints. The poem should be engaging, thematically consistent, and exhibit a clear structure. It should creatively explore the subject while demonstrating linguistic elegance, rhythm, and flow. If no constraints are provided, it should default to a balanced poetic form that enhances readability and aesthetic appeal.\n\nThe poem should have 4 stanzas with 4 lines each. The first paragraph of the instructions should provide background information on the topic, the second paragraph should explain the main goal and what needs to be achieved, and the third paragraph should define the expected structure and style of the response.","description":"This agent generates poems on given topics.","tools":[],"maxPoolSize":1,"autoPopulatePool":true,"agentKind":"operator","agentConfigId":"operator:poem_generator:1","agentConfigVersion":1} \ No newline at end of file diff --git a/workspaces/default/configs/task_manager.jsonl b/workspaces/default/configs/task_manager.jsonl new file mode 100644 index 0000000..8393bd0 --- /dev/null +++ b/workspaces/default/configs/task_manager.jsonl @@ -0,0 +1 @@ +{"ownerId":"supervisor:boss[1]:1","taskConfig":{"taskKind":"operator","taskType":"poem_generation","taskConfigInput":"{}","description":"This task generates a poem on a given topic.","intervalMs":0,"runImmediately":false,"maxRetries":3,"retryDelayMs":10000,"agentKind":"operator","agentType":"poem_generator","agentNum":1,"agentVersion":1,"concurrencyMode":"PARALLEL","maxRepeats":null,"taskConfigId":"operator:poem_generation:1","ownerAgentId":"supervisor:boss[1]:1","taskConfigVersion":1}} \ No newline at end of file