Compare commits

...

15 Commits

Author SHA1 Message Date
d2168377a7 feat: 添加数据库实例到上下文,更新相关逻辑以支持新的数据库操作 2025-03-18 10:11:50 +00:00
6e910d09e4 fix: 修正Dockerfile中的bun.lockb为bun.lock 2025-03-13 02:47:25 +00:00
4e7d86f037 feat: 重构mify爬虫错误处理,优化表格插入逻辑,更新依赖版本 2025-03-13 02:45:09 +00:00
ac3873c62d feat: 添加CORS支持和流式响应处理,转发请求头以增强代理请求功能 2025-02-27 05:29:52 +00:00
8d8bd5c305 feat: 更新模型代理请求处理,添加路径检查以增强授权验证 2025-02-27 05:14:03 +00:00
7f4aedbfc8 feat: 添加Authorization头处理,更新Context类型以包含headers 2025-02-27 05:09:14 +00:00
4abeb0a0f0 feat: 添加模型代理请求处理功能,更新相关依赖 2025-02-27 05:02:30 +00:00
fc8d2f9f32 feat: 移除translateTextList中的调试日志输出 2025-02-24 08:49:21 +00:00
bfd9aec103 feat: 更新byteMonitor以清理翻译结果并添加错误日志,新增测试用例 2025-02-24 08:49:08 +00:00
32396aecf1 feat: 添加byteMonitor以监控并翻译最新页面内容,更新相关依赖 2025-02-13 08:10:57 +00:00
26e51e132b feat: 更新AttachService以返回页面名称和URL,增强搜索结果结构 2025-02-07 10:11:58 +00:00
266eb89c5a feat: 添加网页搜索功能,优化意图识别模式,更新依赖项 2025-02-06 13:06:27 +00:00
33b0c1bec1 feat: 增强MapPolyfill,添加entries方法并优化聊天记录调试日志 2025-02-05 11:32:27 +00:00
0d315f4bd7 feat: 添加Map和Set的polyfill以增强数据结构支持 2025-02-05 11:28:13 +00:00
be136e8c13 feat: 添加错误映射以增强MIFY爬虫的错误处理 2025-02-05 10:45:13 +00:00
41 changed files with 2680 additions and 544 deletions

View File

@ -1,9 +1,12 @@
{
"cSpell.words": [
"BOCHA",
"bochaai",
"bunx",
"CEINTL",
"Chakroun",
"CICD",
"cnbj",
"commitlint",
"dbaeumer",
"deepseek",

982
bun.lock Normal file
View 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=="],
}
}

BIN
bun.lockb

Binary file not shown.

View File

@ -29,6 +29,11 @@ const functionMap = {
xAuthor: "wangyifei15 🕹️ Yingbo",
xIcon: "🕹️",
},
searchAgent: {
xName: "小煎蛋 Search Agent",
xAuthor: "Yingbo",
xIcon: "🔍",
},
}
export default functionMap

View File

@ -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}`)

View File

@ -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) {

View File

@ -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")
}

View File

@ -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 truefalse
*/
const isBriefing = (intent: Intent): intent is Briefing => {
return intent.intent === 5
}
/**
*
* @param intent -
* @returns truefalse
*/
const isBriefingLink = (intent: Intent): intent is BriefingLink => {
return intent.intent === 14
}
/**
*
* @param intent -
* @returns truefalse
*/
const isCommonResponse = (intent: Intent): intent is CommonResponse => {
return intent.intent === 2
}
/**
*
* @param intent -
* @returns truefalse
*/
const isNetSearch = (intent: Intent): intent is NetSearch => {
return intent.intent === 15
}
/**
*
*/
const intentAgent = {
agent,
isBaseIntent,
isBriefing,
isCommonResponse,
isBriefingLink,
isNetSearch,
}
export default intentAgent

View File

@ -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)

View 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

View File

@ -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)

View File

@ -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
View 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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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提供了idcreatedupdated等基础字段
*/
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

View File

@ -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

View File

@ -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

View File

@ -4,7 +4,7 @@ WORKDIR /app
COPY package*.json ./
COPY bun.lockb ./
COPY bun.lock ./
COPY bunfig.toml ./

View File

@ -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()
// 其他

View File

@ -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",

View File

@ -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}`)

View File

@ -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 })

View 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,
})
}
}

View File

@ -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
View 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

View File

@ -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)
}

View File

@ -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

View File

@ -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)

View File

@ -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,
},

View File

@ -0,0 +1,6 @@
import initAppConfig from "../../constant/config"
import byteMonitor from "../../schedule/byteMonitor"
await initAppConfig()
await byteMonitor()

View 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
View 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)

View File

@ -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
}

View File

@ -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
View 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
View 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