feat: add goods tool for querying product information and integrate with multi-function agent

- Implemented goodsTool for querying product lists and details based on product ID.
- Added API methods for fetching product lists and single product information.
- Created Axios instance with request interceptors for handling API responses and errors.
- Updated multiFunctionAgent to include goodsTool for enhanced functionality.
- Defined types for API responses and pagination.
- Configured Vite for building the server with proper chunking and external dependencies.
This commit is contained in:
dzq 2025-12-12 10:48:12 +08:00
parent 28bab592de
commit 7be8cc973e
11 changed files with 873 additions and 7 deletions

View File

@ -57,6 +57,7 @@ pnpm generate # 运行生成脚本
- `calculatorTool`: 基本算术运算 - `calculatorTool`: 基本算术运算
- `filelistTool`: 目录文件列表 - `filelistTool`: 目录文件列表
- `jokeTool`: 随机笑话生成 - `jokeTool`: 随机笑话生成
- `goodsTool`: 商品信息查询(支持分页查询列表和单个商品详情)
### 配置系统 ### 配置系统
- **环境变量**: `.env` 文件存储 API 密钥和配置 - **环境变量**: `.env` 文件存储 API 密钥和配置

View File

@ -2,14 +2,16 @@
"name": "myagent", "name": "myagent",
"version": "1.0.0", "version": "1.0.0",
"main": "index.js", "main": "index.js",
"type": "module", "type": "commonjs",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"dev": "mastra dev", "dev": "mastra dev",
"build": "mastra build", "build": "mastra build",
"build:vite": "vite build",
"generate": "pnpx tsx ./src/scripts/index.ts", "generate": "pnpx tsx ./src/scripts/index.ts",
"server:dev": "cross-env NODE_ENV=development tsx watch src/server/index.ts", "server:dev": "cross-env NODE_ENV=development tsx watch src/server/index.ts",
"server:start": "cross-env NODE_ENV=production node .mastra/output/server/index.js" "server:vite:dev": "vite",
"server:vite:start": "node dist/index.cjs"
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",
@ -19,21 +21,29 @@
"@ai-sdk/deepseek": "^1.0.31", "@ai-sdk/deepseek": "^1.0.31",
"@ai-sdk/openai": "^2.0.80", "@ai-sdk/openai": "^2.0.80",
"@mastra/core": "^0.24.8", "@mastra/core": "^0.24.8",
"axios": "^1.13.2",
"cors": "^2.8.5", "cors": "^2.8.5",
"express": "^5.1.0", "express": "^5.1.0",
"helmet": "^8.1.0", "helmet": "^8.1.0",
"lodash-es": "^4.17.21",
"mastra": "^0.18.8", "mastra": "^0.18.8",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"zod": "^4.1.13" "zod": "^4.1.13"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^25.0.0",
"@types/express": "^5.0.0",
"@types/cors": "^2.8.17", "@types/cors": "^2.8.17",
"@types/morgan": "^1.9.9", "@types/express": "^5.0.0",
"@types/helmet": "^4.0.0", "@types/helmet": "^4.0.0",
"@types/lodash-es": "^4.17.12",
"@types/morgan": "^1.9.9",
"@types/node": "^25.0.0",
"@vitejs/plugin-react": "^5.1.2",
"@vitejs/plugin-vue": "^6.0.2",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"tsx": "^4.19.3", "tsx": "^4.19.3",
"typescript": "^5.9.3" "typescript": "^5.9.3",
"vite": "^7.2.7",
"vite-plugin-node": "^7.0.0",
"vite-plugin-svelte": "^3.0.1"
} }
} }

View File

