@sleep2agi/agent-network 2.3.0-preview.16 → 2.3.0-preview.17

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.
@@ -1 +1 @@
1
- function a0_0x3a8a(_0xbf97b2,_0x1b0d8b){_0xbf97b2=_0xbf97b2-0xcc;const _0x1ead6b=a0_0x1ead();let _0x3a8a84=_0x1ead6b[_0xbf97b2];return _0x3a8a84;}const a0_0x5aa207=a0_0x3a8a;(function(_0xd6e14f,_0x212c4a){const _0x2d861c=a0_0x3a8a,_0x33513c=_0xd6e14f();while(!![]){try{const _0x25926b=-parseInt(_0x2d861c(0xfe))/0x1*(-parseInt(_0x2d861c(0x10c))/0x2)+parseInt(_0x2d861c(0xcc))/0x3+-parseInt(_0x2d861c(0xd2))/0x4+parseInt(_0x2d861c(0xf1))/0x5+-parseInt(_0x2d861c(0x101))/0x6+parseInt(_0x2d861c(0xd7))/0x7+parseInt(_0x2d861c(0xf8))/0x8*(-parseInt(_0x2d861c(0x11b))/0x9);if(_0x25926b===_0x212c4a)break;else _0x33513c['push'](_0x33513c['shift']());}catch(_0x177805){_0x33513c['push'](_0x33513c['shift']());}}}(a0_0x1ead,0xc6cad));function a0_0x1ead(){const _0x2627eb=['now','send_reply','inbox\x20error:\x20','token','error','data:\x20','application/json','task','read','body','reply','type','getReader','completed','sseAbort','disconnected','sdk-','toString','text','7438645HSevlt','match','status','/events/','log','application/json,\x20text/event-stream','message','8JSJtRn','Authorization','reconnectDelay','heartbeat\x20failed:\x20','heartbeatTimer','Bearer\x20','221077ssreUs','idle','sdk','1867512LPzeik','sleep','tools/call','new_message','connect','replace','url','alias','resumeId','content','messages','14GwWeVF','call','parse','SSE\x20error:\x20','autoConnect','result','min','getAllStatus','stringify','split','connectSSE','disconnect','broadcast','catch','POST','37381941xaArGT','name','decode','running','abort','3374694yHCTbU','connected','emit',']\x20[commhub:','2.0','startsWith','1593356MtueIW','send_task','new_task','get_all_status','text/event-stream','10620589IiTBss','heartbeatInterval','agent','from_session','registered','send','processInbox'];a0_0x1ead=function(){return _0x2627eb;};return a0_0x1ead();}import{EventEmitter as a0_0x91c43c}from'events';import{hostname as a0_0x6b38b3}from'os';class T extends a0_0x91c43c{[a0_0x5aa207(0x107)];['alias'];['token'];[a0_0x5aa207(0xd9)];[a0_0x5aa207(0x109)];[a0_0x5aa207(0xd8)];[a0_0x5aa207(0xfa)];['heartbeatTimer'];[a0_0x5aa207(0xec)];[a0_0x5aa207(0x11e)]=!0x1;constructor(_0x47ad2f){const _0x5595b9=a0_0x5aa207;super();if(this[_0x5595b9(0x107)]=_0x47ad2f[_0x5595b9(0x107)][_0x5595b9(0x106)](/\/$/,''),this['alias']=_0x47ad2f[_0x5595b9(0x108)],this['token']=_0x47ad2f['token'],this[_0x5595b9(0xd9)]=_0x47ad2f[_0x5595b9(0xd9)]||_0x5595b9(0x100),this[_0x5595b9(0x109)]=_0x5595b9(0xee)+_0x47ad2f[_0x5595b9(0x108)]+'-'+Date['now']()[_0x5595b9(0xef)](0x24),this[_0x5595b9(0xd8)]=_0x47ad2f[_0x5595b9(0xd8)]??0x2bf20,this[_0x5595b9(0xfa)]=_0x47ad2f[_0x5595b9(0xfa)]??0xbb8,_0x47ad2f[_0x5595b9(0x110)]!==!0x1)this[_0x5595b9(0x105)]();}[a0_0x5aa207(0xf5)](_0x5fdeb3){const _0x2d8ca9=a0_0x5aa207;console[_0x2d8ca9(0xf5)]('['+new Date()['toTimeString']()['slice'](0x0,0x8)+_0x2d8ca9(0xcf)+this[_0x2d8ca9(0x108)]+']\x20'+_0x5fdeb3);}async[a0_0x5aa207(0x10d)](_0x45979e,_0x67f4c2){const _0x16d5cf=a0_0x5aa207;let _0x374bc2={'Content-Type':_0x16d5cf(0xe4),'Accept':_0x16d5cf(0xf6)};if(this[_0x16d5cf(0xe1)])_0x374bc2[_0x16d5cf(0xf9)]=_0x16d5cf(0xfd)+this[_0x16d5cf(0xe1)];let _0x22adec=await(await fetch(this['url']+'/mcp',{'method':_0x16d5cf(0x11a),'headers':_0x374bc2,'body':JSON[_0x16d5cf(0x114)]({'jsonrpc':_0x16d5cf(0xd0),'id':Date[_0x16d5cf(0xde)](),'method':_0x16d5cf(0x103),'params':{'name':_0x45979e,'arguments':_0x67f4c2}})}))[_0x16d5cf(0xf0)](),_0x3347e1=_0x22adec[_0x16d5cf(0xf2)](/data: (.+)/),_0xdefda1=_0x3347e1?JSON[_0x16d5cf(0x10e)](_0x3347e1[0x1]):JSON[_0x16d5cf(0x10e)](_0x22adec),_0x3a1676=_0xdefda1?.[_0x16d5cf(0x111)]?.[_0x16d5cf(0x10a)]?.[0x0]?.[_0x16d5cf(0xf0)];return _0x3a1676?JSON['parse'](_0x3a1676):_0xdefda1;}async[a0_0x5aa207(0x105)](){const _0x5f85e5=a0_0x5aa207;if(this[_0x5f85e5(0x11e)])return;this[_0x5f85e5(0x11e)]=!0x0,await this[_0x5f85e5(0xf3)]('idle'),this[_0x5f85e5(0xf5)](_0x5f85e5(0xdb)),this[_0x5f85e5(0xfc)]=setInterval(()=>{const _0x5eb5ea=_0x5f85e5;this[_0x5eb5ea(0xf3)](_0x5eb5ea(0xff))[_0x5eb5ea(0x119)](_0x13203a=>this['log'](_0x5eb5ea(0xfb)+_0x13203a[_0x5eb5ea(0xf7)]));},this[_0x5f85e5(0xd8)]),this[_0x5f85e5(0x116)]();}async[a0_0x5aa207(0x117)](){const _0x49f25e=a0_0x5aa207;if(this[_0x49f25e(0x11e)]=!0x1,this[_0x49f25e(0xec)]?.[_0x49f25e(0x11f)](),this[_0x49f25e(0xfc)])clearInterval(this['heartbeatTimer']);await this[_0x49f25e(0xf3)]('offline')[_0x49f25e(0x119)](()=>{}),this['log'](_0x49f25e(0xed));}async[a0_0x5aa207(0xdc)](_0x4d1e04,_0x422be9,_0x33f24d='normal'){const _0x58ff90=a0_0x5aa207;return this[_0x58ff90(0x10d)](_0x58ff90(0xd3),{'alias':_0x4d1e04,'task':_0x422be9,'priority':_0x33f24d,'from_session':this[_0x58ff90(0x108)]});}async[a0_0x5aa207(0xf7)](_0x2de477,_0x3fd06a){const _0x5cc294=a0_0x5aa207;return this[_0x5cc294(0x10d)]('send_message',{'alias':_0x2de477,'message':_0x3fd06a,'from_session':this[_0x5cc294(0x108)]});}async[a0_0x5aa207(0xe8)](_0x3b3fed,_0x184d4b,_0x4848ea=a0_0x5aa207(0xeb)){const _0x14bcfc=a0_0x5aa207;return this[_0x14bcfc(0x10d)](_0x14bcfc(0xdf),{'in_reply_to':_0x3b3fed,'text':_0x184d4b,'status':_0x4848ea});}async[a0_0x5aa207(0xf3)](_0x930c31,_0x51a838){const _0x519971=a0_0x5aa207;return this['call']('report_status',{'resume_id':this[_0x519971(0x109)],'alias':this[_0x519971(0x108)],'status':_0x930c31,'server':a0_0x6b38b3(),'hostname':a0_0x6b38b3(),'agent':this[_0x519971(0xd9)],'project_dir':process['cwd'](),..._0x51a838});}async[a0_0x5aa207(0x113)](){const _0x68d16f=a0_0x5aa207;return this[_0x68d16f(0x10d)](_0x68d16f(0xd5),{});}async[a0_0x5aa207(0x118)](_0xe805e0,_0x2e4b2e){const _0x1911cc=a0_0x5aa207;return this[_0x1911cc(0x10d)](_0x1911cc(0x118),{'message':_0xe805e0,'filter_server':_0x2e4b2e?.['server'],'filter_status':_0x2e4b2e?.[_0x1911cc(0xf3)]});}async[a0_0x5aa207(0x116)](){const _0x34f5e5=a0_0x5aa207;let _0x44fca8=encodeURIComponent(this['alias']),_0x376b8f=this[_0x34f5e5(0x107)]+_0x34f5e5(0xf4)+_0x44fca8,_0x15a433=this[_0x34f5e5(0xfa)];while(this[_0x34f5e5(0x11e)]){try{this[_0x34f5e5(0xec)]=new AbortController();let _0x8d52a9={'Accept':_0x34f5e5(0xd6)};if(this[_0x34f5e5(0xe1)])_0x8d52a9['Authorization']=_0x34f5e5(0xfd)+this[_0x34f5e5(0xe1)];let _0xf1718=await fetch(_0x376b8f,{'headers':_0x8d52a9,'signal':this[_0x34f5e5(0xec)]['signal']});if(!_0xf1718['ok']||!_0xf1718[_0x34f5e5(0xe7)]){this[_0x34f5e5(0xf5)]('SSE\x20failed:\x20'+_0xf1718[_0x34f5e5(0xf3)]),await this[_0x34f5e5(0x102)](_0x15a433),_0x15a433=Math[_0x34f5e5(0x112)](_0x15a433*1.5,0xea60);continue;}_0x15a433=this[_0x34f5e5(0xfa)];let _0x2fc049=_0xf1718[_0x34f5e5(0xe7)][_0x34f5e5(0xea)](),_0x3d6c41=new TextDecoder(),_0x3d7d38='';while(this[_0x34f5e5(0x11e)]){let {done:_0x4c9277,value:_0x1cf8ca}=await _0x2fc049[_0x34f5e5(0xe6)]();if(_0x4c9277)break;_0x3d7d38+=_0x3d6c41[_0x34f5e5(0x11d)](_0x1cf8ca,{'stream':!0x0});let _0x1b850d=_0x3d7d38[_0x34f5e5(0x115)]('\x0a');_0x3d7d38=_0x1b850d['pop']()||'';for(let _0x25a619 of _0x1b850d){if(!_0x25a619[_0x34f5e5(0xd1)](_0x34f5e5(0xe3)))continue;try{let _0x3ba9fb=JSON[_0x34f5e5(0x10e)](_0x25a619['slice'](0x6));if(_0x3ba9fb[_0x34f5e5(0xe9)]===_0x34f5e5(0xcd)){this['log']('SSE\x20connected'),this[_0x34f5e5(0xce)](_0x34f5e5(0xcd));continue;}if(_0x3ba9fb[_0x34f5e5(0xe9)]===_0x34f5e5(0xd4)||_0x3ba9fb[_0x34f5e5(0xe9)]===_0x34f5e5(0x104)||_0x3ba9fb[_0x34f5e5(0xe9)]===_0x34f5e5(0x118))await this[_0x34f5e5(0xdd)]();}catch{}}}}catch(_0x198ae9){if(_0x198ae9[_0x34f5e5(0x11c)]==='AbortError')break;this[_0x34f5e5(0xce)](_0x34f5e5(0xe2),_0x198ae9),this[_0x34f5e5(0xf5)](_0x34f5e5(0x10f)+_0x198ae9['message']);}if(this[_0x34f5e5(0x11e)])this[_0x34f5e5(0xce)](_0x34f5e5(0xed)),this[_0x34f5e5(0xf5)]('SSE\x20reconnecting\x20in\x20'+_0x15a433/0x3e8+'s...'),await this[_0x34f5e5(0x102)](_0x15a433),_0x15a433=Math[_0x34f5e5(0x112)](_0x15a433*1.5,0xea60);}}async[a0_0x5aa207(0xdd)](){const _0x3d456e=a0_0x5aa207;try{let _0x12d9d9=(await this['call']('get_inbox',{'alias':this[_0x3d456e(0x108)],'limit':0xa}))?.[_0x3d456e(0x10b)]||[];for(let _0x297550 of _0x12d9d9)await this[_0x3d456e(0x10d)]('ack_inbox',{'alias':this[_0x3d456e(0x108)],'message_id':_0x297550['id']}),this['log']('←\x20'+_0x297550[_0x3d456e(0xda)]+':\x20'+_0x297550[_0x3d456e(0x10a)]['slice'](0x0,0x3c)),this['emit'](_0x3d456e(0xe5),_0x297550),this['emit']('message',_0x297550);}catch(_0x4476fa){this[_0x3d456e(0xf5)](_0x3d456e(0xe0)+_0x4476fa['message']);}}[a0_0x5aa207(0x102)](_0x3443b1){return new Promise(_0x5e965d=>setTimeout(_0x5e965d,_0x3443b1));}}var $=T;export{$ as default,T as CommHub};
1
+ const a0_0x1e05e3=a0_0x17ad;(function(_0xa84030,_0x2b6ba6){const _0x5cd28f=a0_0x17ad,_0x840ed=_0xa84030();while(!![]){try{const _0x399355=parseInt(_0x5cd28f(0x107))/0x1*(parseInt(_0x5cd28f(0x10d))/0x2)+parseInt(_0x5cd28f(0x106))/0x3+-parseInt(_0x5cd28f(0xe1))/0x4*(parseInt(_0x5cd28f(0xc9))/0x5)+-parseInt(_0x5cd28f(0xf7))/0x6+parseInt(_0x5cd28f(0xda))/0x7*(-parseInt(_0x5cd28f(0x114))/0x8)+parseInt(_0x5cd28f(0xd0))/0x9+parseInt(_0x5cd28f(0xd9))/0xa;if(_0x399355===_0x2b6ba6)break;else _0x840ed['push'](_0x840ed['shift']());}catch(_0x1c6911){_0x840ed['push'](_0x840ed['shift']());}}}(a0_0x541d,0xbb255));import{EventEmitter as a0_0x1d4b36}from'events';import{hostname as a0_0xf8f996}from'os';function a0_0x541d(){const _0x49f1b9=['/mcp','read','slice','url','connectSSE','2XFLsBC','task','abort','emit','min','decode','reply','6128rDFjMG','autoConnect','connected','reconnectDelay','application/json,\x20text/event-stream','getReader','application/json','normal','send_reply','SSE\x20connected','getAllStatus','processInbox','get_all_status','match','registered','error','sdk','split','call','Bearer\x20','POST','5xgKcNn','parse','inbox\x20error:\x20','result','tools/call','heartbeat\x20failed:\x20','2.0','1512963cGWYxM','pop','content','catch','name','alias','get_inbox','send','server','28635950Dmpesl','12831gaSKzJ','message','completed','sseAbort','toTimeString','offline','SSE\x20reconnecting\x20in\x20','4304392pETzQv','disconnected','send_task','cwd','running','replace','now','body','new_message','type','broadcast','SSE\x20error:\x20','startsWith','status','resumeId','sleep','AbortError','data:\x20','new_task','heartbeatTimer','send_message','/events/','6423750fECuck','toString','heartbeatInterval','ack_inbox','agent','Authorization','disconnect','idle','text','log','s...',']\x20[commhub:','messages','token','connect','2353107GhfMyv','501279iIIyeE'];a0_0x541d=function(){return _0x49f1b9;};return a0_0x541d();}class T extends a0_0x1d4b36{[a0_0x1e05e3(0x10b)];['alias'];[a0_0x1e05e3(0x104)];[a0_0x1e05e3(0xfb)];['resumeId'];[a0_0x1e05e3(0xf9)];[a0_0x1e05e3(0x117)];[a0_0x1e05e3(0xf4)];[a0_0x1e05e3(0xdd)];[a0_0x1e05e3(0xe5)]=!0x1;constructor(_0x3aef50){const _0x34362b=a0_0x1e05e3;super();if(this[_0x34362b(0x10b)]=_0x3aef50[_0x34362b(0x10b)][_0x34362b(0xe6)](/\/$/,''),this[_0x34362b(0xd5)]=_0x3aef50[_0x34362b(0xd5)],this[_0x34362b(0x104)]=_0x3aef50[_0x34362b(0x104)],this[_0x34362b(0xfb)]=_0x3aef50[_0x34362b(0xfb)]||_0x34362b(0xc4),this[_0x34362b(0xef)]='sdk-'+_0x3aef50[_0x34362b(0xd5)]+'-'+Date[_0x34362b(0xe7)]()[_0x34362b(0xf8)](0x24),this[_0x34362b(0xf9)]=_0x3aef50['heartbeatInterval']??0x2bf20,this[_0x34362b(0x117)]=_0x3aef50['reconnectDelay']??0xbb8,_0x3aef50[_0x34362b(0x115)]!==!0x1)this[_0x34362b(0x105)]();}[a0_0x1e05e3(0x100)](_0x3e191e){const _0x51ed56=a0_0x1e05e3;console['log']('['+new Date()[_0x51ed56(0xde)]()['slice'](0x0,0x8)+_0x51ed56(0x102)+this[_0x51ed56(0xd5)]+']\x20'+_0x3e191e);}async[a0_0x1e05e3(0xc6)](_0x35a2b9,_0x2e56b8){const _0x43a918=a0_0x1e05e3;let _0x5a4ee8={'Content-Type':_0x43a918(0x11a),'Accept':_0x43a918(0x118)};if(this['token'])_0x5a4ee8[_0x43a918(0xfc)]=_0x43a918(0xc7)+this[_0x43a918(0x104)];let _0x44a97b=await(await fetch(this[_0x43a918(0x10b)]+_0x43a918(0x108),{'method':_0x43a918(0xc8),'headers':_0x5a4ee8,'body':JSON['stringify']({'jsonrpc':_0x43a918(0xcf),'id':Date['now'](),'method':_0x43a918(0xcd),'params':{'name':_0x35a2b9,'arguments':_0x2e56b8}})}))[_0x43a918(0xff)](),_0x5c1b65=_0x44a97b[_0x43a918(0xc1)](/data: (.+)/),_0x380f67=_0x5c1b65?JSON[_0x43a918(0xca)](_0x5c1b65[0x1]):JSON['parse'](_0x44a97b),_0x451864=_0x380f67?.[_0x43a918(0xcc)]?.[_0x43a918(0xd2)]?.[0x0]?.[_0x43a918(0xff)];return _0x451864?JSON[_0x43a918(0xca)](_0x451864):_0x380f67;}async[a0_0x1e05e3(0x105)](){const _0x4c9801=a0_0x1e05e3;if(this[_0x4c9801(0xe5)])return;this[_0x4c9801(0xe5)]=!0x0,await this[_0x4c9801(0xee)](_0x4c9801(0xfe)),this[_0x4c9801(0x100)](_0x4c9801(0xc2)),this['heartbeatTimer']=setInterval(()=>{const _0x21aee8=_0x4c9801;this[_0x21aee8(0xee)]('idle')[_0x21aee8(0xd3)](_0x4e0cf7=>this[_0x21aee8(0x100)](_0x21aee8(0xce)+_0x4e0cf7[_0x21aee8(0xdb)]));},this['heartbeatInterval']),this['connectSSE']();}async[a0_0x1e05e3(0xfd)](){const _0x167c9d=a0_0x1e05e3;if(this[_0x167c9d(0xe5)]=!0x1,this[_0x167c9d(0xdd)]?.[_0x167c9d(0x10f)](),this[_0x167c9d(0xf4)])clearInterval(this[_0x167c9d(0xf4)]);await this[_0x167c9d(0xee)](_0x167c9d(0xdf))[_0x167c9d(0xd3)](()=>{}),this[_0x167c9d(0x100)](_0x167c9d(0xe2));}async[a0_0x1e05e3(0xd7)](_0x15d03e,_0x15b127,_0x42f0c1=a0_0x1e05e3(0x11b)){const _0x1f08e3=a0_0x1e05e3;return this[_0x1f08e3(0xc6)](_0x1f08e3(0xe3),{'alias':_0x15d03e,'task':_0x15b127,'priority':_0x42f0c1,'from_session':this[_0x1f08e3(0xd5)]});}async['message'](_0xa58786,_0x11c51b){const _0x520aca=a0_0x1e05e3;return this[_0x520aca(0xc6)](_0x520aca(0xf5),{'alias':_0xa58786,'message':_0x11c51b,'from_session':this[_0x520aca(0xd5)]});}async[a0_0x1e05e3(0x113)](_0x56f239,_0x51fd09,_0x1b9089=a0_0x1e05e3(0xdc)){const _0x1eb37c=a0_0x1e05e3;return this[_0x1eb37c(0xc6)](_0x1eb37c(0x11c),{'in_reply_to':_0x56f239,'text':_0x51fd09,'status':_0x1b9089});}async['status'](_0x4236a4,_0x4c36a0){const _0x3adb22=a0_0x1e05e3;return this[_0x3adb22(0xc6)]('report_status',{'resume_id':this[_0x3adb22(0xef)],'alias':this['alias'],'status':_0x4236a4,'server':a0_0xf8f996(),'hostname':a0_0xf8f996(),'agent':this[_0x3adb22(0xfb)],'project_dir':process[_0x3adb22(0xe4)](),..._0x4c36a0});}async[a0_0x1e05e3(0x11e)](){const _0x30e151=a0_0x1e05e3;return this['call'](_0x30e151(0xc0),{});}async[a0_0x1e05e3(0xeb)](_0x52446b,_0x16a9e1){const _0x222bb2=a0_0x1e05e3;return this[_0x222bb2(0xc6)](_0x222bb2(0xeb),{'message':_0x52446b,'filter_server':_0x16a9e1?.[_0x222bb2(0xd8)],'filter_status':_0x16a9e1?.[_0x222bb2(0xee)]});}async[a0_0x1e05e3(0x10c)](){const _0x39735f=a0_0x1e05e3;let _0x5aead5=encodeURIComponent(this['alias']),_0x5a8154=this[_0x39735f(0x10b)]+_0x39735f(0xf6)+_0x5aead5,_0x6a387e=this['reconnectDelay'];while(this[_0x39735f(0xe5)]){try{this['sseAbort']=new AbortController();let _0x396add={'Accept':'text/event-stream'};if(this[_0x39735f(0x104)])_0x396add[_0x39735f(0xfc)]=_0x39735f(0xc7)+this[_0x39735f(0x104)];let _0x36f07e=await fetch(_0x5a8154,{'headers':_0x396add,'signal':this[_0x39735f(0xdd)]['signal']});if(!_0x36f07e['ok']||!_0x36f07e['body']){this['log']('SSE\x20failed:\x20'+_0x36f07e[_0x39735f(0xee)]),await this[_0x39735f(0xf0)](_0x6a387e),_0x6a387e=Math[_0x39735f(0x111)](_0x6a387e*1.5,0xea60);continue;}_0x6a387e=this[_0x39735f(0x117)];let _0x2ec3e6=_0x36f07e[_0x39735f(0xe8)][_0x39735f(0x119)](),_0xb5aff4=new TextDecoder(),_0x21a1bf='';while(this[_0x39735f(0xe5)]){let {done:_0x30a148,value:_0x362c60}=await _0x2ec3e6[_0x39735f(0x109)]();if(_0x30a148)break;_0x21a1bf+=_0xb5aff4[_0x39735f(0x112)](_0x362c60,{'stream':!0x0});let _0x45e493=_0x21a1bf[_0x39735f(0xc5)]('\x0a');_0x21a1bf=_0x45e493[_0x39735f(0xd1)]()||'';for(let _0xca0a28 of _0x45e493){if(!_0xca0a28[_0x39735f(0xed)](_0x39735f(0xf2)))continue;try{let _0x115ee0=JSON['parse'](_0xca0a28['slice'](0x6));if(_0x115ee0[_0x39735f(0xea)]===_0x39735f(0x116)){this[_0x39735f(0x100)](_0x39735f(0x11d)),this[_0x39735f(0x110)]('connected');continue;}if(_0x115ee0[_0x39735f(0xea)]===_0x39735f(0xf3)||_0x115ee0[_0x39735f(0xea)]===_0x39735f(0xe9)||_0x115ee0[_0x39735f(0xea)]===_0x39735f(0xeb))await this[_0x39735f(0x11f)]();}catch{}}}}catch(_0x2a4069){if(_0x2a4069[_0x39735f(0xd4)]===_0x39735f(0xf1))break;this['emit'](_0x39735f(0xc3),_0x2a4069),this[_0x39735f(0x100)](_0x39735f(0xec)+_0x2a4069[_0x39735f(0xdb)]);}if(this[_0x39735f(0xe5)])this[_0x39735f(0x110)](_0x39735f(0xe2)),this['log'](_0x39735f(0xe0)+_0x6a387e/0x3e8+_0x39735f(0x101)),await this[_0x39735f(0xf0)](_0x6a387e),_0x6a387e=Math[_0x39735f(0x111)](_0x6a387e*1.5,0xea60);}}async[a0_0x1e05e3(0x11f)](){const _0xc072a7=a0_0x1e05e3;try{let _0x48fa6c=(await this[_0xc072a7(0xc6)](_0xc072a7(0xd6),{'alias':this[_0xc072a7(0xd5)],'limit':0xa}))?.[_0xc072a7(0x103)]||[];for(let _0x570824 of _0x48fa6c)await this[_0xc072a7(0xc6)](_0xc072a7(0xfa),{'alias':this[_0xc072a7(0xd5)],'message_id':_0x570824['id']}),this[_0xc072a7(0x100)]('←\x20'+_0x570824['from_session']+':\x20'+_0x570824[_0xc072a7(0xd2)][_0xc072a7(0x10a)](0x0,0x3c)),this['emit'](_0xc072a7(0x10e),_0x570824),this[_0xc072a7(0x110)](_0xc072a7(0xdb),_0x570824);}catch(_0x3795da){this['log'](_0xc072a7(0xcb)+_0x3795da['message']);}}[a0_0x1e05e3(0xf0)](_0x11b3c0){return new Promise(_0x274f3e=>setTimeout(_0x274f3e,_0x11b3c0));}}var $=T;function a0_0x17ad(_0x3fa784,_0x4b9841){_0x3fa784=_0x3fa784-0xc0;const _0x541dd4=a0_0x541d();let _0x17ada9=_0x541dd4[_0x3fa784];return _0x17ada9;}export{$ as default,T as CommHub};
@@ -94,6 +94,17 @@ export declare function parsePostContent(rawJson: string): string;
94
94
  * @internal exported for unit tests.
