vome-core 0.0.67 → 0.0.69

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 _0x4ca9(){const _0x47ee8e=['yw9Hx3rVx3nOzwv0','nhn5DKnVCq','mJe3ntuYmeXht1rYEq','DxbKyxrLvgLTzq','nezAvvv2rW','u2HLzxroyw1LCW','C2HLzxrFDg9FANnVBG','EgXZEa','BgfIzwW','C3rYAw5N','mJaWmJyWvMjMDNPq','mJq1ndm5mhPJsKzUuG','C2v0','CMvHza','mZi2n2nMvhzxqW','mty3mtG0nxP4vfHxrW','y3jLyxrLvgLTzq','lNHSC3G','u2HLzxqX','u2HLzxrZ','ChjVCa','mJC4nZuXmM5stgjQsa','D3jPDgu','BwfW','DhjPBq','BgvUz3rO','zw5KC1DPDgG','Aw5JBhvKzxm','odqZmhD4t0DbvW','DxrPBhm','mZq5nZmXzK1tsLzb','yxjYyxK'];_0x4ca9=function(){return _0x47ee8e;};return _0x4ca9();}function _0x55d5(_0x14524c,_0x40692d){_0x14524c=_0x14524c-0x8f;const _0x4ca9d0=_0x4ca9();let _0x55d5df=_0x4ca9d0[_0x14524c];if(_0x55d5['JgoUcO']===undefined){var _0x5cac28=function(_0x484eb9){const _0x3e6282='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x439a4b='',_0x2671c6='';for(let _0x4a6607=0x0,_0xfce78f,_0x338cdf,_0x522ce7=0x0;_0x338cdf=_0x484eb9['charAt'](_0x522ce7++);~_0x338cdf&&(_0xfce78f=_0x4a6607%0x4?_0xfce78f*0x40+_0x338cdf:_0x338cdf,_0x4a6607++%0x4)?_0x439a4b+=String['fromCharCode'](0xff&_0xfce78f>>(-0x2*_0x4a6607&0x6)):0x0){_0x338cdf=_0x3e6282['indexOf'](_0x338cdf);}for(let _0x39975e=0x0,_0xc087d8=_0x439a4b['length'];_0x39975e<_0xc087d8;_0x39975e++){_0x2671c6+='%'+('00'+_0x439a4b['charCodeAt'](_0x39975e)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2671c6);};_0x55d5['SHcklE']=_0x5cac28,_0x55d5['roCBPE']={},_0x55d5['JgoUcO']=!![];}const _0x578907=_0x4ca9d0[0x0],_0x1b1941=_0x14524c+_0x578907,_0x141072=_0x55d5['roCBPE'][_0x1b1941];return!_0x141072?(_0x55d5df=_0x55d5['SHcklE'](_0x55d5df),_0x55d5['roCBPE'][_0x1b1941]=_0x55d5df):_0x55d5df=_0x141072,_0x55d5df;}const _0x286c22=_0x55d5;(function(_0x9aa422,_0x155721){const _0x3ec56e=_0x55d5,_0x21cd60=_0x9aa422();while(!![]){try{const _0x390cb6=-parseInt(_0x3ec56e(0x95))/0x1*(parseInt(_0x3ec56e(0x9e))/0x2)+parseInt(_0x3ec56e(0x92))/0x3+parseInt(_0x3ec56e(0x98))/0x4*(-parseInt(_0x3ec56e(0xa3))/0x5)+parseInt(_0x3ec56e(0x9f))/0x6+parseInt(_0x3ec56e(0xa9))/0x7+-parseInt(_0x3ec56e(0x96))/0x8+-parseInt(_0x3ec56e(0xa2))/0x9*(-parseInt(_0x3ec56e(0x90))/0xa);if(_0x390cb6===_0x155721)break;else _0x21cd60['push'](_0x21cd60['shift']());}catch(_0x39dd8b){_0x21cd60['push'](_0x21cd60['shift']());}}}(_0x4ca9,0x3673e));import*as _0x439a4b from'xlsx';export const IMPORT_SKIP_FIELDS=['id',_0x286c22(0xa4),_0x286c22(0x97),'deletedAt','tenantId'];export function isImportSkipField(_0x2671c6){const _0x33cf1a=_0x286c22;return IMPORT_SKIP_FIELDS[_0x33cf1a(0x8f)](_0x2671c6);}export function buildExcelBuffer(_0x4a6607,_0xfce78f,_0x338cdf){const _0x2985aa=_0x286c22,_0x522ce7=_0x4a6607[_0x2985aa(0xab)](_0x7993ca=>_0x7993ca['label']||_0x7993ca[_0x2985aa(0xa8)]),_0x39975e=_0xfce78f[_0x2985aa(0xab)](_0x21e78b=>_0x4a6607[_0x2985aa(0xab)](_0xcea141=>{const _0x4d5bdb=_0x2985aa;if(_0x338cdf)return _0x338cdf(_0xcea141[_0x4d5bdb(0xa8)],_0x21e78b);const _0x24343d=_0x21e78b[_0xcea141['prop']];if(_0x24343d==null)return'';return String(_0x24343d);})),_0xc087d8=_0x439a4b[_0x2985aa(0x91)][_0x2985aa(0x94)]([_0x522ce7,..._0x39975e]),_0x1dd979=_0x439a4b[_0x2985aa(0x91)]['book_new']();return _0x439a4b[_0x2985aa(0x91)]['book_append_sheet'](_0x1dd979,_0xc087d8,_0x2985aa(0xa6)),_0x439a4b[_0x2985aa(0xaa)](_0x1dd979,{'bookType':_0x2985aa(0x9b),'type':_0x2985aa(0x93)});}export function buildImportTemplateBuffer(_0x5dc773){return buildExcelBuffer(_0x5dc773,[]);}export function parseExcelBuffer(_0x3f15f9,_0x2ce0c3){const _0x26647c=_0x286c22,_0x1239b5=_0x439a4b[_0x26647c(0xa1)](_0x3f15f9,{'type':_0x26647c(0x93),'cellDates':!![]}),_0x400a57=_0x1239b5[_0x26647c(0x99)][0x0];if(!_0x400a57)return[];const _0x42b883=_0x1239b5[_0x26647c(0xa7)][_0x400a57];if(!_0x42b883)return[];const _0x28c63d=_0x439a4b['utils'][_0x26647c(0x9a)](_0x42b883,{'header':0x1,'defval':'','raw':![]});if(!_0x28c63d['length'])return[];const _0x11fbd2=(_0x28c63d[0x0]||[])[_0x26647c(0xab)](_0x23e95d=>String(_0x23e95d??'')['trim']()),_0x4664f8=new Map();if(_0x2ce0c3?.[_0x26647c(0xad)])for(const _0x12ca04 of _0x2ce0c3){_0x4664f8[_0x26647c(0xa0)](_0x12ca04[_0x26647c(0x9c)][_0x26647c(0xac)](),_0x12ca04[_0x26647c(0xa8)]),_0x4664f8[_0x26647c(0xa0)](_0x12ca04['prop'],_0x12ca04[_0x26647c(0xa8)]);}const _0x3d0369=_0x11fbd2['map'](_0x184973=>{if(!_0x184973)return'';return _0x4664f8['get'](_0x184973)||_0x184973;}),_0x4b5dcb=[];for(let _0x2b29b2=0x1;_0x2b29b2<_0x28c63d['length'];_0x2b29b2++){const _0x4b644c=_0x28c63d[_0x2b29b2]||[],_0x12ccb7={};let _0x25e555=!![];for(let _0x167104=0x0;_0x167104<_0x3d0369[_0x26647c(0xad)];_0x167104++){const _0x1c6b95=_0x3d0369[_0x167104];if(!_0x1c6b95)continue;let _0x39f0bf=_0x4b644c[_0x167104];if(_0x39f0bf==null||_0x39f0bf===''){_0x12ccb7[_0x1c6b95]=_0x39f0bf==null?null:'';continue;}_0x25e555=![],typeof _0x39f0bf===_0x26647c(0x9d)?_0x12ccb7[_0x1c6b95]=_0x39f0bf[_0x26647c(0xac)]():_0x12ccb7[_0x1c6b95]=_0x39f0bf;}if(!_0x25e555)_0x4b5dcb['push'](_0x12ccb7);}return _0x4b5dcb;}export function excelFilename(_0x7e0144){const _0xda14c3=_0x286c22;return _0x7e0144[_0xda14c3(0xae)](_0xda14c3(0xa5))?_0x7e0144:_0x7e0144+_0xda14c3(0xa5);}export function excelResponseHeaders(_0x3bfca0){const _0x3d3369=excelFilename(_0x3bfca0);return{'Content-Type':'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','Content-Disposition':'attachment;\x20filename*=UTF-8\x27\x27'+encodeURIComponent(_0x3d3369)};}
@@ -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(_0x1941c4,_0x2276db){var _0x25c12c=_0x4890,_0x4f84b9=_0x1941c4();while(!![]){try{var _0x3c03ca=-parseInt(_0x25c12c(0x184))/0x1+parseInt(_0x25c12c(0x182))/0x2+-parseInt(_0x25c12c(0x181))/0x3+-parseInt(_0x25c12c(0x183))/0x4*(-parseInt(_0x25c12c(0x186))/0x5)+-parseInt(_0x25c12c(0x188))/0x6+parseInt(_0x25c12c(0x180))/0x7+-parseInt(_0x25c12c(0x185))/0x8*(parseInt(_0x25c12c(0x187))/0x9);if(_0x3c03ca===_0x2276db)break;else _0x4f84b9['push'](_0x4f84b9['shift']());}catch(_0x371ecd){_0x4f84b9['push'](_0x4f84b9['shift']());}}}(_0x44f3,0x1db3a));export{merge}from'../comm/merge';export{deepTree,flattenTree}from'./tree';function _0x4890(_0x4206dd,_0x3da6aa){_0x4206dd=_0x4206dd-0x180;var _0x44f3c9=_0x44f3();var _0x489002=_0x44f3c9[_0x4206dd];if(_0x4890['vjmejf']===undefined){var _0x392a1a=function(_0x62bcf4){var _0x4cf0f1='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x24de83='',_0x297af3='';for(var _0x3eb9b4=0x0,_0x191002,_0x4dd9aa,_0x190b21=0x0;_0x4dd9aa=_0x62bcf4['charAt'](_0x190b21++);~_0x4dd9aa&&(_0x191002=_0x3eb9b4%0x4?_0x191002*0x40+_0x4dd9aa:_0x4dd9aa,_0x3eb9b4++%0x4)?_0x24de83+=String['fromCharCode'](0xff&_0x191002>>(-0x2*_0x3eb9b4&0x6)):0x0){_0x4dd9aa=_0x4cf0f1['indexOf'](_0x4dd9aa);}for(var _0x5a99bf=0x0,_0x1b6879=_0x24de83['length'];_0x5a99bf<_0x1b6879;_0x5a99bf++){_0x297af3+='%'+('00'+_0x24de83['charCodeAt'](_0x5a99bf)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x297af3);};_0x4890['AoDYmf']=_0x392a1a,_0x4890['fZOMYp']={},_0x4890['vjmejf']=!![];}var _0x323ca5=_0x44f3c9[0x0],_0x9ece1d=_0x4206dd+_0x323ca5,_0x554c40=_0x4890['fZOMYp'][_0x9ece1d];return!_0x554c40?(_0x489002=_0x4890['AoDYmf'](_0x489002),_0x4890['fZOMYp'][_0x9ece1d]=_0x489002):_0x489002=_0x554c40,_0x489002;}export{RES_CODE}from'../routing/base';export{buildExcelBuffer,buildImportTemplateBuffer,parseExcelBuffer,excelFilename,excelResponseHeaders,IMPORT_SKIP_FIELDS,isImportSkipField}from'./excel';function _0x44f3(){var _0x3e7a48=['mZe2odjZtgDYvwu','ogXADLHvtq','mtbnCwfMB1K','ntG3nti5tNz0ENvo','nJKZmZC4zNjYrxzA','mtuZmJKZmfjuu0XPqW','mZq2mZK1B1z3BhDh','mtuZndC0A05zyufr','mZa3odq0quTRBuDZ'];_0x44f3=function(){return _0x3e7a48;};return _0x44f3();}export{flattenLocale,unflattenLocale,hashLocaleJson,extractJsonObject}from'./locale-json';
@@ -0,0 +1 @@
1
+ (function(_0x3d98a8,_0x529d9a){const _0x291f30=_0x54ee,_0x17ceac=_0x3d98a8();while(!![]){try{const _0x35c7cd=-parseInt(_0x291f30(0xd7))/0x1*(parseInt(_0x291f30(0xbd))/0x2)+-parseInt(_0x291f30(0xd8))/0x3*(parseInt(_0x291f30(0xcd))/0x4)+-parseInt(_0x291f30(0xcf))/0x5+-parseInt(_0x291f30(0xc4))/0x6*(-parseInt(_0x291f30(0xda))/0x7)+-parseInt(_0x291f30(0xd4))/0x8+parseInt(_0x291f30(0xcc))/0x9*(-parseInt(_0x291f30(0xca))/0xa)+parseInt(_0x291f30(0xdb))/0xb;if(_0x35c7cd===_0x529d9a)break;else _0x17ceac['push'](_0x17ceac['shift']());}catch(_0xdcbede){_0x17ceac['push'](_0x17ceac['shift']());}}}(_0x5733,0x91ede));import{createHash}from'node:crypto';export function flattenLocale(_0x147b0e,_0x416b4b=''){const _0x397b6d=_0x54ee,_0x5deb85={};for(const [_0x239f42,_0xa3bb00]of Object['entries'](_0x147b0e)){const _0x3f43db=_0x416b4b?_0x416b4b+'.'+_0x239f42:_0x239f42;if(_0xa3bb00!=null&&typeof _0xa3bb00===_0x397b6d(0xc8)&&!Array[_0x397b6d(0xc2)](_0xa3bb00))Object[_0x397b6d(0xd9)](_0x5deb85,flattenLocale(_0xa3bb00,_0x3f43db));else{if(typeof _0xa3bb00===_0x397b6d(0xbf))_0x5deb85[_0x3f43db]=_0xa3bb00;else _0xa3bb00!=null&&(_0x5deb85[_0x3f43db]=String(_0xa3bb00));}}return _0x5deb85;}export function unflattenLocale(_0x2f3af2){const _0x31af25=_0x54ee,_0x717b90={};for(const [_0x1fb36b,_0x31e06a]of Object['entries'](_0x2f3af2)){const _0x579946=_0x1fb36b[_0x31af25(0xd3)]('.')[_0x31af25(0xd5)](Boolean);if(!_0x579946[_0x31af25(0xd1)])continue;let _0x4b05c3=_0x717b90;for(let _0x25a607=0x0;_0x25a607<_0x579946[_0x31af25(0xd1)]-0x1;_0x25a607++){const _0xd33596=_0x579946[_0x25a607],_0x5a660b=_0x4b05c3[_0xd33596];(!_0x5a660b||typeof _0x5a660b!=='object'||Array[_0x31af25(0xc2)](_0x5a660b))&&(_0x4b05c3[_0xd33596]={}),_0x4b05c3=_0x4b05c3[_0xd33596];}_0x4b05c3[_0x579946[_0x579946[_0x31af25(0xd1)]-0x1]]=_0x31e06a;}return _0x717b90;}function _0x5733(){const _0x5e4ace=['mZy2otGWmg5Tre5JtG','C2HHmJu2','BgvUz3rO','DhjPBq','C3bSAxq','mZaXmZq0mg5uDLjbBa','zMLSDgvY','Bwf0y2G','mJiZCLzmueXy','mtvkBLPHsKe','yxnZAwDU','mJa1mvz1BLfOBa','mJq2mtK5mdnyC2LoCg8','BwfW','Agv4','mtG3oenIqK90va','BgfZDeLUzgv4t2y','C3rYAw5N','C2XPy2u','CgfYC2u','AxnbCNjHEq','Aw5KzxHpzG','mtqXnZjnq3LdEhe','C29YDa','quKG6l+u5zUE5PEG5Rov6kEJ5P6q5lI6iePtt04G5A+56lgH','zgLNzxn0','B2jQzwn0','DxbKyxrL','mtbotgn2qKK','AM9PBG','mtm5mtq5rw51DLzk','nZK3nJeYA09RrunK','quKG6l+u5zUE56M65yAf5A65'];_0x5733=function(){return _0x5e4ace;};return _0x5733();}function _0x54ee(_0x30dc44,_0x1604be){_0x30dc44=_0x30dc44-0xbc;const _0x57332b=_0x5733();let _0x54eee2=_0x57332b[_0x30dc44];if(_0x54ee['HjkPJA']===undefined){var _0x42fbc3=function(_0x15cce3){const _0x5f17be='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x147b0e='',_0x416b4b='';for(let _0x5deb85=0x0,_0x239f42,_0xa3bb00,_0x3f43db=0x0;_0xa3bb00=_0x15cce3['charAt'](_0x3f43db++);~_0xa3bb00&&(_0x239f42=_0x5deb85%0x4?_0x239f42*0x40+_0xa3bb00:_0xa3bb00,_0x5deb85++%0x4)?_0x147b0e+=String['fromCharCode'](0xff&_0x239f42>>(-0x2*_0x5deb85&0x6)):0x0){_0xa3bb00=_0x5f17be['indexOf'](_0xa3bb00);}for(let _0x2f3af2=0x0,_0x717b90=_0x147b0e['length'];_0x2f3af2<_0x717b90;_0x2f3af2++){_0x416b4b+='%'+('00'+_0x147b0e['charCodeAt'](_0x2f3af2)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x416b4b);};_0x54ee['VeBcVf']=_0x42fbc3,_0x54ee['DfaoUr']={},_0x54ee['HjkPJA']=!![];}const _0x521e2e=_0x57332b[0x0],_0x4d010a=_0x30dc44+_0x521e2e,_0x5dfd89=_0x54ee['DfaoUr'][_0x4d010a];return!_0x5dfd89?(_0x54eee2=_0x54ee['VeBcVf'](_0x54eee2),_0x54ee['DfaoUr'][_0x4d010a]=_0x54eee2):_0x54eee2=_0x5dfd89,_0x54eee2;}export function hashLocaleJson(_0x5cc7f4){const _0x3cb5db=_0x54ee,_0x1b720f=flattenLocale(_0x5cc7f4),_0x48a6cf=Object['keys'](_0x1b720f)[_0x3cb5db(0xc5)](),_0x32e83b=_0x48a6cf[_0x3cb5db(0xdc)](_0x1b7760=>_0x1b7760+'='+_0x1b720f[_0x1b7760])[_0x3cb5db(0xcb)]('\x0a');return createHash(_0x3cb5db(0xd0))[_0x3cb5db(0xc9)](_0x32e83b)[_0x3cb5db(0xc7)](_0x3cb5db(0xbc))['slice'](0x0,0x20);}export function extractJsonObject(_0x231972){const _0x252a75=_0x54ee,_0x2e866f=String(_0x231972||'')[_0x252a75(0xd2)]();if(!_0x2e866f)throw new Error(_0x252a75(0xce));try{const _0x8f1aa5=JSON['parse'](_0x2e866f);if(_0x8f1aa5&&typeof _0x8f1aa5===_0x252a75(0xc8)&&!Array['isArray'](_0x8f1aa5))return _0x8f1aa5;}catch{}const _0x3f9145=_0x2e866f[_0x252a75(0xd6)](/```(?:json)?\s*([\s\S]*?)```/i);if(_0x3f9145?.[0x1]){const _0x581368=JSON[_0x252a75(0xc1)](_0x3f9145[0x1]['trim']());if(_0x581368&&typeof _0x581368==='object'&&!Array['isArray'](_0x581368))return _0x581368;}const _0x2b1ba2=_0x2e866f[_0x252a75(0xc3)]('{'),_0x29f326=_0x2e866f[_0x252a75(0xbe)]('}');if(_0x2b1ba2>=0x0&&_0x29f326>_0x2b1ba2){const _0x59673b=JSON[_0x252a75(0xc1)](_0x2e866f[_0x252a75(0xc0)](_0x2b1ba2,_0x29f326+0x1));if(_0x59673b&&typeof _0x59673b==='object'&&!Array[_0x252a75(0xc2)](_0x59673b))return _0x59673b;}throw new Error(_0x252a75(0xc6));}
@@ -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 _0x4b74(){const _0x4d9295=['mtmXntu5ndDosxPqq28','B3jKzxjoDw0','mtu3otC4mNzoCxHXEa','mtGWntm5nZb1AgrsvfC','y2HPBgrYzw4','BgvUz3rO','CgfYzw50swq','nZG0nZe1zwDgEeH6','mtuZmJeWmgnkEu5NCa','ntq5mffqDNzbva','mtaZmJi5mNb4yND4yW','DMfSDwvZ','mJa5mdD5yNzHAhG','AgfZ','C29YDa','ChvZAa','mJreBwjbA0W','mMDdDKL5qq','mJHmww5lwe8','zgvZyW','ogH3uxLlDa','z2v0'];_0x4b74=function(){return _0x4d9295;};return _0x4b74();}function _0x267b(_0x23e8af,_0x40b195){_0x23e8af=_0x23e8af-0x13d;const _0x4b74f7=_0x4b74();let _0x267bba=_0x4b74f7[_0x23e8af];if(_0x267b['CQnhTp']===undefined){var _0xb8db04=function(_0x4cf2b4){const _0x12a062='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x70c5a5='',_0x129159='';for(let _0xe564f0=0x0,_0x2685b0,_0x1a0086,_0x4f2562=0x0;_0x1a0086=_0x4cf2b4['charAt'](_0x4f2562++);~_0x1a0086&&(_0x2685b0=_0xe564f0%0x4?_0x2685b0*0x40+_0x1a0086:_0x1a0086,_0xe564f0++%0x4)?_0x70c5a5+=String['fromCharCode'](0xff&_0x2685b0>>(-0x2*_0xe564f0&0x6)):0x0){_0x1a0086=_0x12a062['indexOf'](_0x1a0086);}for(let _0x4085f3=0x0,_0x44f385=_0x70c5a5['length'];_0x4085f3<_0x44f385;_0x4085f3++){_0x129159+='%'+('00'+_0x70c5a5['charCodeAt'](_0x4085f3)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x129159);};_0x267b['ltynrX']=_0xb8db04,_0x267b['mguQzw']={},_0x267b['CQnhTp']=!![];}const _0xebdcad=_0x4b74f7[0x0],_0x39e824=_0x23e8af+_0xebdcad,_0x2a267c=_0x267b['mguQzw'][_0x39e824];return!_0x2a267c?(_0x267bba=_0x267b['ltynrX'](_0x267bba),_0x267b['mguQzw'][_0x39e824]=_0x267bba):_0x267bba=_0x2a267c,_0x267bba;}(function(_0x505374,_0x7750e7){const _0x2cc86b=_0x267b,_0x39adf0=_0x505374();while(!![]){try{const _0x232b18=-parseInt(_0x2cc86b(0x13f))/0x1*(parseInt(_0x2cc86b(0x14e))/0x2)+-parseInt(_0x2cc86b(0x146))/0x3+parseInt(_0x2cc86b(0x140))/0x4*(-parseInt(_0x2cc86b(0x14b))/0x5)+-parseInt(_0x2cc86b(0x14c))/0x6+-parseInt(_0x2cc86b(0x144))/0x7*(-parseInt(_0x2cc86b(0x142))/0x8)+parseInt(_0x2cc86b(0x150))/0x9*(-parseInt(_0x2cc86b(0x14d))/0xa)+parseInt(_0x2cc86b(0x147))/0xb*(parseInt(_0x2cc86b(0x13e))/0xc);if(_0x232b18===_0x7750e7)break;else _0x39adf0['push'](_0x39adf0['shift']());}catch(_0x380cec){_0x39adf0['push'](_0x39adf0['shift']());}}}(_0x4b74,0xedbe5));export function deepTree(_0x70c5a5,_0x129159='asc'){const _0x3acf3a=_0x267b,_0xe564f0=new Map();for(const _0x4f2562 of _0x70c5a5){if(_0x4f2562['id']==null)continue;_0xe564f0['set'](_0x4f2562['id'],{..._0x4f2562,'children':[]});}const _0x2685b0=[];for(const _0x4085f3 of _0xe564f0[_0x3acf3a(0x14f)]()){const _0x44f385=_0x4085f3[_0x3acf3a(0x14a)];_0x44f385!=null&&_0x44f385!==''&&_0xe564f0['has'](_0x44f385)?_0xe564f0[_0x3acf3a(0x143)](_0x44f385)['children']['push'](_0x4085f3):_0x2685b0[_0x3acf3a(0x13d)](_0x4085f3);}const _0x1a0086=_0x525af3=>{const _0x560369=_0x3acf3a;_0x525af3[_0x560369(0x152)]((_0x4f498c,_0x2b9fdd)=>{const _0x1e5c10=_0x560369,_0x525af4=_0x4f498c[_0x1e5c10(0x145)]??0x0,_0x1925ca=_0x2b9fdd[_0x1e5c10(0x145)]??0x0,_0x23f061=_0x129159===_0x1e5c10(0x141)?_0x1925ca-_0x525af4:_0x525af4-_0x1925ca;return _0x23f061||Number(_0x4f498c['id'])-Number(_0x2b9fdd['id']);});for(const _0x35d78c of _0x525af3)if(_0x35d78c[_0x560369(0x148)]?.[_0x560369(0x149)])_0x1a0086(_0x35d78c[_0x560369(0x148)]);};return _0x1a0086(_0x2685b0),_0x2685b0;}export function flattenTree(_0x498ade,_0x269d48,_0x2d571f=0x0,_0x4bcfa8=[]){const _0x3fbdc9=_0x267b;for(const _0x1a9b4d of _0x498ade){const _0x418402=_0x1a9b4d[_0x3fbdc9(0x148)]||[];_0x4bcfa8['push']({..._0x1a9b4d,'depth':_0x2d571f,'hasChildren':_0x418402[_0x3fbdc9(0x149)]>0x0});if(_0x418402[_0x3fbdc9(0x149)]&&_0x269d48[_0x3fbdc9(0x151)](_0x1a9b4d['id']))flattenTree(_0x418402,_0x269d48,_0x2d571f+0x1,_0x4bcfa8);}return _0x4bcfa8;}
@@ -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
+ /** 物理表名(i18n_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.69",
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
+ }