@ -17,6 +17,9 @@ importers:
'@mastra/core': '@mastra/core':
specifier: ^0.24.8 specifier: ^0.24.8
version: 0.24.8(openapi-types@12.1.3)(react@19.2.1)(zod@4.1.13) version: 0.24.8(openapi-types@12.1.3)(react@19.2.1)(zod@4.1.13)
axios:
specifier: ^1.13.2
version: 1.13.2
cors: cors:
specifier: ^2.8.5 specifier: ^2.8.5
version: 2.8.5 version: 2.8.5
@ -26,6 +29,9 @@ importers:
helmet: helmet:
specifier: ^8.1.0 specifier: ^8.1.0
version: 8.1.0 version: 8.1.0
lodash-es:
specifier: ^4.17.21
version: 4.17.21
mastra: mastra:
specifier: ^0.18.8 specifier: ^0.18.8
version: 0.18.8(@mastra/core@0.24.8(openapi-types@12.1.3)(react@19.2.1)(zod@4.1.13))(@opentelemetry/api@1.9.0)(typescript@5.9.3)(zod@4.1.13) version: 0.18.8(@mastra/core@0.24.8(openapi-types@12.1.3)(react@19.2.1)(zod@4.1.13))(@opentelemetry/api@1.9.0)(typescript@5.9.3)(zod@4.1.13)
@ -45,12 +51,21 @@ importers:
'@types/helmet': '@types/helmet':
specifier: ^4.0.0 specifier: ^4.0.0
version: 4.0.0 version: 4.0.0
'@types/lodash-es':
specifier: ^4.17.12
version: 4.17.12
'@types/morgan': '@types/morgan':
specifier: ^1.9.9 specifier: ^1.9.9
version: 1.9.10 version: 1.9.10
'@types/node': '@types/node':
specifier: ^25.0.0 specifier: ^25.0.0
version: 25.0.0 version: 25.0.0
'@vitejs/plugin-react':
specifier: ^5.1.2
version: 5.1.2(vite@7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2))
'@vitejs/plugin-vue':
specifier: ^6.0.2
version: 6.0.2(vite@7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))
cross-env: cross-env:
specifier: ^7.0.3 specifier: ^7.0.3
version: 7.0.3 version: 7.0.3
@ -60,6 +75,15 @@ importers:
typescript: typescript:
specifier: ^5.9.3 specifier: ^5.9.3
version: 5.9.3 version: 5.9.3
vite:
specifier: ^7.2.7
version: 7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2)
vite-plugin-node:
specifier: ^7.0.0
version: 7.0.0(vite@7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2))
vite-plugin-svelte:
specifier: ^3.0.1
version: 3.0.1(rollup@4.50.2)(svelte@3.59.2)(vite@7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2))
packages: packages:
@ -284,6 +308,18 @@ packages:
peerDependencies: peerDependencies:
'@babel/core': ^7.0.0-0 '@babel/core': ^7.0.0-0
'@babel/plugin-transform-react-jsx-self@7.27.1':
resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-react-jsx-source@7.27.1':
resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
'@babel/plugin-transform-typescript@7.28.5': '@babel/plugin-transform-typescript@7.28.5':
resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@ -1249,6 +1285,12 @@ packages:
'@protobufjs/utf8@1.1.0': '@protobufjs/utf8@1.1.0':
resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
'@rolldown/pluginutils@1.0.0-beta.50':
resolution: {integrity: sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==}
'@rolldown/pluginutils@1.0.0-beta.53':
resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==}
'@rollup/plugin-alias@5.1.1': '@rollup/plugin-alias@5.1.1':
resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
@ -1303,6 +1345,10 @@ packages:
rollup: rollup:
optional: true optional: true
'@rollup/pluginutils@4.2.1':
resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
engines: {node: '>= 8.0.0'}
'@rollup/pluginutils@5.3.0': '@rollup/pluginutils@5.3.0':
resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
@ -1449,6 +1495,18 @@ packages:
'@types/aws-lambda@8.10.152': '@types/aws-lambda@8.10.152':
resolution: {integrity: sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==} resolution: {integrity: sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==}
'@types/babel__core@7.20.5':
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
'@types/babel__generator@7.27.0':
resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
'@types/babel__template@7.4.4':
resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
'@types/babel__traverse@7.28.0':
resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
'@types/body-parser@1.19.6': '@types/body-parser@1.19.6':
resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
@ -1489,6 +1547,12 @@ packages:
'@types/json-schema@7.0.15': '@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/lodash-es@4.17.12':
resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
'@types/lodash@4.17.21':
resolution: {integrity: sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==}
'@types/memcached@2.2.10': '@types/memcached@2.2.10':
resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==} resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==}
@ -1541,6 +1605,48 @@ packages:
resolution: {integrity: sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==} resolution: {integrity: sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==}
engines: {node: '>= 20'} engines: {node: '>= 20'}
'@vitejs/plugin-react@5.1.2':
resolution: {integrity: sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==}
engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
'@vitejs/plugin-vue@6.0.2':
resolution: {integrity: sha512-iHmwV3QcVGGvSC1BG5bZ4z6iwa1SOpAPWmnjOErd4Ske+lZua5K9TtAVdx0gMBClJ28DViCbSmZitjWZsWO3LA==}
engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
vite: ^5.0.0 || ^6.0.0 || ^7.0.0
vue: ^3.2.25
'@vue/compiler-core@3.5.25':
resolution: {integrity: sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==}
'@vue/compiler-dom@3.5.25':
resolution: {integrity: sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==}
'@vue/compiler-sfc@3.5.25':
resolution: {integrity: sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==}
'@vue/compiler-ssr@3.5.25':
resolution: {integrity: sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==}
'@vue/reactivity@3.5.25':
resolution: {integrity: sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==}
'@vue/runtime-core@3.5.25':
resolution: {integrity: sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==}
'@vue/runtime-dom@3.5.25':
resolution: {integrity: sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==}
'@vue/server-renderer@3.5.25':
resolution: {integrity: sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==}
peerDependencies:
vue: 3.5.25
'@vue/shared@3.5.25':
resolution: {integrity: sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==}
'@webcontainer/env@1.1.1': '@webcontainer/env@1.1.1':
resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==} resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==}
@ -1659,6 +1765,10 @@ packages:
caniuse-lite@1.0.30001760: caniuse-lite@1.0.30001760:
resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==}
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
chalk@5.6.2: chalk@5.6.2:
resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
@ -1740,12 +1850,19 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
date-fns@3.6.0: date-fns@3.6.0:
resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==}
dateformat@4.6.3: dateformat@4.6.3:
resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==}
debounce@2.2.0:
resolution: {integrity: sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==}
engines: {node: '>=18'}
debug@2.6.9: debug@2.6.9:
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
peerDependencies: peerDependencies:
@ -1854,6 +1971,10 @@ packages:
end-of-stream@1.4.5: end-of-stream@1.4.5:
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
es-define-property@1.0.1: es-define-property@1.0.1:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -1894,6 +2015,9 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'} engines: {node: '>=12'}
estree-walker@0.6.1:
resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==}
estree-walker@2.0.2: estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
@ -2054,6 +2178,10 @@ packages:
graceful-fs@4.2.11: graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
has-symbols@1.1.0: has-symbols@1.1.0:
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -2283,6 +2411,9 @@ packages:
resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
engines: {node: '>=14'} engines: {node: '>=14'}
lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
lodash.camelcase@4.3.0: lodash.camelcase@4.3.0:
resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
@ -2524,6 +2655,10 @@ packages:
pkg-types@2.3.0: pkg-types@2.3.0:
resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
postcss@8.5.6:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
postgres-array@2.0.0: postgres-array@2.0.0:
resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -2599,6 +2734,10 @@ packages:
resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
engines: {node: '>= 0.10'} engines: {node: '>= 0.10'}
react-refresh@0.18.0:
resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==}
engines: {node: '>=0.10.0'}
react@19.2.1: react@19.2.1:
resolution: {integrity: sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==} resolution: {integrity: sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -2615,6 +2754,9 @@ packages:
resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==}
engines: {node: '>=8.6.0'} engines: {node: '>=8.6.0'}
require-relative@0.8.7:
resolution: {integrity: sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==}
resolve-from@5.0.0: resolve-from@5.0.0:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -2648,6 +2790,15 @@ packages:
peerDependencies: peerDependencies:
rollup: ^4.0.0 rollup: ^4.0.0
rollup-plugin-svelte@6.1.1:
resolution: {integrity: sha512-ijnm0pH1ScrY4uxwaNXBpNVejVzpL2769hIEbAlnqNUWZrffLspu5/k9/l/Wsj3NrEHLQ6wCKGagVJonyfN7ow==}
peerDependencies:
rollup: '>=1.19.2'
svelte: '*'
rollup-pluginutils@2.8.2:
resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
rollup@4.50.2: rollup@4.50.2:
resolution: {integrity: sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w==} resolution: {integrity: sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'} engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@ -2756,6 +2907,14 @@ packages:
sonic-boom@4.2.0: sonic-boom@4.2.0:
resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==}
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
sourcemap-codec@1.4.8:
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
deprecated: Please use @jridgewell/sourcemap-codec instead
split2@4.2.0: split2@4.2.0:
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
engines: {node: '>= 10.x'} engines: {node: '>= 10.x'}
@ -2784,10 +2943,23 @@ packages:
resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==}
engines: {node: '>=14.16'} engines: {node: '>=14.16'}
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
supports-preserve-symlinks-flag@1.0.0: supports-preserve-symlinks-flag@1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
svelte-hmr@0.11.6:
resolution: {integrity: sha512-XUYcp7W26q/fF8tABZfCYGklwL4TDH48gc1KOjuBQNlTiMW63l/+rRqmfVOE/qKG5vns0J2NPo3zFjdahkwoHA==}
peerDependencies:
svelte: '>=3.19.0'
svelte@3.59.2:
resolution: {integrity: sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==}
engines: {node: '>= 8'}
swr@2.3.7: swr@2.3.7:
resolution: {integrity: sha512-ZEquQ82QvalqTxhBVv/DlAg2mbmUjF4UgpPg9wwk4ufb9rQnZXh1iKyyKBqV6bQGu1Ie7L1QwSYO07qFIa1p+g==} resolution: {integrity: sha512-ZEquQ82QvalqTxhBVv/DlAg2mbmUjF4UgpPg9wwk4ufb9rQnZXh1iKyyKBqV6bQGu1Ie7L1QwSYO07qFIa1p+g==}
peerDependencies: peerDependencies:
@ -2890,6 +3062,70 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
vite-plugin-node@7.0.0:
resolution: {integrity: sha512-FZqTHvCXUu+U8i6qMtlZCrEvlelUioEf6J4S77XHpZk73frveqKVot60W0hpbffv5OMECXYwP/LAiTGAOLN4/g==}
peerDependencies:
'@swc/core': ^1.7.26
vite: ^7.0.0
peerDependenciesMeta:
'@swc/core':
optional: true
vite-plugin-svelte@3.0.1:
resolution: {integrity: sha512-R4XFM4pmeJ9GwKs5mcDDDQs1e6xvCrBumGLnApPdYarS6+kfDqeC0U1WOLp6LLUx1sUdv7poywnr9eNKenQfkg==}
deprecated: use @sveltejs/vite-plugin-svelte for vite2.0+ support
peerDependencies:
svelte: ^3.0.0
vite: '>=0.20.8 <2.0.0'
vite@7.2.7:
resolution: {integrity: sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
'@types/node': ^20.19.0 || >=22.12.0
jiti: '>=1.21.0'
less: ^4.0.0
lightningcss: ^1.21.0
sass: ^1.70.0
sass-embedded: ^1.70.0
stylus: '>=0.54.8'
sugarss: ^5.0.0
terser: ^5.16.0
tsx: ^4.8.1
yaml: ^2.4.2
peerDependenciesMeta:
'@types/node':
optional: true
jiti:
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
sass-embedded:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
tsx:
optional: true
yaml:
optional: true
vue@3.5.25:
resolution: {integrity: sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
webidl-conversions@3.0.1: webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
@ -3240,6 +3476,16 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)':
dependencies:
'@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
'@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)':
dependencies:
'@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
'@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)':
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
@ -4385,6 +4631,10 @@ snapshots:
'@protobufjs/utf8@1.1.0': {} '@protobufjs/utf8@1.1.0': {}
'@rolldown/pluginutils@1.0.0-beta.50': {}
'@rolldown/pluginutils@1.0.0-beta.53': {}
'@rollup/plugin-alias@5.1.1(rollup@4.50.2)': '@rollup/plugin-alias@5.1.1(rollup@4.50.2)':
optionalDependencies: optionalDependencies:
rollup: 4.50.2 rollup: 4.50.2
@ -4428,6 +4678,11 @@ snapshots:
optionalDependencies: optionalDependencies:
rollup: 4.50.2 rollup: 4.50.2
'@rollup/pluginutils@4.2.1':
dependencies:
estree-walker: 2.0.2
picomatch: 2.3.1
'@rollup/pluginutils@5.3.0(rollup@4.50.2)': '@rollup/pluginutils@5.3.0(rollup@4.50.2)':
dependencies: dependencies:
'@types/estree': 1.0.8 '@types/estree': 1.0.8
@ -4516,6 +4771,27 @@ snapshots:
'@types/aws-lambda@8.10.152': {} '@types/aws-lambda@8.10.152': {}
'@types/babel__core@7.20.5':
dependencies:
'@babel/parser': 7.28.5
'@babel/types': 7.28.5
'@types/babel__generator': 7.27.0
'@types/babel__template': 7.4.4
'@types/babel__traverse': 7.28.0
'@types/babel__generator@7.27.0':
dependencies:
'@babel/types': 7.28.5
'@types/babel__template@7.4.4':
dependencies:
'@babel/parser': 7.28.5
'@babel/types': 7.28.5
'@types/babel__traverse@7.28.0':
dependencies:
'@babel/types': 7.28.5
'@types/body-parser@1.19.6': '@types/body-parser@1.19.6':
dependencies: dependencies:
'@types/connect': 3.4.38 '@types/connect': 3.4.38
@ -4572,6 +4848,12 @@ snapshots:
'@types/json-schema@7.0.15': {} '@types/json-schema@7.0.15': {}
'@types/lodash-es@4.17.12':
dependencies:
'@types/lodash': 4.17.21
'@types/lodash@4.17.21': {}
'@types/memcached@2.2.10': '@types/memcached@2.2.10':
dependencies: dependencies:
'@types/node': 25.0.0 '@types/node': 25.0.0
@ -4636,6 +4918,78 @@ snapshots:
'@vercel/oidc@3.0.5': {} '@vercel/oidc@3.0.5': {}
'@vitejs/plugin-react@5.1.2(vite@7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2))':
dependencies:
'@babel/core': 7.28.5
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5)
'@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5)
'@rolldown/pluginutils': 1.0.0-beta.53
'@types/babel__core': 7.20.5
react-refresh: 0.18.0
vite: 7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-vue@6.0.2(vite@7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))':
dependencies:
'@rolldown/pluginutils': 1.0.0-beta.50
vite: 7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2)
vue: 3.5.25(typescript@5.9.3)
'@vue/compiler-core@3.5.25':
dependencies:
'@babel/parser': 7.28.5
'@vue/shared': 3.5.25
entities: 4.5.0
estree-walker: 2.0.2
source-map-js: 1.2.1
'@vue/compiler-dom@3.5.25':
dependencies:
'@vue/compiler-core': 3.5.25
'@vue/shared': 3.5.25
'@vue/compiler-sfc@3.5.25':
dependencies:
'@babel/parser': 7.28.5
'@vue/compiler-core': 3.5.25
'@vue/compiler-dom': 3.5.25
'@vue/compiler-ssr': 3.5.25
'@vue/shared': 3.5.25
estree-walker: 2.0.2
magic-string: 0.30.21
postcss: 8.5.6
source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.25':
dependencies:
'@vue/compiler-dom': 3.5.25
'@vue/shared': 3.5.25
'@vue/reactivity@3.5.25':
dependencies:
'@vue/shared': 3.5.25
'@vue/runtime-core@3.5.25':
dependencies:
'@vue/reactivity': 3.5.25
'@vue/shared': 3.5.25
'@vue/runtime-dom@3.5.25':
dependencies:
'@vue/reactivity': 3.5.25
'@vue/runtime-core': 3.5.25
'@vue/shared': 3.5.25
csstype: 3.2.3
'@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))':
dependencies:
'@vue/compiler-ssr': 3.5.25
'@vue/shared': 3.5.25
vue: 3.5.25(typescript@5.9.3)
'@vue/shared@3.5.25': {}
'@webcontainer/env@1.1.1': {} '@webcontainer/env@1.1.1': {}
accepts@1.3.8: accepts@1.3.8:
@ -4773,6 +5127,11 @@ snapshots:
caniuse-lite@1.0.30001760: {} caniuse-lite@1.0.30001760: {}
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
chalk@5.6.2: {} chalk@5.6.2: {}
cjs-module-lexer@1.4.3: {} cjs-module-lexer@1.4.3: {}
@ -4836,10 +5195,14 @@ snapshots:
shebang-command: 2.0.0 shebang-command: 2.0.0
which: 2.0.2 which: 2.0.2
csstype@3.2.3: {}
date-fns@3.6.0: {} date-fns@3.6.0: {}
dateformat@4.6.3: {} dateformat@4.6.3: {}
debounce@2.2.0: {}
debug@2.6.9: debug@2.6.9:
dependencies: dependencies:
ms: 2.0.0 ms: 2.0.0
@ -4905,6 +5268,8 @@ snapshots:
dependencies: dependencies:
once: 1.4.0 once: 1.4.0
entities@4.5.0: {}
es-define-property@1.0.1: {} es-define-property@1.0.1: {}
es-errors@1.3.0: {} es-errors@1.3.0: {}
@ -4986,6 +5351,8 @@ snapshots:
escape-string-regexp@5.0.0: {} escape-string-regexp@5.0.0: {}
estree-walker@0.6.1: {}
estree-walker@2.0.2: {} estree-walker@2.0.2: {}
etag@1.8.1: {} etag@1.8.1: {}
@ -5229,6 +5596,8 @@ snapshots:
graceful-fs@4.2.11: {} graceful-fs@4.2.11: {}
has-flag@4.0.0: {}
has-symbols@1.1.0: {} has-symbols@1.1.0: {}
has-tostringtag@1.0.2: has-tostringtag@1.0.2:
@ -5398,6 +5767,8 @@ snapshots:
pkg-types: 2.3.0 pkg-types: 2.3.0
quansync: 0.2.11 quansync: 0.2.11
lodash-es@4.17.21: {}
lodash.camelcase@4.3.0: {} lodash.camelcase@4.3.0: {}
long@5.3.2: {} long@5.3.2: {}
@ -5648,6 +6019,12 @@ snapshots:
exsolve: 1.0.8 exsolve: 1.0.8
pathe: 2.0.3 pathe: 2.0.3
postcss@8.5.6:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
postgres-array@2.0.0: {} postgres-array@2.0.0: {}
postgres-bytea@1.0.0: {} postgres-bytea@1.0.0: {}
@ -5727,6 +6104,8 @@ snapshots:
iconv-lite: 0.7.0 iconv-lite: 0.7.0
unpipe: 1.0.0 unpipe: 1.0.0
react-refresh@0.18.0: {}
react@19.2.1: {} react@19.2.1: {}
real-require@0.2.0: {} real-require@0.2.0: {}
@ -5741,6 +6120,8 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
require-relative@0.8.7: {}
resolve-from@5.0.0: {} resolve-from@5.0.0: {}
resolve-pkg-maps@1.0.0: {} resolve-pkg-maps@1.0.0: {}
@ -5770,6 +6151,18 @@ snapshots:
dependencies: dependencies:
rollup: 4.50.2 rollup: 4.50.2
rollup-plugin-svelte@6.1.1(rollup@4.50.2)(svelte@3.59.2):
dependencies:
require-relative: 0.8.7
rollup: 4.50.2
rollup-pluginutils: 2.8.2
sourcemap-codec: 1.4.8
svelte: 3.59.2
rollup-pluginutils@2.8.2:
dependencies:
estree-walker: 0.6.1
rollup@4.50.2: rollup@4.50.2:
dependencies: dependencies:
'@types/estree': 1.0.8 '@types/estree': 1.0.8
@ -5947,6 +6340,10 @@ snapshots:
dependencies: dependencies:
atomic-sleep: 1.0.0 atomic-sleep: 1.0.0
source-map-js@1.2.1: {}
sourcemap-codec@1.4.8: {}
split2@4.2.0: {} split2@4.2.0: {}
statuses@2.0.1: {} statuses@2.0.1: {}
@ -5967,8 +6364,18 @@ snapshots:
strip-json-comments@5.0.3: {} strip-json-comments@5.0.3: {}
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
supports-preserve-symlinks-flag@1.0.0: {} supports-preserve-symlinks-flag@1.0.0: {}
svelte-hmr@0.11.6(svelte@3.59.2):
dependencies:
svelte: 3.59.2
svelte@3.59.2: {}
swr@2.3.7(react@19.2.1): swr@2.3.7(react@19.2.1):
dependencies: dependencies:
dequal: 2.0.3 dequal: 2.0.3
@ -6058,6 +6465,49 @@ snapshots:
vary@1.1.2: {} vary@1.1.2: {}
vite-plugin-node@7.0.0(vite@7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2)):
dependencies:
'@rollup/pluginutils': 4.2.1
chalk: 4.1.2
debounce: 2.2.0
debug: 4.4.3
vite: 7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- supports-color
vite-plugin-svelte@3.0.1(rollup@4.50.2)(svelte@3.59.2)(vite@7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2)):
dependencies:
rollup-plugin-svelte: 6.1.1(rollup@4.50.2)(svelte@3.59.2)
svelte: 3.59.2
svelte-hmr: 0.11.6(svelte@3.59.2)
vite: 7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
- rollup
vite@7.2.7(@types/node@25.0.0)(tsx@4.21.0)(yaml@2.8.2):
dependencies:
esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
rollup: 4.50.2
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 25.0.0
fsevents: 2.3.3
tsx: 4.21.0
yaml: 2.8.2
vue@3.5.25(typescript@5.9.3):
dependencies:
'@vue/compiler-dom': 3.5.25
'@vue/compiler-sfc': 3.5.25
'@vue/runtime-dom': 3.5.25
'@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.9.3))
'@vue/shared': 3.5.25
optionalDependencies:
typescript: 5.9.3
webidl-conversions@3.0.1: {} webidl-conversions@3.0.1: {}
whatwg-url@5.0.0: whatwg-url@5.0.0:

