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.
Files changed (85) hide show
  1. package/dist/admin/config/plugin-dev.js +1 -1
  2. package/dist/admin/crud/components/vm-json-editor.vue +32 -3
  3. package/dist/admin/crud/config.js +1 -1
  4. package/dist/admin/crud/confirm.js +1 -1
  5. package/dist/admin/crud/dict.js +1 -1
  6. package/dist/admin/crud/index.d.ts +1 -1
  7. package/dist/admin/crud/index.js +1 -1
  8. package/dist/admin/crud/key.js +1 -1
  9. package/dist/admin/crud/mitt.js +1 -1
  10. package/dist/admin/crud/plugins.js +1 -1
  11. package/dist/admin/crud/span.js +1 -1
  12. package/dist/admin/crud/style.d.ts +37 -0
  13. package/dist/admin/crud/style.js +1 -1
  14. package/dist/admin/crud/validate.js +1 -1
  15. package/dist/admin/crud/vm-add-btn.vue +2 -1
  16. package/dist/admin/crud/vm-adv-search.vue +5 -4
  17. package/dist/admin/crud/vm-crud.vue +14 -9
  18. package/dist/admin/crud/vm-export-btn.vue +2 -1
  19. package/dist/admin/crud/vm-import-btn.vue +2 -1
  20. package/dist/admin/crud/vm-multi-delete-btn.vue +2 -1
  21. package/dist/admin/crud/vm-pagination.vue +16 -7
  22. package/dist/admin/crud/vm-refresh-btn.vue +2 -1
  23. package/dist/admin/crud/vm-search-key.vue +3 -2
  24. package/dist/admin/crud/vm-search.vue +29 -20
  25. package/dist/admin/crud/vm-table.vue +55 -17
  26. package/dist/admin/crud/vm-toolbar.vue +12 -13
  27. package/dist/admin/crud/vm-upsert.vue +12 -6
  28. package/dist/admin/directives/perm.js +1 -1
  29. package/dist/admin/hooks/useUpload.js +1 -1
  30. package/dist/admin/index.d.ts +1 -1
  31. package/dist/admin/index.js +6 -1
  32. package/dist/admin/lib/browser.js +1 -1
  33. package/dist/admin/lib/cn.js +1 -1
  34. package/dist/admin/lib/dialog-float.js +1 -1
  35. package/dist/admin/lib/export-excel.js +1 -1
  36. package/dist/admin/lib/file-preview.js +1 -1
  37. package/dist/admin/lib/import-excel.js +1 -1
  38. package/dist/admin/lib/json.js +1 -1
  39. package/dist/admin/lib/menu.js +1 -1
  40. package/dist/admin/lib/tree.js +1 -1
  41. package/dist/admin/lib/upload.js +1 -1
  42. package/dist/admin/lib/video-frame.js +1 -1
  43. package/dist/admin/styles/base.css +33 -0
  44. package/dist/ai/index.js +28761 -0
  45. package/dist/ai.d.ts +1 -0
  46. package/dist/client/base.js +3 -1
  47. package/dist/client/index.d.ts +1 -1
  48. package/dist/client/index.js +3 -5
  49. package/dist/client/locale-store.d.ts +59 -0
  50. package/dist/client/locale-store.js +159 -0
  51. package/dist/client/vite-plugin-eps.js +0 -21
  52. package/dist/index.js +1 -1
  53. package/dist/server/index.js +1 -1
  54. package/dist/shared/excel.js +1 -1
  55. package/dist/shared/index.js +1 -1
  56. package/dist/shared/locale-json.js +1 -0
  57. package/dist/shared/tree.js +1 -1
  58. package/dist/src/ai/adapters/anthropic-gemini.d.ts +5 -0
  59. package/dist/src/ai/adapters/auth-headers.d.ts +4 -0
  60. package/dist/src/ai/adapters/index.d.ts +3 -0
  61. package/dist/src/ai/adapters/openai-compatible.d.ts +4 -0
  62. package/dist/src/ai/call-log-helpers.d.ts +13 -0
  63. package/dist/src/ai/index.d.ts +10 -0
  64. package/dist/src/ai/normalize.d.ts +18 -0
  65. package/dist/src/ai/sse.d.ts +13 -0
  66. package/dist/src/ai/transport.d.ts +16 -0
  67. package/dist/src/ai/types.d.ts +194 -0
  68. package/dist/src/core/index.d.ts +1 -1
  69. package/dist/src/index.d.ts +1 -0
  70. package/dist/src/orm/index.d.ts +1 -1
  71. package/dist/src/server/index.d.ts +3 -1
  72. package/dist/src/shared/index.d.ts +1 -0
  73. package/dist/src/shared/locale-json.d.ts +7 -0
  74. package/dist/typings/routing/eps.d.ts +2 -0
  75. package/package.json +7 -2
  76. package/src/shared/index.ts +6 -0
  77. package/src/shared/locale-json.ts +79 -0
  78. package/typings/admin/comm/crud.d.ts +12 -0
  79. package/typings/admin/comm/crud.ts +12 -0
  80. package/typings/admin/comm/eps.d.ts +3 -0
  81. package/typings/admin/comm/eps.ts +3 -0
  82. package/typings/admin/comm/request.d.ts +1 -1
  83. package/typings/admin/comm/request.ts +1 -1
  84. package/dist/client/ai-model.d.ts +0 -38
  85. package/dist/client/ai-model.js +0 -39
