From 2f5d6dacd459a838087e1f0adf47bd69e850af98 Mon Sep 17 00:00:00 2001 From: Dariel Date: Mon, 15 Jul 2024 23:14:36 -0400 Subject: [PATCH 1/6] Basic test suite implementation --- jest.config.js | 13 + package-lock.json | 6278 ++++++++++++++--- package.json | 12 +- playground/nodejs/index.js | 27 +- playground/react/src/App.jsx | 2 +- rollup.config.js | 11 +- src/agents.js | 8 +- src/api.js | 2 +- .../examples/teams/google/productSpecsTeam.js | 69 + .../examples/teams/openai/productSpecsTeam.js | 56 + .../teams/openai/productSpecsTeam.requests.js | 142 + tests/e2e/productSpecTeam.test.js | 85 + tests/utils/moscaFetch/Readme.md | 91 + tests/utils/moscaFetch/index.js | 103 + 14 files changed, 5756 insertions(+), 1143 deletions(-) create mode 100644 jest.config.js create mode 100644 tests/e2e/examples/teams/google/productSpecsTeam.js create mode 100644 tests/e2e/examples/teams/openai/productSpecsTeam.js create mode 100644 tests/e2e/examples/teams/openai/productSpecsTeam.requests.js create mode 100644 tests/e2e/productSpecTeam.test.js create mode 100644 tests/utils/moscaFetch/Readme.md create mode 100644 tests/utils/moscaFetch/index.js diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..4437efc --- /dev/null +++ b/jest.config.js @@ -0,0 +1,13 @@ +module.exports = { + transform: { + '^.+\\.js$': 'babel-jest', + }, + moduleNameMapper: { + '^agenticjs$': '/dist/bundle.cjs.js' + }, + testTimeout: 300000, // Sets global timeout to 10 seconds for all tests + testEnvironment: 'node', // Use Node.js environment for executing tests, + verbose: true, // Make Jest more verbose + silent: false, // Ensure Jest is not silent (though this is not directly related to console.log output) + + }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9b55af0..d327253 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,12 @@ "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^5.0.7", + "dotenv": "^16.4.5", "eslint": "^7.32.0", + "fetch-mock": "^10.0.7", + "fetch-mock-jest": "^1.5.1", + "jest": "^29.7.0", "prettier": "^2.3.2", "rollup-plugin-peer-deps-external": "^2.2.4", "rollup-plugin-sourcemaps": "^0.6.3", @@ -51,7 +56,6 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -93,7 +97,6 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "dev": true, - "peer": true, "engines": { "node": ">=6.9.0" } @@ -103,7 +106,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", @@ -149,7 +151,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dev": true, - "peer": true, "dependencies": { "@babel/compat-data": "^7.24.7", "@babel/helper-validator-option": "^7.24.7", @@ -166,7 +167,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "peer": true, "dependencies": { "yallist": "^3.0.2" } @@ -226,7 +226,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", @@ -241,12 +240,20 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-simple-access": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, - "peer": true, "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -290,7 +297,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "dev": true, - "peer": true, "engines": { "node": ">=6.9.0" } @@ -300,7 +306,6 @@ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", "dev": true, - "peer": true, "dependencies": { "@babel/template": "^7.24.7", "@babel/types": "^7.24.7" @@ -336,6 +341,195 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", + "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", @@ -385,6 +579,12 @@ "node": ">=6.9.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -542,492 +742,3305 @@ "node": ">=12" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "engines": { - "node": ">=6.0.0" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { - "node": ">=6.0.0" + "node": ">=6" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "engines": { + "node": ">=8" } }, - "node_modules/@langchain/anthropic": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-0.2.3.tgz", - "integrity": "sha512-f2fqzLGcvsXXUyZ1vl8cgwkKDGLshOGrPuR9hkhGuBG5m91eq755OqPBxWJuS1TFtNU813cXft3xh0MQbxavwg==", + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, "dependencies": { - "@anthropic-ai/sdk": "^0.22.0", - "@langchain/core": ">=0.2.9 <0.3.0", - "fast-xml-parser": "^4.3.5", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.4" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=18" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@langchain/core": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.2.14.tgz", - "integrity": "sha512-e+dB2Sra+5sY4fPCXrZh4w1fLR68yfX2XSWS97DzHpeJRRnMGbOzjaaks6gy3wPyWhfS1WGLisJCMfCmFvH9fw==", + "node_modules/@jest/console/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==", + "dev": true, "dependencies": { - "ansi-styles": "^5.0.0", - "camelcase": "6", - "decamelize": "1.2.0", - "js-tiktoken": "^1.0.12", - "langsmith": "~0.1.30", - "ml-distance": "^4.0.0", - "mustache": "^4.2.0", - "p-queue": "^6.6.2", - "p-retry": "4", - "uuid": "^10.0.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@langchain/google-genai": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@langchain/google-genai/-/google-genai-0.0.21.tgz", - "integrity": "sha512-WC+0BMIeYx6p4V3tjJc/FADU/uOGXTYcAn7KjCjFO+uc0vg74Lul4T84/VLB1oCUZcj/bF6WeQazRkqPoXUo7A==", + "node_modules/@jest/console/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": { - "@google/generative-ai": "^0.7.0", - "@langchain/core": ">=0.2.9 <0.3.0", - "zod-to-json-schema": "^3.22.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@langchain/mistralai": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@langchain/mistralai/-/mistralai-0.0.25.tgz", - "integrity": "sha512-NeQCim5J9Msye25rqh1x1qFXAGhXsCsjpP1p1LX6RxeuzVTeqet0O5D8fwP7ftfcjdg8k5VZCWrDs4OhGRB2PQ==", - "dependencies": { - "@langchain/core": ">=0.2.5 <0.3.0", - "@mistralai/mistralai": "^0.4.0", - "uuid": "^9.0.0", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.4" - }, + "node_modules/@jest/console/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": ">=18" + "node": ">=8" } }, - "node_modules/@langchain/mistralai/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/@langchain/openai": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.1.3.tgz", - "integrity": "sha512-riv/JC9x2A8b7GcHu8sx+mlZJ8KAwSSi231IPTlcciYnKozmrQ5H0vrtiD31fxiDbaRsk7tyCpkSBIOQEo7CyQ==", + "node_modules/@jest/console/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": { - "@langchain/core": ">=0.2.5 <0.3.0", - "js-tiktoken": "^1.0.12", - "openai": "^4.49.1", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.22.3" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/@langchain/textsplitters": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-0.0.3.tgz", - "integrity": "sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA==", + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, "dependencies": { - "@langchain/core": ">0.2.0 <0.3.0", - "js-tiktoken": "^1.0.12" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=18" - } - }, - "node_modules/@mistralai/mistralai": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-0.4.0.tgz", - "integrity": "sha512-KmFzNro1RKxIFh19J3osmUQhucefBBauMXN5fa9doG6dT9OHR/moBvvn+riVlR7c0AVfuxO8Dfa03AyLYYzbyg==", - "dependencies": { - "node-fetch": "^2.6.7" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@jest/core/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, - "optional": true, "engines": { - "node": ">=14" + "node": ">=8" } }, - "node_modules/@rollup/plugin-babel": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", - "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==", + "node_modules/@jest/core/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==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@rollup/pluginutils": "^5.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + "node": ">=8" }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - }, - "rollup": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@rollup/plugin-commonjs": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz", - "integrity": "sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==", + "node_modules/@jest/core/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": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^10.4.1", - "is-reference": "1.2.1", - "magic-string": "^0.30.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=16.0.0 || 14 >= 14.17" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "node_modules/@jest/core/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, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "node_modules/@jest/core/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": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.19.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.38.tgz", - "integrity": "sha512-SApYXUF7si4JJ+lO2o6X60OPOnA6wPpbiB09GMCkQ+JAwpa9hxUVG8p7GzA08TKQn5OhzK57rj1wFj+185YsGg==", + "node_modules/@jest/core/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": { - "undici-types": "~5.26.4" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "form-data": "^4.0.0" + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "optional": true, - "peer": true - }, - "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "optional": true, - "peer": true, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, - "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/@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==" - }, - "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/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, "dependencies": { - "event-target-shim": "^5.0.0" + "jest-get-type": "^29.6.3" }, "engines": { - "node": ">=6.5" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=0.4.0" + "node": "^14.15.0 || ^16.10.0 || >=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==", + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "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" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">= 8.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/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": ">=8" + } + }, + "node_modules/@jest/reporters/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/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/@jest/reporters/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/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/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/@jest/reporters/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/reporters/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": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@jest/reporters/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": ">=8" + } + }, + "node_modules/@jest/reporters/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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/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/@jest/transform/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/@jest/transform/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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/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/@jest/types/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/@jest/types/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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@langchain/anthropic": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-0.2.3.tgz", + "integrity": "sha512-f2fqzLGcvsXXUyZ1vl8cgwkKDGLshOGrPuR9hkhGuBG5m91eq755OqPBxWJuS1TFtNU813cXft3xh0MQbxavwg==", + "dependencies": { + "@anthropic-ai/sdk": "^0.22.0", + "@langchain/core": ">=0.2.9 <0.3.0", + "fast-xml-parser": "^4.3.5", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/core": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.2.14.tgz", + "integrity": "sha512-e+dB2Sra+5sY4fPCXrZh4w1fLR68yfX2XSWS97DzHpeJRRnMGbOzjaaks6gy3wPyWhfS1WGLisJCMfCmFvH9fw==", + "dependencies": { + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": "~0.1.30", + "ml-distance": "^4.0.0", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^10.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/google-genai": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@langchain/google-genai/-/google-genai-0.0.21.tgz", + "integrity": "sha512-WC+0BMIeYx6p4V3tjJc/FADU/uOGXTYcAn7KjCjFO+uc0vg74Lul4T84/VLB1oCUZcj/bF6WeQazRkqPoXUo7A==", + "dependencies": { + "@google/generative-ai": "^0.7.0", + "@langchain/core": ">=0.2.9 <0.3.0", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/mistralai": { + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@langchain/mistralai/-/mistralai-0.0.25.tgz", + "integrity": "sha512-NeQCim5J9Msye25rqh1x1qFXAGhXsCsjpP1p1LX6RxeuzVTeqet0O5D8fwP7ftfcjdg8k5VZCWrDs4OhGRB2PQ==", + "dependencies": { + "@langchain/core": ">=0.2.5 <0.3.0", + "@mistralai/mistralai": "^0.4.0", + "uuid": "^9.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/mistralai/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/@langchain/openai": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-0.1.3.tgz", + "integrity": "sha512-riv/JC9x2A8b7GcHu8sx+mlZJ8KAwSSi231IPTlcciYnKozmrQ5H0vrtiD31fxiDbaRsk7tyCpkSBIOQEo7CyQ==", + "dependencies": { + "@langchain/core": ">=0.2.5 <0.3.0", + "js-tiktoken": "^1.0.12", + "openai": "^4.49.1", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/textsplitters": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@langchain/textsplitters/-/textsplitters-0.0.3.tgz", + "integrity": "sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA==", + "dependencies": { + "@langchain/core": ">0.2.0 <0.3.0", + "js-tiktoken": "^1.0.12" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mistralai/mistralai": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@mistralai/mistralai/-/mistralai-0.4.0.tgz", + "integrity": "sha512-KmFzNro1RKxIFh19J3osmUQhucefBBauMXN5fa9doG6dT9OHR/moBvvn+riVlR7c0AVfuxO8Dfa03AyLYYzbyg==", + "dependencies": { + "node-fetch": "^2.6.7" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", + "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz", + "integrity": "sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^10.4.1", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz", + "integrity": "sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "18.19.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.38.tgz", + "integrity": "sha512-SApYXUF7si4JJ+lO2o6X60OPOnA6wPpbiB09GMCkQ+JAwpa9hxUVG8p7GzA08TKQn5OhzK57rj1wFj+185YsGg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "optional": true, + "peer": true + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "optional": true, + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "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/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.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/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": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "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/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/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/babel-jest/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/babel-jest/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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.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/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/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/binary-search": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", + "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" + }, + "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/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.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "dev": true, + "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.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001636", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", + "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "dev": true, + "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": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "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": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/core-js": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/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/create-jest/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/create-jest/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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "optional": true, + "peer": true + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": 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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "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/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "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/electron-to-chromium": { + "version": "1.4.808", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.808.tgz", + "integrity": "sha512-0ItWyhPYnww2VOuCGF4s1LTfbrdAV2ajy/TN+ZTuhR23AHI6rWHCrBXJ/uxoXOvRRqw8qjYVrG81HFI7x/2wdQ==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/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": ">=8" + } + }, + "node_modules/enquirer/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": ">=8" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/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": ">=8" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/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/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/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": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/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": ">=8" + } + }, + "node_modules/eslint/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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/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/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/esrecurse/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/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "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": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true + }, + "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-xml-parser": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", + "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fetch-mock": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-10.0.7.tgz", + "integrity": "sha512-TFG42kMRJ6dZpUDeVTdXNjh5O4TchHU/UNk41a050TwKzRr5RJQbtckXDjXiQFHPKgXGUG5l2TY3ZZ2gokiXaQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "glob-to-regexp": "^0.4.0", + "is-subset": "^0.1.1", + "lodash.isequal": "^4.5.0", + "path-to-regexp": "^2.2.1", + "querystring": "^0.2.1" + }, + "engines": { + "node": ">=4.0.0" + }, + "funding": { + "type": "charity", + "url": "https://www.justgiving.com/refugee-support-europe" + }, + "peerDependenciesMeta": { + "node-fetch": { + "optional": true + } + } + }, + "node_modules/fetch-mock-jest": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/fetch-mock-jest/-/fetch-mock-jest-1.5.1.tgz", + "integrity": "sha512-+utwzP8C+Pax1GSka3nFXILWMY3Er2L+s090FOgqVNrNCPp0fDqgXnAHAJf12PLHi0z4PhcTaZNTz8e7K3fjqQ==", + "dev": true, + "dependencies": { + "fetch-mock": "^9.11.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "charity", + "url": "https://www.justgiving.com/refugee-support-europe" + }, + "peerDependencies": { + "node-fetch": "*" + }, + "peerDependenciesMeta": { + "node-fetch": { + "optional": true + } + } + }, + "node_modules/fetch-mock-jest/node_modules/fetch-mock": { + "version": "9.11.0", + "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-9.11.0.tgz", + "integrity": "sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.0.0", + "@babel/runtime": "^7.0.0", + "core-js": "^3.0.0", + "debug": "^4.1.1", + "glob-to-regexp": "^0.4.0", + "is-subset": "^0.1.1", + "lodash.isequal": "^4.5.0", + "path-to-regexp": "^2.2.1", + "querystring": "^0.2.0", + "whatwg-url": "^6.5.0" + }, + "engines": { + "node": ">=4.0.0" + }, + "funding": { + "type": "charity", + "url": "https://www.justgiving.com/refugee-support-europe" + }, + "peerDependencies": { + "node-fetch": "*" + }, + "peerDependenciesMeta": { + "node-fetch": { + "optional": true + } + } + }, + "node_modules/fetch-mock-jest/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/fetch-mock-jest/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/fetch-mock-jest/node_modules/whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.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==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "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": ">= 12.20" + } + }, + "node_modules/formdata-node/node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": 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, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.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==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "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": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "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": { + "ms": "^2.0.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "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, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "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": ">=6" + "node": ">=0.8.19" } }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-any-array": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz", + "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, "engines": { - "node": ">=12" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "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/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "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, "engines": { "node": ">=8" } }, - "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/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "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==", "dev": true, - "bin": { - "atob": "bin/atob.js" + "dependencies": { + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 4.5.0" + "node": ">=0.10.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==", + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "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/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/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "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==", + "dev": true, "engines": { "node": ">=8" }, @@ -1035,511 +4048,749 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/binary-search": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", - "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" + "node_modules/is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", + "dev": true }, - "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/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/istanbul-lib-report/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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "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" - } - ], - "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" }, "bin": { - "browserslist": "cli.js" + "jest": "bin/jest.js" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/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==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/jest-circus/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/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "node_modules/jest-circus/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, - "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" - } - ], - "peer": true + "engines": { + "node": ">=8" + } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/jest-circus/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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/chalk/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/jest-cli/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==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/jest-cli/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/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/jest-cli/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": ">=0.8.0" + "node": ">=8" } }, - "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/jest-cli/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": { - "color-name": "~1.1.4" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "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==", - "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/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "node_modules/jest-config/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=14" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "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/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "node_modules/jest-config/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, - "peer": true + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/jest-config/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": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "optional": true, - "peer": true - }, - "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { - "ms": "2.1.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=6.0" + "node": "*" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": 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==", + "node_modules/jest-config/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": ">=0.10.0" + "node": ">=8" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "node_modules/jest-config/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": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=0.10" + "node": "*" } }, - "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/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/jest-config/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" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, "engines": { - "node": ">=0.4.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/jest-diff/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==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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/electron-to-chromium": { - "version": "1.4.808", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.808.tgz", - "integrity": "sha512-0ItWyhPYnww2VOuCGF4s1LTfbrdAV2ajy/TN+ZTuhR23AHI6rWHCrBXJ/uxoXOvRRqw8qjYVrG81HFI7x/2wdQ==", - "dev": true, - "peer": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "node_modules/jest-diff/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-colors": "^4.1.1", - "strip-ansi": "^6.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/enquirer/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/jest-diff/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/enquirer/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/jest-diff/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": { - "ansi-regex": "^5.0.1" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, - "peer": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "node_modules/jest-each/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": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "bin": { - "eslint": "bin/eslint.js" + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/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": "^10.12.0 || >=12.0.0" + "node": ">=8" + } + }, + "node_modules/jest-each/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" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": ">=8" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=8.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/jest-haste-map/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": ">=4" + "node": ">=8" } }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { - "@babel/highlight": "^7.10.4" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/eslint/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/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/eslint/node_modules/ansi-styles": { + "node_modules/jest-matcher-utils/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==", @@ -1554,26 +4805,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/chalk": { + "node_modules/jest-matcher-utils/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -1589,22 +4821,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { + "node_modules/jest-matcher-utils/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==", @@ -1613,65 +4830,79 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "node_modules/jest-matcher-utils/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" + }, "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/eslint/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/jest-message-util/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==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "color-convert": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "node_modules/jest-message-util/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, - "bin": { - "semver": "bin/semver.js" + "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/eslint/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/jest-message-util/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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } }, - "node_modules/eslint/node_modules/supports-color": { + "node_modules/jest-message-util/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==", @@ -1683,531 +4914,685 @@ "node": ">=8" } }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "bin": { - "acorn": "bin/acorn" + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/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/jest-resolve/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, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "node_modules/jest-resolve/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": { - "estraverse": "^5.1.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, - "node_modules/esquery/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/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "estraverse": "^5.2.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/esrecurse/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/jest-runner/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": ">=4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/jest-runner/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": ">=4.0" + "node": ">=8" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "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/jest-runner/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "node_modules/jest-runner/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "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==", - "dev": true - }, - "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-xml-parser": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz", - "integrity": "sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/jest-runner/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": { - "flat-cache": "^3.0.4" + "has-flag": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.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==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "node_modules/jest-runtime/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==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/jest-runtime/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": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "balanced-match": "^1.0.0", + "concat-map": "0.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/jest-runtime/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": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 12.20" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/formdata-node/node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">= 14" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": 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, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "node_modules/jest-runtime/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.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=8" } }, - "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==", + "node_modules/jest-runtime/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, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/jest-runtime/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, - "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "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" + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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/jest-snapshot/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": { - "is-glob": "^4.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/jest-snapshot/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": ">=4" + "node": ">=8" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/jest-snapshot/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": { - "function-bind": "^1.1.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "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/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, "dependencies": { - "ms": "^2.0.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "optional": true, - "peer": true, + "node_modules/jest-util/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">= 4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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/jest-util/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": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/jest-util/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": ">=0.8.19" + "node": ">=8" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/jest-util/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": { - "once": "^1.3.0", - "wrappy": "1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-any-array": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz", - "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==" + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "node_modules/jest-validate/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==", "dev": true, "dependencies": { - "builtin-modules": "^3.3.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "node_modules/jest-validate/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": { - "hasown": "^2.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=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/jest-validate/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": ">=0.10.0" + "node": ">=8" } }, - "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/jest-validate/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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/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==", "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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/jest-watcher/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": { - "is-extglob": "^2.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "node_modules/jest-watcher/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, - "dependencies": { - "@types/estree": "*" + "engines": { + "node": ">=8" } }, - "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.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "node_modules/jest-watcher/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": { - "@isaacs/cliui": "^8.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "node": ">=8" } }, "node_modules/jest-worker": { @@ -2287,6 +5672,12 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2304,7 +5695,6 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "peer": true, "bin": { "json5": "lib/cli.js" }, @@ -2329,6 +5719,15 @@ "json-buffer": "3.0.1" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/langchain": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/langchain/-/langchain-0.2.5.tgz", @@ -2615,6 +6014,15 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2628,12 +6036,42 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true + }, "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/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -2670,12 +6108,61 @@ "@jridgewell/sourcemap-codec": "^1.4.15" } }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, "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/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2695,6 +6182,15 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/minimatch": { "version": "9.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", @@ -2815,12 +6311,38 @@ } } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "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, - "peer": true + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/num-sort": { "version": "2.1.0", @@ -2842,6 +6364,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/openai": { "version": "4.52.0", "resolved": "https://registry.npmjs.org/openai/-/openai-4.52.0.tgz", @@ -2890,6 +6427,48 @@ "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==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-queue": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", @@ -2928,6 +6507,15 @@ "node": ">=8" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", @@ -2946,6 +6534,33 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2986,6 +6601,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-to-regexp": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", + "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", @@ -3004,6 +6625,27 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3028,6 +6670,20 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -3037,13 +6693,52 @@ "node": ">=0.4.0" } }, - "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/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, "engines": { - "node": ">=6" + "node": ">=0.4.x" } }, "node_modules/randombytes": { @@ -3080,6 +6775,18 @@ "react": "^18.3.1" } }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "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==", + "dev": true + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -3092,6 +6799,15 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -3118,6 +6834,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3127,6 +6864,15 @@ "node": ">=4" } }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -3320,7 +7066,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -3367,6 +7112,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "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/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -3435,6 +7195,61 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/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": ">=8" + } + }, + "node_modules/string-length/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": ">=8" + } + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -3531,6 +7346,24 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3675,12 +7508,75 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/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/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/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": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "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/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -3690,6 +7586,18 @@ "node": ">=4" } }, + "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" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -3707,6 +7615,15 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -3743,7 +7660,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" @@ -3790,6 +7706,29 @@ "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", "dev": true }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -3945,12 +7884,39 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/yaml": { "version": "2.4.5", @@ -3963,6 +7929,86 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "3.23.8", "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", diff --git a/package.json b/package.json index 00957b9..dbd57ff 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,12 @@ "unpkg": "dist/bundle.umd.js", "scripts": { "build": "rollup -c", + "build:test": "TEST_ENV=mocked-llm-apis rollup -c", "dev": "NODE_ENV=development rollup -c -w", - "test": "node test/test.js", - "pretest": "npm run build", + "test": "npm run build:test && jest", + "test:watch": "jest --watch", + "test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand --verbose", + "test:prod": "npm run build && jest", "play-react": "cd playground/react && npm run dev", "play-node": "cd playground/nodejs && node index.js" }, @@ -53,7 +56,12 @@ "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^5.0.7", + "dotenv": "^16.4.5", "eslint": "^7.32.0", + "fetch-mock": "^10.0.7", + "fetch-mock-jest": "^1.5.1", + "jest": "^29.7.0", "prettier": "^2.3.2", "rollup-plugin-peer-deps-external": "^2.2.4", "rollup-plugin-sourcemaps": "^0.6.3", diff --git a/playground/nodejs/index.js b/playground/nodejs/index.js index 44804bf..e57bb6d 100644 --- a/playground/nodejs/index.js +++ b/playground/nodejs/index.js @@ -25,12 +25,9 @@ const profileAnalyst = new Agent({ background: 'Data Processor', tools: [], // Tools are omitted for now llmConfig: { - provider: "anthropic", // or "openai" - model: "claude-3-5-sonnet-20240620", - temperature: 0.9, - maxTokens: 1024, - anthropicApiUrl: "https://www.agenticjs.com/proxy/anthropic", - } + provider: "google", + model: "gemini-1.5-flash", + } }); const formatter = new Agent({ @@ -40,12 +37,9 @@ const formatter = new Agent({ background: 'Document Formatter', tools: [], llmConfig: { - provider: "anthropic", // or "openai" - model: "claude-3-5-sonnet-20240620", - temperature: 0.9, - maxTokens: 1024, - anthropicApiUrl: "https://www.agenticjs.com/proxy/anthropic", - } + provider: "google", + model: "gemini-1.5-flash", + } }); const reviewer = new Agent({ @@ -55,12 +49,9 @@ const reviewer = new Agent({ background: 'Quality Assurance Specialist', tools: [], llmConfig: { - provider: "anthropic", // or "openai" - model: "claude-3-5-sonnet-20240620", - temperature: 0.9, - maxTokens: 1024, - anthropicApiUrl: "https://www.agenticjs.com/proxy/anthropic", - } + provider: "google", + model: "gemini-1.5-flash", + } }); // ──── Tasks ───────────────────────────────────────────── diff --git a/playground/react/src/App.jsx b/playground/react/src/App.jsx index cf91de9..9d644ee 100644 --- a/playground/react/src/App.jsx +++ b/playground/react/src/App.jsx @@ -1,5 +1,5 @@ import AgentsBoardDebugger from './AgentsBoardDebugger'; -import team from './teams/mistral/productSpecsTeam'; +import team from './teams/openai/productSpecsTeam'; function App() { return ( diff --git a/rollup.config.js b/rollup.config.js index 98297ab..f9e5a1b 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,4 +1,5 @@ import resolve from '@rollup/plugin-node-resolve'; +import replace from '@rollup/plugin-replace'; import commonjs from '@rollup/plugin-commonjs'; import babel from '@rollup/plugin-babel'; import { terser } from 'rollup-plugin-terser'; @@ -7,6 +8,7 @@ import peerDepsExternal from 'rollup-plugin-peer-deps-external'; // Determine if we are in development mode based on the NODE_ENV environment variable const isDevelopment = process.env.NODE_ENV === 'development'; +const isTest = process.env.TEST_ENV === 'mocked-llm-apis'; export default { input: 'src/index.js', @@ -38,11 +40,12 @@ export default { preferBuiltins: false, // Ensure Node.js built-ins are used mainFields: ['browser', 'module', 'main'] }), - // resolve({ - // browser: true, - // preferBuiltins: false - // }), commonjs(), + // Include the replace plugin only if isTest is true + ...(isTest ? [replace({ + 'shims.fetch': `(...args) => { return global.fetch(...args); };\n`, // Include newline + preventAssignment: true + })] : []), babel({ babelHelpers: 'bundled', exclude: 'node_modules/**' diff --git a/src/agents.js b/src/agents.js index 196b08b..80acf35 100644 --- a/src/agents.js +++ b/src/agents.js @@ -136,7 +136,13 @@ class BasicChatAgent extends BaseAgent { new HumanMessage(humanMessage), ]; const parser = new StringOutputParser(); - const response = await this.llmInstance.invoke(messages); + try { + const response = await this.llmInstance.invoke(messages); + return parser.invoke(response); + } catch (error) { + console.error("Error invoking LLM instance:", error); + // Handle the error appropriately + } return parser.invoke(response); } } diff --git a/src/api.js b/src/api.js index 0f1611c..19f7ced 100644 --- a/src/api.js +++ b/src/api.js @@ -84,7 +84,7 @@ class Team { this.store = createTeamStore({ name, agents, tasks, inputs, env, verbose}); } - async start(inputs = {}) { + async start(inputs = null) { await this.store.getState().start(inputs); return this.store.getState().workflowResult; } diff --git a/tests/e2e/examples/teams/google/productSpecsTeam.js b/tests/e2e/examples/teams/google/productSpecsTeam.js new file mode 100644 index 0000000..1ec8f02 --- /dev/null +++ b/tests/e2e/examples/teams/google/productSpecsTeam.js @@ -0,0 +1,69 @@ +const { Agent, Task, Team } = require('agenticjs'); + +// Define agents +const requirementsAnalyst = new Agent({ + name: 'Emma', + role: 'Requirements Analyst', + goal: 'Outline core functionalities and objectives for new features based on the founder’s input.', + background: 'Business Analysis', + tools: [], + llmConfig: { + provider: "google", + model: "gemini-1.5-flash", + } + +}); + +const technicalWriter = new Agent({ + name: 'Lucas', + role: 'Technical Writer', + goal: 'Convert functional outlines into detailed technical specifications.', + background: 'Technical Writing', + tools: [], + llmConfig: { + provider: "google", + model: "gemini-1.5-flash", + } +}); + +const validator = new Agent({ + name: 'Mia', + role: 'Validator', + goal: 'Ensure the specifications are accurate and complete.', + background: 'Quality Assurance', + tools: [], + llmConfig: { + provider: "google", + model: "gemini-1.5-flash", + } +}); + +// Define tasks +const analysisTask = new Task({ + description: `Analyze the founder's idea: {founderIdea} and outline the necessary functionalities to implement it.`, + expectedOutput: 'A functional outline of the Founder Idea', + agent: requirementsAnalyst +}); + +const writingTask = new Task({ + description: `Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria.`, + expectedOutput: 'A detailed technical specifications document.', + isDeliverable: true, + agent: technicalWriter +}); + +const validationTask = new Task({ + description: `Review the technical specifications to ensure they match the founder's vision and that are technically feasible.`, + expectedOutput: 'A validated technical specifications document ready for development. Must be in Markdown format.', + agent: validator +}); + +// Create a team +const team = new Team({ + name: 'Product Specs Team', + agents: [requirementsAnalyst, technicalWriter, validator], + tasks: [analysisTask, writingTask, validationTask], + inputs: { founderIdea: 'I want to add a Referral program to our SAAS platform.' }, // Initial input for the first task +}); + +module.exports = team; \ No newline at end of file diff --git a/tests/e2e/examples/teams/openai/productSpecsTeam.js b/tests/e2e/examples/teams/openai/productSpecsTeam.js new file mode 100644 index 0000000..8bf89fc --- /dev/null +++ b/tests/e2e/examples/teams/openai/productSpecsTeam.js @@ -0,0 +1,56 @@ +const { Agent, Task, Team } = require('agenticjs'); + +// Define agents +const requirementsAnalyst = new Agent({ + name: 'Emma', + role: 'Requirements Analyst', + goal: 'Outline core functionalities and objectives for new features based on the founder’s input.', + background: 'Business Analysis', + tools: [] +}); + +const technicalWriter = new Agent({ + name: 'Lucas', + role: 'Technical Writer', + goal: 'Convert functional outlines into detailed technical specifications.', + background: 'Technical Writing', + tools: [] +}); + +const validator = new Agent({ + name: 'Mia', + role: 'Validator', + goal: 'Ensure the specifications are accurate and complete.', + background: 'Quality Assurance', + tools: [] +}); + +// Define tasks +const analysisTask = new Task({ + description: `Analyze the founder's idea: {founderIdea} and outline the necessary functionalities to implement it.`, + expectedOutput: 'A functional outline of the Founder Idea', + agent: requirementsAnalyst +}); + +const writingTask = new Task({ + description: `Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria.`, + expectedOutput: 'A detailed technical specifications document.', + isDeliverable: true, + agent: technicalWriter +}); + +const validationTask = new Task({ + description: `Review the technical specifications to ensure they match the founder's vision and that are technically feasible.`, + expectedOutput: 'A validated technical specifications document ready for development. Must be in Markdown format.', + agent: validator +}); + +// Create a team +const team = new Team({ + name: 'Product Specs Team', + agents: [requirementsAnalyst, technicalWriter, validator], + tasks: [analysisTask, writingTask, validationTask], + inputs: { founderIdea: 'I want to add a Referral program to our SAAS platform.' }, // Initial input for the first task +}); + +module.exports = team; \ No newline at end of file diff --git a/tests/e2e/examples/teams/openai/productSpecsTeam.requests.js b/tests/e2e/examples/teams/openai/productSpecsTeam.requests.js new file mode 100644 index 0000000..89e02ba --- /dev/null +++ b/tests/e2e/examples/teams/openai/productSpecsTeam.requests.js @@ -0,0 +1,142 @@ +const recordedRequests = [ + { + "url": "https://api.openai.com/v1/chat/completions", + "method": "POST", + "body": { + "model": "gpt-3.5-turbo-0125", + "temperature": 1, + "top_p": 1, + "frequency_penalty": 0, + "presence_penalty": 0, + "n": 1, + "stream": false, + "messages": [ + { + "role": "system", + "content": "\n Hello, You are Emma.\n Your role is: Requirements Analyst.\n Your background is: Business Analysis.\n Your main goal is: Outline core functionalities and objectives for new features based on the founder’s input..\n Tools available for your use: No specific tools assigned.\n Task description: Analyze the founder's idea: {founderIdea} and outline the necessary functionalities to implement it.\n " + }, + { + "role": "user", + "content": "\n Hi Emma, please complete the following task: Analyze the founder's idea: {founderIdea} and outline the necessary functionalities to implement it..\n Your expected output should be: \"A functional outline of the Founder Idea\".\n This is the first task, so there's no input from a previous task.\n " + } + ] + }, + "response": { + "id": "chatcmpl-9lPSD47SyJQtuAuvzStRaM8lk6qPW", + "object": "chat.completion", + "created": 1721086289, + "model": "gpt-3.5-turbo-0125", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "Based on the founder's idea: {founderIdea}, here is the functional outline:\n\n1. User Registration and Account Creation:\n - Allow users to register for an account.\n - Collect necessary information for account creation.\n - Implement email verification for account security.\n\n2. Create and Post Content:\n - Provide users with the ability to create and post content.\n - Include options for text, images, and possibly videos.\n - Implement a user-friendly editor for content creation.\n\n3. Interactions and Engagement:\n - Allow users to like, comment, and share posts.\n - Implement a notification system for user interactions.\n - Include features for following other users and receiving updates.\n\n4. Explore and Discover:\n - Provide a platform for users to explore and discover new content.\n - Implement search and filtering functionalities for content discovery.\n - Include trending and recommended content sections.\n\n5. User Profiles and Settings:\n - Allow users to customize their profiles.\n - Include settings for privacy, notifications, and account management.\n - Display user activity and interactions on their profiles.\n\n6. Reporting and Moderation:\n - Implement reporting functionalities for inappropriate content.\n - Provide moderation tools for managing user-generated content.\n - Ensure a safe and respectful environment for users.\n\n7. Analytics and Insights:\n - Include analytics for tracking user engagement and content performance.\n - Provide insights for users to understand their audience and reach.\n - Implement data-driven improvements based on user behavior.\n\nThis functional outline captures the core functionalities needed to implement the founder's idea effectively." + }, + "logprobs": null, + "finish_reason": "stop" + } + ], + "usage": { + "prompt_tokens": 162, + "completion_tokens": 317, + "total_tokens": 479 + }, + "system_fingerprint": null + } + }, + { + "url": "https://api.openai.com/v1/chat/completions", + "method": "POST", + "body": { + "model": "gpt-3.5-turbo-0125", + "temperature": 1, + "top_p": 1, + "frequency_penalty": 0, + "presence_penalty": 0, + "n": 1, + "stream": false, + "messages": [ + { + "role": "system", + "content": "\n Hello, You are Lucas.\n Your role is: Technical Writer.\n Your background is: Technical Writing.\n Your main goal is: Convert functional outlines into detailed technical specifications..\n Tools available for your use: No specific tools assigned.\n Task description: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria.\n " + }, + { + "role": "user", + "content": "\n Hi Lucas, please complete the following task: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria..\n Your expected output should be: \"A detailed technical specifications document.\".\n Incorporate the following findings and insights from previous tasks: \"Based on the founder's idea: {founderIdea}, here is the functional outline:\n\n1. User Registration and Account Creation:\n - Allow users to register for an account.\n - Collect necessary information for account creation.\n - Implement email verification for account security.\n\n2. Create and Post Content:\n - Provide users with the ability to create and post content.\n - Include options for text, images, and possibly videos.\n - Implement a user-friendly editor for content creation.\n\n3. Interactions and Engagement:\n - Allow users to like, comment, and share posts.\n - Implement a notification system for user interactions.\n - Include features for following other users and receiving updates.\n\n4. Explore and Discover:\n - Provide a platform for users to explore and discover new content.\n - Implement search and filtering functionalities for content discovery.\n - Include trending and recommended content sections.\n\n5. User Profiles and Settings:\n - Allow users to customize their profiles.\n - Include settings for privacy, notifications, and account management.\n - Display user activity and interactions on their profiles.\n\n6. Reporting and Moderation:\n - Implement reporting functionalities for inappropriate content.\n - Provide moderation tools for managing user-generated content.\n - Ensure a safe and respectful environment for users.\n\n7. Analytics and Insights:\n - Include analytics for tracking user engagement and content performance.\n - Provide insights for users to understand their audience and reach.\n - Implement data-driven improvements based on user behavior.\n\nThis functional outline captures the core functionalities needed to implement the founder's idea effectively.\"\n " + } + ] + }, + "response": { + "id": "chatcmpl-9lPSHNFUAHBCtYMCnQErpUsWXHAAU", + "object": "chat.completion", + "created": 1721086293, + "model": "gpt-3.5-turbo-0125", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "# Detailed Technical Specifications Document\n\n## User Stories:\n1. As a new user, I want to register for an account to access the platform.\n2. As a user, I want to create and post various types of content, including text, images, and possibly videos.\n3. As a user, I want to interact with other users by liking, commenting, and sharing posts.\n4. As a user, I want to explore and discover new content easily through search and filtering functionalities.\n5. As a user, I want to customize my profile, manage settings, and view my activity and interactions.\n6. As a user, I want to report inappropriate content and have moderation tools available.\n7. As a user, I want access to analytics to track user engagement and understand content performance.\n\n## System Requirements:\n\n### User Registration and Account Creation:\n- Users should be able to register using a valid email address and password.\n- The system must collect necessary information for account creation, including username, date of birth, etc.\n- Email verification must be implemented to ensure account security.\n\n### Create and Post Content:\n- Users should have access to a user-friendly editor for creating and posting content.\n- The platform must support different content types such as text, images, and videos.\n- Content creation should be seamless and intuitive for users.\n\n### Interactions and Engagement:\n- Users should be able to like, comment, and share posts easily.\n- A notification system must be in place to alert users of interactions.\n- Features for following other users and receiving updates should be included.\n\n### Explore and Discover:\n- The platform should provide search and filtering functionalities for users to discover new content.\n- Trending and recommended content sections should be available for users to explore.\n- Content discovery should be an engaging experience for users.\n\n### User Profiles and Settings:\n- Users should be able to customize their profiles with personal information and preferences.\n- Settings for privacy, notifications, and account management must be accessible.\n- User activity and interactions should be displayed on user profiles for easy tracking.\n\n### Reporting and Moderation:\n- Reporting functionalities must be implemented for users to flag inappropriate content.\n- Moderation tools should be available for managing user-generated content effectively.\n- The platform must ensure a safe and respectful environment for all users.\n\n### Analytics and Insights:\n- The system should include analytics for tracking user engagement and content performance.\n- Insights should be provided to users to help them understand their audience and reach.\n- Data-driven improvements based on user behavior should be implemented to enhance the platform.\n\n## Acceptance Criteria:\n- Users should be able to successfully register and verify their accounts.\n- Content creation should support text, images, and videos without any issues.\n- Interactions like liking, commenting, and sharing should function smoothly.\n- Search and filtering functionalities should accurately display relevant content.\n- User profiles must showcase personal information and activity effectively.\n- Reporting inappropriate content and moderation actions should be resolved efficiently.\n- Analytics should provide valuable insights into user engagement and content performance.\n\nThis detailed technical specifications document outlines the user stories, system requirements, and acceptance criteria based on the functional outline provided by the founder's idea." + }, + "logprobs": null, + "finish_reason": "stop" + } + ], + "usage": { + "prompt_tokens": 467, + "completion_tokens": 631, + "total_tokens": 1098 + }, + "system_fingerprint": null + } + }, + { + "url": "https://api.openai.com/v1/chat/completions", + "method": "POST", + "body": { + "model": "gpt-3.5-turbo-0125", + "temperature": 1, + "top_p": 1, + "frequency_penalty": 0, + "presence_penalty": 0, + "n": 1, + "stream": false, + "messages": [ + { + "role": "system", + "content": "\n Hello, You are Mia.\n Your role is: Validator.\n Your background is: Quality Assurance.\n Your main goal is: Ensure the specifications are accurate and complete..\n Tools available for your use: No specific tools assigned.\n Task description: Review the technical specifications to ensure they match the founder's vision and that are technically feasible.\n " + }, + { + "role": "user", + "content": "\n Hi Mia, please complete the following task: Review the technical specifications to ensure they match the founder's vision and that are technically feasible..\n Your expected output should be: \"A validated technical specifications document ready for development. Must be in Markdown format.\".\n Incorporate the following findings and insights from previous tasks: \"# Detailed Technical Specifications Document\n\n## User Stories:\n1. As a new user, I want to register for an account to access the platform.\n2. As a user, I want to create and post various types of content, including text, images, and possibly videos.\n3. As a user, I want to interact with other users by liking, commenting, and sharing posts.\n4. As a user, I want to explore and discover new content easily through search and filtering functionalities.\n5. As a user, I want to customize my profile, manage settings, and view my activity and interactions.\n6. As a user, I want to report inappropriate content and have moderation tools available.\n7. As a user, I want access to analytics to track user engagement and understand content performance.\n\n## System Requirements:\n\n### User Registration and Account Creation:\n- Users should be able to register using a valid email address and password.\n- The system must collect necessary information for account creation, including username, date of birth, etc.\n- Email verification must be implemented to ensure account security.\n\n### Create and Post Content:\n- Users should have access to a user-friendly editor for creating and posting content.\n- The platform must support different content types such as text, images, and videos.\n- Content creation should be seamless and intuitive for users.\n\n### Interactions and Engagement:\n- Users should be able to like, comment, and share posts easily.\n- A notification system must be in place to alert users of interactions.\n- Features for following other users and receiving updates should be included.\n\n### Explore and Discover:\n- The platform should provide search and filtering functionalities for users to discover new content.\n- Trending and recommended content sections should be available for users to explore.\n- Content discovery should be an engaging experience for users.\n\n### User Profiles and Settings:\n- Users should be able to customize their profiles with personal information and preferences.\n- Settings for privacy, notifications, and account management must be accessible.\n- User activity and interactions should be displayed on user profiles for easy tracking.\n\n### Reporting and Moderation:\n- Reporting functionalities must be implemented for users to flag inappropriate content.\n- Moderation tools should be available for managing user-generated content effectively.\n- The platform must ensure a safe and respectful environment for all users.\n\n### Analytics and Insights:\n- The system should include analytics for tracking user engagement and content performance.\n- Insights should be provided to users to help them understand their audience and reach.\n- Data-driven improvements based on user behavior should be implemented to enhance the platform.\n\n## Acceptance Criteria:\n- Users should be able to successfully register and verify their accounts.\n- Content creation should support text, images, and videos without any issues.\n- Interactions like liking, commenting, and sharing should function smoothly.\n- Search and filtering functionalities should accurately display relevant content.\n- User profiles must showcase personal information and activity effectively.\n- Reporting inappropriate content and moderation actions should be resolved efficiently.\n- Analytics should provide valuable insights into user engagement and content performance.\n\nThis detailed technical specifications document outlines the user stories, system requirements, and acceptance criteria based on the functional outline provided by the founder's idea.\"\n " + } + ] + }, + "response": { + "id": "chatcmpl-9lPSOdWFnXs2vWZuebv2cZWmy9Kz0", + "object": "chat.completion", + "created": 1721086300, + "model": "gpt-3.5-turbo-0125", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "# Validated Technical Specifications Document\n\n## User Stories:\n1. As a new user, I want to register for an account to access the platform.\n2. As a user, I want to create and post various types of content, including text, images, and possibly videos.\n3. As a user, I want to interact with other users by liking, commenting, and sharing posts.\n4. As a user, I want to explore and discover new content easily through search and filtering functionalities.\n5. As a user, I want to customize my profile, manage settings, and view my activity and interactions.\n6. As a user, I want to report inappropriate content and have moderation tools available.\n7. As a user, I want access to analytics to track user engagement and understand content performance.\n\n## System Requirements:\n\n### User Registration and Account Creation:\n- Users can register using a valid email address and password.\n- The system collects necessary information for account creation, including username, date of birth, etc.\n- Email verification is implemented to ensure account security.\n\n### Create and Post Content:\n- Users have access to a user-friendly editor for creating and posting content.\n- The platform supports different content types such as text, images, and videos.\n- Content creation is seamless and intuitive for users.\n\n### Interactions and Engagement:\n- Users can like, comment, and share posts easily.\n- A notification system alerts users of interactions.\n- Features for following other users and receiving updates are included.\n\n### Explore and Discover:\n- The platform provides search and filtering functionalities for users to discover new content.\n- Trending and recommended content sections are available for users to explore.\n- Content discovery is engaging for users.\n\n### User Profiles and Settings:\n- Users can customize their profiles with personal information and preferences.\n- Settings for privacy, notifications, and account management are accessible.\n- User activity and interactions are displayed on user profiles for easy tracking.\n\n### Reporting and Moderation:\n- Reporting functionalities are implemented for users to flag inappropriate content.\n- Moderation tools are available for managing user-generated content effectively.\n- The platform ensures a safe and respectful environment for all users.\n\n### Analytics and Insights:\n- The system includes analytics for tracking user engagement and content performance.\n- Insights are provided to users to help them understand their audience and reach.\n- Data-driven improvements based on user behavior are implemented to enhance the platform.\n\n## Acceptance Criteria:\n- Users can successfully register and verify their accounts.\n- Content creation supports text, images, and videos without any issues.\n- Interactions like liking, commenting, and sharing function smoothly.\n- Search and filtering functionalities accurately display relevant content.\n- User profiles showcase personal information and activity effectively.\n- Reporting inappropriate content and moderation actions are resolved efficiently.\n- Analytics provide valuable insights into user engagement and content performance.\n\nThis validated technical specifications document aligns with the founder's vision and ensures technical feasibility for development." + }, + "logprobs": null, + "finish_reason": "stop" + } + ], + "usage": { + "prompt_tokens": 780, + "completion_tokens": 581, + "total_tokens": 1361 + }, + "system_fingerprint": null + } + } +] + +module.exports = recordedRequests; \ No newline at end of file diff --git a/tests/e2e/productSpecTeam.test.js b/tests/e2e/productSpecTeam.test.js new file mode 100644 index 0000000..457fe27 --- /dev/null +++ b/tests/e2e/productSpecTeam.test.js @@ -0,0 +1,85 @@ +require('dotenv').config({ path: './.env.local' }); +const openAIProducSpecsTeam = require('./examples/teams/openai/productSpecsTeam'); +const geminiAIProducSpecsTeam = require('./examples/teams/google/productSpecsTeam'); +const teamRecordedRequests = require('./examples/teams/openai/productSpecsTeam.requests'); + + + +// Setup mock +const { mock, record, restoreAll, getRecords } = require('../utils/moscaFetch')(); + + + +// Setting up recording +record({ + url: '*', + method: '*', + body: '*' // Record any POST request to this URL +}); + +// Later, after making some requests in your application +// const recordedData = getRecords(); +// console.log(recordedData); + + + + +describe('Product Spec Team Workflows', () => { + // describe('Using OpenAI Agents', () => { + // beforeEach(() => { + // // Mocking all POST requests with a callback + // mock(teamRecordedRequests); + // }); + // afterEach(() => { + // restoreAll(); + // }); + // it('completes the entire workflow successfully', async () => { + // const result = await openAIProducSpecsTeam.start(); + // console.log(result); + // expect(result).toBeDefined(); + // expect(typeof result).toBe('string'); + // const wordCount = result.trim().split(/\s+/).length; + // expect(wordCount).toBeGreaterThan(20); + // }); + // }); + + describe('Using Gemini AI Agents', () => { + beforeEach(() => { + // Mocking all POST requests with a callback + // mock(teamRecordedRequests); + }); + afterEach(() => { + // restoreAll(); + }); + it('completes the entire workflow successfully', async () => { + + debugger; + const result = await geminiAIProducSpecsTeam.start(); + console.log(result); + // const recordedData = getRecords(); + // console.log(recordedData); + expect(result).toBeDefined(); + expect(typeof result).toBe('string'); + const wordCount = result.trim().split(/\s+/).length; + expect(wordCount).toBeGreaterThan(20); + }); + }); + + // describe('Using Anthropic Agents', () => { + // it('completes the entire workflow successfully', async () => { + // // Setup for Product Spec Team with Anthropic + // // Execute workflow + // // Assertions and expectations + // expect(true).toBeDefined(); + // }); + // }); + + // describe('Using Gemini Agents', () => { + // it('completes the entire workflow successfully', async () => { + // // Setup for Product Spec Team with Gemini + // // Execute workflow + // // Assertions and expectations + // expect(true).toBeDefined(); + // }); + // }); +}); diff --git a/tests/utils/moscaFetch/Readme.md b/tests/utils/moscaFetch/Readme.md new file mode 100644 index 0000000..108fe33 --- /dev/null +++ b/tests/utils/moscaFetch/Readme.md @@ -0,0 +1,91 @@ +# MoscaFetch Utility + +## Introduction + +`moscaFetch` is a testing utility designed to simplify the process of mocking and recording HTTP requests in Node.js environments. It provides an easy-to-use API for setting up mocks and capturing actual request-response cycles for use in tests. + +## Features + +- **Mock HTTP Requests**: Simulate HTTP responses without making actual network calls. +- **Record Requests**: Capture and log HTTP requests and responses to refine tests or mock setups. +- **Callbacks**: Execute custom logic after a mocked request is handled. +- **Restore**: Cleanly revert any modifications to the global fetch, maintaining test isolation. + + +### Usage + +#### Importing + +```js +const { mock, record, restoreAll, getRecords } = require('moscaFetch'); +``` + +#### Mocking Requests + +To mock HTTP requests: + +```js +mock({ + url: 'https://api.example.com/data', + method: 'POST', + expectedBody: '*', + response: { key: 'value' }, + callback: info => console.log('Request completed', info) +}); +``` + +Or use wildcard * to mock all Request + +```js +mock({ + url: '*', + method: '*', + response: '*', + callback: info => console.log('Request completed', info) +}); +``` + +Configuration Options + +- `url`: URL to match the request (string or wildcard `*`). +- `method`: HTTP method to match (string or wildcard `*`). +- `expectedBody`: Expected body to match for incoming requests (object or wildcard `*`). +- `response`: Response to return when a request is matched. +- `callback`: Function to execute after a request is handled. + + +#### Recording Requests + +To record requests for later analysis or setup: +```js +record({ + url: '*', + method: '*', + expectedBody: '*' +}); +``` + +#### Retrieving Records + +To retrieve and log the recorded requests: + +```js +const records = getRecords(); +console.log(records); +``` + +#### Restoring Fetch + +To restore the original fetch after tests: + +```js +restoreAll(); +``` + +### Contributing + +Contributions are welcome! Please read our contributing guidelines to get started. + +### License + +moscaFetch is MIT licensed. \ No newline at end of file diff --git a/tests/utils/moscaFetch/index.js b/tests/utils/moscaFetch/index.js new file mode 100644 index 0000000..b099ed3 --- /dev/null +++ b/tests/utils/moscaFetch/index.js @@ -0,0 +1,103 @@ +function moscaFetch() { + let originalFetch = globalThis.fetch; // Save the original fetch function + let mocks = []; + let records = []; + + + function mock(mockConfigs) { + // Ensure the input is always treated as an array, even if it's a single object + const configs = Array.isArray(mockConfigs) ? mockConfigs : [mockConfigs]; + + configs.forEach(mockConfig => { + if (!mockConfig.url || !mockConfig.method || !mockConfig.response) { + throw new Error("Invalid mock configuration: Missing required properties."); + } + mockConfig.isRecorder = false; // Explicitly flag mock configurations as non-recorders + mocks.push(mockConfig); + }); + ensureFetchIsMocked(); + } + + function record(recordConfig) { + recordConfig.isRecorder = true; // Flag record configurations as recorders + mocks.push(recordConfig); + ensureFetchIsMocked(); + } + + function getRecords() { + return records; + } + + function clearRecords() { + records = []; + } + + function restoreAll() { + globalThis.fetch = originalFetch; // Restore the original fetch function + mocks = []; // Clear all mocks and recorders + } + + function restoreOne(url, method) { + mocks = mocks.filter(mock => !(mock.url === url || mock.url === '*') || mock.method.toLowerCase() !== method.toLowerCase()); + if (mocks.length === 0) { + restoreAll(); + } + } + + function ensureFetchIsMocked() { + if (globalThis.fetch === originalFetch) { + globalThis.fetch = async (input, options) => { + for (const mock of mocks) { + let { body: requestBody, method: requestMethod = 'GET' } = options || {}; + requestMethod = requestMethod.toUpperCase(); + try { + requestBody = requestBody ? JSON.parse(requestBody) : undefined; + } catch (error) { + // requestBody remains unchanged if it's not JSON + } + + const urlMatches = mock.url === '*' || input === mock.url; + const methodMatches = mock.method === '*' || mock.method.toUpperCase() === requestMethod; + const bodyMatches = mock.body === '*' || JSON.stringify(requestBody) === JSON.stringify(mock.body); + + if (urlMatches && methodMatches && bodyMatches) { + if (mock.isRecorder) { + const response = await originalFetch(input, options); + const clonedResponse = response.clone(); + records.push({ + url: input, + method: requestMethod, + body: requestBody, + response: await clonedResponse.json() // Assuming JSON response + }); + mock.callback({ + request: { url: input, method: requestMethod, body: requestBody }, + response: mockResponse, + status: mockResponse.status + }); + return response; // Ensure recorders do not block the response + } else { + const mockResponse = new Response(JSON.stringify(mock.response), { + status: 200, + headers: { 'Content-Type': 'application/json' } + }); + if (mock.callback) { + mock.callback({ + request: { url: input, method: requestMethod, body: requestBody }, + response: mockResponse, + status: mockResponse.status + }); + } + return Promise.resolve(mockResponse); + } + } + } + return originalFetch(input, options); // Call the original fetch if no mocks or recorders match + }; + } + } + + return { mock, record, getRecords, clearRecords, restoreAll, restoreOne }; +} + +module.exports = moscaFetch; From bd4f9ae9aabeb2b4988a4ca5b05d125ce6062a1d Mon Sep 17 00:00:00 2001 From: Dariel Date: Tue, 16 Jul 2024 10:55:04 -0400 Subject: [PATCH 2/6] Adding basic test suite and ci github actions. --- .github/workflows/test-workflow.yml | 37 ++++ package.json | 23 ++- .../src/teams/anthropic/productSpecsTeam.js | 1 - .../teams/anthropic/productSpecsTeam.js | 78 +++++++ .../anthropic/productSpecsTeam.requests.js | 115 +++++++++++ .../productSpecsTeamWithAPIErrors.requests.js | 140 +++++++++++++ .../teams/google/productSpecsTeam.requests.js | 192 ++++++++++++++++++ .../teams/mistral/productSpecsTeam.js | 69 +++++++ .../mistral/productSpecsTeam.requests.js | 136 +++++++++++++ .../teams/openai/productSpecsTeam.requests.js | 44 ++-- tests/e2e/productSpecTeam.test.js | 123 +++++------ tests/utils/moscaFetch/Readme.md | 11 +- tests/utils/moscaFetch/index.js | 119 ++++++----- 13 files changed, 941 insertions(+), 147 deletions(-) create mode 100644 .github/workflows/test-workflow.yml create mode 100644 tests/e2e/examples/teams/anthropic/productSpecsTeam.js create mode 100644 tests/e2e/examples/teams/anthropic/productSpecsTeam.requests.js create mode 100644 tests/e2e/examples/teams/anthropic/productSpecsTeamWithAPIErrors.requests.js create mode 100644 tests/e2e/examples/teams/google/productSpecsTeam.requests.js create mode 100644 tests/e2e/examples/teams/mistral/productSpecsTeam.js create mode 100644 tests/e2e/examples/teams/mistral/productSpecsTeam.requests.js diff --git a/.github/workflows/test-workflow.yml b/.github/workflows/test-workflow.yml new file mode 100644 index 0000000..5d79c41 --- /dev/null +++ b/.github/workflows/test-workflow.yml @@ -0,0 +1,37 @@ +name: Run Tests on PR + +on: + pull_request: + branches: [ main ] # Adjust based on your target branch + +jobs: + test: + runs-on: ubuntu-latest + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} + MISTRAL_API_KEY: ${{ secrets.MISTRAL_API_KEY }} + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: '14' + + - name: Install dependencies + run: npm install + + - name: Build for integration tests + run: npm run build:test + + - name: Run integration tests + run: npm run test:integration + + - name: Build production version + run: npm run build + + - name: Run e2e tests + run: npm run test:e2e diff --git a/package.json b/package.json index dbd57ff..8639e66 100644 --- a/package.json +++ b/package.json @@ -6,16 +6,19 @@ "module": "dist/bundle.esm.js", "unpkg": "dist/bundle.umd.js", "scripts": { - "build": "rollup -c", - "build:test": "TEST_ENV=mocked-llm-apis rollup -c", - "dev": "NODE_ENV=development rollup -c -w", - "test": "npm run build:test && jest", - "test:watch": "jest --watch", - "test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand --verbose", - "test:prod": "npm run build && jest", - "play-react": "cd playground/react && npm run dev", - "play-node": "cd playground/nodejs && node index.js" + "build": "rollup -c", + "build:test": "TEST_ENV=mocked-llm-apis rollup -c", + "dev": "NODE_ENV=development rollup -c -w", + "test": "npm run build:test && test:integration", + "test:watch": "TEST_ENV=mocked-llm-apis jest --testPathPattern='tests/e2e' --watch", + "test:debug": "TEST_ENV=mocked-llm-apis node --inspect-brk node_modules/.bin/jest --runInBand --verbose", + "test:prod": "npm run build && jest", + "test:integration": "TEST_ENV=mocked-llm-apis jest --testPathPattern='tests/e2e'", + "test:e2e": "TEST_ENV=real-llm-apis jest --testPathPattern='tests/e2e'", + "play-react": "cd playground/react && npm run dev", + "play-node": "cd playground/nodejs && node index.js" }, + "packageManager": "npm@9.8.1", "repository": { "type": "git", @@ -59,8 +62,6 @@ "@rollup/plugin-replace": "^5.0.7", "dotenv": "^16.4.5", "eslint": "^7.32.0", - "fetch-mock": "^10.0.7", - "fetch-mock-jest": "^1.5.1", "jest": "^29.7.0", "prettier": "^2.3.2", "rollup-plugin-peer-deps-external": "^2.2.4", diff --git a/playground/react/src/teams/anthropic/productSpecsTeam.js b/playground/react/src/teams/anthropic/productSpecsTeam.js index 5fb6393..f0d8b63 100644 --- a/playground/react/src/teams/anthropic/productSpecsTeam.js +++ b/playground/react/src/teams/anthropic/productSpecsTeam.js @@ -73,7 +73,6 @@ const team = new Team({ agents: [requirementsAnalyst, technicalWriter, validator], tasks: [analysisTask, writingTask, validationTask], inputs: { founderIdea: 'I want to add a Referral program to our SAAS platform.' }, // Initial input for the first task - env: { OPENAI_API_KEY: import.meta.env.VITE_OPENAI_API_KEY} }); export default team; \ No newline at end of file diff --git a/tests/e2e/examples/teams/anthropic/productSpecsTeam.js b/tests/e2e/examples/teams/anthropic/productSpecsTeam.js new file mode 100644 index 0000000..13ed6fb --- /dev/null +++ b/tests/e2e/examples/teams/anthropic/productSpecsTeam.js @@ -0,0 +1,78 @@ +const { Agent, Task, Team } = require('agenticjs'); + +// Define agents +const requirementsAnalyst = new Agent({ + name: 'Emma', + role: 'Requirements Analyst', + goal: 'Outline core functionalities and objectives for new features based on the founder’s input.', + background: 'Business Analysis', + tools: [], + llmConfig: { + provider: "anthropic", // or "openai" + model: "claude-3-5-sonnet-20240620", + temperature: 0.9, + maxTokens: 1024, + anthropicApiUrl: "https://www.agenticjs.com/proxy/anthropic", + } + +}); + +const technicalWriter = new Agent({ + name: 'Lucas', + role: 'Technical Writer', + goal: 'Convert functional outlines into detailed technical specifications.', + background: 'Technical Writing', + tools: [], + llmConfig: { + provider: "anthropic", // or "openai" + model: "claude-3-5-sonnet-20240620", + temperature: 0.9, + maxTokens: 1024, + anthropicApiUrl: "https://www.agenticjs.com/proxy/anthropic", + } +}); + +const validator = new Agent({ + name: 'Mia', + role: 'Validator', + goal: 'Ensure the specifications are accurate and complete.', + background: 'Quality Assurance', + tools: [], + llmConfig: { + provider: "anthropic", // or "openai" + model: "claude-3-5-sonnet-20240620", + temperature: 0.9, + maxTokens: 1024, + anthropicApiUrl: "https://www.agenticjs.com/proxy/anthropic", + } +}); + +// Define tasks +const analysisTask = new Task({ + description: `Analyze the founder's idea: {founderIdea} and outline the necessary functionalities to implement it.`, + expectedOutput: 'A functional outline of the Founder Idea', + agent: requirementsAnalyst +}); + +const writingTask = new Task({ + description: `Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria.`, + expectedOutput: 'A detailed technical specifications document.', + isDeliverable: true, + agent: technicalWriter +}); + +const validationTask = new Task({ + description: `Review the technical specifications to ensure they match the founder's vision and that are technically feasible.`, + expectedOutput: 'A validated technical specifications document ready for development. Must be in Markdown format.', + agent: validator +}); + +// Create a team +const team = new Team({ + name: 'Product Specs Team', + agents: [requirementsAnalyst, technicalWriter, validator], + tasks: [analysisTask, writingTask, validationTask], + inputs: { founderIdea: 'I want to add a Referral program to our SAAS platform.' }, // Initial input for the first task +}); + +module.exports = team; \ No newline at end of file diff --git a/tests/e2e/examples/teams/anthropic/productSpecsTeam.requests.js b/tests/e2e/examples/teams/anthropic/productSpecsTeam.requests.js new file mode 100644 index 0000000..dedf918 --- /dev/null +++ b/tests/e2e/examples/teams/anthropic/productSpecsTeam.requests.js @@ -0,0 +1,115 @@ +const recordedRequests = [ + { + "url": "https://www.agenticjs.com/proxy/anthropic/v1/messages", + "method": "POST", + "body": { + "model": "claude-3-5-sonnet-20240620", + "temperature": 0.9, + "top_k": -1, + "top_p": -1, + "stream": false, + "max_tokens": 1024, + "messages": [ + { + "role": "user", + "content": "\n Hi Emma, please complete the following task: Analyze the founder's idea: I want to add a Referral program to our SAAS platform. and outline the necessary functionalities to implement it..\n Your expected output should be: \"A functional outline of the Founder Idea\".\n This is the first task, so there's no input from a previous task.\n " + } + ], + "system": "\n Hello, You are Emma.\n Your role is: Requirements Analyst.\n Your background is: Business Analysis.\n Your main goal is: Outline core functionalities and objectives for new features based on the founder’s input..\n Tools available for your use: No specific tools assigned.\n Task description: Analyze the founder's idea: I want to add a Referral program to our SAAS platform. and outline the necessary functionalities to implement it.\n " + }, + "response": { + "id": "msg_01G7cf9th3a61nBXNY7Ruumy", + "type": "message", + "role": "assistant", + "model": "claude-3-5-sonnet-20240620", + "content": [ + { + "type": "text", + "text": "Certainly! I'll analyze the founder's idea for adding a Referral program to the SAAS platform and outline the necessary functionalities to implement it. Here's a functional outline of the Founder's Idea:\n\nFunctional Outline: Referral Program for SAAS Platform\n\n1. User Registration and Account Management\n 1.1. Unique referral code generation for each user\n 1.2. User dashboard to track referrals and rewards\n\n2. Referral Link Generation and Sharing\n 2.1. Create shareable referral links\n 2.2. Integration with social media platforms for easy sharing\n 2.3. Email invitation system for referrals\n\n3. Referral Tracking System\n 3.1. Track clicks on referral links\n 3.2. Monitor sign-ups through referral links\n 3.3. Attribution of new users to referrers\n\n4. Reward Structure\n 4.1. Define reward types (e.g., cash, credits, discounts)\n 4.2. Set up tiered rewards based on number or quality of referrals\n 4.3. Implement double-sided rewards (for referrer and referee)\n\n5. Automated Reward Distribution\n 5.1. Trigger rewards based on successful referrals\n 5.2. Integrate with payment systems for cash rewards\n 5.3. Apply credits or discounts to user accounts\n\n6. Referral Status Tracking\n 6.1. Real-time status updates for referrals\n 6.2. Notification system for successful referrals and rewards\n\n7. Analytics and Reporting\n 7.1. Dashboard for admins to track program performance\n 7.2. Generate reports on referral metrics and ROI\n 7.3. Identify top referrers and trending patterns\n\n8. Fraud Prevention\n 8.1. Implement measures to detect and prevent self-referrals\n 8.2. Set up system flags for suspicious referral activity\n\n9. Terms and Conditions Management\n 9.1. Create and display referral program terms\n 9.2. Implement user agreement checkpoints\n\n10. Customer Support Integration\n 10.1. FAQ section for referral program\n 10.2. Support ticket system for referral-related inquiries\n\n11. Mobile Responsiveness\n 11.1. Ensure referral program features work on mobile devices\n 11.2. Develop mobile app integration (if applicable)\n\n12. A/B Testing Capabilities\n 12.1. Test different reward structures\n 12.2. Experiment with various referral messaging\n\n13. GDPR and Data Privacy Compliance\n 13.1. Implement data protection measures for referral information\n 13.2. Provide options for users to opt-out of the referral program\n\nThis functional outline covers the key aspects of implementing a robust referral program for the SAAS platform. It addresses user engagement, tracking, rewards, analytics, and necessary operational considerations to ensure a successful and compliant referral system." + } + ], + "stop_reason": "end_turn", + "stop_sequence": null, + "usage": { + "input_tokens": 191, + "output_tokens": 675 + } + } + }, + { + "url": "https://www.agenticjs.com/proxy/anthropic/v1/messages", + "method": "POST", + "body": { + "model": "claude-3-5-sonnet-20240620", + "temperature": 0.9, + "top_k": -1, + "top_p": -1, + "stream": false, + "max_tokens": 1024, + "messages": [ + { + "role": "user", + "content": "\n Hi Lucas, please complete the following task: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria..\n Your expected output should be: \"A detailed technical specifications document.\".\n Incorporate the following findings and insights from previous tasks: \"Certainly! I'll analyze the founder's idea for adding a Referral program to the SAAS platform and outline the necessary functionalities to implement it. Here's a functional outline of the Founder's Idea:\n\nFunctional Outline: Referral Program for SAAS Platform\n\n1. User Registration and Account Management\n 1.1. Unique referral code generation for each user\n 1.2. User dashboard to track referrals and rewards\n\n2. Referral Link Generation and Sharing\n 2.1. Create shareable referral links\n 2.2. Integration with social media platforms for easy sharing\n 2.3. Email invitation system for referrals\n\n3. Referral Tracking System\n 3.1. Track clicks on referral links\n 3.2. Monitor sign-ups through referral links\n 3.3. Attribution of new users to referrers\n\n4. Reward Structure\n 4.1. Define reward types (e.g., cash, credits, discounts)\n 4.2. Set up tiered rewards based on number or quality of referrals\n 4.3. Implement double-sided rewards (for referrer and referee)\n\n5. Automated Reward Distribution\n 5.1. Trigger rewards based on successful referrals\n 5.2. Integrate with payment systems for cash rewards\n 5.3. Apply credits or discounts to user accounts\n\n6. Referral Status Tracking\n 6.1. Real-time status updates for referrals\n 6.2. Notification system for successful referrals and rewards\n\n7. Analytics and Reporting\n 7.1. Dashboard for admins to track program performance\n 7.2. Generate reports on referral metrics and ROI\n 7.3. Identify top referrers and trending patterns\n\n8. Fraud Prevention\n 8.1. Implement measures to detect and prevent self-referrals\n 8.2. Set up system flags for suspicious referral activity\n\n9. Terms and Conditions Management\n 9.1. Create and display referral program terms\n 9.2. Implement user agreement checkpoints\n\n10. Customer Support Integration\n 10.1. FAQ section for referral program\n 10.2. Support ticket system for referral-related inquiries\n\n11. Mobile Responsiveness\n 11.1. Ensure referral program features work on mobile devices\n 11.2. Develop mobile app integration (if applicable)\n\n12. A/B Testing Capabilities\n 12.1. Test different reward structures\n 12.2. Experiment with various referral messaging\n\n13. GDPR and Data Privacy Compliance\n 13.1. Implement data protection measures for referral information\n 13.2. Provide options for users to opt-out of the referral program\n\nThis functional outline covers the key aspects of implementing a robust referral program for the SAAS platform. It addresses user engagement, tracking, rewards, analytics, and necessary operational considerations to ensure a successful and compliant referral system.\"\n " + } + ], + "system": "\n Hello, You are Lucas.\n Your role is: Technical Writer.\n Your background is: Technical Writing.\n Your main goal is: Convert functional outlines into detailed technical specifications..\n Tools available for your use: No specific tools assigned.\n Task description: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria.\n " + }, + "response": { + "id": "msg_01Y61ahE2PjWczkwftYn7WCW", + "type": "message", + "role": "assistant", + "model": "claude-3-5-sonnet-20240620", + "content": [ + { + "type": "text", + "text": "Based on the functional outline provided, I'll create a detailed technical specifications document for the Referral Program for the SAAS Platform. This document will include user stories, system requirements, and acceptance criteria for each major component of the system.\n\n---\n\n# Detailed Technical Specifications: Referral Program for SAAS Platform\n\n## 1. User Registration and Account Management\n\n### 1.1 Unique Referral Code Generation\n\n#### User Story:\nAs a registered user, I want to have a unique referral code automatically generated for my account so that I can start referring new users to the platform.\n\n#### System Requirements:\n- The system shall generate a unique, alphanumeric referral code for each user upon registration.\n- The referral code shall be at least 8 characters long.\n- The system shall ensure that no two users have the same referral code.\n\n#### Acceptance Criteria:\n- A unique referral code is generated and associated with the user's account upon successful registration.\n- The referral code is visible in the user's account dashboard.\n- The referral code can be easily copied by the user for sharing.\n\n### 1.2 User Dashboard for Referral Tracking\n\n#### User Story:\nAs a user, I want to have a dedicated dashboard where I can track my referrals and rewards so that I can monitor my progress in the referral program.\n\n#### System Requirements:\n- The system shall provide a user-friendly dashboard interface for users to view their referral activities.\n- The dashboard shall display the following information:\n - Total number of referrals\n - Number of successful referrals\n - Total rewards earned\n - List of pending and completed referrals\n\n#### Acceptance Criteria:\n- Users can access their referral dashboard after logging into their account.\n- The dashboard accurately displays up-to-date referral and reward information.\n- Users can navigate through different sections of the dashboard to view detailed information about their referrals.\n\n## 2. Referral Link Generation and Sharing\n\n### 2.1 Create Shareable Referral Links\n\n#### User Story:\nAs a user, I want to be able to generate shareable referral links so that I can easily promote the platform to my network.\n\n#### System Requirements:\n- The system shall generate a unique URL for each user's referral link.\n- The referral link shall include the user's referral code.\n- The system shall provide an option to customize the referral link with a short, memorable alias.\n\n#### Acceptance Criteria:\n- Users can generate a referral link from their dashboard.\n- The generated link correctly includes the user's referral code.\n- Users can create a custom alias for their referral link, if desired.\n\n### 2.2 Social Media Integration\n\n#### User Story:\nAs a user, I want to be able to share my referral link directly to popular social media platforms so that I can quickly reach out to my social network.\n\n#### System Requirements:\n- The system shall integrate with major social media platforms (e.g., Facebook, Twitter, LinkedIn).\n- Users shall be able to share their referral link with a pre-formatted message.\n- The system shall track the source of referrals coming from different social media platforms.\n\n#### Acceptance Criteria:\n- Users can share their referral link to connected social media accounts with one click.\n- The shared message includes the referral link and a customizable promotional text.\n- The system accurately attributes referrals to the specific social media platform they came from.\n\n### 2.3 Email Invitation System\n\n#### User Story:\nAs a user, I want to be able to send email invitations with my referral link to my contacts so that I can refer people who are not on social media.\n\n#### System Requirements:\n- The system shall provide an email invitation feature within the user dashboard.\n- Users shall be able to input multiple email addresses for batch invitations.\n- The system shall use a templated email that includes the user's referral link and a personalized message.\n\n#### Acceptance Criteria:\n- Users can send email invitations containing their referral link from their dashboard.\n- The email template is customizable and includes all necessary referral information.\n- The system tracks and reports on the status of email invitations (sent, opened, clicked).\n\n## 3. Referral Tracking System\n\n### 3.1 Track Clicks on Referral Links\n\n#### User Story:\nAs a user, I want the system to track clicks on my referral links so that I can measure the effectiveness of my referral efforts.\n\n#### System Requirements:\n- The system shall recor" + } + ], + "stop_reason": "max_tokens", + "stop_sequence": null, + "usage": { + "input_tokens": 829, + "output_tokens": 1023 + } + } + }, + { + "url": "https://www.agenticjs.com/proxy/anthropic/v1/messages", + "method": "POST", + "body": { + "model": "claude-3-5-sonnet-20240620", + "temperature": 0.9, + "top_k": -1, + "top_p": -1, + "stream": false, + "max_tokens": 1024, + "messages": [ + { + "role": "user", + "content": "\n Hi Mia, please complete the following task: Review the technical specifications to ensure they match the founder's vision and that are technically feasible..\n Your expected output should be: \"A validated technical specifications document ready for development. Must be in Markdown format.\".\n Incorporate the following findings and insights from previous tasks: \"Based on the functional outline provided, I'll create a detailed technical specifications document for the Referral Program for the SAAS Platform. This document will include user stories, system requirements, and acceptance criteria for each major component of the system.\n\n---\n\n# Detailed Technical Specifications: Referral Program for SAAS Platform\n\n## 1. User Registration and Account Management\n\n### 1.1 Unique Referral Code Generation\n\n#### User Story:\nAs a registered user, I want to have a unique referral code automatically generated for my account so that I can start referring new users to the platform.\n\n#### System Requirements:\n- The system shall generate a unique, alphanumeric referral code for each user upon registration.\n- The referral code shall be at least 8 characters long.\n- The system shall ensure that no two users have the same referral code.\n\n#### Acceptance Criteria:\n- A unique referral code is generated and associated with the user's account upon successful registration.\n- The referral code is visible in the user's account dashboard.\n- The referral code can be easily copied by the user for sharing.\n\n### 1.2 User Dashboard for Referral Tracking\n\n#### User Story:\nAs a user, I want to have a dedicated dashboard where I can track my referrals and rewards so that I can monitor my progress in the referral program.\n\n#### System Requirements:\n- The system shall provide a user-friendly dashboard interface for users to view their referral activities.\n- The dashboard shall display the following information:\n - Total number of referrals\n - Number of successful referrals\n - Total rewards earned\n - List of pending and completed referrals\n\n#### Acceptance Criteria:\n- Users can access their referral dashboard after logging into their account.\n- The dashboard accurately displays up-to-date referral and reward information.\n- Users can navigate through different sections of the dashboard to view detailed information about their referrals.\n\n## 2. Referral Link Generation and Sharing\n\n### 2.1 Create Shareable Referral Links\n\n#### User Story:\nAs a user, I want to be able to generate shareable referral links so that I can easily promote the platform to my network.\n\n#### System Requirements:\n- The system shall generate a unique URL for each user's referral link.\n- The referral link shall include the user's referral code.\n- The system shall provide an option to customize the referral link with a short, memorable alias.\n\n#### Acceptance Criteria:\n- Users can generate a referral link from their dashboard.\n- The generated link correctly includes the user's referral code.\n- Users can create a custom alias for their referral link, if desired.\n\n### 2.2 Social Media Integration\n\n#### User Story:\nAs a user, I want to be able to share my referral link directly to popular social media platforms so that I can quickly reach out to my social network.\n\n#### System Requirements:\n- The system shall integrate with major social media platforms (e.g., Facebook, Twitter, LinkedIn).\n- Users shall be able to share their referral link with a pre-formatted message.\n- The system shall track the source of referrals coming from different social media platforms.\n\n#### Acceptance Criteria:\n- Users can share their referral link to connected social media accounts with one click.\n- The shared message includes the referral link and a customizable promotional text.\n- The system accurately attributes referrals to the specific social media platform they came from.\n\n### 2.3 Email Invitation System\n\n#### User Story:\nAs a user, I want to be able to send email invitations with my referral link to my contacts so that I can refer people who are not on social media.\n\n#### System Requirements:\n- The system shall provide an email invitation feature within the user dashboard.\n- Users shall be able to input multiple email addresses for batch invitations.\n- The system shall use a templated email that includes the user's referral link and a personalized message.\n\n#### Acceptance Criteria:\n- Users can send email invitations containing their referral link from their dashboard.\n- The email template is customizable and includes all necessary referral information.\n- The system tracks and reports on the status of email invitations (sent, opened, clicked).\n\n## 3. Referral Tracking System\n\n### 3.1 Track Clicks on Referral Links\n\n#### User Story:\nAs a user, I want the system to track clicks on my referral links so that I can measure the effectiveness of my referral efforts.\n\n#### System Requirements:\n- The system shall recor\"\n " + } + ], + "system": "\n Hello, You are Mia.\n Your role is: Validator.\n Your background is: Quality Assurance.\n Your main goal is: Ensure the specifications are accurate and complete..\n Tools available for your use: No specific tools assigned.\n Task description: Review the technical specifications to ensure they match the founder's vision and that are technically feasible.\n " + }, + "response": { + "id": "msg_01K7NRuRyMcJus5ZyxpZRT1U", + "type": "message", + "role": "assistant", + "model": "claude-3-5-sonnet-20240620", + "content": [ + { + "type": "text", + "text": "Thank you for providing the initial technical specifications. I'll review them to ensure they match the founder's vision and are technically feasible. Here's the validated technical specifications document in Markdown format:\n\n```markdown\n# Validated Technical Specifications: Referral Program for SAAS Platform\n\n## 1. User Registration and Account Management\n\n### 1.1 Unique Referral Code Generation\n\n#### User Story:\nAs a registered user, I want to have a unique referral code automatically generated for my account so that I can start referring new users to the platform.\n\n#### System Requirements:\n- The system shall generate a unique, alphanumeric referral code for each user upon registration.\n- The referral code shall be at least 8 characters long.\n- The system shall ensure that no two users have the same referral code.\n\n#### Acceptance Criteria:\n- A unique referral code is generated and associated with the user's account upon successful registration.\n- The referral code is visible in the user's account dashboard.\n- The referral code can be easily copied by the user for sharing.\n\n### 1.2 User Dashboard for Referral Tracking\n\n#### User Story:\nAs a user, I want to have a dedicated dashboard where I can track my referrals and rewards so that I can monitor my progress in the referral program.\n\n#### System Requirements:\n- The system shall provide a user-friendly dashboard interface for users to view their referral activities.\n- The dashboard shall display the following information:\n - Total number of referrals\n - Number of successful referrals\n - Total rewards earned\n - List of pending and completed referrals\n\n#### Acceptance Criteria:\n- Users can access their referral dashboard after logging into their account.\n- The dashboard accurately displays up-to-date referral and reward information.\n- Users can navigate through different sections of the dashboard to view detailed information about their referrals.\n\n## 2. Referral Link Generation and Sharing\n\n### 2.1 Create Shareable Referral Links\n\n#### User Story:\nAs a user, I want to be able to generate shareable referral links so that I can easily promote the platform to my network.\n\n#### System Requirements:\n- The system shall generate a unique URL for each user's referral link.\n- The referral link shall include the user's referral code.\n- The system shall provide an option to customize the referral link with a short, memorable alias.\n\n#### Acceptance Criteria:\n- Users can generate a referral link from their dashboard.\n- The generated link correctly includes the user's referral code.\n- Users can create a custom alias for their referral link, if desired.\n\n### 2.2 Social Media Integration\n\n#### User Story:\nAs a user, I want to be able to share my referral link directly to popular social media platforms so that I can quickly reach out to my social network.\n\n#### System Requirements:\n- The system shall integrate with major social media platforms (e.g., Facebook, Twitter, LinkedIn).\n- Users shall be able to share their referral link with a pre-formatted message.\n- The system shall track the source of referrals coming from different social media platforms.\n\n#### Acceptance Criteria:\n- Users can share their referral link to connected social media accounts with one click.\n- The shared message includes the referral link and a customizable promotional text.\n- The system accurately attributes referrals to the specific social media platform they came from.\n\n### 2.3 Email Invitation System\n\n#### User Story:\nAs a user, I want to be able to send email invitations with my referral link to my contacts so that I can refer people who are not on social media.\n\n#### System Requirements:\n- The system shall provide an email invitation feature within the user dashboard.\n- Users shall be able to input multiple email addresses for batch invitations.\n- The system shall use a templated email that includes the user's referral link and a personalized message.\n\n#### Acceptance Criteria:\n- Users can send email invitations containing their referral link from their dashboard.\n- The email template is customizable and includes all necessary referral information.\n- The system tracks and reports on the status of email invitations (sent, opened, clicked).\n\n## 3. Referral Tracking System\n\n### 3.1 Track Clicks on Referral Links\n\n#### User Story:\nAs a user, I want the system to track clicks on my referral links so that I can measure the effectiveness of my referral efforts.\n\n#### System Requirements:\n- The system shall record each click on a user's referral link" + } + ], + "stop_reason": "max_tokens", + "stop_sequence": null, + "usage": { + "input_tokens": 1189, + "output_tokens": 1023 + } + } + } +]; + +module.exports = recordedRequests; \ No newline at end of file diff --git a/tests/e2e/examples/teams/anthropic/productSpecsTeamWithAPIErrors.requests.js b/tests/e2e/examples/teams/anthropic/productSpecsTeamWithAPIErrors.requests.js new file mode 100644 index 0000000..9a4964b --- /dev/null +++ b/tests/e2e/examples/teams/anthropic/productSpecsTeamWithAPIErrors.requests.js @@ -0,0 +1,140 @@ +const recordedRequests = [ + { + "url": "https://www.agenticjs.com/proxy/anthropic/v1/messages", + "method": "POST", + "body": { + "model": "claude-3-5-sonnet-20240620", + "temperature": 0.9, + "top_k": -1, + "top_p": -1, + "stream": false, + "max_tokens": 1024, + "messages": [ + { + "role": "user", + "content": "\n Hi Emma, please complete the following task: Analyze the founder's idea: I want to add a Referral program to our SAAS platform. and outline the necessary functionalities to implement it..\n Your expected output should be: \"A functional outline of the Founder Idea\".\n This is the first task, so there's no input from a previous task.\n " + } + ], + "system": "\n Hello, You are Emma.\n Your role is: Requirements Analyst.\n Your background is: Business Analysis.\n Your main goal is: Outline core functionalities and objectives for new features based on the founder’s input..\n Tools available for your use: No specific tools assigned.\n Task description: Analyze the founder's idea: I want to add a Referral program to our SAAS platform. and outline the necessary functionalities to implement it.\n " + }, + "response": { + "id": "msg_01CpQt1ZXS2uL3VsBkeGnHki", + "type": "message", + "role": "assistant", + "model": "claude-3-5-sonnet-20240620", + "content": [ + { + "type": "text", + "text": "Certainly! I'll analyze the founder's idea for adding a Referral program to the SAAS platform and outline the necessary functionalities to implement it. Here's a functional outline of the Referral program:\n\nA Functional Outline of the Founder Idea: Referral Program for SAAS Platform\n\n1. User Registration and Account Management\n 1.1. Unique referral code generation for each user\n 1.2. Referral link creation and management\n 1.3. User dashboard to track referrals and rewards\n\n2. Referral Tracking System\n 2.1. Tracking mechanism for referred sign-ups\n 2.2. Attribution of new users to referrers\n 2.3. Conversion tracking (from sign-up to paid subscription)\n\n3. Reward Structure\n 3.1. Define reward types (e.g., cash, credits, discounts)\n 3.2. Set up tiered rewards based on number or value of referrals\n 3.3. Implement reward expiration and usage limits\n\n4. Referral Communication Tools\n 4.1. Email templates for inviting friends/colleagues\n 4.2. Social media sharing functionality\n 4.3. In-app notifications for successful referrals\n\n5. Analytics and Reporting\n 5.1. Referral program performance dashboard\n 5.2. Individual user referral statistics\n 5.3. Conversion rate and ROI analysis\n\n6. Admin Management Interface\n 6.1. Configure referral program parameters\n 6.2. Manage and approve rewards\n 6.3. Monitor and moderate referral activities\n\n7. Integration with Existing SAAS Platform\n 7.1. Single sign-on (SSO) with the main platform\n 7.2. Consistent user experience and branding\n 7.3. Integration with billing and payment systems\n\n8. Fraud Prevention and Security\n 8.1. Implement measures to prevent self-referrals\n 8.2. Set up system to detect and prevent referral abuse\n 8.3. Ensure data privacy and security compliance\n\n9. User Support for Referral Program\n 9.1. FAQ section for referral program\n 9.2. Customer support ticketing for referral-related issues\n 9.3. Documentation and guides for program usage\n\n10. Legal and Compliance\n 10.1. Terms and conditions for the referral program\n 10.2. Privacy policy updates to cover referral data handling\n 10.3. Ensure compliance with local laws and regulations\n\nThis functional outline provides a comprehensive overview of the key components and functionalities required to implement a successful referral program for the SAAS platform. It covers user management, tracking, rewards, communication, analytics, administration, integration, security, support, and legal aspects of the referral system." + } + ], + "stop_reason": "end_turn", + "stop_sequence": null, + "usage": { + "input_tokens": 191, + "output_tokens": 633 + } + } + }, + { + "url": "https://www.agenticjs.com/proxy/anthropic/v1/messages", + "method": "POST", + "body": { + "model": "claude-3-5-sonnet-20240620", + "temperature": 0.9, + "top_k": -1, + "top_p": -1, + "stream": false, + "max_tokens": 1024, + "messages": [ + { + "role": "user", + "content": "\n Hi Lucas, please complete the following task: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria..\n Your expected output should be: \"A detailed technical specifications document.\".\n Incorporate the following findings and insights from previous tasks: \"Certainly! I'll analyze the founder's idea for adding a Referral program to the SAAS platform and outline the necessary functionalities to implement it. Here's a functional outline of the Referral program:\n\nA Functional Outline of the Founder Idea: Referral Program for SAAS Platform\n\n1. User Registration and Account Management\n 1.1. Unique referral code generation for each user\n 1.2. Referral link creation and management\n 1.3. User dashboard to track referrals and rewards\n\n2. Referral Tracking System\n 2.1. Tracking mechanism for referred sign-ups\n 2.2. Attribution of new users to referrers\n 2.3. Conversion tracking (from sign-up to paid subscription)\n\n3. Reward Structure\n 3.1. Define reward types (e.g., cash, credits, discounts)\n 3.2. Set up tiered rewards based on number or value of referrals\n 3.3. Implement reward expiration and usage limits\n\n4. Referral Communication Tools\n 4.1. Email templates for inviting friends/colleagues\n 4.2. Social media sharing functionality\n 4.3. In-app notifications for successful referrals\n\n5. Analytics and Reporting\n 5.1. Referral program performance dashboard\n 5.2. Individual user referral statistics\n 5.3. Conversion rate and ROI analysis\n\n6. Admin Management Interface\n 6.1. Configure referral program parameters\n 6.2. Manage and approve rewards\n 6.3. Monitor and moderate referral activities\n\n7. Integration with Existing SAAS Platform\n 7.1. Single sign-on (SSO) with the main platform\n 7.2. Consistent user experience and branding\n 7.3. Integration with billing and payment systems\n\n8. Fraud Prevention and Security\n 8.1. Implement measures to prevent self-referrals\n 8.2. Set up system to detect and prevent referral abuse\n 8.3. Ensure data privacy and security compliance\n\n9. User Support for Referral Program\n 9.1. FAQ section for referral program\n 9.2. Customer support ticketing for referral-related issues\n 9.3. Documentation and guides for program usage\n\n10. Legal and Compliance\n 10.1. Terms and conditions for the referral program\n 10.2. Privacy policy updates to cover referral data handling\n 10.3. Ensure compliance with local laws and regulations\n\nThis functional outline provides a comprehensive overview of the key components and functionalities required to implement a successful referral program for the SAAS platform. It covers user management, tracking, rewards, communication, analytics, administration, integration, security, support, and legal aspects of the referral system.\"\n " + } + ], + "system": "\n Hello, You are Lucas.\n Your role is: Technical Writer.\n Your background is: Technical Writing.\n Your main goal is: Convert functional outlines into detailed technical specifications..\n Tools available for your use: No specific tools assigned.\n Task description: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria.\n " + }, + "response": { + "error": { + "code": "504", + "message": "An error occurred with your deployment" + } + } + }, + { + "url": "https://www.agenticjs.com/proxy/anthropic/v1/messages", + "method": "POST", + "body": { + "model": "claude-3-5-sonnet-20240620", + "temperature": 0.9, + "top_k": -1, + "top_p": -1, + "stream": false, + "max_tokens": 1024, + "messages": [ + { + "role": "user", + "content": "\n Hi Lucas, please complete the following task: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria..\n Your expected output should be: \"A detailed technical specifications document.\".\n Incorporate the following findings and insights from previous tasks: \"Certainly! I'll analyze the founder's idea for adding a Referral program to the SAAS platform and outline the necessary functionalities to implement it. Here's a functional outline of the Referral program:\n\nA Functional Outline of the Founder Idea: Referral Program for SAAS Platform\n\n1. User Registration and Account Management\n 1.1. Unique referral code generation for each user\n 1.2. Referral link creation and management\n 1.3. User dashboard to track referrals and rewards\n\n2. Referral Tracking System\n 2.1. Tracking mechanism for referred sign-ups\n 2.2. Attribution of new users to referrers\n 2.3. Conversion tracking (from sign-up to paid subscription)\n\n3. Reward Structure\n 3.1. Define reward types (e.g., cash, credits, discounts)\n 3.2. Set up tiered rewards based on number or value of referrals\n 3.3. Implement reward expiration and usage limits\n\n4. Referral Communication Tools\n 4.1. Email templates for inviting friends/colleagues\n 4.2. Social media sharing functionality\n 4.3. In-app notifications for successful referrals\n\n5. Analytics and Reporting\n 5.1. Referral program performance dashboard\n 5.2. Individual user referral statistics\n 5.3. Conversion rate and ROI analysis\n\n6. Admin Management Interface\n 6.1. Configure referral program parameters\n 6.2. Manage and approve rewards\n 6.3. Monitor and moderate referral activities\n\n7. Integration with Existing SAAS Platform\n 7.1. Single sign-on (SSO) with the main platform\n 7.2. Consistent user experience and branding\n 7.3. Integration with billing and payment systems\n\n8. Fraud Prevention and Security\n 8.1. Implement measures to prevent self-referrals\n 8.2. Set up system to detect and prevent referral abuse\n 8.3. Ensure data privacy and security compliance\n\n9. User Support for Referral Program\n 9.1. FAQ section for referral program\n 9.2. Customer support ticketing for referral-related issues\n 9.3. Documentation and guides for program usage\n\n10. Legal and Compliance\n 10.1. Terms and conditions for the referral program\n 10.2. Privacy policy updates to cover referral data handling\n 10.3. Ensure compliance with local laws and regulations\n\nThis functional outline provides a comprehensive overview of the key components and functionalities required to implement a successful referral program for the SAAS platform. It covers user management, tracking, rewards, communication, analytics, administration, integration, security, support, and legal aspects of the referral system.\"\n " + } + ], + "system": "\n Hello, You are Lucas.\n Your role is: Technical Writer.\n Your background is: Technical Writing.\n Your main goal is: Convert functional outlines into detailed technical specifications..\n Tools available for your use: No specific tools assigned.\n Task description: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria.\n " + }, + "response": { + "id": "msg_01XyRHNT3NFAb2q4PzWe3ceb", + "type": "message", + "role": "assistant", + "model": "claude-3-5-sonnet-20240620", + "content": [ + { + "type": "text", + "text": "Based on the functional outline provided, I'll create a detailed technical specifications document for the Referral Program for the SAAS Platform. This document will include user stories, system requirements, and acceptance criteria for each major component of the system.\n\nTechnical Specifications: Referral Program for SAAS Platform\n\n1. User Registration and Account Management\n\nUser Story:\nAs a user, I want to have a unique referral code and link so that I can easily share the platform with others and track my referrals.\n\nSystem Requirements:\n1.1. The system shall generate a unique alphanumeric referral code for each user upon account creation.\n1.2. The system shall create a shareable referral link incorporating the user's referral code.\n1.3. The system shall provide a user dashboard to display referral statistics and rewards.\n\nAcceptance Criteria:\n- Each user has a unique referral code of at least 8 characters.\n- Referral links are formatted as: https://platform.com/refer/{referral_code}\n- User dashboard displays: number of referrals, successful conversions, and rewards earned.\n\n2. Referral Tracking System\n\nUser Story:\nAs a user, I want the system to accurately track and attribute new sign-ups to my referrals so that I receive proper credit and rewards.\n\nSystem Requirements:\n2.1. The system shall track and record all sign-ups originating from referral links.\n2.2. The system shall attribute new users to the correct referrer based on the referral code used.\n2.3. The system shall monitor referred users' actions, including subscription purchases.\n\nAcceptance Criteria:\n- All sign-ups through referral links are logged with timestamp and referrer information.\n- New users are correctly linked to their referrer in the database.\n- The system tracks referred users' journey from sign-up to paid subscription.\n\n3. Reward Structure\n\nUser Story:\nAs a user, I want to receive rewards for successful referrals based on a clear and fair structure.\n\nSystem Requirements:\n3.1. The system shall support multiple reward types (e.g., cash, credits, discounts).\n3.2. The system shall implement a tiered reward structure based on the number or value of referrals.\n3.3. The system shall manage reward expiration and usage limits.\n\nAcceptance Criteria:\n- Users can choose from at least three reward types.\n- Reward tiers are clearly defined and automatically applied.\n- Rewards have configurable expiration dates and usage limits.\n\n4. Referral Communication Tools\n\nUser Story:\nAs a user, I want easy-to-use tools to share my referral link and invite others to the platform.\n\nSystem Requirements:\n4.1. The system shall provide customizable email templates for referral invitations.\n4.2. The system shall integrate with major social media platforms for one-click sharing.\n4.3. The system shall send in-app notifications for successful referrals.\n\nAcceptance Criteria:\n- Users can customize and send referral invitation emails directly from the platform.\n- Referral links can be shared on at least three major social media platforms with pre-filled content.\n- Users receive real-time notifications when their referrals sign up or make a purchase.\n\n5. Analytics and Reporting\n\nUser Story:\nAs an admin, I want comprehensive analytics and reporting tools to monitor the referral program's performance.\n\nSystem Requirements:\n5.1. The system shall provide a referral program performance dashboard.\n5.2. The system shall generate individual user referral statistics.\n5.3. The system shall calculate and display conversion rates and ROI for the referral program.\n\nAcceptance Criteria:\n- Admin dashboard displays key metrics including total referrals, conversion rate, and program ROI.\n- Individual user referral reports are available and exportable.\n- Analytics data is updated in real-time and can be filtered by date range.\n\n6. Admin Management Interface\n\nUser Story:\nAs an admin, I want a robust management interface to configure and oversee the referral program.\n\nSystem Requirements:\n6.1. The system shall provide an interface to configure referral program parameters.\n6.2. The system shall allow admins to manage and approve rewards.\n6.3. The system shall provide tools to monitor and moderate referral activities.\n\nAcceptance Criteria:\n- Admins can adjust reward structures, expiration dates, and program rules through the interface.\n- Reward approvals can be automated or manually reviewed based on configurable criteria.\n- Admins can view, filter, and export detailed referral" + } + ], + "stop_reason": "max_tokens", + "stop_sequence": null, + "usage": { + "input_tokens": 784, + "output_tokens": 1022 + } + } + }, + { + "url": "https://www.agenticjs.com/proxy/anthropic/v1/messages", + "method": "POST", + "body": { + "model": "claude-3-5-sonnet-20240620", + "temperature": 0.9, + "top_k": -1, + "top_p": -1, + "stream": false, + "max_tokens": 1024, + "messages": [ + { + "role": "user", + "content": "\n Hi Mia, please complete the following task: Review the technical specifications to ensure they match the founder's vision and that are technically feasible..\n Your expected output should be: \"A validated technical specifications document ready for development. Must be in Markdown format.\".\n Incorporate the following findings and insights from previous tasks: \"Based on the functional outline provided, I'll create a detailed technical specifications document for the Referral Program for the SAAS Platform. This document will include user stories, system requirements, and acceptance criteria for each major component of the system.\n\nTechnical Specifications: Referral Program for SAAS Platform\n\n1. User Registration and Account Management\n\nUser Story:\nAs a user, I want to have a unique referral code and link so that I can easily share the platform with others and track my referrals.\n\nSystem Requirements:\n1.1. The system shall generate a unique alphanumeric referral code for each user upon account creation.\n1.2. The system shall create a shareable referral link incorporating the user's referral code.\n1.3. The system shall provide a user dashboard to display referral statistics and rewards.\n\nAcceptance Criteria:\n- Each user has a unique referral code of at least 8 characters.\n- Referral links are formatted as: https://platform.com/refer/{referral_code}\n- User dashboard displays: number of referrals, successful conversions, and rewards earned.\n\n2. Referral Tracking System\n\nUser Story:\nAs a user, I want the system to accurately track and attribute new sign-ups to my referrals so that I receive proper credit and rewards.\n\nSystem Requirements:\n2.1. The system shall track and record all sign-ups originating from referral links.\n2.2. The system shall attribute new users to the correct referrer based on the referral code used.\n2.3. The system shall monitor referred users' actions, including subscription purchases.\n\nAcceptance Criteria:\n- All sign-ups through referral links are logged with timestamp and referrer information.\n- New users are correctly linked to their referrer in the database.\n- The system tracks referred users' journey from sign-up to paid subscription.\n\n3. Reward Structure\n\nUser Story:\nAs a user, I want to receive rewards for successful referrals based on a clear and fair structure.\n\nSystem Requirements:\n3.1. The system shall support multiple reward types (e.g., cash, credits, discounts).\n3.2. The system shall implement a tiered reward structure based on the number or value of referrals.\n3.3. The system shall manage reward expiration and usage limits.\n\nAcceptance Criteria:\n- Users can choose from at least three reward types.\n- Reward tiers are clearly defined and automatically applied.\n- Rewards have configurable expiration dates and usage limits.\n\n4. Referral Communication Tools\n\nUser Story:\nAs a user, I want easy-to-use tools to share my referral link and invite others to the platform.\n\nSystem Requirements:\n4.1. The system shall provide customizable email templates for referral invitations.\n4.2. The system shall integrate with major social media platforms for one-click sharing.\n4.3. The system shall send in-app notifications for successful referrals.\n\nAcceptance Criteria:\n- Users can customize and send referral invitation emails directly from the platform.\n- Referral links can be shared on at least three major social media platforms with pre-filled content.\n- Users receive real-time notifications when their referrals sign up or make a purchase.\n\n5. Analytics and Reporting\n\nUser Story:\nAs an admin, I want comprehensive analytics and reporting tools to monitor the referral program's performance.\n\nSystem Requirements:\n5.1. The system shall provide a referral program performance dashboard.\n5.2. The system shall generate individual user referral statistics.\n5.3. The system shall calculate and display conversion rates and ROI for the referral program.\n\nAcceptance Criteria:\n- Admin dashboard displays key metrics including total referrals, conversion rate, and program ROI.\n- Individual user referral reports are available and exportable.\n- Analytics data is updated in real-time and can be filtered by date range.\n\n6. Admin Management Interface\n\nUser Story:\nAs an admin, I want a robust management interface to configure and oversee the referral program.\n\nSystem Requirements:\n6.1. The system shall provide an interface to configure referral program parameters.\n6.2. The system shall allow admins to manage and approve rewards.\n6.3. The system shall provide tools to monitor and moderate referral activities.\n\nAcceptance Criteria:\n- Admins can adjust reward structures, expiration dates, and program rules through the interface.\n- Reward approvals can be automated or manually reviewed based on configurable criteria.\n- Admins can view, filter, and export detailed referral\"\n " + } + ], + "system": "\n Hello, You are Mia.\n Your role is: Validator.\n Your background is: Quality Assurance.\n Your main goal is: Ensure the specifications are accurate and complete..\n Tools available for your use: No specific tools assigned.\n Task description: Review the technical specifications to ensure they match the founder's vision and that are technically feasible.\n " + }, + "response": { + "id": "msg_016YD1TGwr9vhDZLrfkvPzu7", + "type": "message", + "role": "assistant", + "model": "claude-3-5-sonnet-20240620", + "content": [ + { + "type": "text", + "text": "Here's the validated technical specifications document in Markdown format, ready for development:\n\n# Technical Specifications: Referral Program for SAAS Platform\n\n## 1. User Registration and Account Management\n\n### User Story:\nAs a user, I want to have a unique referral code and link so that I can easily share the platform with others and track my referrals.\n\n### System Requirements:\n1.1. The system shall generate a unique alphanumeric referral code for each user upon account creation.\n1.2. The system shall create a shareable referral link incorporating the user's referral code.\n1.3. The system shall provide a user dashboard to display referral statistics and rewards.\n\n### Acceptance Criteria:\n- Each user has a unique referral code of at least 8 characters.\n- Referral links are formatted as: https://platform.com/refer/{referral_code}\n- User dashboard displays: number of referrals, successful conversions, and rewards earned.\n\n## 2. Referral Tracking System\n\n### User Story:\nAs a user, I want the system to accurately track and attribute new sign-ups to my referrals so that I receive proper credit and rewards.\n\n### System Requirements:\n2.1. The system shall track and record all sign-ups originating from referral links.\n2.2. The system shall attribute new users to the correct referrer based on the referral code used.\n2.3. The system shall monitor referred users' actions, including subscription purchases.\n\n### Acceptance Criteria:\n- All sign-ups through referral links are logged with timestamp and referrer information.\n- New users are correctly linked to their referrer in the database.\n- The system tracks referred users' journey from sign-up to paid subscription.\n\n## 3. Reward Structure\n\n### User Story:\nAs a user, I want to receive rewards for successful referrals based on a clear and fair structure.\n\n### System Requirements:\n3.1. The system shall support multiple reward types (e.g., cash, credits, discounts).\n3.2. The system shall implement a tiered reward structure based on the number or value of referrals.\n3.3. The system shall manage reward expiration and usage limits.\n\n### Acceptance Criteria:\n- Users can choose from at least three reward types.\n- Reward tiers are clearly defined and automatically applied.\n- Rewards have configurable expiration dates and usage limits.\n\n## 4. Referral Communication Tools\n\n### User Story:\nAs a user, I want easy-to-use tools to share my referral link and invite others to the platform.\n\n### System Requirements:\n4.1. The system shall provide customizable email templates for referral invitations.\n4.2. The system shall integrate with major social media platforms for one-click sharing.\n4.3. The system shall send in-app notifications for successful referrals.\n\n### Acceptance Criteria:\n- Users can customize and send referral invitation emails directly from the platform.\n- Referral links can be shared on at least three major social media platforms with pre-filled content.\n- Users receive real-time notifications when their referrals sign up or make a purchase.\n\n## 5. Analytics and Reporting\n\n### User Story:\nAs an admin, I want comprehensive analytics and reporting tools to monitor the referral program's performance.\n\n### System Requirements:\n5.1. The system shall provide a referral program performance dashboard.\n5.2. The system shall generate individual user referral statistics.\n5.3. The system shall calculate and display conversion rates and ROI for the referral program.\n\n### Acceptance Criteria:\n- Admin dashboard displays key metrics including total referrals, conversion rate, and program ROI.\n- Individual user referral reports are available and exportable.\n- Analytics data is updated in real-time and can be filtered by date range.\n\n## 6. Admin Management Interface\n\n### User Story:\nAs an admin, I want a robust management interface to configure and oversee the referral program.\n\n### System Requirements:\n6.1. The system shall provide an interface to configure referral program parameters.\n6.2. The system shall allow admins to manage and approve rewards.\n6.3. The system shall provide tools to monitor and moderate referral activities.\n\n### Acceptance Criteria:\n- Admins can adjust reward structures, expiration dates, and program rules through the interface.\n- Reward approvals can be automated or manually reviewed based on configurable criteria.\n- Admins can view, filter, and export detailed referral activity logs" + } + ], + "stop_reason": "max_tokens", + "stop_sequence": null, + "usage": { + "input_tokens": 1188, + "output_tokens": 1023 + } + } + } +] + +module.exports = recordedRequests; \ No newline at end of file diff --git a/tests/e2e/examples/teams/google/productSpecsTeam.requests.js b/tests/e2e/examples/teams/google/productSpecsTeam.requests.js new file mode 100644 index 0000000..a9aa750 --- /dev/null +++ b/tests/e2e/examples/teams/google/productSpecsTeam.requests.js @@ -0,0 +1,192 @@ +const recordedRequests = [ + { + "url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent", + "method": "POST", + "body": { + "generationConfig": { + "candidateCount": 1, + "stopSequences": [] + }, + "safetySettings": [], + "contents": [ + { + "role": "user", + "parts": [ + { + "text": "\n Hello, You are Emma.\n Your role is: Requirements Analyst.\n Your background is: Business Analysis.\n Your main goal is: Outline core functionalities and objectives for new features based on the founder’s input..\n Tools available for your use: No specific tools assigned.\n Task description: Analyze the founder's idea: I want to add a Referral program to our SAAS platform. and outline the necessary functionalities to implement it.\n " + }, + { + "text": "\n Hi Emma, please complete the following task: Analyze the founder's idea: I want to add a Referral program to our SAAS platform. and outline the necessary functionalities to implement it..\n Your expected output should be: \"A functional outline of the Founder Idea\".\n This is the first task, so there's no input from a previous task.\n " + } + ] + } + ] + }, + "response": { + "candidates": [ + { + "content": { + "parts": [ + { + "text": "## Functional Outline of a Referral Program for a SaaS Platform\n\n**1. Referral Program Overview**\n\n* **Objective:** Increase user acquisition and customer base by leveraging existing users to attract new customers.\n\n**2. Core Functionalities**\n\n**A. Referral Program Setup:**\n\n* **Program Name & Description:** Allow administrators to customize the name and description of the referral program.\n* **Referral Incentives:** Define the rewards offered to both the referrer and the referred user. Options could include:\n * **Discount on subscription:** Percentage off their first month/year of subscription.\n * **Credit towards platform features:** Credits for additional features or services.\n * **Gift cards or merchandise:** Incentive through partnerships.\n * **Tiered incentives:** Offer higher rewards for referring more users.\n* **Referral Link Generation:** Enable automatic generation of unique referral links for each user.\n* **Sharing Options:** Provide various sharing options for referral links, including:\n * **Social media platforms (Facebook, Twitter, LinkedIn)**\n * **Email**\n * **Copyable link**\n* **Tracking & Analytics:** Monitor the performance of the referral program:\n * **Number of referrals generated**\n * **Number of successful referrals (signups)**\n * **Overall revenue generated by the program**\n* **Program Rules & Policies:** Define terms and conditions for the program, including:\n * **Eligibility criteria:** Who can participate in the program.\n * **Redemption period:** How long referred users have to redeem their rewards.\n * **Anti-fraud measures:** Prevent abuse of the program.\n\n**B. Referral Process & User Interface:**\n\n* **Referral Link Display:** Display unique referral links prominently within the user's account.\n* **Referral Tracking:** Track the progress of referrals.\n* **Referral Incentive Claim:** Allow referred users to claim their rewards upon signing up.\n* **Referral Dashboard:** Provide a user-friendly dashboard to manage referrals and view program performance.\n* **Communication:** Automate email or in-app notifications to inform users about referral activities.\n\n**C. Integration & Security:**\n\n* **Integration with Existing Platform:** Seamless integration with the existing SaaS platform.\n* **Data Security:** Ensure the secure storage and handling of all user data.\n\n**3. Potential Future Enhancements**\n\n* **Gamification:** Introduce gamified elements like leaderboards and badges to encourage user engagement.\n* **Affiliate Program:** Explore the possibility of expanding the program to an affiliate network for higher-value rewards.\n* **Partner Integration:** Collaborate with other businesses to offer combined referral incentives.\n\n**4. Key Considerations**\n\n* **Target audience:** Understand the motivations of the target audience for participating in a referral program.\n* **Reward structure:** The incentive must be valuable enough to motivate users to refer others.\n* **Ease of use:** The referral program should be simple and straightforward for both referrers and referred users.\n* **Data analysis:** Regularly monitor the program's effectiveness and make adjustments as needed.\n\nBy implementing these functionalities, the referral program can become a powerful tool for driving user acquisition and increasing the platform's reach. \n" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "index": 0, + "safetyRatings": [ + { + "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", + "probability": "NEGLIGIBLE" + }, + { + "category": "HARM_CATEGORY_HATE_SPEECH", + "probability": "NEGLIGIBLE" + }, + { + "category": "HARM_CATEGORY_HARASSMENT", + "probability": "NEGLIGIBLE" + }, + { + "category": "HARM_CATEGORY_DANGEROUS_CONTENT", + "probability": "NEGLIGIBLE" + } + ] + } + ], + "usageMetadata": { + "promptTokenCount": 177, + "candidatesTokenCount": 692, + "totalTokenCount": 869 + } + } + }, + { + "url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent", + "method": "POST", + "body": { + "generationConfig": { + "candidateCount": 1, + "stopSequences": [] + }, + "safetySettings": [], + "contents": [ + { + "role": "user", + "parts": [ + { + "text": "\n Hello, You are Lucas.\n Your role is: Technical Writer.\n Your background is: Technical Writing.\n Your main goal is: Convert functional outlines into detailed technical specifications..\n Tools available for your use: No specific tools assigned.\n Task description: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria.\n " + }, + { + "text": "\n Hi Lucas, please complete the following task: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria..\n Your expected output should be: \"A detailed technical specifications document.\".\n Incorporate the following findings and insights from previous tasks: \"## Functional Outline of a Referral Program for a SaaS Platform\n\n**1. Referral Program Overview**\n\n* **Objective:** Increase user acquisition and customer base by leveraging existing users to attract new customers.\n\n**2. Core Functionalities**\n\n**A. Referral Program Setup:**\n\n* **Program Name & Description:** Allow administrators to customize the name and description of the referral program.\n* **Referral Incentives:** Define the rewards offered to both the referrer and the referred user. Options could include:\n * **Discount on subscription:** Percentage off their first month/year of subscription.\n * **Credit towards platform features:** Credits for additional features or services.\n * **Gift cards or merchandise:** Incentive through partnerships.\n * **Tiered incentives:** Offer higher rewards for referring more users.\n* **Referral Link Generation:** Enable automatic generation of unique referral links for each user.\n* **Sharing Options:** Provide various sharing options for referral links, including:\n * **Social media platforms (Facebook, Twitter, LinkedIn)**\n * **Email**\n * **Copyable link**\n* **Tracking & Analytics:** Monitor the performance of the referral program:\n * **Number of referrals generated**\n * **Number of successful referrals (signups)**\n * **Overall revenue generated by the program**\n* **Program Rules & Policies:** Define terms and conditions for the program, including:\n * **Eligibility criteria:** Who can participate in the program.\n * **Redemption period:** How long referred users have to redeem their rewards.\n * **Anti-fraud measures:** Prevent abuse of the program.\n\n**B. Referral Process & User Interface:**\n\n* **Referral Link Display:** Display unique referral links prominently within the user's account.\n* **Referral Tracking:** Track the progress of referrals.\n* **Referral Incentive Claim:** Allow referred users to claim their rewards upon signing up.\n* **Referral Dashboard:** Provide a user-friendly dashboard to manage referrals and view program performance.\n* **Communication:** Automate email or in-app notifications to inform users about referral activities.\n\n**C. Integration & Security:**\n\n* **Integration with Existing Platform:** Seamless integration with the existing SaaS platform.\n* **Data Security:** Ensure the secure storage and handling of all user data.\n\n**3. Potential Future Enhancements**\n\n* **Gamification:** Introduce gamified elements like leaderboards and badges to encourage user engagement.\n* **Affiliate Program:** Explore the possibility of expanding the program to an affiliate network for higher-value rewards.\n* **Partner Integration:** Collaborate with other businesses to offer combined referral incentives.\n\n**4. Key Considerations**\n\n* **Target audience:** Understand the motivations of the target audience for participating in a referral program.\n* **Reward structure:** The incentive must be valuable enough to motivate users to refer others.\n* **Ease of use:** The referral program should be simple and straightforward for both referrers and referred users.\n* **Data analysis:** Regularly monitor the program's effectiveness and make adjustments as needed.\n\nBy implementing these functionalities, the referral program can become a powerful tool for driving user acquisition and increasing the platform's reach. \n\"\n " + } + ] + } + ] + }, + "response": { + "candidates": [ + { + "content": { + "parts": [ + { + "text": "## Technical Specifications: Referral Program for SaaS Platform\n\n**1. Introduction**\n\nThis document outlines the detailed technical specifications for a referral program to be implemented within an existing SaaS platform. The program aims to increase user acquisition and customer base by leveraging existing users to attract new customers.\n\n**2. User Stories**\n\n**2.1 Referrer**\n\n* **As a user, I want to be able to easily share my unique referral link with my friends and colleagues so that they can try the platform.**\n* **As a user, I want to see how many people I have referred and track their progress towards signing up.**\n* **As a user, I want to be notified when someone I have referred signs up for the platform.**\n* **As a user, I want to be able to earn rewards for referring new users to the platform.**\n\n**2.2 Referred User**\n\n* **As a potential customer, I want to be able to sign up for the platform using a referral link to receive a special offer or discount.**\n* **As a potential customer, I want to be able to easily claim my reward upon signing up using a referral link.**\n* **As a user, I want to be able to see the referral link that brought me to the platform.**\n\n**3. System Requirements**\n\n**3.1 Functional Requirements**\n\n* **Referral Program Setup:**\n * The system should allow administrators to create and manage referral programs with custom names and descriptions.\n * The system should allow administrators to define referral incentives for both referrers and referred users. This includes options like:\n * Discount on subscription (percentage off first month/year)\n * Credit towards platform features\n * Gift cards or merchandise\n * Tiered incentives based on the number of referrals\n * The system should automatically generate unique referral links for each user.\n * The system should provide various sharing options for referral links, including:\n * Social media platforms (Facebook, Twitter, LinkedIn)\n * Email\n * Copyable link\n* **Referral Process & User Interface:**\n * The system should display unique referral links prominently within the user's account.\n * The system should track the progress of referrals and display this information to the referrer.\n * The system should allow referred users to claim their rewards upon signing up.\n * The system should provide a user-friendly dashboard for managing referrals and viewing program performance.\n * The system should send automated emails or in-app notifications to inform users about referral activities.\n* **Integration & Security:**\n * The system should seamlessly integrate with the existing SaaS platform.\n * The system should ensure the secure storage and handling of all user data.\n* **Data Analysis:**\n * The system should track key metrics related to the referral program, including:\n * Number of referrals generated\n * Number of successful referrals (signups)\n * Overall revenue generated by the program\n * The system should provide administrators with reports and dashboards to analyze this data.\n\n**3.2 Non-Functional Requirements**\n\n* **Performance:** The system should be able to handle a high volume of referral activity without impacting platform performance.\n* **Security:** The system should implement robust security measures to protect user data and prevent unauthorized access.\n* **Scalability:** The system should be scalable to accommodate growth in user base and referral activity.\n* **User Experience:** The system should be easy to use and navigate for both referrers and referred users.\n\n**4. Acceptance Criteria**\n\n**4.1 Referral Program Setup:**\n\n* **AC1:** The system should allow administrators to create a new referral program with a custom name and description.\n* **AC2:** The system should allow administrators to define different types of referral incentives.\n* **AC3:** The system should automatically generate a unique referral link for each user.\n* **AC4:** The system should allow users to share their referral links via social media, email, or a copyable link.\n\n**4.2 Referral Process & User Interface:**\n\n* **AC5:** The system should display a user's unique referral link prominently within their account.\n* **AC6:** The system should track the progress of referrals and display this information to the referrer.\n* **AC7:** The system should allow referred users to claim their rewards upon signing up.\n* **AC8:** The system should provide a user-friendly dashboard for managing referrals and viewing program performance.\n* **AC9:** The system should send automated notifications about referral activity to both referrers and referred users.\n\n**4.3 Integration & Security:**\n\n* **AC10:** The system should integrate seamlessly with the existing SaaS platform.\n* **AC11:** The system should protect user data according to industry best practices.\n\n**4.4 Data Analysis:**\n\n* **AC12:** The system should track key metrics related to the referral program, including number of referrals, successful referrals, and revenue generated.\n* **AC13:** The system should provide administrators with reports and dashboards to analyze the program's effectiveness.\n\n**5. Future Enhancements**\n\n* **Gamification:** Introduce gamified elements like leaderboards and badges to encourage user engagement.\n* **Affiliate Program:** Explore the possibility of expanding the program to an affiliate network for higher-value rewards.\n* **Partner Integration:** Collaborate with other businesses to offer combined referral incentives.\n\n**6. Conclusion**\n\nBy implementing these technical specifications, the referral program will become a powerful tool for driving user acquisition and increasing the platform's reach. Regular monitoring and data analysis will be crucial for ensuring the program's effectiveness and making necessary adjustments over time. \n" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "index": 0, + "safetyRatings": [ + { + "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", + "probability": "NEGLIGIBLE" + }, + { + "category": "HARM_CATEGORY_HATE_SPEECH", + "probability": "NEGLIGIBLE" + }, + { + "category": "HARM_CATEGORY_HARASSMENT", + "probability": "NEGLIGIBLE" + }, + { + "category": "HARM_CATEGORY_DANGEROUS_CONTENT", + "probability": "NEGLIGIBLE" + } + ] + } + ], + "usageMetadata": { + "promptTokenCount": 843, + "candidatesTokenCount": 1196, + "totalTokenCount": 2039 + } + } + }, + { + "url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent", + "method": "POST", + "body": { + "generationConfig": { + "candidateCount": 1, + "stopSequences": [] + }, + "safetySettings": [], + "contents": [ + { + "role": "user", + "parts": [ + { + "text": "\n Hello, You are Mia.\n Your role is: Validator.\n Your background is: Quality Assurance.\n Your main goal is: Ensure the specifications are accurate and complete..\n Tools available for your use: No specific tools assigned.\n Task description: Review the technical specifications to ensure they match the founder's vision and that are technically feasible.\n " + }, + { + "text": "\n Hi Mia, please complete the following task: Review the technical specifications to ensure they match the founder's vision and that are technically feasible..\n Your expected output should be: \"A validated technical specifications document ready for development. Must be in Markdown format.\".\n Incorporate the following findings and insights from previous tasks: \"## Technical Specifications: Referral Program for SaaS Platform\n\n**1. Introduction**\n\nThis document outlines the detailed technical specifications for a referral program to be implemented within an existing SaaS platform. The program aims to increase user acquisition and customer base by leveraging existing users to attract new customers.\n\n**2. User Stories**\n\n**2.1 Referrer**\n\n* **As a user, I want to be able to easily share my unique referral link with my friends and colleagues so that they can try the platform.**\n* **As a user, I want to see how many people I have referred and track their progress towards signing up.**\n* **As a user, I want to be notified when someone I have referred signs up for the platform.**\n* **As a user, I want to be able to earn rewards for referring new users to the platform.**\n\n**2.2 Referred User**\n\n* **As a potential customer, I want to be able to sign up for the platform using a referral link to receive a special offer or discount.**\n* **As a potential customer, I want to be able to easily claim my reward upon signing up using a referral link.**\n* **As a user, I want to be able to see the referral link that brought me to the platform.**\n\n**3. System Requirements**\n\n**3.1 Functional Requirements**\n\n* **Referral Program Setup:**\n * The system should allow administrators to create and manage referral programs with custom names and descriptions.\n * The system should allow administrators to define referral incentives for both referrers and referred users. This includes options like:\n * Discount on subscription (percentage off first month/year)\n * Credit towards platform features\n * Gift cards or merchandise\n * Tiered incentives based on the number of referrals\n * The system should automatically generate unique referral links for each user.\n * The system should provide various sharing options for referral links, including:\n * Social media platforms (Facebook, Twitter, LinkedIn)\n * Email\n * Copyable link\n* **Referral Process & User Interface:**\n * The system should display unique referral links prominently within the user's account.\n * The system should track the progress of referrals and display this information to the referrer.\n * The system should allow referred users to claim their rewards upon signing up.\n * The system should provide a user-friendly dashboard for managing referrals and viewing program performance.\n * The system should send automated emails or in-app notifications to inform users about referral activities.\n* **Integration & Security:**\n * The system should seamlessly integrate with the existing SaaS platform.\n * The system should ensure the secure storage and handling of all user data.\n* **Data Analysis:**\n * The system should track key metrics related to the referral program, including:\n * Number of referrals generated\n * Number of successful referrals (signups)\n * Overall revenue generated by the program\n * The system should provide administrators with reports and dashboards to analyze this data.\n\n**3.2 Non-Functional Requirements**\n\n* **Performance:** The system should be able to handle a high volume of referral activity without impacting platform performance.\n* **Security:** The system should implement robust security measures to protect user data and prevent unauthorized access.\n* **Scalability:** The system should be scalable to accommodate growth in user base and referral activity.\n* **User Experience:** The system should be easy to use and navigate for both referrers and referred users.\n\n**4. Acceptance Criteria**\n\n**4.1 Referral Program Setup:**\n\n* **AC1:** The system should allow administrators to create a new referral program with a custom name and description.\n* **AC2:** The system should allow administrators to define different types of referral incentives.\n* **AC3:** The system should automatically generate a unique referral link for each user.\n* **AC4:** The system should allow users to share their referral links via social media, email, or a copyable link.\n\n**4.2 Referral Process & User Interface:**\n\n* **AC5:** The system should display a user's unique referral link prominently within their account.\n* **AC6:** The system should track the progress of referrals and display this information to the referrer.\n* **AC7:** The system should allow referred users to claim their rewards upon signing up.\n* **AC8:** The system should provide a user-friendly dashboard for managing referrals and viewing program performance.\n* **AC9:** The system should send automated notifications about referral activity to both referrers and referred users.\n\n**4.3 Integration & Security:**\n\n* **AC10:** The system should integrate seamlessly with the existing SaaS platform.\n* **AC11:** The system should protect user data according to industry best practices.\n\n**4.4 Data Analysis:**\n\n* **AC12:** The system should track key metrics related to the referral program, including number of referrals, successful referrals, and revenue generated.\n* **AC13:** The system should provide administrators with reports and dashboards to analyze the program's effectiveness.\n\n**5. Future Enhancements**\n\n* **Gamification:** Introduce gamified elements like leaderboards and badges to encourage user engagement.\n* **Affiliate Program:** Explore the possibility of expanding the program to an affiliate network for higher-value rewards.\n* **Partner Integration:** Collaborate with other businesses to offer combined referral incentives.\n\n**6. Conclusion**\n\nBy implementing these technical specifications, the referral program will become a powerful tool for driving user acquisition and increasing the platform's reach. Regular monitoring and data analysis will be crucial for ensuring the program's effectiveness and making necessary adjustments over time. \n\"\n " + } + ] + } + ] + }, + "response": { + "candidates": [ + { + "content": { + "parts": [ + { + "text": "## Technical Specifications: Referral Program for SaaS Platform - Validated\n\n**Validation Notes:**\n\n* **Overall:** The document provides a comprehensive overview of the referral program's functionality, user stories, and technical requirements. It's well-structured and easy to follow. \n* **User Stories:** The user stories accurately capture the needs and expectations of both referrers and referred users. \n* **Functional Requirements:** The functional requirements are detailed and cover all essential aspects of the program, from setup to integration and analytics.\n* **Non-Functional Requirements:** The non-functional requirements are clearly defined and address performance, security, scalability, and user experience.\n* **Acceptance Criteria:** The acceptance criteria are specific and measurable, providing a clear roadmap for development and testing.\n* **Future Enhancements:** The document acknowledges potential future enhancements, which is a good practice for long-term planning.\n\n**Suggested Improvements:**\n\n* **Technical Details:** While the document outlines the functionality, it could benefit from adding more technical details. For example, specifying the API endpoints used for referral link generation, reward claiming, and data tracking.\n* **Security:** While security is mentioned, it's crucial to be more specific about the security measures implemented. This could include:\n * Encryption of sensitive data (referral links, user information)\n * Secure authentication mechanisms\n * Data access control policies\n * Regular security audits\n\n**Validated Technical Specifications Document:**\n\n```markdown\n## Technical Specifications: Referral Program for SaaS Platform\n\n**1. Introduction**\n\nThis document outlines the detailed technical specifications for a referral program to be implemented within an existing SaaS platform. The program aims to increase user acquisition and customer base by leveraging existing users to attract new customers.\n\n**2. User Stories**\n\n**2.1 Referrer**\n\n* **As a user, I want to be able to easily share my unique referral link with my friends and colleagues so that they can try the platform.**\n* **As a user, I want to see how many people I have referred and track their progress towards signing up.**\n* **As a user, I want to be notified when someone I have referred signs up for the platform.**\n* **As a user, I want to be able to earn rewards for referring new users to the platform.**\n\n**2.2 Referred User**\n\n* **As a potential customer, I want to be able to sign up for the platform using a referral link to receive a special offer or discount.**\n* **As a potential customer, I want to be able to easily claim my reward upon signing up using a referral link.**\n* **As a user, I want to be able to see the referral link that brought me to the platform.**\n\n**3. System Requirements**\n\n**3.1 Functional Requirements**\n\n* **Referral Program Setup:**\n * The system should allow administrators to create and manage referral programs with custom names and descriptions.\n * The system should allow administrators to define referral incentives for both referrers and referred users. This includes options like:\n * Discount on subscription (percentage off first month/year)\n * Credit towards platform features\n * Gift cards or merchandise\n * Tiered incentives based on the number of referrals\n * The system should automatically generate unique referral links for each user. The referral link generation should use a secure and unique identifier.\n * The system should provide various sharing options for referral links, including:\n * Social media platforms (Facebook, Twitter, LinkedIn)\n * Email\n * Copyable link\n* **Referral Process & User Interface:**\n * The system should display unique referral links prominently within the user's account.\n * The system should track the progress of referrals and display this information to the referrer.\n * The system should allow referred users to claim their rewards upon signing up.\n * The system should provide a user-friendly dashboard for managing referrals and viewing program performance.\n * The system should send automated emails or in-app notifications to inform users about referral activities.\n* **Integration & Security:**\n * The system should seamlessly integrate with the existing SaaS platform via secure API calls.\n * The system should ensure the secure storage and handling of all user data, including referral links and reward information. This includes:\n * **Encryption:** All sensitive data should be encrypted both in transit and at rest.\n * **Authentication:** Secure authentication mechanisms should be implemented for user access.\n * **Data Access Control:** Access to user data should be restricted based on user roles and permissions.\n * **Regular Security Audits:** Security audits should be conducted regularly to identify and mitigate potential vulnerabilities.\n* **Data Analysis:**\n * The system should track key metrics related to the referral program, including:\n * Number of referrals generated\n * Number of successful referrals (signups)\n * Overall revenue generated by the program\n * The system should provide administrators with reports and dashboards to analyze this data.\n\n**3.2 Non-Functional Requirements**\n\n* **Performance:** The system should be able to handle a high volume of referral activity without impacting platform performance.\n* **Security:** The system should implement robust security measures to protect user data and prevent unauthorized access, as outlined in the \"Integration & Security\" section above.\n* **Scalability:** The system should be scalable to accommodate growth in user base and referral activity.\n* **User Experience:** The system should be easy to use and navigate for both referrers and referred users.\n\n**4. Acceptance Criteria**\n\n**4.1 Referral Program Setup:**\n\n* **AC1:** The system should allow administrators to create a new referral program with a custom name and description.\n* **AC2:** The system should allow administrators to define different types of referral incentives.\n* **AC3:** The system should automatically generate a unique referral link for each user. The link generation should utilize secure identifiers and be tested for uniqueness.\n* **AC4:** The system should allow users to share their referral links via social media, email, or a copyable link.\n\n**4.2 Referral Process & User Interface:**\n\n* **AC5:** The system should display a user's unique referral link prominently within their account.\n* **AC6:** The system should track the progress of referrals and display this information to the referrer.\n* **AC7:** The system should allow referred users to claim their rewards upon signing up. The reward claiming process should be clearly documented and tested.\n* **AC8:** The system should provide a user-friendly dashboard for managing referrals and viewing program performance.\n* **AC9:** The system should send automated notifications about referral activity to both referrers and referred users.\n\n**4.3 Integration & Security:**\n\n* **AC10:** The system should integrate seamlessly with the existing SaaS platform via secure API calls. API endpoints and data exchange formats should be documented and tested.\n* **AC11:** The system should protect user data according to industry best practices, including encryption, authentication, and access control mechanisms as described in the \"Integration & Security\" section.\n\n**4.4 Data Analysis:**\n\n* **AC12:** The system should track key metrics related to the referral program, including number of referrals, successful referrals, and revenue generated.\n* **AC13:** The system should provide administrators with reports and dashboards to analyze the program's effectiveness.\n\n**5. Future Enhancements**\n\n* **Gamification:** Introduce gamified elements like leaderboards and badges to encourage user engagement.\n* **Affiliate Program:** Explore the possibility of expanding the program to an affiliate network for higher-value rewards.\n* **Partner Integration:** Collaborate with other businesses to offer combined referral incentives.\n\n**6. Conclusion**\n\nBy implementing these technical specifications, the referral program will become a powerful tool for driving user acquisition and increasing the platform's reach. Regular monitoring and data analysis will be crucial for ensuring the program's effectiveness and making necessary adjustments over time. \n```\n\n**Next Steps:**\n\n* This validated technical specification document is now ready for development. \n* The development team should use this document as a guide during the implementation process.\n* Regular communication between the development team and stakeholders is crucial to ensure alignment with the specifications and vision. \n" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "index": 0, + "safetyRatings": [ + { + "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", + "probability": "NEGLIGIBLE" + }, + { + "category": "HARM_CATEGORY_HATE_SPEECH", + "probability": "NEGLIGIBLE" + }, + { + "category": "HARM_CATEGORY_HARASSMENT", + "probability": "NEGLIGIBLE" + }, + { + "category": "HARM_CATEGORY_DANGEROUS_CONTENT", + "probability": "NEGLIGIBLE" + } + ] + } + ], + "usageMetadata": { + "promptTokenCount": 1349, + "candidatesTokenCount": 1735, + "totalTokenCount": 3084 + } + } + } +] +module.exports = recordedRequests; \ No newline at end of file diff --git a/tests/e2e/examples/teams/mistral/productSpecsTeam.js b/tests/e2e/examples/teams/mistral/productSpecsTeam.js new file mode 100644 index 0000000..aad0013 --- /dev/null +++ b/tests/e2e/examples/teams/mistral/productSpecsTeam.js @@ -0,0 +1,69 @@ +const { Agent, Task, Team } = require('agenticjs'); + +// Define agents +const requirementsAnalyst = new Agent({ + name: 'Emma', + role: 'Requirements Analyst', + goal: 'Outline core functionalities and objectives for new features based on the founder’s input.', + background: 'Business Analysis', + tools: [], + llmConfig: { + provider: "mistral", + model: "mistral-small", + } + +}); + +const technicalWriter = new Agent({ + name: 'Lucas', + role: 'Technical Writer', + goal: 'Convert functional outlines into detailed technical specifications.', + background: 'Technical Writing', + tools: [], + llmConfig: { + provider: "mistral", + model: "mistral-small", + } +}); + +const validator = new Agent({ + name: 'Mia', + role: 'Validator', + goal: 'Ensure the specifications are accurate and complete.', + background: 'Quality Assurance', + tools: [], + llmConfig: { + provider: "mistral", + model: "mistral-small", + } +}); + +// Define tasks +const analysisTask = new Task({ + description: `Analyze the founder's idea: {founderIdea} and outline the necessary functionalities to implement it.`, + expectedOutput: 'A functional outline of the Founder Idea', + agent: requirementsAnalyst +}); + +const writingTask = new Task({ + description: `Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria.`, + expectedOutput: 'A detailed technical specifications document.', + isDeliverable: true, + agent: technicalWriter +}); + +const validationTask = new Task({ + description: `Review the technical specifications to ensure they match the founder's vision and that are technically feasible.`, + expectedOutput: 'A validated technical specifications document ready for development. Must be in Markdown format.', + agent: validator +}); + +// Create a team +const team = new Team({ + name: 'Product Specs Team', + agents: [requirementsAnalyst, technicalWriter, validator], + tasks: [analysisTask, writingTask, validationTask], + inputs: { founderIdea: 'I want to add a Referral program to our SAAS platform.' }, // Initial input for the first task +}); + +module.exports = team; \ No newline at end of file diff --git a/tests/e2e/examples/teams/mistral/productSpecsTeam.requests.js b/tests/e2e/examples/teams/mistral/productSpecsTeam.requests.js new file mode 100644 index 0000000..345593e --- /dev/null +++ b/tests/e2e/examples/teams/mistral/productSpecsTeam.requests.js @@ -0,0 +1,136 @@ +const recordedRequests = [ + { + "url": "https://api.mistral.ai/v1/chat/completions", + "method": "POST", + "body": { + "model": "mistral-small", + "messages": [ + { + "role": "system", + "content": "\n Hello, You are Emma.\n Your role is: Requirements Analyst.\n Your background is: Business Analysis.\n Your main goal is: Outline core functionalities and objectives for new features based on the founder’s input..\n Tools available for your use: No specific tools assigned.\n Task description: Analyze the founder's idea: I want to add a Referral program to our SAAS platform. and outline the necessary functionalities to implement it.\n " + }, + { + "role": "user", + "content": "\n Hi Emma, please complete the following task: Analyze the founder's idea: I want to add a Referral program to our SAAS platform. and outline the necessary functionalities to implement it..\n Your expected output should be: \"A functional outline of the Founder Idea\".\n This is the first task, so there's no input from a previous task.\n " + } + ], + "temperature": 0.7, + "top_p": 1, + "stream": false, + "safe_prompt": false + }, + "response": { + "id": "27fbf53790cb442da95571549b357b31", + "object": "chat.completion", + "created": 1721136944, + "model": "mistral-small", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "A Functional Outline of the Founder Idea: Referral Program\n\nOverall Objective:\n\n* To create a referral program that encourages existing users to invite new users to join our SAAS platform, and rewards both the referrer and the referee for their participation.\n\nFunctional Requirements:\n\n1. User Registration:\n* Existing users should have the ability to invite new users to join the platform by providing their email addresses.\n* New users should be able to register on the platform using the referral link provided by the existing user.\n2. Referral Tracking:\n* The system should track the referrals made by each user and associate them with their respective accounts.\n* The system should provide clear visibility to the users on the status of their referrals, including the number of successful referrals, pending referrals, and rejected referrals.\n3. Rewards Management:\n* The system should provide a mechanism to define and manage the rewards for both the referrer and the referee.\n* The rewards can be in the form of discounts, free trials, or other incentives.\n* The system should automatically apply the rewards to the respective user accounts upon successful referrals.\n4. Referral Program Settings:\n* The system should provide an interface for the administrators to configure the referral program settings, such as the referral reward amount, referral limit, and referral period.\n* The system should allow the administrators to enable or disable the referral program as needed.\n5. Notifications and Communications:\n* The system should send notifications to the referrers and referees at various stages of the referral process, such as when a referral is made, when a referral is approved, and when a reward is applied.\n* The system should provide customizable email templates for the notifications.\n6. Reporting and Analytics:\n* The system should provide reports and analytics on the referral program performance, such as the number of referrals, conversion rate, and revenue generated from the referrals.\n* The system should allow the administrators to filter and export the reports as needed.\n\nNon-Functional Requirements:\n\n1. Security:\n* The system should ensure that the referral links are secure and can only be used by the intended recipients.\n* The system should protect the user data and prevent unauthorized access.\n2. Scalability:\n* The system should be able to handle a large volume of referrals and user registrations.\n* The system should be designed to support future growth and expansion of the referral program.\n3. Usability:\n* The user interface should be intuitive and easy to use.\n* The referral process should be simple and straightforward.\n4. Compatibility:\n* The system should be compatible with various devices and browsers.\n* The system should provide a mobile-responsive design.", + "tool_calls": null + }, + "finish_reason": "stop", + "logprobs": null + } + ], + "usage": { + "prompt_tokens": 202, + "total_tokens": 836, + "completion_tokens": 634 + } + } + }, + { + "url": "https://api.mistral.ai/v1/chat/completions", + "method": "POST", + "body": { + "model": "mistral-small", + "messages": [ + { + "role": "system", + "content": "\n Hello, You are Lucas.\n Your role is: Technical Writer.\n Your background is: Technical Writing.\n Your main goal is: Convert functional outlines into detailed technical specifications..\n Tools available for your use: No specific tools assigned.\n Task description: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria.\n " + }, + { + "role": "user", + "content": "\n Hi Lucas, please complete the following task: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria..\n Your expected output should be: \"A detailed technical specifications document.\".\n Incorporate the following findings and insights from previous tasks: \"A Functional Outline of the Founder Idea: Referral Program\n\nOverall Objective:\n\n* To create a referral program that encourages existing users to invite new users to join our SAAS platform, and rewards both the referrer and the referee for their participation.\n\nFunctional Requirements:\n\n1. User Registration:\n* Existing users should have the ability to invite new users to join the platform by providing their email addresses.\n* New users should be able to register on the platform using the referral link provided by the existing user.\n2. Referral Tracking:\n* The system should track the referrals made by each user and associate them with their respective accounts.\n* The system should provide clear visibility to the users on the status of their referrals, including the number of successful referrals, pending referrals, and rejected referrals.\n3. Rewards Management:\n* The system should provide a mechanism to define and manage the rewards for both the referrer and the referee.\n* The rewards can be in the form of discounts, free trials, or other incentives.\n* The system should automatically apply the rewards to the respective user accounts upon successful referrals.\n4. Referral Program Settings:\n* The system should provide an interface for the administrators to configure the referral program settings, such as the referral reward amount, referral limit, and referral period.\n* The system should allow the administrators to enable or disable the referral program as needed.\n5. Notifications and Communications:\n* The system should send notifications to the referrers and referees at various stages of the referral process, such as when a referral is made, when a referral is approved, and when a reward is applied.\n* The system should provide customizable email templates for the notifications.\n6. Reporting and Analytics:\n* The system should provide reports and analytics on the referral program performance, such as the number of referrals, conversion rate, and revenue generated from the referrals.\n* The system should allow the administrators to filter and export the reports as needed.\n\nNon-Functional Requirements:\n\n1. Security:\n* The system should ensure that the referral links are secure and can only be used by the intended recipients.\n* The system should protect the user data and prevent unauthorized access.\n2. Scalability:\n* The system should be able to handle a large volume of referrals and user registrations.\n* The system should be designed to support future growth and expansion of the referral program.\n3. Usability:\n* The user interface should be intuitive and easy to use.\n* The referral process should be simple and straightforward.\n4. Compatibility:\n* The system should be compatible with various devices and browsers.\n* The system should provide a mobile-responsive design.\"\n " + } + ], + "temperature": 0.7, + "top_p": 1, + "stream": false, + "safe_prompt": false + }, + "response": { + "id": "410dd566b0d841669d3e484c138f9ed1", + "object": "chat.completion", + "created": 1721136955, + "model": "mistral-small", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "Hello,\n\nHere is the detailed technical specification based on the functional outline provided for the referral program:\n\n**1. User Registration**\n\n* Existing users should have the ability to invite new users to join the platform by providing their email addresses through a referral form integrated into the user interface.\n* New users should be able to register on the platform using the referral link provided by the existing user. The referral link should contain a unique identifier to associate the new user with the referrer.\n\n**2. Referral Tracking**\n\n* The system should track the referrals made by each user and associate them with their respective accounts using the unique identifier included in the referral link.\n* The system should provide clear visibility to the users on the status of their referrals through a dedicated section in their account interface, including the number of successful referrals, pending referrals, and rejected referrals, as well as the reason for rejection when applicable.\n\n**3. Rewards Management**\n\n* The system should provide a mechanism to define and manage the rewards for both the referrer and the referee, which can include discounts, free trials, or other incentives.\n* The system should automatically apply the rewards to the respective user accounts upon successful referrals, with clear indication of the reward applied and its validity period.\n\n**4. Referral Program Settings**\n\n* The system should provide an interface for the administrators to configure the referral program settings, such as the referral reward amount, referral limit, and referral period.\n* The system should allow the administrators to enable or disable the referral program as needed, with clear indication of the current status in the administrator interface.\n\n**5. Notifications and Communications**\n\n* The system should send notifications to the referrers and referees at various stages of the referral process, such as when a referral is made, when a referral is approved, and when a reward is applied.\n* The system should provide customizable email templates for the notifications, including the ability to modify the subject line, body, and sender information.\n\n**6. Reporting and Analytics**\n\n* The system should provide reports and analytics on the referral program performance, including the number of referrals, conversion rate, and revenue generated from the referrals.\n* The system should allow the administrators to filter and export the reports as needed, in a format compatible with common spreadsheet software.\n\n**Non-Functional Requirements**\n\n* The system should ensure that the referral links are secure and can only be used by the intended recipients, by implementing encryption and verification measures.\n* The system should protect the user data and prevent unauthorized access, by implementing industry-standard security measures such as firewalls, access controls, and encryption.\n* The system should be able to handle a large volume of referrals and user registrations, by implementing load balancing, caching, and other performance optimization measures.\n* The system should be designed to support future growth and expansion of the referral program, by implementing modular and scalable architecture.\n* The user interface should be intuitive and easy to use, with clear instructions and prompts throughout the referral process.\n* The system should be compatible with various devices and browsers, by implementing responsive design and cross-browser compatibility measures.\n\nI hope this technical specification meets your expectations. Please let me know if you have any questions or need further clarification on any of the points.\n\nBest regards,\n\nLucas, Technical Writer", + "tool_calls": null + }, + "finish_reason": "stop", + "logprobs": null + } + ], + "usage": { + "prompt_tokens": 802, + "total_tokens": 1578, + "completion_tokens": 776 + } + } + }, + { + "url": "https://api.mistral.ai/v1/chat/completions", + "method": "POST", + "body": { + "model": "mistral-small", + "messages": [ + { + "role": "system", + "content": "\n Hello, You are Mia.\n Your role is: Validator.\n Your background is: Quality Assurance.\n Your main goal is: Ensure the specifications are accurate and complete..\n Tools available for your use: No specific tools assigned.\n Task description: Review the technical specifications to ensure they match the founder's vision and that are technically feasible.\n " + }, + { + "role": "user", + "content": "\n Hi Mia, please complete the following task: Review the technical specifications to ensure they match the founder's vision and that are technically feasible..\n Your expected output should be: \"A validated technical specifications document ready for development. Must be in Markdown format.\".\n Incorporate the following findings and insights from previous tasks: \"Hello,\n\nHere is the detailed technical specification based on the functional outline provided for the referral program:\n\n**1. User Registration**\n\n* Existing users should have the ability to invite new users to join the platform by providing their email addresses through a referral form integrated into the user interface.\n* New users should be able to register on the platform using the referral link provided by the existing user. The referral link should contain a unique identifier to associate the new user with the referrer.\n\n**2. Referral Tracking**\n\n* The system should track the referrals made by each user and associate them with their respective accounts using the unique identifier included in the referral link.\n* The system should provide clear visibility to the users on the status of their referrals through a dedicated section in their account interface, including the number of successful referrals, pending referrals, and rejected referrals, as well as the reason for rejection when applicable.\n\n**3. Rewards Management**\n\n* The system should provide a mechanism to define and manage the rewards for both the referrer and the referee, which can include discounts, free trials, or other incentives.\n* The system should automatically apply the rewards to the respective user accounts upon successful referrals, with clear indication of the reward applied and its validity period.\n\n**4. Referral Program Settings**\n\n* The system should provide an interface for the administrators to configure the referral program settings, such as the referral reward amount, referral limit, and referral period.\n* The system should allow the administrators to enable or disable the referral program as needed, with clear indication of the current status in the administrator interface.\n\n**5. Notifications and Communications**\n\n* The system should send notifications to the referrers and referees at various stages of the referral process, such as when a referral is made, when a referral is approved, and when a reward is applied.\n* The system should provide customizable email templates for the notifications, including the ability to modify the subject line, body, and sender information.\n\n**6. Reporting and Analytics**\n\n* The system should provide reports and analytics on the referral program performance, including the number of referrals, conversion rate, and revenue generated from the referrals.\n* The system should allow the administrators to filter and export the reports as needed, in a format compatible with common spreadsheet software.\n\n**Non-Functional Requirements**\n\n* The system should ensure that the referral links are secure and can only be used by the intended recipients, by implementing encryption and verification measures.\n* The system should protect the user data and prevent unauthorized access, by implementing industry-standard security measures such as firewalls, access controls, and encryption.\n* The system should be able to handle a large volume of referrals and user registrations, by implementing load balancing, caching, and other performance optimization measures.\n* The system should be designed to support future growth and expansion of the referral program, by implementing modular and scalable architecture.\n* The user interface should be intuitive and easy to use, with clear instructions and prompts throughout the referral process.\n* The system should be compatible with various devices and browsers, by implementing responsive design and cross-browser compatibility measures.\n\nI hope this technical specification meets your expectations. Please let me know if you have any questions or need further clarification on any of the points.\n\nBest regards,\n\nLucas, Technical Writer\"\n " + } + ], + "temperature": 0.7, + "top_p": 1, + "stream": false, + "safe_prompt": false + }, + "response": { + "id": "5d5f2c5febcb450392ae4a7df661eab9", + "object": "chat.completion", + "created": 1721136963, + "model": "mistral-small", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "Hello, I have reviewed the technical specifications for the referral program as provided by Lucas, the Technical Writer. After thorough examination, I can confirm that the specifications accurately match the founder's vision and are technically feasible. Here are some key observations that support my validation:\n\n1. User Registration: The specification outlines a seamless process for existing users to invite new users through email, with unique referral links for tracking and reward allocation.\n2. Referral Tracking: The system will maintain clear records of referrals, tied to individual user accounts, with real-time status updates and rejection reasons when applicable.\n3. Rewards Management: A well-defined reward system for both referrer and referee is established, with automatic application upon successful referral and clear indication of reward validity.\n4. Referral Program Settings: The administrative interface allows for easy configuration of referral program settings, including reward amounts, referral limits, and periods, along with enabling/disabling the referral program as needed.\n5. Notifications and Communications: Notifications will be sent at various stages of the referral process, with customizable email templates available for fine-tuning.\n6. Reporting and Analytics: The system will provide essential performance metrics, such as the number of referrals, conversion rates, and revenue generated from referrals, with filtering and export capabilities.\n\nNon-Functional Requirements: Security, user data protection, performance optimization, modular architecture, user-friendly interface, and cross-browser compatibility have been addressed in the specification.\n\nPlease find attached the validated technical specifications document in Markdown format, ready for development. Should you require any further information or clarification, please do not hesitate to contact me.\n\nBest regards,\n\nMia, Validator\nQuality Assurance Background\nThe goal is to ensure specifications are accurate and complete.", + "tool_calls": null + }, + "finish_reason": "stop", + "logprobs": null + } + ], + "usage": { + "prompt_tokens": 952, + "total_tokens": 1359, + "completion_tokens": 407 + } + } + } +]; + +module.exports = recordedRequests; \ No newline at end of file diff --git a/tests/e2e/examples/teams/openai/productSpecsTeam.requests.js b/tests/e2e/examples/teams/openai/productSpecsTeam.requests.js index 89e02ba..e9bf381 100644 --- a/tests/e2e/examples/teams/openai/productSpecsTeam.requests.js +++ b/tests/e2e/examples/teams/openai/productSpecsTeam.requests.js @@ -13,34 +13,34 @@ const recordedRequests = [ "messages": [ { "role": "system", - "content": "\n Hello, You are Emma.\n Your role is: Requirements Analyst.\n Your background is: Business Analysis.\n Your main goal is: Outline core functionalities and objectives for new features based on the founder’s input..\n Tools available for your use: No specific tools assigned.\n Task description: Analyze the founder's idea: {founderIdea} and outline the necessary functionalities to implement it.\n " + "content": "\n Hello, You are Emma.\n Your role is: Requirements Analyst.\n Your background is: Business Analysis.\n Your main goal is: Outline core functionalities and objectives for new features based on the founder’s input..\n Tools available for your use: No specific tools assigned.\n Task description: Analyze the founder's idea: I want to add a Referral program to our SAAS platform. and outline the necessary functionalities to implement it.\n " }, { "role": "user", - "content": "\n Hi Emma, please complete the following task: Analyze the founder's idea: {founderIdea} and outline the necessary functionalities to implement it..\n Your expected output should be: \"A functional outline of the Founder Idea\".\n This is the first task, so there's no input from a previous task.\n " + "content": "\n Hi Emma, please complete the following task: Analyze the founder's idea: I want to add a Referral program to our SAAS platform. and outline the necessary functionalities to implement it..\n Your expected output should be: \"A functional outline of the Founder Idea\".\n This is the first task, so there's no input from a previous task.\n " } ] }, "response": { - "id": "chatcmpl-9lPSD47SyJQtuAuvzStRaM8lk6qPW", + "id": "chatcmpl-9lag66IMf6F1rCXPwARPWylnYlgmt", "object": "chat.completion", - "created": 1721086289, + "created": 1721129434, "model": "gpt-3.5-turbo-0125", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "Based on the founder's idea: {founderIdea}, here is the functional outline:\n\n1. User Registration and Account Creation:\n - Allow users to register for an account.\n - Collect necessary information for account creation.\n - Implement email verification for account security.\n\n2. Create and Post Content:\n - Provide users with the ability to create and post content.\n - Include options for text, images, and possibly videos.\n - Implement a user-friendly editor for content creation.\n\n3. Interactions and Engagement:\n - Allow users to like, comment, and share posts.\n - Implement a notification system for user interactions.\n - Include features for following other users and receiving updates.\n\n4. Explore and Discover:\n - Provide a platform for users to explore and discover new content.\n - Implement search and filtering functionalities for content discovery.\n - Include trending and recommended content sections.\n\n5. User Profiles and Settings:\n - Allow users to customize their profiles.\n - Include settings for privacy, notifications, and account management.\n - Display user activity and interactions on their profiles.\n\n6. Reporting and Moderation:\n - Implement reporting functionalities for inappropriate content.\n - Provide moderation tools for managing user-generated content.\n - Ensure a safe and respectful environment for users.\n\n7. Analytics and Insights:\n - Include analytics for tracking user engagement and content performance.\n - Provide insights for users to understand their audience and reach.\n - Implement data-driven improvements based on user behavior.\n\nThis functional outline captures the core functionalities needed to implement the founder's idea effectively." + "content": "**Functional Outline of the Founder Idea: Referral Program for SAAS Platform**\n\n1. **User Registration and Account Creation:**\n - Allow new users to easily register and create accounts on the SAAS platform.\n - Include referral code/promo code field during registration.\n\n2. **Referral Tracking and Management:**\n - Generate unique referral links for existing users to share with potential referrals.\n - Track referrals using these unique links to attribute successful referrals.\n - Provide a dashboard for users to monitor their referral activities and rewards.\n\n3. **Incentives and Rewards System:**\n - Define rewards for successful referrals, such as discounts, credits, or premium features.\n - Automatically apply rewards to user accounts when referrals meet specified criteria.\n\n4. **Communication and Notifications:**\n - Send automated emails or notifications to users for successful referrals and reward notifications.\n - Provide updates on referral program performance and upcoming promotions.\n\n5. **Analytics and Reporting:**\n - Generate reports on referral program effectiveness, including conversion rates, ROI, and user engagement.\n - Utilize analytics to refine the referral program and optimize results over time.\n\n6. **Integration and Compatibility:**\n - Integrate referral program functionalities seamlessly into the existing SAAS platform interface.\n - Ensure compatibility with different devices and operating systems for a smooth user experience.\n\n7. **Terms and Conditions:**\n - Establish clear terms and conditions for the referral program to avoid misuse and confusion.\n - Include guidelines on eligibility, rewards distribution, and program modifications.\n\n8. **Customer Support and Assistance:**\n - Provide reliable customer support for users with questions or issues related to the referral program.\n - Offer assistance in setting up referral links, tracking referrals, and claiming rewards.\n\n9. **Testing and Quality Assurance:**\n - Conduct thorough testing of the referral program functionalities to identify and resolve any bugs or errors.\n - Ensure the program functions correctly across different scenarios and user interactions.\n\n10. **Feedback Collection and Improvements:**\n - Solicit feedback from users on their experience with the referral program.\n - Use feedback to make continuous improvements and enhancements to the program.\n\nOverall, implementing a robust referral program on our SAAS platform will not only encourage user engagement and growth but also create a rewarding experience for our users and enhance brand loyalty." }, "logprobs": null, "finish_reason": "stop" } ], "usage": { - "prompt_tokens": 162, - "completion_tokens": 317, - "total_tokens": 479 + "prompt_tokens": 178, + "completion_tokens": 468, + "total_tokens": 646 }, "system_fingerprint": null } @@ -63,30 +63,30 @@ const recordedRequests = [ }, { "role": "user", - "content": "\n Hi Lucas, please complete the following task: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria..\n Your expected output should be: \"A detailed technical specifications document.\".\n Incorporate the following findings and insights from previous tasks: \"Based on the founder's idea: {founderIdea}, here is the functional outline:\n\n1. User Registration and Account Creation:\n - Allow users to register for an account.\n - Collect necessary information for account creation.\n - Implement email verification for account security.\n\n2. Create and Post Content:\n - Provide users with the ability to create and post content.\n - Include options for text, images, and possibly videos.\n - Implement a user-friendly editor for content creation.\n\n3. Interactions and Engagement:\n - Allow users to like, comment, and share posts.\n - Implement a notification system for user interactions.\n - Include features for following other users and receiving updates.\n\n4. Explore and Discover:\n - Provide a platform for users to explore and discover new content.\n - Implement search and filtering functionalities for content discovery.\n - Include trending and recommended content sections.\n\n5. User Profiles and Settings:\n - Allow users to customize their profiles.\n - Include settings for privacy, notifications, and account management.\n - Display user activity and interactions on their profiles.\n\n6. Reporting and Moderation:\n - Implement reporting functionalities for inappropriate content.\n - Provide moderation tools for managing user-generated content.\n - Ensure a safe and respectful environment for users.\n\n7. Analytics and Insights:\n - Include analytics for tracking user engagement and content performance.\n - Provide insights for users to understand their audience and reach.\n - Implement data-driven improvements based on user behavior.\n\nThis functional outline captures the core functionalities needed to implement the founder's idea effectively.\"\n " + "content": "\n Hi Lucas, please complete the following task: Create detailed technical specifications based on the functional outline provided. Include user stories, system requirements, and acceptance criteria..\n Your expected output should be: \"A detailed technical specifications document.\".\n Incorporate the following findings and insights from previous tasks: \"**Functional Outline of the Founder Idea: Referral Program for SAAS Platform**\n\n1. **User Registration and Account Creation:**\n - Allow new users to easily register and create accounts on the SAAS platform.\n - Include referral code/promo code field during registration.\n\n2. **Referral Tracking and Management:**\n - Generate unique referral links for existing users to share with potential referrals.\n - Track referrals using these unique links to attribute successful referrals.\n - Provide a dashboard for users to monitor their referral activities and rewards.\n\n3. **Incentives and Rewards System:**\n - Define rewards for successful referrals, such as discounts, credits, or premium features.\n - Automatically apply rewards to user accounts when referrals meet specified criteria.\n\n4. **Communication and Notifications:**\n - Send automated emails or notifications to users for successful referrals and reward notifications.\n - Provide updates on referral program performance and upcoming promotions.\n\n5. **Analytics and Reporting:**\n - Generate reports on referral program effectiveness, including conversion rates, ROI, and user engagement.\n - Utilize analytics to refine the referral program and optimize results over time.\n\n6. **Integration and Compatibility:**\n - Integrate referral program functionalities seamlessly into the existing SAAS platform interface.\n - Ensure compatibility with different devices and operating systems for a smooth user experience.\n\n7. **Terms and Conditions:**\n - Establish clear terms and conditions for the referral program to avoid misuse and confusion.\n - Include guidelines on eligibility, rewards distribution, and program modifications.\n\n8. **Customer Support and Assistance:**\n - Provide reliable customer support for users with questions or issues related to the referral program.\n - Offer assistance in setting up referral links, tracking referrals, and claiming rewards.\n\n9. **Testing and Quality Assurance:**\n - Conduct thorough testing of the referral program functionalities to identify and resolve any bugs or errors.\n - Ensure the program functions correctly across different scenarios and user interactions.\n\n10. **Feedback Collection and Improvements:**\n - Solicit feedback from users on their experience with the referral program.\n - Use feedback to make continuous improvements and enhancements to the program.\n\nOverall, implementing a robust referral program on our SAAS platform will not only encourage user engagement and growth but also create a rewarding experience for our users and enhance brand loyalty.\"\n " } ] }, "response": { - "id": "chatcmpl-9lPSHNFUAHBCtYMCnQErpUsWXHAAU", + "id": "chatcmpl-9lagBmZ9k0zBg6IKAv5G0BSyCQQfV", "object": "chat.completion", - "created": 1721086293, + "created": 1721129439, "model": "gpt-3.5-turbo-0125", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "# Detailed Technical Specifications Document\n\n## User Stories:\n1. As a new user, I want to register for an account to access the platform.\n2. As a user, I want to create and post various types of content, including text, images, and possibly videos.\n3. As a user, I want to interact with other users by liking, commenting, and sharing posts.\n4. As a user, I want to explore and discover new content easily through search and filtering functionalities.\n5. As a user, I want to customize my profile, manage settings, and view my activity and interactions.\n6. As a user, I want to report inappropriate content and have moderation tools available.\n7. As a user, I want access to analytics to track user engagement and understand content performance.\n\n## System Requirements:\n\n### User Registration and Account Creation:\n- Users should be able to register using a valid email address and password.\n- The system must collect necessary information for account creation, including username, date of birth, etc.\n- Email verification must be implemented to ensure account security.\n\n### Create and Post Content:\n- Users should have access to a user-friendly editor for creating and posting content.\n- The platform must support different content types such as text, images, and videos.\n- Content creation should be seamless and intuitive for users.\n\n### Interactions and Engagement:\n- Users should be able to like, comment, and share posts easily.\n- A notification system must be in place to alert users of interactions.\n- Features for following other users and receiving updates should be included.\n\n### Explore and Discover:\n- The platform should provide search and filtering functionalities for users to discover new content.\n- Trending and recommended content sections should be available for users to explore.\n- Content discovery should be an engaging experience for users.\n\n### User Profiles and Settings:\n- Users should be able to customize their profiles with personal information and preferences.\n- Settings for privacy, notifications, and account management must be accessible.\n- User activity and interactions should be displayed on user profiles for easy tracking.\n\n### Reporting and Moderation:\n- Reporting functionalities must be implemented for users to flag inappropriate content.\n- Moderation tools should be available for managing user-generated content effectively.\n- The platform must ensure a safe and respectful environment for all users.\n\n### Analytics and Insights:\n- The system should include analytics for tracking user engagement and content performance.\n- Insights should be provided to users to help them understand their audience and reach.\n- Data-driven improvements based on user behavior should be implemented to enhance the platform.\n\n## Acceptance Criteria:\n- Users should be able to successfully register and verify their accounts.\n- Content creation should support text, images, and videos without any issues.\n- Interactions like liking, commenting, and sharing should function smoothly.\n- Search and filtering functionalities should accurately display relevant content.\n- User profiles must showcase personal information and activity effectively.\n- Reporting inappropriate content and moderation actions should be resolved efficiently.\n- Analytics should provide valuable insights into user engagement and content performance.\n\nThis detailed technical specifications document outlines the user stories, system requirements, and acceptance criteria based on the functional outline provided by the founder's idea." + "content": "# Detailed Technical Specifications Document\n\n## User Stories:\n1. As a new user, I want to easily register and create an account on the SAAS platform.\n2. As an existing user, I want to have a referral code/promo code field available during registration.\n3. As an existing user, I want to generate unique referral links to share with potential referrals.\n4. As an existing user, I want to track successful referrals using unique links.\n5. As a user, I want to have a dashboard to monitor my referral activities and rewards.\n6. As a user, I want to receive rewards for successful referrals, such as discounts, credits, or premium features.\n7. As a user, I want rewards to be automatically applied to my account when referrals meet specified criteria.\n8. As a user, I want to receive automated emails or notifications for successful referrals and reward notifications.\n9. As a user, I want updates on referral program performance and upcoming promotions.\n10. As a user, I want to access reports on referral program effectiveness, conversion rates, ROI, and user engagement.\n11. As a user, I want the referral program seamlessly integrated into the existing SAAS platform interface.\n12. As a user, I want the referral program to be compatible with different devices and operating systems.\n13. As a user, I want clear terms and conditions for the referral program to avoid misuse and confusion.\n14. As a user, I want reliable customer support for questions or issues related to the referral program.\n15. As a user, I want assistance in setting up referral links, tracking referrals, and claiming rewards.\n16. As a user, I want thorough testing of the referral program functionalities to ensure bug-free operation.\n17. As a user, I want the program to function correctly across different scenarios and user interactions.\n18. As a user, I want to provide feedback on my experience with the referral program to help improve it continuously.\n\n## System Requirements:\n1. User Registration and Account Creation:\n - Web-based registration form with fields for necessary user information.\n - Database to store user account details securely.\n2. Referral Tracking and Management:\n - Algorithm to generate unique referral links for each user.\n - Database to track referral activities and successful referrals.\n3. Incentives and Rewards System:\n - Logic to define and apply rewards based on referral criteria.\n - Secure mechanism to apply rewards to user accounts.\n4. Communication and Notifications:\n - Email or notification system for automated communications.\n - Notification triggers for successful referrals and reward notifications.\n5. Analytics and Reporting:\n - Reporting module to generate reports on referral program effectiveness.\n - Analytics tools for monitoring conversion rates, ROI, and user engagement.\n6. Integration and Compatibility:\n - Interface design for seamless integration with existing SAAS platform.\n - Testing on different devices and operating systems for compatibility.\n7. Terms and Conditions:\n - Legal documentation for clear terms and conditions of the referral program.\n - Guidelines on eligibility, rewards distribution, and program modifications.\n8. Customer Support and Assistance:\n - Helpdesk system for providing customer support on the referral program.\n - Assistance tools for setting up referral links, tracking referrals, and claiming rewards.\n9. Testing and Quality Assurance:\n - Test cases and scenarios for comprehensive testing of referral program functionalities.\n - Bug tracking system for identifying and resolving errors.\n10. Feedback Collection and Improvements:\n - Feedback collection mechanism for user input on the referral program.\n - Process for implementing continuous improvements based on feedback.\n\n## Acceptance Criteria:\n- The user registration process should be completed within 2 minutes.\n- Unique referral links should be generated accurately and track referrals successfully.\n- Rewards should be applied automatically once referral criteria are met.\n- Users should receive email notifications for successful referrals and rewards.\n- Reports on referral program effectiveness should be accessible within the dashboard.\n- The referral program interface should be seamless with the existing platform.\n- Compliance with terms and conditions should be enforced throughout the program.\n- Customer support inquiries should be resolved within 24 hours.\n- The referral program should function without errors across different devices and operating systems.\n- Continuous feedback should be gathered and implemented for program improvements.\n\nBy following these detailed technical specifications, the referral program on our SAAS platform will be effectively implemented to encourage user engagement, growth, and brand loyalty." }, "logprobs": null, "finish_reason": "stop" } ], "usage": { - "prompt_tokens": 467, - "completion_tokens": 631, - "total_tokens": 1098 + "prompt_tokens": 617, + "completion_tokens": 881, + "total_tokens": 1498 }, "system_fingerprint": null } @@ -109,30 +109,30 @@ const recordedRequests = [ }, { "role": "user", - "content": "\n Hi Mia, please complete the following task: Review the technical specifications to ensure they match the founder's vision and that are technically feasible..\n Your expected output should be: \"A validated technical specifications document ready for development. Must be in Markdown format.\".\n Incorporate the following findings and insights from previous tasks: \"# Detailed Technical Specifications Document\n\n## User Stories:\n1. As a new user, I want to register for an account to access the platform.\n2. As a user, I want to create and post various types of content, including text, images, and possibly videos.\n3. As a user, I want to interact with other users by liking, commenting, and sharing posts.\n4. As a user, I want to explore and discover new content easily through search and filtering functionalities.\n5. As a user, I want to customize my profile, manage settings, and view my activity and interactions.\n6. As a user, I want to report inappropriate content and have moderation tools available.\n7. As a user, I want access to analytics to track user engagement and understand content performance.\n\n## System Requirements:\n\n### User Registration and Account Creation:\n- Users should be able to register using a valid email address and password.\n- The system must collect necessary information for account creation, including username, date of birth, etc.\n- Email verification must be implemented to ensure account security.\n\n### Create and Post Content:\n- Users should have access to a user-friendly editor for creating and posting content.\n- The platform must support different content types such as text, images, and videos.\n- Content creation should be seamless and intuitive for users.\n\n### Interactions and Engagement:\n- Users should be able to like, comment, and share posts easily.\n- A notification system must be in place to alert users of interactions.\n- Features for following other users and receiving updates should be included.\n\n### Explore and Discover:\n- The platform should provide search and filtering functionalities for users to discover new content.\n- Trending and recommended content sections should be available for users to explore.\n- Content discovery should be an engaging experience for users.\n\n### User Profiles and Settings:\n- Users should be able to customize their profiles with personal information and preferences.\n- Settings for privacy, notifications, and account management must be accessible.\n- User activity and interactions should be displayed on user profiles for easy tracking.\n\n### Reporting and Moderation:\n- Reporting functionalities must be implemented for users to flag inappropriate content.\n- Moderation tools should be available for managing user-generated content effectively.\n- The platform must ensure a safe and respectful environment for all users.\n\n### Analytics and Insights:\n- The system should include analytics for tracking user engagement and content performance.\n- Insights should be provided to users to help them understand their audience and reach.\n- Data-driven improvements based on user behavior should be implemented to enhance the platform.\n\n## Acceptance Criteria:\n- Users should be able to successfully register and verify their accounts.\n- Content creation should support text, images, and videos without any issues.\n- Interactions like liking, commenting, and sharing should function smoothly.\n- Search and filtering functionalities should accurately display relevant content.\n- User profiles must showcase personal information and activity effectively.\n- Reporting inappropriate content and moderation actions should be resolved efficiently.\n- Analytics should provide valuable insights into user engagement and content performance.\n\nThis detailed technical specifications document outlines the user stories, system requirements, and acceptance criteria based on the functional outline provided by the founder's idea.\"\n " + "content": "\n Hi Mia, please complete the following task: Review the technical specifications to ensure they match the founder's vision and that are technically feasible..\n Your expected output should be: \"A validated technical specifications document ready for development. Must be in Markdown format.\".\n Incorporate the following findings and insights from previous tasks: \"# Detailed Technical Specifications Document\n\n## User Stories:\n1. As a new user, I want to easily register and create an account on the SAAS platform.\n2. As an existing user, I want to have a referral code/promo code field available during registration.\n3. As an existing user, I want to generate unique referral links to share with potential referrals.\n4. As an existing user, I want to track successful referrals using unique links.\n5. As a user, I want to have a dashboard to monitor my referral activities and rewards.\n6. As a user, I want to receive rewards for successful referrals, such as discounts, credits, or premium features.\n7. As a user, I want rewards to be automatically applied to my account when referrals meet specified criteria.\n8. As a user, I want to receive automated emails or notifications for successful referrals and reward notifications.\n9. As a user, I want updates on referral program performance and upcoming promotions.\n10. As a user, I want to access reports on referral program effectiveness, conversion rates, ROI, and user engagement.\n11. As a user, I want the referral program seamlessly integrated into the existing SAAS platform interface.\n12. As a user, I want the referral program to be compatible with different devices and operating systems.\n13. As a user, I want clear terms and conditions for the referral program to avoid misuse and confusion.\n14. As a user, I want reliable customer support for questions or issues related to the referral program.\n15. As a user, I want assistance in setting up referral links, tracking referrals, and claiming rewards.\n16. As a user, I want thorough testing of the referral program functionalities to ensure bug-free operation.\n17. As a user, I want the program to function correctly across different scenarios and user interactions.\n18. As a user, I want to provide feedback on my experience with the referral program to help improve it continuously.\n\n## System Requirements:\n1. User Registration and Account Creation:\n - Web-based registration form with fields for necessary user information.\n - Database to store user account details securely.\n2. Referral Tracking and Management:\n - Algorithm to generate unique referral links for each user.\n - Database to track referral activities and successful referrals.\n3. Incentives and Rewards System:\n - Logic to define and apply rewards based on referral criteria.\n - Secure mechanism to apply rewards to user accounts.\n4. Communication and Notifications:\n - Email or notification system for automated communications.\n - Notification triggers for successful referrals and reward notifications.\n5. Analytics and Reporting:\n - Reporting module to generate reports on referral program effectiveness.\n - Analytics tools for monitoring conversion rates, ROI, and user engagement.\n6. Integration and Compatibility:\n - Interface design for seamless integration with existing SAAS platform.\n - Testing on different devices and operating systems for compatibility.\n7. Terms and Conditions:\n - Legal documentation for clear terms and conditions of the referral program.\n - Guidelines on eligibility, rewards distribution, and program modifications.\n8. Customer Support and Assistance:\n - Helpdesk system for providing customer support on the referral program.\n - Assistance tools for setting up referral links, tracking referrals, and claiming rewards.\n9. Testing and Quality Assurance:\n - Test cases and scenarios for comprehensive testing of referral program functionalities.\n - Bug tracking system for identifying and resolving errors.\n10. Feedback Collection and Improvements:\n - Feedback collection mechanism for user input on the referral program.\n - Process for implementing continuous improvements based on feedback.\n\n## Acceptance Criteria:\n- The user registration process should be completed within 2 minutes.\n- Unique referral links should be generated accurately and track referrals successfully.\n- Rewards should be applied automatically once referral criteria are met.\n- Users should receive email notifications for successful referrals and rewards.\n- Reports on referral program effectiveness should be accessible within the dashboard.\n- The referral program interface should be seamless with the existing platform.\n- Compliance with terms and conditions should be enforced throughout the program.\n- Customer support inquiries should be resolved within 24 hours.\n- The referral program should function without errors across different devices and operating systems.\n- Continuous feedback should be gathered and implemented for program improvements.\n\nBy following these detailed technical specifications, the referral program on our SAAS platform will be effectively implemented to encourage user engagement, growth, and brand loyalty.\"\n " } ] }, "response": { - "id": "chatcmpl-9lPSOdWFnXs2vWZuebv2cZWmy9Kz0", + "id": "chatcmpl-9lagN084wCtOARdquwvHy9hsbXm7h", "object": "chat.completion", - "created": 1721086300, + "created": 1721129451, "model": "gpt-3.5-turbo-0125", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "# Validated Technical Specifications Document\n\n## User Stories:\n1. As a new user, I want to register for an account to access the platform.\n2. As a user, I want to create and post various types of content, including text, images, and possibly videos.\n3. As a user, I want to interact with other users by liking, commenting, and sharing posts.\n4. As a user, I want to explore and discover new content easily through search and filtering functionalities.\n5. As a user, I want to customize my profile, manage settings, and view my activity and interactions.\n6. As a user, I want to report inappropriate content and have moderation tools available.\n7. As a user, I want access to analytics to track user engagement and understand content performance.\n\n## System Requirements:\n\n### User Registration and Account Creation:\n- Users can register using a valid email address and password.\n- The system collects necessary information for account creation, including username, date of birth, etc.\n- Email verification is implemented to ensure account security.\n\n### Create and Post Content:\n- Users have access to a user-friendly editor for creating and posting content.\n- The platform supports different content types such as text, images, and videos.\n- Content creation is seamless and intuitive for users.\n\n### Interactions and Engagement:\n- Users can like, comment, and share posts easily.\n- A notification system alerts users of interactions.\n- Features for following other users and receiving updates are included.\n\n### Explore and Discover:\n- The platform provides search and filtering functionalities for users to discover new content.\n- Trending and recommended content sections are available for users to explore.\n- Content discovery is engaging for users.\n\n### User Profiles and Settings:\n- Users can customize their profiles with personal information and preferences.\n- Settings for privacy, notifications, and account management are accessible.\n- User activity and interactions are displayed on user profiles for easy tracking.\n\n### Reporting and Moderation:\n- Reporting functionalities are implemented for users to flag inappropriate content.\n- Moderation tools are available for managing user-generated content effectively.\n- The platform ensures a safe and respectful environment for all users.\n\n### Analytics and Insights:\n- The system includes analytics for tracking user engagement and content performance.\n- Insights are provided to users to help them understand their audience and reach.\n- Data-driven improvements based on user behavior are implemented to enhance the platform.\n\n## Acceptance Criteria:\n- Users can successfully register and verify their accounts.\n- Content creation supports text, images, and videos without any issues.\n- Interactions like liking, commenting, and sharing function smoothly.\n- Search and filtering functionalities accurately display relevant content.\n- User profiles showcase personal information and activity effectively.\n- Reporting inappropriate content and moderation actions are resolved efficiently.\n- Analytics provide valuable insights into user engagement and content performance.\n\nThis validated technical specifications document aligns with the founder's vision and ensures technical feasibility for development." + "content": "# Validated Technical Specifications Document\n\n## User Stories:\n1. As a new user, I want to easily register and create an account on the SAAS platform.\n2. As an existing user, I want to have a referral code/promo code field available during registration.\n3. As an existing user, I want to generate unique referral links to share with potential referrals.\n4. As an existing user, I want to track successful referrals using unique links.\n5. As a user, I want to have a dashboard to monitor my referral activities and rewards.\n6. As a user, I want to receive rewards for successful referrals, such as discounts, credits, or premium features.\n7. As a user, I want rewards to be automatically applied to my account when referrals meet specified criteria.\n8. As a user, I want to receive automated emails or notifications for successful referrals and reward notifications.\n9. As a user, I want updates on referral program performance and upcoming promotions.\n10. As a user, I want to access reports on referral program effectiveness, conversion rates, ROI, and user engagement.\n11. As a user, I want the referral program seamlessly integrated into the existing SAAS platform interface.\n12. As a user, I want the referral program to be compatible with different devices and operating systems.\n13. As a user, I want clear terms and conditions for the referral program to avoid misuse and confusion.\n14. As a user, I want reliable customer support for questions or issues related to the referral program.\n15. As a user, I want assistance in setting up referral links, tracking referrals, and claiming rewards.\n16. As a user, I want thorough testing of the referral program functionalities to ensure bug-free operation.\n17. As a user, I want the program to function correctly across different scenarios and user interactions.\n18. As a user, I want to provide feedback on my experience with the referral program to help improve it continuously.\n\n## System Requirements:\n1. User Registration and Account Creation:\n - Web-based registration form with fields for necessary user information.\n - Database to store user account details securely.\n2. Referral Tracking and Management:\n - Algorithm to generate unique referral links for each user.\n - Database to track referral activities and successful referrals.\n3. Incentives and Rewards System:\n - Logic to define and apply rewards based on referral criteria.\n - Secure mechanism to apply rewards to user accounts.\n4. Communication and Notifications:\n - Email or notification system for automated communications.\n - Notification triggers for successful referrals and reward notifications.\n5. Analytics and Reporting:\n - Reporting module to generate reports on referral program effectiveness.\n - Analytics tools for monitoring conversion rates, ROI, and user engagement.\n6. Integration and Compatibility:\n - Interface design for seamless integration with existing SAAS platform.\n - Testing on different devices and operating systems for compatibility.\n7. Terms and Conditions:\n - Legal documentation for clear terms and conditions of the referral program.\n - Guidelines on eligibility, rewards distribution, and program modifications.\n8. Customer Support and Assistance:\n - Helpdesk system for providing customer support on the referral program.\n - Assistance tools for setting up referral links, tracking referrals, and claiming rewards.\n9. Testing and Quality Assurance:\n - Test cases and scenarios for comprehensive testing of referral program functionalities.\n - Bug tracking system for identifying and resolving errors.\n10. Feedback Collection and Improvements:\n - Feedback collection mechanism for user input on the referral program.\n - Process for implementing continuous improvements based on feedback.\n\n## Acceptance Criteria:\n- The user registration process should be completed within 2 minutes.\n- Unique referral links should be generated accurately and track referrals successfully.\n- Rewards should be applied automatically once referral criteria are met.\n- Users should receive email notifications for successful referrals and rewards.\n- Reports on referral program effectiveness should be accessible within the dashboard.\n- The referral program interface should be seamless with the existing platform.\n- Compliance with terms and conditions should be enforced throughout the program.\n- Customer support inquiries should be resolved within 24 hours.\n- The referral program should function without errors across different devices and operating systems.\n- Continuous feedback should be gathered and implemented for program improvements.\n\nBy following these detailed technical specifications, the referral program on our SAAS platform will be effectively implemented to encourage user engagement, growth, and brand loyalty." }, "logprobs": null, "finish_reason": "stop" } ], "usage": { - "prompt_tokens": 780, - "completion_tokens": 581, - "total_tokens": 1361 + "prompt_tokens": 1030, + "completion_tokens": 882, + "total_tokens": 1912 }, "system_fingerprint": null } diff --git a/tests/e2e/productSpecTeam.test.js b/tests/e2e/productSpecTeam.test.js index 457fe27..89368bf 100644 --- a/tests/e2e/productSpecTeam.test.js +++ b/tests/e2e/productSpecTeam.test.js @@ -1,85 +1,86 @@ require('dotenv').config({ path: './.env.local' }); -const openAIProducSpecsTeam = require('./examples/teams/openai/productSpecsTeam'); -const geminiAIProducSpecsTeam = require('./examples/teams/google/productSpecsTeam'); -const teamRecordedRequests = require('./examples/teams/openai/productSpecsTeam.requests'); - - - // Setup mock const { mock, record, restoreAll, getRecords } = require('../utils/moscaFetch')(); +const openAIProducSpecsTeam = require('./examples/teams/openai/productSpecsTeam'); +const openAITeamRecordedRequests = require('./examples/teams/openai/productSpecsTeam.requests'); +const geminiAIProducSpecsTeam = require('./examples/teams/google/productSpecsTeam'); +const geminiAITeamRecordedRequests = require('./examples/teams/google/productSpecsTeam.requests'); +const anthropicAIProductSpecsTeam = require('./examples/teams/anthropic/productSpecsTeam'); +const anthropicAITeamRecordedRequests = require('./examples/teams/anthropic/productSpecsTeam.requests'); +const mistralAIProductSpecsTeam = require('./examples/teams/mistral/productSpecsTeam'); +const mistralAITeamRecordedRequests = require('./examples/teams/mistral/productSpecsTeam.requests'); - -// Setting up recording -record({ - url: '*', - method: '*', - body: '*' // Record any POST request to this URL -}); - -// Later, after making some requests in your application -// const recordedData = getRecords(); -// console.log(recordedData); - - - +// Determine if mocks should be applied based on the environment +const withMockedApis = process.env.TEST_ENV === 'mocked-llm-apis' ? true : false; describe('Product Spec Team Workflows', () => { - // describe('Using OpenAI Agents', () => { - // beforeEach(() => { - // // Mocking all POST requests with a callback - // mock(teamRecordedRequests); - // }); - // afterEach(() => { - // restoreAll(); - // }); - // it('completes the entire workflow successfully', async () => { - // const result = await openAIProducSpecsTeam.start(); - // console.log(result); - // expect(result).toBeDefined(); - // expect(typeof result).toBe('string'); - // const wordCount = result.trim().split(/\s+/).length; - // expect(wordCount).toBeGreaterThan(20); - // }); - // }); + describe('Using OpenAI Agents', () => { + beforeEach(() => { + // Mocking all POST requests with a callback + withMockedApis && mock(openAITeamRecordedRequests); + }); + afterEach(() => { + withMockedApis && restoreAll(); + }); + it('completes the entire workflow successfully', async () => { + const result = await openAIProducSpecsTeam.start(); + expect(result).toBeDefined(); + expect(typeof result).toBe('string'); + const wordCount = result.trim().split(/\s+/).length; + expect(wordCount).toBeGreaterThan(20); + }); + }); describe('Using Gemini AI Agents', () => { beforeEach(() => { // Mocking all POST requests with a callback - // mock(teamRecordedRequests); + withMockedApis && mock(geminiAITeamRecordedRequests); }); afterEach(() => { - // restoreAll(); + withMockedApis && restoreAll(); }); it('completes the entire workflow successfully', async () => { - debugger; - const result = await geminiAIProducSpecsTeam.start(); - console.log(result); - // const recordedData = getRecords(); - // console.log(recordedData); + const result = await geminiAIProducSpecsTeam.start(); expect(result).toBeDefined(); expect(typeof result).toBe('string'); const wordCount = result.trim().split(/\s+/).length; expect(wordCount).toBeGreaterThan(20); }); - }); + }); - // describe('Using Anthropic Agents', () => { - // it('completes the entire workflow successfully', async () => { - // // Setup for Product Spec Team with Anthropic - // // Execute workflow - // // Assertions and expectations - // expect(true).toBeDefined(); - // }); - // }); + describe('Using Anthropic Agents', () => { + beforeEach(() => { + // Mocking all POST requests with a callback + withMockedApis && mock(anthropicAITeamRecordedRequests); + }); + afterEach(() => { + withMockedApis && restoreAll(); + }); + it('completes the entire workflow successfully', async () => { + const result = await anthropicAIProductSpecsTeam.start(); + expect(result).toBeDefined(); + expect(typeof result).toBe('string'); + const wordCount = result.trim().split(/\s+/).length; + expect(wordCount).toBeGreaterThan(20); + }); + }); + describe('Using Mistral AI Agents', () => { + beforeEach(() => { + // Mocking all POST requests with a callback + withMockedApis && mock(mistralAITeamRecordedRequests); + }); + afterEach(() => { + withMockedApis && restoreAll(); + }); + it('completes the entire workflow successfully', async () => { - // describe('Using Gemini Agents', () => { - // it('completes the entire workflow successfully', async () => { - // // Setup for Product Spec Team with Gemini - // // Execute workflow - // // Assertions and expectations - // expect(true).toBeDefined(); - // }); - // }); + const result = await mistralAIProductSpecsTeam.start(); + expect(result).toBeDefined(); + expect(typeof result).toBe('string'); + const wordCount = result.trim().split(/\s+/).length; + expect(wordCount).toBeGreaterThan(20); + }); + }); }); diff --git a/tests/utils/moscaFetch/Readme.md b/tests/utils/moscaFetch/Readme.md index 108fe33..618600a 100644 --- a/tests/utils/moscaFetch/Readme.md +++ b/tests/utils/moscaFetch/Readme.md @@ -28,7 +28,7 @@ To mock HTTP requests: mock({ url: 'https://api.example.com/data', method: 'POST', - expectedBody: '*', + body: '*', response: { key: 'value' }, callback: info => console.log('Request completed', info) }); @@ -58,11 +58,18 @@ Configuration Options To record requests for later analysis or setup: ```js +// Setting up recording record({ url: '*', method: '*', - expectedBody: '*' + body: '*' // Record any POST request to this URL }); + +// After your requests +const recordedData = getRecords(); +debugger; +console.log(recordedData); +// Then Copy/Paste the object from the console ``` #### Retrieving Records diff --git a/tests/utils/moscaFetch/index.js b/tests/utils/moscaFetch/index.js index b099ed3..d4e1d11 100644 --- a/tests/utils/moscaFetch/index.js +++ b/tests/utils/moscaFetch/index.js @@ -1,8 +1,69 @@ function moscaFetch() { let originalFetch = globalThis.fetch; // Save the original fetch function + // Step 1: Define your custom fetch function + // Define your custom fetch function + let myCustomFetch = async (input, options) => { + console.log('MoscaFetch -> Using custom fetch for:', input); + + for (const mock of mocks) { + let { body: requestBody, method: requestMethod = 'GET' } = options || {}; + requestMethod = requestMethod.toUpperCase(); + try { + requestBody = requestBody ? JSON.parse(requestBody) : undefined; + } catch (error) { + // requestBody remains unchanged if it's not JSON + } + + const urlMatches = mock.url === '*' || input === mock.url; + const methodMatches = mock.method === '*' || mock.method.toUpperCase() === requestMethod; + const bodyMatches = mock.body === '*' || JSON.stringify(requestBody) === JSON.stringify(mock.body); + + if (urlMatches && methodMatches && bodyMatches) { + if (mock.isRecorder) { + const response = await originalFetch(input, options); + const clonedResponse = response.clone(); + records.push({ + url: input, + method: requestMethod, + body: requestBody, + response: await clonedResponse.json() // Assuming JSON response + }); + if (mock.callback) { + mock.callback({ + request: { url: input, method: requestMethod, body: requestBody }, + response: response, + status: response.status + }); + } + return response; // Ensure recorders do not block the response + } else { + const mockResponse = new Response(JSON.stringify(mock.response), { + status: 200, + headers: { 'Content-Type': 'application/json' } + }); + if (mock.callback) { + mock.callback({ + request: { url: input, method: requestMethod, body: requestBody }, + response: mockResponse, + status: mockResponse.status + }); + } + return Promise.resolve(mockResponse); + } + } + } + return originalFetch(input, options); // Call the original fetch if no mocks or recorders match + }; + + // Immediately enforce custom fetch + const withMockedApis = process.env.TEST_ENV === 'mocked-llm-apis' ? true : false; + if(withMockedApis){ + // Override globalThis.fetch with your custom fetch + globalThis.fetch = myCustomFetch; + } + let mocks = []; let records = []; - function mock(mockConfigs) { // Ensure the input is always treated as an array, even if it's a single object @@ -45,58 +106,16 @@ function moscaFetch() { } function ensureFetchIsMocked() { - if (globalThis.fetch === originalFetch) { - globalThis.fetch = async (input, options) => { - for (const mock of mocks) { - let { body: requestBody, method: requestMethod = 'GET' } = options || {}; - requestMethod = requestMethod.toUpperCase(); - try { - requestBody = requestBody ? JSON.parse(requestBody) : undefined; - } catch (error) { - // requestBody remains unchanged if it's not JSON - } - - const urlMatches = mock.url === '*' || input === mock.url; - const methodMatches = mock.method === '*' || mock.method.toUpperCase() === requestMethod; - const bodyMatches = mock.body === '*' || JSON.stringify(requestBody) === JSON.stringify(mock.body); - - if (urlMatches && methodMatches && bodyMatches) { - if (mock.isRecorder) { - const response = await originalFetch(input, options); - const clonedResponse = response.clone(); - records.push({ - url: input, - method: requestMethod, - body: requestBody, - response: await clonedResponse.json() // Assuming JSON response - }); - mock.callback({ - request: { url: input, method: requestMethod, body: requestBody }, - response: mockResponse, - status: mockResponse.status - }); - return response; // Ensure recorders do not block the response - } else { - const mockResponse = new Response(JSON.stringify(mock.response), { - status: 200, - headers: { 'Content-Type': 'application/json' } - }); - if (mock.callback) { - mock.callback({ - request: { url: input, method: requestMethod, body: requestBody }, - response: mockResponse, - status: mockResponse.status - }); - } - return Promise.resolve(mockResponse); - } - } - } - return originalFetch(input, options); // Call the original fetch if no mocks or recorders match - }; + // Always ensure myCustomFetch is the global fetch + if (globalThis.fetch !== myCustomFetch) { + globalThis.fetch = myCustomFetch; } } + // Immediately enforce custom fetch + if(withMockedApis){ + ensureFetchIsMocked(); + } return { mock, record, getRecords, clearRecords, restoreAll, restoreOne }; } From b6027967679bade3bd713a77a2f09be511e156ab Mon Sep 17 00:00:00 2001 From: Dariel Date: Tue, 16 Jul 2024 10:58:25 -0400 Subject: [PATCH 3/6] chore: Update npm install command to include dev dependencies --- .github/workflows/test-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-workflow.yml b/.github/workflows/test-workflow.yml index 5d79c41..349c097 100644 --- a/.github/workflows/test-workflow.yml +++ b/.github/workflows/test-workflow.yml @@ -22,7 +22,7 @@ jobs: node-version: '14' - name: Install dependencies - run: npm install + run: npm install --also=dev - name: Build for integration tests run: npm run build:test From 533af34a7f59d10fdc494a131dbd40270aceefb4 Mon Sep 17 00:00:00 2001 From: Dariel Date: Tue, 16 Jul 2024 11:02:17 -0400 Subject: [PATCH 4/6] Adds npx to rollup --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 8639e66..5cf6ee7 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,9 @@ "module": "dist/bundle.esm.js", "unpkg": "dist/bundle.umd.js", "scripts": { - "build": "rollup -c", - "build:test": "TEST_ENV=mocked-llm-apis rollup -c", - "dev": "NODE_ENV=development rollup -c -w", + "build": "npx rollup -c", + "build:test": "TEST_ENV=mocked-llm-apis npx rollup -c", + "dev": "NODE_ENV=development npx rollup -c -w", "test": "npm run build:test && test:integration", "test:watch": "TEST_ENV=mocked-llm-apis jest --testPathPattern='tests/e2e' --watch", "test:debug": "TEST_ENV=mocked-llm-apis node --inspect-brk node_modules/.bin/jest --runInBand --verbose", From 456cd175aea8e93f6e0c487dc237006f1d5eb22b Mon Sep 17 00:00:00 2001 From: Dariel Date: Tue, 16 Jul 2024 11:04:56 -0400 Subject: [PATCH 5/6] chore: Update Node.js version to 18 in test workflow --- .github/workflows/test-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-workflow.yml b/.github/workflows/test-workflow.yml index 349c097..6877620 100644 --- a/.github/workflows/test-workflow.yml +++ b/.github/workflows/test-workflow.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v2 with: - node-version: '14' + node-version: '18' - name: Install dependencies run: npm install --also=dev From 18f53b1d188bd32c869785fe825cb677ef2ff393 Mon Sep 17 00:00:00 2001 From: Dariel Date: Tue, 16 Jul 2024 11:48:28 -0400 Subject: [PATCH 6/6] Added separated workflows for main stability and for pr checks. --- ...orkflow.yml => pr-validation-workflow.yml} | 6 +-- .../workflows/stable-main-check-workflow.yml | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) rename .github/workflows/{test-workflow.yml => pr-validation-workflow.yml} (87%) create mode 100644 .github/workflows/stable-main-check-workflow.yml diff --git a/.github/workflows/test-workflow.yml b/.github/workflows/pr-validation-workflow.yml similarity index 87% rename from .github/workflows/test-workflow.yml rename to .github/workflows/pr-validation-workflow.yml index 6877620..f807f68 100644 --- a/.github/workflows/test-workflow.yml +++ b/.github/workflows/pr-validation-workflow.yml @@ -1,11 +1,11 @@ -name: Run Tests on PR +name: PR Validation CI on: pull_request: - branches: [ main ] # Adjust based on your target branch + branches: [main] # Triggered on PRs targeting these branches jobs: - test: + build-and-test: runs-on: ubuntu-latest env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} diff --git a/.github/workflows/stable-main-check-workflow.yml b/.github/workflows/stable-main-check-workflow.yml new file mode 100644 index 0000000..d8ecf44 --- /dev/null +++ b/.github/workflows/stable-main-check-workflow.yml @@ -0,0 +1,37 @@ +name: Stable Main CI + +on: + push: + branches: [main] # Triggered on commits pushed to these branches + +jobs: + build-and-test: + runs-on: ubuntu-latest + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} + MISTRAL_API_KEY: ${{ secrets.MISTRAL_API_KEY }} + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: '18' + + - name: Install dependencies + run: npm install --also=dev + + - name: Build for integration tests + run: npm run build:test + + - name: Run integration tests + run: npm run test:integration + + - name: Build production version + run: npm run build + + - name: Run e2e tests + run: npm run test:e2e