View File

@ -5,6 +5,7 @@ import {
calculatorTool, calculatorTool,
filelistTool, filelistTool,
jokeTool, jokeTool,
goodsTool,
} from "../tools"; } from "../tools";
import { createDeepSeek } from '@ai-sdk/deepseek'; import { createDeepSeek } from '@ai-sdk/deepseek';
@ -24,6 +25,7 @@ export const multiFunctionAgent = new Agent({
3. **** 3. ****
4. **** 4. ****
5. **** 5. ****
6. ****使ID获取单个商品详情
@ -38,5 +40,6 @@ export const multiFunctionAgent = new Agent({
calculatorTool, calculatorTool,
filelistTool, filelistTool,
jokeTool, jokeTool,
goodsTool,
}, },
}); });

117
src/mastra/api/axios.ts Normal file
View File

@ -0,0 +1,117 @@
import type { AxiosInstance, AxiosRequestConfig } from "axios"
import axios from "axios"
import { get, merge } from "lodash-es"
const BASE_URL = 'http://wxshop.ab98.cn/shop-api/api'
/** 创建请求实例 */
function createInstance() {
// 创建一个 axios 实例命名为 instance
const instance = axios.create()
// 请求拦截器
instance.interceptors.request.use(
// 发送之前
config => config,
// 发送失败
error => Promise.reject(error)
)
// 响应拦截器(可根据具体业务作出相应的调整)
instance.interceptors.response.use(
(response) => {
// apiData 是 api 返回的数据
const apiData = response.data
// 二进制数据则直接返回
const responseType = response.request?.responseType
if (responseType === "blob" || responseType === "arraybuffer") return apiData
// 这个 code 是和后端约定的业务 code
const code = apiData.code
// 如果没有 code, 代表这不是项目后端开发的 api
if (code === undefined) {
return Promise.reject(new Error("非本系统的接口"))
}
switch (code) {
case 0:
// 本系统采用 code === 0 来表示没有业务错误
return apiData
default:
// 不是正确的 code
return Promise.reject(new Error(apiData.msg || apiData.message || "Error"))
}
},
(error) => {
// status 是 HTTP 状态码
const status = get(error, "response.status")
const message = get(error, "response.data.message")
switch (status) {
case 400:
error.message = "请求错误"
break
case 401:
// 登录过期
error.message = message || "登录过期"
break
case 403:
error.message = message || "拒绝访问"
break
case 404:
error.message = "请求地址出错"
break
case 408:
error.message = "请求超时"
break
case 500:
error.message = "服务器内部错误"
break
case 501:
error.message = "服务未实现"
break
case 502:
error.message = "网关错误"
break
case 503:
error.message = "服务不可用"
break
case 504:
error.message = "网关超时"
break
case 505:
error.message = "HTTP 版本不受支持"
break
}
return Promise.reject(error)
}
)
return instance
}
/** 创建请求方法 */
function createRequest(instance: AxiosInstance) {
return <T>(config: AxiosRequestConfig): Promise<T> => {
// 默认配置
const defaultConfig: AxiosRequestConfig = {
// 接口地址
baseURL: BASE_URL,
// 请求头
headers: {
// 携带 Token
// "Authorization": token ? `Bearer ${token}` : undefined,
"Content-Type": "application/json"
},
// 请求体
data: {},
// 请求超时
timeout: 10000,
// 跨域请求时是否携带 Cookies
withCredentials: false
}
// 将默认配置 defaultConfig 和传入的自定义配置 config 进行合并成为 mergeConfig
const mergeConfig = merge(defaultConfig, config)
return instance(mergeConfig)
}
}
/** 用于请求的实例 */
const instance = createInstance()
/** 用于请求的方法 */
export const request = createRequest(instance)