@@ -1 +1 @@
1
- const _0xbdfe0b=_0x4b13;(function(_0x275546,_0x2dbc9b){const _0x5ecc63=_0x4b13,_0xd45115=_0x275546();while(!![]){try{const _0x364131=parseInt(_0x5ecc63(0xaa))/0x1+-parseInt(_0x5ecc63(0xc4))/0x2*(-parseInt(_0x5ecc63(0xc2))/0x3)+-parseInt(_0x5ecc63(0xc3))/0x4*(parseInt(_0x5ecc63(0xab))/0x5)+parseInt(_0x5ecc63(0xb2))/0x6*(parseInt(_0x5ecc63(0xb8))/0x7)+parseInt(_0x5ecc63(0xaf))/0x8+parseInt(_0x5ecc63(0xb5))/0x9+-parseInt(_0x5ecc63(0xb9))/0xa;if(_0x364131===_0x2dbc9b)break;else _0xd45115['push'](_0xd45115['shift']());}catch(_0x29120e){_0xd45115['push'](_0xd45115['shift']());}}}(_0xc48c,0x9fd27));function _0xc48c(){const _0x58d9bc=['DxrPBhm','C3rYAw5N','zw5KC1DPDgG','yM9VA19HChbLBMrFC2HLzxq','C2HLzxrFDg9FANnVBG','mJa3nKDmD0vevW','nhn0EuDQvW','mtaZmKzhq0H4AW','BgfIzwW','BwfW','yxr0ywnOBwvUDdSGzMLSzw5HBwuQpvvurI04jYC','DhjPBq','yw9Hx3rVx3nOzwv0','yM9VA19UzxC','Aw5JBhvKzxm','u2HLzxqX','z2v0','C2v0','zgvSzxrLzef0','mtu5mtC3uefOBNvz','mtiXmtGZmhvUBMnmrq','BgvUz3rO','ChvZAa','yxjYyxK','mZyXmduWngrIuufkza','DxbKyxrLvgLTzq','D3jPDgu','ndmWnty2Chn3zfvu','CMvHza','u2HLzxrZ','mta5mJy1ndLJtgjivfy','ChjVCa','yxbWBgLJyxrPB24VDM5KlM9Wzw54BwXMB3jTyxrZlw9MzMLJzwrVy3vTzw50lNnWCMvHzhnOzwv0BwWUC2HLzxq','ndj6yKTbsuS','mtCXnte5mJbPrxPdu3q','DgvUyw50swq','u2HLzxroyw1LCW','EgXZEa'];_0xc48c=function(){return _0x58d9bc;};return _0xc48c();}import*as _0x4ac8ac from'xlsx';export const IMPORT_SKIP_FIELDS=['id','createTime',_0xbdfe0b(0xb0),_0xbdfe0b(0xa9),_0xbdfe0b(0xba)];export function isImportSkipField(_0x19f537){const _0xfc70b=_0xbdfe0b;return IMPORT_SKIP_FIELDS[_0xfc70b(0xa5)](_0x19f537);}export function buildExcelBuffer(_0x42c26e,_0x5a2e1b,_0x5c2788){const _0x519487=_0xbdfe0b,_0x3954fc=_0x42c26e[_0x519487(0xa0)](_0x52aea4=>_0x52aea4[_0x519487(0x9f)]||_0x52aea4[_0x519487(0xb6)]),_0x233347=_0x5a2e1b[_0x519487(0xa0)](_0x181b8a=>_0x42c26e['map'](_0x4707f0=>{const _0x1a02a1=_0x519487;if(_0x5c2788)return _0x5c2788(_0x4707f0[_0x1a02a1(0xb6)],_0x181b8a);const _0x159ac8=_0x181b8a[_0x4707f0[_0x1a02a1(0xb6)]];if(_0x159ac8==null)return'';return String(_0x159ac8);})),_0x3feaa0=_0x4ac8ac['utils'][_0x519487(0xa3)]([_0x3954fc,..._0x233347]),_0x4ce79f=_0x4ac8ac[_0x519487(0xbd)][_0x519487(0xa4)]();return _0x4ac8ac[_0x519487(0xbd)][_0x519487(0xc0)](_0x4ce79f,_0x3feaa0,_0x519487(0xa6)),_0x4ac8ac[_0x519487(0xb1)](_0x4ce79f,{'bookType':_0x519487(0xbc),'type':_0x519487(0xae)});}function _0x4b13(_0x309755,_0x3f6b87){_0x309755=_0x309755-0x9f;const _0xc48c4f=_0xc48c();let _0x4b1317=_0xc48c4f[_0x309755];if(_0x4b13['xgbemT']===undefined){var _0x2b1675=function(_0x38aeac){const _0x57df8d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4ac8ac='',_0x19f537='';for(let _0x42c26e=0x0,_0x5a2e1b,_0x5c2788,_0x3954fc=0x0;_0x5c2788=_0x38aeac['charAt'](_0x3954fc++);~_0x5c2788&&(_0x5a2e1b=_0x42c26e%0x4?_0x5a2e1b*0x40+_0x5c2788:_0x5c2788,_0x42c26e++%0x4)?_0x4ac8ac+=String['fromCharCode'](0xff&_0x5a2e1b>>(-0x2*_0x42c26e&0x6)):0x0){_0x5c2788=_0x57df8d['indexOf'](_0x5c2788);}for(let _0x233347=0x0,_0x3feaa0=_0x4ac8ac['length'];_0x233347<_0x3feaa0;_0x233347++){_0x19f537+='%'+('00'+_0x4ac8ac['charCodeAt'](_0x233347)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x19f537);};_0x4b13['EHGSUG']=_0x2b1675,_0x4b13['zsfYFU']={},_0x4b13['xgbemT']=!![];}const _0x420675=_0xc48c4f[0x0],_0x2b7a59=_0x309755+_0x420675,_0x215749=_0x4b13['zsfYFU'][_0x2b7a59];return!_0x215749?(_0x4b1317=_0x4b13['EHGSUG'](_0x4b1317),_0x4b13['zsfYFU'][_0x2b7a59]=_0x4b1317):_0x4b1317=_0x215749,_0x4b1317;}export function buildImportTemplateBuffer(_0x5d2278){return buildExcelBuffer(_0x5d2278,[]);}export function parseExcelBuffer(_0x42edeb,_0x517264){const _0x46b0a8=_0xbdfe0b,_0x158806=_0x4ac8ac[_0x46b0a8(0xb3)](_0x42edeb,{'type':_0x46b0a8(0xae),'cellDates':!![]}),_0x50cc3d=_0x158806[_0x46b0a8(0xbb)][0x0];if(!_0x50cc3d)return[];const _0x38066c=_0x158806[_0x46b0a8(0xb4)][_0x50cc3d];if(!_0x38066c)return[];const _0x3bc3a6=_0x4ac8ac[_0x46b0a8(0xbd)][_0x46b0a8(0xc1)](_0x38066c,{'header':0x1,'defval':'','raw':![]});if(!_0x3bc3a6['length'])return[];const _0x4b7129=(_0x3bc3a6[0x0]||[])['map'](_0x35aad3=>String(_0x35aad3??'')[_0x46b0a8(0xa2)]()),_0x2aafb9=new Map();if(_0x517264?.[_0x46b0a8(0xac)])for(const _0x566608 of _0x517264){_0x2aafb9['set'](_0x566608[_0x46b0a8(0x9f)][_0x46b0a8(0xa2)](),_0x566608['prop']),_0x2aafb9[_0x46b0a8(0xa8)](_0x566608['prop'],_0x566608['prop']);}const _0x31e8aa=_0x4b7129['map'](_0x34b657=>{const _0x4e0885=_0x46b0a8;if(!_0x34b657)return'';return _0x2aafb9[_0x4e0885(0xa7)](_0x34b657)||_0x34b657;}),_0x487a1a=[];for(let _0x258d9d=0x1;_0x258d9d<_0x3bc3a6[_0x46b0a8(0xac)];_0x258d9d++){const _0x5a1819=_0x3bc3a6[_0x258d9d]||[],_0x2671bd={};let _0x415e76=!![];for(let _0x3e654f=0x0;_0x3e654f<_0x31e8aa['length'];_0x3e654f++){const _0x30174f=_0x31e8aa[_0x3e654f];if(!_0x30174f)continue;let _0x31fc64=_0x5a1819[_0x3e654f];if(_0x31fc64==null||_0x31fc64===''){_0x2671bd[_0x30174f]=_0x31fc64==null?null:'';continue;}_0x415e76=![],typeof _0x31fc64===_0x46b0a8(0xbe)?_0x2671bd[_0x30174f]=_0x31fc64['trim']():_0x2671bd[_0x30174f]=_0x31fc64;}if(!_0x415e76)_0x487a1a[_0x46b0a8(0xad)](_0x2671bd);}return _0x487a1a;}export function excelFilename(_0x14db26){const _0x3a983c=_0xbdfe0b;return _0x14db26[_0x3a983c(0xbf)]('.xlsx')?_0x14db26:_0x14db26+'.xlsx';}export function excelResponseHeaders(_0x442f91){const _0x267f3a=_0xbdfe0b,_0x232257=excelFilename(_0x442f91);return{'Content-Type':_0x267f3a(0xb7),'Content-Disposition':_0x267f3a(0xa1)+encodeURIComponent(_0x232257)};}
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)};}
@@ -1 +1 @@
1
- (function(_0x32543b,_0x3ab461){var _0x5cdfa2=_0x3ae4,_0x3d4331=_0x32543b();while(!![]){try{var _0x7ed941=-parseInt(_0x5cdfa2(0x102))/0x1*(parseInt(_0x5cdfa2(0x108))/0x2)+-parseInt(_0x5cdfa2(0x101))/0x3*(parseInt(_0x5cdfa2(0x107))/0x4)+-parseInt(_0x5cdfa2(0x105))/0x5+-parseInt(_0x5cdfa2(0x106))/0x6+-parseInt(_0x5cdfa2(0x100))/0x7+parseInt(_0x5cdfa2(0x104))/0x8+-parseInt(_0x5cdfa2(0xff))/0x9*(-parseInt(_0x5cdfa2(0x103))/0xa);if(_0x7ed941===_0x3ab461)break;else _0x3d4331['push'](_0x3d4331['shift']());}catch(_0x59b5cc){_0x3d4331['push'](_0x3d4331['shift']());}}}(_0x3c04,0xe64d9));function _0x3ae4(_0x344708,_0x589296){_0x344708=_0x344708-0xff;var _0x3c0433=_0x3c04();var _0x3ae496=_0x3c0433[_0x344708];if(_0x3ae4['RwgGPz']===undefined){var _0x1bc5f1=function(_0x2a4503){var _0x5c0b9c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x595cb3='',_0x26d2c4='';for(var _0x421e19=0x0,_0x28abce,_0x1edfe9,_0x2dbfc2=0x0;_0x1edfe9=_0x2a4503['charAt'](_0x2dbfc2++);~_0x1edfe9&&(_0x28abce=_0x421e19%0x4?_0x28abce*0x40+_0x1edfe9:_0x1edfe9,_0x421e19++%0x4)?_0x595cb3+=String['fromCharCode'](0xff&_0x28abce>>(-0x2*_0x421e19&0x6)):0x0){_0x1edfe9=_0x5c0b9c['indexOf'](_0x1edfe9);}for(var _0x3d2572=0x0,_0x498564=_0x595cb3['length'];_0x3d2572<_0x498564;_0x3d2572++){_0x26d2c4+='%'+('00'+_0x595cb3['charCodeAt'](_0x3d2572)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x26d2c4);};_0x3ae4['uFqrcn']=_0x1bc5f1,_0x3ae4['ffHqus']={},_0x3ae4['RwgGPz']=!![];}var _0x3f7808=_0x3c0433[0x0],_0x5b08c0=_0x344708+_0x3f7808,_0x21eb83=_0x3ae4['ffHqus'][_0x5b08c0];return!_0x21eb83?(_0x3ae496=_0x3ae4['uFqrcn'](_0x3ae496),_0x3ae4['ffHqus'][_0x5b08c0]=_0x3ae496):_0x3ae496=_0x21eb83,_0x3ae496;}function _0x3c04(){var _0x2a3157=['ndi2mde2ohPitK96va','mtm4odm3nuTLqM1Xwq','mZK5mtKWoe5HA0PMra','nhHrsLvJyG','ohbOt21yua','mta1mtq0otnHzLzqrLO','ntm3mtK0seHxq2Pi','nte3mduXmMfxzxvkrW','odC2otHvwNHPv0C','mZbjENfwuue'];_0x3c04=function(){return _0x2a3157;};return _0x3c04();}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';
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));}
@@ -1 +1 @@
1
- function _0x1e7e(){const _0x5bca35=['zgvZyW','mJiZnJC4t0LivuHf','mty5oermuLruuG','AgfZ','ndK0nJCYofLmweHdBa','mJm0nZC2nuDPtuXswa','nda3nxnREvj1uq','BgvUz3rO','ChvZAa','y2HPBgrYzw4','C29YDa','mJi1nJG0uwjwvhzT','mta1otaYofrHCNb6Eq','DMfSDwvZ','mJuWmtGYEwPZu0z5','CgfYzw50swq'];_0x1e7e=function(){return _0x5bca35;};return _0x1e7e();}(function(_0xca3f1e,_0x137b08){const _0x58f930=_0x532a,_0x26b2ed=_0xca3f1e();while(!![]){try{const _0x22aacc=parseInt(_0x58f930(0xfc))/0x1+parseInt(_0x58f930(0x109))/0x2+parseInt(_0x58f930(0x106))/0x3+parseInt(_0x58f930(0x107))/0x4+-parseInt(_0x58f930(0x101))/0x5*(parseInt(_0x58f930(0xfd))/0x6)+parseInt(_0x58f930(0x100))/0x7+-parseInt(_0x58f930(0xff))/0x8;if(_0x22aacc===_0x137b08)break;else _0x26b2ed['push'](_0x26b2ed['shift']());}catch(_0x165346){_0x26b2ed['push'](_0x26b2ed['shift']());}}}(_0x1e7e,0x2ac3b));export function deepTree(_0x417972,_0x4eee2b='asc'){const _0x3cdf91=_0x532a,_0x5476f7=new Map();for(const _0x372fef of _0x417972){if(_0x372fef['id']==null)continue;_0x5476f7['set'](_0x372fef['id'],{..._0x372fef,'children':[]});}const _0x3a7354=[];for(const _0x73b781 of _0x5476f7[_0x3cdf91(0x108)]()){const _0x5bbb87=_0x73b781[_0x3cdf91(0x10a)];_0x5bbb87!=null&&_0x5bbb87!==''&&_0x5476f7[_0x3cdf91(0xfe)](_0x5bbb87)?_0x5476f7['get'](_0x5bbb87)[_0x3cdf91(0x104)][_0x3cdf91(0x103)](_0x73b781):_0x3a7354[_0x3cdf91(0x103)](_0x73b781);}const _0x57ed98=_0x458d29=>{const _0x3714bb=_0x3cdf91;_0x458d29[_0x3714bb(0x105)]((_0x3002e6,_0x5c7a4b)=>{const _0xbe450d=_0x3714bb,_0x1d2079=_0x3002e6['orderNum']??0x0,_0x4690f3=_0x5c7a4b['orderNum']??0x0,_0x1151ff=_0x4eee2b===_0xbe450d(0xfb)?_0x4690f3-_0x1d2079:_0x1d2079-_0x4690f3;return _0x1151ff||Number(_0x3002e6['id'])-Number(_0x5c7a4b['id']);});for(const _0x502da2 of _0x458d29)if(_0x502da2[_0x3714bb(0x104)]?.[_0x3714bb(0x102)])_0x57ed98(_0x502da2[_0x3714bb(0x104)]);};return _0x57ed98(_0x3a7354),_0x3a7354;}function _0x532a(_0x5033ac,_0x2617bd){_0x5033ac=_0x5033ac-0xfb;const _0x1e7e27=_0x1e7e();let _0x532a3a=_0x1e7e27[_0x5033ac];if(_0x532a['KCfbBx']===undefined){var _0x226df6=function(_0x9613e1){const _0x56df8f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x417972='',_0x4eee2b='';for(let _0x5476f7=0x0,_0x3a7354,_0x57ed98,_0x372fef=0x0;_0x57ed98=_0x9613e1['charAt'](_0x372fef++);~_0x57ed98&&(_0x3a7354=_0x5476f7%0x4?_0x3a7354*0x40+_0x57ed98:_0x57ed98,_0x5476f7++%0x4)?_0x417972+=String['fromCharCode'](0xff&_0x3a7354>>(-0x2*_0x5476f7&0x6)):0x0){_0x57ed98=_0x56df8f['indexOf'](_0x57ed98);}for(let _0x73b781=0x0,_0x5bbb87=_0x417972['length'];_0x73b781<_0x5bbb87;_0x73b781++){_0x4eee2b+='%'+('00'+_0x417972['charCodeAt'](_0x73b781)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4eee2b);};_0x532a['NBTVxp']=_0x226df6,_0x532a['bUeoxx']={},_0x532a['KCfbBx']=!![];}const _0x38130d=_0x1e7e27[0x0],_0x1844a8=_0x5033ac+_0x38130d,_0x548b72=_0x532a['bUeoxx'][_0x1844a8];return!_0x548b72?(_0x532a3a=_0x532a['NBTVxp'](_0x532a3a),_0x532a['bUeoxx'][_0x1844a8]=_0x532a3a):_0x532a3a=_0x548b72,_0x532a3a;}export function flattenTree(_0x143b10,_0x47b7ca,_0x4d595f=0x0,_0x3e9947=[]){const _0x262026=_0x532a;for(const _0x2ae953 of _0x143b10){const _0x3bc554=_0x2ae953[_0x262026(0x104)]||[];_0x3e9947['push']({..._0x2ae953,'depth':_0x4d595f,'hasChildren':_0x3bc554[_0x262026(0x102)]>0x0});if(_0x3bc554[_0x262026(0x102)]&&_0x47b7ca['has'](_0x2ae953['id']))flattenTree(_0x3bc554,_0x47b7ca,_0x4d595f+0x1,_0x3e9947);}return _0x3e9947;}
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,3 @@
1
+ import type { AiProtocolAdapter } from '../types';
2
+ export declare function getAiAdapter(protocol: string): AiProtocolAdapter | undefined;
3
+ export declare function listAiProtocols(): 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 {};
@@ -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';
@@ -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;
@@ -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>;
@@ -24,6 +24,8 @@ export type EpsColumn = {
24
24
  defaultValue?: unknown;
25
25
  source?: string;
26
26
  dict?: string | string[];
27
+ /** 物理表名(il8n_pack),供 field.{table}.{prop} 翻译 */
28
+ table?: string;
27
29
  };
28
30
  /** EPS:单个控制器/实体描述 */
29
31
  export type EpsEntity = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vome-core",
3
- "version": "0.0.67",
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",
@@ -22,3 +22,9 @@ export {
22
22
  isImportSkipField,
23
23
  } from './excel'
24
24
  export type { ExcelColumn, ExcelFormatCell } from './excel'
25
+ export {
26
+ flattenLocale,
27
+ unflattenLocale,
28
+ hashLocaleJson,
29
+ extractJsonObject,
30
+ } from './locale-json'
@@ -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
+ }