This commit is contained in:
2026-01-10 16:26:20 +08:00
parent b4033e146e
commit 31cc0c42d8
9 changed files with 326 additions and 252 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "@kevisual/ai", "name": "@kevisual/ai",
"version": "0.0.19", "version": "0.0.20",
"description": "AI Center Services", "description": "AI Center Services",
"main": "index.js", "main": "index.js",
"basename": "/root/ai-center-services", "basename": "/root/ai-center-services",
@@ -27,7 +27,7 @@
], ],
"author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)", "author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)",
"license": "MIT", "license": "MIT",
"packageManager": "pnpm@10.24.0", "packageManager": "pnpm@10.28.0",
"type": "module", "type": "module",
"publishConfig": { "publishConfig": {
"registry": "https://registry.npmjs.org/", "registry": "https://registry.npmjs.org/",
@@ -53,27 +53,27 @@
} }
}, },
"devDependencies": { "devDependencies": {
"@kevisual/router": "0.0.36", "@kevisual/router": "0.0.52",
"@kevisual/types": "^0.0.10", "@kevisual/types": "^0.0.10",
"@kevisual/use-config": "^1.0.21", "@kevisual/use-config": "^1.0.21",
"@types/bun": "^1.3.4", "@types/bun": "^1.3.5",
"@types/crypto-js": "^4.2.2", "@types/crypto-js": "^4.2.2",
"@types/formidable": "^3.4.6", "@types/formidable": "^3.4.6",
"@types/node": "^24.10.1", "@types/node": "^25.0.5",
"cross-env": "^10.1.0", "cross-env": "^10.1.0",
"crypto-js": "^4.2.0", "crypto-js": "^4.2.0",
"dayjs": "^1.11.19", "dayjs": "^1.11.19",
"dotenv": "^17.2.3", "dotenv": "^17.2.3",
"formidable": "^3.5.4", "formidable": "^3.5.4",
"openai": "6.10.0", "openai": "6.16.0",
"pm2": "^6.0.14", "pm2": "^6.0.14",
"rimraf": "^6.1.2", "rimraf": "^6.1.2",
"typescript": "^5.9.3", "typescript": "^5.9.3",
"vite": "^7.2.6" "vite": "^7.3.1"
}, },
"dependencies": { "dependencies": {
"@kevisual/logger": "^0.0.4", "@kevisual/logger": "^0.0.4",
"@kevisual/permission": "^0.0.3", "@kevisual/permission": "^0.0.3",
"@kevisual/query": "^0.0.31" "@kevisual/query": "^0.0.35"
} }
} }

348
pnpm-lock.yaml generated
View File