View File

@ -0,0 +1,71 @@
import { request } from "../axios"
import { PageDTO, ResponseData, BasePageQuery } from "../type"
export interface ShopGoodsDTO {
goodsId?: number // 商品唯一ID
goodsName?: string // 商品名称
categoryId?: number // 分类ID
externalGoodsId?: number // 外部归属类型的商品ID
corpid?: string // 企业微信id
categoryName?: string // 分类名称
belongType?: number // 归属类型0-借还柜 1-固资通)
price?: number // 销售价格
stock?: number // 库存数量
status?: number // 商品状态1上架 2下架
autoApproval?: number // 免审批0否 1是
coverImg?: string // 封面图URL
creatorId?: number // 创建者ID
creatorName?: string // 创建者名称
createTime?: string // 创建时间
remark?: string // 备注
cabinetName?: string // 柜机名称
cellNo?: number // 格口号
cellNoStr?: string // 格口号(字符串格式)
totalStock?: number // 已分配库存
shopNameStr?: string // 地址名称
usageInstruction?: string // 商品使用说明
monthlyPurchaseLimit?: number // 每人每月限购数量
goodsDetail?: string // 商品详情支持2000汉字+10个图片链接
}
export interface SearchShopGoodsQuery extends BasePageQuery {
goodsName?: string // 商品名称(模糊查询)
categoryId?: number // 商品分类ID
externalGoodsId?: number // 外部归属类型的商品ID
corpid?: string // 企业微信id
status?: number // 商品状态1上架 2下架
autoApproval?: number // 免审批0否 1是
minPrice?: number // 最低价格
maxPrice?: number // 最高价格
belongType?: number // 归属类型0-借还柜 1-固资通)
beginTime?: string // 开始时间格式yyyy-MM-dd
endTime?: string // 结束时间格式yyyy-MM-dd
}
/**
*
*
* @param query
* @returns Promise<ResponseData<PageDTO<ShopGoodsDTO>>>
*/
export function getGoodsList(query: SearchShopGoodsQuery) {
return request<ResponseData<PageDTO<ShopGoodsDTO>>>({
url: "manage/goods/list",
method: "get",
params: query
})
}
/**
*
* ID获取商品的详细信息
* @param goodsId ID
* @returns Promise<ResponseData<ShopGoodsDTO>>
*/
export function getGoodsInfo(goodsId: number) {
return request<ResponseData<ShopGoodsDTO>>({
url: "manage/goods/getGoodsInfo",
method: "get",
params: { goodsId }
})
}