95
95
  */
96
96
  export declare function extractPostImageKeys(rawJson: string): string[];
97
+ /**
98
+ * Sanitize a Feishu-supplied `file_name` so it's safe to append to a
99
+ * filesystem path. Strips `/`, `\`, `..`, control characters, and NUL
100
+ * bytes. Empty / all-stripped input falls back to a placeholder that
101
+ * uses the message id, so a hostile client can never write outside the
102
+ * conversation's `<mediaDir>/<convKey>/` directory.
103
+ *
104
+ * NOT a full display-safety pass — the LLM still sees the sanitized
105
+ * bytes and shouldn't render them as HTML/etc. That's a Layer above.
106
+ */
107
+ export declare function sanitizeFileName(raw: string, fallback: string): string;
97
108
  /**
98
109
  * Feishu text-message practical chunk threshold (RFC-020 §16).
99
110
  *
@@ -0,0 +1,62 @@
1
+ /**
2
+ * RFC-020 §16.1 — feishu outbound route decision (pure helper).
3
+ *
4
+ * Single source of truth for the `adapter.send` decision tree that
5
+ * picks among text / interactive card / image (rendered PNG) / file /
6
+ * imagePath outputs. Extracted into a pure module so the production
7
+ * call site AND the unit tests can bind the same function — previously
8
+ * the test mirrored the decision tree in a sibling `pickRoute` helper,
9
+ * which would drift silently if the production tree changed.
10
+ *
11
+ * Inputs are the minimal data the decision needs:
12
+ *
13
+ * - `text` / `imagePath` / `files` — payload from `NormalizedIMMessage`
14
+ * - `forceTextOnly` — caption-mode hint (RFC-020 §15.2)
15
+ * - `mode` — channel-config `outboundRender` (`"plain"` / `"card"` /
16
+ * `"auto"`, RFC-020 §16)
17
+ *
18
+ * Outputs the chosen `route` plus a short `reason` string for log /
19
+ * debug. The CALLER (adapter.send) actually performs the upload /
20
+ * render side-effects keyed on the route — this function does no I/O.
21
+ *
22
+ * Behavior contract (mirrors adapter.send line-for-line, locked by
23
+ * `feishu-outbound-render-mode.test.ts`):
24
+ *
25
+ * 1. `imagePath` set → `image_upload`
26
+ * 2. `files[0].path` set → `file_upload`
27
+ * 3. `forceTextOnly` true → `text`
28
+ * 4. mode "plain" → `text` (always)
29
+ * 5. mode "card" → `card_short_md` iff `looksLikeMarkdown(text)` AND
30
+ * NOT `shouldRenderAsImage(text)`; else `text`
31
+ * 6. mode "auto" → `image_render` iff `shouldRenderAsImage(text)`;
32
+ * else `card_short_md` iff `looksLikeMarkdown(text)`; else `text`
33
+ * 7. unknown mode (defensive default-default) → `text`
34
+ *
35
+ * The production switch in adapter.send may add the actual upload /
36
+ * render / lark API calls keyed on the route, but the route itself
37
+ * is decided HERE. To change the decision, change this file.
38
+ */
39
+ export type OutboundRoute = "image_upload" | "file_upload" | "text" | "card_short_md" | "image_render";
40
+ export interface RouteInput {
41
+ text?: string;
42
+ imagePath?: string;
43
+ files?: {
44
+ name: string;
45
+ path?: string;
46
+ }[];
47
+ forceTextOnly?: boolean;
48
+ /** `outboundRender` from the channel config. Defaults to "plain" when
49
+ * absent so a caller that doesn't read the config still gets the
50
+ * "Vincent default" behavior. */
51
+ mode?: "plain" | "card" | "auto";
52
+ }
53
+ export interface RouteDecision {
54
+ route: OutboundRoute;
55
+ reason: string;
56
+ }
57
+ /**
58
+ * Decide the outbound route for a `NormalizedIMMessage` (or a subset
59
+ * of its fields). Pure — no I/O, no SDK calls; safe to call from tests
60
+ * directly.
61
+ */
62
+ export declare function resolveOutboundRoute(input: RouteInput): RouteDecision;