@sleep2agi/agent-network 2.2.22-preview.1 → 2.2.22-preview.3

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_0xe11e(){const _0x141971=['send_message','disconnected','from_session','application/json','idle','toString','registered','ack_inbox','2DwpuCm','send','decode','url','content','42smZJdH','body','new_task','connectSSE','match','9978950oGiwSZ','send_task','parse','completed','heartbeat\x20failed:\x20','get_inbox','get_all_status','2.0','/events/','sseAbort','status','cwd','type','connect','log','resumeId','agent','startsWith','processInbox','SSE\x20connected','heartbeatInterval','signal','4587213XFPpnl','tools/call','min','965100yutfBv','disconnect',']\x20[commhub:','sleep','inbox\x20error:\x20','message','task','broadcast','call','name','750256lglDUs','alias','text','catch','error','autoConnect','reconnectDelay','Bearer\x20','heartbeatTimer','result','14125365keppuy','sdk','emit','3075xIcTlY','AbortError','data:\x20','/mcp','SSE\x20failed:\x20','split','slice','abort','running','stringify','connected','reply','6618zCJEJT','sdk-','getReader','pop','now','83120VvoLsD','token','SSE\x20reconnecting\x20in\x20','Authorization','replace'];a0_0xe11e=function(){return _0x141971;};return a0_0xe11e();}const a0_0x4f1d7a=a0_0x580f;(function(_0x512ea7,_0x10ec59){const _0x292ab0=a0_0x580f,_0x24cbb3=_0x512ea7();while(!![]){try{const _0x105923=parseInt(_0x292ab0(0x15a))/0x1+-parseInt(_0x292ab0(0x137))/0x2*(parseInt(_0x292ab0(0x157))/0x3)+parseInt(_0x292ab0(0x164))/0x4+parseInt(_0x292ab0(0x171))/0x5*(parseInt(_0x292ab0(0x125))/0x6)+-parseInt(_0x292ab0(0x13c))/0x7*(-parseInt(_0x292ab0(0x12a))/0x8)+parseInt(_0x292ab0(0x16e))/0x9+-parseInt(_0x292ab0(0x141))/0xa;if(_0x105923===_0x10ec59)break;else _0x24cbb3['push'](_0x24cbb3['shift']());}catch(_0x34d8c0){_0x24cbb3['push'](_0x24cbb3['shift']());}}}(a0_0xe11e,0xe47bc));function a0_0x580f(_0x265e6,_0x4a4740){_0x265e6=_0x265e6-0x125;const _0xe11e28=a0_0xe11e();let _0x580fb2=_0xe11e28[_0x265e6];return _0x580fb2;}import{EventEmitter as a0_0x371f24}from'events';import{hostname as a0_0x11daac}from'os';class T extends a0_0x371f24{[a0_0x4f1d7a(0x13a)];[a0_0x4f1d7a(0x165)];['token'];['agent'];[a0_0x4f1d7a(0x150)];[a0_0x4f1d7a(0x155)];[a0_0x4f1d7a(0x16a)];['heartbeatTimer'];[a0_0x4f1d7a(0x14a)];[a0_0x4f1d7a(0x179)]=!0x1;constructor(_0x186dab){const _0x207316=a0_0x4f1d7a;super();if(this[_0x207316(0x13a)]=_0x186dab[_0x207316(0x13a)][_0x207316(0x12e)](/\/$/,''),this[_0x207316(0x165)]=_0x186dab[_0x207316(0x165)],this[_0x207316(0x12b)]=_0x186dab['token'],this[_0x207316(0x151)]=_0x186dab[_0x207316(0x151)]||_0x207316(0x16f),this['resumeId']=_0x207316(0x126)+_0x186dab[_0x207316(0x165)]+'-'+Date['now']()[_0x207316(0x134)](0x24),this[_0x207316(0x155)]=_0x186dab[_0x207316(0x155)]??0x2bf20,this['reconnectDelay']=_0x186dab[_0x207316(0x16a)]??0xbb8,_0x186dab[_0x207316(0x169)]!==!0x1)this[_0x207316(0x14e)]();}[a0_0x4f1d7a(0x14f)](_0x2c698a){const _0x52d480=a0_0x4f1d7a;console['log']('['+new Date()['toTimeString']()[_0x52d480(0x177)](0x0,0x8)+_0x52d480(0x15c)+this[_0x52d480(0x165)]+']\x20'+_0x2c698a);}async[a0_0x4f1d7a(0x162)](_0x59d317,_0x41e41a){const _0xe96894=a0_0x4f1d7a;let _0x27aafc={'Content-Type':_0xe96894(0x132),'Accept':'application/json,\x20text/event-stream'};if(this['token'])_0x27aafc[_0xe96894(0x12d)]=_0xe96894(0x16b)+this[_0xe96894(0x12b)];let _0x325bed=await(await fetch(this[_0xe96894(0x13a)]+_0xe96894(0x174),{'method':'POST','headers':_0x27aafc,'body':JSON[_0xe96894(0x17a)]({'jsonrpc':_0xe96894(0x148),'id':Date[_0xe96894(0x129)](),'method':_0xe96894(0x158),'params':{'name':_0x59d317,'arguments':_0x41e41a}})}))[_0xe96894(0x166)](),_0x595402=_0x325bed[_0xe96894(0x140)](/data: (.+)/),_0x682efc=_0x595402?JSON[_0xe96894(0x143)](_0x595402[0x1]):JSON[_0xe96894(0x143)](_0x325bed),_0x59375e=_0x682efc?.[_0xe96894(0x16d)]?.[_0xe96894(0x13b)]?.[0x0]?.[_0xe96894(0x166)];return _0x59375e?JSON[_0xe96894(0x143)](_0x59375e):_0x682efc;}async[a0_0x4f1d7a(0x14e)](){const _0x89a310=a0_0x4f1d7a;if(this[_0x89a310(0x179)])return;this[_0x89a310(0x179)]=!0x0,await this[_0x89a310(0x14b)](_0x89a310(0x133)),this[_0x89a310(0x14f)](_0x89a310(0x135)),this[_0x89a310(0x16c)]=setInterval(()=>{const _0x239124=_0x89a310;this[_0x239124(0x14b)]('idle')[_0x239124(0x167)](_0x445367=>this[_0x239124(0x14f)](_0x239124(0x145)+_0x445367[_0x239124(0x15f)]));},this[_0x89a310(0x155)]),this['connectSSE']();}async[a0_0x4f1d7a(0x15b)](){const _0x29013e=a0_0x4f1d7a;if(this[_0x29013e(0x179)]=!0x1,this[_0x29013e(0x14a)]?.[_0x29013e(0x178)](),this[_0x29013e(0x16c)])clearInterval(this[_0x29013e(0x16c)]);await this[_0x29013e(0x14b)]('offline')[_0x29013e(0x167)](()=>{}),this['log'](_0x29013e(0x130));}async[a0_0x4f1d7a(0x138)](_0x53ef83,_0x48e0f7,_0x3271e8='normal'){const _0x5a59e6=a0_0x4f1d7a;return this[_0x5a59e6(0x162)](_0x5a59e6(0x142),{'alias':_0x53ef83,'task':_0x48e0f7,'priority':_0x3271e8,'from_session':this[_0x5a59e6(0x165)]});}async[a0_0x4f1d7a(0x15f)](_0x8554bb,_0x2a8610){const _0x53df64=a0_0x4f1d7a;return this['call'](_0x53df64(0x12f),{'alias':_0x8554bb,'message':_0x2a8610,'from_session':this[_0x53df64(0x165)]});}async[a0_0x4f1d7a(0x17c)](_0x3e5afe,_0x52eeea,_0x40334f=a0_0x4f1d7a(0x144)){const _0x198b23=a0_0x4f1d7a;return this[_0x198b23(0x162)]('send_reply',{'in_reply_to':_0x3e5afe,'text':_0x52eeea,'status':_0x40334f});}async[a0_0x4f1d7a(0x14b)](_0x5a6158,_0x59a4d6){const _0x231d2a=a0_0x4f1d7a;return this['call']('report_status',{'resume_id':this[_0x231d2a(0x150)],'alias':this[_0x231d2a(0x165)],'status':_0x5a6158,'server':a0_0x11daac(),'hostname':a0_0x11daac(),'agent':this[_0x231d2a(0x151)],'project_dir':process[_0x231d2a(0x14c)](),..._0x59a4d6});}async['getAllStatus'](){const _0x3efbe4=a0_0x4f1d7a;return this['call'](_0x3efbe4(0x147),{});}async[a0_0x4f1d7a(0x161)](_0x458703,_0x37e048){const _0x4b9bcc=a0_0x4f1d7a;return this[_0x4b9bcc(0x162)]('broadcast',{'message':_0x458703,'filter_server':_0x37e048?.['server'],'filter_status':_0x37e048?.[_0x4b9bcc(0x14b)]});}async[a0_0x4f1d7a(0x13f)](){const _0x1aa116=a0_0x4f1d7a;let _0x3299ea=encodeURIComponent(this['alias']),_0x5c2dd0=this[_0x1aa116(0x13a)]+_0x1aa116(0x149)+_0x3299ea,_0x2d4759=this[_0x1aa116(0x16a)];while(this[_0x1aa116(0x179)]){try{this[_0x1aa116(0x14a)]=new AbortController();let _0xe06dff={'Accept':'text/event-stream'};if(this[_0x1aa116(0x12b)])_0xe06dff[_0x1aa116(0x12d)]=_0x1aa116(0x16b)+this['token'];let _0x1ad18e=await fetch(_0x5c2dd0,{'headers':_0xe06dff,'signal':this[_0x1aa116(0x14a)][_0x1aa116(0x156)]});if(!_0x1ad18e['ok']||!_0x1ad18e[_0x1aa116(0x13d)]){this[_0x1aa116(0x14f)](_0x1aa116(0x175)+_0x1ad18e[_0x1aa116(0x14b)]),await this['sleep'](_0x2d4759),_0x2d4759=Math['min'](_0x2d4759*1.5,0xea60);continue;}_0x2d4759=this[_0x1aa116(0x16a)];let _0x123a78=_0x1ad18e[_0x1aa116(0x13d)][_0x1aa116(0x127)](),_0x8e0164=new TextDecoder(),_0x1b23d4='';while(this[_0x1aa116(0x179)]){let {done:_0x40eba2,value:_0x594f07}=await _0x123a78['read']();if(_0x40eba2)break;_0x1b23d4+=_0x8e0164[_0x1aa116(0x139)](_0x594f07,{'stream':!0x0});let _0x3e5ae5=_0x1b23d4[_0x1aa116(0x176)]('\x0a');_0x1b23d4=_0x3e5ae5[_0x1aa116(0x128)]()||'';for(let _0xe79d41 of _0x3e5ae5){if(!_0xe79d41[_0x1aa116(0x152)](_0x1aa116(0x173)))continue;try{let _0x347e01=JSON[_0x1aa116(0x143)](_0xe79d41[_0x1aa116(0x177)](0x6));if(_0x347e01['type']===_0x1aa116(0x17b)){this[_0x1aa116(0x14f)](_0x1aa116(0x154)),this[_0x1aa116(0x170)](_0x1aa116(0x17b));continue;}if(_0x347e01[_0x1aa116(0x14d)]===_0x1aa116(0x13e)||_0x347e01[_0x1aa116(0x14d)]==='new_message'||_0x347e01[_0x1aa116(0x14d)]==='broadcast')await this[_0x1aa116(0x153)]();}catch{}}}}catch(_0x561a52){if(_0x561a52[_0x1aa116(0x163)]===_0x1aa116(0x172))break;this['emit'](_0x1aa116(0x168),_0x561a52),this[_0x1aa116(0x14f)]('SSE\x20error:\x20'+_0x561a52[_0x1aa116(0x15f)]);}if(this['running'])this[_0x1aa116(0x170)](_0x1aa116(0x130)),this['log'](_0x1aa116(0x12c)+_0x2d4759/0x3e8+'s...'),await this[_0x1aa116(0x15d)](_0x2d4759),_0x2d4759=Math[_0x1aa116(0x159)](_0x2d4759*1.5,0xea60);}}async['processInbox'](){const _0x4e2db8=a0_0x4f1d7a;try{let _0x14c8e0=(await this[_0x4e2db8(0x162)](_0x4e2db8(0x146),{'alias':this[_0x4e2db8(0x165)],'limit':0xa}))?.['messages']||[];for(let _0x58d8e2 of _0x14c8e0)await this[_0x4e2db8(0x162)](_0x4e2db8(0x136),{'alias':this[_0x4e2db8(0x165)],'message_id':_0x58d8e2['id']}),this[_0x4e2db8(0x14f)]('←\x20'+_0x58d8e2[_0x4e2db8(0x131)]+':\x20'+_0x58d8e2[_0x4e2db8(0x13b)][_0x4e2db8(0x177)](0x0,0x3c)),this[_0x4e2db8(0x170)](_0x4e2db8(0x160),_0x58d8e2),this[_0x4e2db8(0x170)](_0x4e2db8(0x15f),_0x58d8e2);}catch(_0x949fa8){this[_0x4e2db8(0x14f)](_0x4e2db8(0x15e)+_0x949fa8[_0x4e2db8(0x15f)]);}}['sleep'](_0x4fb1f1){return new Promise(_0x4510f7=>setTimeout(_0x4510f7,_0x4fb1f1));}}var $=T;export{$ as default,T as CommHub};
1
+ function a0_0x1913(_0x3dde8b,_0x4efee4){_0x3dde8b=_0x3dde8b-0xfb;const _0x4a7cd0=a0_0x4a7c();let _0x19136d=_0x4a7cd0[_0x3dde8b];return _0x19136d;}const a0_0x95445c=a0_0x1913;(function(_0x225da2,_0xba3c80){const _0x42c11b=a0_0x1913,_0x4ff15c=_0x225da2();while(!![]){try{const _0x56542b=parseInt(_0x42c11b(0x150))/0x1*(-parseInt(_0x42c11b(0x11d))/0x2)+parseInt(_0x42c11b(0x115))/0x3+parseInt(_0x42c11b(0x130))/0x4+-parseInt(_0x42c11b(0x142))/0x5+parseInt(_0x42c11b(0x10d))/0x6+-parseInt(_0x42c11b(0xfb))/0x7+parseInt(_0x42c11b(0x12a))/0x8;if(_0x56542b===_0xba3c80)break;else _0x4ff15c['push'](_0x4ff15c['shift']());}catch(_0x26afa1){_0x4ff15c['push'](_0x4ff15c['shift']());}}}(a0_0x4a7c,0xe9329));import{EventEmitter as a0_0x349afa}from'events';import{hostname as a0_0x1540f4}from'os';class T extends a0_0x349afa{[a0_0x95445c(0x103)];[a0_0x95445c(0x11c)];['token'];[a0_0x95445c(0x148)];[a0_0x95445c(0x113)];[a0_0x95445c(0x119)];[a0_0x95445c(0x128)];[a0_0x95445c(0x144)];[a0_0x95445c(0x11f)];[a0_0x95445c(0xfe)]=!0x1;constructor(_0x21f2ee){const _0x2e1512=a0_0x95445c;super();if(this[_0x2e1512(0x103)]=_0x21f2ee['url'][_0x2e1512(0x121)](/\/$/,''),this[_0x2e1512(0x11c)]=_0x21f2ee[_0x2e1512(0x11c)],this[_0x2e1512(0x12e)]=_0x21f2ee[_0x2e1512(0x12e)],this['agent']=_0x21f2ee[_0x2e1512(0x148)]||_0x2e1512(0x14a),this['resumeId']='sdk-'+_0x21f2ee[_0x2e1512(0x11c)]+'-'+Date['now']()[_0x2e1512(0x10f)](0x24),this[_0x2e1512(0x119)]=_0x21f2ee[_0x2e1512(0x119)]??0x2bf20,this[_0x2e1512(0x128)]=_0x21f2ee[_0x2e1512(0x128)]??0xbb8,_0x21f2ee[_0x2e1512(0x139)]!==!0x1)this[_0x2e1512(0x102)]();}[a0_0x95445c(0x14e)](_0x5d6ef6){const _0x3e6071=a0_0x95445c;console[_0x3e6071(0x14e)]('['+new Date()['toTimeString']()['slice'](0x0,0x8)+_0x3e6071(0x125)+this[_0x3e6071(0x11c)]+']\x20'+_0x5d6ef6);}async['call'](_0x4e0996,_0x4ba5d7){const _0x285730=a0_0x95445c;let _0x4822d8={'Content-Type':_0x285730(0x135),'Accept':_0x285730(0x13b)};if(this[_0x285730(0x12e)])_0x4822d8[_0x285730(0x127)]=_0x285730(0x117)+this[_0x285730(0x12e)];let _0x215e5c=await(await fetch(this[_0x285730(0x103)]+_0x285730(0x14b),{'method':_0x285730(0x124),'headers':_0x4822d8,'body':JSON[_0x285730(0x14f)]({'jsonrpc':_0x285730(0x106),'id':Date[_0x285730(0xff)](),'method':_0x285730(0x118),'params':{'name':_0x4e0996,'arguments':_0x4ba5d7}})}))[_0x285730(0x114)](),_0x215086=_0x215e5c[_0x285730(0x138)](/data: (.+)/),_0x4993e4=_0x215086?JSON[_0x285730(0x134)](_0x215086[0x1]):JSON[_0x285730(0x134)](_0x215e5c),_0x42f07a=_0x4993e4?.[_0x285730(0x131)]?.[_0x285730(0x107)]?.[0x0]?.[_0x285730(0x114)];return _0x42f07a?JSON['parse'](_0x42f07a):_0x4993e4;}async[a0_0x95445c(0x102)](){const _0xe323ac=a0_0x95445c;if(this[_0xe323ac(0xfe)])return;this[_0xe323ac(0xfe)]=!0x0,await this['status'](_0xe323ac(0x101)),this['log']('registered'),this['heartbeatTimer']=setInterval(()=>{const _0x1dce7c=_0xe323ac;this[_0x1dce7c(0x123)]('idle')['catch'](_0x524fa3=>this[_0x1dce7c(0x14e)]('heartbeat\x20failed:\x20'+_0x524fa3[_0x1dce7c(0x137)]));},this[_0xe323ac(0x119)]),this['connectSSE']();}async['disconnect'](){const _0x88b1c1=a0_0x95445c;if(this[_0x88b1c1(0xfe)]=!0x1,this[_0x88b1c1(0x11f)]?.[_0x88b1c1(0x133)](),this[_0x88b1c1(0x144)])clearInterval(this[_0x88b1c1(0x144)]);await this[_0x88b1c1(0x123)](_0x88b1c1(0x12d))[_0x88b1c1(0x13e)](()=>{}),this[_0x88b1c1(0x14e)](_0x88b1c1(0x10b));}async[a0_0x95445c(0x14c)](_0x14398a,_0x28c292,_0x241926='normal'){const _0x535b34=a0_0x95445c;return this[_0x535b34(0x104)](_0x535b34(0x151),{'alias':_0x14398a,'task':_0x28c292,'priority':_0x241926,'from_session':this[_0x535b34(0x11c)]});}async[a0_0x95445c(0x137)](_0x21a95b,_0x39be8e){const _0x390c60=a0_0x95445c;return this[_0x390c60(0x104)](_0x390c60(0x13a),{'alias':_0x21a95b,'message':_0x39be8e,'from_session':this[_0x390c60(0x11c)]});}async[a0_0x95445c(0x108)](_0x2c74fc,_0x259183,_0x750ed9=a0_0x95445c(0x145)){const _0x321609=a0_0x95445c;return this['call'](_0x321609(0x126),{'in_reply_to':_0x2c74fc,'text':_0x259183,'status':_0x750ed9});}async[a0_0x95445c(0x123)](_0x133efb,_0xf79ce0){const _0x1e2e99=a0_0x95445c;return this['call'](_0x1e2e99(0x12b),{'resume_id':this['resumeId'],'alias':this[_0x1e2e99(0x11c)],'status':_0x133efb,'server':a0_0x1540f4(),'hostname':a0_0x1540f4(),'agent':this[_0x1e2e99(0x148)],'project_dir':process['cwd'](),..._0xf79ce0});}async[a0_0x95445c(0xfd)](){const _0x2d23b9=a0_0x95445c;return this[_0x2d23b9(0x104)]('get_all_status',{});}async['broadcast'](_0x5d244f,_0x58daf8){const _0x321bed=a0_0x95445c;return this[_0x321bed(0x104)](_0x321bed(0x132),{'message':_0x5d244f,'filter_server':_0x58daf8?.[_0x321bed(0x11a)],'filter_status':_0x58daf8?.[_0x321bed(0x123)]});}async[a0_0x95445c(0x112)](){const _0x2f634c=a0_0x95445c;let _0x15e6fc=encodeURIComponent(this['alias']),_0x4ce9fb=this['url']+_0x2f634c(0x13c)+_0x15e6fc,_0x5400d2=this[_0x2f634c(0x128)];while(this[_0x2f634c(0xfe)]){try{this['sseAbort']=new AbortController();let _0x559479={'Accept':_0x2f634c(0x110)};if(this[_0x2f634c(0x12e)])_0x559479[_0x2f634c(0x127)]=_0x2f634c(0x117)+this[_0x2f634c(0x12e)];let _0x29e493=await fetch(_0x4ce9fb,{'headers':_0x559479,'signal':this[_0x2f634c(0x11f)]['signal']});if(!_0x29e493['ok']||!_0x29e493[_0x2f634c(0x149)]){this['log'](_0x2f634c(0x10c)+_0x29e493[_0x2f634c(0x123)]),await this[_0x2f634c(0xfc)](_0x5400d2),_0x5400d2=Math[_0x2f634c(0x100)](_0x5400d2*1.5,0xea60);continue;}_0x5400d2=this[_0x2f634c(0x128)];let _0x1f2a50=_0x29e493[_0x2f634c(0x149)][_0x2f634c(0x143)](),_0x23848a=new TextDecoder(),_0x3de400='';while(this[_0x2f634c(0xfe)]){let {done:_0x347867,value:_0x178662}=await _0x1f2a50['read']();if(_0x347867)break;_0x3de400+=_0x23848a['decode'](_0x178662,{'stream':!0x0});let _0x18e34a=_0x3de400[_0x2f634c(0x12c)]('\x0a');_0x3de400=_0x18e34a['pop']()||'';for(let _0x1c03b5 of _0x18e34a){if(!_0x1c03b5[_0x2f634c(0x11b)](_0x2f634c(0x140)))continue;try{let _0x54f24b=JSON['parse'](_0x1c03b5[_0x2f634c(0x129)](0x6));if(_0x54f24b[_0x2f634c(0x14d)]===_0x2f634c(0x13d)){this['log'](_0x2f634c(0x116)),this['emit']('connected');continue;}if(_0x54f24b[_0x2f634c(0x14d)]===_0x2f634c(0x10a)||_0x54f24b['type']===_0x2f634c(0x11e)||_0x54f24b['type']===_0x2f634c(0x132))await this[_0x2f634c(0x141)]();}catch{}}}}catch(_0x3d6368){if(_0x3d6368[_0x2f634c(0x109)]===_0x2f634c(0x111))break;this[_0x2f634c(0x12f)](_0x2f634c(0x122),_0x3d6368),this[_0x2f634c(0x14e)](_0x2f634c(0x10e)+_0x3d6368[_0x2f634c(0x137)]);}if(this[_0x2f634c(0xfe)])this[_0x2f634c(0x12f)]('disconnected'),this['log'](_0x2f634c(0x146)+_0x5400d2/0x3e8+_0x2f634c(0x13f)),await this[_0x2f634c(0xfc)](_0x5400d2),_0x5400d2=Math[_0x2f634c(0x100)](_0x5400d2*1.5,0xea60);}}async[a0_0x95445c(0x141)](){const _0x39a34b=a0_0x95445c;try{let _0x285f30=(await this[_0x39a34b(0x104)]('get_inbox',{'alias':this['alias'],'limit':0xa}))?.[_0x39a34b(0x105)]||[];for(let _0x45bc73 of _0x285f30)await this[_0x39a34b(0x104)]('ack_inbox',{'alias':this[_0x39a34b(0x11c)],'message_id':_0x45bc73['id']}),this['log']('←\x20'+_0x45bc73[_0x39a34b(0x120)]+':\x20'+_0x45bc73['content'][_0x39a34b(0x129)](0x0,0x3c)),this[_0x39a34b(0x12f)](_0x39a34b(0x136),_0x45bc73),this[_0x39a34b(0x12f)](_0x39a34b(0x137),_0x45bc73);}catch(_0x2f2f9d){this[_0x39a34b(0x14e)](_0x39a34b(0x147)+_0x2f2f9d[_0x39a34b(0x137)]);}}['sleep'](_0x5477e6){return new Promise(_0x529d59=>setTimeout(_0x529d59,_0x5477e6));}}var $=T;export{$ as default,T as CommHub};function a0_0x4a7c(){const _0x4ba167=['inbox\x20error:\x20','agent','body','sdk','/mcp','send','type','log','stringify','172106LWVDXe','send_task','2153417dCVgBb','sleep','getAllStatus','running','now','min','idle','connect','url','call','messages','2.0','content','reply','name','new_task','disconnected','SSE\x20failed:\x20','528534NEelcy','SSE\x20error:\x20','toString','text/event-stream','AbortError','connectSSE','resumeId','text','3324348AhwIuz','SSE\x20connected','Bearer\x20','tools/call','heartbeatInterval','server','startsWith','alias','2FmHrWx','new_message','sseAbort','from_session','replace','error','status','POST',']\x20[commhub:','send_reply','Authorization','reconnectDelay','slice','9879712RzyqgS','report_status','split','offline','token','emit','841344MItbPq','result','broadcast','abort','parse','application/json','task','message','match','autoConnect','send_message','application/json,\x20text/event-stream','/events/','connected','catch','s...','data:\x20','processInbox','6032955nstEbL','getReader','heartbeatTimer','completed','SSE\x20reconnecting\x20in\x20'];a0_0x4a7c=function(){return _0x4ba167;};return a0_0x4a7c();}
@@ -62,6 +62,54 @@ export interface BridgeReplyEnvelope {
62
62
  * connected and the EventDispatcher is registered.
63
63
  */
64
64
  export declare function startFeishuBridge(opts: FeishuBridgeOptions): Promise<FeishuAdapter>;
65
+ /**
66
+ * Dedup wrapper — drops repeat events that arrive within DEDUP_WINDOW_MS
67
+ * (RFC-020 §4.4 / 通信牛 review). Protects against socket-reconnect replay.
68
+ * Sits in front of any other handler so the dropped event never reaches
69
+ * IPC / think / send.
70
+ */
71
+ /** @internal exported for test harness. */
72
+ export declare function withDedup(inner: (event: NormalizedIMEvent) => Promise<void>): (event: NormalizedIMEvent) => Promise<void>;
73
+ /**
74
+ * Rate-limit wrapper — caps event arrival per-sender (DM) and per-chat
75
+ * (group). Over-limit events get a user-visible "处理频率超出限制,请稍后重试"
76
+ * message back via adapter.send (Vincent 2026-06-26 "never silent-drop").
77
+ * Persistent abusers (≥ FLOOD_AUDIT_THRESHOLD denials in
78
+ * FLOOD_AUDIT_WINDOW_MS) trigger an `[feishu:audit] flood ...` stderr line
79
+ * so ops can grep for incidents.
80
+ *
81
+ * Sits AFTER withDedup so socket-replay events don't consume rate-limit
82
+ * quota, and BEFORE the IPC handoff to think — over-limit events never
83
+ * reach the LLM.
84
+ *
85
+ * @internal exported for test harness.
86
+ */
87
+ export declare function withRateLimit(inner: (event: NormalizedIMEvent) => Promise<void>, adapter: FeishuAdapter): (event: NormalizedIMEvent) => Promise<void>;
88
+ /**
89
+ * IPC handler — forwards inbound events to the parent agent-node and routes
90
+ * the parent's reply back to Feishu via the adapter. The parent contract is
91
+ * a single round-trip per event keyed on `idempotencyKey`.
92
+ *
93
+ * ackPlaceholder behavior (RFC-020 §4.2, Vincent ask 2026-06-26):
94
+ * - On event arrival, bridge sends a "⏳ 处理中…" placeholder into the
95
+ * originating thread BEFORE forwarding the IPC envelope. The placeholder
96
+ * is sent so the user gets an immediate push notification ("the bot saw
97
+ * my message"). The placeholder send is awaited so logs stay in order.
98
+ * - On reply IPC, bridge ALWAYS calls adapter.send for the final reply —
99
+ * a new message in the same thread, NOT an in-place edit of the
100
+ * placeholder. Vincent rejected the edit-in-place pattern 2026-06-26:
101
+ * pushing a fresh message gives him a second notification ("the bot
102
+ * replied") that an edit silently misses on most IM clients.
103
+ * - On TTL expiry without reply, bridge similarly send a NEW
104
+ * "[处理超时…]" message in-thread, never edits the placeholder.
105
+ * - adapter.edit remains in the IMAdapter interface for future use but is
106
+ * not called from this path. Tests in tests/feishu-bridge-* assert
107
+ * editCalls.length === 0 to lock that behavior in.
108
+ * - All success paths log to stderr so the round-trip is observable from
109
+ * the agent-node.log (closes the prior silent-success blindspot).
110
+ */
111
+ /** @internal exported for test harness; not intended for production callers. */
112
+ export declare function createIPCEventHandler(adapter: FeishuAdapter, ttlMs: number, ackPlaceholder: boolean): (event: NormalizedIMEvent) => Promise<void>;
65
113
  export { FeishuAdapter } from "./adapter.js";
66
114
  export { loadFeishuChannelConfig } from "./config.js";
67
115
  export type { FeishuAccessList, FeishuChannelConfig, FeishuChannelEnv, } from "./config.js";
@@ -1,11 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import*as B from"@larksuiteoapi/node-sdk";import T from"node:crypto";import{existsSync as C,mkdirSync as M,readFileSync as S,writeFileSync as F}from"node:fs";import{join as O}from"node:path";import{Readable as x}from"node:stream";class N{platform="feishu";ingressMode="socket";feishuConfig=null;connectionName="";client=null;wsClient=null;botOpenId=null;mediaDir=null;health_={connected:!1,lastEventAt:null,lastError:null};async init(Q){if(Q.platform!=="feishu")throw Error(`FeishuAdapter.init: expected platform "feishu", got "${Q.platform}"`);let J=Q.platformConfig;if(!J?.appId||!J?.appSecret)throw Error("FeishuAdapter.init: appId / appSecret missing in platformConfig");this.feishuConfig=J,this.connectionName=Q.connectionName,this.client=new B.Client({appId:J.appId,appSecret:J.appSecret,disableTokenCache:!1}),this.botOpenId=await D(this.client),this.mediaDir=J.channelDir?O(J.channelDir,"media"):null}async start(Q){if(!this.feishuConfig||!this.client)throw Error("FeishuAdapter.start: call init() first");let{appId:J,appSecret:V,access:X,groupPolicy:Z}=this.feishuConfig,$=this.connectionName,Y=this.botOpenId,G=this.mediaDir,W=this.client,U=new B.EventDispatcher({});U.register({"im.message.receive_v1":async(R)=>{try{this.health_={...this.health_,lastEventAt:Date.now()};let H=k(R,$,Y);if(!H)return;await E(R,H,W,G);let q=I(H,X,Z);if(!q.allow){L("deny",H,q.reason);return}await Q(H)}catch(H){let q=H instanceof Error?H.message:String(H);this.health_={...this.health_,lastError:q},L("error",null,q)}}}),this.wsClient=new B.WSClient({appId:J,appSecret:V,loggerLevel:B.LoggerLevel.warn}),await this.wsClient.start({eventDispatcher:U}),this.health_={...this.health_,connected:!0,lastError:null}}async stop(){this.health_={...this.health_,connected:!1},this.wsClient=null,this.client=null,this.feishuConfig=null}async send(Q){if(!this.client)throw Error("FeishuAdapter.send: call init() first");let J,V;if(Q.imagePath){let G=await P(this.client,Q.imagePath);if(!G)throw Error(`FeishuAdapter.send: image upload failed for ${Q.imagePath}`);J="image",V=JSON.stringify({image_key:G})}else{let G=Q.text??Q.markdown;if(!G)throw Error("FeishuAdapter.send: requires text, markdown, or imagePath");J="text",V=JSON.stringify({text:G})}let X=Q.replyToMessageId??Q.target.threadRootId;if(X){let W=(await this.client.im.message.reply({path:{message_id:X},data:{msg_type:J,content:V}}))?.data?.message_id;if(!W)throw Error("FeishuAdapter.send: reply returned no message_id");return{messageId:W}}let Z=Q.target.conversationType==="dm"?"open_id":"chat_id",Y=(await this.client.im.message.create({params:{receive_id_type:Z},data:{receive_id:Q.target.conversationId,msg_type:J,content:V}}))?.data?.message_id;if(!Y)throw Error("FeishuAdapter.send: create returned no message_id");return{messageId:Y}}async edit(Q,J,V){if(!this.client)throw Error("FeishuAdapter.edit: call init() first");let X=V.text??V.markdown;if(!X)throw Error("FeishuAdapter.edit: M3 supports text only");await this.client.im.message.update({path:{message_id:J},data:{msg_type:"text",content:JSON.stringify({text:X})}})}health(){return{...this.health_}}}function k(Q,J,V){let X=Q,Z=X?.message,$=X?.sender,Y=$?.sender_id?.open_id;if(!Z||!Y)return null;let G;if(Z.message_type==="text")try{G=JSON.parse(Z.content).text}catch{G=Z.content}else if(Z.message_type==="file")try{G=`[文件: ${JSON.parse(Z.content).file_name??"unknown"}]`}catch{G="[文件]"}else if(Z.message_type==="sticker")G="[表情]";else if(Z.message_type==="image")G=void 0;else return null;let W=Z.chat_type==="group"?"group":"dm",U=Array.isArray(Z.mentions)?Z.mentions:[],R=V?U.some((q)=>q?.id?.open_id===V):U.length>0,H=`${J}#feishu`;return{platform:"feishu",connectionId:H,tenantId:$?.tenant_key,conversation:{platform:"feishu",conversationId:Z.chat_id,conversationType:W,threadRootId:Z.root_id},sender:{id:Y},messageId:Z.message_id,mentioned:R,content:G?{text:G}:{},receivedAt:Date.now(),idempotencyKey:`feishu:${H}:${Z.message_id}`}}async function E(Q,J,V,X){if(!V||!X)return;let $=Q?.message;if(!$||$.message_type!=="image")return;let Y;try{Y=JSON.parse($.content).image_key}catch{return}if(!Y||!$.message_id)return;let G=await b(V,$.message_id,Y,X);if(G)J.content={...J.content,images:[G]}}async function b(Q,J,V,X){try{let Z=await Q.im.messageResource.get({path:{message_id:J,file_key:V},params:{type:"image"}});if(!Z)return null;let $=Z,Y=[];await new Promise((U,R)=>{$.on("data",(H)=>Y.push(Buffer.from(H))),$.on("end",()=>U()),$.on("error",(H)=>R(H))}),M(X,{recursive:!0});let G=`img_${Date.now()}_${T.randomBytes(4).toString("hex")}.png`,W=O(X,G);return F(W,Buffer.concat(Y)),W}catch{return null}}async function P(Q,J){try{if(!C(J))return null;let V=S(J),X=x.from(V);return(await Q.im.image.create({data:{image_type:"message",image:X}}))?.image_key??null}catch{return null}}async function D(Q){try{let V=await Q.request({method:"GET",url:"/open-apis/bot/v3/info"});return V?.bot?.open_id??V?.data?.bot?.open_id??null}catch{return null}}function I(Q,J,V){if(Q.conversation.conversationType==="dm")return J.allowFrom.includes(Q.sender.id)?{allow:!0,reason:""}:{allow:!1,reason:"sender not in allowFrom (dm)"};if(!J.allowChats.includes(Q.conversation.conversationId))return{allow:!1,reason:"chat not in allowChats"};if(V==="all")return{allow:!0,reason:""};if(V==="observe")return{allow:!1,reason:"groupPolicy=observe — chat in allowChats but no trigger"};if(Q.mentioned)return{allow:!0,reason:""};return{allow:!1,reason:`groupPolicy=${V} requires @bot mention (not mentioned)`}}function L(Q,J,V){let X=new Date().toISOString(),Z=J?`${J.conversation.conversationType}:${J.conversation.conversationId}`:"?",$=J?J.sender.id:"?";process.stderr.write(`[${X}] [feishu:audit] ${Q} from=${$} conv=${Z} — ${V}
3
- `)}import{existsSync as _,readFileSync as z}from"node:fs";import{join as K}from"node:path";function A(Q){let J=w(K(Q,".env")),V=J.FEISHU_APP_ID,X=J.FEISHU_APP_SECRET;if(!V||!X)throw Error(`feishu channel: FEISHU_APP_ID / FEISHU_APP_SECRET missing in ${Q}/.env`);let Z=y(K(Q,"access.json"));return{appId:V,appSecret:X,access:Z,groupPolicy:"mention",ackPlaceholder:!0,auditRaw:!1,taskTimeoutMs:300000,channelDir:Q}}function w(Q){if(!_(Q))return{};let J={};for(let V of z(Q,"utf-8").split(/\r?\n/)){let X=V.trim();if(!X||X.startsWith("#"))continue;let Z=X.indexOf("=");if(Z<0)continue;let $=X.slice(0,Z).trim(),Y=X.slice(Z+1).trim().replace(/^["']|["']$/g,"");J[$]=Y}return J}function y(Q){if(!_(Q))return{allowFrom:[],allowChats:[]};try{let J=JSON.parse(z(Q,"utf-8"));return{allowFrom:Array.isArray(J.allowFrom)?J.allowFrom:[],allowChats:Array.isArray(J.allowChats)?J.allowChats:[]}}catch{return{allowFrom:[],allowChats:[]}}}var u=900000,f=120000;async function j(Q){let J=A(Q.channelDir),V=new N;await V.init({platform:"feishu",connectionName:Q.nodeAlias,ingressMode:"socket",groupPolicy:J.groupPolicy,ackPlaceholder:J.ackPlaceholder,auditRaw:J.auditRaw,taskTimeoutMs:J.taskTimeoutMs,platformConfig:J});let X=J.taskTimeoutMs||u,Z=Q.onEvent??p(V,X);return await V.start(h(Z)),V}function h(Q){let J=new Map;return async(V)=>{let X=Date.now();if(J.size>200){for(let[Z,$]of J)if(X-$>f)J.delete(Z)}if(J.has(V.idempotencyKey)){process.stderr.write(`[feishu:bridge] dedup drop ${V.idempotencyKey}
4
- `);return}J.set(V.idempotencyKey,X),await Q(V)}}function p(Q,J){if(typeof process.send==="function")return v(Q,J);return m}function v(Q,J){if(typeof process.send!=="function")throw Error("createIPCEventHandler: parent process.send unavailable (not forked)");let V=new Map;return process.on("message",(X)=>{if(!l(X))return;let Z=V.get(X.eventKey);if(!Z)return;V.delete(X.eventKey);let{text:$,eventKey:Y}=X;(async()=>{try{await Q.send({target:Z.conversation,text:$,replyToMessageId:Z.messageId,correlation:{taskId:Y}})}catch(G){let W=G instanceof Error?G.message:String(G);process.stderr.write(`[feishu:bridge] reply send failed: ${W}
5
- `)}})()}),async(X)=>{V.set(X.idempotencyKey,X),setTimeout(()=>{if(!V.has(X.idempotencyKey))return;V.delete(X.idempotencyKey),(async()=>{try{await Q.send({target:X.conversation,text:"[处理超时,任务可能仍在后台运行]",replyToMessageId:X.messageId,correlation:{taskId:X.idempotencyKey}}),process.stderr.write(`[feishu:bridge] timeout-notify sent for ${X.idempotencyKey} after ${J}ms
6
- `)}catch($){let Y=$ instanceof Error?$.message:String($);process.stderr.write(`[feishu:bridge] timeout-notify send failed: ${Y}
7
- `)}})()},J);let Z={type:"event",event:X};process.send(Z)}}function l(Q){if(!Q||typeof Q!=="object")return!1;let J=Q;return J.type==="reply"&&typeof J.eventKey==="string"&&typeof J.text==="string"}async function m(Q){process.stderr.write(`[feishu:bridge] event from=${Q.sender.id} conv=${Q.conversation.conversationType}:${Q.conversation.conversationId} mentioned=${Q.mentioned} text=${(Q.content.text??"").slice(0,80)}
8
- `)}function c(Q){let J={};for(let V=0;V<Q.length;V++){let X=Q[V],Z=Q[V+1];if(X==="--channel-dir"&&Z)J.channelDir=Z,V++;else if(X==="--node-alias"&&Z)J.nodeAlias=Z,V++}return J}async function d(){let Q=c(process.argv.slice(2));if(!Q.channelDir||!Q.nodeAlias)process.stderr.write(`usage: feishu-worker --channel-dir <path> --node-alias <alias>
9
- `),process.exit(2);try{await j({channelDir:Q.channelDir,nodeAlias:Q.nodeAlias}),process.stderr.write(`[feishu:worker] bridge online — node=${Q.nodeAlias} dir=${Q.channelDir} ipc=${typeof process.send==="function"?"yes":"no"}
10
- `)}catch(J){let V=J instanceof Error?J.stack??J.message:String(J);process.stderr.write(`[feishu:worker] startup failed: ${V}
11
- `),process.exit(1)}}d();
2
+ import*as W from"@larksuiteoapi/node-sdk";import L from"node:crypto";import{existsSync as C,mkdirSync as O,readFileSync as k,writeFileSync as P}from"node:fs";import{join as A}from"node:path";import{Readable as M}from"node:stream";class j{platform="feishu";ingressMode="socket";feishuConfig=null;connectionName="";client=null;wsClient=null;botOpenId=null;mediaDir=null;health_={connected:!1,lastEventAt:null,lastError:null};async init(Q){if(Q.platform!=="feishu")throw Error(`FeishuAdapter.init: expected platform "feishu", got "${Q.platform}"`);let J=Q.platformConfig;if(!J?.appId||!J?.appSecret)throw Error("FeishuAdapter.init: appId / appSecret missing in platformConfig");this.feishuConfig=J,this.connectionName=Q.connectionName,this.client=new W.Client({appId:J.appId,appSecret:J.appSecret,disableTokenCache:!1}),this.botOpenId=await y(this.client),this.mediaDir=J.channelDir?A(J.channelDir,"media"):null}async start(Q){if(!this.feishuConfig||!this.client)throw Error("FeishuAdapter.start: call init() first");let{appId:J,appSecret:Z,access:$,groupPolicy:V}=this.feishuConfig,X=this.connectionName,Y=this.botOpenId,G=this.mediaDir,B=this.client,z=new W.EventDispatcher({});z.register({"im.message.receive_v1":async(K)=>{try{this.health_={...this.health_,lastEventAt:Date.now()};let q=E(K,X,Y);if(!q)return;await _(K,q,B,G);let H=u(q,$,V);if(!H.allow){R("deny",q,H.reason);return}await Q(q)}catch(q){let H=q instanceof Error?q.message:String(q);this.health_={...this.health_,lastError:H},R("error",null,H)}}}),this.wsClient=new W.WSClient({appId:J,appSecret:Z,loggerLevel:W.LoggerLevel.warn}),await this.wsClient.start({eventDispatcher:z}),this.health_={...this.health_,connected:!0,lastError:null}}async stop(){this.health_={...this.health_,connected:!1},this.wsClient=null,this.client=null,this.feishuConfig=null}async send(Q){if(!this.client)throw Error("FeishuAdapter.send: call init() first");let J,Z;if(Q.imagePath){let G=await T(this.client,Q.imagePath);if(!G)throw Error(`FeishuAdapter.send: image upload failed for ${Q.imagePath}`);J="image",Z=JSON.stringify({image_key:G})}else{let G=Q.text??Q.markdown;if(!G)throw Error("FeishuAdapter.send: requires text, markdown, or imagePath");J="text",Z=JSON.stringify({text:G})}let $=Q.replyToMessageId??Q.target.threadRootId;if($){let B=(await this.client.im.message.reply({path:{message_id:$},data:{msg_type:J,content:Z}}))?.data?.message_id;if(!B)throw Error("FeishuAdapter.send: reply returned no message_id");return{messageId:B}}let V=Q.target.conversationType==="dm"?"open_id":"chat_id",Y=(await this.client.im.message.create({params:{receive_id_type:V},data:{receive_id:Q.target.conversationId,msg_type:J,content:Z}}))?.data?.message_id;if(!Y)throw Error("FeishuAdapter.send: create returned no message_id");return{messageId:Y}}async edit(Q,J,Z){if(!this.client)throw Error("FeishuAdapter.edit: call init() first");let $=Z.text??Z.markdown;if(!$)throw Error("FeishuAdapter.edit: M3 supports text only");await this.client.im.message.update({path:{message_id:J},data:{msg_type:"text",content:JSON.stringify({text:$})}})}health(){return{...this.health_}}}function E(Q,J,Z){let $=Q,V=$?.message,X=$?.sender,Y=X?.sender_id?.open_id;if(!V||!Y)return null;let G;if(V.message_type==="text")try{G=JSON.parse(V.content).text}catch{G=V.content}else if(V.message_type==="file")try{G=`[文件: ${JSON.parse(V.content).file_name??"unknown"}]`}catch{G="[文件]"}else if(V.message_type==="sticker")G="[表情]";else if(V.message_type==="image")G=void 0;else return null;let B=V.chat_type==="group"?"group":"dm",z=Array.isArray(V.mentions)?V.mentions:[],K=Z?z.some((H)=>H?.id?.open_id===Z):z.length>0,q=`${J}#feishu`;return{platform:"feishu",connectionId:q,tenantId:X?.tenant_key,conversation:{platform:"feishu",conversationId:V.chat_id,conversationType:B,threadRootId:V.root_id},sender:{id:Y},messageId:V.message_id,mentioned:K,content:G?{text:G}:{},receivedAt:Date.now(),idempotencyKey:`feishu:${q}:${V.message_id}`}}async function _(Q,J,Z,$){if(!Z||!$)return;let X=Q?.message;if(!X||X.message_type!=="image")return;let Y;try{Y=JSON.parse(X.content).image_key}catch{return}if(!Y||!X.message_id)return;let G=await D(Z,X.message_id,Y,$);if(G)J.content={...J.content,images:[G]}}async function D(Q,J,Z,$){try{let V=await Q.im.messageResource.get({path:{message_id:J,file_key:Z},params:{type:"image"}});if(!V)return null;let X=V,Y=[];await new Promise((z,K)=>{X.on("data",(q)=>Y.push(Buffer.from(q))),X.on("end",()=>z()),X.on("error",(q)=>K(q))}),O($,{recursive:!0});let G=`img_${Date.now()}_${L.randomBytes(4).toString("hex")}.png`,B=A($,G);return P(B,Buffer.concat(Y)),B}catch{return null}}async function T(Q,J){try{if(!C(J))return null;let Z=k(J),$=M.from(Z);return(await Q.im.image.create({data:{image_type:"message",image:$}}))?.image_key??null}catch{return null}}async function y(Q){try{let Z=await Q.request({method:"GET",url:"/open-apis/bot/v3/info"});return Z?.bot?.open_id??Z?.data?.bot?.open_id??null}catch{return null}}function u(Q,J,Z){if(Q.conversation.conversationType==="dm"){if(J.allowFrom.includes("*")||J.allowFrom.includes(Q.sender.id))return{allow:!0,reason:""};return{allow:!1,reason:"sender not in allowFrom (dm)"}}if(!(J.allowChats.includes("*")||J.allowChats.includes(Q.conversation.conversationId)))return{allow:!1,reason:"chat not in allowChats"};if(Z==="all")return{allow:!0,reason:""};if(Z==="observe")return{allow:!1,reason:"groupPolicy=observe — chat in allowChats but no trigger"};if(Q.mentioned)return{allow:!0,reason:""};return{allow:!1,reason:`groupPolicy=${Z} requires @bot mention (not mentioned)`}}function R(Q,J,Z){let $=new Date().toISOString(),V=J?`${J.conversation.conversationType}:${J.conversation.conversationId}`:"?",X=J?J.sender.id:"?";process.stderr.write(`[${$}] [feishu:audit] ${Q} from=${X} conv=${V} — ${Z}
3
+ `)}import{existsSync as F,readFileSync as b}from"node:fs";import{join as S}from"node:path";function N(Q){let J=w(S(Q,".env")),Z=J.FEISHU_APP_ID,$=J.FEISHU_APP_SECRET;if(!Z||!$)throw Error(`feishu channel: FEISHU_APP_ID / FEISHU_APP_SECRET missing in ${Q}/.env`);let V=f(S(Q,"access.json"));return{appId:Z,appSecret:$,access:V,groupPolicy:"mention",ackPlaceholder:!0,auditRaw:!1,taskTimeoutMs:300000,channelDir:Q}}function w(Q){if(!F(Q))return{};let J={};for(let Z of b(Q,"utf-8").split(/\r?\n/)){let $=Z.trim();if(!$||$.startsWith("#"))continue;let V=$.indexOf("=");if(V<0)continue;let X=$.slice(0,V).trim(),Y=$.slice(V+1).trim().replace(/^["']|["']$/g,"");J[X]=Y}return J}function f(Q){if(!F(Q))return{allowFrom:[],allowChats:[]};try{let J=JSON.parse(b(Q,"utf-8"));return{allowFrom:Array.isArray(J.allowFrom)?J.allowFrom:[],allowChats:Array.isArray(J.allowChats)?J.allowChats:[]}}catch{return{allowFrom:[],allowChats:[]}}}var I=900000,h=120000,p=3,v=60000,l=2,g=60000,c=3,m=60000,d="处理频率超出限制,请稍后重试";async function x(Q){let J=N(Q.channelDir),Z=new j;await Z.init({platform:"feishu",connectionName:Q.nodeAlias,ingressMode:"socket",groupPolicy:J.groupPolicy,ackPlaceholder:J.ackPlaceholder,auditRaw:J.auditRaw,taskTimeoutMs:J.taskTimeoutMs,platformConfig:J});let $=J.taskTimeoutMs||I,V=Q.onEvent??r(Z,$,J.ackPlaceholder);return await Z.start(o(i(V,Z))),Z}function o(Q){let J=new Map;return async(Z)=>{let $=Date.now();if(J.size>200){for(let[V,X]of J)if($-X>h)J.delete(V)}if(J.has(Z.idempotencyKey)){process.stderr.write(`[feishu:bridge] dedup drop ${Z.idempotencyKey}
4
+ `);return}J.set(Z.idempotencyKey,$),await Q(Z)}}function i(Q,J){let Z=new Map,$=new Map,V=new Map;function X(Y,G,B){let z=G-B;return Y.filter((K)=>K>=z)}return async(Y)=>{let G=Date.now(),B=!1;if(Y.conversation.conversationType==="dm"){let H=Y.sender.id,U=X(Z.get(H)??[],G,v);if(U.length>=p)B=!0,Z.set(H,U);else U.push(G),Z.set(H,U)}else{let H=Y.conversation.conversationId,U=X($.get(H)??[],G,g);if(U.length>=l)B=!0,$.set(H,U);else U.push(G),$.set(H,U)}if(!B){await Q(Y);return}let z=Y.sender.id,K=V.get(z),q;if(!K||G-K.windowStart>m)q={count:1,windowStart:G};else q={count:K.count+1,windowStart:K.windowStart};if(V.set(z,q),q.count>=c)process.stderr.write(`[feishu:audit] flood from=${z} conv=${Y.conversation.conversationType}:${Y.conversation.conversationId} ${q.count} rate-limit denies in ${Math.round((G-q.windowStart)/1000)}s window
5
+ `);try{await J.send({target:Y.conversation,text:d,replyToMessageId:Y.messageId,correlation:{taskId:Y.idempotencyKey}}),process.stderr.write(`[feishu:bridge] rate-limited (${Y.conversation.conversationType}) from=${z} for ${Y.idempotencyKey}
6
+ `)}catch(H){let U=H instanceof Error?H.message:String(H);process.stderr.write(`[feishu:bridge] rate-limit notice send failed: ${U}
7
+ `)}}}function r(Q,J,Z){if(typeof process.send==="function")return t(Q,J,Z);return e}var s="⏳ 处理中…",a="[处理超时,任务可能仍在后台运行]";function t(Q,J,Z){if(typeof process.send!=="function")throw Error("createIPCEventHandler: parent process.send unavailable (not forked)");let $=new Map;return process.on("message",(V)=>{if(!n(V))return;let X=$.get(V.eventKey);if(!X)return;$.delete(V.eventKey);let{text:Y,eventKey:G}=V,{event:B,placeholderMessageId:z}=X;(async()=>{try{let{messageId:K}=await Q.send({target:B.conversation,text:Y,replyToMessageId:B.messageId,correlation:{taskId:G}}),q=z?` (after placeholder=${z})`:"";process.stderr.write(`[feishu:bridge] reply sent (messageId=${K})${q} for ${G}
8
+ `)}catch(K){let q=K instanceof Error?K.message:String(K);process.stderr.write(`[feishu:bridge] reply delivery failed: ${q}
9
+ `)}})()}),async(V)=>{if($.set(V.idempotencyKey,{event:V}),setTimeout(()=>{let Y=$.get(V.idempotencyKey);if(!Y)return;$.delete(V.idempotencyKey);let{placeholderMessageId:G}=Y;(async()=>{try{await Q.send({target:V.conversation,text:a,replyToMessageId:V.messageId,correlation:{taskId:V.idempotencyKey}});let B=G?` (after placeholder=${G})`:"";process.stderr.write(`[feishu:bridge] timeout-notify sent${B} for ${V.idempotencyKey} after ${J}ms
10
+ `)}catch(B){let z=B instanceof Error?B.message:String(B);process.stderr.write(`[feishu:bridge] timeout-notify send failed: ${z}
11
+ `)}})()},J),Z)try{let{messageId:Y}=await Q.send({target:V.conversation,text:s,replyToMessageId:V.messageId,correlation:{taskId:V.idempotencyKey}}),G=$.get(V.idempotencyKey);if(G)G.placeholderMessageId=Y,process.stderr.write(`[feishu:bridge] placeholder sent (messageId=${Y}) for ${V.idempotencyKey}
12
+ `)}catch(Y){let G=Y instanceof Error?Y.message:String(Y);process.stderr.write(`[feishu:bridge] placeholder send failed: ${G} — reply will still send as a new message
13
+ `)}let X={type:"event",event:V};process.send(X)}}function n(Q){if(!Q||typeof Q!=="object")return!1;let J=Q;return J.type==="reply"&&typeof J.eventKey==="string"&&typeof J.text==="string"}async function e(Q){process.stderr.write(`[feishu:bridge] event from=${Q.sender.id} conv=${Q.conversation.conversationType}:${Q.conversation.conversationId} mentioned=${Q.mentioned} text=${(Q.content.text??"").slice(0,80)}
14
+ `)}function JJ(Q){let J={};for(let Z=0;Z<Q.length;Z++){let $=Q[Z],V=Q[Z+1];if($==="--channel-dir"&&V)J.channelDir=V,Z++;else if($==="--node-alias"&&V)J.nodeAlias=V,Z++}return J}async function QJ(){let Q=JJ(process.argv.slice(2));if(!Q.channelDir||!Q.nodeAlias)process.stderr.write(`usage: feishu-worker --channel-dir <path> --node-alias <alias>
15
+ `),process.exit(2);try{await x({channelDir:Q.channelDir,nodeAlias:Q.nodeAlias}),process.stderr.write(`[feishu:worker] bridge online — node=${Q.nodeAlias} dir=${Q.channelDir} ipc=${typeof process.send==="function"?"yes":"no"}
16
+ `)}catch(J){let Z=J instanceof Error?J.stack??J.message:String(J);process.stderr.write(`[feishu:worker] startup failed: ${Z}
17
+ `),process.exit(1)}}QJ();
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env bun
2
- const a0_0x17c1bc=a0_0x4414;(function(_0x77249,_0x5847e6){const _0x129619=a0_0x4414,_0x80b5c=_0x77249();while(!![]){try{const _0x2eba18=-parseInt(_0x129619(0x1cd))/0x1*(parseInt(_0x129619(0x1d8))/0x2)+parseInt(_0x129619(0x1f9))/0x3*(parseInt(_0x129619(0x1bd))/0x4)+-parseInt(_0x129619(0x20f))/0x5*(-parseInt(_0x129619(0x17f))/0x6)+-parseInt(_0x129619(0x1ef))/0x7*(parseInt(_0x129619(0x180))/0x8)+parseInt(_0x129619(0x1fc))/0x9+parseInt(_0x129619(0x209))/0xa+parseInt(_0x129619(0x1c7))/0xb*(parseInt(_0x129619(0x203))/0xc);if(_0x2eba18===_0x5847e6)break;else _0x80b5c['push'](_0x80b5c['shift']());}catch(_0x4652cc){_0x80b5c['push'](_0x80b5c['shift']());}}}(a0_0x4702,0xd4ef2));import{readFileSync as a0_0x55a13d,existsSync as a0_0x4a890e}from'fs';import{randomUUID as a0_0x67fdc4}from'crypto';import{join as a0_0x44fc85}from'path';import{hostname as a0_0x3a479e}from'os';import{execSync as a0_0x4e7458}from'child_process';function a0_0x4414(_0x5ce452,_0xee8614){_0x5ce452=_0x5ce452-0x178;const _0x47022b=a0_0x4702();let _0x441445=_0x47022b[_0x5ce452];return _0x441445;}import{Server as a0_0x59a242}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x261411}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x3c4e48,CallToolRequestSchema as a0_0x9dc23a}from'@modelcontextprotocol/sdk/types.js';function I(_0x56b155){const _0x6cfbe7=a0_0x4414;if(!a0_0x4a890e(_0x56b155))return;for(let _0x40df68 of a0_0x55a13d(_0x56b155,_0x6cfbe7(0x1eb))[_0x6cfbe7(0x19c)]('\x0a')){let _0x26ef8c=_0x40df68[_0x6cfbe7(0x1e0)]();if(!_0x26ef8c||_0x26ef8c[_0x6cfbe7(0x1ca)]('#'))continue;let _0x2a672b=_0x26ef8c[_0x6cfbe7(0x1e2)]('=');if(_0x2a672b<0x0)continue;let _0x713907=_0x26ef8c[_0x6cfbe7(0x1aa)](0x0,_0x2a672b)[_0x6cfbe7(0x1e0)](),_0x27e093=_0x26ef8c[_0x6cfbe7(0x1aa)](_0x2a672b+0x1)[_0x6cfbe7(0x1e0)]()['replace'](/^["']|["']$/g,'');if(!process.env[_0x713907])process.env[_0x713907]=_0x27e093;}}var L=process.env.HOME||'~',U=a0_0x44fc85(L,'.claude/channels/commhub');I(a0_0x44fc85(U,'.env'));var v=process[a0_0x17c1bc(0x201)]()['replace'](/\//g,'-');I(a0_0x44fc85(U,v,a0_0x17c1bc(0x1f3)));function d(){const _0x16959d=a0_0x17c1bc;try{return a0_0x4e7458(_0x16959d(0x17b),{'encoding':_0x16959d(0x1eb),'timeout':0x7d0})[_0x16959d(0x1e0)]();}catch{return'';}}function m(){const _0x2c413f=a0_0x17c1bc;try{let _0x157f8a=a0_0x44fc85(L,_0x2c413f(0x1de),_0x2c413f(0x1e1));if(a0_0x4a890e(_0x157f8a))return JSON[_0x2c413f(0x210)](a0_0x55a13d(_0x157f8a,_0x2c413f(0x1eb)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x17c1bc(0x1b2)]||a0_0x17c1bc(0x1b1),f=process.env.COMMHUB_TMUX||d();function r(){const _0x202ba5=a0_0x17c1bc;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0x202ba5(0x1e0)]())return process.env.COMMHUB_ALIAS[_0x202ba5(0x1e0)]();return process[_0x202ba5(0x1ad)]['write'](_0x202ba5(0x184)+(_0x202ba5(0x19d)+(f||'(none)')+_0x202ba5(0x1cb)+a0_0x3a479e()+_0x202ba5(0x1be))),'unattributed-'+process[_0x202ba5(0x17d)];}function a0_0x4702(){const _0x20ca3c=['1162CgRgJu','tools/call','working','Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','.env',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','SSE\x20connected\x20as\x20\x22','delete','2025-03-26','ack_inbox','27315koFvNi','idle','end','5601600ILkURQ',':\x20inbox_count=','commhub_send_message','from_session','commhub_send_task','cwd','unknown\x20tool','36FDTHmT','0.3.0','\x22\x20(','setRequestHandler','Authorization',']\x20[commhub]\x20','6596250XCtnGU','commhub-channel','text','connect','result','in_progress','75geFUcb','parse','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','CommHub\x20init\x20failed:\x20','session\x20disconnected','tmux\x20display-message\x20-p\x20\x27#S\x27','alias','pid','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','245034NSLmvR','41008XvifJd','now','notification','object','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','ready\x20—\x20waiting\x20for\x20events','commhub_report_status','...\x20TMUX=','number','stringify','message','warning:\x20could\x20not\x20register:\x20','min','getReader','offline','content','body','SSE\x20fatal:\x20','string','set','Bearer\x20','\x20ALIAS=','initialize','new_task','replied','broadcast','send_message','normal','split','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','completed','Reply\x20text\x20/\x20result\x20summary','priority','high','task','commhub_get_all_status','get_all_status','decode','commhub_reply','\x20PROJECT_ENV=','POST','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','slice','registered\x20as\x20\x22','send_reply','stderr','from','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','\x20RESUME_ID=','http://127.0.0.1:9200','hub','fatal:\x20','connected','catch','error','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','stdin','cancelled','read','get','report_status','508SyQSwu','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','/events/','find','pop','token','commhub','SSE\x20stream\x20ended,\x20reconnecting...','data:\x20','params','1057793JsQacA','2.0','MCP\x20stdio\x20connected','startsWith','\x20/\x20hostname=','none','5214szetws','blocked','application/json,\x20text/event-stream','Message\x20content','write','failed','SIGINT','Priority\x20(default:\x20normal)','send_task','Session\x20alias:\x20','heartbeat\x20failed:\x20','620cKvzAx','re-registered\x20as\x20\x22','/mcp','type','\x20priority=','claude-code','.anet','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','trim','config.json','indexOf','connecting\x20to\x20','ENV:\x20URL=','SSE\x20error:\x20','application/json','no\x20response','exit','\x20from\x20','Target\x20session\x20alias','utf-8','inbox_count','status','SSE\x20connection\x20error:\x20'];a0_0x4702=function(){return _0x20ca3c;};return a0_0x4702();}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x67fdc4(),F=process.env.COMMHUB_TOKEN||u[a0_0x17c1bc(0x1c2)]||'';function W(_0x4e0066){const _0x453734=a0_0x17c1bc;let _0x3d2421=new Date()['toTimeString']()[_0x453734(0x1aa)](0x0,0x8);process['stderr'][_0x453734(0x1d1)]('['+_0x3d2421+_0x453734(0x208)+_0x4e0066+'\x0a');}function N(_0x170604){return new Promise(_0x40bbd0=>setTimeout(_0x40bbd0,_0x170604));}W(a0_0x17c1bc(0x1e4)+j+a0_0x17c1bc(0x195)+G+a0_0x17c1bc(0x1b0)+K['slice'](0x0,0x8)+a0_0x17c1bc(0x187)+(f||a0_0x17c1bc(0x1cc))+'\x20CWD='+process[a0_0x17c1bc(0x201)]()+a0_0x17c1bc(0x1a7)+v);var D=new Map(),x=new a0_0x59a242({'name':'commhub-channel','version':a0_0x17c1bc(0x204)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':['Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>',a0_0x17c1bc(0x1df),'Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.',a0_0x17c1bc(0x1d6)+G]['join']('\x0a')});x[a0_0x17c1bc(0x206)](a0_0x3c4e48,async()=>({'tools':[{'name':'commhub_reply','description':a0_0x17c1bc(0x1f2),'inputSchema':{'type':'object','properties':{'task_id':{'type':'string','description':a0_0x17c1bc(0x1a9)},'text':{'type':'string','description':a0_0x17c1bc(0x19f)},'status':{'type':'string','enum':[a0_0x17c1bc(0x19e),a0_0x17c1bc(0x1d2),a0_0x17c1bc(0x1b9),a0_0x17c1bc(0x1ce),a0_0x17c1bc(0x1b6),a0_0x17c1bc(0x20e)],'description':a0_0x17c1bc(0x178)}},'required':['text']}},{'name':a0_0x17c1bc(0x186),'description':'Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','inputSchema':{'type':'object','properties':{'status':{'type':'string','enum':['working',a0_0x17c1bc(0x1fa),'blocked',a0_0x17c1bc(0x1b6)]},'task':{'type':a0_0x17c1bc(0x192),'description':'Current\x20task\x20description'},'progress':{'type':a0_0x17c1bc(0x188),'description':'Progress\x200-100'}},'required':['status']}},{'name':a0_0x17c1bc(0x200),'description':'Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','inputSchema':{'type':'object','properties':{'alias':{'type':'string','description':a0_0x17c1bc(0x1ea)},'task':{'type':a0_0x17c1bc(0x192),'description':'Task\x20content'},'priority':{'type':a0_0x17c1bc(0x192),'enum':[a0_0x17c1bc(0x1a1),'normal','low'],'description':a0_0x17c1bc(0x1d4)}},'required':[a0_0x17c1bc(0x17c),a0_0x17c1bc(0x1a2)]}},{'name':a0_0x17c1bc(0x1fe),'description':a0_0x17c1bc(0x1b7),'inputSchema':{'type':a0_0x17c1bc(0x183),'properties':{'alias':{'type':a0_0x17c1bc(0x192),'description':a0_0x17c1bc(0x1ea)},'message':{'type':a0_0x17c1bc(0x192),'description':a0_0x17c1bc(0x1d0)}},'required':[a0_0x17c1bc(0x17c),a0_0x17c1bc(0x18a)]}},{'name':a0_0x17c1bc(0x1a3),'description':a0_0x17c1bc(0x1af),'inputSchema':{'type':a0_0x17c1bc(0x183),'properties':{}}}]}));async function Y(_0x5cf483,_0x50c3d9){const _0x401bc5=a0_0x17c1bc;let _0x52aa0d=await fetch(j+_0x401bc5(0x1da),{'method':'POST','headers':{'Content-Type':_0x401bc5(0x1e6),'Accept':_0x401bc5(0x1cf),...F?{'Authorization':_0x401bc5(0x194)+F}:{}},'body':JSON['stringify']({'jsonrpc':'2.0','id':0x1,'method':_0x401bc5(0x196),'params':{'protocolVersion':_0x401bc5(0x1f7),'capabilities':{},'clientInfo':{'name':_0x401bc5(0x20a),'version':'0.3.0'}}})});if(!_0x52aa0d['ok']){let _0x2a7191=await _0x52aa0d[_0x401bc5(0x20b)]();return W(_0x401bc5(0x179)+_0x52aa0d[_0x401bc5(0x1ed)]+'\x20'+_0x2a7191[_0x401bc5(0x1aa)](0x0,0x64)),{'ok':!0x1,'error':'init\x20failed:\x20'+_0x52aa0d['status']};}await _0x52aa0d[_0x401bc5(0x20b)]();let _0x53f56d=(await(await fetch(j+_0x401bc5(0x1da),{'method':_0x401bc5(0x1a8),'headers':{'Content-Type':'application/json','Accept':_0x401bc5(0x1cf),...F?{'Authorization':_0x401bc5(0x194)+F}:{}},'body':JSON[_0x401bc5(0x189)]({'jsonrpc':_0x401bc5(0x1c8),'id':0x2,'method':_0x401bc5(0x1f0),'params':{'name':_0x5cf483,'arguments':_0x50c3d9}})}))['text']())[_0x401bc5(0x19c)]('\x0a')[_0x401bc5(0x1c0)](_0x1369c6=>_0x1369c6[_0x401bc5(0x1ca)](_0x401bc5(0x1c5)));if(_0x53f56d){let _0x14d068=JSON[_0x401bc5(0x210)](_0x53f56d[_0x401bc5(0x1aa)](0x6));return _0x14d068?.[_0x401bc5(0x20d)]?.['content']?.[0x0]?.[_0x401bc5(0x20b)]?JSON['parse'](_0x14d068['result'][_0x401bc5(0x18f)][0x0][_0x401bc5(0x20b)]):_0x14d068;}return{'ok':!0x1,'error':_0x401bc5(0x1e7)};}x[a0_0x17c1bc(0x206)](a0_0x9dc23a,async _0x2ef731=>{const _0x54d149=a0_0x17c1bc;let {name:_0x364735,arguments:_0x5b3a25}=_0x2ef731[_0x54d149(0x1c6)];if(_0x364735===_0x54d149(0x1a6)){let {task_id:_0xb39255,text:_0x35f77a,status:_0x22cd40}=_0x5b3a25;if(_0x22cd40===_0x54d149(0x19e)||_0x22cd40===_0x54d149(0x1d2)||_0x22cd40==='cancelled'){let _0x2a1ea6=_0x22cd40===_0x54d149(0x19e)?_0x54d149(0x198):_0x22cd40,_0x28d91f=_0xb39255?D[_0x54d149(0x1bb)](_0xb39255)||'hub':_0x54d149(0x1b2),_0x2c79e5=await Y(_0x54d149(0x1ac),{'alias':_0x28d91f,'text':_0x35f77a,'in_reply_to':_0xb39255||void 0x0,'status':_0x2a1ea6,'from_session':G});if(_0xb39255)D[_0x54d149(0x1f6)](_0xb39255);return{'content':[{'type':_0x54d149(0x20b),'text':JSON['stringify'](_0x2c79e5)}]};}let _0x1e539d=await Y('report_status',{'resume_id':K,'alias':G,'status':_0x22cd40==='blocked'?_0x54d149(0x1ce):_0x22cd40===_0x54d149(0x1b6)?'error':_0x54d149(0x1f1),'task':_0x35f77a[_0x54d149(0x1aa)](0x0,0xc8),'output':_0x35f77a});return{'content':[{'type':_0x54d149(0x20b),'text':JSON[_0x54d149(0x189)](_0x1e539d)}]};}if(_0x364735===_0x54d149(0x186)){let {status:_0x4294a2,task:_0x481198,progress:_0x65b46b}=_0x5b3a25,_0x3bb439=await Y(_0x54d149(0x1bc),{'resume_id':K,'alias':G,'status':_0x4294a2,'task':_0x481198,'progress':_0x65b46b});return{'content':[{'type':'text','text':JSON[_0x54d149(0x189)](_0x3bb439)}]};}if(_0x364735===_0x54d149(0x200)){let {alias:_0x5ba93e,task:_0x3104e0,priority:_0x293bed}=_0x5b3a25,_0x9c13cb=await Y(_0x54d149(0x1d5),{'alias':_0x5ba93e,'task':_0x3104e0,'priority':_0x293bed||_0x54d149(0x19b),'from_session':G});return{'content':[{'type':_0x54d149(0x20b),'text':JSON[_0x54d149(0x189)](_0x9c13cb)}]};}if(_0x364735==='commhub_send_message'){let {alias:_0x1c6d39,message:_0x3f642b}=_0x5b3a25,_0x511c23=await Y(_0x54d149(0x19a),{'alias':_0x1c6d39,'message':_0x3f642b,'from_session':G});return{'content':[{'type':_0x54d149(0x20b),'text':JSON[_0x54d149(0x189)](_0x511c23)}]};}if(_0x364735==='commhub_get_all_status'){let _0x512679=await Y(_0x54d149(0x1a4),{});return{'content':[{'type':_0x54d149(0x20b),'text':JSON[_0x54d149(0x189)](_0x512679)}]};}return{'content':[{'type':_0x54d149(0x20b),'text':JSON[_0x54d149(0x189)]({'error':_0x54d149(0x202)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x211d8a=a0_0x17c1bc;try{await Y(_0x211d8a(0x1bc),{'resume_id':K,'alias':G,'status':_0x211d8a(0x1fa),'server':a0_0x3a479e(),'hostname':a0_0x3a479e(),'agent':_0x211d8a(0x1dd),'project_dir':process[_0x211d8a(0x201)](),'tmux_name':f||void 0x0}),W(_0x211d8a(0x1d9)+G+'\x22\x20after\x20SSE\x20reconnect');}catch(_0xc18921){W('re-register\x20failed:\x20'+_0xc18921);}}async function o(){const _0x1a595c=a0_0x17c1bc;let _0x5278d4=j+_0x1a595c(0x1bf)+encodeURIComponent(G),_0x20dc16={};if(F)_0x20dc16[_0x1a595c(0x207)]='Bearer\x20'+F;W(_0x1a595c(0x1e3)+_0x5278d4);let _0x177279=O,_0x442cfa=!0x0,_0x577267=null;while(!0x0){try{let _0x5e052e=await fetch(_0x5278d4,{'headers':_0x20dc16});if(!_0x5e052e['ok']){if(W(_0x1a595c(0x1e5)+_0x5e052e['status']+'\x20'+_0x5e052e['statusText']),_0x577267=_0x577267??Date[_0x1a595c(0x181)](),Date[_0x1a595c(0x181)]()-_0x577267>T){W(_0x1a595c(0x17e)+j+_0x1a595c(0x1f4));return;}await N(_0x177279),_0x177279=Math[_0x1a595c(0x18c)](_0x177279*0x2,R);continue;}let _0x2682c0=_0x5e052e[_0x1a595c(0x190)][_0x1a595c(0x18d)](),_0x34663e=new TextDecoder(),_0x2f5fe2='';_0x177279=O;while(!0x0){let {done:_0x2225e0,value:_0x36f060}=await _0x2682c0[_0x1a595c(0x1ba)]();if(_0x2225e0)break;_0x2f5fe2+=_0x34663e[_0x1a595c(0x1a5)](_0x36f060,{'stream':!0x0});let _0x4a7190=_0x2f5fe2[_0x1a595c(0x19c)]('\x0a\x0a');_0x2f5fe2=_0x4a7190[_0x1a595c(0x1c1)]()||'';for(let _0x487918 of _0x4a7190){let _0x5cff5b=_0x487918['split']('\x0a')[_0x1a595c(0x1c0)](_0x2f91a8=>_0x2f91a8[_0x1a595c(0x1ca)](_0x1a595c(0x1c5)));if(!_0x5cff5b)continue;try{let _0x46f52c=JSON[_0x1a595c(0x210)](_0x5cff5b[_0x1a595c(0x1aa)](0x6));if(await a(_0x46f52c),_0x46f52c[_0x1a595c(0x1db)]==='connected'){if(_0x577267=null,!_0x442cfa)await l();_0x442cfa=!0x1;}}catch(_0x33be10){W('parse\x20error:\x20'+_0x33be10);}}}W(_0x1a595c(0x1c4));}catch(_0x510fc2){W(_0x1a595c(0x1ee)+_0x510fc2);}if(_0x577267=_0x577267??Date[_0x1a595c(0x181)](),Date[_0x1a595c(0x181)]()-_0x577267>T){W(_0x1a595c(0x17e)+j+_0x1a595c(0x1f4));return;}await N(_0x177279),_0x177279=Math[_0x1a595c(0x18c)](_0x177279*0x2,R);}}async function a(_0x275bb5){const _0xaa8c71=a0_0x17c1bc;if(_0x275bb5[_0xaa8c71(0x1db)]===_0xaa8c71(0x1b4)){W(_0xaa8c71(0x1f5)+G+'\x22');return;}if(_0x275bb5[_0xaa8c71(0x1db)]==='new_message'){if(W('←\x20message\x20from\x20'+_0x275bb5[_0xaa8c71(0x1ae)]+':\x20'+_0x275bb5['message'][_0xaa8c71(0x1aa)](0x0,0x3c)),await x[_0xaa8c71(0x182)]({'method':'notifications/claude/channel','params':{'content':_0x275bb5[_0xaa8c71(0x18a)],'meta':{'sender':_0x275bb5[_0xaa8c71(0x1ae)]||'hub','sender_id':_0xaa8c71(0x1c3),'user':_0x275bb5[_0xaa8c71(0x1ae)]||'hub','priority':_0xaa8c71(0x19b)}}}),_0x275bb5['message_id'])await Y(_0xaa8c71(0x1f8),{'alias':G,'message_id':_0x275bb5['message_id']});return;}if(_0x275bb5[_0xaa8c71(0x1db)]===_0xaa8c71(0x197)||_0x275bb5['type']===_0xaa8c71(0x199)){W('←\x20'+_0x275bb5[_0xaa8c71(0x1db)]+_0xaa8c71(0x1fd)+_0x275bb5[_0xaa8c71(0x1ec)]+_0xaa8c71(0x1dc)+(_0x275bb5['priority']||_0xaa8c71(0x19b)));let _0xf9ab14=await Y('get_inbox',{'alias':G,'limit':0x5});if(_0xf9ab14?.['ok']&&_0xf9ab14['messages']?.['length']>0x0)for(let _0x1cfe55 of _0xf9ab14['messages']){let _0x4c1d65={'sender':_0x1cfe55[_0xaa8c71(0x1ff)]||_0xaa8c71(0x1b2),'sender_id':_0xaa8c71(0x1c3),'user':_0x1cfe55[_0xaa8c71(0x1ff)]||'hub','task_id':_0x1cfe55['id'],'priority':_0x1cfe55[_0xaa8c71(0x1a0)]||_0xaa8c71(0x19b)};D[_0xaa8c71(0x193)](_0x1cfe55['id'],_0x1cfe55[_0xaa8c71(0x1ff)]||'hub'),await x[_0xaa8c71(0x182)]({'method':'notifications/claude/channel','params':{'content':_0x1cfe55[_0xaa8c71(0x18f)],'meta':_0x4c1d65}}),W('→\x20injected\x20task\x20'+_0x1cfe55['id']['slice'](0x0,0x8)+_0xaa8c71(0x1e9)+_0x1cfe55[_0xaa8c71(0x1ff)]+':\x20'+_0x1cfe55[_0xaa8c71(0x18f)][_0xaa8c71(0x1aa)](0x0,0x3c)),await Y('ack_inbox',{'alias':G,'message_id':_0x1cfe55['id']});}}}async function n(){const _0x51c430=a0_0x17c1bc;let _0x7b948f=new a0_0x261411();await x[_0x51c430(0x20c)](_0x7b948f),W(_0x51c430(0x1c9)),W('starting\x20SSE\x20listener...'),o()['catch'](_0x1566e0=>W(_0x51c430(0x191)+_0x1566e0)),Y(_0x51c430(0x1bc),{'resume_id':K,'alias':G,'status':_0x51c430(0x1fa),'server':a0_0x3a479e(),'hostname':a0_0x3a479e(),'agent':'claude-code','project_dir':process[_0x51c430(0x201)](),'tmux_name':f||void 0x0})['then'](()=>W(_0x51c430(0x1ab)+G+_0x51c430(0x205)+K['slice'](0x0,0x8)+')'))[_0x51c430(0x1b5)](_0x6663fe=>W(_0x51c430(0x18b)+_0x6663fe)),setInterval(()=>{const _0x59552d=_0x51c430;Y(_0x59552d(0x1bc),{'resume_id':K,'alias':G,'status':_0x59552d(0x1fa),'server':a0_0x3a479e(),'hostname':a0_0x3a479e(),'agent':_0x59552d(0x1dd),'project_dir':process[_0x59552d(0x201)](),'tmux_name':f||void 0x0})[_0x59552d(0x1b5)](_0x2e8ed1=>W(_0x59552d(0x1d7)+_0x2e8ed1));},0x2bf20),W(_0x51c430(0x185));}n()[a0_0x17c1bc(0x1b5)](_0xa153a8=>{const _0xbec6e9=a0_0x17c1bc;W(_0xbec6e9(0x1b3)+_0xa153a8),process[_0xbec6e9(0x1e8)](0x1);});async function b(){const _0x17983e=a0_0x17c1bc;W('shutting\x20down,\x20reporting\x20offline...'),await Y(_0x17983e(0x1bc),{'resume_id':K,'alias':G,'status':_0x17983e(0x18e),'task':_0x17983e(0x17a)})[_0x17983e(0x1b5)](()=>{}),process[_0x17983e(0x1e8)](0x0);}process[a0_0x17c1bc(0x1b8)]['on'](a0_0x17c1bc(0x1fb),()=>b()),process['on']('SIGTERM',()=>b()),process['on'](a0_0x17c1bc(0x1d3),()=>b());
2
+ const a0_0x5588ee=a0_0x4bea;(function(_0x48efc8,_0xe3fc8c){const _0x4e04e6=a0_0x4bea,_0x5e41c7=_0x48efc8();while(!![]){try{const _0x40c129=parseInt(_0x4e04e6(0xfa))/0x1+parseInt(_0x4e04e6(0x9b))/0x2+parseInt(_0x4e04e6(0xdf))/0x3+parseInt(_0x4e04e6(0xfd))/0x4*(parseInt(_0x4e04e6(0xff))/0x5)+parseInt(_0x4e04e6(0xbf))/0x6+-parseInt(_0x4e04e6(0xc2))/0x7*(-parseInt(_0x4e04e6(0x11e))/0x8)+-parseInt(_0x4e04e6(0xa3))/0x9*(parseInt(_0x4e04e6(0x8c))/0xa);if(_0x40c129===_0xe3fc8c)break;else _0x5e41c7['push'](_0x5e41c7['shift']());}catch(_0x12adf1){_0x5e41c7['push'](_0x5e41c7['shift']());}}}(a0_0x215b,0x97327));import{readFileSync as a0_0x16e8b5,existsSync as a0_0x954f40}from'fs';import{randomUUID as a0_0x232139}from'crypto';import{join as a0_0x49246d}from'path';import{hostname as a0_0x2c58ce}from'os';import{execSync as a0_0x543366}from'child_process';import{Server as a0_0x579b35}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x59aee6}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x46af38,CallToolRequestSchema as a0_0xb54bd5}from'@modelcontextprotocol/sdk/types.js';function I(_0x1a4b92){const _0x207349=a0_0x4bea;if(!a0_0x954f40(_0x1a4b92))return;for(let _0x13ab5c of a0_0x16e8b5(_0x1a4b92,'utf-8')['split']('\x0a')){let _0x49197c=_0x13ab5c[_0x207349(0x118)]();if(!_0x49197c||_0x49197c[_0x207349(0x108)]('#'))continue;let _0x4857b0=_0x49197c[_0x207349(0xb0)]('=');if(_0x4857b0<0x0)continue;let _0x5df689=_0x49197c[_0x207349(0xf5)](0x0,_0x4857b0)[_0x207349(0x118)](),_0xc9382c=_0x49197c['slice'](_0x4857b0+0x1)['trim']()[_0x207349(0xb7)](/^["']|["']$/g,'');if(!process.env[_0x5df689])process.env[_0x5df689]=_0xc9382c;}}var L=process.env.HOME||'~',U=a0_0x49246d(L,a0_0x5588ee(0xc5));I(a0_0x49246d(U,a0_0x5588ee(0x110)));var v=process[a0_0x5588ee(0xa4)]()[a0_0x5588ee(0xb7)](/\//g,'-');I(a0_0x49246d(U,v,a0_0x5588ee(0x110)));function d(){const _0x111dfa=a0_0x5588ee;try{return a0_0x543366(_0x111dfa(0x9a),{'encoding':_0x111dfa(0xac),'timeout':0x7d0})['trim']();}catch{return'';}}function m(){const _0x34b157=a0_0x5588ee;try{let _0x234e92=a0_0x49246d(L,_0x34b157(0xed),_0x34b157(0xf4));if(a0_0x954f40(_0x234e92))return JSON[_0x34b157(0xd1)](a0_0x16e8b5(_0x234e92,_0x34b157(0xac)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x5588ee(0x8f)]||'http://127.0.0.1:9200',f=process.env.COMMHUB_TMUX||d();function r(){const _0x21d78d=a0_0x5588ee;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0x21d78d(0x118)]())return process.env.COMMHUB_ALIAS[_0x21d78d(0x118)]();return process[_0x21d78d(0xdc)]['write'](_0x21d78d(0xb5)+(_0x21d78d(0x9c)+(f||_0x21d78d(0x116))+_0x21d78d(0xd7)+a0_0x2c58ce()+_0x21d78d(0xd8))),_0x21d78d(0x120)+process['pid'];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x232139(),F=process.env.COMMHUB_TOKEN||u[a0_0x5588ee(0x115)]||'';function W(_0x34a76b){const _0x39dd78=a0_0x5588ee;let _0x437f7e=new Date()[_0x39dd78(0xf2)]()[_0x39dd78(0xf5)](0x0,0x8);process[_0x39dd78(0xdc)][_0x39dd78(0xee)]('['+_0x437f7e+_0x39dd78(0x8e)+_0x34a76b+'\x0a');}function N(_0x2460e2){return new Promise(_0x3894db=>setTimeout(_0x3894db,_0x2460e2));}W(a0_0x5588ee(0xf3)+j+a0_0x5588ee(0x101)+G+a0_0x5588ee(0xb4)+K['slice'](0x0,0x8)+a0_0x5588ee(0xe0)+(f||a0_0x5588ee(0x10d))+'\x20CWD='+process[a0_0x5588ee(0xa4)]()+'\x20PROJECT_ENV='+v);var D=new Map(),x=new a0_0x579b35({'name':a0_0x5588ee(0x117),'version':'0.3.0'},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x5588ee(0xe2),'These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.',a0_0x5588ee(0x97),a0_0x5588ee(0xc6),a0_0x5588ee(0x10a)+G][a0_0x5588ee(0xa8)]('\x0a')});function a0_0x215b(){const _0x3fb075=['...\x20TMUX=','2025-03-26','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>','Authorization','2.0','commhub_send_message','pop','exit','commhub','setRequestHandler','catch','body','initialize','.anet','write','\x22\x20after\x20SSE\x20reconnect','SSE\x20error:\x20','data:\x20','toTimeString','ENV:\x20URL=','config.json','slice','0.3.0','send_message','send_reply','ready\x20—\x20waiting\x20for\x20events','1138855wCFRSf','working','POST','147976uYSLpG','normal','140rgDcfz','end','\x20ALIAS=','message_id','/events/','offline','connecting\x20to\x20','no\x20response','from_session','startsWith','broadcast','Session\x20alias:\x20','/mcp','fatal:\x20','none','report_status','connect','.env','content','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','SSE\x20fatal:\x20','SSE\x20stream\x20ended,\x20reconnecting...','token','(none)','commhub-channel','trim','failed','object','idle','ack_inbox','result','632fNVscr','unknown\x20tool','unattributed-','Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','text','blocked','registered\x20as\x20\x22','low','commhub_send_task','11423990UfjIrt','find',']\x20[commhub]\x20','hub','priority','cancelled','now','getReader',':\x20inbox_count=','message','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.','string','Reply\x20text\x20/\x20result\x20summary','tmux\x20display-message\x20-p\x20\x27#S\x27','466442DKnBeW','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','CommHub\x20init\x20failed:\x20','tools/call','Priority\x20(default:\x20normal)','SIGINT','\x20from\x20','delete','27fWamzF','cwd','connected','shutting\x20down,\x20reporting\x20offline...','params','join','Bearer\x20','SSE\x20connected\x20as\x20\x22','MCP\x20stdio\x20connected','utf-8','from','application/json','starting\x20SSE\x20listener...','indexOf','commhub_get_all_status','Target\x20session\x20alias','status','\x20RESUME_ID=','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','in_progress','replace','error','Task\x20content','task','get_inbox','SSE\x20connection\x20error:\x20','warning:\x20could\x20not\x20register:\x20','notification','5127018lzGRuB','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','new_message','59178cGLRDP','application/json,\x20text/event-stream','then','.claude/channels/commhub','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','\x22\x20(','messages','replied','split',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','new_task','read','send_task','completed','init\x20failed:\x20','parse','alias','get_all_status','type','heartbeat\x20failed:\x20','set','\x20/\x20hostname=','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','stringify','commhub_report_status','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','stderr','notifications/claude/channel','commhub_reply','348669VwRFeb'];a0_0x215b=function(){return _0x3fb075;};return a0_0x215b();}x[a0_0x5588ee(0xe9)](a0_0x46af38,async()=>({'tools':[{'name':a0_0x5588ee(0xde),'description':a0_0x5588ee(0x121),'inputSchema':{'type':a0_0x5588ee(0x11a),'properties':{'task_id':{'type':a0_0x5588ee(0x98),'description':'The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)'},'text':{'type':a0_0x5588ee(0x98),'description':a0_0x5588ee(0x99)},'status':{'type':a0_0x5588ee(0x98),'enum':[a0_0x5588ee(0xcf),'failed',a0_0x5588ee(0x91),'blocked',a0_0x5588ee(0xb8),a0_0x5588ee(0xb6)],'description':a0_0x5588ee(0xc0)}},'required':[a0_0x5588ee(0x122)]}},{'name':a0_0x5588ee(0xda),'description':'Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','inputSchema':{'type':a0_0x5588ee(0x11a),'properties':{'status':{'type':a0_0x5588ee(0x98),'enum':[a0_0x5588ee(0xfb),a0_0x5588ee(0x11b),a0_0x5588ee(0x123),a0_0x5588ee(0xb8)]},'task':{'type':'string','description':'Current\x20task\x20description'},'progress':{'type':'number','description':'Progress\x200-100'}},'required':[a0_0x5588ee(0xb3)]}},{'name':a0_0x5588ee(0x8b),'description':'Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','inputSchema':{'type':'object','properties':{'alias':{'type':a0_0x5588ee(0x98),'description':'Target\x20session\x20alias'},'task':{'type':a0_0x5588ee(0x98),'description':a0_0x5588ee(0xb9)},'priority':{'type':'string','enum':['high','normal',a0_0x5588ee(0x125)],'description':a0_0x5588ee(0x9f)}},'required':['alias',a0_0x5588ee(0xba)]}},{'name':a0_0x5588ee(0xe5),'description':a0_0x5588ee(0xdb),'inputSchema':{'type':a0_0x5588ee(0x11a),'properties':{'alias':{'type':'string','description':a0_0x5588ee(0xb2)},'message':{'type':a0_0x5588ee(0x98),'description':'Message\x20content'}},'required':[a0_0x5588ee(0xd2),a0_0x5588ee(0x95)]}},{'name':a0_0x5588ee(0xb1),'description':a0_0x5588ee(0x96),'inputSchema':{'type':a0_0x5588ee(0x11a),'properties':{}}}]}));async function Y(_0x55b2fb,_0x12d42c){const _0x16a1dc=a0_0x5588ee;let _0x4b18c9=await fetch(j+_0x16a1dc(0x10b),{'method':'POST','headers':{'Content-Type':_0x16a1dc(0xae),'Accept':'application/json,\x20text/event-stream',...F?{'Authorization':_0x16a1dc(0xa9)+F}:{}},'body':JSON[_0x16a1dc(0xd9)]({'jsonrpc':'2.0','id':0x1,'method':_0x16a1dc(0xec),'params':{'protocolVersion':_0x16a1dc(0xe1),'capabilities':{},'clientInfo':{'name':'commhub-channel','version':_0x16a1dc(0xf6)}}})});if(!_0x4b18c9['ok']){let _0x299003=await _0x4b18c9['text']();return W(_0x16a1dc(0x9d)+_0x4b18c9[_0x16a1dc(0xb3)]+'\x20'+_0x299003[_0x16a1dc(0xf5)](0x0,0x64)),{'ok':!0x1,'error':_0x16a1dc(0xd0)+_0x4b18c9[_0x16a1dc(0xb3)]};}await _0x4b18c9[_0x16a1dc(0x122)]();let _0x1c293c=(await(await fetch(j+'/mcp',{'method':_0x16a1dc(0xfc),'headers':{'Content-Type':_0x16a1dc(0xae),'Accept':_0x16a1dc(0xc3),...F?{'Authorization':_0x16a1dc(0xa9)+F}:{}},'body':JSON[_0x16a1dc(0xd9)]({'jsonrpc':_0x16a1dc(0xe4),'id':0x2,'method':_0x16a1dc(0x9e),'params':{'name':_0x55b2fb,'arguments':_0x12d42c}})}))[_0x16a1dc(0x122)]())[_0x16a1dc(0xca)]('\x0a')['find'](_0x397d04=>_0x397d04['startsWith'](_0x16a1dc(0xf1)));if(_0x1c293c){let _0x293a7f=JSON['parse'](_0x1c293c[_0x16a1dc(0xf5)](0x6));return _0x293a7f?.[_0x16a1dc(0x11d)]?.[_0x16a1dc(0x111)]?.[0x0]?.['text']?JSON['parse'](_0x293a7f[_0x16a1dc(0x11d)][_0x16a1dc(0x111)][0x0][_0x16a1dc(0x122)]):_0x293a7f;}return{'ok':!0x1,'error':_0x16a1dc(0x106)};}x[a0_0x5588ee(0xe9)](a0_0xb54bd5,async _0x27b413=>{const _0x412139=a0_0x5588ee;let {name:_0x43e544,arguments:_0x2af3ec}=_0x27b413[_0x412139(0xa7)];if(_0x43e544===_0x412139(0xde)){let {task_id:_0x1101f3,text:_0x282c02,status:_0x42e298}=_0x2af3ec;if(_0x42e298===_0x412139(0xcf)||_0x42e298===_0x412139(0x119)||_0x42e298===_0x412139(0x91)){let _0x3964e6=_0x42e298==='completed'?_0x412139(0xc9):_0x42e298,_0x1d8080=_0x1101f3?D['get'](_0x1101f3)||_0x412139(0x8f):'hub',_0x24ce17=await Y(_0x412139(0xf8),{'alias':_0x1d8080,'text':_0x282c02,'in_reply_to':_0x1101f3||void 0x0,'status':_0x3964e6,'from_session':G});if(_0x1101f3)D[_0x412139(0xa2)](_0x1101f3);return{'content':[{'type':_0x412139(0x122),'text':JSON[_0x412139(0xd9)](_0x24ce17)}]};}let _0x59eb00=await Y(_0x412139(0x10e),{'resume_id':K,'alias':G,'status':_0x42e298==='blocked'?'blocked':_0x42e298==='error'?_0x412139(0xb8):'working','task':_0x282c02[_0x412139(0xf5)](0x0,0xc8),'output':_0x282c02});return{'content':[{'type':_0x412139(0x122),'text':JSON['stringify'](_0x59eb00)}]};}if(_0x43e544==='commhub_report_status'){let {status:_0x485352,task:_0x22963f,progress:_0x308e7c}=_0x2af3ec,_0x5f4503=await Y('report_status',{'resume_id':K,'alias':G,'status':_0x485352,'task':_0x22963f,'progress':_0x308e7c});return{'content':[{'type':_0x412139(0x122),'text':JSON[_0x412139(0xd9)](_0x5f4503)}]};}if(_0x43e544===_0x412139(0x8b)){let {alias:_0x5a8705,task:_0x55bc7d,priority:_0x38a4f9}=_0x2af3ec,_0x5abad6=await Y(_0x412139(0xce),{'alias':_0x5a8705,'task':_0x55bc7d,'priority':_0x38a4f9||_0x412139(0xfe),'from_session':G});return{'content':[{'type':'text','text':JSON['stringify'](_0x5abad6)}]};}if(_0x43e544===_0x412139(0xe5)){let {alias:_0x3cb447,message:_0xea96d9}=_0x2af3ec,_0x45c25c=await Y(_0x412139(0xf7),{'alias':_0x3cb447,'message':_0xea96d9,'from_session':G});return{'content':[{'type':_0x412139(0x122),'text':JSON[_0x412139(0xd9)](_0x45c25c)}]};}if(_0x43e544==='commhub_get_all_status'){let _0x3759c7=await Y(_0x412139(0xd3),{});return{'content':[{'type':_0x412139(0x122),'text':JSON[_0x412139(0xd9)](_0x3759c7)}]};}return{'content':[{'type':'text','text':JSON[_0x412139(0xd9)]({'error':_0x412139(0x11f)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x12b5cd=a0_0x5588ee;try{await Y('report_status',{'resume_id':K,'alias':G,'status':_0x12b5cd(0x11b),'server':a0_0x2c58ce(),'hostname':a0_0x2c58ce(),'agent':'claude-code','project_dir':process['cwd'](),'tmux_name':f||void 0x0}),W('re-registered\x20as\x20\x22'+G+_0x12b5cd(0xef));}catch(_0xdb2f20){W('re-register\x20failed:\x20'+_0xdb2f20);}}async function o(){const _0xfe5ddb=a0_0x5588ee;let _0x2fa206=j+_0xfe5ddb(0x103)+encodeURIComponent(G),_0x120c50={};if(F)_0x120c50[_0xfe5ddb(0xe3)]=_0xfe5ddb(0xa9)+F;W(_0xfe5ddb(0x105)+_0x2fa206);let _0x38c3f2=O,_0x190b22=!0x0,_0x4a5821=null;while(!0x0){try{let _0x4075e3=await fetch(_0x2fa206,{'headers':_0x120c50});if(!_0x4075e3['ok']){if(W(_0xfe5ddb(0xf0)+_0x4075e3[_0xfe5ddb(0xb3)]+'\x20'+_0x4075e3['statusText']),_0x4a5821=_0x4a5821??Date[_0xfe5ddb(0x92)](),Date[_0xfe5ddb(0x92)]()-_0x4a5821>T){W('SSE\x20连续\x20>1h\x20连不上\x20hub\x20('+j+')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。');return;}await N(_0x38c3f2),_0x38c3f2=Math['min'](_0x38c3f2*0x2,R);continue;}let _0x129823=_0x4075e3[_0xfe5ddb(0xeb)][_0xfe5ddb(0x93)](),_0x54f197=new TextDecoder(),_0x63bc87='';_0x38c3f2=O;while(!0x0){let {done:_0x396933,value:_0x2fda5b}=await _0x129823[_0xfe5ddb(0xcd)]();if(_0x396933)break;_0x63bc87+=_0x54f197['decode'](_0x2fda5b,{'stream':!0x0});let _0x166357=_0x63bc87[_0xfe5ddb(0xca)]('\x0a\x0a');_0x63bc87=_0x166357[_0xfe5ddb(0xe6)]()||'';for(let _0x36a1b1 of _0x166357){let _0x409fcc=_0x36a1b1[_0xfe5ddb(0xca)]('\x0a')[_0xfe5ddb(0x8d)](_0x35a9c6=>_0x35a9c6[_0xfe5ddb(0x108)]('data:\x20'));if(!_0x409fcc)continue;try{let _0x29778f=JSON[_0xfe5ddb(0xd1)](_0x409fcc['slice'](0x6));if(await a(_0x29778f),_0x29778f[_0xfe5ddb(0xd4)]==='connected'){if(_0x4a5821=null,!_0x190b22)await l();_0x190b22=!0x1;}}catch(_0x2b3fe0){W('parse\x20error:\x20'+_0x2b3fe0);}}}W(_0xfe5ddb(0x114));}catch(_0xf293c0){W(_0xfe5ddb(0xbc)+_0xf293c0);}if(_0x4a5821=_0x4a5821??Date[_0xfe5ddb(0x92)](),Date['now']()-_0x4a5821>T){W(_0xfe5ddb(0x112)+j+_0xfe5ddb(0xcb));return;}await N(_0x38c3f2),_0x38c3f2=Math['min'](_0x38c3f2*0x2,R);}}async function a(_0x2d8ea6){const _0x96fe36=a0_0x5588ee;if(_0x2d8ea6[_0x96fe36(0xd4)]===_0x96fe36(0xa5)){W(_0x96fe36(0xaa)+G+'\x22');return;}if(_0x2d8ea6['type']===_0x96fe36(0xc1)){if(W('←\x20message\x20from\x20'+_0x2d8ea6['from']+':\x20'+_0x2d8ea6[_0x96fe36(0x95)][_0x96fe36(0xf5)](0x0,0x3c)),await x[_0x96fe36(0xbe)]({'method':_0x96fe36(0xdd),'params':{'content':_0x2d8ea6[_0x96fe36(0x95)],'meta':{'sender':_0x2d8ea6[_0x96fe36(0xad)]||_0x96fe36(0x8f),'sender_id':_0x96fe36(0xe8),'user':_0x2d8ea6['from']||_0x96fe36(0x8f),'priority':_0x96fe36(0xfe)}}}),_0x2d8ea6[_0x96fe36(0x102)])await Y(_0x96fe36(0x11c),{'alias':G,'message_id':_0x2d8ea6[_0x96fe36(0x102)]});return;}if(_0x2d8ea6[_0x96fe36(0xd4)]===_0x96fe36(0xcc)||_0x2d8ea6[_0x96fe36(0xd4)]===_0x96fe36(0x109)){W('←\x20'+_0x2d8ea6[_0x96fe36(0xd4)]+_0x96fe36(0x94)+_0x2d8ea6['inbox_count']+'\x20priority='+(_0x2d8ea6[_0x96fe36(0x90)]||'normal'));let _0x1f1c5c=await Y(_0x96fe36(0xbb),{'alias':G,'limit':0x5});if(_0x1f1c5c?.['ok']&&_0x1f1c5c[_0x96fe36(0xc8)]?.['length']>0x0)for(let _0x384c6f of _0x1f1c5c[_0x96fe36(0xc8)]){let _0x5a6141={'sender':_0x384c6f[_0x96fe36(0x107)]||_0x96fe36(0x8f),'sender_id':'commhub','user':_0x384c6f[_0x96fe36(0x107)]||_0x96fe36(0x8f),'task_id':_0x384c6f['id'],'priority':_0x384c6f[_0x96fe36(0x90)]||_0x96fe36(0xfe)};D[_0x96fe36(0xd6)](_0x384c6f['id'],_0x384c6f['from_session']||_0x96fe36(0x8f)),await x[_0x96fe36(0xbe)]({'method':_0x96fe36(0xdd),'params':{'content':_0x384c6f[_0x96fe36(0x111)],'meta':_0x5a6141}}),W('→\x20injected\x20task\x20'+_0x384c6f['id'][_0x96fe36(0xf5)](0x0,0x8)+_0x96fe36(0xa1)+_0x384c6f[_0x96fe36(0x107)]+':\x20'+_0x384c6f[_0x96fe36(0x111)][_0x96fe36(0xf5)](0x0,0x3c)),await Y(_0x96fe36(0x11c),{'alias':G,'message_id':_0x384c6f['id']});}}}async function n(){const _0x5e544d=a0_0x5588ee;let _0x5508f3=new a0_0x59aee6();await x[_0x5e544d(0x10f)](_0x5508f3),W(_0x5e544d(0xab)),W(_0x5e544d(0xaf)),o()[_0x5e544d(0xea)](_0x35ac5d=>W(_0x5e544d(0x113)+_0x35ac5d)),Y(_0x5e544d(0x10e),{'resume_id':K,'alias':G,'status':_0x5e544d(0x11b),'server':a0_0x2c58ce(),'hostname':a0_0x2c58ce(),'agent':'claude-code','project_dir':process['cwd'](),'tmux_name':f||void 0x0})[_0x5e544d(0xc4)](()=>W(_0x5e544d(0x124)+G+_0x5e544d(0xc7)+K[_0x5e544d(0xf5)](0x0,0x8)+')'))['catch'](_0x4b987c=>W(_0x5e544d(0xbd)+_0x4b987c)),setInterval(()=>{const _0x57ba65=_0x5e544d;Y(_0x57ba65(0x10e),{'resume_id':K,'alias':G,'status':_0x57ba65(0x11b),'server':a0_0x2c58ce(),'hostname':a0_0x2c58ce(),'agent':'claude-code','project_dir':process[_0x57ba65(0xa4)](),'tmux_name':f||void 0x0})[_0x57ba65(0xea)](_0x38c5c4=>W(_0x57ba65(0xd5)+_0x38c5c4));},0x2bf20),W(_0x5e544d(0xf9));}n()['catch'](_0x231e1c=>{const _0xf2a35c=a0_0x5588ee;W(_0xf2a35c(0x10c)+_0x231e1c),process['exit'](0x1);});function a0_0x4bea(_0x24f1cb,_0x35441e){_0x24f1cb=_0x24f1cb-0x8b;const _0x215bc7=a0_0x215b();let _0x4beaad=_0x215bc7[_0x24f1cb];return _0x4beaad;}async function b(){const _0x1a71bb=a0_0x5588ee;W(_0x1a71bb(0xa6)),await Y(_0x1a71bb(0x10e),{'resume_id':K,'alias':G,'status':_0x1a71bb(0x104),'task':'session\x20disconnected'})[_0x1a71bb(0xea)](()=>{}),process[_0x1a71bb(0xe7)](0x0);}process['stdin']['on'](a0_0x5588ee(0x100),()=>b()),process['on']('SIGTERM',()=>b()),process['on'](a0_0x5588ee(0xa0),()=>b());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network",
3
- "version": "2.2.22-preview.1",
3
+ "version": "2.2.22-preview.3",
4
4
  "description": "AI Agent Network CLI — Local-first multi-agent orchestration across 4 runtimes (Claude Code CLI / Claude Agent SDK / Codex SDK / Grok Build ACP) and 8+ LLM providers (Anthropic / OpenAI / xAI Grok / MiniMax / DeepSeek / GLM / Kimi / InternLM / Xiaomi MiMo / OpenRouter). Apache 2.0.",
5
5
  "type": "module",
6
6
  "main": "dist/src/client.js",
@@ -19,6 +19,7 @@
19
19
  ],
20
20
  "scripts": {
21
21
  "typecheck": "tsc --noEmit",
22
+ "test:feishu-bridge": "bun tests/feishu-bridge-ackplaceholder.test.ts",
22
23
  "build": "bun build src/client.ts --outdir dist/src --target node --minify && bun build bin/cli.ts --outdir dist/bin --target node --minify --external @sleep2agi/commhub-server --external bun:sqlite --external '../../server/*' && bun build src/node-server.ts --outdir dist/src --target node --minify --external @modelcontextprotocol/sdk && bun build src/im/feishu/worker.ts --outdir dist/src/im/feishu --target node --minify --external @larksuiteoapi/node-sdk && tsc --emitDeclarationOnly --declaration --outDir dist && npx javascript-obfuscator dist/bin/cli.js --output dist/bin/cli.js --compact true --string-array true --string-array-encoding base64 && npx javascript-obfuscator dist/src/client.js --output dist/src/client.js --compact true --string-array true && npx javascript-obfuscator dist/src/node-server.js --output dist/src/node-server.js --compact true --string-array true",
23
24
  "prepublishOnly": "npm run build"
24
25
  },