24
src/mastra/api/type.ts Normal file
View File

@ -0,0 +1,24 @@
export type ResponseData<T> = {
code: number;
msg: string;
data: T;
};
export type PageDTO<T> = {
total: number;
rows: Array<T>;
};
export interface BasePageQuery extends BaseQuery {
pageNum?: number;
pageSize?: number;
}
export interface BaseQuery {
beginTime?: string;
endTime?: string;
orderColumn?: string;
orderDirection?: string;
timeRangeColumn?: string;
}

View File

@ -3,4 +3,7 @@ import { multiFunctionAgent } from "./agents";
export const mastra = new Mastra({ export const mastra = new Mastra({
agents: { multiFunctionAgent }, agents: { multiFunctionAgent },
bundler: {
externals: ["supports-color"],
},
}); });

View File

@ -0,0 +1,107 @@
import { createTool } from "@mastra/core/tools";
import { z } from "zod";
import { getGoodsList, getGoodsInfo, ShopGoodsDTO, SearchShopGoodsQuery } from "../api/manage/goods";
export const goodsTool = createTool({
id: "goods",
description: "查询商品信息支持分页查询商品列表或根据商品ID获取单个商品详情",
inputSchema: z.object({
queryType: z.enum(["list", "single"]).describe("查询类型:'list'表示分页查询商品列表,'single'表示根据商品ID查询单个商品"),
goodsId: z.number().optional().describe("商品ID当queryType为'single'时必填)"),
goodsName: z.string().optional().describe("商品名称(模糊查询)"),
categoryId: z.number().optional().describe("商品分类ID"),
status: z.number().optional().describe("商品状态1上架 2下架"),
autoApproval: z.number().optional().describe("免审批0否 1是"),
minPrice: z.number().optional().describe("最低价格"),
maxPrice: z.number().optional().describe("最高价格"),
belongType: z.number().optional().describe("归属类型0-借还柜 1-固资通)"),
beginTime: z.string().optional().describe("开始时间格式yyyy-MM-dd"),
endTime: z.string().optional().describe("结束时间格式yyyy-MM-dd"),
pageNum: z.number().optional().describe("页码默认1"),
pageSize: z.number().optional().describe("每页大小默认10"),
orderColumn: z.string().optional().describe("排序字段"),
orderDirection: z.string().optional().describe("排序方向asc或desc"),
}),
outputSchema: z.object({
success: z.boolean(),
message: z.string(),
data: z.any().optional(),
total: z.number().optional(),
pageNum: z.number().optional(),
pageSize: z.number().optional(),
}),
execute: async ({ context }) => {
try {
const {
queryType,
goodsId,
goodsName,
categoryId,
status,
autoApproval,
minPrice,
maxPrice,
belongType,
beginTime,
endTime,
pageNum = 1,
pageSize = 10,
orderColumn,
orderDirection,
} = context;
if (queryType === "single") {
if (!goodsId) {
return {
success: false,
message: "查询单个商品时goodsId参数为必填",
};
}
const response = await getGoodsInfo(goodsId);
return {
success: response.code === 0,
message: response.msg || "查询成功",
data: response.data,
};
} else {
// 列表查询
const query: SearchShopGoodsQuery = {
goodsName,
categoryId,
status,
autoApproval,
minPrice,
maxPrice,
belongType,
beginTime,
endTime,
pageNum,
pageSize,
orderColumn,
orderDirection,
};
const response = await getGoodsList(query);
return {
success: response.code === 0,
message: response.msg || "查询成功",
data: response.data?.rows || [],
total: response.data?.total || 0,
pageNum,
pageSize,
};
}
} catch (error: any) {
return {
success: false,
message: `查询失败: ${error.message || "未知错误"}`,
};
}
},
});

