Compare commits
15 Commits
2324440aaa
...
d2168377a7
Author | SHA1 | Date | |
---|---|---|---|
d2168377a7 | |||
6e910d09e4 | |||
4e7d86f037 | |||
ac3873c62d | |||
8d8bd5c305 | |||
7f4aedbfc8 | |||
4abeb0a0f0 | |||
fc8d2f9f32 | |||
bfd9aec103 | |||
32396aecf1 | |||
26e51e132b | |||
266eb89c5a | |||
33b0c1bec1 | |||
0d315f4bd7 | |||
be136e8c13 |
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -1,9 +1,12 @@
|
||||
{
|
||||
"cSpell.words": [
|
||||
"BOCHA",
|
||||
"bochaai",
|
||||
"bunx",
|
||||
"CEINTL",
|
||||
"Chakroun",
|
||||
"CICD",
|
||||
"cnbj",
|
||||
"commitlint",
|
||||
"dbaeumer",
|
||||
"deepseek",
|
||||
|
982
bun.lock
Normal file
982
bun.lock
Normal file
@ -0,0 +1,982 @@
|
||||
{
|
||||
"lockfileVersion": 1,
|
||||
"workspaces": {
|
||||
"": {
|
||||
"name": "egg_server",
|
||||
"dependencies": {
|
||||
"@egg/hooks": "^1.2.0",
|
||||
"@egg/lark-msg-tool": "^1.21.0",
|
||||
"@egg/logger": "^1.6.0",
|
||||
"@egg/net-tool": "^1.32.2",
|
||||
"@egg/path-tool": "^1.4.1",
|
||||
"@langchain/core": "^0.3.42",
|
||||
"@langchain/langgraph": "^0.2.56",
|
||||
"@langchain/openai": "^0.3.17",
|
||||
"joi": "^17.13.3",
|
||||
"jsdom": "^26.0.0",
|
||||
"langfuse-langchain": "^3.37.0",
|
||||
"node-schedule": "^2.1.1",
|
||||
"p-limit": "^6.2.0",
|
||||
"pocketbase": "^0.23.0",
|
||||
"uuid": "^10.0.0",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^19.8.0",
|
||||
"@commitlint/config-conventional": "^19.8.0",
|
||||
"@eslint/js": "^9.22.0",
|
||||
"@types/jsdom": "^21.1.7",
|
||||
"@types/node-schedule": "^2.1.7",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"bun-types": "^1.2.5",
|
||||
"eslint": "^9.22.0",
|
||||
"eslint-plugin-simple-import-sort": "^12.1.1",
|
||||
"eslint-plugin-unused-imports": "^4.1.4",
|
||||
"husky": "^9.1.7",
|
||||
"lint-staged": "^15.5.0",
|
||||
"oxlint": "^0.13.2",
|
||||
"prettier": "^3.5.3",
|
||||
"typescript-eslint": "^8.26.1",
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "^5.8.2",
|
||||
},
|
||||
},
|
||||
},
|
||||
"packages": {
|
||||
"@asamuzakjp/css-color": ["@asamuzakjp/css-color@2.8.3", "", { "dependencies": { "@csstools/css-calc": "^2.1.1", "@csstools/css-color-parser": "^3.0.7", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw=="],
|
||||
|
||||
"@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="],
|
||||
|
||||
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="],
|
||||
|
||||
"@cfworker/json-schema": ["@cfworker/json-schema@4.1.1", "", {}, "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og=="],
|
||||
|
||||
"@colors/colors": ["@colors/colors@1.6.0", "", {}, "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA=="],
|
||||
|
||||
"@commitlint/cli": ["@commitlint/cli@19.8.0", "", { "dependencies": { "@commitlint/format": "^19.8.0", "@commitlint/lint": "^19.8.0", "@commitlint/load": "^19.8.0", "@commitlint/read": "^19.8.0", "@commitlint/types": "^19.8.0", "tinyexec": "^0.3.0", "yargs": "^17.0.0" }, "bin": { "commitlint": "./cli.js" } }, "sha512-t/fCrLVu+Ru01h0DtlgHZXbHV2Y8gKocTR5elDOqIRUzQd0/6hpt2VIWOj9b3NDo7y4/gfxeR2zRtXq/qO6iUg=="],
|
||||
|
||||
"@commitlint/config-conventional": ["@commitlint/config-conventional@19.8.0", "", { "dependencies": { "@commitlint/types": "^19.8.0", "conventional-changelog-conventionalcommits": "^7.0.2" } }, "sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw=="],
|
||||
|
||||
"@commitlint/config-validator": ["@commitlint/config-validator@19.8.0", "", { "dependencies": { "@commitlint/types": "^19.8.0", "ajv": "^8.11.0" } }, "sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA=="],
|
||||
|
||||
"@commitlint/ensure": ["@commitlint/ensure@19.8.0", "", { "dependencies": { "@commitlint/types": "^19.8.0", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", "lodash.startcase": "^4.4.0", "lodash.upperfirst": "^4.3.1" } }, "sha512-kNiNU4/bhEQ/wutI1tp1pVW1mQ0QbAjfPRo5v8SaxoVV+ARhkB8Wjg3BSseNYECPzWWfg/WDqQGIfV1RaBFQZg=="],
|
||||
|
||||
"@commitlint/execute-rule": ["@commitlint/execute-rule@19.8.0", "", {}, "sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A=="],
|
||||
|
||||
"@commitlint/format": ["@commitlint/format@19.8.0", "", { "dependencies": { "@commitlint/types": "^19.8.0", "chalk": "^5.3.0" } }, "sha512-EOpA8IERpQstxwp/WGnDArA7S+wlZDeTeKi98WMOvaDLKbjptuHWdOYYr790iO7kTCif/z971PKPI2PkWMfOxg=="],
|
||||
|
||||
"@commitlint/is-ignored": ["@commitlint/is-ignored@19.8.0", "", { "dependencies": { "@commitlint/types": "^19.8.0", "semver": "^7.6.0" } }, "sha512-L2Jv9yUg/I+jF3zikOV0rdiHUul9X3a/oU5HIXhAJLE2+TXTnEBfqYP9G5yMw/Yb40SnR764g4fyDK6WR2xtpw=="],
|
||||
|
||||
"@commitlint/lint": ["@commitlint/lint@19.8.0", "", { "dependencies": { "@commitlint/is-ignored": "^19.8.0", "@commitlint/parse": "^19.8.0", "@commitlint/rules": "^19.8.0", "@commitlint/types": "^19.8.0" } }, "sha512-+/NZKyWKSf39FeNpqhfMebmaLa1P90i1Nrb1SrA7oSU5GNN/lksA4z6+ZTnsft01YfhRZSYMbgGsARXvkr/VLQ=="],
|
||||
|
||||
"@commitlint/load": ["@commitlint/load@19.8.0", "", { "dependencies": { "@commitlint/config-validator": "^19.8.0", "@commitlint/execute-rule": "^19.8.0", "@commitlint/resolve-extends": "^19.8.0", "@commitlint/types": "^19.8.0", "chalk": "^5.3.0", "cosmiconfig": "^9.0.0", "cosmiconfig-typescript-loader": "^6.1.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "lodash.uniq": "^4.5.0" } }, "sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ=="],
|
||||
|
||||
"@commitlint/message": ["@commitlint/message@19.8.0", "", {}, "sha512-qs/5Vi9bYjf+ZV40bvdCyBn5DvbuelhR6qewLE8Bh476F7KnNyLfdM/ETJ4cp96WgeeHo6tesA2TMXS0sh5X4A=="],
|
||||
|
||||
"@commitlint/parse": ["@commitlint/parse@19.8.0", "", { "dependencies": { "@commitlint/types": "^19.8.0", "conventional-changelog-angular": "^7.0.0", "conventional-commits-parser": "^5.0.0" } }, "sha512-YNIKAc4EXvNeAvyeEnzgvm1VyAe0/b3Wax7pjJSwXuhqIQ1/t2hD3OYRXb6D5/GffIvaX82RbjD+nWtMZCLL7Q=="],
|
||||
|
||||
"@commitlint/read": ["@commitlint/read@19.8.0", "", { "dependencies": { "@commitlint/top-level": "^19.8.0", "@commitlint/types": "^19.8.0", "git-raw-commits": "^4.0.0", "minimist": "^1.2.8", "tinyexec": "^0.3.0" } }, "sha512-6ywxOGYajcxK1y1MfzrOnwsXO6nnErna88gRWEl3qqOOP8MDu/DTeRkGLXBFIZuRZ7mm5yyxU5BmeUvMpNte5w=="],
|
||||
|
||||
"@commitlint/resolve-extends": ["@commitlint/resolve-extends@19.8.0", "", { "dependencies": { "@commitlint/config-validator": "^19.8.0", "@commitlint/types": "^19.8.0", "global-directory": "^4.0.1", "import-meta-resolve": "^4.0.0", "lodash.mergewith": "^4.6.2", "resolve-from": "^5.0.0" } }, "sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ=="],
|
||||
|
||||
"@commitlint/rules": ["@commitlint/rules@19.8.0", "", { "dependencies": { "@commitlint/ensure": "^19.8.0", "@commitlint/message": "^19.8.0", "@commitlint/to-lines": "^19.8.0", "@commitlint/types": "^19.8.0" } }, "sha512-IZ5IE90h6DSWNuNK/cwjABLAKdy8tP8OgGVGbXe1noBEX5hSsu00uRlLu6JuruiXjWJz2dZc+YSw3H0UZyl/mA=="],
|
||||
|
||||
"@commitlint/to-lines": ["@commitlint/to-lines@19.8.0", "", {}, "sha512-3CKLUw41Cur8VMjh16y8LcsOaKbmQjAKCWlXx6B0vOUREplp6em9uIVhI8Cv934qiwkbi2+uv+mVZPnXJi1o9A=="],
|
||||
|
||||
"@commitlint/top-level": ["@commitlint/top-level@19.8.0", "", { "dependencies": { "find-up": "^7.0.0" } }, "sha512-Rphgoc/omYZisoNkcfaBRPQr4myZEHhLPx2/vTXNLjiCw4RgfPR1wEgUpJ9OOmDCiv5ZyIExhprNLhteqH4FuQ=="],
|
||||
|
||||
"@commitlint/types": ["@commitlint/types@19.8.0", "", { "dependencies": { "@types/conventional-commits-parser": "^5.0.0", "chalk": "^5.3.0" } }, "sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg=="],
|
||||
|
||||
"@csstools/color-helpers": ["@csstools/color-helpers@5.0.2", "", {}, "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA=="],
|
||||
|
||||
"@csstools/css-calc": ["@csstools/css-calc@2.1.2", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw=="],
|
||||
|
||||
"@csstools/css-color-parser": ["@csstools/css-color-parser@3.0.8", "", { "dependencies": { "@csstools/color-helpers": "^5.0.2", "@csstools/css-calc": "^2.1.2" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ=="],
|
||||
|
||||
"@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@3.0.4", "", { "peerDependencies": { "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A=="],
|
||||
|
||||
"@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.3", "", {}, "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw=="],
|
||||
|
||||
"@dabh/diagnostics": ["@dabh/diagnostics@2.0.3", "", { "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", "kuler": "^2.0.0" } }, "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA=="],
|
||||
|
||||
"@egg/hooks": ["@egg/hooks@1.2.0", "https://git.yingbo.im:333/api/packages/zhaoyingbo/npm/%40egg%2Fhooks/-/1.2.0/hooks-1.2.0.tgz", { "dependencies": { "lodash": "*" } }, "sha512-pH9SViGCvdNHdXIpeqqgGODYPxq0HF+b0obKxcC11O1TT6QEpDRWgImZPRdFz0SwxG9VKjJFD+MuZpXmzar+kg=="],
|
||||
|
||||
"@egg/lark-msg-tool": ["@egg/lark-msg-tool@1.21.0", "https://git.yingbo.im:333/api/packages/zhaoyingbo/npm/%40egg%2Flark-msg-tool/-/1.21.0/lark-msg-tool-1.21.0.tgz", { "dependencies": { "@egg/logger": "^1.6.0", "winston": "*" } }, "sha512-+Vz56wgb9BBiAowmXCdcsLMKTQoBrXADalDAbI9PiLswIw6gAgQtoy8bixIiyGuKM0QB8McVBbvzc04ukJhUKw=="],
|
||||
|
||||
"@egg/logger": ["@egg/logger@1.6.0", "https://git.yingbo.im:333/api/packages/zhaoyingbo/npm/%40egg%2Flogger/-/1.6.0/logger-1.6.0.tgz", { "dependencies": { "winston": "*", "winston-daily-rotate-file": "*" } }, "sha512-BgtK74YK/7q/K3iUs3FGp3B+v4/IJlD9bgrJ/S7iHwgtgMgzl/4avZ5sXNHoZ7xPRhEuOh0ie7Br3MAWFnuuYg=="],
|
||||
|
||||
"@egg/net-tool": ["@egg/net-tool@1.32.2", "https://git.yingbo.im:333/api/packages/zhaoyingbo/npm/%40egg%2Fnet-tool/-/1.32.2/net-tool-1.32.2.tgz", { "dependencies": { "@egg/logger": "^1.6.0", "@gitbeaker/rest": "*", "winston": "*" } }, "sha512-e0iWiVob2DTIKfIDNCgBH9zp7B/MquWvHKmb7DH1lJa6YeyA0Nhp8h3EYZBUTwrUzUyaY83qqMXBJYgjg5zkKA=="],
|
||||
|
||||
"@egg/path-tool": ["@egg/path-tool@1.4.1", "https://git.yingbo.im:333/api/packages/zhaoyingbo/npm/%40egg%2Fpath-tool/-/1.4.1/path-tool-1.4.1.tgz", {}, "sha512-PZE5kMRidZh3ahhmQJQG62wcApbCdmZihKQXYI5eAOhIbwm0hgB1sOUsais94sS9uEBQ+QpH0Om7sZ9w84rumw=="],
|
||||
|
||||
"@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA=="],
|
||||
|
||||
"@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="],
|
||||
|
||||
"@eslint/config-array": ["@eslint/config-array@0.19.2", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w=="],
|
||||
|
||||
"@eslint/config-helpers": ["@eslint/config-helpers@0.1.0", "", {}, "sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA=="],
|
||||
|
||||
"@eslint/core": ["@eslint/core@0.12.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg=="],
|
||||
|
||||
"@eslint/eslintrc": ["@eslint/eslintrc@3.3.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ=="],
|
||||
|
||||
"@eslint/js": ["@eslint/js@9.22.0", "", {}, "sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ=="],
|
||||
|
||||
"@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="],
|
||||
|
||||
"@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.7", "", { "dependencies": { "@eslint/core": "^0.12.0", "levn": "^0.4.1" } }, "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g=="],
|
||||
|
||||
"@gitbeaker/core": ["@gitbeaker/core@42.1.0", "", { "dependencies": { "@gitbeaker/requester-utils": "^42.1.0", "qs": "^6.12.2", "xcase": "^2.0.1" } }, "sha512-xoP3mUjiGyUdN+utmQ+wDh9r7b4bcf3wa8jxkDTZTiuyd7Tg+354nJhwBNBsq2vFfyQvONOyOT1hsFjTGbTpBA=="],
|
||||
|
||||
"@gitbeaker/requester-utils": ["@gitbeaker/requester-utils@42.1.0", "", { "dependencies": { "picomatch-browser": "^2.2.6", "qs": "^6.12.2", "rate-limiter-flexible": "^4.0.1", "xcase": "^2.0.1" } }, "sha512-q5NXy563UUM2AisM/V6Z3A92hIVQNMyx/VBj5Mg7gJkEtIYL+pEyibjIQxcq6nQ3bnj6bkM8NYguCs5tg7GR0Q=="],
|
||||
|
||||
"@gitbeaker/rest": ["@gitbeaker/rest@42.1.0", "", { "dependencies": { "@gitbeaker/core": "^42.1.0", "@gitbeaker/requester-utils": "^42.1.0" } }, "sha512-7eSXktkUEF2O2A3F1cO/ZJ/3Mco4v59rptghzhrvjZryPcAxlYWxNJbuFtjc5bc0OnJW7i5AYfJSYvZQSh3gYg=="],
|
||||
|
||||
"@hapi/hoek": ["@hapi/hoek@9.3.0", "", {}, "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="],
|
||||
|
||||
"@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="],
|
||||
|
||||
"@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
|
||||
|
||||
"@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="],
|
||||
|
||||
"@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
|
||||
|
||||
"@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.2", "", {}, "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ=="],
|
||||
|
||||
"@langchain/core": ["@langchain/core@0.3.42", "", { "dependencies": { "@cfworker/json-schema": "^4.0.2", "ansi-styles": "^5.0.0", "camelcase": "6", "decamelize": "1.2.0", "js-tiktoken": "^1.0.12", "langsmith": ">=0.2.8 <0.4.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" } }, "sha512-pT/jC5lqWK3YGDq8dQwgKoa6anqAhMtG1x5JbnrOj9NdaLeBbCKBDQ+/Ykzk3nZ8o+0UMsaXNZo7IVL83VVjHg=="],
|
||||
|
||||
"@langchain/langgraph": ["@langchain/langgraph@0.2.56", "", { "dependencies": { "@langchain/langgraph-checkpoint": "~0.0.16", "@langchain/langgraph-sdk": "~0.0.32", "uuid": "^10.0.0", "zod": "^3.23.8" }, "peerDependencies": { "@langchain/core": ">=0.2.36 <0.3.0 || >=0.3.40 < 0.4.0" } }, "sha512-/uiQL+SeEGNv6QZOilxdwNwDoYQ+t3pFr5tZyG3lvmgmO2Pfojp7SIV2y/yuVYkNlKPvKvpdfE6mmCkCT4G2aA=="],
|
||||
|
||||
"@langchain/langgraph-checkpoint": ["@langchain/langgraph-checkpoint@0.0.16", "", { "dependencies": { "uuid": "^10.0.0" }, "peerDependencies": { "@langchain/core": ">=0.2.31 <0.4.0" } }, "sha512-B50l7w9o9353drHsdsD01vhQrCJw0eqvYeXid7oKeoj1Yye+qY90r97xuhiflaYCZHM5VEo2oaizs8oknerZsQ=="],
|
||||
|
||||
"@langchain/langgraph-sdk": ["@langchain/langgraph-sdk@0.0.45", "", { "dependencies": { "@types/json-schema": "^7.0.15", "p-queue": "^6.6.2", "p-retry": "4", "uuid": "^9.0.0" }, "peerDependencies": { "@langchain/core": ">=0.2.31 <0.4.0", "react": "^18 || ^19" }, "optionalPeers": ["@langchain/core", "react"] }, "sha512-y1nKJeP0U3mkj2fTyV3CsWqNgoLN7WidTJxZffLsTrq1DvqFU0ywWSwXyDlw90QIoc96eBOQDrruDyklph/HHg=="],
|
||||
|
||||
"@langchain/openai": ["@langchain/openai@0.3.17", "", { "dependencies": { "js-tiktoken": "^1.0.12", "openai": "^4.77.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.22.3" }, "peerDependencies": { "@langchain/core": ">=0.3.29 <0.4.0" } }, "sha512-uw4po32OKptVjq+CYHrumgbfh4NuD7LqyE+ZgqY9I/LrLc6bHLMc+sisHmI17vgek0K/yqtarI0alPJbzrwyag=="],
|
||||
|
||||
"@langchain/textsplitters": ["@langchain/textsplitters@0.1.0", "", { "dependencies": { "js-tiktoken": "^1.0.12" }, "peerDependencies": { "@langchain/core": ">=0.2.21 <0.4.0" } }, "sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw=="],
|
||||
|
||||
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
|
||||
|
||||
"@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
|
||||
|
||||
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
|
||||
|
||||
"@oxlint/darwin-arm64": ["@oxlint/darwin-arm64@0.13.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Jbi2UX1xTFTpH/D6n15RzDSG/44oJ0FwrHWl96TsdD3PAOGxmm8LgcrsCU4d22TSN7ShDFB8y34MYplduRzhfA=="],
|
||||
|
||||
"@oxlint/darwin-x64": ["@oxlint/darwin-x64@0.13.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ulA2vpNIM14VWJua6BjgX6l8nrjY8Un0uLqBLgELyDHMfpnC0HfrB2mR9PC9tRhb7+BEbgDLWTRs2aTV64eprw=="],
|
||||
|
||||
"@oxlint/linux-arm64-gnu": ["@oxlint/linux-arm64-gnu@0.13.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-iwguvPnIx/yIMc2IrwLeRflEFwyn+gcsNR8le5aX5DvQfHiB3/3x5JxOVl7Nd93lLsOg8RyVr2E11CxV10rKWw=="],
|
||||
|
||||
"@oxlint/linux-arm64-musl": ["@oxlint/linux-arm64-musl@0.13.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-YJVvVyuvUobgCmiE47kBwN6dymLcQBG5/NsEaCbVyYw5HQJN7Ywp/x4suaF4c6M9ItPCnLxEZ4Lwu5TkrkU3vQ=="],
|
||||
|
||||
"@oxlint/linux-x64-gnu": ["@oxlint/linux-x64-gnu@0.13.2", "", { "os": "linux", "cpu": "x64" }, "sha512-w78gjd3ZJ+ahByS5gmN0jxFn/+G3W/oBJbyGFOuteXYcJwLj6JIyS0VhpMKxuAdFNCnsjJeDHSbdWaCV6VkA3A=="],
|
||||
|
||||
"@oxlint/linux-x64-musl": ["@oxlint/linux-x64-musl@0.13.2", "", { "os": "linux", "cpu": "x64" }, "sha512-yedk6KQT3jtBzpzExo3Ib7NwfuugaaFKvk/EzXEojMQ5aYh6CNhmVmm+adzwBp4YyOeXQZxSPHQ1LcNwDCUJIA=="],
|
||||
|
||||
"@oxlint/win32-arm64": ["@oxlint/win32-arm64@0.13.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-KZvJ3uMWSCwkZtvOcO+K4mLmYU/jIcHUb00s8aPasG1taflbjINsq9ZUUj5LNigcDwJRZGUwNcvY5KuQ+E9WtQ=="],
|
||||
|
||||
"@oxlint/win32-x64": ["@oxlint/win32-x64@0.13.2", "", { "os": "win32", "cpu": "x64" }, "sha512-G8FM8RTJRMt2dPRJ/TXhqIEu9k00vRAoh3DSV2r3o+jD8FZDBZXOgoDn2D0F9HqgFLEOVTxpfalmWntyk2hmyw=="],
|
||||
|
||||
"@sideway/address": ["@sideway/address@4.1.5", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q=="],
|
||||
|
||||
"@sideway/formula": ["@sideway/formula@3.0.1", "", {}, "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg=="],
|
||||
|
||||
"@sideway/pinpoint": ["@sideway/pinpoint@2.0.0", "", {}, "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="],
|
||||
|
||||
"@types/conventional-commits-parser": ["@types/conventional-commits-parser@5.0.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ=="],
|
||||
|
||||
"@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="],
|
||||
|
||||
"@types/jsdom": ["@types/jsdom@21.1.7", "", { "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", "parse5": "^7.0.0" } }, "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA=="],
|
||||
|
||||
"@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
|
||||
|
||||
"@types/node": ["@types/node@22.13.9", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw=="],
|
||||
|
||||
"@types/node-fetch": ["@types/node-fetch@2.6.12", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA=="],
|
||||
|
||||
"@types/node-schedule": ["@types/node-schedule@2.1.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-G7Z3R9H7r3TowoH6D2pkzUHPhcJrDF4Jz1JOQ80AX0K2DWTHoN9VC94XzFAPNMdbW9TBzMZ3LjpFi7RYdbxtXA=="],
|
||||
|
||||
"@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="],
|
||||
|
||||
"@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="],
|
||||
|
||||
"@types/triple-beam": ["@types/triple-beam@1.3.5", "", {}, "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="],
|
||||
|
||||
"@types/uuid": ["@types/uuid@10.0.0", "", {}, "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="],
|
||||
|
||||
"@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.26.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.26.0", "@typescript-eslint/type-utils": "8.26.0", "@typescript-eslint/utils": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q=="],
|
||||
|
||||
"@typescript-eslint/parser": ["@typescript-eslint/parser@8.26.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.26.1", "@typescript-eslint/types": "8.26.1", "@typescript-eslint/typescript-estree": "8.26.1", "@typescript-eslint/visitor-keys": "8.26.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ=="],
|
||||
|
||||
"@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.26.0", "", { "dependencies": { "@typescript-eslint/types": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0" } }, "sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA=="],
|
||||
|
||||
"@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.26.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.26.0", "@typescript-eslint/utils": "8.26.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q=="],
|
||||
|
||||
"@typescript-eslint/types": ["@typescript-eslint/types@8.26.1", "", {}, "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ=="],
|
||||
|
||||
"@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.26.1", "", { "dependencies": { "@typescript-eslint/types": "8.26.1", "@typescript-eslint/visitor-keys": "8.26.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA=="],
|
||||
|
||||
"@typescript-eslint/utils": ["@typescript-eslint/utils@8.26.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.26.1", "@typescript-eslint/types": "8.26.1", "@typescript-eslint/typescript-estree": "8.26.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg=="],
|
||||
|
||||
"@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.26.0", "", { "dependencies": { "@typescript-eslint/types": "8.26.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg=="],
|
||||
|
||||
"JSONStream": ["JSONStream@1.3.5", "", { "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": { "JSONStream": "./bin.js" } }, "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="],
|
||||
|
||||
"abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="],
|
||||
|
||||
"acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
|
||||
|
||||
"acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
|
||||
|
||||
"agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="],
|
||||
|
||||
"agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="],
|
||||
|
||||
"ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
|
||||
|
||||
"ansi-escapes": ["ansi-escapes@7.0.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw=="],
|
||||
|
||||
"ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||
|
||||
"ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],
|
||||
|
||||
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
|
||||
|
||||
"array-ify": ["array-ify@1.0.0", "", {}, "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng=="],
|
||||
|
||||
"async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="],
|
||||
|
||||
"asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
|
||||
|
||||
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
|
||||
|
||||
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
|
||||
|
||||
"brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
|
||||
|
||||
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
|
||||
|
||||
"bun-types": ["bun-types@1.2.5", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-3oO6LVGGRRKI4kHINx5PIdIgnLRb7l/SprhzqXapmoYkFl5m4j6EvALvbDVuuBFaamB46Ap6HCUxIXNLCGy+tg=="],
|
||||
|
||||
"call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
|
||||
|
||||
"call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
|
||||
|
||||
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
|
||||
|
||||
"camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="],
|
||||
|
||||
"chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
|
||||
|
||||
"cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
|
||||
|
||||
"cli-truncate": ["cli-truncate@4.0.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="],
|
||||
|
||||
"cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
|
||||
|
||||
"color": ["color@3.2.1", "", { "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" } }, "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA=="],
|
||||
|
||||
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
|
||||
|
||||
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
|
||||
|
||||
"color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="],
|
||||
|
||||
"colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="],
|
||||
|
||||
"colorspace": ["colorspace@1.1.4", "", { "dependencies": { "color": "^3.1.3", "text-hex": "1.0.x" } }, "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w=="],
|
||||
|
||||
"combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
|
||||
|
||||
"commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="],
|
||||
|
||||
"compare-func": ["compare-func@2.0.0", "", { "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" } }, "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA=="],
|
||||
|
||||
"concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
|
||||
|
||||
"console-table-printer": ["console-table-printer@2.12.1", "", { "dependencies": { "simple-wcswidth": "^1.0.1" } }, "sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ=="],
|
||||
|
||||
"conventional-changelog-angular": ["conventional-changelog-angular@7.0.0", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ=="],
|
||||
|
||||
"conventional-changelog-conventionalcommits": ["conventional-changelog-conventionalcommits@7.0.2", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w=="],
|
||||
|
||||
"conventional-commits-parser": ["conventional-commits-parser@5.0.0", "", { "dependencies": { "JSONStream": "^1.3.5", "is-text-path": "^2.0.0", "meow": "^12.0.1", "split2": "^4.0.0" }, "bin": { "conventional-commits-parser": "cli.mjs" } }, "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA=="],
|
||||
|
||||
"cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="],
|
||||
|
||||
"cosmiconfig-typescript-loader": ["cosmiconfig-typescript-loader@6.1.0", "", { "dependencies": { "jiti": "^2.4.1" }, "peerDependencies": { "@types/node": "*", "cosmiconfig": ">=9", "typescript": ">=5" } }, "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g=="],
|
||||
|
||||
"cron-parser": ["cron-parser@4.9.0", "", { "dependencies": { "luxon": "^3.2.1" } }, "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q=="],
|
||||
|
||||
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
|
||||
|
||||
"cssstyle": ["cssstyle@4.2.1", "", { "dependencies": { "@asamuzakjp/css-color": "^2.8.2", "rrweb-cssom": "^0.8.0" } }, "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw=="],
|
||||
|
||||
"dargs": ["dargs@8.1.0", "", {}, "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw=="],
|
||||
|
||||
"data-urls": ["data-urls@5.0.0", "", { "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" } }, "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg=="],
|
||||
|
||||
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
|
||||
|
||||
"decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="],
|
||||
|
||||
"decimal.js": ["decimal.js@10.5.0", "", {}, "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw=="],
|
||||
|
||||
"deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
|
||||
|
||||
"delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
|
||||
|
||||
"dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="],
|
||||
|
||||
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
|
||||
|
||||
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||
|
||||
"enabled": ["enabled@2.0.0", "", {}, "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="],
|
||||
|
||||
"entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
|
||||
|
||||
"env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
|
||||
|
||||
"environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="],
|
||||
|
||||
"error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="],
|
||||
|
||||
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
|
||||
|
||||
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
|
||||
|
||||
"es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
|
||||
|
||||
"es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
|
||||
|
||||
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
|
||||
|
||||
"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
|
||||
|
||||
"eslint": ["eslint@9.22.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.2", "@eslint/config-helpers": "^0.1.0", "@eslint/core": "^0.12.0", "@eslint/eslintrc": "^3.3.0", "@eslint/js": "9.22.0", "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ=="],
|
||||
|
||||
"eslint-plugin-simple-import-sort": ["eslint-plugin-simple-import-sort@12.1.1", "", { "peerDependencies": { "eslint": ">=5.0.0" } }, "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA=="],
|
||||
|
||||
"eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@4.1.4", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", "eslint": "^9.0.0 || ^8.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ=="],
|
||||
|
||||
"eslint-scope": ["eslint-scope@8.3.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ=="],
|
||||
|
||||
"eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="],
|
||||
|
||||
"espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="],
|
||||
|
||||
"esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
|
||||
|
||||
"esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
|
||||
|
||||
"estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
|
||||
|
||||
"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
|
||||
|
||||
"event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="],
|
||||
|
||||
"eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="],
|
||||
|
||||
"execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="],
|
||||
|
||||
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
|
||||
|
||||
"fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
|
||||
|
||||
"fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
|
||||
|
||||
"fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
|
||||
|
||||
"fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="],
|
||||
|
||||
"fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="],
|
||||
|
||||
"fecha": ["fecha@4.2.3", "", {}, "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="],
|
||||
|
||||
"file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
|
||||
|
||||
"file-stream-rotator": ["file-stream-rotator@0.6.1", "", { "dependencies": { "moment": "^2.29.1" } }, "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ=="],
|
||||
|
||||
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
|
||||
|
||||
"find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
|
||||
|
||||
"flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
|
||||
|
||||
"flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
|
||||
|
||||
"fn.name": ["fn.name@1.1.0", "", {}, "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="],
|
||||
|
||||
"form-data": ["form-data@4.0.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w=="],
|
||||
|
||||
"form-data-encoder": ["form-data-encoder@1.7.2", "", {}, "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="],
|
||||
|
||||
"formdata-node": ["formdata-node@4.4.1", "", { "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" } }, "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ=="],
|
||||
|
||||
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
|
||||
|
||||
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
|
||||
|
||||
"get-east-asian-width": ["get-east-asian-width@1.3.0", "", {}, "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ=="],
|
||||
|
||||
"get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
|
||||
|
||||
"get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
|
||||
|
||||
"get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="],
|
||||
|
||||
"git-raw-commits": ["git-raw-commits@4.0.0", "", { "dependencies": { "dargs": "^8.0.0", "meow": "^12.0.1", "split2": "^4.0.0" }, "bin": { "git-raw-commits": "cli.mjs" } }, "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ=="],
|
||||
|
||||
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
|
||||
|
||||
"global-directory": ["global-directory@4.0.1", "", { "dependencies": { "ini": "4.1.1" } }, "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q=="],
|
||||
|
||||
"globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
|
||||
|
||||
"gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
|
||||
|
||||
"graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
|
||||
|
||||
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
|
||||
|
||||
"has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
|
||||
|
||||
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
|
||||
|
||||
"html-encoding-sniffer": ["html-encoding-sniffer@4.0.0", "", { "dependencies": { "whatwg-encoding": "^3.1.1" } }, "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="],
|
||||
|
||||
"http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
|
||||
|
||||
"https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
|
||||
|
||||
"human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="],
|
||||
|
||||
"humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="],
|
||||
|
||||
"husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="],
|
||||
|
||||
"iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
|
||||
|
||||
"ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
||||
|
||||
"import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
|
||||
|
||||
"import-meta-resolve": ["import-meta-resolve@4.1.0", "", {}, "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw=="],
|
||||
|
||||
"imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
|
||||
|
||||
"inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
|
||||
|
||||
"ini": ["ini@4.1.1", "", {}, "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g=="],
|
||||
|
||||
"is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
|
||||
|
||||
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
|
||||
|
||||
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
|
||||
|
||||
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
|
||||
|
||||
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
|
||||
|
||||
"is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="],
|
||||
|
||||
"is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="],
|
||||
|
||||
"is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="],
|
||||
|
||||
"is-text-path": ["is-text-path@2.0.0", "", { "dependencies": { "text-extensions": "^2.0.0" } }, "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw=="],
|
||||
|
||||
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||
|
||||
"jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
|
||||
|
||||
"joi": ["joi@17.13.3", "", { "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA=="],
|
||||
|
||||
"js-tiktoken": ["js-tiktoken@1.0.19", "", { "dependencies": { "base64-js": "^1.5.1" } }, "sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g=="],
|
||||
|
||||
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
|
||||
|
||||
"js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
|
||||
|
||||
"jsdom": ["jsdom@26.0.0", "", { "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", "form-data": "^4.0.1", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.16", "parse5": "^7.2.1", "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^5.0.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.1.0", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw=="],
|
||||
|
||||
"json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
|
||||
|
||||
"json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
|
||||
|
||||
"json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
|
||||
|
||||
"json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
|
||||
|
||||
"jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="],
|
||||
|
||||
"jsonpointer": ["jsonpointer@5.0.1", "", {}, "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="],
|
||||
|
||||
"keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
|
||||
|
||||
"kuler": ["kuler@2.0.0", "", {}, "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="],
|
||||
|
||||
"langchain": ["langchain@0.3.19", "", { "dependencies": { "@langchain/openai": ">=0.1.0 <0.5.0", "@langchain/textsplitters": ">=0.0.0 <0.2.0", "js-tiktoken": "^1.0.12", "js-yaml": "^4.1.0", "jsonpointer": "^5.0.1", "langsmith": ">=0.2.8 <0.4.0", "openapi-types": "^12.1.3", "p-retry": "4", "uuid": "^10.0.0", "yaml": "^2.2.1", "zod": "^3.22.4", "zod-to-json-schema": "^3.22.3" }, "peerDependencies": { "@langchain/anthropic": "*", "@langchain/aws": "*", "@langchain/cerebras": "*", "@langchain/cohere": "*", "@langchain/core": ">=0.2.21 <0.4.0", "@langchain/deepseek": "*", "@langchain/google-genai": "*", "@langchain/google-vertexai": "*", "@langchain/google-vertexai-web": "*", "@langchain/groq": "*", "@langchain/mistralai": "*", "@langchain/ollama": "*", "@langchain/xai": "*", "axios": "*", "cheerio": "*", "handlebars": "^4.7.8", "peggy": "^3.0.2", "typeorm": "*" }, "optionalPeers": ["@langchain/anthropic", "@langchain/aws", "@langchain/cerebras", "@langchain/cohere", "@langchain/deepseek", "@langchain/google-genai", "@langchain/google-vertexai", "@langchain/google-vertexai-web", "@langchain/groq", "@langchain/mistralai", "@langchain/ollama", "@langchain/xai", "axios", "cheerio", "handlebars", "peggy", "typeorm"] }, "sha512-aGhoTvTBS5ulatA67RHbJ4bcV5zcYRYdm5IH+hpX99RYSFXG24XF3ghSjhYi6sxW+SUnEQ99fJhA5kroVpKNhw=="],
|
||||
|
||||
"langfuse": ["langfuse@3.37.0", "", { "dependencies": { "langfuse-core": "^3.37.0" } }, "sha512-NpemB+5i6VT9CXmBwQTE4q1DPOY/DH7OMxBJn8Rcirw+z2HYJpTRH8j48cBjzwqmYtqLdqyJMzAALa2ReQ50hQ=="],
|
||||
|
||||
"langfuse-core": ["langfuse-core@3.37.0", "", { "dependencies": { "mustache": "^4.2.0" } }, "sha512-7ZOFJ51u4dOeCpsQ8otNuNYeMb7xsExVQcOIBOByPFKjjd1mjf/03xF907F44dRzgf7n1U8ZYa0XgMSRgxKNoA=="],
|
||||
|
||||
"langfuse-langchain": ["langfuse-langchain@3.37.0", "", { "dependencies": { "langfuse": "^3.37.0", "langfuse-core": "^3.37.0" }, "peerDependencies": { "langchain": ">=0.0.157 <0.4.0" } }, "sha512-IleGRb5Je5/gBd1tUQ+KtvhISyFHuaWbCxKEZyfV0iUIcYAa07YTq3USDVN2TYunEfM7gcioOWDFPtz0UnTy2g=="],
|
||||
|
||||
"langsmith": ["langsmith@0.3.12", "", { "dependencies": { "@types/uuid": "^10.0.0", "chalk": "^4.1.2", "console-table-printer": "^2.12.1", "p-queue": "^6.6.2", "p-retry": "4", "semver": "^7.6.3", "uuid": "^10.0.0" }, "peerDependencies": { "openai": "*" }, "optionalPeers": ["openai"] }, "sha512-e4qWM27hxEr8GfO6dgXrc3W8La+wxkX1zEtMhxhqS/Th2ujTt5OH7x0uXfXFDqCv9WaC3nquo1Y2s4vpYmLLtg=="],
|
||||
|
||||
"levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
|
||||
|
||||
"lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
|
||||
|
||||
"lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
|
||||
|
||||
"lint-staged": ["lint-staged@15.5.0", "", { "dependencies": { "chalk": "^5.4.1", "commander": "^13.1.0", "debug": "^4.4.0", "execa": "^8.0.1", "lilconfig": "^3.1.3", "listr2": "^8.2.5", "micromatch": "^4.0.8", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.7.0" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg=="],
|
||||
|
||||
"listr2": ["listr2@8.2.5", "", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ=="],
|
||||
|
||||
"locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
|
||||
|
||||
"lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
|
||||
|
||||
"lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="],
|
||||
|
||||
"lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="],
|
||||
|
||||
"lodash.kebabcase": ["lodash.kebabcase@4.1.1", "", {}, "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g=="],
|
||||
|
||||
"lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
|
||||
|
||||
"lodash.mergewith": ["lodash.mergewith@4.6.2", "", {}, "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="],
|
||||
|
||||
"lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="],
|
||||
|
||||
"lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="],
|
||||
|
||||
"lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="],
|
||||
|
||||
"lodash.upperfirst": ["lodash.upperfirst@4.3.1", "", {}, "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg=="],
|
||||
|
||||
"log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="],
|
||||
|
||||
"logform": ["logform@2.7.0", "", { "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ=="],
|
||||
|
||||
"long-timeout": ["long-timeout@0.1.1", "", {}, "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w=="],
|
||||
|
||||
"lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
|
||||
|
||||
"luxon": ["luxon@3.5.0", "", {}, "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ=="],
|
||||
|
||||
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
|
||||
|
||||
"meow": ["meow@12.1.1", "", {}, "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw=="],
|
||||
|
||||
"merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
|
||||
|
||||
"merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
|
||||
|
||||
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
|
||||
|
||||
"mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
|
||||
|
||||
"mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
|
||||
|
||||
"mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="],
|
||||
|
||||
"mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
|
||||
|
||||
"minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
|
||||
|
||||
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
|
||||
|
||||
"moment": ["moment@2.30.1", "", {}, "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="],
|
||||
|
||||
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||
|
||||
"mustache": ["mustache@4.2.0", "", { "bin": { "mustache": "bin/mustache" } }, "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="],
|
||||
|
||||
"natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
|
||||
|
||||
"node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
|
||||
|
||||
"node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="],
|
||||
|
||||
"node-schedule": ["node-schedule@2.1.1", "", { "dependencies": { "cron-parser": "^4.2.0", "long-timeout": "0.1.1", "sorted-array-functions": "^1.3.0" } }, "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ=="],
|
||||
|
||||
"npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="],
|
||||
|
||||
"nwsapi": ["nwsapi@2.2.18", "", {}, "sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA=="],
|
||||
|
||||
"object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="],
|
||||
|
||||
"object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
|
||||
|
||||
"one-time": ["one-time@1.0.0", "", { "dependencies": { "fn.name": "1.x.x" } }, "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g=="],
|
||||
|
||||
"onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="],
|
||||
|
||||
"openai": ["openai@4.86.1", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" }, "peerDependencies": { "ws": "^8.18.0", "zod": "^3.23.8" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-x3iCLyaC3yegFVZaxOmrYJjitKxZ9hpVbLi+ZlT5UHuHTMlEQEbKXkGOM78z9qm2T5GF+XRUZCP2/aV4UPFPJQ=="],
|
||||
|
||||
"openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
|
||||
|
||||
"optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
|
||||
|
||||
"oxlint": ["oxlint@0.13.2", "", { "optionalDependencies": { "@oxlint/darwin-arm64": "0.13.2", "@oxlint/darwin-x64": "0.13.2", "@oxlint/linux-arm64-gnu": "0.13.2", "@oxlint/linux-arm64-musl": "0.13.2", "@oxlint/linux-x64-gnu": "0.13.2", "@oxlint/linux-x64-musl": "0.13.2", "@oxlint/win32-arm64": "0.13.2", "@oxlint/win32-x64": "0.13.2" }, "bin": { "oxlint": "bin/oxlint", "oxc_language_server": "bin/oxc_language_server" } }, "sha512-R7wXUspM75TeEXaAFLmuPH0W3h5B5r6BNtOvkcnVddD3BWbBiEOWe9bCqt4+te0l8wQ4a0/XLCGrJroxFFeajg=="],
|
||||
|
||||
"p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="],
|
||||
|
||||
"p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="],
|
||||
|
||||
"p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
|
||||
|
||||
"p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="],
|
||||
|
||||
"p-retry": ["p-retry@4.6.2", "", { "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="],
|
||||
|
||||
"p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="],
|
||||
|
||||
"parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
|
||||
|
||||
"parse-json": ["parse-json@5.2.0", "", { "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" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="],
|
||||
|
||||
"parse5": ["parse5@7.2.1", "", { "dependencies": { "entities": "^4.5.0" } }, "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ=="],
|
||||
|
||||
"path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
|
||||
|
||||
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
|
||||
|
||||
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
||||
|
||||
"picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
|
||||
"picomatch-browser": ["picomatch-browser@2.2.6", "", {}, "sha512-0ypsOQt9D4e3hziV8O4elD9uN0z/jtUEfxVRtNaAAtXIyUx9m/SzlO020i8YNL2aL/E6blOvvHQcin6HZlFy/w=="],
|
||||
|
||||
"pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="],
|
||||
|
||||
"pocketbase": ["pocketbase@0.23.0", "", {}, "sha512-S9b/QSKGXsRyL55m8MoXMucPTpMvpOLlOLTSduraIOzwVt8Epp0j7V53a1qW7VbF2pL7PC579DOruxJBWqBYTg=="],
|
||||
|
||||
"prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
|
||||
|
||||
"prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="],
|
||||
|
||||
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
|
||||
|
||||
"qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="],
|
||||
|
||||
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
|
||||
|
||||
"rate-limiter-flexible": ["rate-limiter-flexible@4.0.1", "", {}, "sha512-2/dGHpDFpeA0+755oUkW+EKyklqLS9lu0go9pDsbhqQjZcxfRyJ6LA4JI0+HAdZ2bemD/oOjUeZQB2lCZqXQfQ=="],
|
||||
|
||||
"readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="],
|
||||
|
||||
"require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
|
||||
|
||||
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
|
||||
|
||||
"resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
|
||||
|
||||
"restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
|
||||
|
||||
"retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="],
|
||||
|
||||
"reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
|
||||
|
||||
"rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
|
||||
|
||||
"rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="],
|
||||
|
||||
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
|
||||
|
||||
"safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="],
|
||||
|
||||
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
||||
|
||||
"saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="],
|
||||
|
||||
"semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
|
||||
|
||||
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
|
||||
|
||||
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
|
||||
|
||||
"side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
|
||||
|
||||
"side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
|
||||
|
||||
"side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
|
||||
|
||||
"side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
|
||||
|
||||
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
||||
|
||||
"simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="],
|
||||
|
||||
"simple-wcswidth": ["simple-wcswidth@1.0.1", "", {}, "sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg=="],
|
||||
|
||||
"slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="],
|
||||
|
||||
"sorted-array-functions": ["sorted-array-functions@1.3.0", "", {}, "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA=="],
|
||||
|
||||
"split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="],
|
||||
|
||||
"stack-trace": ["stack-trace@0.0.10", "", {}, "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="],
|
||||
|
||||
"string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="],
|
||||
|
||||
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||
|
||||
"string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
|
||||
|
||||
"strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="],
|
||||
|
||||
"strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
|
||||
|
||||
"supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="],
|
||||
|
||||
"text-extensions": ["text-extensions@2.4.0", "", {}, "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g=="],
|
||||
|
||||
"text-hex": ["text-hex@1.0.0", "", {}, "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="],
|
||||
|
||||
"through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="],
|
||||
|
||||
"tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
|
||||
|
||||
"tldts": ["tldts@6.1.82", "", { "dependencies": { "tldts-core": "^6.1.82" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-KCTjNL9F7j8MzxgfTgjT+v21oYH38OidFty7dH00maWANAI2IsLw2AnThtTJi9HKALHZKQQWnNebYheadacD+g=="],
|
||||
|
||||
"tldts-core": ["tldts-core@6.1.82", "", {}, "sha512-Jabl32m21tt/d/PbDO88R43F8aY98Piiz6BVH9ShUlOAiiAELhEqwrAmBocjAqnCfoUeIsRU+h3IEzZd318F3w=="],
|
||||
|
||||
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
|
||||
|
||||
"tough-cookie": ["tough-cookie@5.1.2", "", { "dependencies": { "tldts": "^6.1.32" } }, "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A=="],
|
||||
|
||||
"tr46": ["tr46@5.0.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g=="],
|
||||
|
||||
"triple-beam": ["triple-beam@1.4.1", "", {}, "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg=="],
|
||||
|
||||
"ts-api-utils": ["ts-api-utils@2.0.1", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w=="],
|
||||
|
||||
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
|
||||
|
||||
"typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="],
|
||||
|
||||
"typescript-eslint": ["typescript-eslint@8.26.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.26.1", "@typescript-eslint/parser": "8.26.1", "@typescript-eslint/utils": "8.26.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg=="],
|
||||
|
||||
"undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="],
|
||||
|
||||
"unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="],
|
||||
|
||||
"uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
|
||||
|
||||
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
|
||||
|
||||
"uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="],
|
||||
|
||||
"w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="],
|
||||
|
||||
"web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="],
|
||||
|
||||
"webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="],
|
||||
|
||||
"whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="],
|
||||
|
||||
"whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="],
|
||||
|
||||
"whatwg-url": ["whatwg-url@14.1.1", "", { "dependencies": { "tr46": "^5.0.0", "webidl-conversions": "^7.0.0" } }, "sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ=="],
|
||||
|
||||
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
||||
|
||||
"winston": ["winston@3.17.0", "", { "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.9.0" } }, "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw=="],
|
||||
|
||||
"winston-daily-rotate-file": ["winston-daily-rotate-file@5.0.0", "", { "dependencies": { "file-stream-rotator": "^0.6.1", "object-hash": "^3.0.0", "triple-beam": "^1.4.1", "winston-transport": "^4.7.0" }, "peerDependencies": { "winston": "^3" } }, "sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw=="],
|
||||
|
||||
"winston-transport": ["winston-transport@4.9.0", "", { "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" } }, "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A=="],
|
||||
|
||||
"word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
|
||||
|
||||
"wrap-ansi": ["wrap-ansi@9.0.0", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q=="],
|
||||
|
||||
"ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="],
|
||||
|
||||
"xcase": ["xcase@2.0.1", "", {}, "sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw=="],
|
||||
|
||||
"xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="],
|
||||
|
||||
"xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="],
|
||||
|
||||
"y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
|
||||
|
||||
"yaml": ["yaml@2.7.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="],
|
||||
|
||||
"yargs": ["yargs@17.7.2", "", { "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" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
|
||||
|
||||
"yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
|
||||
|
||||
"yocto-queue": ["yocto-queue@1.1.1", "", {}, "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g=="],
|
||||
|
||||
"zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="],
|
||||
|
||||
"zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="],
|
||||
|
||||
"@commitlint/config-validator/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
|
||||
|
||||
"@commitlint/format/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="],
|
||||
|
||||
"@commitlint/load/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="],
|
||||
|
||||
"@commitlint/top-level/find-up": ["find-up@7.0.0", "", { "dependencies": { "locate-path": "^7.2.0", "path-exists": "^5.0.0", "unicorn-magic": "^0.1.0" } }, "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g=="],
|
||||
|
||||
"@commitlint/types/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="],
|
||||
|
||||
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||
|
||||
"@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
|
||||
|
||||
"@langchain/langgraph-sdk/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.26.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.26.0", "@typescript-eslint/types": "8.26.0", "@typescript-eslint/typescript-estree": "8.26.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig=="],
|
||||
|
||||
"@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.26.1", "", { "dependencies": { "@typescript-eslint/types": "8.26.1", "@typescript-eslint/visitor-keys": "8.26.1" } }, "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg=="],
|
||||
|
||||
"@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.26.1", "", { "dependencies": { "@typescript-eslint/types": "8.26.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg=="],
|
||||
|
||||
"@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.26.0", "", {}, "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA=="],
|
||||
|
||||
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.26.0", "", { "dependencies": { "@typescript-eslint/types": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ=="],
|
||||
|
||||
"@typescript-eslint/type-utils/@typescript-eslint/utils": ["@typescript-eslint/utils@8.26.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.26.0", "@typescript-eslint/types": "8.26.0", "@typescript-eslint/typescript-estree": "8.26.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig=="],
|
||||
|
||||
"@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.26.1", "", { "dependencies": { "@typescript-eslint/types": "8.26.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg=="],
|
||||
|
||||
"@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
|
||||
|
||||
"@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.26.1", "", { "dependencies": { "@typescript-eslint/types": "8.26.1", "@typescript-eslint/visitor-keys": "8.26.1" } }, "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg=="],
|
||||
|
||||
"@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.26.0", "", {}, "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA=="],
|
||||
|
||||
"chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"cli-truncate/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
||||
|
||||
"cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
|
||||
|
||||
"color/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
|
||||
|
||||
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
||||
|
||||
"import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
|
||||
|
||||
"lint-staged/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="],
|
||||
|
||||
"log-update/slice-ansi": ["slice-ansi@7.1.0", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg=="],
|
||||
|
||||
"log-update/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
|
||||
|
||||
"node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
|
||||
|
||||
"npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
|
||||
|
||||
"openai/@types/node": ["@types/node@18.19.79", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-90K8Oayimbctc5zTPHPfZloc/lGVs7f3phUAAMcTgEPtg8kKquGZDERC8K4vkBYkQQh48msiYUslYtxTWvqcAg=="],
|
||||
|
||||
"p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
|
||||
|
||||
"p-queue/eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="],
|
||||
|
||||
"restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
|
||||
|
||||
"simple-swizzle/is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
|
||||
|
||||
"slice-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
|
||||
|
||||
"slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="],
|
||||
|
||||
"typescript-eslint/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.26.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.26.1", "@typescript-eslint/type-utils": "8.26.1", "@typescript-eslint/utils": "8.26.1", "@typescript-eslint/visitor-keys": "8.26.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA=="],
|
||||
|
||||
"winston/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
|
||||
|
||||
"wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
|
||||
|
||||
"wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
||||
|
||||
"wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
|
||||
|
||||
"@commitlint/config-validator/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
|
||||
|
||||
"@commitlint/top-level/find-up/locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="],
|
||||
|
||||
"@commitlint/top-level/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.26.0", "", {}, "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.26.0", "", { "dependencies": { "@typescript-eslint/types": "8.26.0", "@typescript-eslint/visitor-keys": "8.26.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ=="],
|
||||
|
||||
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.26.0", "", {}, "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA=="],
|
||||
|
||||
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
|
||||
|
||||
"@typescript-eslint/type-utils/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.26.0", "", {}, "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA=="],
|
||||
|
||||
"@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
|
||||
|
||||
"@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.26.1", "", { "dependencies": { "@typescript-eslint/types": "8.26.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg=="],
|
||||
|
||||
"cli-truncate/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
|
||||
|
||||
"cli-truncate/string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
|
||||
|
||||
"cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"color/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
|
||||
|
||||
"log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
|
||||
|
||||
"log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.0.0", "", { "dependencies": { "get-east-asian-width": "^1.0.0" } }, "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA=="],
|
||||
|
||||
"log-update/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
|
||||
|
||||
"node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
|
||||
|
||||
"node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
|
||||
|
||||
"openai/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
|
||||
|
||||
"p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
|
||||
|
||||
"typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.26.1", "", { "dependencies": { "@typescript-eslint/types": "8.26.1", "@typescript-eslint/visitor-keys": "8.26.1" } }, "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg=="],
|
||||
|
||||
"typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.26.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.26.1", "@typescript-eslint/utils": "8.26.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg=="],
|
||||
|
||||
"typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.26.1", "", { "dependencies": { "@typescript-eslint/types": "8.26.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg=="],
|
||||
|
||||
"wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="],
|
||||
|
||||
"wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
|
||||
|
||||
"@commitlint/top-level/find-up/locate-path/p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
|
||||
|
||||
"@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
|
||||
|
||||
"cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
|
||||
|
||||
"@commitlint/top-level/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
|
||||
}
|
||||
}
|
@ -29,6 +29,11 @@ const functionMap = {
|
||||
xAuthor: "wangyifei15 🕹️ Yingbo",
|
||||
xIcon: "🕹️",
|
||||
},
|
||||
searchAgent: {
|
||||
xName: "小煎蛋 Search Agent",
|
||||
xAuthor: "Yingbo",
|
||||
xIcon: "🔍",
|
||||
},
|
||||
}
|
||||
|
||||
export default functionMap
|
||||
|
@ -1,4 +1,3 @@
|
||||
import db from "../../db"
|
||||
import { GitlabProjectModel } from "../../db/gitlabProject/index."
|
||||
import { Context } from "../../types"
|
||||
|
||||
@ -43,7 +42,7 @@ const openFunc = async (
|
||||
projectId: number,
|
||||
func: "openCICDNotify" | "openMRSummary"
|
||||
) => {
|
||||
const { logger, larkBody, larkService, larkCard } = ctx
|
||||
const { logger, larkBody, larkService, larkCard, db } = ctx
|
||||
const cardGender = larkCard.child("gitlabAgent")
|
||||
if (!projectId) {
|
||||
logger.error(`项目ID格式错误,项目ID:${projectId}`)
|
||||
@ -92,7 +91,7 @@ const closeFunc = async (
|
||||
projectId: number,
|
||||
func: "openCICDNotify" | "openMRSummary"
|
||||
) => {
|
||||
const { logger, larkBody, larkService, larkCard } = ctx
|
||||
const { logger, larkBody, larkService, larkCard, db } = ctx
|
||||
const cardGender = larkCard.child("gitlabAgent")
|
||||
if (!projectId) {
|
||||
logger.error(`项目ID格式错误,项目ID:${projectId}`)
|
||||
|
@ -3,6 +3,8 @@ import { LarkEvent } from "@egg/lark-msg-tool"
|
||||
import { Lark } from "@egg/net-tool"
|
||||
|
||||
import { Context } from "../../types"
|
||||
import MapPolyfill from "../../utils/polyfill/map"
|
||||
import SetPolyfill from "../../utils/polyfill/set"
|
||||
|
||||
interface Message {
|
||||
user: string
|
||||
@ -63,7 +65,7 @@ const getChatHistory = async (
|
||||
}
|
||||
): Promise<{
|
||||
messages: Message[]
|
||||
mentions: Map<string, string>
|
||||
mentions: MapPolyfill<string, string>
|
||||
}> => {
|
||||
// 获取服务器的时区偏移量(以分钟为单位)
|
||||
const serverTimezoneOffset = new Date().getTimezoneOffset()
|
||||
@ -89,10 +91,10 @@ const getChatHistory = async (
|
||||
if (!chatHistory?.length)
|
||||
return {
|
||||
messages: [],
|
||||
mentions: new Map(),
|
||||
mentions: new MapPolyfill(),
|
||||
}
|
||||
|
||||
const targetUsersSet = new Set(
|
||||
const targetUsersSet = new SetPolyfill(
|
||||
targetUsers
|
||||
?.filter?.((user) => user.id.user_id)
|
||||
?.map?.((user) => user.id.open_id) ?? []
|
||||
@ -100,8 +102,8 @@ const getChatHistory = async (
|
||||
|
||||
// 清洗数据
|
||||
// 取出所有的被AT的人,以及发送者
|
||||
const mentions: Map<string, string> = new Map()
|
||||
const senders: Set<string> = new Set()
|
||||
const mentions: MapPolyfill<string, string> = new MapPolyfill()
|
||||
const senders: SetPolyfill<string> = new SetPolyfill()
|
||||
// 先把提问者加进去
|
||||
if (senderOpenId) senders.add(senderOpenId)
|
||||
// 过滤出文本和post消息
|
||||
@ -159,13 +161,13 @@ const getChatHistory = async (
|
||||
}
|
||||
|
||||
// 取出没有被AT的发送者
|
||||
const noMentionSenders = new Set(
|
||||
const noMentionSenders = new SetPolyfill(
|
||||
[...senders].filter((sender) => !mentions.has(sender))
|
||||
)
|
||||
|
||||
logger.debug(`Mentions: ${JSON.stringify(mentions)}`)
|
||||
logger.debug(`Senders: ${JSON.stringify(senders)}`)
|
||||
logger.debug(`No mention senders: ${JSON.stringify(noMentionSenders)}`)
|
||||
logger.debug(`Mentions: ${JSON.stringify([...mentions.entries()])}`)
|
||||
logger.debug(`Senders: ${JSON.stringify([...senders])}`)
|
||||
logger.debug(`No mention senders: ${JSON.stringify([...noMentionSenders])}`)
|
||||
|
||||
// 从接口获取用户名
|
||||
if (noMentionSenders.size !== 0) {
|
||||
|
@ -1,5 +1,4 @@
|
||||
import { RespMessage } from "../../constant/message"
|
||||
import db from "../../db"
|
||||
import { Context } from "../../types"
|
||||
import { genContextManually } from "../../utils/genContext"
|
||||
import llm from "../../utils/llm"
|
||||
@ -19,6 +18,7 @@ const genSummary = async (
|
||||
trigger: "auto" | "manual"
|
||||
) => {
|
||||
const {
|
||||
db,
|
||||
logger,
|
||||
requestId,
|
||||
larkCard,
|
||||
@ -35,7 +35,7 @@ const genSummary = async (
|
||||
)
|
||||
}
|
||||
// 获取群聊信息
|
||||
const chat = await db.chat.getAndCreate(ctx)
|
||||
const chat = await db.chat.getByCtx(ctx)
|
||||
if (!chat) {
|
||||
throw new Error("Failed to get chat info")
|
||||
}
|
||||
@ -127,7 +127,7 @@ const genSummary = async (
|
||||
*/
|
||||
const genAllReport = async (timeScope: "daily" | "weekly" = "daily") => {
|
||||
const ctx = await genContextManually()
|
||||
const { logger } = ctx
|
||||
const { logger, db } = ctx
|
||||
logger.info(`genAllReport ${timeScope}`)
|
||||
try {
|
||||
// 获取所有需要自动总结的群组
|
||||
@ -184,6 +184,7 @@ const setSubscription = async (
|
||||
value: boolean
|
||||
) => {
|
||||
const {
|
||||
db,
|
||||
larkService: { message },
|
||||
logger,
|
||||
larkBody,
|
||||
@ -204,7 +205,7 @@ const setSubscription = async (
|
||||
throw new Error("Invalid chatId")
|
||||
}
|
||||
// 获取群组信息
|
||||
const chat = await db.chat.getAndCreate(ctx)
|
||||
const chat = await db.chat.getByCtx(ctx)
|
||||
if (!chat) {
|
||||
throw new Error("Failed to get chat info")
|
||||
}
|
||||
@ -213,7 +214,9 @@ const setSubscription = async (
|
||||
// 更新订阅信息, 如果订阅信息没有变化则不更新
|
||||
if (chat[`${timeScope}Summary`] !== value) {
|
||||
logger.info("value is different, update subscription")
|
||||
const res = await db.chat.updateSummary(chat.id, timeScope, value)
|
||||
const res = await db.chat.update(chat.id, {
|
||||
[`${timeScope}Summary`]: value,
|
||||
})
|
||||
if (!res) {
|
||||
throw new Error("Failed to update subscription")
|
||||
}
|
||||
|
@ -22,6 +22,9 @@ const BriefingSchema = BaseIntentSchema.extend({
|
||||
userDescription: z.string().min(1),
|
||||
})
|
||||
|
||||
/**
|
||||
* 简报存储链接模式
|
||||
*/
|
||||
const BriefingLinkSchema = z.object({
|
||||
intent: z.literal(14),
|
||||
link: z.string().url(),
|
||||
@ -35,6 +38,14 @@ const CommonResponseSchema = BaseIntentSchema.extend({
|
||||
message: z.string().min(1),
|
||||
})
|
||||
|
||||
/**
|
||||
* 联网检索模式
|
||||
*/
|
||||
const NetSearchSchema = BaseIntentSchema.extend({
|
||||
intent: z.literal(15),
|
||||
query: z.string().min(1),
|
||||
})
|
||||
|
||||
/**
|
||||
* 意图模式
|
||||
*/
|
||||
@ -43,12 +54,13 @@ const IntentSchema = z.union([
|
||||
CommonResponseSchema,
|
||||
BaseIntentSchema,
|
||||
BriefingLinkSchema,
|
||||
NetSearchSchema,
|
||||
])
|
||||
|
||||
type BaseIntent = z.infer<typeof BaseIntentSchema>
|
||||
type Briefing = z.infer<typeof BriefingSchema>
|
||||
type BriefingLink = z.infer<typeof BriefingLinkSchema>
|
||||
type CommonResponse = z.infer<typeof CommonResponseSchema>
|
||||
type NetSearch = z.infer<typeof NetSearchSchema>
|
||||
export type Intent = z.infer<typeof IntentSchema>
|
||||
|
||||
/**
|
||||
@ -58,8 +70,8 @@ const jsonSchema = zodToJsonSchema(IntentSchema)
|
||||
|
||||
/**
|
||||
* 代理函数
|
||||
* @param {Context} ctx - 上下文对象
|
||||
* @returns {Promise<Intent>} - 返回意图对象
|
||||
* @param ctx - 上下文对象
|
||||
* @returns 返回意图对象
|
||||
*/
|
||||
const agent = async (ctx: Context): Promise<Intent> => {
|
||||
const {
|
||||
@ -71,7 +83,7 @@ const agent = async (ctx: Context): Promise<Intent> => {
|
||||
let attempts = 0
|
||||
while (attempts < 3) {
|
||||
const res = await llm.invoke(
|
||||
"intentRecognitionNext",
|
||||
"intentRecognition",
|
||||
{
|
||||
userInput: msgText,
|
||||
time: new Date().toLocaleString("zh-CN", { timeZone: "Asia/Shanghai" }),
|
||||
@ -105,31 +117,51 @@ const agent = async (ctx: Context): Promise<Intent> => {
|
||||
}
|
||||
}
|
||||
|
||||
const isBaseIntent = (intent: Intent): intent is BaseIntent => {
|
||||
return intent.intent !== 5 && intent.intent !== 2
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为简报意图
|
||||
* @param intent - 意图对象
|
||||
* @returns 如果是简报意图则返回true,否则返回false
|
||||
*/
|
||||
const isBriefing = (intent: Intent): intent is Briefing => {
|
||||
return intent.intent === 5
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为简报链接意图
|
||||
* @param intent - 意图对象
|
||||
* @returns 如果是简报链接意图则返回true,否则返回false
|
||||
*/
|
||||
const isBriefingLink = (intent: Intent): intent is BriefingLink => {
|
||||
return intent.intent === 14
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为通用响应意图
|
||||
* @param intent - 意图对象
|
||||
* @returns 如果是通用响应意图则返回true,否则返回false
|
||||
*/
|
||||
const isCommonResponse = (intent: Intent): intent is CommonResponse => {
|
||||
return intent.intent === 2
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为联网检索意图
|
||||
* @param intent - 意图对象
|
||||
* @returns 如果是联网检索意图则返回true,否则返回false
|
||||
*/
|
||||
const isNetSearch = (intent: Intent): intent is NetSearch => {
|
||||
return intent.intent === 15
|
||||
}
|
||||
|
||||
/**
|
||||
* 意图代理对象
|
||||
*/
|
||||
const intentAgent = {
|
||||
agent,
|
||||
isBaseIntent,
|
||||
isBriefing,
|
||||
isCommonResponse,
|
||||
isBriefingLink,
|
||||
isNetSearch,
|
||||
}
|
||||
|
||||
export default intentAgent
|
||||
|
@ -1,4 +1,3 @@
|
||||
import db from "../../db"
|
||||
import { SheetModel } from "../../db/sheet"
|
||||
import { Context } from "../../types"
|
||||
import llm from "../../utils/llm"
|
||||
@ -48,19 +47,38 @@ export const generateSummary = async (
|
||||
return llmRes
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取简报表格
|
||||
* @param {Context} ctx - 上下文对象
|
||||
* @returns {Promise<{sheetToken: string, range: string, sheetUrl: string}> | null} - 返回表格信息或null
|
||||
*/
|
||||
const getReportSheet = async (ctx: Context) => {
|
||||
const { db } = ctx
|
||||
const chat = await db.chat.getByCtx(ctx)
|
||||
if (!chat || !chat?.sheet || !chat?.expand?.sheet) {
|
||||
return null
|
||||
}
|
||||
const { sheetToken, range, sheetUrl } = chat.expand.sheet as SheetModel
|
||||
return { sheetToken, range, sheetUrl }
|
||||
}
|
||||
|
||||
/**
|
||||
* 插入到表格
|
||||
* @param {Context} ctx - 上下文对象
|
||||
* @param {string} link - 网页链接
|
||||
* @param {string} userDescription - 用户描述
|
||||
* @param {string} llmRes - 简报内容
|
||||
* @param {string} sheetToken - 表格token
|
||||
* @param {string} range - 表格range
|
||||
* @returns {Promise<string>} - 返回表格链接
|
||||
*/
|
||||
const insert2Sheet = async (
|
||||
ctx: Context,
|
||||
link: string,
|
||||
userDescription: string,
|
||||
llmRes: string
|
||||
llmRes: string,
|
||||
sheetToken: string,
|
||||
range: string
|
||||
) => {
|
||||
const {
|
||||
larkBody: { userId },
|
||||
@ -68,12 +86,6 @@ const insert2Sheet = async (
|
||||
larkService,
|
||||
} = ctx
|
||||
try {
|
||||
const chat = await db.chat.getAndCreate(ctx)
|
||||
if (!chat || !chat?.sheet || !chat?.expand?.sheet) {
|
||||
logger.info("No sheet found, skip insert2Sheet")
|
||||
return ""
|
||||
}
|
||||
const { sheetToken, range, sheetUrl } = chat.expand.sheet as SheetModel
|
||||
await larkService.sheet.insertRows(sheetToken, range, [
|
||||
[
|
||||
userId || "",
|
||||
@ -83,10 +95,8 @@ const insert2Sheet = async (
|
||||
new Date().toLocaleString("zh-CN", { timeZone: "Asia/Shanghai" }),
|
||||
],
|
||||
])
|
||||
return sheetUrl
|
||||
} catch (error: any) {
|
||||
logger.error(`Failed to insert2Sheet: ${error}`)
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
@ -135,6 +145,23 @@ ${sheetLinkMd}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理mify爬虫错误
|
||||
* @param {string} llmRes - 爬虫结果
|
||||
* @returns {string} - 返回错误信息
|
||||
*/
|
||||
const manageMifyCrawlerErr = (llmRes: string) => {
|
||||
const errMap: Record<string, string> = {
|
||||
crawlerErr: "网页抓取失败",
|
||||
larkErr: "文档获取失败或者文档为空",
|
||||
authErr: "请确保小煎蛋有对文档的读取权限,可以私发小煎蛋设置权限",
|
||||
}
|
||||
if (!llmRes) return "模型总结失败"
|
||||
if (errMap[llmRes]) return errMap[llmRes]
|
||||
if (llmRes.includes("mify爬虫调用失败")) return llmRes
|
||||
return ""
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成简报
|
||||
* @param {Context} ctx - 上下文对象
|
||||
@ -154,19 +181,45 @@ const agent = async (ctx: Context, link: string, userDescription: string) => {
|
||||
validateLink(link)
|
||||
// 发送一个loading卡片
|
||||
await message.updateOrReply(
|
||||
cardGender.genSuccessCard("正在为您收集简报,请稍等片刻~")
|
||||
cardGender.genPendingCard("正在为您收集简报,请稍等片刻~")
|
||||
)
|
||||
// // 抓取网页
|
||||
// const crawRes = await crawlWebPage(ctx, link)
|
||||
// // 调用模型生成简报
|
||||
// const llmRes = await generateSummary(ctx, userDescription, crawRes)
|
||||
|
||||
// 获取要插入的表格信息
|
||||
const sheetInfo = await getReportSheet(ctx)
|
||||
|
||||
// 调用mify服务生成简报
|
||||
const llmRes = await attachService.mifyCrawler(link, userDescription)
|
||||
// 插入到表格
|
||||
const sheetLink = await insert2Sheet(ctx, link, userDescription, llmRes)
|
||||
|
||||
// 处理mify爬虫错误
|
||||
const mifyErr = manageMifyCrawlerErr(llmRes)
|
||||
|
||||
if (sheetInfo) {
|
||||
// 插入到表格
|
||||
await insert2Sheet(
|
||||
ctx,
|
||||
link,
|
||||
userDescription,
|
||||
mifyErr ? "暂无总结" : llmRes,
|
||||
sheetInfo.sheetToken,
|
||||
sheetInfo.range
|
||||
)
|
||||
} else if (mifyErr) {
|
||||
throw new Error(mifyErr)
|
||||
}
|
||||
|
||||
// 发送简报卡片
|
||||
await message.updateOrReply(
|
||||
genReportCard(ctx, link, userDescription, llmRes, sheetLink)
|
||||
genReportCard(
|
||||
ctx,
|
||||
link,
|
||||
userDescription,
|
||||
llmRes,
|
||||
sheetInfo?.sheetUrl || ""
|
||||
)
|
||||
)
|
||||
} catch (error: any) {
|
||||
logger.error(`Failed gen report: ${error}`)
|
||||
@ -219,11 +272,11 @@ const parseSheetInfo = async (
|
||||
* @param {string} sheetUrl - 表格链接
|
||||
*/
|
||||
const setSheet = async (ctx: Context, sheetUrl: string) => {
|
||||
const { larkCard, larkService, logger } = ctx
|
||||
const { larkCard, larkService, logger, db } = ctx
|
||||
const cardGender = larkCard.child("webAgent")
|
||||
try {
|
||||
// 获取chat信息
|
||||
const chat = await db.chat.getAndCreate(ctx)
|
||||
const chat = await db.chat.getByCtx(ctx)
|
||||
if (!chat) throw new Error("获取聊天信息失败")
|
||||
// 获取是否已经有存在的sheet信息
|
||||
const existSheet = await db.sheet.getByUrl(sheetUrl)
|
||||
|
70
controller/searchAgent/index.ts
Normal file
70
controller/searchAgent/index.ts
Normal file
@ -0,0 +1,70 @@
|
||||
import { Context } from "../../types"
|
||||
import llm from "../../utils/llm"
|
||||
|
||||
/**
|
||||
* 生成网页简报
|
||||
* @param {Context} ctx - 上下文对象
|
||||
* @param {string} userDescription - 用户描述
|
||||
* @param {any} content - 网页内容
|
||||
* @returns {Promise<string>} - 返回简报内容
|
||||
* @throws {Error} - 当生成简报失败时抛出错误
|
||||
*/
|
||||
export const generateAnswer = async (
|
||||
ctx: Context,
|
||||
webSearchResults:
|
||||
| {
|
||||
siteName: string
|
||||
summary: string
|
||||
}[]
|
||||
| null
|
||||
): Promise<string> => {
|
||||
const {
|
||||
requestId,
|
||||
larkBody: { msgText },
|
||||
} = ctx
|
||||
const llmRes = (await llm.invoke(
|
||||
"searchAgent",
|
||||
{
|
||||
webSearchResults,
|
||||
time: new Date().toLocaleString("zh-CN", { timeZone: "Asia/Shanghai" }),
|
||||
userInput: msgText,
|
||||
},
|
||||
requestId,
|
||||
1
|
||||
)) as string
|
||||
if (!llmRes) throw new Error("模型侧错误")
|
||||
return llmRes
|
||||
}
|
||||
|
||||
const agent = async (ctx: Context, query: string) => {
|
||||
const {
|
||||
larkService: { message },
|
||||
attachService,
|
||||
larkCard,
|
||||
logger,
|
||||
} = ctx
|
||||
const cardGender = larkCard.child("searchAgent")
|
||||
try {
|
||||
// 发送一个loading卡片
|
||||
await message.updateOrReply(
|
||||
cardGender.genPendingCard("正在检索网络信息,请稍等片刻~")
|
||||
)
|
||||
const searchRes = await attachService.webSearch(query)
|
||||
await message.updateOrReply(
|
||||
cardGender.genPendingCard("LLM输出中,请稍等...")
|
||||
)
|
||||
const answer = await generateAnswer(ctx, searchRes)
|
||||
await message.updateOrReply(cardGender.genSuccessCard(answer))
|
||||
} catch (error: any) {
|
||||
logger.error(`searchAgent error: ${error}`)
|
||||
await message.updateOrReply(
|
||||
cardGender.genErrorCard(`检索失败: ${error.message}`)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
const searchAgent = {
|
||||
agent,
|
||||
}
|
||||
|
||||
export default searchAgent
|
@ -1,5 +1,4 @@
|
||||
import { SoupGameMessage } from "../../constant/message"
|
||||
import db from "../../db"
|
||||
import { SoupGame } from "../../db/soupGame"
|
||||
import { Context } from "../../types"
|
||||
|
||||
@ -14,6 +13,7 @@ const startOrStopGame = async (
|
||||
which: "auto" | "manual" = "manual"
|
||||
) => {
|
||||
const {
|
||||
db,
|
||||
logger,
|
||||
larkBody: { chatId },
|
||||
attachService,
|
||||
@ -128,6 +128,7 @@ const startOrStopGame = async (
|
||||
|
||||
const chat2Soup = async (ctx: Context) => {
|
||||
const {
|
||||
db,
|
||||
larkBody: { msgText, chatId, messageId },
|
||||
logger,
|
||||
attachService,
|
||||
@ -157,7 +158,7 @@ const chat2Soup = async (ctx: Context) => {
|
||||
return
|
||||
}
|
||||
// 继续游戏,更新历史记录
|
||||
await db.soupGame.insertHistory(activeGame.id, [
|
||||
await db.soupGame.overrideHistory(activeGame.id, [
|
||||
...activeGame.history,
|
||||
msgText,
|
||||
])
|
||||
@ -173,6 +174,7 @@ const chat2Soup = async (ctx: Context) => {
|
||||
const agent = async (ctx: Context) => {
|
||||
const {
|
||||
larkBody: { chatId, msgText },
|
||||
db,
|
||||
} = ctx
|
||||
if (!chatId) return
|
||||
const activeGame = await db.soupGame.getActiveOneByChatId(chatId)
|
||||
|
@ -1,48 +1,70 @@
|
||||
import { RecordModel } from "pocketbase"
|
||||
import PocketBase, { RecordModel } from "pocketbase"
|
||||
import { Logger } from "winston"
|
||||
|
||||
import { AppInfoModel } from "../../constant/config"
|
||||
import { managePbError } from "../../utils/pbTools"
|
||||
import pbClient from "../pbClient"
|
||||
import PbToolBase, { WithExpand } from "../base"
|
||||
|
||||
/** API密钥集合的名称常量 */
|
||||
const DB_NAME = "apiKey"
|
||||
|
||||
/**
|
||||
* API密钥基础数据结构接口
|
||||
* 定义了API密钥的基本字段
|
||||
*/
|
||||
export interface ApiKey {
|
||||
/** API密钥名称 */
|
||||
name: string
|
||||
/** API密钥拥有者标识符 */
|
||||
owner: string
|
||||
/** 关联的应用程序标识符 */
|
||||
app: string
|
||||
}
|
||||
|
||||
/**
|
||||
* API密钥模型类型,结合基础接口和PocketBase的记录模型
|
||||
*/
|
||||
export type ApiKeyModel = ApiKey & RecordModel
|
||||
|
||||
export interface ApiKeyModelWithApp extends ApiKeyModel {
|
||||
expand: {
|
||||
app: AppInfoModel
|
||||
/**
|
||||
* 扩展了应用信息的API密钥模型类型
|
||||
* 包含完整的应用程序信息
|
||||
*/
|
||||
export type ApiKeyModelWithApp = ApiKeyModel & WithExpand<{ app: AppInfoModel }>
|
||||
|
||||
/**
|
||||
* API密钥数据库操作类
|
||||
* 提供API密钥相关的特定查询和操作方法
|
||||
*
|
||||
* @extends PbToolBase<ApiKeyModel> 基础PocketBase操作类
|
||||
*/
|
||||
class ApiKeyDB extends PbToolBase<ApiKeyModel> {
|
||||
/**
|
||||
* 创建API密钥数据库操作实例
|
||||
*
|
||||
* @param pbClient - PocketBase客户端实例
|
||||
* @param logger - 日志记录器实例
|
||||
*/
|
||||
constructor(pbClient: PocketBase, logger: Logger) {
|
||||
super(DB_NAME, pbClient, logger)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取带有扩展应用信息的API密钥
|
||||
*
|
||||
* @param id - API密钥记录的ID
|
||||
* @returns 成功时返回包含应用信息的API密钥记录,失败时返回null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const apiKeyWithApp = await apiKeyDB.getWithApp("api_key_123");
|
||||
* if (apiKeyWithApp) {
|
||||
* console.log(`应用名称: ${apiKeyWithApp.expand.app.name}`);
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
public getWithApp = (id: string) => {
|
||||
return this.get<ApiKeyModelWithApp>(id, { expand: "app" })
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个 API Key 对应的 App 信息
|
||||
* @param id
|
||||
* @returns
|
||||
*/
|
||||
const getOne = (id: string) =>
|
||||
managePbError<ApiKeyModelWithApp>(() =>
|
||||
pbClient.collection(DB_NAME).getOne(id, {
|
||||
expand: "app",
|
||||
})
|
||||
)
|
||||
|
||||
/**
|
||||
* 创建 API Key
|
||||
* @param data
|
||||
* @returns
|
||||
*/
|
||||
const create = (data: ApiKey) =>
|
||||
managePbError<ApiKey>(() => pbClient.collection(DB_NAME).create(data))
|
||||
|
||||
const apiKey = {
|
||||
create,
|
||||
getOne,
|
||||
}
|
||||
|
||||
export default apiKey
|
||||
export default ApiKeyDB
|
||||
|
183
db/base/index.ts
Normal file
183
db/base/index.ts
Normal file
@ -0,0 +1,183 @@
|
||||
import PocketBase, {
|
||||
CommonOptions,
|
||||
RecordFullListOptions,
|
||||
RecordListOptions,
|
||||
RecordModel,
|
||||
RecordOptions,
|
||||
} from "pocketbase"
|
||||
import { Logger } from "winston"
|
||||
|
||||
/**
|
||||
* 用于扩展记录模型的接口,添加展开字段功能
|
||||
* @template T 基础对象类型
|
||||
*/
|
||||
export interface WithExpand<T extends { [key: string]: any } | undefined> {
|
||||
expand: T
|
||||
}
|
||||
|
||||
/**
|
||||
* PocketBase 数据操作基础类
|
||||
* 提供通用的 CRUD 操作方法,自动处理错误和日志
|
||||
*
|
||||
* @template T 继承自 RecordModel 的类型,表示数据库记录模型
|
||||
*/
|
||||
class PbToolBase<T extends RecordModel> {
|
||||
/** PocketBase 集合名称 */
|
||||
protected dbName: string
|
||||
/** PocketBase 客户端实例 */
|
||||
protected pbClient: PocketBase
|
||||
/** 日志记录器实例 */
|
||||
protected logger: Logger
|
||||
|
||||
/**
|
||||
* 创建 PbToolBase 实例
|
||||
*
|
||||
* @param dbName - PocketBase 集合名称
|
||||
* @param pbClient - PocketBase 客户端实例
|
||||
* @param logger - 日志记录器实例
|
||||
*/
|
||||
constructor(dbName: string, pbClient: PocketBase, logger: Logger) {
|
||||
this.dbName = dbName
|
||||
this.pbClient = pbClient
|
||||
this.logger = logger
|
||||
}
|
||||
|
||||
/**
|
||||
* 错误处理包装函数,捕获并记录 PocketBase 操作中的错误
|
||||
*
|
||||
* @template R - 返回结果类型
|
||||
* @param fn - 需要执行的异步函数
|
||||
* @returns 成功时返回执行结果,失败时返回 null 并记录错误
|
||||
*/
|
||||
protected managePbError = async <R>(fn: () => Promise<R>) => {
|
||||
try {
|
||||
return await fn()
|
||||
} catch (err: any) {
|
||||
this.logger.error(`pocketbase error: ${err.message}`)
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建新记录
|
||||
*
|
||||
* @param data - 要创建的记录数据
|
||||
* @returns 成功时返回创建的记录,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const record = await pbTool.create({ name: "示例", value: 100 });
|
||||
* ```
|
||||
*/
|
||||
public create = async (data: Partial<T>) => {
|
||||
return this.managePbError<T>(() =>
|
||||
this.pbClient.collection(this.dbName).create(data)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指定 ID 的记录
|
||||
*
|
||||
* @template R - 返回记录的类型,默认为 T
|
||||
* @param id - 记录 ID
|
||||
* @param options - 获取记录的选项参数
|
||||
* @returns 成功时返回查询到的记录,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const record = await pbTool.get("record123", { expand: "relation_field" });
|
||||
* ```
|
||||
*/
|
||||
public get = async <R extends T = T>(id: string, options?: RecordOptions) => {
|
||||
return this.managePbError<R>(() =>
|
||||
this.pbClient.collection(this.dbName).getOne(id, options)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新指定 ID 的记录
|
||||
*
|
||||
* @template R - 返回记录的类型,默认为 T
|
||||
* @param id - 记录 ID
|
||||
* @param data - 更新的数据
|
||||
* @param options - 更新记录的选项参数
|
||||
* @returns 成功时返回更新后的记录,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const updatedRecord = await pbTool.update("record123", { name: "新名称" });
|
||||
* ```
|
||||
*/
|
||||
public update = async <R extends T = T>(
|
||||
id: string,
|
||||
data: Partial<T>,
|
||||
options?: RecordOptions
|
||||
) => {
|
||||
return this.managePbError<R>(() =>
|
||||
this.pbClient.collection(this.dbName).update(id, data, options)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除指定 ID 的记录
|
||||
*
|
||||
* @param id - 要删除的记录 ID
|
||||
* @param options - 删除记录的选项参数
|
||||
* @returns 成功时返回 true,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const result = await pbTool.delete("record123");
|
||||
* ```
|
||||
*/
|
||||
public delete = async (id: string, options?: CommonOptions) => {
|
||||
return this.managePbError(() =>
|
||||
this.pbClient.collection(this.dbName).delete(id, options)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取记录列表
|
||||
*
|
||||
* @template R - 返回记录的类型,默认为 T
|
||||
* @param options - 列表查询选项,可包含排序、过滤和扩展等参数
|
||||
* @returns 成功时返回记录数组,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const records = await pbTool.list({
|
||||
* sort: "-created",
|
||||
* filter: "active=true"
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
public list = async <R extends T = T>(options?: RecordFullListOptions) => {
|
||||
return this.managePbError<R[]>(() =>
|
||||
this.pbClient.collection(this.dbName).getFullList(options)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取符合过滤条件的第一条记录
|
||||
*
|
||||
* @template R - 返回记录的类型,默认为 T
|
||||
* @param filter - 过滤条件
|
||||
* @param options - 查询选项
|
||||
* @returns 成功时返回第一条匹配记录,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const user = await pbTool.getFirstOne("email='test@example.com'");
|
||||
* ```
|
||||
*/
|
||||
public getFirstOne = async <R extends T = T>(
|
||||
filter: string,
|
||||
options?: RecordListOptions
|
||||
) => {
|
||||
return this.managePbError<R>(() =>
|
||||
this.pbClient.collection(this.dbName).getFirstListItem(filter, options)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default PbToolBase
|
218
db/chat/index.ts
218
db/chat/index.ts
@ -1,129 +1,133 @@
|
||||
import { RecordModel } from "pocketbase"
|
||||
import PocketBase, { RecordModel } from "pocketbase"
|
||||
import { Logger } from "winston"
|
||||
|
||||
import { Context } from "../../types"
|
||||
import { managePbError } from "../../utils/pbTools"
|
||||
import pbClient from "../pbClient"
|
||||
import PbToolBase, { WithExpand } from "../base"
|
||||
import { SheetModel } from "../sheet"
|
||||
|
||||
/** 聊天集合名称 */
|
||||
const DB_NAME = "chat"
|
||||
|
||||
/**
|
||||
* 聊天数据接口
|
||||
*/
|
||||
export interface Chat {
|
||||
/** 飞书聊天 ID */
|
||||
chatId: string
|
||||
/** 聊天名称 */
|
||||
name: string
|
||||
/** 聊天头像 URL */
|
||||
avatar: string
|
||||
/** 聊天模式: 群组、点对点或话题 */
|
||||
mode: "group" | "p2p" | "topic"
|
||||
/** 是否启用周报汇总 */
|
||||
weeklySummary: boolean
|
||||
/** 是否启用日报汇总 */
|
||||
dailySummary: boolean
|
||||
/** 关联表单 ID */
|
||||
sheet: string
|
||||
}
|
||||
|
||||
/** 聊天数据模型,继承基础的 RecordModel */
|
||||
export type ChatModel = Chat & RecordModel
|
||||
|
||||
export interface ChatModelWithExpand extends ChatModel {
|
||||
expand: {
|
||||
/**
|
||||
* 带有关联表单数据的聊天模型
|
||||
* 扩展了表单关联字段
|
||||
*/
|
||||
export type ChatModelWithSheet = ChatModel &
|
||||
WithExpand<{
|
||||
sheet: SheetModel
|
||||
}>
|
||||
|
||||
/**
|
||||
* 聊天数据管理类
|
||||
* 提供对飞书聊天相关数据的存储、查询和管理功能
|
||||
* 继承自 PbToolBase 基础工具类
|
||||
*/
|
||||
class ChatDB extends PbToolBase<ChatModel> {
|
||||
/**
|
||||
* 创建 ChatDB 实例
|
||||
*
|
||||
* @param pbClient - PocketBase 客户端实例
|
||||
* @param logger - 日志记录器实例
|
||||
*/
|
||||
constructor(pbClient: PocketBase, logger: Logger) {
|
||||
super(DB_NAME, pbClient, logger)
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过聊天 ID 获取聊天信息
|
||||
*
|
||||
* @param chatId - 飞书聊天 ID
|
||||
* @returns 聊天数据模型,包含关联的表单数据,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const chat = await chatDB.getOneByChatId("oc_123456");
|
||||
* ```
|
||||
*/
|
||||
public getOneByChatId = (chatId: string) => {
|
||||
const filter = `chatId = "${chatId}"`
|
||||
return this.getFirstOne<ChatModelWithSheet>(filter, { expand: "sheet" })
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据上下文获取聊天信息
|
||||
* 如果数据库中不存在,则尝试从飞书 API 获取并创建新记录
|
||||
*
|
||||
* @param context - 上下文对象,包含飞书服务和请求体
|
||||
* @returns 聊天数据模型,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const chat = await chatDB.getByCtx(ctx);
|
||||
* ```
|
||||
*/
|
||||
public getByCtx = async ({ larkService, larkBody }: Context) => {
|
||||
const { chatId } = larkBody
|
||||
if (!chatId) {
|
||||
this.logger.error(`chatId is empty`)
|
||||
return null
|
||||
}
|
||||
const chat = await this.getOneByChatId(chatId)
|
||||
if (chat) return chat
|
||||
this.logger.info(`chat ${chatId} not found, try to get from lark`)
|
||||
const chatInfo = await larkService.chat.getChatInfo(chatId)
|
||||
if (!chatInfo || chatInfo.code !== 0) return null
|
||||
const { name, avatar, chat_mode } = chatInfo.data
|
||||
return this.create({
|
||||
chatId,
|
||||
name,
|
||||
avatar,
|
||||
mode: chat_mode,
|
||||
weeklySummary: false,
|
||||
dailySummary: false,
|
||||
sheet: "",
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取需要汇总的聊天列表
|
||||
*
|
||||
* @param timeScope - 汇总时间范围:"daily"(日报)、"weekly"(周报)或"all"(全部)
|
||||
* @returns 符合条件的聊天数据模型列表,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const dailyChats = await chatDB.getNeedSummaryChats("daily");
|
||||
* ```
|
||||
*/
|
||||
public getNeedSummaryChats = async (
|
||||
timeScope: "daily" | "weekly" | "all"
|
||||
) => {
|
||||
const filterMap = {
|
||||
daily: "dailySummary = true",
|
||||
weekly: "weeklySummary = true",
|
||||
all: "dailySummary = true && weeklySummary = true",
|
||||
}
|
||||
return this.list<ChatModel>({ filter: filterMap[timeScope] })
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个群组信息
|
||||
* @param id
|
||||
* @returns
|
||||
*/
|
||||
const getOneByChatId = (chatId: string) =>
|
||||
managePbError<ChatModelWithExpand>(() =>
|
||||
pbClient
|
||||
.collection<ChatModelWithExpand>(DB_NAME)
|
||||
.getFirstListItem(`chatId = "${chatId}"`, {
|
||||
expand: "sheet",
|
||||
})
|
||||
)
|
||||
|
||||
/**
|
||||
* 创建群组
|
||||
* @param chat
|
||||
* @returns
|
||||
*/
|
||||
const create = (chat: Chat) =>
|
||||
managePbError<ChatModel>(() => pbClient.collection(DB_NAME).create(chat))
|
||||
|
||||
/**
|
||||
* 获取并创建群组
|
||||
* @param chatId
|
||||
* @param context
|
||||
* @returns
|
||||
*/
|
||||
const getAndCreate = async ({ larkService, logger, larkBody }: Context) => {
|
||||
const { chatId } = larkBody
|
||||
if (!chatId) {
|
||||
logger.error(`chatId is empty`)
|
||||
return null
|
||||
}
|
||||
const chat = await getOneByChatId(chatId)
|
||||
if (chat) return chat
|
||||
logger.info(`chat ${chatId} not found, try to get from lark`)
|
||||
const chatInfo = await larkService.chat.getChatInfo(chatId)
|
||||
if (!chatInfo || chatInfo.code !== 0) return null
|
||||
const { name, avatar, chat_mode } = chatInfo.data
|
||||
const newChat = {
|
||||
chatId,
|
||||
name,
|
||||
avatar,
|
||||
mode: chat_mode,
|
||||
weeklySummary: false,
|
||||
dailySummary: false,
|
||||
sheet: "",
|
||||
}
|
||||
return create(newChat)
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新群组
|
||||
* @param id
|
||||
* @param chat
|
||||
* @returns
|
||||
*/
|
||||
const update = (id: string, chat: Partial<Chat>) =>
|
||||
managePbError<ChatModel>(() => pbClient.collection(DB_NAME).update(id, chat))
|
||||
|
||||
/**
|
||||
* 更新群组总结
|
||||
* @param id
|
||||
* @param timeScope
|
||||
* @param value
|
||||
* @returns
|
||||
*/
|
||||
const updateSummary = async (
|
||||
id: string,
|
||||
timeScope: "daily" | "weekly",
|
||||
value: boolean
|
||||
) =>
|
||||
managePbError<ChatModel>(() =>
|
||||
pbClient.collection(DB_NAME).update(id, { [`${timeScope}Summary`]: value })
|
||||
)
|
||||
|
||||
/**
|
||||
* 获取需要总结的群组
|
||||
* @param timeScope
|
||||
* @returns
|
||||
*/
|
||||
const getNeedSummaryChats = async (timeScope: "daily" | "weekly" | "all") => {
|
||||
const filterMap = {
|
||||
daily: "dailySummary = true",
|
||||
weekly: "weeklySummary = true",
|
||||
all: "dailySummary = true && weeklySummary = true",
|
||||
}
|
||||
return managePbError<ChatModel[]>(() =>
|
||||
pbClient.collection(DB_NAME).getFullList({ filter: filterMap[timeScope] })
|
||||
)
|
||||
}
|
||||
|
||||
const chat = {
|
||||
update,
|
||||
getAndCreate,
|
||||
getOneByChatId,
|
||||
updateSummary,
|
||||
getNeedSummaryChats,
|
||||
}
|
||||
|
||||
export default chat
|
||||
export default ChatDB
|
||||
|
@ -1,97 +1,121 @@
|
||||
import { Gitlab, GitlabService } from "@egg/net-tool"
|
||||
import { RecordModel } from "pocketbase"
|
||||
import PocketBase, { RecordModel } from "pocketbase"
|
||||
import { Logger } from "winston"
|
||||
|
||||
import { Context } from "../../types"
|
||||
import { managePbError } from "../../utils/pbTools"
|
||||
import pbClient from "../pbClient"
|
||||
import PbToolBase from "../base"
|
||||
|
||||
const DB_NAME = "gitlabProject"
|
||||
|
||||
// Gitlab项目接口定义
|
||||
/**
|
||||
* Gitlab项目接口定义
|
||||
* 描述Gitlab项目的基本属性和配置
|
||||
*/
|
||||
export interface GitlabProject {
|
||||
/** Gitlab项目ID */
|
||||
projectId: number
|
||||
/** 项目名称 */
|
||||
name: string
|
||||
/** 项目描述 */
|
||||
desc: string
|
||||
/** 带命名空间的项目路径 */
|
||||
pathWithNamespace: string
|
||||
/** 项目网页URL */
|
||||
webUrl: string
|
||||
/** 是否开启CI/CD通知 */
|
||||
openCICDNotify: boolean
|
||||
/** 是否开启合并请求总结 */
|
||||
openMRSummary: boolean
|
||||
}
|
||||
|
||||
// Gitlab项目模型类型
|
||||
/**
|
||||
* Gitlab项目模型类型
|
||||
* 将Gitlab项目接口与PocketBase记录模型合并
|
||||
*/
|
||||
export type GitlabProjectModel = GitlabProject & RecordModel
|
||||
|
||||
/**
|
||||
* 创建Gitlab项目
|
||||
* @param {GitlabProject} project - Gitlab项目信息
|
||||
* @returns {Promise<GitlabProjectModel>} - 创建的Gitlab项目模型
|
||||
* GitlabProject数据库操作类
|
||||
* 提供Gitlab项目相关的数据库操作方法,继承自PbToolBase
|
||||
*/
|
||||
const create = async (project: GitlabProject) =>
|
||||
managePbError<GitlabProjectModel>(() =>
|
||||
pbClient.collection(DB_NAME).create(project)
|
||||
)
|
||||
|
||||
/**
|
||||
* 通过项目ID获取Gitlab项目
|
||||
* @param {number} projectId - 项目ID
|
||||
* @returns {Promise<GitlabProjectModel | null>} - Gitlab项目模型或null
|
||||
*/
|
||||
const getByProjectId = async (projectId: number) =>
|
||||
managePbError<GitlabProjectModel>(() =>
|
||||
pbClient.collection(DB_NAME).getFirstListItem(`projectId = "${projectId}"`)
|
||||
)
|
||||
|
||||
/**
|
||||
* 通过项目ID获取Gitlab项目,如果不存在则创建
|
||||
* @param {number} projectId - 项目ID
|
||||
* @param {GitlabService} gitlabService - Gitlab服务
|
||||
* @returns {Promise<GitlabProjectModel | null>} - Gitlab项目模型或null
|
||||
*/
|
||||
const getAndCreate = async (
|
||||
projectId: number,
|
||||
gitlabService: GitlabService
|
||||
) => {
|
||||
const project = await getByProjectId(projectId)
|
||||
if (project) return project
|
||||
gitlabService.setProjectId(projectId)
|
||||
const projectInfo = await gitlabService.project.getDetail()
|
||||
if (!projectInfo) return null
|
||||
const { name, description, path_with_namespace, web_url } = projectInfo
|
||||
const newProject = {
|
||||
projectId,
|
||||
name,
|
||||
desc: description,
|
||||
pathWithNamespace: path_with_namespace,
|
||||
webUrl: web_url,
|
||||
openCICDNotify: false,
|
||||
openMRSummary: false,
|
||||
class GitlabProjectDB extends PbToolBase<GitlabProjectModel> {
|
||||
/**
|
||||
* 创建GitlabProjectDB实例
|
||||
*
|
||||
* @param pbClient - PocketBase客户端实例
|
||||
* @param logger - 日志记录器实例
|
||||
*/
|
||||
constructor(pbClient: PocketBase, logger: Logger) {
|
||||
super(DB_NAME, pbClient, logger)
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据项目ID获取Gitlab项目
|
||||
*
|
||||
* @param projectId - Gitlab项目ID
|
||||
* @returns 成功时返回项目记录,失败时返回null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const project = await gitlabProjectDB.getByProjectId(12345);
|
||||
* ```
|
||||
*/
|
||||
public getByProjectId = (projectId: number) => {
|
||||
return this.getFirstOne(`projectId = "${projectId}"`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目信息,如不存在则从Gitlab获取并创建
|
||||
*
|
||||
* @param projectId - Gitlab项目ID
|
||||
* @param gitlabService - Gitlab服务实例
|
||||
* @returns 成功时返回项目记录,失败时返回null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const project = await gitlabProjectDB.getAndCreate(12345, gitlabService);
|
||||
* ```
|
||||
*/
|
||||
public getAndCreate = async (
|
||||
projectId: number,
|
||||
gitlabService: GitlabService
|
||||
) => {
|
||||
const project = await this.getByProjectId(projectId)
|
||||
if (project) return project
|
||||
gitlabService.setProjectId(projectId)
|
||||
const projectInfo = await gitlabService.project.getDetail()
|
||||
if (!projectInfo) return null
|
||||
const { name, description, path_with_namespace, web_url } = projectInfo
|
||||
const newProject = {
|
||||
projectId,
|
||||
name,
|
||||
desc: description,
|
||||
pathWithNamespace: path_with_namespace,
|
||||
webUrl: web_url,
|
||||
openCICDNotify: false,
|
||||
openMRSummary: false,
|
||||
}
|
||||
return await this.create(newProject)
|
||||
}
|
||||
|
||||
/**
|
||||
* 从上下文获取Gitlab项目信息
|
||||
* 解析请求上下文中的项目ID,获取或创建项目记录
|
||||
*
|
||||
* @param context - 请求上下文,包含请求体和Gitlab服务
|
||||
* @returns 成功时返回项目记录,失败时返回null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const project = await gitlabProjectDB.getByCtx(ctx);
|
||||
* ```
|
||||
*/
|
||||
public getByCtx = async ({ body: rawBody, gitlabService }: Context) => {
|
||||
const body = rawBody as Gitlab.PipelineEvent | Gitlab.MergeRequestEvent
|
||||
const projectId = body.project.id
|
||||
if (!projectId) return null
|
||||
return await this.getAndCreate(projectId, gitlabService)
|
||||
}
|
||||
return await create(newProject)
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过上下文获取Gitlab项目
|
||||
* @param {Context} context - 上下文对象
|
||||
* @returns {Promise<GitlabProjectModel | null>} - Gitlab项目模型或null
|
||||
*/
|
||||
const getByCtx = async ({ body: rawBody, gitlabService }: Context) => {
|
||||
const body = rawBody as Gitlab.PipelineEvent | Gitlab.MergeRequestEvent
|
||||
const projectId = body.project.id
|
||||
if (!projectId) return null
|
||||
return await getAndCreate(projectId, gitlabService)
|
||||
}
|
||||
|
||||
const update = async (id: string, project: Partial<GitlabProjectModel>) =>
|
||||
managePbError<GitlabProjectModel>(() =>
|
||||
pbClient.collection(DB_NAME).update(id, project)
|
||||
)
|
||||
|
||||
const gitlabProject = {
|
||||
create,
|
||||
update,
|
||||
getByProjectId,
|
||||
getByCtx,
|
||||
getAndCreate,
|
||||
}
|
||||
|
||||
export default gitlabProject
|
||||
export default GitlabProjectDB
|
||||
|
@ -1,30 +1,51 @@
|
||||
import { RecordModel } from "pocketbase"
|
||||
import PocketBase, { RecordModel } from "pocketbase"
|
||||
import { Logger } from "winston"
|
||||
|
||||
import { managePbError } from "../../utils/pbTools"
|
||||
import pbClient from "../pbClient"
|
||||
import PbToolBase from "../base"
|
||||
|
||||
/** GroupSummaryLog 集合名称 */
|
||||
const DB_NAME = "grpSumLog"
|
||||
|
||||
/**
|
||||
* 群组摘要日志接口
|
||||
* 定义了群组摘要记录的数据结构
|
||||
*/
|
||||
export interface GroupSummaryLog {
|
||||
/** 关联的聊天 ID */
|
||||
chat: string
|
||||
/** 摘要内容 */
|
||||
content: string
|
||||
/** Langfuse 链接引用 */
|
||||
langfuseLink: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 群组摘要日志模型类型
|
||||
* 结合了 GroupSummaryLog 接口和 RecordModel 基础类型
|
||||
*/
|
||||
export type GroupSummaryLogModel = GroupSummaryLog & RecordModel
|
||||
|
||||
/**
|
||||
* 创建群总结日志
|
||||
* @param log
|
||||
* @returns
|
||||
* 群组摘要日志数据库操作类
|
||||
* 提供对群组摘要日志集合的 CRUD 操作
|
||||
*
|
||||
* @extends PbToolBase<GroupSummaryLogModel>
|
||||
*/
|
||||
const create = async (log: GroupSummaryLog) =>
|
||||
managePbError<GroupSummaryLogModel>(() =>
|
||||
pbClient.collection(DB_NAME).create(log)
|
||||
)
|
||||
|
||||
const grpSumLog = {
|
||||
create,
|
||||
class GroupSummaryLogDB extends PbToolBase<GroupSummaryLogModel> {
|
||||
/**
|
||||
* 创建群组摘要日志数据库操作实例
|
||||
*
|
||||
* @param pbClient - PocketBase 客户端实例
|
||||
* @param logger - 日志记录器实例
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const summaryLogDB = new GroupSummaryLogDB(pbClient, logger);
|
||||
* ```
|
||||
*/
|
||||
constructor(pbClient: PocketBase, logger: Logger) {
|
||||
super(DB_NAME, pbClient, logger)
|
||||
}
|
||||
}
|
||||
|
||||
export default grpSumLog
|
||||
export default GroupSummaryLogDB
|
||||
|
55
db/index.ts
55
db/index.ts
@ -1,23 +1,38 @@
|
||||
import apiKey from "./apiKey"
|
||||
import chat from "./chat"
|
||||
import gitlabProject from "./gitlabProject/index."
|
||||
import grpSumLog from "./grpSumLog"
|
||||
import log from "./log"
|
||||
import receiveGroup from "./receiveGroup"
|
||||
import sheet from "./sheet"
|
||||
import soupGame from "./soupGame"
|
||||
import user from "./user"
|
||||
import { Logger } from "winston"
|
||||
|
||||
const db = {
|
||||
chat,
|
||||
apiKey,
|
||||
receiveGroup,
|
||||
log,
|
||||
user,
|
||||
grpSumLog,
|
||||
gitlabProject,
|
||||
soupGame,
|
||||
sheet,
|
||||
import ApiKeyDB from "./apiKey"
|
||||
import ChatDB from "./chat"
|
||||
import GitlabProjectDB from "./gitlabProject/index."
|
||||
import GroupSummaryLogDB from "./grpSumLog"
|
||||
import LogDB from "./log"
|
||||
import pbClient from "./pbClient"
|
||||
import ReceiveGroupDB from "./receiveGroup"
|
||||
import SheetDB from "./sheet"
|
||||
import SoupGameDB from "./soupGame"
|
||||
import UserDB from "./user"
|
||||
|
||||
class DB {
|
||||
public user: UserDB
|
||||
public apiKey: ApiKeyDB
|
||||
public chat: ChatDB
|
||||
public receiveGroup: ReceiveGroupDB
|
||||
public log: LogDB
|
||||
public grpSumLog: GroupSummaryLogDB
|
||||
public gitlabProject: GitlabProjectDB
|
||||
public soupGame: SoupGameDB
|
||||
public sheet: SheetDB
|
||||
|
||||
constructor(logger: Logger) {
|
||||
this.user = new UserDB(pbClient, logger)
|
||||
this.apiKey = new ApiKeyDB(pbClient, logger)
|
||||
this.chat = new ChatDB(pbClient, logger)
|
||||
this.receiveGroup = new ReceiveGroupDB(pbClient, logger)
|
||||
this.log = new LogDB(pbClient, logger)
|
||||
this.grpSumLog = new GroupSummaryLogDB(pbClient, logger)
|
||||
this.gitlabProject = new GitlabProjectDB(pbClient, logger)
|
||||
this.soupGame = new SoupGameDB(pbClient, logger)
|
||||
this.sheet = new SheetDB(pbClient, logger)
|
||||
}
|
||||
}
|
||||
|
||||
export default db
|
||||
export default DB
|
||||
|
@ -1,34 +1,58 @@
|
||||
import { RecordModel } from "pocketbase"
|
||||
import PocketBase, { RecordModel } from "pocketbase"
|
||||
import { Logger } from "winston"
|
||||
|
||||
import { managePbError } from "../../utils/pbTools"
|
||||
import pbClient from "../pbClient"
|
||||
import PbToolBase from "../base"
|
||||
|
||||
const DB_NAME = "messageLog"
|
||||
|
||||
/**
|
||||
* 消息日志接口,定义消息日志的数据结构
|
||||
* 用于记录系统消息的发送、接收和处理过程
|
||||
*/
|
||||
export interface Log {
|
||||
/** API 密钥,用于身份验证和追踪 */
|
||||
apiKey: string
|
||||
/** 消息所属群组 ID,可选 */
|
||||
groupId?: string
|
||||
/** 接收者 ID,可选 */
|
||||
receiveId?: string
|
||||
/** 接收者 ID 类型,例如用户ID、群组ID等,可选 */
|
||||
receiveIdType?: string
|
||||
/** 消息类型,例如文本、图片、语音等 */
|
||||
msgType: string
|
||||
/** 原始消息内容 */
|
||||
content: string
|
||||
/** 处理后的最终消息内容,可选 */
|
||||
finalContent?: string
|
||||
/** 消息发送结果,可包含发送状态、时间等信息,可选 */
|
||||
sendResult?: any
|
||||
/** 处理过程中的错误信息,可选 */
|
||||
error?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 消息日志模型类型,结合 Log 接口和 PocketBase 的 RecordModel
|
||||
*/
|
||||
export type LogModel = Log & RecordModel
|
||||
|
||||
/**
|
||||
* 创建一条日志
|
||||
* @param log
|
||||
* @returns
|
||||
* 消息日志数据库操作类
|
||||
*
|
||||
* 提供消息日志相关的数据库操作,继承自 PbToolBase 基础类
|
||||
* 用于记录和查询系统中的消息传递过程,便于调试和审计
|
||||
*
|
||||
* @extends PbToolBase<LogModel> 基础数据库操作类
|
||||
*/
|
||||
const create = (log: Log) =>
|
||||
managePbError(() => pbClient.collection(DB_NAME).create(log))
|
||||
|
||||
const log = {
|
||||
create,
|
||||
class LogDB extends PbToolBase<LogModel> {
|
||||
/**
|
||||
* 创建 LogDB 实例
|
||||
*
|
||||
* @param pbClient - PocketBase 客户端实例,用于与数据库通信
|
||||
* @param logger - 日志记录器实例,用于记录操作日志
|
||||
*/
|
||||
constructor(pbClient: PocketBase, logger: Logger) {
|
||||
super(DB_NAME, pbClient, logger)
|
||||
}
|
||||
}
|
||||
|
||||
export default log
|
||||
export default LogDB
|
||||
|
@ -1,39 +1,69 @@
|
||||
import { RecordModel } from "pocketbase"
|
||||
import PocketBase, { RecordModel } from "pocketbase"
|
||||
import { Logger } from "winston"
|
||||
|
||||
import { AppInfoModel } from "../../constant/config"
|
||||
import { managePbError } from "../../utils/pbTools"
|
||||
import pbClient from "../pbClient"
|
||||
import PbToolBase, { WithExpand } from "../base"
|
||||
|
||||
const DB_NAME = "receiveGroup"
|
||||
|
||||
/**
|
||||
* 接收组接口,定义接收消息的群组数据结构
|
||||
* 用于管理消息接收者分组信息
|
||||
*/
|
||||
export interface ReceiveGroup {
|
||||
/** 接收组名称 */
|
||||
name: string
|
||||
/** 聊天群组ID列表,可选 */
|
||||
chatId?: string[]
|
||||
/** 用户ID列表,可选 */
|
||||
userId?: string[]
|
||||
}
|
||||
|
||||
/**
|
||||
* 接收组模型类型,结合 ReceiveGroup 接口和 PocketBase 的 RecordModel
|
||||
*/
|
||||
export type ReceiveGroupModel = ReceiveGroup & RecordModel
|
||||
|
||||
export interface ReceiveGroupModelWithApp extends ReceiveGroupModel {
|
||||
expand: {
|
||||
app: AppInfoModel
|
||||
/**
|
||||
* 带应用信息的接收组模型类型
|
||||
* 扩展了基础接收组模型,包含关联的应用信息
|
||||
*/
|
||||
export type ReceiveGroupModelWithApp = ReceiveGroupModel &
|
||||
WithExpand<{ app: AppInfoModel }>
|
||||
|
||||
/**
|
||||
* 接收组数据库操作类
|
||||
*
|
||||
* 提供接收组相关的数据库操作,继承自 PbToolBase 基础类
|
||||
* 用于管理消息发送目标群组,支持查询带应用信息的接收组
|
||||
*
|
||||
* @extends PbToolBase<ReceiveGroupModel> 基础数据库操作类
|
||||
*/
|
||||
class ReceiveGroupDB extends PbToolBase<ReceiveGroupModel> {
|
||||
/**
|
||||
* 创建 ReceiveGroupDB 实例
|
||||
*
|
||||
* @param pbClient - PocketBase 客户端实例,用于与数据库通信
|
||||
* @param logger - 日志记录器实例,用于记录操作日志
|
||||
*/
|
||||
constructor(pbClient: PocketBase, logger: Logger) {
|
||||
super(DB_NAME, pbClient, logger)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取带应用信息的接收组
|
||||
*
|
||||
* @param id - 接收组ID
|
||||
* @returns 带应用信息的接收组记录,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const groupWithApp = await receiveGroupDB.getWithApp("group123");
|
||||
* ```
|
||||
*/
|
||||
public getWithApp = (id: string) => {
|
||||
return this.get<ReceiveGroupModelWithApp>(id, { expand: "app" })
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获取指定消息组
|
||||
* @param id
|
||||
* @returns
|
||||
*/
|
||||
const getOne = (id: string) =>
|
||||
managePbError<ReceiveGroupModelWithApp>(() =>
|
||||
pbClient.collection(DB_NAME).getOne(id, {
|
||||
expand: "app",
|
||||
})
|
||||
)
|
||||
|
||||
const receiveGroup = {
|
||||
getOne,
|
||||
}
|
||||
|
||||
export default receiveGroup
|
||||
export default ReceiveGroupDB
|
||||
|
@ -1,44 +1,66 @@
|
||||
import { RecordModel } from "pocketbase"
|
||||
import PocketBase, { RecordModel } from "pocketbase"
|
||||
import { Logger } from "winston"
|
||||
|
||||
import { managePbError } from "../../utils/pbTools"
|
||||
import pbClient from "../pbClient"
|
||||
import PbToolBase from "../base"
|
||||
|
||||
const DB_NAME = "sheet"
|
||||
|
||||
/**
|
||||
* 表格数据接口,定义了表格的基本属性
|
||||
*/
|
||||
export interface Sheet {
|
||||
/***
|
||||
* 表格区间
|
||||
/**
|
||||
* 表格区间,例如 "A1:Z100"
|
||||
*/
|
||||
range: string
|
||||
/***
|
||||
* 表格Token
|
||||
/**
|
||||
* 表格访问令牌,用于API验证
|
||||
*/
|
||||
sheetToken: string
|
||||
/***
|
||||
* 表格链接
|
||||
/**
|
||||
* 表格的完整URL地址
|
||||
*/
|
||||
sheetUrl: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 表格数据模型类型,继承基础数据接口并添加RecordModel属性
|
||||
*
|
||||
* RecordModel提供了id、created、updated等基础字段
|
||||
*/
|
||||
export type SheetModel = Sheet & RecordModel
|
||||
|
||||
const getByUrl = (sheetUrl: string) =>
|
||||
managePbError<SheetModel>(() =>
|
||||
pbClient.collection(DB_NAME).getFirstListItem(`sheetUrl = "${sheetUrl}"`)
|
||||
)
|
||||
/**
|
||||
* 表格数据库操作类
|
||||
*
|
||||
* 提供表格数据的增删改查及特定查询方法
|
||||
* 继承自PbToolBase类,复用基础CRUD操作
|
||||
*/
|
||||
class SheetDB extends PbToolBase<SheetModel> {
|
||||
/**
|
||||
* 创建表格数据库操作实例
|
||||
*
|
||||
* @param pbClient - PocketBase客户端实例
|
||||
* @param logger - 日志记录器实例
|
||||
*/
|
||||
constructor(pbClient: PocketBase, logger: Logger) {
|
||||
super(DB_NAME, pbClient, logger)
|
||||
}
|
||||
|
||||
const update = (id: string, sheet: Partial<SheetModel>) =>
|
||||
managePbError<SheetModel>(() =>
|
||||
pbClient.collection(DB_NAME).update(id, sheet)
|
||||
)
|
||||
|
||||
const create = (sheet: Sheet) =>
|
||||
managePbError<SheetModel>(() => pbClient.collection(DB_NAME).create(sheet))
|
||||
|
||||
const sheet = {
|
||||
getByUrl,
|
||||
update,
|
||||
create,
|
||||
/**
|
||||
* 根据表格URL获取表格记录
|
||||
*
|
||||
* @param sheetUrl - 表格的URL地址
|
||||
* @returns 成功时返回匹配的表格记录,失败时返回null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const sheet = await sheetDB.getByUrl("https://example.com/sheets/12345");
|
||||
* ```
|
||||
*/
|
||||
public getByUrl = (sheetUrl: string) => {
|
||||
return this.getFirstOne(`sheetUrl = "${sheetUrl}"`)
|
||||
}
|
||||
}
|
||||
|
||||
export default sheet
|
||||
export default SheetDB
|
||||
|
@ -1,69 +1,97 @@
|
||||
import { RecordModel } from "pocketbase"
|
||||
import PocketBase, { RecordModel } from "pocketbase"
|
||||
import { Logger } from "winston"
|
||||
|
||||
import { managePbError } from "../../utils/pbTools"
|
||||
import pbClient from "../pbClient"
|
||||
import PbToolBase from "../base"
|
||||
|
||||
const DB_NAME = "soupGame"
|
||||
|
||||
/**
|
||||
* 表示海龟汤游戏的数据结构
|
||||
* 海龟汤是一种推理游戏,玩家根据故事的开头和结局,通过提问来猜测故事完整内容
|
||||
* 存储游戏的基本信息、历史记录和状态
|
||||
*/
|
||||
export interface SoupGame {
|
||||
/** 聊天会话的唯一标识符 */
|
||||
chatId: string
|
||||
/** 海龟汤游戏标题 */
|
||||
title: string
|
||||
/** 游戏的初始问题或谜题 */
|
||||
query: string
|
||||
/** 海龟汤游戏的正确答案或完整故事 */
|
||||
answer: string
|
||||
/** 游戏过程中的提问和回答历史记录 */
|
||||
history: string[]
|
||||
/** 游戏是否处于活跃状态 */
|
||||
active: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* 海龟汤游戏数据模型类型,继承基本游戏接口和PocketBase记录模型
|
||||
*/
|
||||
export type SoupGameModel = SoupGame & RecordModel
|
||||
|
||||
/**
|
||||
* 创建一个新的SoupGame记录
|
||||
* @param {SoupGame} soupGame - SoupGame对象
|
||||
* @returns {Promise<SoupGameModel>} - 创建的SoupGame记录
|
||||
* 海龟汤游戏数据库操作类
|
||||
* 提供获取、更新和关闭游戏等功能
|
||||
*
|
||||
* @extends PbToolBase<SoupGameModel> 继承PocketBase基础工具类
|
||||
*/
|
||||
const create = (soupGame: SoupGame) =>
|
||||
managePbError<SoupGameModel>(() =>
|
||||
pbClient.collection(DB_NAME).create(soupGame)
|
||||
)
|
||||
class SoupGameDB extends PbToolBase<SoupGameModel> {
|
||||
/**
|
||||
* 创建海龟汤游戏数据库操作实例
|
||||
*
|
||||
* @param pbClient - PocketBase 客户端实例
|
||||
* @param logger - 日志记录器实例
|
||||
*/
|
||||
constructor(pbClient: PocketBase, logger: Logger) {
|
||||
super(DB_NAME, pbClient, logger)
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据chatId获取一个活跃的SoupGame记录
|
||||
* @param {string} chatId - 聊天ID
|
||||
* @returns {Promise<SoupGameModel>} - 获取的SoupGame记录
|
||||
*/
|
||||
const getActiveOneByChatId = (chatId: string) =>
|
||||
managePbError<SoupGameModel>(() =>
|
||||
pbClient
|
||||
.collection(DB_NAME)
|
||||
.getFirstListItem(`chatId = "${chatId}" && active = true`)
|
||||
)
|
||||
/**
|
||||
* 根据聊天ID获取当前活跃的海龟汤游戏
|
||||
*
|
||||
* @param chatId - 聊天会话的唯一标识符
|
||||
* @returns 成功时返回活跃的游戏记录,失败时返回null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const activeGame = await soupGameDb.getActiveOneByChatId("chat123");
|
||||
* ```
|
||||
*/
|
||||
public getActiveOneByChatId = (chatId: string) => {
|
||||
return this.getFirstOne(`chatId = "${chatId}" && active = true`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据chatId关闭一个SoupGame记录
|
||||
* @param {string} chatId - 聊天ID
|
||||
* @returns {Promise<SoupGameModel>} - 更新的SoupGame记录
|
||||
*/
|
||||
const close = (id: string) =>
|
||||
managePbError<SoupGameModel>(() =>
|
||||
pbClient.collection(DB_NAME).update(id, { active: false })
|
||||
)
|
||||
/**
|
||||
* 关闭指定ID的海龟汤游戏,将其状态设置为非活跃
|
||||
*
|
||||
* @param id - 游戏记录的唯一标识符
|
||||
* @returns 成功时返回更新后的游戏记录,失败时返回null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const closedGame = await soupGameDb.close("game123");
|
||||
* ```
|
||||
*/
|
||||
public close = (id: string) => {
|
||||
return this.update(id, { active: false })
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据chatId插入历史记录
|
||||
* @param {string} chatId - 聊天ID
|
||||
* @param {string} history - 历史记录
|
||||
* @returns {Promise<SoupGameModel>} - 更新的SoupGame记录
|
||||
*/
|
||||
const insertHistory = (id: string, history: string[]) =>
|
||||
managePbError<SoupGameModel>(() =>
|
||||
pbClient.collection(DB_NAME).update(id, { history })
|
||||
)
|
||||
|
||||
const soupGame = {
|
||||
create,
|
||||
getActiveOneByChatId,
|
||||
close,
|
||||
insertHistory,
|
||||
/**
|
||||
* 覆盖更新指定海龟汤游戏的历史记录
|
||||
*
|
||||
* @param id - 游戏记录的唯一标识符
|
||||
* @param history - 新的历史记录数组,包含玩家提问和回答
|
||||
* @returns 成功时返回更新后的游戏记录,失败时返回null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const updatedGame = await soupGameDb.overrideHistory("game123", ["问题1", "回答1", "问题2", "回答2"]);
|
||||
* ```
|
||||
*/
|
||||
public overrideHistory = (id: string, history: string[]) => {
|
||||
return this.update(id, { history })
|
||||
}
|
||||
}
|
||||
|
||||
export default soupGame
|
||||
export default SoupGameDB
|
||||
|
140
db/user/index.ts
140
db/user/index.ts
@ -1,83 +1,103 @@
|
||||
import { RecordModel } from "pocketbase"
|
||||
import PocketBase, { RecordModel } from "pocketbase"
|
||||
import { Logger } from "winston"
|
||||
|
||||
import { Context } from "../../types"
|
||||
import { managePbError } from "../../utils/pbTools"
|
||||
import pbClient from "../pbClient"
|
||||
import PbToolBase from "../base"
|
||||
|
||||
const DB_NAME = "users"
|
||||
|
||||
// 用户接口定义
|
||||
/**
|
||||
* 用户基础信息接口定义
|
||||
*/
|
||||
interface User {
|
||||
/** 用户邮箱 */
|
||||
email: string
|
||||
/** 用户名称 */
|
||||
name: string
|
||||
/** 飞书用户 Open ID */
|
||||
openId: string
|
||||
/** 飞书用户 User ID */
|
||||
userId: string
|
||||
/** 用户头像链接 */
|
||||
avatar: string
|
||||
/** 用户密码 */
|
||||
password: string
|
||||
/** 邮箱可见性标志 */
|
||||
emailVisibility: boolean
|
||||
/** 用户邮箱是否已验证 */
|
||||
verified: boolean
|
||||
}
|
||||
|
||||
// 用户模型类型
|
||||
/** 完整用户模型类型,包含 PocketBase 记录基础字段 */
|
||||
export type UserModel = User & RecordModel
|
||||
|
||||
/**
|
||||
* 创建用户
|
||||
* @param {User} user - 用户信息
|
||||
* @returns {Promise<UserModel>} - 创建的用户模型
|
||||
* 用户数据库操作类
|
||||
* 提供用户相关的查询、创建等操作
|
||||
*/
|
||||
const create = async (user: User) =>
|
||||
managePbError<UserModel>(() => pbClient.collection(DB_NAME).create(user))
|
||||
|
||||
/**
|
||||
* 通过用户ID获取用户
|
||||
* @param {string} userId - 用户ID
|
||||
* @returns {Promise<UserModel | null>} - 用户模型或null
|
||||
*/
|
||||
const getByUserId = async (userId: string) =>
|
||||
managePbError<UserModel>(() =>
|
||||
pbClient.collection(DB_NAME).getFirstListItem(`userId = "${userId}"`)
|
||||
)
|
||||
|
||||
/**
|
||||
* 通过上下文获取用户
|
||||
* @param {Context} context - 上下文对象
|
||||
* @returns {Promise<UserModel | null>} - 用户模型或null
|
||||
*/
|
||||
const getByCtx = async ({ larkBody, larkService }: Context) => {
|
||||
if (!larkBody.userId) return null
|
||||
// 先从数据库获取用户信息
|
||||
const user = await getByUserId(larkBody.userId)
|
||||
if (user) return user
|
||||
// 如果数据库中没有用户信息,从larkService获取用户信息
|
||||
const userInfo = await larkService.user.getOne(larkBody.userId, "user_id")
|
||||
if (userInfo.code === 0) return null
|
||||
// 解构用户信息
|
||||
const {
|
||||
user_id,
|
||||
open_id,
|
||||
avatar: { avatar_origin },
|
||||
email,
|
||||
name,
|
||||
} = userInfo.data.user
|
||||
const newUser = {
|
||||
userId: user_id,
|
||||
openId: open_id,
|
||||
avatar: avatar_origin,
|
||||
email,
|
||||
name,
|
||||
emailVisibility: false,
|
||||
verified: false,
|
||||
password: email,
|
||||
class UserDB extends PbToolBase<UserModel> {
|
||||
/**
|
||||
* 创建用户数据库操作实例
|
||||
*
|
||||
* @param pbClient - PocketBase 客户端实例
|
||||
* @param logger - 日志记录器实例
|
||||
*/
|
||||
constructor(pbClient: PocketBase, logger: Logger) {
|
||||
super(DB_NAME, pbClient, logger)
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据飞书用户 ID 获取用户记录
|
||||
*
|
||||
* @param userId - 飞书用户 ID
|
||||
* @returns 成功时返回用户记录,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const user = await userDB.getByUserId("ou_123456");
|
||||
* ```
|
||||
*/
|
||||
public getByUserId = (userId: string) => {
|
||||
return this.getFirstOne(`userId = "${userId}"`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据请求上下文获取用户信息
|
||||
* 如果用户不存在,则尝试从飞书获取用户信息并创建新用户
|
||||
*
|
||||
* @param context - 请求上下文,包含飞书请求体和飞书服务
|
||||
* @returns 成功时返回用户记录,失败时返回 null
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const user = await userDB.getByCtx(ctx);
|
||||
* ```
|
||||
*/
|
||||
public getByCtx = async ({ larkBody, larkService }: Context) => {
|
||||
if (!larkBody.userId) return null
|
||||
const user = await this.getByUserId(larkBody.userId)
|
||||
if (user) return user
|
||||
const userInfo = await larkService.user.getOne(larkBody.userId, "user_id")
|
||||
if (userInfo.code === 0) return null
|
||||
const {
|
||||
user_id,
|
||||
open_id,
|
||||
avatar: { avatar_origin },
|
||||
email,
|
||||
name,
|
||||
} = userInfo.data.user
|
||||
const newUser = {
|
||||
userId: user_id,
|
||||
openId: open_id,
|
||||
avatar: avatar_origin,
|
||||
email,
|
||||
name,
|
||||
emailVisibility: false,
|
||||
verified: false,
|
||||
password: email,
|
||||
}
|
||||
return await this.create(newUser)
|
||||
}
|
||||
// 创建新用户
|
||||
return await create(newUser)
|
||||
}
|
||||
|
||||
// 用户对象
|
||||
const user = {
|
||||
getByCtx,
|
||||
getByUserId,
|
||||
}
|
||||
|
||||
export default user
|
||||
export default UserDB
|
||||
|
@ -4,7 +4,7 @@ WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
|
||||
COPY bun.lockb ./
|
||||
COPY bun.lock ./
|
||||
|
||||
COPY bunfig.toml ./
|
||||
|
||||
|
3
index.ts
3
index.ts
@ -4,6 +4,7 @@ import initAppConfig from "./constant/config"
|
||||
import { manageBotReq } from "./routes/bot"
|
||||
import { manageMessageReq } from "./routes/message"
|
||||
import { manageMicroAppReq } from "./routes/microApp"
|
||||
import { manageModelProxyReq } from "./routes/modelProxy"
|
||||
import { manageSheetReq } from "./routes/sheet"
|
||||
import { initSchedule } from "./schedule"
|
||||
import genContext from "./utils/genContext"
|
||||
@ -39,6 +40,8 @@ const bunServer = Bun.serve({
|
||||
if (path.exact("/sheet")) return await manageSheetReq(ctx)
|
||||
// 小程序
|
||||
if (path.startsWith("/micro_app")) return await manageMicroAppReq(ctx)
|
||||
// 转发到模型代理服务
|
||||
if (path.startsWith("/v1")) return manageModelProxyReq(ctx)
|
||||
// 健康检查
|
||||
if (path.full("/health")) return genResp.healthCheck()
|
||||
// 其他
|
||||
|
28
package.json
28
package.json
@ -17,35 +17,37 @@
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^19.6.1",
|
||||
"@commitlint/config-conventional": "^19.6.0",
|
||||
"@eslint/js": "^9.19.0",
|
||||
"@commitlint/cli": "^19.8.0",
|
||||
"@commitlint/config-conventional": "^19.8.0",
|
||||
"@eslint/js": "^9.22.0",
|
||||
"@types/jsdom": "^21.1.7",
|
||||
"@types/node-schedule": "^2.1.7",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"bun-types": "^1.2.1",
|
||||
"eslint": "^9.19.0",
|
||||
"bun-types": "^1.2.5",
|
||||
"eslint": "^9.22.0",
|
||||
"eslint-plugin-simple-import-sort": "^12.1.1",
|
||||
"eslint-plugin-unused-imports": "^4.1.4",
|
||||
"husky": "^9.1.7",
|
||||
"lint-staged": "^15.4.3",
|
||||
"lint-staged": "^15.5.0",
|
||||
"oxlint": "^0.13.2",
|
||||
"prettier": "^3.4.2",
|
||||
"typescript-eslint": "^8.22.0"
|
||||
"prettier": "^3.5.3",
|
||||
"typescript-eslint": "^8.26.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "^5.5.4"
|
||||
"typescript": "^5.8.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"@egg/hooks": "^1.2.0",
|
||||
"@egg/lark-msg-tool": "^1.21.0",
|
||||
"@egg/logger": "^1.6.0",
|
||||
"@egg/net-tool": "^1.31.1",
|
||||
"@egg/net-tool": "^1.32.2",
|
||||
"@egg/path-tool": "^1.4.1",
|
||||
"@langchain/core": "^0.3.36",
|
||||
"@langchain/langgraph": "^0.2.41",
|
||||
"@langchain/core": "^0.3.42",
|
||||
"@langchain/langgraph": "^0.2.56",
|
||||
"@langchain/openai": "^0.3.17",
|
||||
"joi": "^17.13.3",
|
||||
"langfuse-langchain": "^3.32.3",
|
||||
"jsdom": "^26.0.0",
|
||||
"langfuse-langchain": "^3.37.0",
|
||||
"node-schedule": "^2.1.1",
|
||||
"p-limit": "^6.2.0",
|
||||
"pocketbase": "^0.23.0",
|
||||
|
@ -1,6 +1,7 @@
|
||||
import groupAgent from "../../controller/groupAgent"
|
||||
import intentAgent from "../../controller/intentAgent"
|
||||
import reportAgent from "../../controller/reportAgent"
|
||||
import searchAgent from "../../controller/searchAgent"
|
||||
import soupAgent from "../../controller/soupAgent"
|
||||
import { Context } from "../../types"
|
||||
import { isNotP2POrAtBot } from "../../utils/message"
|
||||
@ -68,69 +69,80 @@ const manageIntent = async (ctx: Context) => {
|
||||
try {
|
||||
const intentRes = await intentAgent.agent(ctx)
|
||||
logger.info(`intentRes: ${JSON.stringify(intentRes)}`)
|
||||
// 链接总结
|
||||
if (intentAgent.isBriefing(intentRes)) {
|
||||
reportAgent
|
||||
.agent(ctx, intentRes.link, intentRes.userDescription)
|
||||
.catch(() => null)
|
||||
return
|
||||
}
|
||||
// 设置链接总结的结果存储表格
|
||||
if (intentAgent.isBriefingLink(intentRes)) {
|
||||
reportAgent.setSheet(ctx, intentRes.link).catch(() => null)
|
||||
return
|
||||
}
|
||||
// 网络检索
|
||||
if (intentAgent.isNetSearch(intentRes)) {
|
||||
searchAgent.agent(ctx, intentRes.query).catch(() => null)
|
||||
return
|
||||
}
|
||||
// 通用回复
|
||||
if (intentAgent.isCommonResponse(intentRes)) {
|
||||
await message.updateOrReply(larkCard.genSuccessCard(intentRes.message))
|
||||
return
|
||||
}
|
||||
if (intentAgent.isBaseIntent(intentRes)) {
|
||||
switch (intentRes.intent) {
|
||||
case 3:
|
||||
await message.updateOrReply(
|
||||
larkCard.genTempCard("chatId", { chat_id: chatId }) as string
|
||||
)
|
||||
break
|
||||
case 4:
|
||||
await attachService.ciMonitor(chatId)
|
||||
break
|
||||
case 6:
|
||||
await message.updateOrReply(
|
||||
larkCard.genTempCard("eggGuide", { chat_id: chatId }) as string
|
||||
)
|
||||
break
|
||||
case 7:
|
||||
groupAgent.report
|
||||
.setSubscription(ctx, "daily", true)
|
||||
.catch(() => null)
|
||||
break
|
||||
case 8:
|
||||
groupAgent.report
|
||||
.setSubscription(ctx, "weekly", true)
|
||||
.catch(() => null)
|
||||
break
|
||||
case 9:
|
||||
groupAgent.report
|
||||
.setSubscription(ctx, "daily", false)
|
||||
.catch(() => null)
|
||||
break
|
||||
case 10:
|
||||
groupAgent.report
|
||||
.setSubscription(ctx, "weekly", false)
|
||||
.catch(() => null)
|
||||
break
|
||||
case 11:
|
||||
groupAgent.report.gen4Test(ctx, "daily").catch(() => null)
|
||||
break
|
||||
case 12:
|
||||
groupAgent.report.gen4Test(ctx, "weekly").catch(() => null)
|
||||
break
|
||||
case 13:
|
||||
soupAgent.startOrStopGame(ctx, true, "manual").catch(() => null)
|
||||
break
|
||||
case 1:
|
||||
default:
|
||||
groupAgent.agent(ctx).catch(() => null)
|
||||
break
|
||||
}
|
||||
switch (intentRes.intent) {
|
||||
// 获取聊天ID
|
||||
case 3:
|
||||
await message.updateOrReply(
|
||||
larkCard.genTempCard("chatId", { chat_id: chatId }) as string
|
||||
)
|
||||
break
|
||||
// CI监控
|
||||
case 4:
|
||||
await attachService.ciMonitor(chatId)
|
||||
break
|
||||
// 获取帮助
|
||||
case 6:
|
||||
await message.updateOrReply(
|
||||
larkCard.genTempCard("eggGuide", { chat_id: chatId }) as string
|
||||
)
|
||||
break
|
||||
// 开启日报订阅
|
||||
case 7:
|
||||
groupAgent.report.setSubscription(ctx, "daily", true).catch(() => null)
|
||||
break
|
||||
// 开启周报订阅
|
||||
case 8:
|
||||
groupAgent.report.setSubscription(ctx, "weekly", true).catch(() => null)
|
||||
break
|
||||
// 关闭日报订阅
|
||||
case 9:
|
||||
groupAgent.report.setSubscription(ctx, "daily", false).catch(() => null)
|
||||
break
|
||||
// 关闭周报订阅
|
||||
case 10:
|
||||
groupAgent.report
|
||||
.setSubscription(ctx, "weekly", false)
|
||||
.catch(() => null)
|
||||
break
|
||||
// 生成日报
|
||||
case 11:
|
||||
groupAgent.report.gen4Test(ctx, "daily").catch(() => null)
|
||||
break
|
||||
// 生成周报
|
||||
case 12:
|
||||
groupAgent.report.gen4Test(ctx, "weekly").catch(() => null)
|
||||
break
|
||||
// 开始海龟汤游戏
|
||||
case 13:
|
||||
soupAgent.startOrStopGame(ctx, true, "manual").catch(() => null)
|
||||
break
|
||||
// 默认为使用群聊上下文的意图
|
||||
case 1:
|
||||
default:
|
||||
groupAgent.agent(ctx).catch(() => null)
|
||||
break
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error(`manageIntent error: ${error}`)
|
||||
|
@ -1,7 +1,6 @@
|
||||
import { stringifyJson } from "@egg/hooks"
|
||||
import { LarkService } from "@egg/net-tool"
|
||||
|
||||
import db from "../../db"
|
||||
import { Log } from "../../db/log"
|
||||
import { Context, LarkServer, MsgProxy } from "../../types"
|
||||
import genLarkService from "../../utils/genLarkService"
|
||||
@ -44,7 +43,7 @@ const validateMessageReq = ({ body, genResp }: Context): false | Response => {
|
||||
* @returns {Promise<Response>} 返回响应对象
|
||||
*/
|
||||
export const manageMessageReq = async (ctx: Context): Promise<Response> => {
|
||||
const { body: rawBody, genResp, requestId } = ctx
|
||||
const { body: rawBody, genResp, requestId, db } = ctx
|
||||
const body = rawBody as MsgProxy.Body
|
||||
|
||||
// 校验参数
|
||||
@ -84,7 +83,7 @@ export const manageMessageReq = async (ctx: Context): Promise<Response> => {
|
||||
|
||||
if (body.api_key) {
|
||||
// 校验 api_key
|
||||
const apiKeyInfo = await db.apiKey.getOne(body.api_key)
|
||||
const apiKeyInfo = await db.apiKey.getWithApp(body.api_key)
|
||||
if (!apiKeyInfo) {
|
||||
const error = "api key not found"
|
||||
await db.log.create({ ...baseLog, error })
|
||||
@ -98,7 +97,7 @@ export const manageMessageReq = async (ctx: Context): Promise<Response> => {
|
||||
// 如果有 group_id,则发送给所有 group_id 中的人
|
||||
if (body.group_id) {
|
||||
// 获取所有接收者
|
||||
const group = await db.receiveGroup.getOne(body.group_id!)
|
||||
const group = await db.receiveGroup.getWithApp(body.group_id!)
|
||||
if (!group) {
|
||||
const error = "message group not found"
|
||||
await db.log.create({ ...baseLog, error })
|
||||
|
64
routes/modelProxy/index.ts
Normal file
64
routes/modelProxy/index.ts
Normal file
@ -0,0 +1,64 @@
|
||||
import { Context } from "../../types"
|
||||
|
||||
/**
|
||||
* 处理模型代理请求
|
||||
* @param req
|
||||
* @returns
|
||||
*/
|
||||
export const manageModelProxyReq = async (ctx: Context) => {
|
||||
const { req, headers, logger, path } = ctx
|
||||
if (!path.exact("/v1/models")) {
|
||||
const auth = headers.get("Authorization")
|
||||
logger.info(`Start Model Proxy, Authorization: ${auth}`)
|
||||
if (!auth || auth !== "Bearer sk-21a2ce1c2ee94bc2933798eac1bbcadc") {
|
||||
return ctx.genResp.forbidden("Authorization required")
|
||||
}
|
||||
}
|
||||
const PROXY_URL =
|
||||
"http://ms-13871-nstruct-lmdeploy-2-0109140455.kscn-tj5-prod2-cloudml.xiaomi.srv"
|
||||
|
||||
// 发起代理请求
|
||||
const response = await fetch(PROXY_URL + new URL(req.url).pathname, {
|
||||
method: req.method,
|
||||
body: req.body,
|
||||
headers: {
|
||||
// 转发必要的请求头
|
||||
"Content-Type": headers.get("Content-Type") || "application/json",
|
||||
Accept: headers.get("Accept") || "*/*",
|
||||
},
|
||||
})
|
||||
|
||||
// 获取原始响应的所有头信息
|
||||
const responseHeaders = new Headers(response.headers)
|
||||
|
||||
// 添加CORS响应头
|
||||
responseHeaders.set("Access-Control-Allow-Origin", "*")
|
||||
responseHeaders.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
|
||||
responseHeaders.set(
|
||||
"Access-Control-Allow-Headers",
|
||||
"Content-Type, Authorization"
|
||||
)
|
||||
responseHeaders.set("Access-Control-Expose-Headers", "Content-Type")
|
||||
|
||||
// 检查是否为流式响应
|
||||
if (response.headers.get("Content-Type")?.includes("text/event-stream")) {
|
||||
// 处理流式响应
|
||||
const { readable, writable } = new TransformStream()
|
||||
response.body
|
||||
?.pipeTo(writable)
|
||||
.catch((err) => logger.error("Stream error:", err))
|
||||
|
||||
return new Response(readable, {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
headers: responseHeaders,
|
||||
})
|
||||
} else {
|
||||
// 处理非流式响应
|
||||
return new Response(response.body, {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
headers: responseHeaders,
|
||||
})
|
||||
}
|
||||
}
|
@ -3,7 +3,6 @@ import Joi from "joi"
|
||||
|
||||
import { APP_MAP } from "../../constant/config"
|
||||
import insertSheet from "../../controller/sheet/insert"
|
||||
import db from "../../db"
|
||||
import { Context } from "../../types"
|
||||
import { SheetProxy } from "../../types/sheetProxy"
|
||||
|
||||
@ -65,7 +64,7 @@ const validateSheetReq = async ({
|
||||
* @returns {Promise<Response>} 返回响应对象
|
||||
*/
|
||||
export const manageSheetReq = async (ctx: Context): Promise<Response> => {
|
||||
const { body: rawBody, genResp, requestId } = ctx
|
||||
const { body: rawBody, genResp, requestId, db } = ctx
|
||||
const body = rawBody as SheetProxy.InsertData
|
||||
|
||||
// 校验参数
|
||||
@ -73,7 +72,7 @@ export const manageSheetReq = async (ctx: Context): Promise<Response> => {
|
||||
if (validateRes) return validateRes
|
||||
|
||||
// 校验 api_key
|
||||
const apiKeyInfo = await db.apiKey.getOne(body.api_key)
|
||||
const apiKeyInfo = await db.apiKey.getWithApp(body.api_key)
|
||||
if (!apiKeyInfo) {
|
||||
return genResp.notFound("api key not found")
|
||||
}
|
||||
|
241
schedule/byteMonitor.ts
Normal file
241
schedule/byteMonitor.ts
Normal file
@ -0,0 +1,241 @@
|
||||
import { S3Client, S3File } from "bun"
|
||||
import { JSDOM } from "jsdom"
|
||||
|
||||
import initAppConfig, { APP_CONFIG, ConfigModel } from "../constant/config"
|
||||
import pbClient from "../db/pbClient"
|
||||
import { Context } from "../types"
|
||||
import { genContextManually } from "../utils/genContext"
|
||||
import llm from "../utils/llm"
|
||||
import { cleanLLMRes } from "../utils/llm/base"
|
||||
|
||||
await initAppConfig()
|
||||
|
||||
/**
|
||||
* 批量翻译文本列表
|
||||
* @param textList - 待翻译的文本列表
|
||||
* @param requestId - 请求ID
|
||||
* @returns 翻译后的文本映射
|
||||
*/
|
||||
const translateTextList = async (textList: string[], requestId: string) => {
|
||||
const translatedTexts = await llm.invoke(
|
||||
"batchTranslate",
|
||||
{
|
||||
inputArray: textList,
|
||||
targetLang: "简体中文",
|
||||
},
|
||||
requestId,
|
||||
1,
|
||||
true
|
||||
)
|
||||
|
||||
const translatedList = JSON.parse(
|
||||
cleanLLMRes(translatedTexts as string)
|
||||
) as string[]
|
||||
|
||||
const translatedMap: Record<string, string> = {}
|
||||
textList.forEach((text, index) => {
|
||||
translatedMap[text] = translatedList[index]
|
||||
})
|
||||
|
||||
return translatedMap
|
||||
}
|
||||
|
||||
/**
|
||||
* 过滤不需要翻译的字符串
|
||||
* @param str - 待处理的字符串
|
||||
* @returns 是否需要翻译
|
||||
*/
|
||||
const getIsTranslatableString = (str: string): boolean => {
|
||||
const trimmed: string = str.trim()
|
||||
|
||||
// 1. 排除空字符串或纯空白字符
|
||||
if (trimmed === "") return false
|
||||
|
||||
// 2. 排除纯Emoji字符(包括复合Emoji如👨👩👧👦)
|
||||
const isEmojiOnly: boolean = /^\p{Emoji}+$/u.test(trimmed)
|
||||
if (isEmojiOnly) return false
|
||||
|
||||
// 3. 排除无字母/文字字符(允许包含数字但必须存在文字)
|
||||
const hasLetters: boolean = /\p{L}/u.test(trimmed) // 匹配任意语言字母/文字
|
||||
return hasLetters
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取新的页面内容
|
||||
* @param newId - 页面ID
|
||||
* @returns 页面内容的HTML字符串
|
||||
*/
|
||||
const getNewPage = async (newId: number) => {
|
||||
const url = `https://bytes.dev/archives/${newId}`
|
||||
const res = await fetch(url)
|
||||
|
||||
if (!res.ok) {
|
||||
return ""
|
||||
}
|
||||
|
||||
const htmlContent = await res.text()
|
||||
|
||||
// 替换相对路径为绝对路径
|
||||
const replacedContent = htmlContent.replace(
|
||||
/(href|src)="\/(?!\/)/g,
|
||||
`$1="https://bytes.dev/`
|
||||
)
|
||||
|
||||
return replacedContent
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取页面内容并翻译
|
||||
* @param ctx - 上下文对象
|
||||
* @param rawHtml - 原始HTML内容
|
||||
* @returns 翻译后的HTML内容
|
||||
*/
|
||||
const translateHTML = async (ctx: Context, rawHtml: string) => {
|
||||
const { logger } = ctx
|
||||
const dom = new JSDOM(rawHtml)
|
||||
const document = dom.window.document
|
||||
|
||||
// 移除 __NEXT_DATA__ 脚本
|
||||
const nextDataEle = document.querySelector(
|
||||
"script#__NEXT_DATA__"
|
||||
) as HTMLScriptElement
|
||||
nextDataEle.remove()
|
||||
|
||||
// 需要翻译的元素列表(扩展selector需在此添加)
|
||||
const targetNodes = Array.from(
|
||||
document.querySelectorAll(
|
||||
"p:not(code *), h1:not(code *), h2:not(code *), h3:not(code *), h4:not(code *), h5:not(code *), h6:not(code *), span:not(code *), a:not(code *), li:not(code *), td, th:not(code *), caption:not(code *), button:not(code *), label:not(code *), title:not(code *)"
|
||||
)
|
||||
)
|
||||
|
||||
const needTranslateText: string[] = []
|
||||
|
||||
// 提取需要翻译的文本
|
||||
targetNodes.forEach((ele) => {
|
||||
const textNodes = Array.from(ele.childNodes).filter(
|
||||
(node) => node.nodeType === 3
|
||||
)
|
||||
textNodes.forEach((textNode) => {
|
||||
const text = textNode.textContent?.trim()
|
||||
if (text && getIsTranslatableString(text)) {
|
||||
needTranslateText.push(text)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
const uniqueTexts = [...new Set(needTranslateText)]
|
||||
|
||||
logger.debug(`uniqueTexts: ${uniqueTexts}`)
|
||||
|
||||
// 翻译,拆分为多个请求以避免超长
|
||||
const chunkSize = 20
|
||||
const chunks: string[][] = []
|
||||
for (let i = 0; i < uniqueTexts.length; i += chunkSize) {
|
||||
chunks.push(uniqueTexts.slice(i, i + chunkSize))
|
||||
}
|
||||
const reqList = []
|
||||
for (const chunk of chunks) {
|
||||
reqList.push(translateTextList(chunk, "translateHTML"))
|
||||
}
|
||||
|
||||
const translatedMaps = await Promise.all(reqList)
|
||||
|
||||
const mergedMap: Record<string, string> = {}
|
||||
translatedMaps.forEach((translatedMap) => {
|
||||
Object.assign(mergedMap, translatedMap)
|
||||
})
|
||||
|
||||
// 更新页面内容
|
||||
targetNodes.forEach((ele) => {
|
||||
const textNodes = Array.from(ele.childNodes).filter(
|
||||
(node) => node.nodeType === 3
|
||||
)
|
||||
textNodes.forEach((textNode) => {
|
||||
const text = textNode.textContent?.trim()
|
||||
if (text) {
|
||||
const translated = mergedMap[text]
|
||||
if (translated) {
|
||||
textNode.textContent = translated
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
// 将所有 <a> 标签的点击改成在新页面打开链接
|
||||
const anchorNodes = document.querySelectorAll("a")
|
||||
anchorNodes.forEach((anchor) => {
|
||||
anchor.setAttribute("target", "_blank")
|
||||
})
|
||||
|
||||
return dom.serialize()
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取最新的页面ID
|
||||
* @returns 最新的页面ID
|
||||
*/
|
||||
const getLatestId = async () => {
|
||||
const current = await pbClient
|
||||
.collection<ConfigModel>("env")
|
||||
.getOne("5l8a8u85p5v4aid")
|
||||
return current.value
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置最新的页面ID
|
||||
* @param id - 页面ID
|
||||
*/
|
||||
const setLatestId = async (id: number) => {
|
||||
await pbClient
|
||||
.collection<ConfigModel>("env")
|
||||
.update("5l8a8u85p5v4aid", { value: id })
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入HTML内容到文件
|
||||
* @param html - HTML内容
|
||||
*/
|
||||
const writeHtml = async (html: string, version: number) => {
|
||||
const client = new S3Client({
|
||||
accessKeyId: APP_CONFIG.S3_MICHAT_AK,
|
||||
secretAccessKey: APP_CONFIG.S3_MICHAT_SK,
|
||||
region: "cnbj1",
|
||||
endpoint: "https://s3-cnbj1.mi-fds.net",
|
||||
bucket: "mi-chat-fe",
|
||||
})
|
||||
|
||||
const s3file: S3File = client.file(`bytes/${version}.html`)
|
||||
await s3file.write(html)
|
||||
}
|
||||
|
||||
/**
|
||||
* 监控并翻译最新的页面内容
|
||||
*/
|
||||
const byteMonitor = async () => {
|
||||
const ctx = await genContextManually()
|
||||
const { logger, larkService, appInfo } = ctx
|
||||
logger.info("byteMonitor start")
|
||||
try {
|
||||
const latestId = await getLatestId()
|
||||
if (!latestId) throw new Error("getLatestId empty")
|
||||
const newId = Number(latestId) + 1
|
||||
const newPage = await getNewPage(newId)
|
||||
if (!newPage) throw new Error("getNewPage empty")
|
||||
const translatedPage = await translateHTML(ctx, newPage)
|
||||
await writeHtml(translatedPage, newId)
|
||||
await setLatestId(newId)
|
||||
await larkService.message.sendText2Chat(
|
||||
appInfo.errChatId,
|
||||
`页面链接:https://mi-chat-fe.cnbj1.mi-fds.com/mi-chat-fe/bytes/${newId}.html`,
|
||||
"byteMonitor 更新"
|
||||
)
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
const errorMessage = `byteMonitor error: ${error}`
|
||||
logger.error(errorMessage)
|
||||
} finally {
|
||||
logger.info("byteMonitor finished")
|
||||
}
|
||||
}
|
||||
|
||||
export default byteMonitor
|
@ -2,6 +2,7 @@ import schedule from "node-schedule"
|
||||
|
||||
import report from "../controller/groupAgent/report"
|
||||
import { loginPbClient } from "../db/pbClient"
|
||||
import byteMonitor from "./byteMonitor"
|
||||
import fmMonitor from "./fmMonitor"
|
||||
import sendZhongNotify from "./zhongNotify"
|
||||
|
||||
@ -20,4 +21,7 @@ export const initSchedule = async () => {
|
||||
|
||||
// 定时任务,每小时执行一次
|
||||
schedule.scheduleJob("0 * * * *", loginPbClient)
|
||||
|
||||
// 定时任务,每小时执行一次
|
||||
schedule.scheduleJob("0 * * * *", byteMonitor)
|
||||
}
|
||||
|
@ -122,18 +122,45 @@ class AttachService extends NetToolBase {
|
||||
}
|
||||
)
|
||||
.then((res) => {
|
||||
const llmRes = res.data.outputs.content
|
||||
if (!llmRes) throw new Error("模型总结失败")
|
||||
if (llmRes === "crawlerErr") throw new Error("网页抓取失败")
|
||||
return llmRes as string
|
||||
return res.data.outputs.content
|
||||
})
|
||||
.catch((error) => {
|
||||
if (["网页抓取失败", "模型总结失败"].includes(error.message)) {
|
||||
throw error
|
||||
}
|
||||
throw new Error("MIFY爬虫请求失败")
|
||||
return `mify爬虫调用失败 - ${error.message}`
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用bochaai搜索网页
|
||||
* @param {string} query - 搜索关键词
|
||||
* @returns 返回搜索结果
|
||||
*/
|
||||
async webSearch(query: string) {
|
||||
const URL = "https://api.bochaai.com/v1/web-search"
|
||||
return this.post(
|
||||
URL,
|
||||
{
|
||||
query,
|
||||
summary: true,
|
||||
},
|
||||
{},
|
||||
{
|
||||
Authorization: `Bearer ${APP_CONFIG.BOCHA_SK}`,
|
||||
}
|
||||
)
|
||||
.then((res) => {
|
||||
const { value } = res.data.webPages
|
||||
return value.map(({ siteName, summary, name, url }: any) => ({
|
||||
pageName: name,
|
||||
url,
|
||||
siteName,
|
||||
summary,
|
||||
})) as {
|
||||
siteName: string
|
||||
summary: string
|
||||
}[]
|
||||
})
|
||||
.catch(() => null)
|
||||
}
|
||||
}
|
||||
|
||||
export default AttachService
|
||||
|
@ -1,5 +1,14 @@
|
||||
import db from "../../db"
|
||||
import initAppConfig from "../../constant/config"
|
||||
import DB from "../../db"
|
||||
import pbClient from "../../db/pbClient"
|
||||
import { genContextManually } from "../../utils/genContext"
|
||||
|
||||
const res = await db.apiKey.getOne("uwnpzb9hvoft28h")
|
||||
await initAppConfig()
|
||||
|
||||
const ctx = await genContextManually()
|
||||
|
||||
const dbInstance = new DB(pbClient, ctx.logger)
|
||||
|
||||
const res = await dbInstance.apiKey.getWithApp("uwnpzb9hvoft28h")
|
||||
|
||||
console.log("🚀 ~ res", res)
|
||||
|
@ -8,34 +8,63 @@ import { cleanLLMRes } from "../../utils/llm/base"
|
||||
|
||||
await initAppConfig()
|
||||
|
||||
/**
|
||||
* 基础意图模式
|
||||
*/
|
||||
const BaseIntentSchema = z.object({
|
||||
intent: z.number().min(1).max(13),
|
||||
})
|
||||
|
||||
/**
|
||||
* 简报模式
|
||||
*/
|
||||
const BriefingSchema = BaseIntentSchema.extend({
|
||||
intent: z.literal(3),
|
||||
intent: z.literal(5),
|
||||
link: z.string().url(),
|
||||
userDescription: z.string().min(1),
|
||||
})
|
||||
|
||||
/**
|
||||
* 简报存储链接模式
|
||||
*/
|
||||
const BriefingLinkSchema = z.object({
|
||||
intent: z.literal(14),
|
||||
link: z.string().url(),
|
||||
})
|
||||
|
||||
/**
|
||||
* 通用响应模式
|
||||
*/
|
||||
const CommonResponseSchema = BaseIntentSchema.extend({
|
||||
intent: z.literal(12),
|
||||
intent: z.literal(2),
|
||||
message: z.string().min(1),
|
||||
})
|
||||
|
||||
/**
|
||||
* 联网检索模式
|
||||
*/
|
||||
const NetSearchSchema = BaseIntentSchema.extend({
|
||||
intent: z.literal(15),
|
||||
query: z.string().min(1),
|
||||
})
|
||||
|
||||
/**
|
||||
* 意图模式
|
||||
*/
|
||||
const IntentSchema = z.union([
|
||||
BriefingSchema,
|
||||
CommonResponseSchema,
|
||||
BaseIntentSchema,
|
||||
BriefingLinkSchema,
|
||||
NetSearchSchema,
|
||||
])
|
||||
|
||||
const jsonSchema = zodToJsonSchema(IntentSchema)
|
||||
|
||||
const res = await llm.invoke(
|
||||
"intentRecognitionNext",
|
||||
"intentRecognition",
|
||||
{
|
||||
userInput:
|
||||
"https://mp.weixin.qq.com/s/-0J8XbXJU6Bu-UihRtgGAQ Airbnb死磕React Native惨败,微软却玩出花!Office、Outlook全线接入,Copilot成最大赢家 推荐大家看一下,rn助力微软copilot 跨平台实现",
|
||||
userInput: "今天是哪天",
|
||||
time: new Date().toLocaleString("zh-CN", { timeZone: "Asia/Shanghai" }),
|
||||
jsonSchema,
|
||||
},
|
||||
|
6
test/schedule/byteMonitor.ts
Normal file
6
test/schedule/byteMonitor.ts
Normal file
@ -0,0 +1,6 @@
|
||||
import initAppConfig from "../../constant/config"
|
||||
import byteMonitor from "../../schedule/byteMonitor"
|
||||
|
||||
await initAppConfig()
|
||||
|
||||
await byteMonitor()
|
11
test/server/getBatchUserInfo.ts
Normal file
11
test/server/getBatchUserInfo.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import initAppConfig from "../../constant/config"
|
||||
import genLarkService from "../../utils/genLarkService"
|
||||
|
||||
await initAppConfig()
|
||||
|
||||
const larkService = genLarkService("egg", "test")
|
||||
|
||||
larkService.user
|
||||
.batchGet(["ou_5d9c2da2870802fc47fc2066f28b1b49"], "open_id")
|
||||
.then(console.log)
|
||||
.catch(console.error)
|
8
test/server/webSearch.ts
Normal file
8
test/server/webSearch.ts
Normal file
@ -0,0 +1,8 @@
|
||||
import initAppConfig from "../../constant/config"
|
||||
import { AttachService } from "../../services"
|
||||
|
||||
await initAppConfig()
|
||||
|
||||
const service = new AttachService()
|
||||
|
||||
service.webSearch("北京今天天气").then(console.log).catch(console.error)
|
@ -7,6 +7,7 @@ import cardMap from "../constant/card"
|
||||
import { AppInfoModel } from "../constant/config"
|
||||
import functionMap from "../constant/function"
|
||||
import tempMap from "../constant/template"
|
||||
import DB from "../db"
|
||||
import { AttachService } from "../services"
|
||||
|
||||
export interface Context {
|
||||
@ -23,6 +24,8 @@ export interface Context {
|
||||
gitlabService: GitlabService
|
||||
path: PathCheckTool
|
||||
searchParams: URLSearchParams
|
||||
headers: Headers
|
||||
app: "michat" | "egg" | string
|
||||
appInfo: AppInfoModel
|
||||
db: DB
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import cardMap from "../constant/card"
|
||||
import { APP_CONFIG, APP_MAP } from "../constant/config"
|
||||
import functionMap from "../constant/function"
|
||||
import tempMap from "../constant/template"
|
||||
import DB from "../db"
|
||||
import { AttachService } from "../services"
|
||||
import { Context } from "../types"
|
||||
import genLarkService from "./genLarkService"
|
||||
@ -42,6 +43,7 @@ const genContext = async (req: Request, rId?: string) => {
|
||||
}
|
||||
const larkBody = new LarkBody(body)
|
||||
const searchParams = new URL(req.url).searchParams
|
||||
const headers = new Headers(req.headers)
|
||||
const app = searchParams.get("app") || "egg"
|
||||
const appInfo = APP_MAP[app]
|
||||
const requestId = rId || getPreRequestId(larkBody) || uuid()
|
||||
@ -57,6 +59,7 @@ const genContext = async (req: Request, rId?: string) => {
|
||||
})
|
||||
const attachService = new AttachService({ requestId })
|
||||
const path = new PathCheckTool(req.url)
|
||||
const db = new DB(logger)
|
||||
const larkCard = new LarkCard(
|
||||
"egg",
|
||||
false,
|
||||
@ -80,8 +83,10 @@ const genContext = async (req: Request, rId?: string) => {
|
||||
attachService,
|
||||
gitlabService,
|
||||
searchParams,
|
||||
headers,
|
||||
app,
|
||||
appInfo,
|
||||
db,
|
||||
} as Context
|
||||
}
|
||||
|
||||
|
92
utils/polyfill/map.ts
Normal file
92
utils/polyfill/map.ts
Normal file
@ -0,0 +1,92 @@
|
||||
interface MapPolyfillInterface<K, V> {
|
||||
set(key: K, value: V): void
|
||||
get(key: K): V | undefined
|
||||
delete(key: K): boolean
|
||||
has(key: K): boolean
|
||||
clear(): void
|
||||
forEach(
|
||||
callback: (value: V, key: K, map: MapPolyfill<K, V>) => void,
|
||||
thisArg?: any
|
||||
): void
|
||||
readonly size: number
|
||||
}
|
||||
|
||||
class MapPolyfill<K, V> implements MapPolyfillInterface<K, V> {
|
||||
private keys: K[]
|
||||
private values: V[]
|
||||
|
||||
constructor() {
|
||||
this.keys = []
|
||||
this.values = []
|
||||
}
|
||||
|
||||
set(key: K, value: V): void {
|
||||
const index = this.keys.indexOf(key)
|
||||
if (index === -1) {
|
||||
this.keys.push(key)
|
||||
this.values.push(value)
|
||||
} else {
|
||||
this.values[index] = value
|
||||
}
|
||||
}
|
||||
|
||||
get(key: K): V | undefined {
|
||||
const index = this.keys.indexOf(key)
|
||||
if (index === -1) {
|
||||
return undefined
|
||||
}
|
||||
return this.values[index]
|
||||
}
|
||||
|
||||
delete(key: K): boolean {
|
||||
const index = this.keys.indexOf(key)
|
||||
if (index === -1) {
|
||||
return false
|
||||
}
|
||||
this.keys.splice(index, 1)
|
||||
this.values.splice(index, 1)
|
||||
return true
|
||||
}
|
||||
|
||||
has(key: K): boolean {
|
||||
return this.keys.indexOf(key) !== -1
|
||||
}
|
||||
|
||||
clear(): void {
|
||||
this.keys = []
|
||||
this.values = []
|
||||
}
|
||||
|
||||
forEach(
|
||||
callback: (value: V, key: K, map: MapPolyfill<K, V>) => void,
|
||||
thisArg?: any
|
||||
): void {
|
||||
for (let i = 0; i < this.keys.length; i++) {
|
||||
callback.call(thisArg, this.values[i], this.keys[i], this)
|
||||
}
|
||||
}
|
||||
|
||||
get size(): number {
|
||||
return this.keys.length
|
||||
}
|
||||
|
||||
entries(): IterableIterator<[K, V]> {
|
||||
let index = 0
|
||||
const keys = this.keys
|
||||
const values = this.values
|
||||
return {
|
||||
[Symbol.iterator]() {
|
||||
return this
|
||||
},
|
||||
next(): IteratorResult<[K, V]> {
|
||||
if (index < keys.length) {
|
||||
return { value: [keys[index], values[index++]], done: false }
|
||||
} else {
|
||||
return { value: undefined, done: true }
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default MapPolyfill
|
78
utils/polyfill/set.ts
Normal file
78
utils/polyfill/set.ts
Normal file
@ -0,0 +1,78 @@
|
||||
interface SetPolyfillInterface<T> {
|
||||
add(value: T): void
|
||||
delete(value: T): boolean
|
||||
has(value: T): boolean
|
||||
clear(): void
|
||||
forEach(
|
||||
callback: (value: T, value2: T, set: SetPolyfill<T>) => void,
|
||||
thisArg?: any
|
||||
): void
|
||||
readonly size: number
|
||||
}
|
||||
|
||||
class SetPolyfill<T> implements SetPolyfillInterface<T> {
|
||||
private items: Record<string, T>
|
||||
|
||||
constructor(initialValues?: T[]) {
|
||||
this.items = {}
|
||||
if (initialValues) {
|
||||
for (const value of initialValues) {
|
||||
this.add(value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
add(value: T): void {
|
||||
const key = JSON.stringify(value)
|
||||
this.items[key] = value
|
||||
}
|
||||
|
||||
delete(value: T): boolean {
|
||||
const key = JSON.stringify(value)
|
||||
if (this.has(value)) {
|
||||
delete this.items[key]
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
has(value: T): boolean {
|
||||
const key = JSON.stringify(value)
|
||||
return Object.prototype.hasOwnProperty.call(this.items, key)
|
||||
}
|
||||
|
||||
clear(): void {
|
||||
this.items = {}
|
||||
}
|
||||
|
||||
forEach(
|
||||
callback: (value: T, value2: T, set: SetPolyfill<T>) => void,
|
||||
thisArg?: any
|
||||
): void {
|
||||
for (const key in this.items) {
|
||||
if (Object.prototype.hasOwnProperty.call(this.items, key)) {
|
||||
callback.call(thisArg, this.items[key], this.items[key], this)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
get size(): number {
|
||||
return Object.keys(this.items).length
|
||||
}
|
||||
|
||||
[Symbol.iterator](): Iterator<T> {
|
||||
let index = 0
|
||||
const values = Object.values(this.items)
|
||||
return {
|
||||
next: (): IteratorResult<T> => {
|
||||
if (index < values.length) {
|
||||
return { value: values[index++], done: false }
|
||||
} else {
|
||||
return { value: undefined, done: true }
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default SetPolyfill
|
Loading…
x
Reference in New Issue
Block a user