vome-core 0.0.67 → 0.0.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/config/plugin-dev.js +1 -1
- package/dist/admin/crud/components/vm-json-editor.vue +32 -3
- package/dist/admin/crud/config.js +1 -1
- package/dist/admin/crud/confirm.js +1 -1
- package/dist/admin/crud/dict.js +1 -1
- package/dist/admin/crud/index.d.ts +1 -1
- package/dist/admin/crud/index.js +1 -1
- package/dist/admin/crud/key.js +1 -1
- package/dist/admin/crud/mitt.js +1 -1
- package/dist/admin/crud/plugins.js +1 -1
- package/dist/admin/crud/span.js +1 -1
- package/dist/admin/crud/style.d.ts +37 -0
- package/dist/admin/crud/style.js +1 -1
- package/dist/admin/crud/validate.js +1 -1
- package/dist/admin/crud/vm-add-btn.vue +2 -1
- package/dist/admin/crud/vm-adv-search.vue +5 -4
- package/dist/admin/crud/vm-crud.vue +14 -9
- package/dist/admin/crud/vm-export-btn.vue +2 -1
- package/dist/admin/crud/vm-import-btn.vue +2 -1
- package/dist/admin/crud/vm-multi-delete-btn.vue +2 -1
- package/dist/admin/crud/vm-pagination.vue +16 -7
- package/dist/admin/crud/vm-refresh-btn.vue +2 -1
- package/dist/admin/crud/vm-search-key.vue +3 -2
- package/dist/admin/crud/vm-search.vue +29 -20
- package/dist/admin/crud/vm-table.vue +55 -17
- package/dist/admin/crud/vm-toolbar.vue +12 -13
- package/dist/admin/crud/vm-upsert.vue +12 -6
- package/dist/admin/directives/perm.js +1 -1
- package/dist/admin/hooks/useUpload.js +1 -1
- package/dist/admin/index.d.ts +1 -1
- package/dist/admin/index.js +6 -1
- package/dist/admin/lib/browser.js +1 -1
- package/dist/admin/lib/cn.js +1 -1
- package/dist/admin/lib/dialog-float.js +1 -1
- package/dist/admin/lib/export-excel.js +1 -1
- package/dist/admin/lib/file-preview.js +1 -1
- package/dist/admin/lib/import-excel.js +1 -1
- package/dist/admin/lib/json.js +1 -1
- package/dist/admin/lib/menu.js +1 -1
- package/dist/admin/lib/tree.js +1 -1
- package/dist/admin/lib/upload.js +1 -1
- package/dist/admin/lib/video-frame.js +1 -1
- package/dist/admin/styles/base.css +33 -0
- package/dist/ai/index.js +28761 -0
- package/dist/ai.d.ts +1 -0
- package/dist/client/base.js +3 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.js +3 -5
- package/dist/client/locale-store.d.ts +59 -0
- package/dist/client/locale-store.js +159 -0
- package/dist/client/vite-plugin-eps.js +0 -21
- package/dist/index.js +1 -1
- package/dist/server/index.js +1 -1
- package/dist/shared/excel.js +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/locale-json.js +1 -0
- package/dist/shared/tree.js +1 -1
- package/dist/src/ai/adapters/anthropic-gemini.d.ts +5 -0
- package/dist/src/ai/adapters/auth-headers.d.ts +4 -0
- package/dist/src/ai/adapters/index.d.ts +3 -0
- package/dist/src/ai/adapters/openai-compatible.d.ts +4 -0
- package/dist/src/ai/call-log-helpers.d.ts +13 -0
- package/dist/src/ai/index.d.ts +10 -0
- package/dist/src/ai/normalize.d.ts +18 -0
- package/dist/src/ai/sse.d.ts +13 -0
- package/dist/src/ai/transport.d.ts +16 -0
- package/dist/src/ai/types.d.ts +194 -0
- package/dist/src/core/index.d.ts +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/orm/index.d.ts +1 -1
- package/dist/src/server/index.d.ts +3 -1
- package/dist/src/shared/index.d.ts +1 -0
- package/dist/src/shared/locale-json.d.ts +7 -0
- package/dist/typings/routing/eps.d.ts +2 -0
- package/package.json +7 -2
- package/src/shared/index.ts +6 -0
- package/src/shared/locale-json.ts +79 -0
- package/typings/admin/comm/crud.d.ts +12 -0
- package/typings/admin/comm/crud.ts +12 -0
- package/typings/admin/comm/eps.d.ts +3 -0
- package/typings/admin/comm/eps.ts +3 -0
- package/typings/admin/comm/request.d.ts +1 -1
- package/typings/admin/comm/request.ts +1 -1
- package/dist/client/ai-model.d.ts +0 -38
- package/dist/client/ai-model.js +0 -39
package/dist/shared/excel.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
function _0x2981(){const _0x274967=['CMvHza','EgXZEa','mtuYB2DMBe9b','zgvSzxrLzef0','ndq5ntKYsMXmtfjT','DxrPBhm','z2v0','DhjPBq','u2HLzxqX','yM9VA19UzxC','mJeYCvfhtMLl','mZq0nZCXovHVC09QEG','yxbWBgLJyxrPB24VDM5KlM9Wzw54BwXMB3jTyxrZlw9MzMLJzwrVy3vTzw50lNnWCMvHzhnOzwv0BwWUC2HLzxq','odaXmdCWu0TTwwPU','yM9VA19HChbLBMrFC2HLzxq','u2HLzxrZ','BgvUz3rO','mJmYmdCXCvH5qvP6','mJuXExnIEgn0','C2v0','lNHSC3G','mtq5ntGZnKrgzeDvua','D3jPDgu','yxr0ywnOBwvUDdSGzMLSzw5HBwuQpvvurI04jYC','ovbODg5KBW','yxjYyxK','C3rYAw5N','ChvZAa','DxbKyxrLvgLTzq','BgfIzwW','nZCYmtb0tMz6ANa','nJeZme9nt091zW','ChjVCa','BwfW','DgvUyw50swq'];_0x2981=function(){return _0x274967;};return _0x2981();}const _0x410007=_0x555e;(function(_0x4aecf6,_0x591aa0){const _0x5c0465=_0x555e,_0x2fdf7e=_0x4aecf6();while(!![]){try{const _0x6eb441=-parseInt(_0x5c0465(0x154))/0x1*(-parseInt(_0x5c0465(0x161))/0x2)+parseInt(_0x5c0465(0x169))/0x3+-parseInt(_0x5c0465(0x16f))/0x4*(-parseInt(_0x5c0465(0x160))/0x5)+-parseInt(_0x5c0465(0x157))/0x6+parseInt(_0x5c0465(0x153))/0x7*(-parseInt(_0x5c0465(0x167))/0x8)+-parseInt(_0x5c0465(0x15a))/0x9*(parseInt(_0x5c0465(0x14f))/0xa)+-parseInt(_0x5c0465(0x170))/0xb;if(_0x6eb441===_0x591aa0)break;else _0x2fdf7e['push'](_0x2fdf7e['shift']());}catch(_0x1892e5){_0x2fdf7e['push'](_0x2fdf7e['shift']());}}}(_0x2981,0x717d8));function _0x555e(_0x17c172,_0x4fcc60){_0x17c172=_0x17c172-0x14e;const _0x2981d2=_0x2981();let _0x555eae=_0x2981d2[_0x17c172];if(_0x555e['QYclrw']===undefined){var _0x2c5ac7=function(_0x4bd034){const _0x18bb0c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x447d76='',_0x248709='';for(let _0x508bbd=0x0,_0x47b961,_0x45bec5,_0x591b73=0x0;_0x45bec5=_0x4bd034['charAt'](_0x591b73++);~_0x45bec5&&(_0x47b961=_0x508bbd%0x4?_0x47b961*0x40+_0x45bec5:_0x45bec5,_0x508bbd++%0x4)?_0x447d76+=String['fromCharCode'](0xff&_0x47b961>>(-0x2*_0x508bbd&0x6)):0x0){_0x45bec5=_0x18bb0c['indexOf'](_0x45bec5);}for(let _0x3cf979=0x0,_0x5a674d=_0x447d76['length'];_0x3cf979<_0x5a674d;_0x3cf979++){_0x248709+='%'+('00'+_0x447d76['charCodeAt'](_0x3cf979)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x248709);};_0x555e['iIvcOl']=_0x2c5ac7,_0x555e['qztBSb']={},_0x555e['QYclrw']=!![];}const _0x1fff3e=_0x2981d2[0x0],_0x1bea39=_0x17c172+_0x1fff3e,_0x2fb489=_0x555e['qztBSb'][_0x1bea39];return!_0x2fb489?(_0x555eae=_0x555e['iIvcOl'](_0x555eae),_0x555e['qztBSb'][_0x1bea39]=_0x555eae):_0x555eae=_0x2fb489,_0x555eae;}import*as _0x447d76 from'xlsx';export const IMPORT_SKIP_FIELDS=['id','createTime',_0x410007(0x15e),_0x410007(0x168),_0x410007(0x164)];export function isImportSkipField(_0x248709){return IMPORT_SKIP_FIELDS['includes'](_0x248709);}export function buildExcelBuffer(_0x508bbd,_0x47b961,_0x45bec5){const _0x27b684=_0x410007,_0x591b73=_0x508bbd[_0x27b684(0x163)](_0x2da604=>_0x2da604[_0x27b684(0x15f)]||_0x2da604['prop']),_0x3cf979=_0x47b961['map'](_0x2f74da=>_0x508bbd[_0x27b684(0x163)](_0x2c7d93=>{const _0x218088=_0x27b684;if(_0x45bec5)return _0x45bec5(_0x2c7d93[_0x218088(0x162)],_0x2f74da);const _0x10123c=_0x2f74da[_0x2c7d93['prop']];if(_0x10123c==null)return'';return String(_0x10123c);})),_0x5a674d=_0x447d76[_0x27b684(0x16a)]['aoa_to_sheet']([_0x591b73,..._0x3cf979]),_0x304dba=_0x447d76[_0x27b684(0x16a)][_0x27b684(0x16e)]();return _0x447d76[_0x27b684(0x16a)][_0x27b684(0x150)](_0x304dba,_0x5a674d,_0x27b684(0x16d)),_0x447d76[_0x27b684(0x158)](_0x304dba,{'bookType':_0x27b684(0x166),'type':'array'});}export function buildImportTemplateBuffer(_0x400d4a){return buildExcelBuffer(_0x400d4a,[]);}export function parseExcelBuffer(_0x159b2f,_0xf313be){const _0x2a2d11=_0x410007,_0x472a8b=_0x447d76[_0x2a2d11(0x165)](_0x159b2f,{'type':_0x2a2d11(0x15b),'cellDates':!![]}),_0x51dbf9=_0x472a8b['SheetNames'][0x0];if(!_0x51dbf9)return[];const _0x37ce85=_0x472a8b[_0x2a2d11(0x151)][_0x51dbf9];if(!_0x37ce85)return[];const _0x4fd99e=_0x447d76['utils']['sheet_to_json'](_0x37ce85,{'header':0x1,'defval':'','raw':![]});if(!_0x4fd99e['length'])return[];const _0x420252=(_0x4fd99e[0x0]||[])[_0x2a2d11(0x163)](_0x2f439b=>String(_0x2f439b??'')[_0x2a2d11(0x16c)]()),_0x423803=new Map();if(_0xf313be?.[_0x2a2d11(0x152)])for(const _0x1c75d8 of _0xf313be){_0x423803['set'](_0x1c75d8[_0x2a2d11(0x15f)][_0x2a2d11(0x16c)](),_0x1c75d8[_0x2a2d11(0x162)]),_0x423803[_0x2a2d11(0x155)](_0x1c75d8[_0x2a2d11(0x162)],_0x1c75d8[_0x2a2d11(0x162)]);}const _0x2c1152=_0x420252[_0x2a2d11(0x163)](_0xd1acb6=>{const _0x313dc3=_0x2a2d11;if(!_0xd1acb6)return'';return _0x423803[_0x313dc3(0x16b)](_0xd1acb6)||_0xd1acb6;}),_0x2232f0=[];for(let _0x2a071f=0x1;_0x2a071f<_0x4fd99e[_0x2a2d11(0x152)];_0x2a071f++){const _0x5c2f55=_0x4fd99e[_0x2a071f]||[],_0x52ec76={};let _0x56c5e2=!![];for(let _0x108bd9=0x0;_0x108bd9<_0x2c1152[_0x2a2d11(0x152)];_0x108bd9++){const _0x464e97=_0x2c1152[_0x108bd9];if(!_0x464e97)continue;let _0x4b4b9b=_0x5c2f55[_0x108bd9];if(_0x4b4b9b==null||_0x4b4b9b===''){_0x52ec76[_0x464e97]=_0x4b4b9b==null?null:'';continue;}_0x56c5e2=![],typeof _0x4b4b9b===_0x2a2d11(0x15c)?_0x52ec76[_0x464e97]=_0x4b4b9b[_0x2a2d11(0x16c)]():_0x52ec76[_0x464e97]=_0x4b4b9b;}if(!_0x56c5e2)_0x2232f0[_0x2a2d11(0x15d)](_0x52ec76);}return _0x2232f0;}export function excelFilename(_0x5b92c7){const _0x463f8d=_0x410007;return _0x5b92c7['endsWith'](_0x463f8d(0x156))?_0x5b92c7:_0x5b92c7+_0x463f8d(0x156);}export function excelResponseHeaders(_0x2722f4){const _0x24831a=_0x410007,_0x213afc=excelFilename(_0x2722f4);return{'Content-Type':_0x24831a(0x14e),'Content-Disposition':_0x24831a(0x159)+encodeURIComponent(_0x213afc)};}
|
package/dist/shared/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(_0x4e0fa1,_0x4a1989){var _0x20da2c=_0xe2c6,_0x1edde5=_0x4e0fa1();while(!![]){try{var _0x2d3d=parseInt(_0x20da2c(0x10d))/0x1+parseInt(_0x20da2c(0x10b))/0x2+-parseInt(_0x20da2c(0x10c))/0x3+parseInt(_0x20da2c(0x109))/0x4+-parseInt(_0x20da2c(0x10f))/0x5+-parseInt(_0x20da2c(0x10e))/0x6+parseInt(_0x20da2c(0x10a))/0x7;if(_0x2d3d===_0x4a1989)break;else _0x1edde5['push'](_0x1edde5['shift']());}catch(_0x1512e9){_0x1edde5['push'](_0x1edde5['shift']());}}}(_0xa41a,0x6ebfb));export{merge}from'../comm/merge';export{deepTree,flattenTree}from'./tree';export{RES_CODE}from'../routing/base';export{buildExcelBuffer,buildImportTemplateBuffer,parseExcelBuffer,excelFilename,excelResponseHeaders,IMPORT_SKIP_FIELDS,isImportSkipField}from'./excel';function _0xe2c6(_0x5089c4,_0xbcfb2a){_0x5089c4=_0x5089c4-0x109;var _0xa41a20=_0xa41a();var _0xe2c684=_0xa41a20[_0x5089c4];if(_0xe2c6['ebmfdk']===undefined){var _0x44c08b=function(_0x9bf8c2){var _0x39471c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x257a38='',_0x3809f1='';for(var _0x3c7a63=0x0,_0x2c3074,_0x46d56c,_0x9691ad=0x0;_0x46d56c=_0x9bf8c2['charAt'](_0x9691ad++);~_0x46d56c&&(_0x2c3074=_0x3c7a63%0x4?_0x2c3074*0x40+_0x46d56c:_0x46d56c,_0x3c7a63++%0x4)?_0x257a38+=String['fromCharCode'](0xff&_0x2c3074>>(-0x2*_0x3c7a63&0x6)):0x0){_0x46d56c=_0x39471c['indexOf'](_0x46d56c);}for(var _0xbf1533=0x0,_0x1909a3=_0x257a38['length'];_0xbf1533<_0x1909a3;_0xbf1533++){_0x3809f1+='%'+('00'+_0x257a38['charCodeAt'](_0xbf1533)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3809f1);};_0xe2c6['jUNCIq']=_0x44c08b,_0xe2c6['OPtjhq']={},_0xe2c6['ebmfdk']=!![];}var _0x5da626=_0xa41a20[0x0],_0x25d998=_0x5089c4+_0x5da626,_0x4ed252=_0xe2c6['OPtjhq'][_0x25d998];return!_0x4ed252?(_0xe2c684=_0xe2c6['jUNCIq'](_0xe2c684),_0xe2c6['OPtjhq'][_0x25d998]=_0xe2c684):_0xe2c684=_0x4ed252,_0xe2c684;}function _0xa41a(){var _0x108249=['mtC2mty2nffgtLbhqW','nZyWmJyYm3jYu1bPuq','ndG2nZmYzNjLweXU','mtK5nZuYA1LHy21o','mtu4odK0sKXHC1fN','nda4mteXnMvIuNvZEa','mZy0mtG0mgTquvb5Aq'];_0xa41a=function(){return _0x108249;};return _0xa41a();}export{flattenLocale,unflattenLocale,hashLocaleJson,extractJsonObject}from'./locale-json';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function _0x22cd(_0x23c39a,_0x1bed6a){_0x23c39a=_0x23c39a-0x134;const _0x4a3a64=_0x4a3a();let _0x22cd64=_0x4a3a64[_0x23c39a];if(_0x22cd['IoMmOq']===undefined){var _0x1b56c0=function(_0x3d47b1){const _0x244446='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xd0a0d9='',_0xb71c0a='';for(let _0x4cbcef=0x0,_0x144eee,_0x5ce7dd,_0x52b931=0x0;_0x5ce7dd=_0x3d47b1['charAt'](_0x52b931++);~_0x5ce7dd&&(_0x144eee=_0x4cbcef%0x4?_0x144eee*0x40+_0x5ce7dd:_0x5ce7dd,_0x4cbcef++%0x4)?_0xd0a0d9+=String['fromCharCode'](0xff&_0x144eee>>(-0x2*_0x4cbcef&0x6)):0x0){_0x5ce7dd=_0x244446['indexOf'](_0x5ce7dd);}for(let _0x101dfc=0x0,_0x13aab8=_0xd0a0d9['length'];_0x101dfc<_0x13aab8;_0x101dfc++){_0xb71c0a+='%'+('00'+_0xd0a0d9['charCodeAt'](_0x101dfc)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xb71c0a);};_0x22cd['EvHIeV']=_0x1b56c0,_0x22cd['fPqyQH']={},_0x22cd['IoMmOq']=!![];}const _0xc2ec95=_0x4a3a64[0x0],_0xc90e34=_0x23c39a+_0xc2ec95,_0x56c88e=_0x22cd['fPqyQH'][_0xc90e34];return!_0x56c88e?(_0x22cd64=_0x22cd['EvHIeV'](_0x22cd64),_0x22cd['fPqyQH'][_0xc90e34]=_0x22cd64):_0x22cd64=_0x56c88e,_0x22cd64;}(function(_0x29587e,_0x9fad8d){const _0x37e143=_0x22cd,_0x408788=_0x29587e();while(!![]){try{const _0x317ba0=parseInt(_0x37e143(0x151))/0x1*(-parseInt(_0x37e143(0x148))/0x2)+parseInt(_0x37e143(0x144))/0x3*(parseInt(_0x37e143(0x14e))/0x4)+parseInt(_0x37e143(0x13a))/0x5*(-parseInt(_0x37e143(0x14a))/0x6)+-parseInt(_0x37e143(0x13b))/0x7*(parseInt(_0x37e143(0x150))/0x8)+parseInt(_0x37e143(0x149))/0x9+parseInt(_0x37e143(0x13d))/0xa*(parseInt(_0x37e143(0x147))/0xb)+-parseInt(_0x37e143(0x139))/0xc*(-parseInt(_0x37e143(0x14b))/0xd);if(_0x317ba0===_0x9fad8d)break;else _0x408788['push'](_0x408788['shift']());}catch(_0x56604a){_0x408788['push'](_0x408788['shift']());}}}(_0x4a3a,0x8886d));function _0x4a3a(){const _0x36db5e=['quKG6l+u5zUE56M65yAf5A65','nJG1odK2s0vzu2fY','mtCXtM9oyKXi','zgLNzxn0','Bwf0y2G','C2HHmJu2','C2XPy2u','B2jQzwn0','CgfYC2u','BgvUz3rO','AM9PBG','nde2ntiYnhnutwH5va','mZG1zvnWq3DJ','nJnluhHVs2W','A2v5CW','nZyWr21rrwLd','DhjPBq','BwfW','C3rYAw5N','quKG6l+u5zUE5PEG5Rov6kEJ5P6q5lI6iePtt04G5A+56lgH','Aw5KzxHpzG','BgfZDeLUzgv4t2y','nJaWmJi4rhjjtfDR','zw50CMLLCW','C3bSAxq','mtm3nZmXr1LUB1bS','odeWmNLfAgjrAW','nJmYnJeWv3zqu25Q','mtG2nZHsAfbhwwG','mZLSEMfcqKW','AxnbCNjHEq','Agv4','nerSBgzNqW'];_0x4a3a=function(){return _0x36db5e;};return _0x4a3a();}import{createHash}from'node:crypto';export function flattenLocale(_0xd0a0d9,_0xb71c0a=''){const _0x21dab4=_0x22cd,_0x4cbcef={};for(const [_0x144eee,_0x5ce7dd]of Object[_0x21dab4(0x145)](_0xd0a0d9)){const _0x52b931=_0xb71c0a?_0xb71c0a+'.'+_0x144eee:_0x144eee;if(_0x5ce7dd!=null&&typeof _0x5ce7dd===_0x21dab4(0x135)&&!Array['isArray'](_0x5ce7dd))Object['assign'](_0x4cbcef,flattenLocale(_0x5ce7dd,_0x52b931));else{if(typeof _0x5ce7dd===_0x21dab4(0x140))_0x4cbcef[_0x52b931]=_0x5ce7dd;else _0x5ce7dd!=null&&(_0x4cbcef[_0x52b931]=String(_0x5ce7dd));}}return _0x4cbcef;}export function unflattenLocale(_0x101dfc){const _0xf515aa=_0x22cd,_0x13aab8={};for(const [_0x2d6233,_0x587995]of Object[_0xf515aa(0x145)](_0x101dfc)){const _0x48eef1=_0x2d6233[_0xf515aa(0x146)]('.')['filter'](Boolean);if(!_0x48eef1[_0xf515aa(0x137)])continue;let _0x1b22ea=_0x13aab8;for(let _0x1b5885=0x0;_0x1b5885<_0x48eef1['length']-0x1;_0x1b5885++){const _0x5d857b=_0x48eef1[_0x1b5885],_0x486b1a=_0x1b22ea[_0x5d857b];(!_0x486b1a||typeof _0x486b1a!=='object'||Array[_0xf515aa(0x14c)](_0x486b1a))&&(_0x1b22ea[_0x5d857b]={}),_0x1b22ea=_0x1b22ea[_0x5d857b];}_0x1b22ea[_0x48eef1[_0x48eef1[_0xf515aa(0x137)]-0x1]]=_0x587995;}return _0x13aab8;}export function hashLocaleJson(_0x1314a6){const _0xdded32=_0x22cd,_0x5eaffd=flattenLocale(_0x1314a6),_0x1c658d=Object[_0xdded32(0x13c)](_0x5eaffd)['sort'](),_0x2c20c7=_0x1c658d[_0xdded32(0x13f)](_0x5662c5=>_0x5662c5+'='+_0x5eaffd[_0x5662c5])[_0xdded32(0x138)]('\x0a');return createHash(_0xdded32(0x154))['update'](_0x2c20c7)[_0xdded32(0x152)](_0xdded32(0x14d))[_0xdded32(0x134)](0x0,0x20);}export function extractJsonObject(_0x102227){const _0xa50bde=_0x22cd,_0x584873=String(_0x102227||'')[_0xa50bde(0x13e)]();if(!_0x584873)throw new Error(_0xa50bde(0x14f));try{const _0x59f15f=JSON['parse'](_0x584873);if(_0x59f15f&&typeof _0x59f15f===_0xa50bde(0x135)&&!Array[_0xa50bde(0x14c)](_0x59f15f))return _0x59f15f;}catch{}const _0x350cc7=_0x584873[_0xa50bde(0x153)](/```(?:json)?\s*([\s\S]*?)```/i);if(_0x350cc7?.[0x1]){const _0x4de1f5=JSON[_0xa50bde(0x136)](_0x350cc7[0x1][_0xa50bde(0x13e)]());if(_0x4de1f5&&typeof _0x4de1f5===_0xa50bde(0x135)&&!Array[_0xa50bde(0x14c)](_0x4de1f5))return _0x4de1f5;}const _0x551e5b=_0x584873[_0xa50bde(0x142)]('{'),_0x1b3dee=_0x584873[_0xa50bde(0x143)]('}');if(_0x551e5b>=0x0&&_0x1b3dee>_0x551e5b){const _0x43cbfb=JSON[_0xa50bde(0x136)](_0x584873[_0xa50bde(0x134)](_0x551e5b,_0x1b3dee+0x1));if(_0x43cbfb&&typeof _0x43cbfb===_0xa50bde(0x135)&&!Array[_0xa50bde(0x14c)](_0x43cbfb))return _0x43cbfb;}throw new Error(_0xa50bde(0x141));}
|
package/dist/shared/tree.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function _0x1a34(_0x1ac7e9,_0x59b9bd){_0x1ac7e9=_0x1ac7e9-0x175;const _0x38f6fd=_0x38f6();let _0x1a3407=_0x38f6fd[_0x1ac7e9];if(_0x1a34['zTPIYT']===undefined){var _0x1ddea9=function(_0x28656b){const _0x4a0b9a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3dc499='',_0x228580='';for(let _0x50dcd5=0x0,_0x5dd04a,_0x14f680,_0x3983df=0x0;_0x14f680=_0x28656b['charAt'](_0x3983df++);~_0x14f680&&(_0x5dd04a=_0x50dcd5%0x4?_0x5dd04a*0x40+_0x14f680:_0x14f680,_0x50dcd5++%0x4)?_0x3dc499+=String['fromCharCode'](0xff&_0x5dd04a>>(-0x2*_0x50dcd5&0x6)):0x0){_0x14f680=_0x4a0b9a['indexOf'](_0x14f680);}for(let _0x4cbd85=0x0,_0x3aa9b6=_0x3dc499['length'];_0x4cbd85<_0x3aa9b6;_0x4cbd85++){_0x228580+='%'+('00'+_0x3dc499['charCodeAt'](_0x4cbd85)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x228580);};_0x1a34['kNhsAQ']=_0x1ddea9,_0x1a34['dLVehb']={},_0x1a34['zTPIYT']=!![];}const _0x4bac65=_0x38f6fd[0x0],_0xf7b1be=_0x1ac7e9+_0x4bac65,_0x2e60e4=_0x1a34['dLVehb'][_0xf7b1be];return!_0x2e60e4?(_0x1a3407=_0x1a34['kNhsAQ'](_0x1a3407),_0x1a34['dLVehb'][_0xf7b1be]=_0x1a3407):_0x1a3407=_0x2e60e4,_0x1a3407;}const _0x18be27=_0x1a34;function _0x38f6(){const _0x3edd74=['C29YDa','CgfYzw50swq','ChvZAa','AgfZ','DMfSDwvZ','ndm5nZj4Bw1HveG','mtC2odi3nuPPvfrpzG','BgvUz3rO','mtqWugDKtxLJ','ogj3uxz0uG','y2HPBgrYzw4','m0XjBu5xAa','B3jKzxjoDw0','yxnJ','nZu5nte0vwvjAKPh','mti0mJu4mMj2BeLKwq','z2v0','zgvZyW','mty2nZi1nJbVBMzQv2O','ndy3nJbLrMHLCK4','mJe4mtKWmgXLzML0DG'];_0x38f6=function(){return _0x3edd74;};return _0x38f6();}(function(_0x2e9bc4,_0x13092e){const _0x4db1ee=_0x1a34,_0xb49e=_0x2e9bc4();while(!![]){try{const _0x7532b1=-parseInt(_0x4db1ee(0x188))/0x1+parseInt(_0x4db1ee(0x17c))/0x2*(-parseInt(_0x4db1ee(0x179))/0x3)+-parseInt(_0x4db1ee(0x181))/0x4*(parseInt(_0x4db1ee(0x176))/0x5)+-parseInt(_0x4db1ee(0x17d))/0x6+-parseInt(_0x4db1ee(0x182))/0x7+parseInt(_0x4db1ee(0x177))/0x8*(-parseInt(_0x4db1ee(0x189))/0x9)+parseInt(_0x4db1ee(0x180))/0xa;if(_0x7532b1===_0x13092e)break;else _0xb49e['push'](_0xb49e['shift']());}catch(_0x31458a){_0xb49e['push'](_0xb49e['shift']());}}}(_0x38f6,0x310e7));export function deepTree(_0x3dc499,_0x228580=_0x18be27(0x17b)){const _0x339dc0=_0x18be27,_0x50dcd5=new Map();for(const _0x3983df of _0x3dc499){if(_0x3983df['id']==null)continue;_0x50dcd5['set'](_0x3983df['id'],{..._0x3983df,'children':[]});}const _0x5dd04a=[];for(const _0x4cbd85 of _0x50dcd5[_0x339dc0(0x187)]()){const _0x3aa9b6=_0x4cbd85[_0x339dc0(0x184)];_0x3aa9b6!=null&&_0x3aa9b6!==''&&_0x50dcd5[_0x339dc0(0x186)](_0x3aa9b6)?_0x50dcd5[_0x339dc0(0x17e)](_0x3aa9b6)['children']['push'](_0x4cbd85):_0x5dd04a['push'](_0x4cbd85);}const _0x14f680=_0x237ae6=>{const _0x52b762=_0x339dc0;_0x237ae6[_0x52b762(0x183)]((_0x29103b,_0x5e2948)=>{const _0x20c5b2=_0x52b762,_0x40ab64=_0x29103b[_0x20c5b2(0x17a)]??0x0,_0x3b10d3=_0x5e2948[_0x20c5b2(0x17a)]??0x0,_0x321f15=_0x228580===_0x20c5b2(0x17f)?_0x3b10d3-_0x40ab64:_0x40ab64-_0x3b10d3;return _0x321f15||Number(_0x29103b['id'])-Number(_0x5e2948['id']);});for(const _0x520b35 of _0x237ae6)if(_0x520b35[_0x52b762(0x178)]?.[_0x52b762(0x175)])_0x14f680(_0x520b35[_0x52b762(0x178)]);};return _0x14f680(_0x5dd04a),_0x5dd04a;}export function flattenTree(_0x225912,_0x4bd03c,_0x4278e4=0x0,_0x441ce5=[]){const _0x269a45=_0x18be27;for(const _0x2743fe of _0x225912){const _0x1765e5=_0x2743fe[_0x269a45(0x178)]||[];_0x441ce5[_0x269a45(0x185)]({..._0x2743fe,'depth':_0x4278e4,'hasChildren':_0x1765e5['length']>0x0});if(_0x1765e5[_0x269a45(0x175)]&&_0x4bd03c['has'](_0x2743fe['id']))flattenTree(_0x1765e5,_0x4bd03c,_0x4278e4+0x1,_0x441ce5);}return _0x441ce5;}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AiProtocolAdapter } from '../types';
|
|
2
|
+
/** 基于 openai 透传,仅替换鉴权头(Anthropic Messages API) */
|
|
3
|
+
export declare const anthropicAdapter: AiProtocolAdapter;
|
|
4
|
+
/** Gemini generateContent:透传 + x-goog-api-key 或 ?key= */
|
|
5
|
+
export declare const geminiAdapter: AiProtocolAdapter;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AiAdapterContext } from '../types';
|
|
2
|
+
export type AuthStyle = 'openai' | 'anthropic' | 'gemini';
|
|
3
|
+
export declare function buildUpstreamHeaders(ctx: AiAdapterContext, style: AuthStyle, extra?: Record<string, string>): Record<string, string>;
|
|
4
|
+
export declare function appendGeminiQueryKey(url: string, ctx: AiAdapterContext): string;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AiCapability, AiProtocolAdapter, AiResultMode } from '../types';
|
|
2
|
+
/** OpenAI 兼容协议(HTTP 透传 + 可配置/默认响应规范化) */
|
|
3
|
+
export declare const openaiCompatibleAdapter: AiProtocolAdapter;
|
|
4
|
+
export declare function assertModeSupported(capability: AiCapability, mode: AiResultMode): void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** 调用记录:请求快照(模型 / 能力 / input) */
|
|
2
|
+
export declare function buildAiCallLogRequest(modelCode: string, capability: string, input: Record<string, unknown> | null | undefined, extra?: Record<string, unknown>): Record<string, unknown>;
|
|
3
|
+
/** 调用记录:响应快照(data / usage / error / raw) */
|
|
4
|
+
export declare function buildAiCallLogResult(payload: {
|
|
5
|
+
ok: boolean;
|
|
6
|
+
data?: Record<string, unknown> | null;
|
|
7
|
+
usage?: Record<string, unknown> | null;
|
|
8
|
+
error?: {
|
|
9
|
+
code: string;
|
|
10
|
+
message: string;
|
|
11
|
+
} | null;
|
|
12
|
+
raw?: unknown;
|
|
13
|
+
}): Record<string, unknown>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI 协议层(adapters / transport / normalize)
|
|
3
|
+
* 宿主 Gateway / 实体 / CRUD 仍留在 service modules
|
|
4
|
+
*/
|
|
5
|
+
export * from './types';
|
|
6
|
+
export * from './transport';
|
|
7
|
+
export * from './normalize';
|
|
8
|
+
export { getAiAdapter, listAiProtocols } from './adapters';
|
|
9
|
+
export { sseResponse } from './sse';
|
|
10
|
+
export { buildAiCallLogRequest, buildAiCallLogResult } from './call-log-helpers';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AiAdapterContext, AiCapability, AiInvokeData, AiInvokeResult, AiResponseSpec, AiResultMode, AiUsage } from './types';
|
|
2
|
+
/** 各 capability 的 OpenAI 兼容默认响应映射 */
|
|
3
|
+
export declare function defaultResponseSpec(capability: AiCapability): AiResponseSpec | null;
|
|
4
|
+
/** 将上游 JSON 规范化为统一 data / usage */
|
|
5
|
+
export declare function normalizeSyncData(capability: AiCapability, ctx: AiAdapterContext, raw: Record<string, unknown>): {
|
|
6
|
+
data: AiInvokeData;
|
|
7
|
+
usage?: AiUsage;
|
|
8
|
+
};
|
|
9
|
+
export declare function buildSyncResult(ok: boolean, capability: AiCapability, model: string, mode: AiResultMode, payload: {
|
|
10
|
+
data?: AiInvokeData;
|
|
11
|
+
usage?: AiUsage;
|
|
12
|
+
error?: {
|
|
13
|
+
code: string;
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
16
|
+
raw?: unknown;
|
|
17
|
+
}): AiInvokeResult;
|
|
18
|
+
export declare function buildBinarySyncData(buf: Buffer, spec: AiResponseSpec | null): AiInvokeData;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE:把 AsyncGenerator chunk 写成 text/event-stream Response
|
|
3
|
+
*/
|
|
4
|
+
export declare function sseResponse(stream: AsyncGenerator<{
|
|
5
|
+
type: string;
|
|
6
|
+
text?: string;
|
|
7
|
+
data?: Record<string, unknown>;
|
|
8
|
+
error?: {
|
|
9
|
+
code: string;
|
|
10
|
+
message: string;
|
|
11
|
+
};
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}>): Response;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AiAdapterContext, AiInvokeInput } from './types';
|
|
2
|
+
/** 网关内部字段,不进入上游请求体 */
|
|
3
|
+
export declare const INTERNAL_BODY_KEYS: Set<string>;
|
|
4
|
+
export declare function joinUrl(base: string, path: string): string;
|
|
5
|
+
export declare function requirePath(ctx: AiAdapterContext): string;
|
|
6
|
+
export declare function httpMethod(ctx: AiAdapterContext): string;
|
|
7
|
+
export declare function resolvePath(ctx: AiAdapterContext): string;
|
|
8
|
+
export declare function readUpstreamError(res: Response): Promise<string>;
|
|
9
|
+
export declare function mergeInput(input: AiInvokeInput, defaults?: Record<string, unknown> | null): Record<string, unknown>;
|
|
10
|
+
/** input/defaults 原样透传;覆盖 model 与 override(如 stream) */
|
|
11
|
+
export declare function toUpstreamJson(ctx: AiAdapterContext, body: Record<string, unknown>, override?: Record<string, unknown>): Record<string, unknown>;
|
|
12
|
+
export declare function appendFormFields(form: FormData, body: Record<string, unknown>, skip: Set<string>): void;
|
|
13
|
+
export declare function postUpstreamJson(ctx: AiAdapterContext, payload: Record<string, unknown>, headerExtra?: Record<string, string>): Promise<Response>;
|
|
14
|
+
export declare function postUpstreamMultipart(ctx: AiAdapterContext, form: FormData, headerExtra?: Record<string, string>): Promise<Response>;
|
|
15
|
+
/** 按 contentType 发主请求(json 或 multipart+model) */
|
|
16
|
+
export declare function postUpstream(ctx: AiAdapterContext, body: Record<string, unknown>, override?: Record<string, unknown>): Promise<Response>;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/** 统一 AI 调用类型(宿主 Gateway) */
|
|
2
|
+
export type AiCapability = 'chat' | 'image' | 'video' | 'audio_tts' | 'audio_stt' | 'embed';
|
|
3
|
+
export type AiResultMode = 'sync' | 'stream' | 'async';
|
|
4
|
+
/** 请求体 Content-Type 策略 */
|
|
5
|
+
export type AiContentType = 'json' | 'multipart';
|
|
6
|
+
/**
|
|
7
|
+
* 异步任务契约(模型配置;缺 pollPath 时网关直接报错)
|
|
8
|
+
*/
|
|
9
|
+
export type AiAsyncSpec = {
|
|
10
|
+
/** 创建响应取上游任务 id 的字段优先级,默认 video_id → task_id → id */
|
|
11
|
+
idFields?: string[];
|
|
12
|
+
/** 轮询路径模板,必填;{id} 替换为上游任务 id */
|
|
13
|
+
pollPath: string;
|
|
14
|
+
pollMethod?: string;
|
|
15
|
+
/** 成功时结果 URL 的 JSON 路径,如 metadata.url */
|
|
16
|
+
resultUrlPath?: string;
|
|
17
|
+
/** 多 URL 路径(与 resultUrlPath 二选一或并用) */
|
|
18
|
+
resultUrlPaths?: string[];
|
|
19
|
+
/** 状态字段名,默认 status */
|
|
20
|
+
statusField?: string;
|
|
21
|
+
/** 任务超时关单(ms),默认 3600000 */
|
|
22
|
+
taskTimeoutMs?: number;
|
|
23
|
+
/** 异步成功资源 MIME */
|
|
24
|
+
assetMime?: string;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* 上游响应 → 统一 data 的内置映射(按 capability 默认)
|
|
28
|
+
*/
|
|
29
|
+
export type AiResponseSpec = {
|
|
30
|
+
textPath?: string;
|
|
31
|
+
messagesPath?: string;
|
|
32
|
+
toolCallsPath?: string;
|
|
33
|
+
assetsPath?: string;
|
|
34
|
+
assetUrlField?: string;
|
|
35
|
+
assetB64Field?: string;
|
|
36
|
+
assetUrlPath?: string;
|
|
37
|
+
assetB64Path?: string;
|
|
38
|
+
assetMime?: string;
|
|
39
|
+
/** 多资源路径,逐项 getJsonPath */
|
|
40
|
+
assetPaths?: string[];
|
|
41
|
+
embeddingPath?: string;
|
|
42
|
+
inputTokensPath?: string;
|
|
43
|
+
outputTokensPath?: string;
|
|
44
|
+
totalTokensPath?: string;
|
|
45
|
+
/** 响应体为二进制(如 TTS) */
|
|
46
|
+
binary?: boolean;
|
|
47
|
+
binaryMime?: string;
|
|
48
|
+
binaryFileName?: string;
|
|
49
|
+
};
|
|
50
|
+
export type AiChatMessage = {
|
|
51
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
52
|
+
/** 文本,或多模态 content blocks(含 image_url 等) */
|
|
53
|
+
content: string | Array<Record<string, unknown>>;
|
|
54
|
+
tool_calls?: unknown;
|
|
55
|
+
tool_call_id?: string;
|
|
56
|
+
name?: string;
|
|
57
|
+
};
|
|
58
|
+
export type AiAsset = {
|
|
59
|
+
url?: string;
|
|
60
|
+
b64?: string;
|
|
61
|
+
mime?: string;
|
|
62
|
+
fileName?: string;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* 上游请求体(OpenAI 兼容规范字段由调用方按模型文档填写)。
|
|
66
|
+
* 适配器原样透传,不裁剪、不填默认业务字段。
|
|
67
|
+
* 例外:`audioUrl` 为网关拉文件用(stt),不会进入上游 JSON。
|
|
68
|
+
*/
|
|
69
|
+
export type AiInvokeInput = {
|
|
70
|
+
messages?: AiChatMessage[];
|
|
71
|
+
/** stt:网关拉取后以上游 multipart `file` 上传 */
|
|
72
|
+
audioUrl?: string;
|
|
73
|
+
[key: string]: unknown;
|
|
74
|
+
};
|
|
75
|
+
type AiCallOptions = {
|
|
76
|
+
signal?: AbortSignal;
|
|
77
|
+
/** 覆盖模型/默认超时 */
|
|
78
|
+
timeoutMs?: number;
|
|
79
|
+
/** chat:显式指定 sync/stream(OpenAI 代理用) */
|
|
80
|
+
stream?: boolean;
|
|
81
|
+
};
|
|
82
|
+
/** 统一调用入参(无 mode;由模型配置推断) */
|
|
83
|
+
export type AiCallRequest = {
|
|
84
|
+
/** 有则仅查询/刷新异步任务,model 可从记录解析 */
|
|
85
|
+
taskId: string;
|
|
86
|
+
model?: string;
|
|
87
|
+
capability?: AiCapability;
|
|
88
|
+
input?: AiInvokeInput;
|
|
89
|
+
options?: AiCallOptions;
|
|
90
|
+
} | {
|
|
91
|
+
/** ai_model.code */
|
|
92
|
+
model: string;
|
|
93
|
+
capability?: AiCapability;
|
|
94
|
+
input?: AiInvokeInput;
|
|
95
|
+
taskId?: string;
|
|
96
|
+
options?: AiCallOptions;
|
|
97
|
+
};
|
|
98
|
+
export type AiInvokeData = {
|
|
99
|
+
text?: string;
|
|
100
|
+
messages?: AiChatMessage[];
|
|
101
|
+
assets?: AiAsset[];
|
|
102
|
+
embedding?: number[];
|
|
103
|
+
taskId?: string;
|
|
104
|
+
status?: string;
|
|
105
|
+
progress?: number;
|
|
106
|
+
[key: string]: unknown;
|
|
107
|
+
};
|
|
108
|
+
export type AiUsage = {
|
|
109
|
+
inputTokens?: number;
|
|
110
|
+
outputTokens?: number;
|
|
111
|
+
totalTokens?: number;
|
|
112
|
+
};
|
|
113
|
+
export type AiInvokeResult = {
|
|
114
|
+
ok: boolean;
|
|
115
|
+
capability: AiCapability;
|
|
116
|
+
model: string;
|
|
117
|
+
/** 实际采用的结果形态(只读) */
|
|
118
|
+
mode: AiResultMode;
|
|
119
|
+
data?: AiInvokeData;
|
|
120
|
+
usage?: AiUsage;
|
|
121
|
+
error?: {
|
|
122
|
+
code: string;
|
|
123
|
+
message: string;
|
|
124
|
+
};
|
|
125
|
+
raw?: unknown;
|
|
126
|
+
};
|
|
127
|
+
export type AiStreamChunk = {
|
|
128
|
+
type: 'delta' | 'done' | 'error';
|
|
129
|
+
text?: string;
|
|
130
|
+
data?: AiInvokeData;
|
|
131
|
+
usage?: AiUsage;
|
|
132
|
+
error?: {
|
|
133
|
+
code: string;
|
|
134
|
+
message: string;
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
export type AiCallJsonResult = AiInvokeResult & {
|
|
138
|
+
kind: 'json';
|
|
139
|
+
};
|
|
140
|
+
export type AiCallStreamResult = {
|
|
141
|
+
kind: 'stream';
|
|
142
|
+
capability: AiCapability;
|
|
143
|
+
model: string;
|
|
144
|
+
mode: 'stream';
|
|
145
|
+
stream: AsyncGenerator<AiStreamChunk>;
|
|
146
|
+
};
|
|
147
|
+
export type AiCallResult = AiCallJsonResult | AiCallStreamResult;
|
|
148
|
+
export type AiAdapterContext = {
|
|
149
|
+
baseUrl: string;
|
|
150
|
+
apiKey: string;
|
|
151
|
+
/** 上游 model 字段,取自 ai_model.code */
|
|
152
|
+
modelId: string;
|
|
153
|
+
/** 请求路径,如 /v1/chat/completions(必填) */
|
|
154
|
+
path: string;
|
|
155
|
+
/** HTTP 方法,如 POST */
|
|
156
|
+
method: string;
|
|
157
|
+
contentType: AiContentType;
|
|
158
|
+
asyncSpec?: AiAsyncSpec | null;
|
|
159
|
+
extra?: Record<string, unknown> | null;
|
|
160
|
+
defaults?: Record<string, unknown> | null;
|
|
161
|
+
signal?: AbortSignal;
|
|
162
|
+
};
|
|
163
|
+
export type AiPollTaskResult = {
|
|
164
|
+
status: 'pending' | 'running' | 'succeeded' | 'failed';
|
|
165
|
+
progress?: number;
|
|
166
|
+
result?: AiInvokeData;
|
|
167
|
+
error?: string;
|
|
168
|
+
raw?: unknown;
|
|
169
|
+
};
|
|
170
|
+
export type AiProtocolAdapter = {
|
|
171
|
+
protocol: string;
|
|
172
|
+
invoke(capability: AiCapability, mode: AiResultMode, input: AiInvokeInput, ctx: AiAdapterContext): Promise<AiInvokeResult>;
|
|
173
|
+
stream?(capability: AiCapability, input: AiInvokeInput, ctx: AiAdapterContext): AsyncGenerator<AiStreamChunk>;
|
|
174
|
+
pollTask?(capability: AiCapability, upstreamId: string, ctx: AiAdapterContext): Promise<AiPollTaskResult>;
|
|
175
|
+
};
|
|
176
|
+
/** 上游超时:sync=360s,async=5s;stream 无默认超时 */
|
|
177
|
+
export declare const AI_TIMEOUT_DEFAULT_MS = 5000;
|
|
178
|
+
export declare const AI_TIMEOUT_SYNC_MS = 360000;
|
|
179
|
+
export declare function inferAiMode(capability: AiCapability, resultModes: string[] | null | undefined): AiResultMode;
|
|
180
|
+
export declare function resolveAiTimeoutMs(mode: AiResultMode, timeoutMs?: number, modelTimeoutMs?: number): number | null;
|
|
181
|
+
export declare function mergeAbortSignal(timeoutMs: number | null, signal?: AbortSignal): AbortSignal | undefined;
|
|
182
|
+
/** defaults 中不透传上游的元字段 */
|
|
183
|
+
export declare function stripAiDefaultMeta(defaults?: Record<string, unknown> | null): Record<string, unknown> | null;
|
|
184
|
+
export declare function normalizeAiContentType(raw: unknown): AiContentType;
|
|
185
|
+
/** 从对象按 a.b.c 取值 */
|
|
186
|
+
export declare function getJsonPath(obj: unknown, path: string): unknown;
|
|
187
|
+
export declare function pickUpstreamTaskId(raw: Record<string, unknown>, idFields?: string[] | null): string;
|
|
188
|
+
export declare function requireAsyncSpec(asyncSpec: AiAsyncSpec | null | undefined): AiAsyncSpec;
|
|
189
|
+
export declare function resolvePollUrl(baseUrl: string, pollPath: string, upstreamId: string): string;
|
|
190
|
+
export declare function mapUpstreamTaskStatus(raw?: string): AiPollTaskResult['status'];
|
|
191
|
+
export declare function isAiCapability(v: string): v is AiCapability;
|
|
192
|
+
/** 单能力模型可省略 capability */
|
|
193
|
+
export declare function resolveAiCapability(requested: string | undefined, modelCapabilities: string[] | null | undefined): AiCapability;
|
|
194
|
+
export {};
|
package/dist/src/core/index.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export { getEnv } from '../comm/env';
|
|
|
15
15
|
export { Logger, CommException, isCommException } from '../logger';
|
|
16
16
|
export { Eps, isEpsEnabled, BaseController, RES_CODE, Controller, Get, Post, Put, Delete, Patch, Body, Query, Param, Public, Perms, IgnorePerms, Use, listControllers, isPublicHttpRoute, clearPublicRouteCache, collectPublicRouteKeys, } from '../routing';
|
|
17
17
|
export type { ApiFail, ApiResult, ApiSuccess, ControllerCrudOptions, ControllerMeta, ControllerRouteMeta, ControllerSide, CrudApi, CrudBeforeFn, CrudRegistrar, EpsApiItem, EpsColumn, EpsEntity, EpsModuleMap, HttpMethod, InsertParamFn, QueryExtendFn, QueryExtendQb, QueryFieldRef, QueryJoin, QueryJoinType, QueryOp, QueryOpCtx, QueryWhereFn, QueryWhereResult, ResCode, RouteMiddleware, RouteParamMeta, RouteParamSource, } from '../routing';
|
|
18
|
-
export { DbStore, baseColumns, BASE_COLUMN_COMMENTS, entitySchemas, columnComments, getColumnComments, syncColumnCommentsToPg, readCrudConfig, resolveSoftDelete, resolveUpsert, Repository, getRepository, InjectRepository, BaseService, q, compactWhere, needsAdvancedQuery, buildQueryOp, queryWithOp, attachCrudRoutes, isTenantEnabled, noTenant, normalizeHost, resolveTenantScope, tableHasDepartmentId, resolveDataScope, applyDataScopeWhere, applyRowScopes, noDataScope, } from '../orm';
|
|
18
|
+
export { DbStore, baseColumns, BASE_COLUMN_COMMENTS, entitySchemas, columnComments, getColumnComments, listColumnCommentTables, syncColumnCommentsToPg, readCrudConfig, resolveSoftDelete, resolveUpsert, Repository, getRepository, InjectRepository, BaseService, q, compactWhere, needsAdvancedQuery, buildQueryOp, queryWithOp, attachCrudRoutes, isTenantEnabled, noTenant, normalizeHost, resolveTenantScope, tableHasDepartmentId, resolveDataScope, applyDataScopeWhere, applyRowScopes, noDataScope, } from '../orm';
|
|
19
19
|
export type { CrudUpsertMode, CrudModifyType, CrudWriteOptions, CrudTrashQueryOptions, CrudDeleteOptions, PageQuery, PagePagination, PageResult, } from '../orm';
|
|
20
20
|
export { BasePlugin, loadPluginClass, loadPluginClassFromPath, loadModuleHandlers, loadModuleHandlersFromPath, readPluginScript, resolvePluginServerPath, pDataPath, pPluginPath, pModulesPath, pModulePath, pLicensesPath, pLicensePath, ModuleRegistry, microApps, createModuleGateway, DEFAULT_MARKET_PUBLIC_KEY_B64, newMarketId, newInstallNonce, stableStringify, resolveMarketPublicKey, resolveMarketPrivateKey, ed25519Sign, ed25519Verify, generateMarketKeyPair, pricingFromPrice, buildMarketSigPayload, signMarketSigPayload, verifyMarketSigPayload, issueLicenseFile, parseLicenseFile, verifyLicenseFile, hashZipEntries, readZipManifest, readMarketSig, sealVomeBuffer, verifySealedVome, MARKET_LIC_ENTRY, readZipMarketLicense, attachMarketLicense, assertModuleInstallAllowed, assertModuleDirAllowed, peekMarketPackage, installModuleFromZip, uninstallModuleFiles, isSeatEnforced, isMarketSigEnforced, DEFAULT_SEAT_API_BASE, DEFAULT_LICENSE_ISSUE_URL, fetchOfficialSignedLicense, deriveHostIdentity, getHostIdentity, MARKET_SEAT_DEFAULTS, ensureSiteId, syncModuleSeat, syncAllModuleSeats, getModuleSeatStatus, listModuleSeatStatuses, isModuleSeatBlocked, assertModuleSeatActive, formatSeatDisplay, startMarketSeatHeartbeat, stopMarketSeatHeartbeat, bootstrapInstalledModules, } from '../ext';
|
|
21
21
|
export type { HostIdentity } from '../ext';
|
package/dist/src/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* 管理端框架:`@vome-core/admin`
|
|
6
6
|
*/
|
|
7
7
|
export { merge, deepTree, flattenTree, RES_CODE } from './shared';
|
|
8
|
+
export { flattenLocale, unflattenLocale, hashLocaleJson, extractJsonObject, } from './shared';
|
|
8
9
|
export type { Loose, PageQuery, PagePagination, PageResult, ResCode, ApiSuccess, ApiFail, ApiResult, } from './shared';
|
|
9
10
|
/** 与 package.json version 同步 */
|
|
10
11
|
export declare const version: string;
|
package/dist/src/orm/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
export { DbStore } from './db-store';
|
|
10
10
|
export { baseColumns, BASE_COLUMN_COMMENTS } from './base-columns';
|
|
11
11
|
export { entitySchemas } from './entity-schema';
|
|
12
|
-
export { columnComments, getColumnComments, syncColumnCommentsToPg } from './column-comments';
|
|
12
|
+
export { columnComments, getColumnComments, listColumnCommentTables, syncColumnCommentsToPg } from './column-comments';
|
|
13
13
|
export { readCrudConfig, resolveSoftDelete, resolveUpsert, } from './crud-config';
|
|
14
14
|
export { Repository, getRepository, InjectRepository, } from './repository';
|
|
15
15
|
export { BaseService } from './service';
|
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
* 导入时加载宿主 `src/config`;扫描 / IoC / 路由注册在 `App.start()` 中执行。
|
|
5
5
|
* 宿主须:`import 'reflect-metadata'`,并开启 `experimentalDecorators` + `emitDecoratorMetadata`。
|
|
6
6
|
*/
|
|
7
|
-
export { App, appendInjectMeta, BaseController, Body, CommException, Context, Controller, Delete, Eps, isEpsEnabled, Get, getEnv, Inject, Ioc, isCommException, listControllers, isPublicHttpRoute, listProviders, Logger, Param, Patch, Post, Provide, Public, Perms, IgnorePerms, Put, Query, RES_CODE, scanFiles, ScopeEnum, Use, vome, VomeConfig, registerHost, getHostBindings, DbStore, baseColumns, BASE_COLUMN_COMMENTS, entitySchemas, columnComments, getColumnComments, syncColumnCommentsToPg, Repository, getRepository, InjectRepository, BaseService, q, attachCrudRoutes, isTenantEnabled, noTenant, normalizeHost, resolveTenantScope, tableHasDepartmentId, resolveDataScope, applyDataScopeWhere, applyRowScopes, noDataScope, BasePlugin, loadPluginClass, loadPluginClassFromPath, loadModuleHandlers, loadModuleHandlersFromPath, readPluginScript, resolvePluginServerPath, pDataPath, pPluginPath, pModulesPath, pModulePath, pLicensesPath, pLicensePath, ModuleRegistry, microApps, createModuleGateway, defineAuthMacro, DEFAULT_MARKET_PUBLIC_KEY_B64, newMarketId, newInstallNonce, stableStringify, resolveMarketPublicKey, resolveMarketPrivateKey, ed25519Sign, ed25519Verify, generateMarketKeyPair, pricingFromPrice, buildMarketSigPayload, signMarketSigPayload, verifyMarketSigPayload, issueLicenseFile, parseLicenseFile, verifyLicenseFile, hashZipEntries, readZipManifest, readMarketSig, sealVomeBuffer, verifySealedVome, MARKET_LIC_ENTRY, readZipMarketLicense, attachMarketLicense, assertModuleInstallAllowed, assertModuleDirAllowed, peekMarketPackage, installModuleFromZip, uninstallModuleFiles, isSeatEnforced, isMarketSigEnforced, DEFAULT_SEAT_API_BASE, DEFAULT_LICENSE_ISSUE_URL, fetchOfficialSignedLicense, deriveHostIdentity, getHostIdentity, MARKET_SEAT_DEFAULTS, ensureSiteId, syncModuleSeat, syncAllModuleSeats, getModuleSeatStatus, listModuleSeatStatuses, isModuleSeatBlocked, assertModuleSeatActive, formatSeatDisplay, startMarketSeatHeartbeat, stopMarketSeatHeartbeat, bootstrapInstalledModules, } from '../core';
|
|
7
|
+
export { App, appendInjectMeta, BaseController, Body, CommException, Context, Controller, Delete, Eps, isEpsEnabled, Get, getEnv, Inject, Ioc, isCommException, listControllers, isPublicHttpRoute, listProviders, Logger, Param, Patch, Post, Provide, Public, Perms, IgnorePerms, Put, Query, RES_CODE, scanFiles, ScopeEnum, Use, vome, VomeConfig, registerHost, getHostBindings, DbStore, baseColumns, BASE_COLUMN_COMMENTS, entitySchemas, columnComments, getColumnComments, listColumnCommentTables, syncColumnCommentsToPg, Repository, getRepository, InjectRepository, BaseService, q, attachCrudRoutes, isTenantEnabled, noTenant, normalizeHost, resolveTenantScope, tableHasDepartmentId, resolveDataScope, applyDataScopeWhere, applyRowScopes, noDataScope, BasePlugin, loadPluginClass, loadPluginClassFromPath, loadModuleHandlers, loadModuleHandlersFromPath, readPluginScript, resolvePluginServerPath, pDataPath, pPluginPath, pModulesPath, pModulePath, pLicensesPath, pLicensePath, ModuleRegistry, microApps, createModuleGateway, defineAuthMacro, DEFAULT_MARKET_PUBLIC_KEY_B64, newMarketId, newInstallNonce, stableStringify, resolveMarketPublicKey, resolveMarketPrivateKey, ed25519Sign, ed25519Verify, generateMarketKeyPair, pricingFromPrice, buildMarketSigPayload, signMarketSigPayload, verifyMarketSigPayload, issueLicenseFile, parseLicenseFile, verifyLicenseFile, hashZipEntries, readZipManifest, readMarketSig, sealVomeBuffer, verifySealedVome, MARKET_LIC_ENTRY, readZipMarketLicense, attachMarketLicense, assertModuleInstallAllowed, assertModuleDirAllowed, peekMarketPackage, installModuleFromZip, uninstallModuleFiles, isSeatEnforced, isMarketSigEnforced, DEFAULT_SEAT_API_BASE, DEFAULT_LICENSE_ISSUE_URL, fetchOfficialSignedLicense, deriveHostIdentity, getHostIdentity, MARKET_SEAT_DEFAULTS, ensureSiteId, syncModuleSeat, syncAllModuleSeats, getModuleSeatStatus, listModuleSeatStatuses, isModuleSeatBlocked, assertModuleSeatActive, formatSeatDisplay, startMarketSeatHeartbeat, stopMarketSeatHeartbeat, bootstrapInstalledModules, } from '../core';
|
|
8
8
|
export type { HostIdentity, HostBindings, HostLifecycle, HostSocket, HostMiddleware } from '../core';
|
|
9
9
|
export { setControllerScanContext, parseModuleFromPath, } from '../routing/context';
|
|
10
10
|
export { buildExcelBuffer, buildImportTemplateBuffer, parseExcelBuffer, excelFilename, excelResponseHeaders, IMPORT_SKIP_FIELDS, isImportSkipField, } from '../shared/excel';
|
|
11
11
|
export type { ExcelColumn, ExcelFormatCell } from '../shared/excel';
|
|
12
|
+
export { flattenLocale, unflattenLocale, hashLocaleJson, extractJsonObject, } from '../shared/locale-json';
|
|
13
|
+
export * from '../ai';
|
|
12
14
|
export type { ApiFail, ApiResult, ApiSuccess, ClassToken, ContextData, ControllerCrudOptions, ControllerMeta, ControllerRouteMeta, ControllerSide, CrudApi, CrudBeforeFn, CrudRegistrar, CrudUpsertMode, CrudModifyType, CrudWriteOptions, CrudTrashQueryOptions, CrudDeleteOptions, PageQuery, PagePagination, PageResult, PluginManifest, PluginInfo, PluginPayload, PluginCheckResult, ModuleRouteDef, ModuleMenuDef, ModuleManifest, ModuleHandlerCtx, ModuleHandler, ModuleInstalled, MarketPricing, MarketSigPayload, MarketLicensePayload, MarketLicenseFile, InstallGateKind, InstallGateResult, AssertModuleInstallOptions, InstallModuleOptions, InstallModuleResult, MarketSeatStatus, MarketSeatTicketPayload, MarketSeatTicket, EpsApiItem, EpsColumn, EpsEntity, EpsModuleMap, HttpMethod, InjectionToken, InjectMeta, InsertParamFn, ProvideOptions, QueryExtendFn, QueryExtendQb, QueryFieldRef, QueryJoin, QueryJoinType, QueryOp, QueryOpCtx, QueryWhereFn, QueryWhereResult, ResCode, RouteMiddleware, RouteParamMeta, RouteParamSource, ScanOptions, } from '../core';
|
|
13
15
|
/** 与 package.json version 同步 */
|
|
14
16
|
export declare const version: string;
|
|
@@ -8,3 +8,4 @@ export type { PageQuery, PagePagination, PageResult } from '../../typings/comm/p
|
|
|
8
8
|
export { RES_CODE, type ResCode, type ApiSuccess, type ApiFail, type ApiResult, } from '../routing/base';
|
|
9
9
|
export { buildExcelBuffer, buildImportTemplateBuffer, parseExcelBuffer, excelFilename, excelResponseHeaders, IMPORT_SKIP_FIELDS, isImportSkipField, } from './excel';
|
|
10
10
|
export type { ExcelColumn, ExcelFormatCell } from './excel';
|
|
11
|
+
export { flattenLocale, unflattenLocale, hashLocaleJson, extractJsonObject, } from './locale-json';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** 嵌套对象 → 点分扁平 key */
|
|
2
|
+
export declare function flattenLocale(input: Record<string, unknown>, prefix?: string): Record<string, string>;
|
|
3
|
+
/** 点分扁平 → 嵌套对象 */
|
|
4
|
+
export declare function unflattenLocale(flat: Record<string, string>): Record<string, unknown>;
|
|
5
|
+
export declare function hashLocaleJson(obj: Record<string, unknown>): string;
|
|
6
|
+
/** 从模型回复中尽量抠出 JSON 对象 */
|
|
7
|
+
export declare function extractJsonObject(text: string): Record<string, unknown>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vome-core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.68",
|
|
4
4
|
"description": "Vome framework — shared + Bun/Elysia server + Vue admin",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -22,6 +22,11 @@
|
|
|
22
22
|
"import": "./dist/server/index.js",
|
|
23
23
|
"default": "./dist/server/index.js"
|
|
24
24
|
},
|
|
25
|
+
"./ai": {
|
|
26
|
+
"types": "./dist/ai.d.ts",
|
|
27
|
+
"import": "./dist/ai/index.js",
|
|
28
|
+
"default": "./dist/ai/index.js"
|
|
29
|
+
},
|
|
25
30
|
"./admin": {
|
|
26
31
|
"types": "./dist/admin/index.d.ts",
|
|
27
32
|
"import": "./dist/admin/index.js",
|
|
@@ -87,7 +92,7 @@
|
|
|
87
92
|
}
|
|
88
93
|
},
|
|
89
94
|
"scripts": {
|
|
90
|
-
"build:server": "bun build ./src/index.ts ./src/server/index.ts --outdir ./dist --target bun --format esm --external elysia --external reflect-metadata --external drizzle-orm --external drizzle-zod --external @elysiajs/openapi --external @bogeychan/elysia-logger --external pino --external pino-pretty && tsc -p tsconfig.build.json && printf \"%s\\n\" \"export * from './src/index'\" > dist/index.d.ts && mkdir -p dist/server && printf \"%s\\n\" \"export * from '../src/server/index'\" > dist/server/index.d.ts",
|
|
95
|
+
"build:server": "bun build ./src/index.ts ./src/server/index.ts ./src/ai/index.ts --outdir ./dist --target bun --format esm --external elysia --external reflect-metadata --external drizzle-orm --external drizzle-zod --external @elysiajs/openapi --external @bogeychan/elysia-logger --external pino --external pino-pretty && tsc -p tsconfig.build.json && printf \"%s\\n\" \"export * from './src/index'\" > dist/index.d.ts && mkdir -p dist/server && printf \"%s\\n\" \"export * from '../src/server/index'\" > dist/server/index.d.ts && printf \"%s\\n\" \"export * from './src/ai/index'\" > dist/ai.d.ts",
|
|
91
96
|
"build:client": "bun scripts/build-client.ts",
|
|
92
97
|
"build:admin": "bun scripts/build-admin.ts",
|
|
93
98
|
"build": "rm -rf dist && bun run build:server && bun run build:client && bun run build:admin",
|
package/src/shared/index.ts
CHANGED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
2
|
+
|
|
3
|
+
/** 嵌套对象 → 点分扁平 key */
|
|
4
|
+
export function flattenLocale(
|
|
5
|
+
input: Record<string, unknown>,
|
|
6
|
+
prefix = '',
|
|
7
|
+
): Record<string, string> {
|
|
8
|
+
const out: Record<string, string> = {}
|
|
9
|
+
for (const [k, v] of Object.entries(input)) {
|
|
10
|
+
const key = prefix ? `${prefix}.${k}` : k
|
|
11
|
+
if (v != null && typeof v === 'object' && !Array.isArray(v)) {
|
|
12
|
+
Object.assign(out, flattenLocale(v as Record<string, unknown>, key))
|
|
13
|
+
} else if (typeof v === 'string') {
|
|
14
|
+
out[key] = v
|
|
15
|
+
} else if (v != null) {
|
|
16
|
+
out[key] = String(v)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return out
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** 点分扁平 → 嵌套对象 */
|
|
23
|
+
export function unflattenLocale(
|
|
24
|
+
flat: Record<string, string>,
|
|
25
|
+
): Record<string, unknown> {
|
|
26
|
+
const root: Record<string, unknown> = {}
|
|
27
|
+
for (const [path, value] of Object.entries(flat)) {
|
|
28
|
+
const parts = path.split('.').filter(Boolean)
|
|
29
|
+
if (!parts.length) continue
|
|
30
|
+
let cur: Record<string, unknown> = root
|
|
31
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
32
|
+
const p = parts[i]!
|
|
33
|
+
const next = cur[p]
|
|
34
|
+
if (!next || typeof next !== 'object' || Array.isArray(next)) {
|
|
35
|
+
cur[p] = {}
|
|
36
|
+
}
|
|
37
|
+
cur = cur[p] as Record<string, unknown>
|
|
38
|
+
}
|
|
39
|
+
cur[parts[parts.length - 1]!] = value
|
|
40
|
+
}
|
|
41
|
+
return root
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function hashLocaleJson(obj: Record<string, unknown>): string {
|
|
45
|
+
const flat = flattenLocale(obj)
|
|
46
|
+
const keys = Object.keys(flat).sort()
|
|
47
|
+
const payload = keys.map((k) => `${k}=${flat[k]}`).join('\n')
|
|
48
|
+
return createHash('sha256').update(payload).digest('hex').slice(0, 32)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 从模型回复中尽量抠出 JSON 对象 */
|
|
52
|
+
export function extractJsonObject(text: string): Record<string, unknown> {
|
|
53
|
+
const raw = String(text || '').trim()
|
|
54
|
+
if (!raw) throw new Error('AI 返回空内容')
|
|
55
|
+
try {
|
|
56
|
+
const parsed = JSON.parse(raw) as unknown
|
|
57
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
58
|
+
return parsed as Record<string, unknown>
|
|
59
|
+
}
|
|
60
|
+
} catch {
|
|
61
|
+
/* try fence / substring */
|
|
62
|
+
}
|
|
63
|
+
const fence = raw.match(/```(?:json)?\s*([\s\S]*?)```/i)
|
|
64
|
+
if (fence?.[1]) {
|
|
65
|
+
const parsed = JSON.parse(fence[1].trim()) as unknown
|
|
66
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
67
|
+
return parsed as Record<string, unknown>
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const start = raw.indexOf('{')
|
|
71
|
+
const end = raw.lastIndexOf('}')
|
|
72
|
+
if (start >= 0 && end > start) {
|
|
73
|
+
const parsed = JSON.parse(raw.slice(start, end + 1)) as unknown
|
|
74
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
75
|
+
return parsed as Record<string, unknown>
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
throw new Error('AI 返回无法解析为 JSON 对象')
|
|
79
|
+
}
|