View File

@ -3,3 +3,4 @@ export { timeTool } from "./time-tool";
export { calculatorTool } from "./calculator-tool"; export { calculatorTool } from "./calculator-tool";
export { filelistTool } from "./filelist-tool"; export { filelistTool } from "./filelist-tool";
export { jokeTool } from "./joke-tool"; export { jokeTool } from "./joke-tool";
export { goodsTool } from "./goods-tool";

79
vite.config.ts Normal file
View File

@ -0,0 +1,79 @@
import { defineConfig } from 'vite';
import { VitePluginNode } from 'vite-plugin-node';
export default defineConfig({
root: '.', // 设置根目录
server: {
port: 3000,
},
build: {
outDir: 'dist',
rollupOptions: {
input: 'src/server/index.ts',
output: {
// 入口文件命名
entryFileNames: '[name].js',
// chunk 文件命名
chunkFileNames: 'chunks/[name]-[hash].js',
// 资源文件命名
assetFileNames: 'assets/[name]-[hash].[ext]',
// 手动分块策略
manualChunks(id) {
// 将 node_modules 中的依赖打包到单独的 chunk
if (id.includes('node_modules')) {
// 获取包名
const match = id.match(/node_modules\/(@[^\/]+\/[^\/]+|[^\/]+)/);
if (match) {
const packageName = match[1];
// 排除外部依赖(已经在 external 中配置的)
const externalPackages = [
'express',
'cors',
'helmet',
'morgan',
'@mastra/core',
'axios',
'lodash-es',
'zod',
'@ai-sdk/deepseek',
'@ai-sdk/openai',
'mastra'
];
if (!externalPackages.some(pkg => packageName.startsWith(pkg))) {
return `vendor-${packageName.replace('@', '').replace('/', '-')}`;
}
}
// 其他 node_modules 依赖打包到 vendor 中
return 'vendor';
}
// 业务代码根据目录结构分块
if (id.includes('src/mastra/')) {
return 'mastra';
}
if (id.includes('src/server/')) {
return 'server';
}
}
},
// 排除外部依赖,让 Node 运行时加载
external: [
'express',
'cors',
'helmet',
'morgan',
'@mastra/core',
'axios',
'lodash-es',
'zod',
'@ai-sdk/deepseek',
'@ai-sdk/openai',
'mastra'
]
},
},
plugins: VitePluginNode({
adapter: 'express',
appPath: './src/server/index.ts',
exportName: 'default',
}),
});