diff --git a/assistant/kevisual.json b/assistant/kevisual.json new file mode 100644 index 0000000..b51a7fc --- /dev/null +++ b/assistant/kevisual.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://kevisual.xiongxiao.me/root/ai/kevisual/tools/kevisual-sync/schema.json?v=2", + "metadata": { + "share": "public" + }, + "checkDir": { + "src/query/query-login": { + "url": "https://kevisual.xiongxiao.me/root/ai/code/registry/query/query-login", + "enabled": true + }, + "src/query/query-ai": { + "url": "https://kevisual.xiongxiao.me/root/ai/code/registry/query/query-ai", + "enabled": true + } + }, + "syncDirectory": [ + { + "files": [ + "src/query/query-login/**/*", + "src/query/query-ai/**/*" + ], + "ignore": [], + "registry": "https://kevisual.xiongxiao.me/root/ai/code/registry", + "replace": { + "src/": "" + } + } + ], + "sync": { + "src/query/index.ts": "https://kevisual.xiongxiao.me/root/ai/code/registry/query/index.ts" + } +} \ No newline at end of file diff --git a/assistant/package.json b/assistant/package.json index 0163388..fb2000a 100644 --- a/assistant/package.json +++ b/assistant/package.json @@ -41,11 +41,11 @@ } }, "devDependencies": { - "@kevisual/ai-center": "^0.0.4", + "@kevisual/ai": "^0.0.5", "@kevisual/load": "^0.0.6", "@kevisual/local-app-manager": "^0.1.20", "@kevisual/logger": "^0.0.4", - "@kevisual/query": "0.0.18", + "@kevisual/query": "0.0.20", "@kevisual/query-login": "0.0.6", "@kevisual/router": "^0.0.21", "@kevisual/task-command": "^0.0.7", @@ -62,7 +62,7 @@ "dayjs": "^1.11.13", "dotenv": "^16.5.0", "get-port": "^7.1.0", - "inquirer": "^12.6.1", + "inquirer": "^12.6.3", "lodash-es": "^4.17.21", "nanoid": "^5.1.5", "send": "^1.2.0", @@ -77,6 +77,7 @@ }, "dependencies": { "eventemitter3": "^5.0.1", + "lowdb": "^7.0.1", "pm2": "^6.0.6" } } \ No newline at end of file diff --git a/assistant/pnpm-lock.yaml b/assistant/pnpm-lock.yaml index 990292a..9e04a86 100644 --- a/assistant/pnpm-lock.yaml +++ b/assistant/pnpm-lock.yaml @@ -11,13 +11,16 @@ importers: eventemitter3: specifier: ^5.0.1 version: 5.0.1 + lowdb: + specifier: ^7.0.1 + version: 7.0.1 pm2: specifier: ^6.0.6 version: 6.0.6(supports-color@10.0.0) devDependencies: - '@kevisual/ai-center': - specifier: ^0.0.4 - version: 0.0.4 + '@kevisual/ai': + specifier: ^0.0.5 + version: 0.0.5 '@kevisual/load': specifier: ^0.0.6 version: 0.0.6 @@ -28,11 +31,11 @@ importers: specifier: ^0.0.4 version: 0.0.4 '@kevisual/query': - specifier: 0.0.18 - version: 0.0.18(@kevisual/ws@8.0.0) + specifier: 0.0.20 + version: 0.0.20(@kevisual/ws@8.0.0) '@kevisual/query-login': specifier: 0.0.6 - version: 0.0.6(@kevisual/query@0.0.18(@kevisual/ws@8.0.0))(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3) + version: 0.0.6(@kevisual/query@0.0.20(@kevisual/ws@8.0.0))(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3) '@kevisual/router': specifier: ^0.0.21 version: 0.0.21 @@ -79,8 +82,8 @@ importers: specifier: ^7.1.0 version: 7.1.0 inquirer: - specifier: ^12.6.1 - version: 12.6.1(@types/node@22.15.21) + specifier: ^12.6.3 + version: 12.6.3(@types/node@22.15.21) lodash-es: specifier: ^4.17.21 version: 4.17.21 @@ -126,7 +129,7 @@ importers: version: 16.5.0 inquirer: specifier: ^12.6.0 - version: 12.6.1(@types/node@22.15.21) + version: 12.6.3(@types/node@22.15.21) lodash-es: specifier: ^4.17.21 version: 4.17.21 @@ -144,8 +147,8 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@inquirer/checkbox@4.1.6': - resolution: {integrity: sha512-62u896rWCtKKE43soodq5e/QcRsA22I+7/4Ov7LESWnKRO6BVo2A1DFLDmXL9e28TB0CfHc3YtkbPm7iwajqkg==} + '@inquirer/checkbox@4.1.8': + resolution: {integrity: sha512-d/QAsnwuHX2OPolxvYcgSj7A9DO9H6gVOy2DvBTx+P2LH2iRTo/RSGV3iwCzW024nP9hw98KIuDmdyhZQj1UQg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -153,8 +156,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.10': - resolution: {integrity: sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==} + '@inquirer/confirm@5.1.12': + resolution: {integrity: sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -162,8 +165,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.11': - resolution: {integrity: sha512-BXwI/MCqdtAhzNQlBEFE7CEflhPkl/BqvAuV/aK6lW3DClIfYVDWPP/kXuXHtBWC7/EEbNqd/1BGq2BGBBnuxw==} + '@inquirer/core@10.1.13': + resolution: {integrity: sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -171,8 +174,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.11': - resolution: {integrity: sha512-YoZr0lBnnLFPpfPSNsQ8IZyKxU47zPyVi9NLjCWtna52//M/xuL0PGPAxHxxYhdOhnvY2oBafoM+BI5w/JK7jw==} + '@inquirer/editor@4.2.13': + resolution: {integrity: sha512-WbicD9SUQt/K8O5Vyk9iC2ojq5RHoCLK6itpp2fHsWe44VxxcA9z3GTWlvjSTGmMQpZr+lbVmrxdHcumJoLbMA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -180,8 +183,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.13': - resolution: {integrity: sha512-HgYNWuZLHX6q5y4hqKhwyytqAghmx35xikOGY3TcgNiElqXGPas24+UzNPOwGUZa5Dn32y25xJqVeUcGlTv+QQ==} + '@inquirer/expand@4.0.15': + resolution: {integrity: sha512-4Y+pbr/U9Qcvf+N/goHzPEXiHH8680lM3Dr3Y9h9FFw4gHS+zVpbj8LfbKWIb/jayIB4aSO4pWiBTrBYWkvi5A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -189,12 +192,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.11': - resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==} + '@inquirer/figures@1.0.12': + resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} engines: {node: '>=18'} - '@inquirer/input@4.1.10': - resolution: {integrity: sha512-kV3BVne3wJ+j6reYQUZi/UN9NZGZLxgc/tfyjeK3mrx1QI7RXPxGp21IUTv+iVHcbP4ytZALF8vCHoxyNSC6qg==} + '@inquirer/input@4.1.12': + resolution: {integrity: sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -202,8 +205,8 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.13': - resolution: {integrity: sha512-IrLezcg/GWKS8zpKDvnJ/YTflNJdG0qSFlUM/zNFsdi4UKW/CO+gaJpbMgQ20Q58vNKDJbEzC6IebdkprwL6ew==} + '@inquirer/number@3.0.15': + resolution: {integrity: sha512-xWg+iYfqdhRiM55MvqiTCleHzszpoigUpN5+t1OMcRkJrUrw7va3AzXaxvS+Ak7Gny0j2mFSTv2JJj8sMtbV2g==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -211,8 +214,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.13': - resolution: {integrity: sha512-NN0S/SmdhakqOTJhDwOpeBEEr8VdcYsjmZHDb0rblSh2FcbXQOr+2IApP7JG4WE3sxIdKytDn4ed3XYwtHxmJQ==} + '@inquirer/password@4.0.15': + resolution: {integrity: sha512-75CT2p43DGEnfGTaqFpbDC2p2EEMrq0S+IRrf9iJvYreMy5mAWj087+mdKyLHapUEPLjN10mNvABpGbk8Wdraw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -220,8 +223,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.5.1': - resolution: {integrity: sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg==} + '@inquirer/prompts@7.5.3': + resolution: {integrity: sha512-8YL0WiV7J86hVAxrh3fE5mDCzcTDe1670unmJRz6ArDgN+DBK1a0+rbnNWp4DUB5rPMwqD5ZP6YHl9KK1mbZRg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -229,8 +232,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.1.1': - resolution: {integrity: sha512-VBUC0jPN2oaOq8+krwpo/mf3n/UryDUkKog3zi+oIi8/e5hykvdntgHUB9nhDM78RubiyR1ldIOfm5ue+2DeaQ==} + '@inquirer/rawlist@4.1.3': + resolution: {integrity: sha512-7XrV//6kwYumNDSsvJIPeAqa8+p7GJh7H5kRuxirct2cgOcSWwwNGoXDRgpNFbY/MG2vQ4ccIWCi8+IXXyFMZA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -238,8 +241,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.0.13': - resolution: {integrity: sha512-9g89d2c5Izok/Gw/U7KPC3f9kfe5rA1AJ24xxNZG0st+vWekSk7tB9oE+dJv5JXd0ZSijomvW0KPMoBd8qbN4g==} + '@inquirer/search@3.0.15': + resolution: {integrity: sha512-YBMwPxYBrADqyvP4nNItpwkBnGGglAvCLVW8u4pRmmvOsHUtCAUIMbUrLX5B3tFL1/WsLGdQ2HNzkqswMs5Uaw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -247,8 +250,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.2.1': - resolution: {integrity: sha512-gt1Kd5XZm+/ddemcT3m23IP8aD8rC9drRckWoP/1f7OL46Yy2FGi8DSmNjEjQKtPl6SV96Kmjbl6p713KXJ/Jg==} + '@inquirer/select@4.2.3': + resolution: {integrity: sha512-OAGhXU0Cvh0PhLz9xTF/kx6g6x+sP+PcyTiLvCrewI99P3BBeexD+VbuwkNDvqGkk3y2h5ZiWLeRP7BFlhkUDg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -256,8 +259,8 @@ packages: '@types/node': optional: true - '@inquirer/type@3.0.6': - resolution: {integrity: sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==} + '@inquirer/type@3.0.7': + resolution: {integrity: sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -268,8 +271,8 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@kevisual/ai-center@0.0.4': - resolution: {integrity: sha512-pZw8sH7G0JjknHBHERV71INvmgyDS2JWyI2kb1a9FFHfRKg4TCv+RJIE505vKoAPjUd6+h6FHVHXvPXBdeTdxg==} + '@kevisual/ai@0.0.5': + resolution: {integrity: sha512-yEwwFIWJz2Enj1Uo3wDH9Aa0lf42ACAZdMFCXkqI44NyA/5C59tm1Ro4Bm46Z2bgT5IMtkIDfTxJHMvVtosJ7w==} '@kevisual/cache@0.0.2': resolution: {integrity: sha512-2Cl5KF2Gi27uLfhO6CdTMFnRzx9vYnqevAo7d9ab3rOaqTgF8tLeAXglXyRbaWW3WUbHU2XaOb4r98uUsqIQQw==} @@ -280,9 +283,6 @@ packages: '@kevisual/local-app-manager@0.1.20': resolution: {integrity: sha512-PQf1wL9vQazTYvxhTqnhno3ZYccFGmgjkPEqKUY9IUpc2vP7srX73TGn/3e7S5dysO1urzgif4dciGe0yPbxAg==} - '@kevisual/logger@0.0.3': - resolution: {integrity: sha512-8emqxg+ab62WAK6VY4FQqetXPSSVKFAjGctD1NDbdnxt7YWuI/PyuDltCpsVz+uvWpV1dO5OKZOoHU7ow59Omw==} - '@kevisual/logger@0.0.4': resolution: {integrity: sha512-+fpr92eokSxoGOW1SIRl/27lPuO+zyY+feR5o2Q4YCNlAdt2x64NwC/w8r/3NEC5QenLgd4K0azyKTI2mHbARw==} @@ -291,8 +291,8 @@ packages: peerDependencies: '@kevisual/query': ^0.0.17 - '@kevisual/query@0.0.18': - resolution: {integrity: sha512-I2vHTu0I6AyD9PJyr+vxyp9jIJ6rd2EZqLVHTv/+zrVKVc2SS76Tg7aGNkmAFqqLSCB8kLLsmMGtSJU1Qb8VVg==} + '@kevisual/query@0.0.20': + resolution: {integrity: sha512-IpkQd1Pz50namxDNytLJpyR2CRLJWKTkmk68Fiw6CEkTXQDkdyBh2kIOIf7+Geu8quai/J9io3KjWzt17AeYdg==} '@kevisual/router@0.0.21': resolution: {integrity: sha512-XKTxbNO924cT18UOAGplWErZ+hMze8Y53F2jYCk18v4jsdsvjRho5uXXjJb6HSVsuITMtQR4R3rG0IcM3jkDKQ==} @@ -930,8 +930,8 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - inquirer@12.6.1: - resolution: {integrity: sha512-MGFnzHVS3l3oM3cy+LWkyR7UUtVEn3D5U41CZbEY34szToWoJAvaVtCTz1mxsEzZFk/HXWyCArn0HDgloTXMDw==} + inquirer@12.6.3: + resolution: {integrity: sha512-eX9beYAjr1MqYsIjx1vAheXsRk1jbZRvHLcBu5nA9wX0rXR1IfCZLnVLp4Ym4mrhqmh7AuANwcdtgQ291fZDfQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -998,6 +998,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lowdb@7.0.1: + resolution: {integrity: sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==} + engines: {node: '>=18'} + lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -1064,6 +1068,7 @@ packages: node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -1296,6 +1301,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + steno@4.0.2: + resolution: {integrity: sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==} + engines: {node: '>=18'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1419,27 +1428,27 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': optional: true - '@inquirer/checkbox@4.1.6(@types/node@22.15.21)': + '@inquirer/checkbox@4.1.8(@types/node@22.15.21)': dependencies: - '@inquirer/core': 10.1.11(@types/node@22.15.21) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/core': 10.1.13(@types/node@22.15.21) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.21) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: '@types/node': 22.15.21 - '@inquirer/confirm@5.1.10(@types/node@22.15.21)': + '@inquirer/confirm@5.1.12(@types/node@22.15.21)': dependencies: - '@inquirer/core': 10.1.11(@types/node@22.15.21) - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/core': 10.1.13(@types/node@22.15.21) + '@inquirer/type': 3.0.7(@types/node@22.15.21) optionalDependencies: '@types/node': 22.15.21 - '@inquirer/core@10.1.11(@types/node@22.15.21)': + '@inquirer/core@10.1.13(@types/node@22.15.21)': dependencies: - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.21) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -1449,97 +1458,97 @@ snapshots: optionalDependencies: '@types/node': 22.15.21 - '@inquirer/editor@4.2.11(@types/node@22.15.21)': + '@inquirer/editor@4.2.13(@types/node@22.15.21)': dependencies: - '@inquirer/core': 10.1.11(@types/node@22.15.21) - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/core': 10.1.13(@types/node@22.15.21) + '@inquirer/type': 3.0.7(@types/node@22.15.21) external-editor: 3.1.0 optionalDependencies: '@types/node': 22.15.21 - '@inquirer/expand@4.0.13(@types/node@22.15.21)': + '@inquirer/expand@4.0.15(@types/node@22.15.21)': dependencies: - '@inquirer/core': 10.1.11(@types/node@22.15.21) - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/core': 10.1.13(@types/node@22.15.21) + '@inquirer/type': 3.0.7(@types/node@22.15.21) yoctocolors-cjs: 2.1.2 optionalDependencies: '@types/node': 22.15.21 - '@inquirer/figures@1.0.11': {} + '@inquirer/figures@1.0.12': {} - '@inquirer/input@4.1.10(@types/node@22.15.21)': + '@inquirer/input@4.1.12(@types/node@22.15.21)': dependencies: - '@inquirer/core': 10.1.11(@types/node@22.15.21) - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/core': 10.1.13(@types/node@22.15.21) + '@inquirer/type': 3.0.7(@types/node@22.15.21) optionalDependencies: '@types/node': 22.15.21 - '@inquirer/number@3.0.13(@types/node@22.15.21)': + '@inquirer/number@3.0.15(@types/node@22.15.21)': dependencies: - '@inquirer/core': 10.1.11(@types/node@22.15.21) - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/core': 10.1.13(@types/node@22.15.21) + '@inquirer/type': 3.0.7(@types/node@22.15.21) optionalDependencies: '@types/node': 22.15.21 - '@inquirer/password@4.0.13(@types/node@22.15.21)': + '@inquirer/password@4.0.15(@types/node@22.15.21)': dependencies: - '@inquirer/core': 10.1.11(@types/node@22.15.21) - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/core': 10.1.13(@types/node@22.15.21) + '@inquirer/type': 3.0.7(@types/node@22.15.21) ansi-escapes: 4.3.2 optionalDependencies: '@types/node': 22.15.21 - '@inquirer/prompts@7.5.1(@types/node@22.15.21)': + '@inquirer/prompts@7.5.3(@types/node@22.15.21)': dependencies: - '@inquirer/checkbox': 4.1.6(@types/node@22.15.21) - '@inquirer/confirm': 5.1.10(@types/node@22.15.21) - '@inquirer/editor': 4.2.11(@types/node@22.15.21) - '@inquirer/expand': 4.0.13(@types/node@22.15.21) - '@inquirer/input': 4.1.10(@types/node@22.15.21) - '@inquirer/number': 3.0.13(@types/node@22.15.21) - '@inquirer/password': 4.0.13(@types/node@22.15.21) - '@inquirer/rawlist': 4.1.1(@types/node@22.15.21) - '@inquirer/search': 3.0.13(@types/node@22.15.21) - '@inquirer/select': 4.2.1(@types/node@22.15.21) + '@inquirer/checkbox': 4.1.8(@types/node@22.15.21) + '@inquirer/confirm': 5.1.12(@types/node@22.15.21) + '@inquirer/editor': 4.2.13(@types/node@22.15.21) + '@inquirer/expand': 4.0.15(@types/node@22.15.21) + '@inquirer/input': 4.1.12(@types/node@22.15.21) + '@inquirer/number': 3.0.15(@types/node@22.15.21) + '@inquirer/password': 4.0.15(@types/node@22.15.21) + '@inquirer/rawlist': 4.1.3(@types/node@22.15.21) + '@inquirer/search': 3.0.15(@types/node@22.15.21) + '@inquirer/select': 4.2.3(@types/node@22.15.21) optionalDependencies: '@types/node': 22.15.21 - '@inquirer/rawlist@4.1.1(@types/node@22.15.21)': + '@inquirer/rawlist@4.1.3(@types/node@22.15.21)': dependencies: - '@inquirer/core': 10.1.11(@types/node@22.15.21) - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/core': 10.1.13(@types/node@22.15.21) + '@inquirer/type': 3.0.7(@types/node@22.15.21) yoctocolors-cjs: 2.1.2 optionalDependencies: '@types/node': 22.15.21 - '@inquirer/search@3.0.13(@types/node@22.15.21)': + '@inquirer/search@3.0.15(@types/node@22.15.21)': dependencies: - '@inquirer/core': 10.1.11(@types/node@22.15.21) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/core': 10.1.13(@types/node@22.15.21) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.21) yoctocolors-cjs: 2.1.2 optionalDependencies: '@types/node': 22.15.21 - '@inquirer/select@4.2.1(@types/node@22.15.21)': + '@inquirer/select@4.2.3(@types/node@22.15.21)': dependencies: - '@inquirer/core': 10.1.11(@types/node@22.15.21) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/core': 10.1.13(@types/node@22.15.21) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@22.15.21) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: '@types/node': 22.15.21 - '@inquirer/type@3.0.6(@types/node@22.15.21)': + '@inquirer/type@3.0.7(@types/node@22.15.21)': optionalDependencies: '@types/node': 22.15.21 '@jridgewell/sourcemap-codec@1.5.0': {} - '@kevisual/ai-center@0.0.4': + '@kevisual/ai@0.0.5': dependencies: - '@kevisual/logger': 0.0.3 + '@kevisual/logger': 0.0.4 '@kevisual/cache@0.0.2(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3)': dependencies: @@ -1565,21 +1574,19 @@ snapshots: - supports-color - utf-8-validate - '@kevisual/logger@0.0.3': {} - '@kevisual/logger@0.0.4': {} - '@kevisual/query-login@0.0.6(@kevisual/query@0.0.18(@kevisual/ws@8.0.0))(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3)': + '@kevisual/query-login@0.0.6(@kevisual/query@0.0.20(@kevisual/ws@8.0.0))(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3)': dependencies: '@kevisual/cache': 0.0.2(rollup@4.40.0)(tslib@2.8.1)(typescript@5.8.3) - '@kevisual/query': 0.0.18(@kevisual/ws@8.0.0) + '@kevisual/query': 0.0.20(@kevisual/ws@8.0.0) dotenv: 16.5.0 transitivePeerDependencies: - rollup - tslib - typescript - '@kevisual/query@0.0.18(@kevisual/ws@8.0.0)': + '@kevisual/query@0.0.20(@kevisual/ws@8.0.0)': dependencies: openai: 4.99.0(@kevisual/ws@8.0.0) transitivePeerDependencies: @@ -2165,11 +2172,11 @@ snapshots: ini@1.3.8: {} - inquirer@12.6.1(@types/node@22.15.21): + inquirer@12.6.3(@types/node@22.15.21): dependencies: - '@inquirer/core': 10.1.11(@types/node@22.15.21) - '@inquirer/prompts': 7.5.1(@types/node@22.15.21) - '@inquirer/type': 3.0.6(@types/node@22.15.21) + '@inquirer/core': 10.1.13(@types/node@22.15.21) + '@inquirer/prompts': 7.5.3(@types/node@22.15.21) + '@inquirer/type': 3.0.7(@types/node@22.15.21) ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 3.0.0 @@ -2231,6 +2238,10 @@ snapshots: lodash@4.17.21: {} + lowdb@7.0.1: + dependencies: + steno: 4.0.2 + lru-cache@6.0.0: dependencies: yallist: 4.0.0 @@ -2582,6 +2593,8 @@ snapshots: statuses@2.0.1: {} + steno@4.0.2: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 diff --git a/assistant/src/app.ts b/assistant/src/app.ts index ecae7dc..9c01c27 100644 --- a/assistant/src/app.ts +++ b/assistant/src/app.ts @@ -3,6 +3,7 @@ import { HttpsPem } from '@/module/assistant/https/sign.ts'; // import { AssistantConfig } from '@/module/assistant/index.ts'; import { AssistantInit, parseHomeArg } from '@/services/init/index.ts'; import { configDir as HomeConfigDir } from '@/module/assistant/config/index.ts'; +import { useContextKey } from '@kevisual/use-config/context'; const manualParse = parseHomeArg(HomeConfigDir); const _configDir = manualParse.configDir; @@ -13,12 +14,13 @@ export const assistantConfig = new AssistantInit({ }); const httpsPem = new HttpsPem(assistantConfig); -export const app = new App({ - serverOptions: { - path: '/client/router', - httpType: 'https', - httpsCert: httpsPem.cert, - httpsKey: httpsPem.key, - }, +export const app = useContextKey('app', () => { + return new App({ + serverOptions: { + path: '/client/router', + httpType: 'https', + httpsCert: httpsPem.cert, + httpsKey: httpsPem.key, + }, + }); }); - diff --git a/assistant/src/module/assistant/file/index.ts b/assistant/src/module/assistant/file/index.ts index a9e6fcf..922d74f 100644 --- a/assistant/src/module/assistant/file/index.ts +++ b/assistant/src/module/assistant/file/index.ts @@ -1,4 +1,5 @@ import fs from 'node:fs'; +import path from 'node:path'; /** * 检查文件是否存在 @@ -18,6 +19,22 @@ export const checkFileExists = (filePath: string, checkIsFile = false) => { } }; +/** + * 检查文件目录是否存在,如果不存在则创建 + * @param filePath 文件路径 + * @param create + * @returns + */ +export const checkFileDir = (filePath: string, create = true) => { + const dirPath = path.dirname(filePath); + + const exist = checkFileExists(dirPath); + if (create && !exist) { + fs.mkdirSync(dirPath, { recursive: true }); + } + return exist; +}; + export const createDir = (dirPath: string) => { if (!checkFileExists(dirPath)) { fs.mkdirSync(dirPath, { recursive: true }); diff --git a/assistant/src/module/assistant/storage/index.ts b/assistant/src/module/assistant/storage/index.ts new file mode 100644 index 0000000..e8256f5 --- /dev/null +++ b/assistant/src/module/assistant/storage/index.ts @@ -0,0 +1,47 @@ +import path from 'node:path'; +import fs from 'node:fs'; +import { checkFileDir, checkFileExists } from '../file/index.js'; +type SimpleObject = { + [key: string]: any; +}; +type StorageOptions = { + dir?: string; +}; +export class StorageCore { + storagePath: string; + constructor(opts?: StorageOptions) { + this.storagePath = opts?.dir || process.cwd(); + } + async getData(key: string = 'data.json', fileDirectory?: string): Promise { + const storageFilePath = path.join(this.storagePath, fileDirectory, key); + if (!checkFileExists(storageFilePath)) { + return null; + } + try { + const data = fs.readFileSync(storageFilePath, 'utf-8'); + return JSON.parse(data) as T; + } catch (error) { + console.error(`Error reading data from ${storageFilePath}:`, error); + return null; + } + } + async setData(data: T, key: string = 'data.json', fileDirectory?: string): Promise { + const storageFilePath = path.join(this.storagePath, fileDirectory, key); + try { + checkFileDir(storageFilePath, true); + fs.writeFileSync(storageFilePath, JSON.stringify(data, null, 2), 'utf-8'); + } catch (error) { + console.error(`Error writing data to ${storageFilePath}:`, error); + } + } + async deleteData(key: string = 'data.json', fileDirectory?: string): Promise { + const storageFilePath = path.join(this.storagePath, fileDirectory, key); + try { + if (checkFileExists(storageFilePath)) { + fs.unlinkSync(storageFilePath); + } + } catch (error) { + console.error(`Error deleting data from ${storageFilePath}:`, error); + } + } +} diff --git a/assistant/src/query/index.ts b/assistant/src/query/index.ts new file mode 100644 index 0000000..cff06fa --- /dev/null +++ b/assistant/src/query/index.ts @@ -0,0 +1,7 @@ +import { Query } from '@kevisual/query'; + +export const query = new Query(); + +export const clientQuery = new Query({ url: '/client/router' }); + +export { QueryUtil } from '@kevisual/router/define'; diff --git a/assistant/src/query/query-ai/defines/ai.ts b/assistant/src/query/query-ai/defines/ai.ts new file mode 100644 index 0000000..d8ca83b --- /dev/null +++ b/assistant/src/query/query-ai/defines/ai.ts @@ -0,0 +1,42 @@ +import { QueryUtil } from '@/query/index.ts'; + +type Message = { + role?: 'user' | 'assistant' | 'system' | 'tool'; + content?: string; + name?: string; +}; +export type PostChat = { + messages?: Message[]; + model?: string; + group?: string; + user?: string; +}; + +export type ChatDataOpts = { + id?: string; + title?: string; + messages?: any[]; + data?: any; + type?: 'temp' | 'keep' | string; +}; +export type ChatOpts = { + username: string; + model: string; + /** + * 获取完整消息回复 + */ + getFull?: boolean; + group: string; + /** + * openai的参数 + */ + options?: any; +}; + +export const appDefine = QueryUtil.create({ + chat: { + path: 'ai', + key: 'chat', + description: '与 AI 进行对话, 调用 GPT 的AI 服务,生成结果,并返回。', + }, +}); diff --git a/assistant/src/query/query-ai/query-ai.ts b/assistant/src/query/query-ai/query-ai.ts new file mode 100644 index 0000000..2ede31c --- /dev/null +++ b/assistant/src/query/query-ai/query-ai.ts @@ -0,0 +1,101 @@ +import { appDefine } from './defines/ai.ts'; +import { PostChat, ChatOpts, ChatDataOpts } from './defines/ai.ts'; + +import { BaseQuery, DataOpts, Query } from '@kevisual/query/query'; + +export { appDefine }; + +export class QueryApp extends BaseQuery { + constructor(opts?: { query: T }) { + super({ + ...opts, + query: opts?.query!, + queryDefine: appDefine, + }); + } + /** + * 与 AI 进行对话, 调用 GPT 的AI 服务,生成结果,并返回。 + * @param data + * @param opts + * @returns + */ + postChat(data: PostChat, opts?: DataOpts) { + return this.chain('chat').post(data, opts); + } + /** + * 获取模型列表 + * @param opts + * @returns + */ + getModelList(data?: { usernames?: string[] }, opts?: DataOpts) { + return this.query.post( + { + path: 'ai', + key: 'get-model-list', + data, + }, + opts, + ); + } + /** + * 聊天对话模型 + * @param data + * @param chatOpts + * @param opts + * @returns + */ + chat(data: ChatDataOpts, chatOpts: ChatOpts, opts?: DataOpts) { + const { username, model, group, getFull = true } = chatOpts; + if (!username || !model || !group) { + throw new Error('username, model, group is required'); + } + return this.query.post( + { + path: 'ai', + key: 'chat', + ...chatOpts, + getFull, + data, + }, + opts, + ); + } + clearConfigCache(opts?: DataOpts) { + return this.query.post( + { + path: 'ai', + key: 'clear-cache', + }, + opts, + ); + } + /** + * 获取聊天使用情况 + * @param opts + * @returns + */ + getChatUsage(opts?: DataOpts) { + return this.query.post( + { + path: 'ai', + key: 'get-chat-usage', + }, + opts, + ); + } + + /** + * 清除当前用户模型自己的统计 + * @param opts + * @returns + */ + clearSelfUsage(opts?: DataOpts) { + return this.query.post( + { + path: 'ai', + key: 'clear-chat-limit', + }, + opts, + ); + } +} diff --git a/assistant/src/query/query-login/login-cache.ts b/assistant/src/query/query-login/login-cache.ts new file mode 100644 index 0000000..0ee1bf9 --- /dev/null +++ b/assistant/src/query/query-login/login-cache.ts @@ -0,0 +1,204 @@ +export interface Cache { + /** + * @update 获取缓存 + */ + get(key: string): Promise; + /** + * @update 设置缓存 + */ + set(key: string, value: any): Promise; + /** + * @update 删除缓存 + */ + del(): Promise; + /** + * 初始化 + */ + init?: () => Promise; +} +type User = { + avatar?: string; + description?: string; + id?: string; + needChangePassword?: boolean; + orgs?: string[]; + type?: string; + username?: string; +}; + +export type CacheLoginUser = { + user?: User; + id?: string; + accessToken?: string; + refreshToken?: string; +}; +type CacheLogin = { + loginUsers: CacheLoginUser[]; +} & CacheLoginUser; + +export type CacheStore = { + name: string; + /** + * 缓存数据 + * @important 需要先调用init + */ + cacheData: CacheLogin; + /** + * 实际操作的cache, 需要先调用init + */ + cache: T; + + /** + * 设置当前用户 + */ + setLoginUser(user: CacheLoginUser): Promise; + /** + * 获取当前用户 + */ + getCurrentUser(): Promise; + /** + * 获取当前用户列表 + */ + getCurrentUserList(): Promise; + /** + * 获取缓存的refreshToken + */ + getRefreshToken(): Promise; + /** + * 获取缓存的accessToken + */ + getAccessToken(): Promise; + /** + * 清除当前用户 + */ + clearCurrentUser(): Promise; + /** + * 清除所有用户 + */ + clearAll(): Promise; + + getValue(): Promise; + setValue(value: CacheLogin): Promise; + delValue(): Promise; + init(): Promise; +}; + +export type LoginCacheStoreOpts = { + name: string; + cache: Cache; +}; +export class LoginCacheStore implements CacheStore { + cache: Cache; + name: string; + cacheData: CacheLogin; + constructor(opts: LoginCacheStoreOpts) { + if (!opts.cache) { + throw new Error('cache is required'); + } + // @ts-ignore + this.cache = opts.cache; + this.cacheData = { + loginUsers: [], + user: undefined, + id: undefined, + accessToken: undefined, + refreshToken: undefined, + }; + this.name = opts.name; + } + /** + * 设置缓存 + * @param key + * @param value + * @returns + */ + async setValue(value: CacheLogin) { + await this.cache.set(this.name, value); + this.cacheData = value; + return value; + } + /** + * 删除缓存 + */ + async delValue() { + await this.cache.del(); + } + getValue(): Promise { + return this.cache.get(this.name); + } + /** + * 初始化,设置默认值 + */ + async init() { + const defaultData = { + loginUsers: [], + user: null, + id: null, + accessToken: null, + refreshToken: null, + }; + if (this.cache.init) { + try { + const cacheData = await this.cache.init(); + this.cacheData = cacheData || defaultData; + } catch (error) { + console.log('cacheInit error', error); + } + } else { + this.cacheData = (await this.getValue()) || defaultData; + } + } + /** + * 设置当前用户 + * @param user + */ + async setLoginUser(user: CacheLoginUser) { + const has = this.cacheData.loginUsers.find((u) => u.id === user.id); + if (has) { + this.cacheData.loginUsers = this.cacheData?.loginUsers?.filter((u) => u?.id && u.id !== user.id); + } + this.cacheData.loginUsers.push(user); + this.cacheData.user = user.user; + this.cacheData.id = user.id; + this.cacheData.accessToken = user.accessToken; + this.cacheData.refreshToken = user.refreshToken; + await this.setValue(this.cacheData); + } + + getCurrentUser(): Promise { + const cacheData = this.cacheData; + return Promise.resolve(cacheData.user!); + } + getCurrentUserList(): Promise { + return Promise.resolve(this.cacheData.loginUsers.filter((u) => u?.id)); + } + getRefreshToken(): Promise { + const cacheData = this.cacheData; + return Promise.resolve(cacheData.refreshToken || ''); + } + getAccessToken(): Promise { + const cacheData = this.cacheData; + return Promise.resolve(cacheData.accessToken || ''); + } + + async clearCurrentUser() { + const user = await this.getCurrentUser(); + const has = this.cacheData.loginUsers.find((u) => u.id === user.id); + if (has) { + this.cacheData.loginUsers = this.cacheData?.loginUsers?.filter((u) => u?.id && u.id !== user.id); + } + this.cacheData.user = undefined; + this.cacheData.id = undefined; + this.cacheData.accessToken = undefined; + this.cacheData.refreshToken = undefined; + await this.setValue(this.cacheData); + } + async clearAll() { + this.cacheData.loginUsers = []; + this.cacheData.user = undefined; + this.cacheData.id = undefined; + this.cacheData.accessToken = undefined; + this.cacheData.refreshToken = undefined; + await this.setValue(this.cacheData); + } +} diff --git a/assistant/src/query/query-login/login-node-cache.ts b/assistant/src/query/query-login/login-node-cache.ts new file mode 100644 index 0000000..a0e2b26 --- /dev/null +++ b/assistant/src/query/query-login/login-node-cache.ts @@ -0,0 +1,132 @@ +import { Cache } from './login-cache.ts'; +import { homedir } from 'node:os'; +import { join, dirname } from 'node:path'; +import fs from 'node:fs'; +import { readFileSync, writeFileSync, accessSync } from 'node:fs'; +import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'; +export const fileExists = async ( + filePath: string, + { createIfNotExists = true, isFile = true, isDir = false }: { createIfNotExists?: boolean; isFile?: boolean; isDir?: boolean } = {}, +) => { + try { + accessSync(filePath, fs.constants.F_OK); + return true; + } catch (error) { + if (createIfNotExists && isDir) { + await mkdir(filePath, { recursive: true }); + return true; + } else if (createIfNotExists && isFile) { + await mkdir(dirname(filePath), { recursive: true }); + return false; + } + return false; + } +}; +export const readConfigFile = (filePath: string) => { + try { + const data = readFileSync(filePath, 'utf-8'); + const jsonData = JSON.parse(data); + return jsonData; + } catch (error) { + return {}; + } +}; +export const writeConfigFile = (filePath: string, data: any) => { + writeFileSync(filePath, JSON.stringify(data, null, 2)); +}; +export const getHostName = () => { + const configDir = join(homedir(), '.config', 'envision'); + const configFile = join(configDir, 'config.json'); + const config = readConfigFile(configFile); + const baseURL = config.baseURL || 'https://kevisual.cn'; + const hostname = new URL(baseURL).hostname; + return hostname; +}; +export class StorageNode implements Storage { + cacheData: any; + filePath: string; + constructor() { + this.cacheData = {}; + const configDir = join(homedir(), '.config', 'envision'); + const hostname = getHostName(); + this.filePath = join(configDir, 'config', `${hostname}-storage.json`); + fileExists(this.filePath, { isFile: true }); + } + async loadCache() { + const filePath = this.filePath; + try { + const data = await readConfigFile(filePath); + this.cacheData = data; + } catch (error) { + this.cacheData = {}; + await writeFile(filePath, JSON.stringify(this.cacheData, null, 2)); + } + } + get length() { + return Object.keys(this.cacheData).length; + } + getItem(key: string) { + return this.cacheData[key]; + } + setItem(key: string, value: any) { + this.cacheData[key] = value; + writeFile(this.filePath, JSON.stringify(this.cacheData, null, 2)); + } + removeItem(key: string) { + delete this.cacheData[key]; + writeFile(this.filePath, JSON.stringify(this.cacheData, null, 2)); + } + clear() { + this.cacheData = {}; + writeFile(this.filePath, JSON.stringify(this.cacheData, null, 2)); + } + key(index: number) { + return Object.keys(this.cacheData)[index]; + } +} +export class LoginNodeCache implements Cache { + filepath: string; + + constructor(filepath?: string) { + this.filepath = filepath || join(homedir(), '.config', 'envision', 'config', `${getHostName()}-login.json`); + fileExists(this.filepath, { isFile: true }); + } + async get(_key: string) { + try { + const filePath = this.filepath; + const data = readConfigFile(filePath); + return data; + } catch (error) { + console.log('get error', error); + return {}; + } + } + async set(_key: string, value: any) { + try { + const data = readConfigFile(this.filepath); + const newData = { ...data, ...value }; + writeConfigFile(this.filepath, newData); + } catch (error) { + console.log('set error', error); + } + } + async del() { + await unlink(this.filepath); + } + async loadCache(filePath: string) { + try { + const data = await readFile(filePath, 'utf-8'); + const jsonData = JSON.parse(data); + return jsonData; + } catch (error) { + // console.log('loadCache error', error); + console.log('create new cache file:', filePath); + const defaultData = { loginUsers: [] }; + writeConfigFile(filePath, defaultData); + return defaultData; + } + } + async init() { + return await this.loadCache(this.filepath); + } +} diff --git a/assistant/src/query/query-login/query-login-browser.ts b/assistant/src/query/query-login/query-login-browser.ts new file mode 100644 index 0000000..2d131cb --- /dev/null +++ b/assistant/src/query/query-login/query-login-browser.ts @@ -0,0 +1,12 @@ +import { QueryLogin, QueryLoginOpts } from './query-login.ts'; +import { MyCache } from '@kevisual/cache'; +type QueryLoginNodeOptsWithoutCache = Omit; + +export class QueryLoginBrowser extends QueryLogin { + constructor(opts: QueryLoginNodeOptsWithoutCache) { + super({ + ...opts, + cache: new MyCache('login'), + }); + } +} diff --git a/assistant/src/query/query-login/query-login-node.ts b/assistant/src/query/query-login/query-login-node.ts new file mode 100644 index 0000000..5cb6527 --- /dev/null +++ b/assistant/src/query/query-login/query-login-node.ts @@ -0,0 +1,14 @@ +import { QueryLogin, QueryLoginOpts } from './query-login.ts'; +import { LoginNodeCache, StorageNode } from './login-node-cache.ts'; +type QueryLoginNodeOptsWithoutCache = Omit; +export const storage = new StorageNode(); +await storage.loadCache(); +export class QueryLoginNode extends QueryLogin { + constructor(opts: QueryLoginNodeOptsWithoutCache) { + super({ + ...opts, + storage, + cache: new LoginNodeCache(), + }); + } +} diff --git a/assistant/src/query/query-login/query-login.ts b/assistant/src/query/query-login/query-login.ts new file mode 100644 index 0000000..ce9769b --- /dev/null +++ b/assistant/src/query/query-login/query-login.ts @@ -0,0 +1,434 @@ +import { Query, BaseQuery } from '@kevisual/query'; +import type { Result, DataOpts } from '@kevisual/query/query'; +import { setBaseResponse } from '@kevisual/query/query'; +import { LoginCacheStore, CacheStore } from './login-cache.ts'; +import { Cache } from './login-cache.ts'; + +export type QueryLoginOpts = { + query?: Query; + isBrowser?: boolean; + onLoad?: () => void; + storage?: Storage; + cache: Cache; +}; +export type QueryLoginData = { + username?: string; + password: string; + email?: string; +}; +export type QueryLoginResult = { + accessToken: string; + refreshToken: string; +}; + +export class QueryLogin extends BaseQuery { + /** + * query login cache, 非实际操作, 一个cache的包裹模块 + */ + cacheStore: CacheStore; + isBrowser: boolean; + load?: boolean; + storage: Storage; + onLoad?: () => void; + + constructor(opts?: QueryLoginOpts) { + super({ + query: opts?.query || new Query(), + }); + this.cacheStore = new LoginCacheStore({ name: 'login', cache: opts?.cache! }); + this.isBrowser = opts?.isBrowser ?? true; + this.init(); + this.onLoad = opts?.onLoad; + this.storage = opts?.storage || localStorage; + } + setQuery(query: Query) { + this.query = query; + } + private async init() { + await this.cacheStore.init(); + this.load = true; + this.onLoad?.(); + } + async post(data: any, opts?: DataOpts) { + try { + return this.query.post({ path: 'user', ...data }, opts); + } catch (error) { + console.log('error', error); + return { + code: 400, + } as any; + } + } + /** + * 登录, + * @param data + * @returns + */ + async login(data: QueryLoginData) { + const res = await this.post({ key: 'login', ...data }); + if (res.code === 200) { + const { accessToken, refreshToken } = res?.data || {}; + this.storage.setItem('token', accessToken || ''); + await this.beforeSetLoginUser({ accessToken, refreshToken }); + } + return res; + } + /** + * 手机号登录 + * @param data + * @returns + */ + async loginByCode(data: { phone: string; code: string }) { + const res = await this.post({ path: 'sms', key: 'login', data }); + if (res.code === 200) { + const { accessToken, refreshToken } = res?.data || {}; + this.storage.setItem('token', accessToken || ''); + await this.beforeSetLoginUser({ accessToken, refreshToken }); + } + return res; + } + /** + * 设置token + * @param token + */ + async setLoginToken(token: { accessToken: string; refreshToken: string }) { + const { accessToken, refreshToken } = token; + this.storage.setItem('token', accessToken || ''); + await this.beforeSetLoginUser({ accessToken, refreshToken }); + } + async loginByWechat(data: { code: string }) { + const res = await this.post({ path: 'wx', key: 'open-login', code: data.code }); + if (res.code === 200) { + const { accessToken, refreshToken } = res?.data || {}; + this.storage.setItem('token', accessToken || ''); + await this.beforeSetLoginUser({ accessToken, refreshToken }); + } + return res; + } + /** + * 检测微信登录,登陆成功后,调用onSuccess,否则调用onError + * @param param0 + */ + async checkWechat({ onSuccess, onError }: { onSuccess?: (res: QueryLoginResult) => void; onError?: (res: any) => void }) { + const url = new URL(window.location.href); + const code = url.searchParams.get('code'); + const state = url.searchParams.get('state'); + if (code && state) { + const res = await this.loginByWechat({ code }); + if (res.code === 200) { + onSuccess?.(res.data); + } else { + onError?.(res); + } + } + } + /** + * 登陆成功,需要获取用户信息进行缓存 + * @param param0 + */ + async beforeSetLoginUser({ accessToken, refreshToken, check401 }: { accessToken?: string; refreshToken?: string; check401?: boolean }) { + if (accessToken && refreshToken) { + const resUser = await this.getMe(accessToken, check401); + if (resUser.code === 200) { + const user = resUser.data; + if (user) { + this.cacheStore.setLoginUser({ + user, + id: user.id, + accessToken, + refreshToken, + }); + } else { + console.error('登录失败'); + } + } + } + } + /** + * 刷新token + * @param refreshToken + * @returns + */ + async queryRefreshToken(refreshToken?: string) { + const _refreshToken = refreshToken || this.cacheStore.getRefreshToken(); + let data = { refreshToken: _refreshToken }; + if (!_refreshToken) { + await this.cacheStore.clearCurrentUser(); + return { + code: 401, + message: '请先登录', + data: {} as any, + }; + } + return this.post( + { key: 'refreshToken', data }, + { + afterResponse: async (response, ctx) => { + setBaseResponse(response); + return response as any; + }, + }, + ); + } + /** + * 检查401错误,并刷新token, 如果refreshToken存在,则刷新token, 否则返回401 + * 拦截请求,请使用run401Action, 不要直接使用 afterCheck401ToRefreshToken + * @param response + * @param ctx + * @param refetch + * @returns + */ + async afterCheck401ToRefreshToken(response: Result, ctx?: { req?: any; res?: any; fetch?: any }, refetch?: boolean) { + const that = this; + if (response?.code === 401) { + const hasRefreshToken = await that.cacheStore.getRefreshToken(); + if (hasRefreshToken) { + const res = await that.queryRefreshToken(hasRefreshToken); + if (res.code === 200) { + const { accessToken, refreshToken } = res?.data || {}; + that.storage.setItem('token', accessToken || ''); + await that.beforeSetLoginUser({ accessToken, refreshToken, check401: false }); + if (refetch && ctx && ctx.req && ctx.req.url && ctx.fetch) { + await new Promise((resolve) => setTimeout(resolve, 1500)); + const url = ctx.req?.url; + const body = ctx.req?.body; + const headers = ctx.req?.headers; + const res = await ctx.fetch(url, { + method: 'POST', + body: body, + headers: { ...headers, Authorization: `Bearer ${accessToken}` }, + }); + setBaseResponse(res); + return res; + } + } else { + that.storage.removeItem('token'); + await that.cacheStore.clearCurrentUser(); + } + return res; + } + } + return response as any; + } + /** + * 一个简单的401处理, 如果401,则刷新token, 如果refreshToken不存在,则返回401 + * refetch 是否重新请求, 会有bug,无限循环,按需要使用 + * TODO: + * @param response + * @param ctx + * @param opts + * @returns + */ + async run401Action( + response: Result, + ctx?: { req?: any; res?: any; fetch?: any }, + opts?: { + /** + * 是否重新请求, 会有bug,无限循环,按需要使用 + */ + refetch?: boolean; + /** + * check之后的回调 + */ + afterCheck?: (res: Result) => any; + /** + * 401处理后, 还是401, 则回调 + */ + afterAlso401?: (res: Result) => any; + }, + ) { + const that = this; + const refetch = opts?.refetch ?? false; + if (response?.code === 401) { + if (that.query.stop === true) { + return { code: 500, success: false, message: 'refresh token loading...' }; + } + that.query.stop = true; + const res = await that.afterCheck401ToRefreshToken(response, ctx, refetch); + that.query.stop = false; + opts?.afterCheck?.(res); + if (res.code === 401) { + opts?.afterAlso401?.(res); + } + return res; + } else { + return response as any; + } + } + /** + * 获取用户信息 + * @param token + * @returns + */ + async getMe(token?: string, check401: boolean = true) { + const _token = token || this.storage.getItem('token'); + const that = this; + return that.post( + { key: 'me' }, + { + beforeRequest: async (config) => { + if (config.headers) { + config.headers['Authorization'] = `Bearer ${_token}`; + } + if (!_token) { + return false; + } + return config; + }, + afterResponse: async (response, ctx) => { + if (response?.code === 401 && check401 && !token) { + return await that.afterCheck401ToRefreshToken(response, ctx); + } + return response as any; + }, + }, + ); + } + /** + * 检查本地用户,如果本地用户存在,则返回本地用户,否则返回null + * @returns + */ + async checkLocalUser() { + const user = await this.cacheStore.getCurrentUser(); + if (user) { + return user; + } + return null; + } + /** + * 检查本地token是否存在,简单的判断是否已经属于登陆状态 + * @returns + */ + async checkLocalToken() { + const token = this.storage.getItem('token'); + return !!token; + } + /** + * 检查本地用户列表 + * @returns + */ + async getToken() { + const token = this.storage.getItem('token'); + return token || ''; + } + async beforeRequest(opts: any = {}) { + const token = this.storage.getItem('token'); + if (token) { + opts.headers = { ...opts.headers, Authorization: `Bearer ${token}` }; + } + return opts; + } + /** + * 请求更新,切换用户, 使用switchUser + * @param username + * @returns + */ + private async postSwitchUser(username: string) { + return this.post({ key: 'switchCheck', data: { username } }); + } + /** + * 切换用户 + * @param username + * @returns + */ + async switchUser(username: string) { + const localUserList = await this.cacheStore.getCurrentUserList(); + const user = localUserList.find((userItem) => userItem.user!.username === username); + if (user) { + this.storage.setItem('token', user.accessToken || ''); + await this.beforeSetLoginUser({ accessToken: user.accessToken, refreshToken: user.refreshToken }); + return { + code: 200, + data: { + accessToken: user.accessToken, + refreshToken: user.refreshToken, + }, + success: true, + message: '切换用户成功', + }; + } + const res = await this.postSwitchUser(username); + + if (res.code === 200) { + const { accessToken, refreshToken } = res?.data || {}; + this.storage.setItem('token', accessToken || ''); + await this.beforeSetLoginUser({ accessToken, refreshToken }); + } + return res; + } + /** + * 退出登陆,去掉token, 并删除缓存 + * @returns + */ + async logout() { + this.storage.removeItem('token'); + const users = await this.cacheStore.getCurrentUserList(); + const tokens = users + .map((user) => { + return user?.accessToken; + }) + .filter(Boolean); + this.cacheStore.delValue(); + return this.post({ key: 'logout', data: { tokens } }); + } + /** + * 检查用户名的组,这个用户是否存在 + * @param username + * @returns + */ + async hasUser(username: string) { + const that = this; + return this.post( + { + path: 'org', + key: 'hasUser', + data: { + username, + }, + }, + { + afterResponse: async (response, ctx) => { + if (response?.code === 401) { + const res = await that.afterCheck401ToRefreshToken(response, ctx, true); + return res; + } + return response as any; + }, + }, + ); + } + /** + * 检查登录状态 + * @param token + * @returns + */ + async checkLoginStatus(token: string) { + const res = await this.post({ + path: 'user', + key: 'checkLoginStatus', + loginToken: token, + }); + if (res.code === 200) { + const accessToken = res.data?.accessToken; + this.storage.setItem('token', accessToken || ''); + await this.beforeSetLoginUser({ accessToken, refreshToken: res.data?.refreshToken }); + return res; + } + return false; + } + /** + * 使用web登录,创建url地址, 需要MD5和jsonwebtoken + */ + loginWithWeb(baseURL: string, { MD5, jsonwebtoken }: { MD5: any; jsonwebtoken: any }) { + const randomId = Math.random().toString(36).substring(2, 15); + const timestamp = Date.now(); + const tokenSecret = 'xiao' + randomId; + const sign = MD5(`${tokenSecret}${timestamp}`).toString(); + const token = jsonwebtoken.sign({ randomId, timestamp, sign }, tokenSecret, { + // 10分钟过期 + expiresIn: 60 * 10, // 10分钟 + }); + const url = `${baseURL}/api/router?path=user&key=webLogin&p&loginToken=${token}&sign=${sign}&randomId=${randomId}`; + return { url, token, tokenSecret }; + } +} diff --git a/assistant/src/routes/ai/index.ts b/assistant/src/routes/ai/index.ts new file mode 100644 index 0000000..d56b3f8 --- /dev/null +++ b/assistant/src/routes/ai/index.ts @@ -0,0 +1,35 @@ +import { useContextKey } from '@kevisual/use-config/context'; +// import { appDefine } from '@/query/query-ai/defines/ai.ts'; +import { ProviderManager } from '@kevisual/ai'; +import { App } from '@kevisual/router'; +import { assistantConfig } from '@/app.ts'; +const app = useContextKey('app'); + +app + .route({ + path: 'ai', + key: 'chat', + middleware: ['auth'], + }) + .define(async (ctx) => { + const { messages = [], username, group, question, chatOpts = {} } = ctx.query; + // if (!username || !model || !group) { + // return ctx.throw(4001, 'username, model, group is required'); + // } + if (messages.length === 0 && question) { + messages.push({ + role: 'user', + content: question, + }); + } + const as = assistantConfig.getCacheAssistantConfig(); + const { provider, apiKey, model } = as.ai || {}; + const pm = new ProviderManager({ + provider: provider, + apiKey: apiKey, + model: model, + }); + const result = await pm.provider.chat(messages, chatOpts); + ctx.body = result; + }) + .addTo(app); diff --git a/assistant/src/routes/index.ts b/assistant/src/routes/index.ts index ff7f2dc..14d3a85 100644 --- a/assistant/src/routes/index.ts +++ b/assistant/src/routes/index.ts @@ -2,6 +2,8 @@ import { Query } from '@kevisual/query'; import { app, assistantConfig } from '../app.ts'; import './config/index.ts'; import './shop-install/index.ts'; +import './ai/index.ts'; + import os from 'node:os'; app diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c51b299..f97025c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -173,25 +173,6 @@ importers: specifier: npm:@kevisual/ws version: '@kevisual/ws@8.0.0' - submodules/kevisual-query-login: - dependencies: - '@kevisual/cache': - specifier: ^0.0.2 - version: 0.0.2(rollup@4.41.0)(tslib@2.8.1)(typescript@5.8.2) - '@kevisual/query': - specifier: ^0.0.17 - version: 0.0.17(encoding@0.1.13)(ws@8.18.0) - dotenv: - specifier: ^16.5.0 - version: 16.5.0 - devDependencies: - '@types/node': - specifier: ^22.14.1 - version: 22.14.1 - tsup: - specifier: ^8.4.0 - version: 8.4.0(postcss@8.5.3)(typescript@5.8.2) - packages: '@babel/code-frame@7.26.2': @@ -202,156 +183,6 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@esbuild/aix-ppc64@0.25.0': - resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.0': - resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.0': - resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.0': - resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.0': - resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.0': - resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.0': - resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.0': - resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.0': - resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.0': - resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.0': - resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.0': - resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.0': - resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.0': - resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.0': - resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.0': - resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.0': - resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.0': - resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.0': - resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.0': - resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.0': - resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.25.0': - resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.0': - resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.0': - resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.0': - resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@inquirer/checkbox@4.1.6': resolution: {integrity: sha512-62u896rWCtKKE43soodq5e/QcRsA22I+7/4Ov7LESWnKRO6BVo2A1DFLDmXL9e28TB0CfHc3YtkbPm7iwajqkg==} engines: {node: '>=18'} @@ -481,24 +312,9 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@kevisual/ai-center@0.0.4': resolution: {integrity: sha512-pZw8sH7G0JjknHBHERV71INvmgyDS2JWyI2kb1a9FFHfRKg4TCv+RJIE505vKoAPjUd6+h6FHVHXvPXBdeTdxg==} @@ -522,9 +338,6 @@ packages: peerDependencies: '@kevisual/query': ^0.0.17 - '@kevisual/query@0.0.17': - resolution: {integrity: sha512-WMvWM+3pNlPKNhoxPX9fldMp1tOeJrkRM/tXA4bvOnftIoX2yeI4v0wTpbGJXES/bLlo7OC2kV8SeKF0K6dnxQ==} - '@kevisual/query@0.0.18': resolution: {integrity: sha512-I2vHTu0I6AyD9PJyr+vxyp9jIJ6rd2EZqLVHTv/+zrVKVc2SS76Tg7aGNkmAFqqLSCB8kLLsmMGtSJU1Qb8VVg==} @@ -761,9 +574,6 @@ packages: '@types/node@18.19.80': resolution: {integrity: sha512-kEWeMwMeIvxYkeg1gTc01awpwLbfMRZXdIhwRcakd/KlK53jmRC26LqcbIt7fnAQTu5GzlnWmzA3H6+l1u6xxQ==} - '@types/node@22.14.1': - resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} - '@types/node@22.15.21': resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==} @@ -822,9 +632,6 @@ packages: resolution: {integrity: sha512-P8nrHI1EyW9OfBt1X7hMSwGN2vwRuqHSKJAT1gbLWZRzDa24oHjYwGHvEgHeBepupzk878yS/HBZ0NMPYtbolw==} engines: {node: '>=14'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -880,16 +687,6 @@ packages: bun-types@1.2.14: resolution: {integrity: sha512-Kuh4Ub28ucMRWeiUUWMHsT9Wcbr4H3kLIO72RZZElSDxSu7vpetRvxIUDUaW6QtaIeixIpm7OXtNnZPf82EzwA==} - bundle-require@5.1.0: - resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.18' - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -912,10 +709,6 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -946,17 +739,9 @@ packages: commander@2.15.1: resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - consola@3.4.2: - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} - engines: {node: ^14.18.0 || >=16.10.0} - croner@4.1.97: resolution: {integrity: sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==} @@ -1077,11 +862,6 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.25.0: - resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} - engines: {node: '>=18'} - hasBin: true - escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1155,14 +935,6 @@ packages: picomatch: optional: true - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - filesize@10.1.6: resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} engines: {node: '>= 10.4.0'} @@ -1347,10 +1119,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - js-git@0.7.8: resolution: {integrity: sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==} @@ -1377,17 +1145,6 @@ packages: jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} @@ -1412,9 +1169,6 @@ packages: lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -1498,14 +1252,6 @@ packages: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - nanoid@3.3.9: - resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - nanoid@5.1.5: resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} engines: {node: ^18 || >=20} @@ -1541,10 +1287,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -1561,18 +1303,6 @@ packages: zod: optional: true - openai@4.88.0: - resolution: {integrity: sha512-Ll2ZJCdX/56WcCF/wLtAFou+zWRyLeneoXy+qya5T5/wm5LkIr6heJfSn53c5ujXWPB+24cgumiOetbFqcppFA==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.23.8 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -1625,10 +1355,6 @@ packages: resolution: {integrity: sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==} engines: {node: '>=10'} - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - pm2-axon-rpc@0.7.1: resolution: {integrity: sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==} engines: {node: '>=5'} @@ -1652,28 +1378,6 @@ packages: engines: {node: '>=16.0.0'} hasBin: true - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} - promptly@2.2.0: resolution: {integrity: sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==} @@ -1684,10 +1388,6 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1703,18 +1403,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - require-in-the-middle@5.2.0: resolution: {integrity: sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==} engines: {node: '>=6'} - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -1812,10 +1504,6 @@ packages: resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -1823,10 +1511,6 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - sprintf-js@1.1.2: resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} @@ -1853,11 +1537,6 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - supports-color@10.0.0: resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} engines: {node: '>=18'} @@ -1880,20 +1559,6 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} - engines: {node: '>=12.0.0'} - tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -1909,41 +1574,12 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tslib@1.9.3: resolution: {integrity: sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.4.0: - resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - tv4@1.3.0: resolution: {integrity: sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==} engines: {node: '>= 0.8.0'} @@ -1977,15 +1613,9 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2068,81 +1698,6 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': optional: true - '@esbuild/aix-ppc64@0.25.0': - optional: true - - '@esbuild/android-arm64@0.25.0': - optional: true - - '@esbuild/android-arm@0.25.0': - optional: true - - '@esbuild/android-x64@0.25.0': - optional: true - - '@esbuild/darwin-arm64@0.25.0': - optional: true - - '@esbuild/darwin-x64@0.25.0': - optional: true - - '@esbuild/freebsd-arm64@0.25.0': - optional: true - - '@esbuild/freebsd-x64@0.25.0': - optional: true - - '@esbuild/linux-arm64@0.25.0': - optional: true - - '@esbuild/linux-arm@0.25.0': - optional: true - - '@esbuild/linux-ia32@0.25.0': - optional: true - - '@esbuild/linux-loong64@0.25.0': - optional: true - - '@esbuild/linux-mips64el@0.25.0': - optional: true - - '@esbuild/linux-ppc64@0.25.0': - optional: true - - '@esbuild/linux-riscv64@0.25.0': - optional: true - - '@esbuild/linux-s390x@0.25.0': - optional: true - - '@esbuild/linux-x64@0.25.0': - optional: true - - '@esbuild/netbsd-arm64@0.25.0': - optional: true - - '@esbuild/netbsd-x64@0.25.0': - optional: true - - '@esbuild/openbsd-arm64@0.25.0': - optional: true - - '@esbuild/openbsd-x64@0.25.0': - optional: true - - '@esbuild/sunos-x64@0.25.0': - optional: true - - '@esbuild/win32-arm64@0.25.0': - optional: true - - '@esbuild/win32-ia32@0.25.0': - optional: true - - '@esbuild/win32-x64@0.25.0': - optional: true - '@inquirer/checkbox@4.1.6(@types/node@22.15.21)': dependencies: '@inquirer/core': 10.1.11(@types/node@22.15.21) @@ -2272,23 +1827,8 @@ snapshots: dependencies: minipass: 7.1.2 - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - '@kevisual/ai-center@0.0.4': dependencies: '@kevisual/logger': 0.0.3 @@ -2341,14 +1881,6 @@ snapshots: - tslib - typescript - '@kevisual/query@0.0.17(encoding@0.1.13)(ws@8.18.0)': - dependencies: - openai: 4.88.0(encoding@0.1.13)(ws@8.18.0) - transitivePeerDependencies: - - encoding - - ws - - zod - '@kevisual/query@0.0.18(@kevisual/ws@8.0.0)(encoding@0.1.13)': dependencies: openai: 4.100.0(@kevisual/ws@8.0.0)(encoding@0.1.13) @@ -2591,10 +2123,6 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.14.1': - dependencies: - undici-types: 6.21.0 - '@types/node@22.15.21': dependencies: undici-types: 6.21.0 @@ -2644,8 +2172,6 @@ snapshots: ansis@4.0.0: {} - any-promise@1.3.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -2691,13 +2217,6 @@ snapshots: dependencies: '@types/node': 22.15.21 - bundle-require@5.1.0(esbuild@0.25.0): - dependencies: - esbuild: 0.25.0 - load-tsconfig: 0.2.5 - - cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -2726,10 +2245,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - chownr@3.0.0: {} cli-tableau@2.0.1: @@ -2752,12 +2267,8 @@ snapshots: commander@2.15.1: {} - commander@4.1.1: {} - commondir@1.0.1: {} - consola@3.4.2: {} - croner@4.1.97: {} cross-env@7.0.3: @@ -2856,34 +2367,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild@0.25.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.0 - '@esbuild/android-arm': 0.25.0 - '@esbuild/android-arm64': 0.25.0 - '@esbuild/android-x64': 0.25.0 - '@esbuild/darwin-arm64': 0.25.0 - '@esbuild/darwin-x64': 0.25.0 - '@esbuild/freebsd-arm64': 0.25.0 - '@esbuild/freebsd-x64': 0.25.0 - '@esbuild/linux-arm': 0.25.0 - '@esbuild/linux-arm64': 0.25.0 - '@esbuild/linux-ia32': 0.25.0 - '@esbuild/linux-loong64': 0.25.0 - '@esbuild/linux-mips64el': 0.25.0 - '@esbuild/linux-ppc64': 0.25.0 - '@esbuild/linux-riscv64': 0.25.0 - '@esbuild/linux-s390x': 0.25.0 - '@esbuild/linux-x64': 0.25.0 - '@esbuild/netbsd-arm64': 0.25.0 - '@esbuild/netbsd-x64': 0.25.0 - '@esbuild/openbsd-arm64': 0.25.0 - '@esbuild/openbsd-x64': 0.25.0 - '@esbuild/sunos-x64': 0.25.0 - '@esbuild/win32-arm64': 0.25.0 - '@esbuild/win32-ia32': 0.25.0 - '@esbuild/win32-x64': 0.25.0 - escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} @@ -2946,10 +2429,6 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - fdir@6.4.3(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - filesize@10.1.6: {} fill-range@7.1.1: @@ -3139,8 +2618,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - joycon@3.1.1: {} - js-git@0.7.8: dependencies: bodec: 0.1.0 @@ -3184,12 +2661,6 @@ snapshots: jwa: 1.4.1 safe-buffer: 5.2.1 - lilconfig@3.1.3: {} - - lines-and-columns@1.2.4: {} - - load-tsconfig@0.2.5: {} - lodash-es@4.17.21: {} lodash.includes@4.3.0: {} @@ -3206,8 +2677,6 @@ snapshots: lodash.once@4.1.1: {} - lodash.sortby@4.7.0: {} - lodash@4.17.21: {} lru-cache@10.4.3: {} @@ -3270,15 +2739,6 @@ snapshots: mute-stream@2.0.0: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nanoid@3.3.9: - optional: true - nanoid@5.1.5: {} needle@2.4.0(supports-color@10.0.0): @@ -3303,8 +2763,6 @@ snapshots: normalize-path@3.0.0: {} - object-assign@4.1.1: {} - on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -3337,20 +2795,6 @@ snapshots: transitivePeerDependencies: - encoding - openai@4.88.0(encoding@0.1.13)(ws@8.18.0): - dependencies: - '@types/node': 18.19.80 - '@types/node-fetch': 2.6.12 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) - optionalDependencies: - ws: 8.18.0 - transitivePeerDependencies: - - encoding - os-tmpdir@1.0.2: {} pac-proxy-agent@7.2.0(supports-color@10.0.0): @@ -3386,7 +2830,8 @@ snapshots: path-to-regexp@8.2.0: {} - picocolors@1.1.1: {} + picocolors@1.1.1: + optional: true picomatch@2.3.1: {} @@ -3401,8 +2846,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - pirates@4.0.6: {} - pm2-axon-rpc@0.7.1(supports-color@10.0.0): dependencies: debug: 4.4.0(supports-color@10.0.0) @@ -3476,19 +2919,6 @@ snapshots: - supports-color - utf-8-validate - postcss-load-config@6.0.1(postcss@8.5.3): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - postcss: 8.5.3 - - postcss@8.5.3: - dependencies: - nanoid: 3.3.9 - picocolors: 1.1.1 - source-map-js: 1.2.1 - optional: true - promptly@2.2.0: dependencies: read: 1.0.7 @@ -3508,8 +2938,6 @@ snapshots: proxy-from-env@1.1.0: {} - punycode@2.3.1: {} - queue-microtask@1.2.3: {} range-parser@1.2.1: {} @@ -3522,8 +2950,6 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.1.2: {} - require-in-the-middle@5.2.0(supports-color@10.0.0): dependencies: debug: 4.4.0(supports-color@10.0.0) @@ -3532,8 +2958,6 @@ snapshots: transitivePeerDependencies: - supports-color - resolve-from@5.0.0: {} - resolve@1.22.8: dependencies: is-core-module: 2.15.1 @@ -3654,9 +3078,6 @@ snapshots: ip-address: 9.0.5 smart-buffer: 4.2.0 - source-map-js@1.2.1: - optional: true - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -3664,10 +3085,6 @@ snapshots: source-map@0.6.1: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - sprintf-js@1.1.2: {} sprintf-js@1.1.3: {} @@ -3694,16 +3111,6 @@ snapshots: dependencies: ansi-regex: 6.1.0 - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - supports-color@10.0.0: {} supports-color@7.2.0: @@ -3724,21 +3131,6 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - tinyexec@0.3.2: {} - - tinyglobby@0.2.12: - dependencies: - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 - tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -3751,45 +3143,10 @@ snapshots: tr46@0.0.3: {} - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - - tree-kill@1.2.2: {} - - ts-interface-checker@0.1.13: {} - tslib@1.9.3: {} tslib@2.8.1: {} - tsup@8.4.0(postcss@8.5.3)(typescript@5.8.2): - dependencies: - bundle-require: 5.1.0(esbuild@0.25.0) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.2 - debug: 4.4.0(supports-color@10.0.0) - esbuild: 0.25.0 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.3) - resolve-from: 5.0.0 - rollup: 4.41.0 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.12 - tree-kill: 1.2.2 - optionalDependencies: - postcss: 8.5.3 - typescript: 5.8.2 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - tv4@1.3.0: {} tx2@1.0.5: @@ -3816,19 +3173,11 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@4.0.2: {} - whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - which@2.0.2: dependencies: isexe: 2.0.0