@@ -15,12 +15,12 @@ importers:
specifier: ^0.0.3 specifier: ^0.0.3
version: 0.0.3 version: 0.0.3
'@kevisual/query': '@kevisual/query':
specifier: ^0.0.31 specifier: ^0.0.35
version: 0.0.31 version: 0.0.35
devDependencies: devDependencies:
'@kevisual/router': '@kevisual/router':
specifier: 0.0.36 specifier: 0.0.52
version: 0.0.36 version: 0.0.52
'@kevisual/types': '@kevisual/types':
specifier: ^0.0.10 specifier: ^0.0.10
version: 0.0.10 version: 0.0.10
@@ -28,8 +28,8 @@ importers:
specifier: ^1.0.21 specifier: ^1.0.21
version: 1.0.21(dotenv@17.2.3) version: 1.0.21(dotenv@17.2.3)
'@types/bun': '@types/bun':
specifier: ^1.3.4 specifier: ^1.3.5
version: 1.3.4 version: 1.3.5
'@types/crypto-js': '@types/crypto-js':
specifier: ^4.2.2 specifier: ^4.2.2
version: 4.2.2 version: 4.2.2
@@ -37,8 +37,8 @@ importers:
specifier: ^3.4.6 specifier: ^3.4.6
version: 3.4.6 version: 3.4.6
'@types/node': '@types/node':
specifier: ^24.10.1 specifier: ^25.0.5
version: 24.10.1 version: 25.0.5
cross-env: cross-env:
specifier: ^10.1.0 specifier: ^10.1.0
version: 10.1.0 version: 10.1.0
@@ -55,8 +55,8 @@ importers:
specifier: ^3.5.4 specifier: ^3.5.4
version: 3.5.4 version: 3.5.4
openai: openai:
specifier: 6.10.0 specifier: 6.16.0
version: 6.10.0(ws@8.18.3)(zod@3.25.76) version: 6.16.0(ws@8.18.3)(zod@3.25.76)
pm2: pm2:
specifier: ^6.0.14 specifier: ^6.0.14
version: 6.0.14 version: 6.0.14
@@ -67,166 +67,166 @@ importers:
specifier: ^5.9.3 specifier: ^5.9.3
version: 5.9.3 version: 5.9.3
vite: vite:
specifier: ^7.2.6 specifier: ^7.3.1
version: 7.2.6(@types/node@24.10.1) version: 7.3.1(@types/node@25.0.5)
packages: packages:
'@epic-web/invariant@1.0.0': '@epic-web/invariant@1.0.0':
resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==}
'@esbuild/aix-ppc64@0.25.8': '@esbuild/aix-ppc64@0.27.2':
resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ppc64] cpu: [ppc64]
os: [aix] os: [aix]
'@esbuild/android-arm64@0.25.8': '@esbuild/android-arm64@0.27.2':
resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
'@esbuild/android-arm@0.25.8': '@esbuild/android-arm@0.27.2':
resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm] cpu: [arm]
os: [android] os: [android]
'@esbuild/android-x64@0.25.8': '@esbuild/android-x64@0.27.2':
resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [android] os: [android]
'@esbuild/darwin-arm64@0.25.8': '@esbuild/darwin-arm64@0.27.2':
resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@esbuild/darwin-x64@0.25.8': '@esbuild/darwin-x64@0.27.2':
resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@esbuild/freebsd-arm64@0.25.8': '@esbuild/freebsd-arm64@0.27.2':
resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [freebsd] os: [freebsd]
'@esbuild/freebsd-x64@0.25.8': '@esbuild/freebsd-x64@0.27.2':
resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
'@esbuild/linux-arm64@0.25.8': '@esbuild/linux-arm64@0.27.2':
resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@esbuild/linux-arm@0.25.8': '@esbuild/linux-arm@0.27.2':
resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@esbuild/linux-ia32@0.25.8': '@esbuild/linux-ia32@0.27.2':
resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ia32] cpu: [ia32]
os: [linux] os: [linux]
'@esbuild/linux-loong64@0.25.8': '@esbuild/linux-loong64@0.27.2':
resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
'@esbuild/linux-mips64el@0.25.8': '@esbuild/linux-mips64el@0.27.2':
resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [mips64el] cpu: [mips64el]
os: [linux] os: [linux]
'@esbuild/linux-ppc64@0.25.8': '@esbuild/linux-ppc64@0.27.2':
resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
'@esbuild/linux-riscv64@0.25.8': '@esbuild/linux-riscv64@0.27.2':
resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
'@esbuild/linux-s390x@0.25.8': '@esbuild/linux-s390x@0.27.2':
resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
'@esbuild/linux-x64@0.25.8': '@esbuild/linux-x64@0.27.2':
resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@esbuild/netbsd-arm64@0.25.8': '@esbuild/netbsd-arm64@0.27.2':
resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [netbsd] os: [netbsd]
'@esbuild/netbsd-x64@0.25.8': '@esbuild/netbsd-x64@0.27.2':
resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [netbsd] os: [netbsd]
'@esbuild/openbsd-arm64@0.25.8': '@esbuild/openbsd-arm64@0.27.2':
resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [openbsd] os: [openbsd]
'@esbuild/openbsd-x64@0.25.8': '@esbuild/openbsd-x64@0.27.2':
resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [openbsd] os: [openbsd]
'@esbuild/openharmony-arm64@0.25.8': '@esbuild/openharmony-arm64@0.27.2':
resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [openharmony] os: [openharmony]
'@esbuild/sunos-x64@0.25.8': '@esbuild/sunos-x64@0.27.2':
resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [sunos] os: [sunos]
'@esbuild/win32-arm64@0.25.8': '@esbuild/win32-arm64@0.27.2':
resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@esbuild/win32-ia32@0.25.8': '@esbuild/win32-ia32@0.27.2':
resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
'@esbuild/win32-x64@0.25.8': '@esbuild/win32-x64@0.27.2':
resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@@ -248,11 +248,11 @@ packages:
'@kevisual/permission@0.0.3': '@kevisual/permission@0.0.3':
resolution: {integrity: sha512-8JsA/5O5Ax/z+M+MYpFYdlioHE6jNmWMuFSokBWYs9CCAHNiSKMR01YLkoVDoPvncfH/Y8F5K/IEXRCbptuMNA==} resolution: {integrity: sha512-8JsA/5O5Ax/z+M+MYpFYdlioHE6jNmWMuFSokBWYs9CCAHNiSKMR01YLkoVDoPvncfH/Y8F5K/IEXRCbptuMNA==}
'@kevisual/query@0.0.31': '@kevisual/query@0.0.35':
resolution: {integrity: sha512-bBdepjmMICLpcj/a9fnn82/0CGGYUZiCV+usWsJZKAwVlZcnj+WtKmbgKT09KpP6g3jjYzYOaXHiNFB8N0bQAQ==} resolution: {integrity: sha512-80dyy2LMCmEC72g+X4QWUKlZErhawQPgnGSBNR4yhrBcFgHIJQ14LR1Z+bS5S1I7db+1PDNpaxBTjIaoYoXunw==}
'@kevisual/router@0.0.36': '@kevisual/router@0.0.52':
resolution: {integrity: sha512-o7GAb5T0WwRuHnWe3KB0/SPVaNHrnsFSNAQ9XuWokobfDP1ACFvOR9/rjbC0fbGFaeTeRKAprixxKkY1sfunBw==} resolution: {integrity: sha512-Qiv3P1XjzD813Tm79S+atrDb2eickGCI9tuy/aCu512LcoYYJqZhwwkeT4ES0DinnA13Ckqd43QWBR6UmuYkHQ==}
'@kevisual/types@0.0.10': '@kevisual/types@0.0.10':
resolution: {integrity: sha512-Q73uzzjk9UidumnmCvOpgzqDDvQxsblz22bIFuoiioUFJWwaparx8bpd8ArRyFojicYL1YJoFDzDZ9j9NN8grA==} resolution: {integrity: sha512-Q73uzzjk9UidumnmCvOpgzqDDvQxsblz22bIFuoiioUFJWwaparx8bpd8ArRyFojicYL1YJoFDzDZ9j9NN8grA==}
@@ -360,67 +360,56 @@ packages:
resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.53.3': '@rollup/rollup-linux-arm-musleabihf@4.53.3':
resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.53.3': '@rollup/rollup-linux-arm64-gnu@4.53.3':
resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.53.3': '@rollup/rollup-linux-arm64-musl@4.53.3':
resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-loong64-gnu@4.53.3': '@rollup/rollup-linux-loong64-gnu@4.53.3':
resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-ppc64-gnu@4.53.3': '@rollup/rollup-linux-ppc64-gnu@4.53.3':
resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.53.3': '@rollup/rollup-linux-riscv64-gnu@4.53.3':
resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-musl@4.53.3': '@rollup/rollup-linux-riscv64-musl@4.53.3':
resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-linux-s390x-gnu@4.53.3': '@rollup/rollup-linux-s390x-gnu@4.53.3':
resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.53.3': '@rollup/rollup-linux-x64-gnu@4.53.3':
resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.53.3': '@rollup/rollup-linux-x64-musl@4.53.3':
resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl]
'@rollup/rollup-openharmony-arm64@4.53.3': '@rollup/rollup-openharmony-arm64@4.53.3':
resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==}
@@ -450,8 +439,8 @@ packages:
'@tootallnate/quickjs-emscripten@0.23.0': '@tootallnate/quickjs-emscripten@0.23.0':
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
'@types/bun@1.3.4': '@types/bun@1.3.5':
resolution: {integrity: sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA==} resolution: {integrity: sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w==}
'@types/crypto-js@4.2.2': '@types/crypto-js@4.2.2':
resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==}
@@ -462,8 +451,8 @@ packages:
'@types/formidable@3.4.6': '@types/formidable@3.4.6':
resolution: {integrity: sha512-LI4Hk+KNsM5q7br4oMVoaWeb+gUqJpz1N8+Y2Q6Cz9cVH33ybahRKUWaRmMboVlkwSbOUGgwc/pEkS7yMSzoWg==} resolution: {integrity: sha512-LI4Hk+KNsM5q7br4oMVoaWeb+gUqJpz1N8+Y2Q6Cz9cVH33ybahRKUWaRmMboVlkwSbOUGgwc/pEkS7yMSzoWg==}
'@types/node@24.10.1': '@types/node@25.0.5':
resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} resolution: {integrity: sha512-FuLxeLuSVOqHPxSN1fkcD8DLU21gAP7nCKqGRJ/FglbCUBs0NYN6TpHcdmyLeh8C0KwGIaZQJSv+OYG+KZz+Gw==}
agent-base@7.1.4: agent-base@7.1.4:
resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
@@ -529,8 +518,8 @@ packages:
buffer-from@1.1.2: buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
bun-types@1.3.4: bun-types@1.3.5:
resolution: {integrity: sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ==} resolution: {integrity: sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw==}
bytestreamjs@2.0.1: bytestreamjs@2.0.1:
resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==}
@@ -644,8 +633,8 @@ packages:
resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==}
engines: {node: '>=8.6'} engines: {node: '>=8.6'}
esbuild@0.25.8: esbuild@0.27.2:
resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==}
engines: {node: '>=18'} engines: {node: '>=18'}
hasBin: true hasBin: true
@@ -765,8 +754,8 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
http-errors@2.0.0: http-errors@2.0.1:
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
http-proxy-agent@7.0.2: http-proxy-agent@7.0.2:
@@ -846,9 +835,9 @@ packages:
resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
mime-types@3.0.1: mime-types@3.0.2:
resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
engines: {node: '>= 0.6'} engines: {node: '>=18'}
minimatch@10.1.1: minimatch@10.1.1:
resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==}
@@ -897,8 +886,8 @@ packages:
once@1.4.0: once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
openai@6.10.0: openai@6.16.0:
resolution: {integrity: sha512-ITxOGo7rO3XRMiKA5l7tQ43iNNu+iXGFAcf2t+aWVzzqRaS0i7m1K2BhxNdaveB+5eENhO0VY1FkiZzhBk4v3A==} resolution: {integrity: sha512-fZ1uBqjFUjXzbGc35fFtYKEOxd20kd9fDpFeqWtsOZWiubY8CZ1NAlXHW3iathaFvqmNtCWMIsosCuyeI7Joxg==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
ws: ^8.18.0 ws: ^8.18.0
@@ -1050,8 +1039,8 @@ packages:
sax@1.4.1: sax@1.4.1:
resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
selfsigned@5.2.0: selfsigned@5.4.0:
resolution: {integrity: sha512-QKF6fsJgdKn5Cy1SekTuwUQ6LOLUdnO4gVne1+TGSAyL/CD1aznNCmBna+bQB9xyon7DiYbDtTR1cLaxDXuaVA==} resolution: {integrity: sha512-Yn8qZOOJv+NhcGY19iC+ngW6hlUCNpvWEkrKllXNhmkLgR9fcErm8EqZ/wev7/tiwjKC9qj17Fa/PtBNzb6q8g==}
engines: {node: '>=15.6.0'} engines: {node: '>=15.6.0'}
semver@7.5.4: semver@7.5.4:
@@ -1064,8 +1053,8 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
send@1.2.0: send@1.2.1:
resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
setprototypeof@1.2.0: setprototypeof@1.2.0:
@@ -1114,10 +1103,6 @@ packages:
sprintf-js@1.1.3: sprintf-js@1.1.3:
resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
statuses@2.0.1:
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
engines: {node: '>= 0.8'}
statuses@2.0.2: statuses@2.0.2:
resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@@ -1173,8 +1158,8 @@ packages:
undici-types@7.16.0: undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
vite@7.2.6: vite@7.3.1:
resolution: {integrity: sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==} resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
engines: {node: ^20.19.0 || >=22.12.0} engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -1259,82 +1244,82 @@ snapshots:
'@epic-web/invariant@1.0.0': {} '@epic-web/invariant@1.0.0': {}
'@esbuild/aix-ppc64@0.25.8': '@esbuild/aix-ppc64@0.27.2':
optional: true optional: true
'@esbuild/android-arm64@0.25.8': '@esbuild/android-arm64@0.27.2':
optional: true optional: true
'@esbuild/android-arm@0.25.8': '@esbuild/android-arm@0.27.2':
optional: true optional: true
'@esbuild/android-x64@0.25.8': '@esbuild/android-x64@0.27.2':
optional: true optional: true
'@esbuild/darwin-arm64@0.25.8': '@esbuild/darwin-arm64@0.27.2':
optional: true optional: true
'@esbuild/darwin-x64@0.25.8': '@esbuild/darwin-x64@0.27.2':
optional: true optional: true
'@esbuild/freebsd-arm64@0.25.8': '@esbuild/freebsd-arm64@0.27.2':
optional: true optional: true
'@esbuild/freebsd-x64@0.25.8': '@esbuild/freebsd-x64@0.27.2':
optional: true optional: true
'@esbuild/linux-arm64@0.25.8': '@esbuild/linux-arm64@0.27.2':
optional: true optional: true
'@esbuild/linux-arm@0.25.8': '@esbuild/linux-arm@0.27.2':
optional: true optional: true
'@esbuild/linux-ia32@0.25.8': '@esbuild/linux-ia32@0.27.2':
optional: true optional: true
'@esbuild/linux-loong64@0.25.8': '@esbuild/linux-loong64@0.27.2':
optional: true optional: true
'@esbuild/linux-mips64el@0.25.8': '@esbuild/linux-mips64el@0.27.2':
optional: true optional: true
'@esbuild/linux-ppc64@0.25.8': '@esbuild/linux-ppc64@0.27.2':
optional: true optional: true
'@esbuild/linux-riscv64@0.25.8': '@esbuild/linux-riscv64@0.27.2':
optional: true optional: true
'@esbuild/linux-s390x@0.25.8': '@esbuild/linux-s390x@0.27.2':
optional: true optional: true
'@esbuild/linux-x64@0.25.8': '@esbuild/linux-x64@0.27.2':
optional: true optional: true
'@esbuild/netbsd-arm64@0.25.8': '@esbuild/netbsd-arm64@0.27.2':
optional: true optional: true
'@esbuild/netbsd-x64@0.25.8': '@esbuild/netbsd-x64@0.27.2':
optional: true optional: true
'@esbuild/openbsd-arm64@0.25.8': '@esbuild/openbsd-arm64@0.27.2':
optional: true optional: true
'@esbuild/openbsd-x64@0.25.8': '@esbuild/openbsd-x64@0.27.2':
optional: true optional: true
'@esbuild/openharmony-arm64@0.25.8': '@esbuild/openharmony-arm64@0.27.2':
optional: true optional: true
'@esbuild/sunos-x64@0.25.8': '@esbuild/sunos-x64@0.27.2':
optional: true optional: true
'@esbuild/win32-arm64@0.25.8': '@esbuild/win32-arm64@0.27.2':
optional: true optional: true
'@esbuild/win32-ia32@0.25.8': '@esbuild/win32-ia32@0.27.2':
optional: true optional: true
'@esbuild/win32-x64@0.25.8': '@esbuild/win32-x64@0.27.2':
optional: true optional: true
'@isaacs/balanced-match@4.0.1': {} '@isaacs/balanced-match@4.0.1': {}
@@ -1351,13 +1336,16 @@ snapshots:
'@kevisual/permission@0.0.3': {} '@kevisual/permission@0.0.3': {}
'@kevisual/query@0.0.31': {} '@kevisual/query@0.0.35':
'@kevisual/router@0.0.36':
dependencies: dependencies:
tslib: 2.8.1
'@kevisual/router@0.0.52':
dependencies:
eventemitter3: 5.0.1
path-to-regexp: 8.3.0 path-to-regexp: 8.3.0
selfsigned: 5.2.0 selfsigned: 5.4.0
send: 1.2.0 send: 1.2.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -1586,9 +1574,9 @@ snapshots:
'@tootallnate/quickjs-emscripten@0.23.0': {} '@tootallnate/quickjs-emscripten@0.23.0': {}
'@types/bun@1.3.4': '@types/bun@1.3.5':
dependencies: dependencies:
bun-types: 1.3.4 bun-types: 1.3.5
'@types/crypto-js@4.2.2': {} '@types/crypto-js@4.2.2': {}
@@ -1596,9 +1584,9 @@ snapshots:
'@types/formidable@3.4.6': '@types/formidable@3.4.6':
dependencies: dependencies:
'@types/node': 24.10.1 '@types/node': 25.0.5
'@types/node@24.10.1': '@types/node@25.0.5':
dependencies: dependencies:
undici-types: 7.16.0 undici-types: 7.16.0
@@ -1655,9 +1643,9 @@ snapshots:
buffer-from@1.1.2: {} buffer-from@1.1.2: {}
bun-types@1.3.4: bun-types@1.3.5:
dependencies: dependencies:
'@types/node': 24.10.1 '@types/node': 25.0.5
bytestreamjs@2.0.1: {} bytestreamjs@2.0.1: {}
@@ -1752,34 +1740,34 @@ snapshots:
dependencies: dependencies:
ansi-colors: 4.1.3 ansi-colors: 4.1.3
esbuild@0.25.8: esbuild@0.27.2:
optionalDependencies: optionalDependencies:
'@esbuild/aix-ppc64': 0.25.8 '@esbuild/aix-ppc64': 0.27.2
'@esbuild/android-arm': 0.25.8 '@esbuild/android-arm': 0.27.2
'@esbuild/android-arm64': 0.25.8 '@esbuild/android-arm64': 0.27.2
'@esbuild/android-x64': 0.25.8 '@esbuild/android-x64': 0.27.2
'@esbuild/darwin-arm64': 0.25.8 '@esbuild/darwin-arm64': 0.27.2
'@esbuild/darwin-x64': 0.25.8 '@esbuild/darwin-x64': 0.27.2
'@esbuild/freebsd-arm64': 0.25.8 '@esbuild/freebsd-arm64': 0.27.2
'@esbuild/freebsd-x64': 0.25.8 '@esbuild/freebsd-x64': 0.27.2
'@esbuild/linux-arm': 0.25.8 '@esbuild/linux-arm': 0.27.2
'@esbuild/linux-arm64': 0.25.8 '@esbuild/linux-arm64': 0.27.2
'@esbuild/linux-ia32': 0.25.8 '@esbuild/linux-ia32': 0.27.2
'@esbuild/linux-loong64': 0.25.8 '@esbuild/linux-loong64': 0.27.2
'@esbuild/linux-mips64el': 0.25.8 '@esbuild/linux-mips64el': 0.27.2
'@esbuild/linux-ppc64': 0.25.8 '@esbuild/linux-ppc64': 0.27.2
'@esbuild/linux-riscv64': 0.25.8 '@esbuild/linux-riscv64': 0.27.2
'@esbuild/linux-s390x': 0.25.8 '@esbuild/linux-s390x': 0.27.2
'@esbuild/linux-x64': 0.25.8 '@esbuild/linux-x64': 0.27.2
'@esbuild/netbsd-arm64': 0.25.8 '@esbuild/netbsd-arm64': 0.27.2
'@esbuild/netbsd-x64': 0.25.8 '@esbuild/netbsd-x64': 0.27.2
'@esbuild/openbsd-arm64': 0.25.8 '@esbuild/openbsd-arm64': 0.27.2
'@esbuild/openbsd-x64': 0.25.8 '@esbuild/openbsd-x64': 0.27.2
'@esbuild/openharmony-arm64': 0.25.8 '@esbuild/openharmony-arm64': 0.27.2
'@esbuild/sunos-x64': 0.25.8 '@esbuild/sunos-x64': 0.27.2
'@esbuild/win32-arm64': 0.25.8 '@esbuild/win32-arm64': 0.27.2
'@esbuild/win32-ia32': 0.25.8 '@esbuild/win32-ia32': 0.27.2
'@esbuild/win32-x64': 0.25.8 '@esbuild/win32-x64': 0.27.2
escape-html@1.0.3: {} escape-html@1.0.3: {}
@@ -1872,12 +1860,12 @@ snapshots:
dependencies: dependencies:
function-bind: 1.1.2 function-bind: 1.1.2
http-errors@2.0.0: http-errors@2.0.1:
dependencies: dependencies:
depd: 2.0.0 depd: 2.0.0
inherits: 2.0.4 inherits: 2.0.4
setprototypeof: 1.2.0 setprototypeof: 1.2.0
statuses: 2.0.1 statuses: 2.0.2
toidentifier: 1.0.1 toidentifier: 1.0.1
http-proxy-agent@7.0.2: http-proxy-agent@7.0.2:
@@ -1953,7 +1941,7 @@ snapshots:
mime-db@1.54.0: {} mime-db@1.54.0: {}
mime-types@3.0.1: mime-types@3.0.2:
dependencies: dependencies:
mime-db: 1.54.0 mime-db: 1.54.0
@@ -1993,7 +1981,7 @@ snapshots:
dependencies: dependencies:
wrappy: 1.0.2 wrappy: 1.0.2
openai@6.10.0(ws@8.18.3)(zod@3.25.76): openai@6.16.0(ws@8.18.3)(zod@3.25.76):
optionalDependencies: optionalDependencies:
ws: 8.18.3 ws: 8.18.3
zod: 3.25.76 zod: 3.25.76
@@ -2226,7 +2214,7 @@ snapshots:
sax@1.4.1: {} sax@1.4.1: {}
selfsigned@5.2.0: selfsigned@5.4.0:
dependencies: dependencies:
'@peculiar/x509': 1.14.2 '@peculiar/x509': 1.14.2
pkijs: 3.3.3 pkijs: 3.3.3
@@ -2237,15 +2225,15 @@ snapshots:
semver@7.7.2: {} semver@7.7.2: {}
send@1.2.0: send@1.2.1:
dependencies: dependencies:
debug: 4.4.3 debug: 4.4.3
encodeurl: 2.0.0 encodeurl: 2.0.0
escape-html: 1.0.3 escape-html: 1.0.3
etag: 1.8.1 etag: 1.8.1
fresh: 2.0.0 fresh: 2.0.0
http-errors: 2.0.0 http-errors: 2.0.1
mime-types: 3.0.1 mime-types: 3.0.2
ms: 2.1.3 ms: 2.1.3
on-finished: 2.4.1 on-finished: 2.4.1
range-parser: 1.2.1 range-parser: 1.2.1
@@ -2293,8 +2281,6 @@ snapshots:
sprintf-js@1.1.3: {} sprintf-js@1.1.3: {}
statuses@2.0.1: {}
statuses@2.0.2: {} statuses@2.0.2: {}
supports-color@7.2.0: supports-color@7.2.0:
@@ -2336,16 +2322,16 @@ snapshots:
undici-types@7.16.0: {} undici-types@7.16.0: {}
vite@7.2.6(@types/node@24.10.1): vite@7.3.1(@types/node@25.0.5):
dependencies: dependencies:
esbuild: 0.25.8 esbuild: 0.27.2
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3 picomatch: 4.0.3
postcss: 8.5.6 postcss: 8.5.6
rollup: 4.53.3 rollup: 4.53.3
tinyglobby: 0.2.15 tinyglobby: 0.2.15
optionalDependencies: optionalDependencies:
'@types/node': 24.10.1 '@types/node': 25.0.5
fsevents: 2.3.3 fsevents: 2.3.3
vizion@2.2.1: vizion@2.2.1:

2
pnpm-workspace.yaml Normal file
View File

@@ -0,0 +1,2 @@
onlyBuiltDependencies:
- esbuild

View File

@@ -1,51 +1,121 @@
import { adapter } from '@kevisual/query/query' import { Result } from '@kevisual/query'
export type CoreOpts = { export interface JimengOptions {
baseURL?: string; /** API密钥用于认证请求 */
token?: string; apiKey: string;
/** API基础URL */
baseUrl: string;
/** 请求超时时间(毫秒) */
timeout: number;
} }
export class Core {
baseURL: string = 'https://jimeng-api.kevisual.cn/v1'; export interface JimengGenerateOptions {
token?: string; /** 图片生成提示词 */
constructor(opts: CoreOpts = {}) { prompt: string;
console.log("Core initialized"); /** 使用的模型版本,默认 jimeng-4.0 */
if (opts.baseURL) { model?: string;
this.baseURL = opts.baseURL; /** 图片比例,默认 1:1 */
ratio?: string;
/** 图片分辨率,默认 2k */
resolution?: string;
}
interface JimengResponse {
/** 请求创建时间戳 */
created: number;
/** 生成的图片列表 */
data: Array<{
/** 图片URL */
url: string;
}>;
}
export class JimengService {
private apiKey: string;
private baseUrl: string;
private timeout: number;
constructor(options: JimengOptions) {
this.apiKey = options.apiKey;
this.baseUrl = options.baseUrl || 'https://jimeng-api.kevisual.cn/v1';
this.timeout = options.timeout;
} }
if (opts.token) {
this.token = opts.token; async generateImage(options: JimengGenerateOptions): Promise<Result<JimengResponse>> {
} const {
} prompt,
makeHeader() { model = 'jimeng-4.6',
return { ratio = '1:1',
Authorization: this.token ? `Bearer ${this.token}` : undefined, resolution = '2k'
'Content-Type': 'application/json' } = options;
}
} try {
generateImage({ model = 'jimeng-4.0', prompt, resolution = '2k' }: ImageOptions) { const controller = new AbortController();
const url = `${this.baseURL}/images/generations`; const timeoutId = setTimeout(() => controller.abort(), this.timeout);
return adapter({
url, const response = await fetch(`${this.baseUrl}/images/generations`, {
headers: this.makeHeader(), method: 'POST',
body: { headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.apiKey}`,
},
body: JSON.stringify({
model, model,
prompt, prompt,
resolution ratio,
} resolution,
}),
signal: controller.signal,
}); });
clearTimeout(timeoutId);
if (!response.ok) {
throw new Error(`jimeng API error: ${response.status} ${response.statusText}`);
}
const result = await response.json() as JimengResponse;
return { code: 200, data: result };
} catch (error: any) {
return { code: 500, message: error.message || 'Unknown error' };
}
}
async downloadImage(url: string): Promise<Uint8Array> {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
try {
const response = await fetch(url, {
signal: controller.signal,
});
clearTimeout(timeoutId);
if (!response.ok) {
throw new Error(`Failed to download image: ${response.statusText}`);
}
const arrayBuffer = await response.arrayBuffer();
return new Uint8Array(arrayBuffer);
} catch (error: any) {
clearTimeout(timeoutId);
if (error.name === 'AbortError') {
throw new Error('Image download timeout');
}
throw error;
}
}
/** 获取图片过期时间 */
async getExpiredTime(url: string): Promise<{ expiredAt: number, expired: boolean }> {
// https://p3-dreamina-sign.byteimg.com/tos-cn-i-tb4s082cfz/c018e06ee6654dd78ccacb29eff4744e~tplv-tb4s082cfz-aigc_resize:0:0.png?lk3s=43402efa&x-expires=1767852000&x-signature=34yf37N955BP37eLaYEzKeLQn0Q%3D&format=.png
const urlObj = new URL(url);
let expires = urlObj.searchParams.get('x-expires');
if (!expires) {
expires = '0';
}
const expiredAt = parseInt(expires) * 1000;
const expired = Date.now() > expiredAt;
return { expiredAt, expired };
} }
} }
export type ImageOptions = {
model?: string;
prompt: string;
/**
* 宽高比,如 "16:9", "4:3", "1:1" 等
*/
ratio?: string;
/**
*
* 图片分辨率,如 "1024x768", "512x512" 等
* 4k 2k
*/
resolution?: string;
}

View File

@@ -0,0 +1,10 @@
import { BaseChat, type BaseChatOptions } from "../chat.ts";
type MimoOptions = Partial<BaseChatOptions>;
export class MimoChat extends BaseChat {
static BASE_URL = 'https://api.xiaomimimo.com/v1';
constructor(options: MimoOptions) {
const baseURL = options.baseURL || MimoChat.BASE_URL;
super({ ...(options as BaseChatOptions), baseURL: baseURL });
}
}

View File

@@ -25,11 +25,6 @@ export class Ollama extends BaseChat {
const baseURL = options.baseURL || Ollama.BASE_URL; const baseURL = options.baseURL || Ollama.BASE_URL;
super({ ...(options as BaseChatOptions), baseURL: baseURL }); super({ ...(options as BaseChatOptions), baseURL: baseURL });
} }
async chat(messages: ChatMessage[], options?: ChatMessageOptions) {
const res = await super.chat(messages, options);
console.log('thunk', this.getChatUsage());
return res;
}
/** /**
* 获取模型列表 * 获取模型列表
* @returns * @returns

View File

@@ -32,8 +32,4 @@ export class SiliconFlow extends BaseChat {
async getUsageInfo(): Promise<SiliconFlowUsageResponse> { async getUsageInfo(): Promise<SiliconFlowUsageResponse> {
return this.get('/user/info'); return this.get('/user/info');
} }
async chat(messages: ChatMessage[], options?: ChatMessageOptions) {
const res = await super.chat(messages, options);
return res;
}
} }

View File

@@ -88,11 +88,17 @@ export class BaseChat implements BaseChatInterface, Usage {
/** /**
* 聊天 * 聊天
*/ */
async chat(messages: ChatMessage[], options?: ChatMessageOptions): Promise<ChatMessageComplete> { chat(options: ChatMessageOptions): Promise<ChatMessageComplete>;
chat(messages: ChatMessage[], options?: ChatMessageOptions): Promise<ChatMessageComplete>;
async chat(messagesOrOptions: ChatMessage[] | ChatMessageOptions, options?: ChatMessageOptions): Promise<ChatMessageComplete> {
const isFirstParamOptions = !Array.isArray(messagesOrOptions);
const messages: ChatMessage[] = isFirstParamOptions ? messagesOrOptions.messages! : messagesOrOptions;
const opts: ChatMessageOptions = isFirstParamOptions ? messagesOrOptions : options || {};
const requestBody = { const requestBody = {
model: this.model, model: this.model,
messages, messages,
...options, ...opts,
stream: false, stream: false,
}; };
@@ -110,15 +116,21 @@ export class BaseChat implements BaseChatInterface, Usage {
this.responseText = res.choices[0]?.message?.content || ''; this.responseText = res.choices[0]?.message?.content || '';
return res; return res;
} }
async chatStream(messages: ChatMessage[], options?: ChatMessageOptions) { chatStream(options: ChatMessageOptions): AsyncGenerator<ChatMessageComplete>;
if (options?.response_format) { chatStream(messages: ChatMessage[], options?: ChatMessageOptions): AsyncGenerator<ChatMessageComplete>;
async *chatStream(messagesOrOptions: ChatMessage[] | ChatMessageOptions, options?: ChatMessageOptions) {
const isFirstParamOptions = !Array.isArray(messagesOrOptions);
const messages: ChatMessage[] = isFirstParamOptions ? messagesOrOptions.messages! : messagesOrOptions;
const opts: ChatMessageOptions = isFirstParamOptions ? messagesOrOptions : options || {};
if (opts.response_format) {
throw new Error('response_format is not supported in stream mode'); throw new Error('response_format is not supported in stream mode');
} }
const requestBody = { const requestBody = {
model: this.model, model: this.model,
messages, messages,
...options, ...opts,
stream: true, stream: true,
}; };

View File

@@ -2,8 +2,8 @@ export type ChatMessage = {
role?: 'user' | 'assistant' | 'system' | 'tool'; role?: 'user' | 'assistant' | 'system' | 'tool';
content: string; content: string;
} }
export type ChatMessageOptions = { export type ChatMessageOptions<T = {}> = {
messages: ChatMessage[]; messages?: ChatMessage[];
/** /**
* 模型名称 * 模型名称
*/ */
@@ -43,7 +43,7 @@ export type ChatMessageOptions = {
stream?: boolean; stream?: boolean;
/** /**
* 是否能够思考 * 是否能够思考
* 如果会话是千文,服务器的接口,默认为 true * 如果会话是千文,服务器的接口,默认为 false
*/ */
enable_thinking?: boolean; enable_thinking?: boolean;
response_format?: 'text' | 'json' | 'xml' | 'html'; response_format?: 'text' | 'json' | 'xml' | 'html';
@@ -53,7 +53,9 @@ export type ChatMessageOptions = {
*/ */
tool_calls?: any; tool_calls?: any;
}; [key: string]: any;
} & T;
type Choice = { type Choice = {
finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'function_call'; finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'function_call';
@@ -167,6 +169,7 @@ export type EmbeddingMessageComplete = {
export interface BaseChatInterface { export interface BaseChatInterface {
chat(options: ChatMessageOptions): Promise<ChatMessageComplete>;
chat(messages: ChatMessage[], options?: ChatMessageOptions): Promise<ChatMessageComplete>; chat(messages: ChatMessage[], options?: ChatMessageOptions): Promise<ChatMessageComplete>;
} }