@sleep2agi/agent-network 2.2.22-preview.3 → 2.3.0-preview.0

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_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();}
1
+ const a0_0x2b4509=a0_0xeda9;(function(_0x318ee9,_0x43332d){const _0x22d06b=a0_0xeda9,_0x8a1d78=_0x318ee9();while(!![]){try{const _0x5d4a54=-parseInt(_0x22d06b(0x1cc))/0x1*(parseInt(_0x22d06b(0x214))/0x2)+parseInt(_0x22d06b(0x1dc))/0x3*(parseInt(_0x22d06b(0x204))/0x4)+-parseInt(_0x22d06b(0x1dd))/0x5*(-parseInt(_0x22d06b(0x1ed))/0x6)+parseInt(_0x22d06b(0x212))/0x7+-parseInt(_0x22d06b(0x217))/0x8+parseInt(_0x22d06b(0x1fe))/0x9+-parseInt(_0x22d06b(0x1ff))/0xa;if(_0x5d4a54===_0x43332d)break;else _0x8a1d78['push'](_0x8a1d78['shift']());}catch(_0x403dab){_0x8a1d78['push'](_0x8a1d78['shift']());}}}(a0_0x51ac,0xeed51));import{EventEmitter as a0_0x1bac59}from'events';function a0_0xeda9(_0x2cb602,_0x2b14d5){_0x2cb602=_0x2cb602-0x1cb;const _0x51ac75=a0_0x51ac();let _0xeda93d=_0x51ac75[_0x2cb602];return _0xeda93d;}import{hostname as a0_0x1d6303}from'os';class T extends a0_0x1bac59{['url'];[a0_0x2b4509(0x1f9)];[a0_0x2b4509(0x21a)];[a0_0x2b4509(0x1ce)];[a0_0x2b4509(0x1e0)];[a0_0x2b4509(0x1d7)];[a0_0x2b4509(0x218)];[a0_0x2b4509(0x1fc)];[a0_0x2b4509(0x208)];[a0_0x2b4509(0x1d5)]=!0x1;constructor(_0x59a1d1){const _0x30d15e=a0_0x2b4509;super();if(this[_0x30d15e(0x20b)]=_0x59a1d1[_0x30d15e(0x20b)][_0x30d15e(0x1df)](/\/$/,''),this['alias']=_0x59a1d1[_0x30d15e(0x1f9)],this[_0x30d15e(0x21a)]=_0x59a1d1[_0x30d15e(0x21a)],this[_0x30d15e(0x1ce)]=_0x59a1d1[_0x30d15e(0x1ce)]||'sdk',this[_0x30d15e(0x1e0)]=_0x30d15e(0x20c)+_0x59a1d1['alias']+'-'+Date['now']()['toString'](0x24),this['heartbeatInterval']=_0x59a1d1[_0x30d15e(0x1d7)]??0x2bf20,this['reconnectDelay']=_0x59a1d1[_0x30d15e(0x218)]??0xbb8,_0x59a1d1[_0x30d15e(0x1d6)]!==!0x1)this[_0x30d15e(0x20d)]();}['log'](_0x13e662){const _0x563bd0=a0_0x2b4509;console[_0x563bd0(0x1f5)]('['+new Date()[_0x563bd0(0x1f0)]()[_0x563bd0(0x1eb)](0x0,0x8)+_0x563bd0(0x1fb)+this[_0x563bd0(0x1f9)]+']\x20'+_0x13e662);}async[a0_0x2b4509(0x1f7)](_0x140b3c,_0x496ccc){const _0x1043a5=a0_0x2b4509;let _0x357066={'Content-Type':_0x1043a5(0x1da),'Accept':'application/json,\x20text/event-stream'};if(this[_0x1043a5(0x21a)])_0x357066[_0x1043a5(0x1ea)]=_0x1043a5(0x20a)+this[_0x1043a5(0x21a)];let _0x1ba73e=await(await fetch(this[_0x1043a5(0x20b)]+_0x1043a5(0x20f),{'method':_0x1043a5(0x1ee),'headers':_0x357066,'body':JSON['stringify']({'jsonrpc':'2.0','id':Date[_0x1043a5(0x1fa)](),'method':'tools/call','params':{'name':_0x140b3c,'arguments':_0x496ccc}})}))['text'](),_0xa5a90e=_0x1ba73e[_0x1043a5(0x1e7)](/data: (.+)/),_0x2ecb63=_0xa5a90e?JSON[_0x1043a5(0x216)](_0xa5a90e[0x1]):JSON[_0x1043a5(0x216)](_0x1ba73e),_0x515184=_0x2ecb63?.[_0x1043a5(0x1cf)]?.[_0x1043a5(0x213)]?.[0x0]?.[_0x1043a5(0x1e9)];return _0x515184?JSON[_0x1043a5(0x216)](_0x515184):_0x2ecb63;}async[a0_0x2b4509(0x20d)](){const _0x5730ec=a0_0x2b4509;if(this['running'])return;this[_0x5730ec(0x1d5)]=!0x0,await this[_0x5730ec(0x21c)](_0x5730ec(0x207)),this[_0x5730ec(0x1f5)](_0x5730ec(0x1f8)),this[_0x5730ec(0x1fc)]=setInterval(()=>{const _0x324206=_0x5730ec;this[_0x324206(0x21c)](_0x324206(0x207))[_0x324206(0x1de)](_0xd48d87=>this[_0x324206(0x1f5)](_0x324206(0x1fd)+_0xd48d87['message']));},this[_0x5730ec(0x1d7)]),this[_0x5730ec(0x205)]();}async[a0_0x2b4509(0x1e5)](){const _0x595860=a0_0x2b4509;if(this[_0x595860(0x1d5)]=!0x1,this['sseAbort']?.[_0x595860(0x1ec)](),this[_0x595860(0x1fc)])clearInterval(this[_0x595860(0x1fc)]);await this['status'](_0x595860(0x201))[_0x595860(0x1de)](()=>{}),this['log'](_0x595860(0x206));}async['send'](_0x2b4958,_0xf9ecde,_0x458517=a0_0x2b4509(0x202)){const _0x4246e5=a0_0x2b4509;return this[_0x4246e5(0x1f7)](_0x4246e5(0x211),{'alias':_0x2b4958,'task':_0xf9ecde,'priority':_0x458517,'from_session':this['alias']});}async[a0_0x2b4509(0x1f2)](_0x22fed2,_0x46922a){const _0x35bc1f=a0_0x2b4509;return this['call']('send_message',{'alias':_0x22fed2,'message':_0x46922a,'from_session':this[_0x35bc1f(0x1f9)]});}async['reply'](_0x4138b5,_0xf1266a,_0x1a513a=a0_0x2b4509(0x21b)){const _0x269f30=a0_0x2b4509;return this['call'](_0x269f30(0x1f6),{'in_reply_to':_0x4138b5,'text':_0xf1266a,'status':_0x1a513a});}async[a0_0x2b4509(0x21c)](_0x1eff61,_0x234f27){const _0x1014ac=a0_0x2b4509;return this[_0x1014ac(0x1f7)]('report_status',{'resume_id':this[_0x1014ac(0x1e0)],'alias':this[_0x1014ac(0x1f9)],'status':_0x1eff61,'server':a0_0x1d6303(),'hostname':a0_0x1d6303(),'agent':this['agent'],'project_dir':process[_0x1014ac(0x1d2)](),..._0x234f27});}async[a0_0x2b4509(0x200)](){const _0x12a22c=a0_0x2b4509;return this[_0x12a22c(0x1f7)](_0x12a22c(0x1d3),{});}async['broadcast'](_0x36665c,_0x27b071){const _0x4ea681=a0_0x2b4509;return this[_0x4ea681(0x1f7)]('broadcast',{'message':_0x36665c,'filter_server':_0x27b071?.[_0x4ea681(0x220)],'filter_status':_0x27b071?.[_0x4ea681(0x21c)]});}async[a0_0x2b4509(0x205)](){const _0x243e9c=a0_0x2b4509;let _0x24293c=encodeURIComponent(this[_0x243e9c(0x1f9)]),_0x37bee0=this[_0x243e9c(0x20b)]+_0x243e9c(0x1db)+_0x24293c,_0x50b4b8=this[_0x243e9c(0x218)];while(this['running']){try{this[_0x243e9c(0x208)]=new AbortController();let _0x485c48={'Accept':_0x243e9c(0x1f3)};if(this[_0x243e9c(0x21a)])_0x485c48[_0x243e9c(0x1ea)]='Bearer\x20'+this[_0x243e9c(0x21a)];let _0x232c08=await fetch(_0x37bee0,{'headers':_0x485c48,'signal':this[_0x243e9c(0x208)][_0x243e9c(0x20e)]});if(!_0x232c08['ok']||!_0x232c08[_0x243e9c(0x219)]){this[_0x243e9c(0x1f5)](_0x243e9c(0x1d1)+_0x232c08[_0x243e9c(0x21c)]),await this['sleep'](_0x50b4b8),_0x50b4b8=Math[_0x243e9c(0x1e2)](_0x50b4b8*1.5,0xea60);continue;}_0x50b4b8=this[_0x243e9c(0x218)];let _0x439372=_0x232c08[_0x243e9c(0x219)]['getReader'](),_0x8128ad=new TextDecoder(),_0x5bb10f='';while(this[_0x243e9c(0x1d5)]){let {done:_0x1fbc09,value:_0x1e758b}=await _0x439372[_0x243e9c(0x21e)]();if(_0x1fbc09)break;_0x5bb10f+=_0x8128ad[_0x243e9c(0x1e4)](_0x1e758b,{'stream':!0x0});let _0xe5b50d=_0x5bb10f[_0x243e9c(0x1d8)]('\x0a');_0x5bb10f=_0xe5b50d[_0x243e9c(0x1f1)]()||'';for(let _0x1f5544 of _0xe5b50d){if(!_0x1f5544['startsWith'](_0x243e9c(0x21d)))continue;try{let _0x1e39ce=JSON[_0x243e9c(0x216)](_0x1f5544[_0x243e9c(0x1eb)](0x6));if(_0x1e39ce['type']==='connected'){this[_0x243e9c(0x1f5)](_0x243e9c(0x1cb)),this[_0x243e9c(0x1e8)](_0x243e9c(0x210));continue;}if(_0x1e39ce['type']==='new_task'||_0x1e39ce['type']==='new_message'||_0x1e39ce['type']==='broadcast')await this[_0x243e9c(0x215)]();}catch{}}}}catch(_0x55042f){if(_0x55042f[_0x243e9c(0x1d9)]===_0x243e9c(0x1cd))break;this[_0x243e9c(0x1e8)](_0x243e9c(0x203),_0x55042f),this[_0x243e9c(0x1f5)](_0x243e9c(0x1ef)+_0x55042f[_0x243e9c(0x1f2)]);}if(this[_0x243e9c(0x1d5)])this[_0x243e9c(0x1e8)]('disconnected'),this['log'](_0x243e9c(0x1e3)+_0x50b4b8/0x3e8+_0x243e9c(0x21f)),await this[_0x243e9c(0x1d4)](_0x50b4b8),_0x50b4b8=Math[_0x243e9c(0x1e2)](_0x50b4b8*1.5,0xea60);}}async[a0_0x2b4509(0x215)](){const _0x59775c=a0_0x2b4509;try{let _0x48397d=(await this[_0x59775c(0x1f7)](_0x59775c(0x1d0),{'alias':this[_0x59775c(0x1f9)],'limit':0xa}))?.[_0x59775c(0x1e1)]||[];for(let _0x198ecc of _0x48397d)await this[_0x59775c(0x1f7)](_0x59775c(0x209),{'alias':this[_0x59775c(0x1f9)],'message_id':_0x198ecc['id']}),this[_0x59775c(0x1f5)]('←\x20'+_0x198ecc[_0x59775c(0x1f4)]+':\x20'+_0x198ecc['content'][_0x59775c(0x1eb)](0x0,0x3c)),this[_0x59775c(0x1e8)]('task',_0x198ecc),this[_0x59775c(0x1e8)](_0x59775c(0x1f2),_0x198ecc);}catch(_0x49d4c0){this['log'](_0x59775c(0x1e6)+_0x49d4c0[_0x59775c(0x1f2)]);}}['sleep'](_0x54c77d){return new Promise(_0x28d263=>setTimeout(_0x28d263,_0x54c77d));}}var $=T;export{$ as default,T as CommHub};function a0_0x51ac(){const _0x1b7928=['emit','text','Authorization','slice','abort','60954RAXQAN','POST','SSE\x20error:\x20','toTimeString','pop','message','text/event-stream','from_session','log','send_reply','call','registered','alias','now',']\x20[commhub:','heartbeatTimer','heartbeat\x20failed:\x20','9988542sVTaus','12854220AxDfdK','getAllStatus','offline','normal','error','3628rxNEmB','connectSSE','disconnected','idle','sseAbort','ack_inbox','Bearer\x20','url','sdk-','connect','signal','/mcp','connected','send_task','6362188JoQPdc','content','94FeqdtI','processInbox','parse','859176YDVxqB','reconnectDelay','body','token','completed','status','data:\x20','read','s...','server','SSE\x20connected','19726mMhZmJ','AbortError','agent','result','get_inbox','SSE\x20failed:\x20','cwd','get_all_status','sleep','running','autoConnect','heartbeatInterval','split','name','application/json','/events/','771HehUqe','515QyXQmp','catch','replace','resumeId','messages','min','SSE\x20reconnecting\x20in\x20','decode','disconnect','inbox\x20error:\x20','match'];a0_0x51ac=function(){return _0x1b7928;};return a0_0x51ac();}
@@ -84,7 +84,16 @@ export declare function withDedup(inner: (event: NormalizedIMEvent) => Promise<v
84
84
  *
85
85
  * @internal exported for test harness.
86
86
  */
87
- export declare function withRateLimit(inner: (event: NormalizedIMEvent) => Promise<void>, adapter: FeishuAdapter): (event: NormalizedIMEvent) => Promise<void>;
87
+ export declare function withRateLimit(inner: (event: NormalizedIMEvent) => Promise<void>, adapter: FeishuAdapter): WithRateLimitHandle;
88
+ /** @internal — wrapped handler with state-inspection escape hatch for tests. */
89
+ export type WithRateLimitHandle = {
90
+ (event: NormalizedIMEvent): Promise<void>;
91
+ __getState(): {
92
+ dmKeyCount: number;
93
+ groupKeyCount: number;
94
+ floodKeyCount: number;
95
+ };
96
+ };
88
97
  /**
89
98
  * IPC handler — forwards inbound events to the parent agent-node and routes
90
99
  * the parent's reply back to Feishu via the adapter. The parent contract is
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
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"}
2
+ import*as b from"@larksuiteoapi/node-sdk";import f from"node:crypto";import{existsSync as w,mkdirSync as T,readFileSync as I,writeFileSync as h}from"node:fs";import{join as L}from"node:path";import{Readable as v}from"node:stream";class R{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 m(this.client),this.mediaDir=J.channelDir?L(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:Y,groupPolicy:V}=this.feishuConfig,G=this.connectionName,q=this.botOpenId,X=this.mediaDir,K=this.client,N=new b.EventDispatcher({});N.register({"im.message.receive_v1":async(H)=>{try{this.health_={...this.health_,lastEventAt:Date.now()};let $=l(H,G,q);if(!$)return;await p(H,$,K,X);let B=d($,Y,V);if(!B.allow){O("deny",$,B.reason);return}await Q($)}catch($){let B=$ instanceof Error?$.message:String($);this.health_={...this.health_,lastError:B},O("error",null,B)}}}),this.wsClient=new b.WSClient({appId:J,appSecret:Z,loggerLevel:b.LoggerLevel.warn}),await this.wsClient.start({eventDispatcher:N}),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 X=await c(this.client,Q.imagePath);if(!X)throw Error(`FeishuAdapter.send: image upload failed for ${Q.imagePath}`);J="image",Z=JSON.stringify({image_key:X})}else{let X=Q.text??Q.markdown;if(!X)throw Error("FeishuAdapter.send: requires text, markdown, or imagePath");J="text",Z=JSON.stringify({text:X})}let Y=Q.replyToMessageId??Q.target.threadRootId;if(Y){let K=(await this.client.im.message.reply({path:{message_id:Y},data:{msg_type:J,content:Z}}))?.data?.message_id;if(!K)throw Error("FeishuAdapter.send: reply returned no message_id");return{messageId:K}}let V=Q.target.conversationType==="dm"?"open_id":"chat_id",q=(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(!q)throw Error("FeishuAdapter.send: create returned no message_id");return{messageId:q}}async edit(Q,J,Z){if(!this.client)throw Error("FeishuAdapter.edit: call init() first");let Y=Z.text??Z.markdown;if(!Y)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:Y})}})}health(){return{...this.health_}}}function l(Q,J,Z){let Y=Q,V=Y?.message,G=Y?.sender,q=G?.sender_id?.open_id;if(!V||!q)return null;let X;if(V.message_type==="text")try{X=JSON.parse(V.content).text}catch{X=V.content}else if(V.message_type==="file")try{X=`[文件: ${JSON.parse(V.content).file_name??"unknown"}]`}catch{X="[文件]"}else if(V.message_type==="sticker")X="[表情]";else if(V.message_type==="image")X=void 0;else return null;let K=V.chat_type==="group"?"group":"dm",N=Array.isArray(V.mentions)?V.mentions:[],H=Z?N.some((B)=>B?.id?.open_id===Z):N.length>0,$=`${J}#feishu`;return{platform:"feishu",connectionId:$,tenantId:G?.tenant_key,conversation:{platform:"feishu",conversationId:V.chat_id,conversationType:K,threadRootId:V.root_id},sender:{id:q},messageId:V.message_id,mentioned:H,content:X?{text:X}:{},receivedAt:Date.now(),idempotencyKey:`feishu:${$}:${V.message_id}`}}async function p(Q,J,Z,Y){if(!Z||!Y)return;let G=Q?.message;if(!G||G.message_type!=="image")return;let q;try{q=JSON.parse(G.content).image_key}catch{return}if(!q||!G.message_id)return;let X=await g(Z,G.message_id,q,Y);if(X)J.content={...J.content,images:[X]}}async function g(Q,J,Z,Y){try{let V=await Q.im.messageResource.get({path:{message_id:J,file_key:Z},params:{type:"image"}});if(!V)return null;let G=V,q=[];await new Promise((N,H)=>{G.on("data",($)=>q.push(Buffer.from($))),G.on("end",()=>N()),G.on("error",($)=>H($))}),T(Y,{recursive:!0});let X=`img_${Date.now()}_${f.randomBytes(4).toString("hex")}.png`,K=L(Y,X);return h(K,Buffer.concat(q)),K}catch{return null}}async function c(Q,J){try{if(!w(J))return null;let Z=I(J),Y=v.from(Z);return(await Q.im.image.create({data:{image_type:"message",image:Y}}))?.image_key??null}catch{return null}}async function m(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 d(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 O(Q,J,Z){let Y=new Date().toISOString(),V=J?`${J.conversation.conversationType}:${J.conversation.conversationId}`:"?",G=J?J.sender.id:"?";process.stderr.write(`[${Y}] [feishu:audit] ${Q} from=${G} conv=${V} — ${Z}
3
+ `)}import{existsSync as C,readFileSync as E}from"node:fs";import{join as P}from"node:path";function k(Q){let J=o(P(Q,".env")),Z=J.FEISHU_APP_ID,Y=J.FEISHU_APP_SECRET;if(!Z||!Y)throw Error(`feishu channel: FEISHU_APP_ID / FEISHU_APP_SECRET missing in ${Q}/.env`);let V=i(P(Q,"access.json"));return{appId:Z,appSecret:Y,access:V,groupPolicy:"mention",ackPlaceholder:!0,auditRaw:!1,taskTimeoutMs:300000,channelDir:Q}}function o(Q){if(!C(Q))return{};let J={};for(let Z of E(Q,"utf-8").split(/\r?\n/)){let Y=Z.trim();if(!Y||Y.startsWith("#"))continue;let V=Y.indexOf("=");if(V<0)continue;let G=Y.slice(0,V).trim(),q=Y.slice(V+1).trim().replace(/^["']|["']$/g,"");J[G]=q}return J}function i(Q){if(!C(Q))return{allowFrom:[],allowChats:[]};try{let J=JSON.parse(E(Q,"utf-8"));return{allowFrom:Array.isArray(J.allowFrom)?J.allowFrom:[],allowChats:Array.isArray(J.allowChats)?J.allowChats:[]}}catch{return{allowFrom:[],allowChats:[]}}}var r=900000,s=120000,a=3,M=60000,t=2,D=60000,n=3,y=60000,e="处理频率超出限制,请稍后重试";async function u(Q){let J=k(Q.channelDir),Z=new R;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 Y=J.taskTimeoutMs||r,V=Q.onEvent??VJ(Z,Y,J.ackPlaceholder);return await Z.start(JJ(QJ(V,Z))),Z}function JJ(Q){let J=new Map;return async(Z)=>{let Y=Date.now();if(J.size>200){for(let[V,G]of J)if(Y-G>s)J.delete(V)}if(J.has(Z.idempotencyKey)){process.stderr.write(`[feishu:bridge] dedup drop ${Z.idempotencyKey}
4
+ `);return}J.set(Z.idempotencyKey,Y),await Q(Z)}}function QJ(Q,J){let Z=new Map,Y=new Map,V=new Map;function G($,B,j){let W=B-j;return $.filter((z)=>z>=W)}function q($,B,j){if($.size<=_)return;for(let[W,z]of $){let U=z[z.length-1]??0;if(B-U>j)$.delete(W)}}function X($,B){if($.size<=_)return;for(let[j,W]of $)if(B-W.windowStart>y)$.delete(j)}function K($,B){if($.size<=B)return;let j=[];for(let[z,U]of $)j.push([z,U[U.length-1]??0]);j.sort((z,U)=>z[1]-U[1]);let W=$.size-B;for(let z=0;z<W;z++)$.delete(j[z][0])}function N($,B){if($.size<=B)return;let j=[];for(let[z,U]of $)j.push([z,U.windowStart]);j.sort((z,U)=>z[1]-U[1]);let W=$.size-B;for(let z=0;z<W;z++)$.delete(j[z][0])}let H=async($)=>{let B=Date.now();q(Z,B,M),q(Y,B,D),X(V,B),K(Z,A),K(Y,A),N(V,A);let j=!1;if($.conversation.conversationType==="dm"){let x=$.sender.id,F=G(Z.get(x)??[],B,M);if(F.length>=a)j=!0,Z.set(x,F);else F.push(B),Z.set(x,F)}else{let x=$.conversation.conversationId,F=G(Y.get(x)??[],B,D);if(F.length>=t)j=!0,Y.set(x,F);else F.push(B),Y.set(x,F)}if(j){let x=$.sender.id,F=$.conversation.conversationId;if($.conversation.conversationType==="dm"){let S=Z.get(x);if(S&&S.length===0)Z.delete(x)}else{let S=Y.get(F);if(S&&S.length===0)Y.delete(F)}}if(!j){await Q($);return}let W=$.sender.id,z=V.get(W),U;if(!z||B-z.windowStart>y)U={count:1,windowStart:B};else U={count:z.count+1,windowStart:z.windowStart};if(V.set(W,U),U.count>=n)process.stderr.write(`[feishu:audit] flood from=${W} conv=${$.conversation.conversationType}:${$.conversation.conversationId} — ${U.count} rate-limit denies in ${Math.round((B-U.windowStart)/1000)}s window
5
+ `);try{await J.send({target:$.conversation,text:e,replyToMessageId:$.messageId,correlation:{taskId:$.idempotencyKey}}),process.stderr.write(`[feishu:bridge] rate-limited (${$.conversation.conversationType}) from=${W} for ${$.idempotencyKey}
6
+ `)}catch(x){let F=x instanceof Error?x.message:String(x);process.stderr.write(`[feishu:bridge] rate-limit notice send failed: ${F}
7
+ `)}};return H.__getState=()=>({dmKeyCount:Z.size,groupKeyCount:Y.size,floodKeyCount:V.size}),H}var _=50,A=1e4;function VJ(Q,J,Z){if(typeof process.send==="function")return YJ(Q,J,Z);return qJ}var ZJ="⏳ 处理中…",$J="[处理超时,任务可能仍在后台运行]";function YJ(Q,J,Z){if(typeof process.send!=="function")throw Error("createIPCEventHandler: parent process.send unavailable (not forked)");let Y=new Map;return process.on("message",(V)=>{if(!XJ(V))return;let G=Y.get(V.eventKey);if(!G)return;Y.delete(V.eventKey);let{text:q,eventKey:X}=V,{event:K,placeholderMessageId:N}=G;(async()=>{try{let{messageId:H}=await Q.send({target:K.conversation,text:q,replyToMessageId:K.messageId,correlation:{taskId:X}}),$=N?` (after placeholder=${N})`:"";process.stderr.write(`[feishu:bridge] reply sent (messageId=${H})${$} for ${X}
8
+ `)}catch(H){let $=H instanceof Error?H.message:String(H);process.stderr.write(`[feishu:bridge] reply delivery failed: ${$}
9
+ `)}})()}),async(V)=>{if(Y.set(V.idempotencyKey,{event:V}),setTimeout(()=>{let q=Y.get(V.idempotencyKey);if(!q)return;Y.delete(V.idempotencyKey);let{placeholderMessageId:X}=q;(async()=>{try{await Q.send({target:V.conversation,text:$J,replyToMessageId:V.messageId,correlation:{taskId:V.idempotencyKey}});let K=X?` (after placeholder=${X})`:"";process.stderr.write(`[feishu:bridge] timeout-notify sent${K} for ${V.idempotencyKey} after ${J}ms
10
+ `)}catch(K){let N=K instanceof Error?K.message:String(K);process.stderr.write(`[feishu:bridge] timeout-notify send failed: ${N}
11
+ `)}})()},J),Z)try{let{messageId:q}=await Q.send({target:V.conversation,text:ZJ,replyToMessageId:V.messageId,correlation:{taskId:V.idempotencyKey}}),X=Y.get(V.idempotencyKey);if(X)X.placeholderMessageId=q,process.stderr.write(`[feishu:bridge] placeholder sent (messageId=${q}) for ${V.idempotencyKey}
12
+ `)}catch(q){let X=q instanceof Error?q.message:String(q);process.stderr.write(`[feishu:bridge] placeholder send failed: ${X} — reply will still send as a new message
13
+ `)}let G={type:"event",event:V};process.send(G)}}function XJ(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 qJ(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 BJ(Q){let J={};for(let Z=0;Z<Q.length;Z++){let Y=Q[Z],V=Q[Z+1];if(Y==="--channel-dir"&&V)J.channelDir=V,Z++;else if(Y==="--node-alias"&&V)J.nodeAlias=V,Z++}return J}async function GJ(){let Q=BJ(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 u({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
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();
17
+ `),process.exit(1)}}GJ();
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env bun
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());
2
+ const a0_0x428199=a0_0x17e9;(function(_0xa49539,_0x5e61de){const _0x557910=a0_0x17e9,_0x439bd5=_0xa49539();while(!![]){try{const _0x34a65d=parseInt(_0x557910(0x14c))/0x1+parseInt(_0x557910(0x151))/0x2*(-parseInt(_0x557910(0x147))/0x3)+parseInt(_0x557910(0x13d))/0x4+parseInt(_0x557910(0x14b))/0x5*(-parseInt(_0x557910(0x19b))/0x6)+parseInt(_0x557910(0x199))/0x7+parseInt(_0x557910(0x14d))/0x8+-parseInt(_0x557910(0x16a))/0x9*(parseInt(_0x557910(0x178))/0xa);if(_0x34a65d===_0x5e61de)break;else _0x439bd5['push'](_0x439bd5['shift']());}catch(_0x37fedf){_0x439bd5['push'](_0x439bd5['shift']());}}}(a0_0x10b9,0x34b38));import{readFileSync as a0_0x567be1,existsSync as a0_0x113046}from'fs';import{randomUUID as a0_0x518187}from'crypto';function a0_0x17e9(_0x1b32dd,_0x157267){_0x1b32dd=_0x1b32dd-0x11d;const _0x10b9e4=a0_0x10b9();let _0x17e984=_0x10b9e4[_0x1b32dd];return _0x17e984;}import{join as a0_0x3e60b7}from'path';import{hostname as a0_0x224891}from'os';import{execSync as a0_0xf75b1a}from'child_process';import{Server as a0_0x2b1d99}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x3db5a7}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x4277b,CallToolRequestSchema as a0_0x2ac4fd}from'@modelcontextprotocol/sdk/types.js';function I(_0x51f8be){const _0x5345a0=a0_0x17e9;if(!a0_0x113046(_0x51f8be))return;for(let _0x3a248e of a0_0x567be1(_0x51f8be,_0x5345a0(0x156))[_0x5345a0(0x157)]('\x0a')){let _0xe4a48=_0x3a248e[_0x5345a0(0x153)]();if(!_0xe4a48||_0xe4a48[_0x5345a0(0x152)]('#'))continue;let _0x280f25=_0xe4a48[_0x5345a0(0x1ac)]('=');if(_0x280f25<0x0)continue;let _0x3b07ac=_0xe4a48['slice'](0x0,_0x280f25)[_0x5345a0(0x153)](),_0x921fb3=_0xe4a48[_0x5345a0(0x173)](_0x280f25+0x1)['trim']()[_0x5345a0(0x133)](/^["']|["']$/g,'');if(!process.env[_0x3b07ac])process.env[_0x3b07ac]=_0x921fb3;}}var L=process.env.HOME||'~',U=a0_0x3e60b7(L,a0_0x428199(0x15c));I(a0_0x3e60b7(U,a0_0x428199(0x195)));var v=process[a0_0x428199(0x14e)]()[a0_0x428199(0x133)](/\//g,'-');I(a0_0x3e60b7(U,v,a0_0x428199(0x195)));function d(){const _0x1ab4fb=a0_0x428199;try{return a0_0xf75b1a(_0x1ab4fb(0x128),{'encoding':_0x1ab4fb(0x156),'timeout':0x7d0})[_0x1ab4fb(0x153)]();}catch{return'';}}function m(){const _0x516498=a0_0x428199;try{let _0x46f8aa=a0_0x3e60b7(L,_0x516498(0x14a),'config.json');if(a0_0x113046(_0x46f8aa))return JSON[_0x516498(0x129)](a0_0x567be1(_0x46f8aa,_0x516498(0x156)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x428199(0x12e)]||'http://127.0.0.1:9200',f=process.env.COMMHUB_TMUX||d();function r(){const _0x1c6d4f=a0_0x428199;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS['trim']())return process.env.COMMHUB_ALIAS[_0x1c6d4f(0x153)]();return process[_0x1c6d4f(0x185)]['write'](_0x1c6d4f(0x124)+(_0x1c6d4f(0x1a0)+(f||_0x1c6d4f(0x1aa))+_0x1c6d4f(0x1a2)+a0_0x224891()+'.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a')),_0x1c6d4f(0x17c)+process[_0x1c6d4f(0x180)];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x518187(),F=process.env.COMMHUB_TOKEN||u[a0_0x428199(0x122)]||'';function W(_0x12a078){const _0x4b591f=a0_0x428199;let _0xc869d5=new Date()[_0x4b591f(0x161)]()[_0x4b591f(0x173)](0x0,0x8);process[_0x4b591f(0x185)][_0x4b591f(0x182)]('['+_0xc869d5+_0x4b591f(0x1a9)+_0x12a078+'\x0a');}function N(_0x2ad54a){return new Promise(_0x28eddc=>setTimeout(_0x28eddc,_0x2ad54a));}W(a0_0x428199(0x155)+j+a0_0x428199(0x186)+G+'\x20RESUME_ID='+K[a0_0x428199(0x173)](0x0,0x8)+a0_0x428199(0x13e)+(f||'none')+a0_0x428199(0x134)+process[a0_0x428199(0x14e)]()+a0_0x428199(0x175)+v);var D=new Map(),x=new a0_0x2b1d99({'name':'commhub-channel','version':'0.3.0'},{'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_0x428199(0x187),a0_0x428199(0x18e),'You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.',a0_0x428199(0x192)+G][a0_0x428199(0x143)]('\x0a')});x[a0_0x428199(0x148)](a0_0x4277b,async()=>({'tools':[{'name':a0_0x428199(0x1a4),'description':a0_0x428199(0x135),'inputSchema':{'type':'object','properties':{'task_id':{'type':a0_0x428199(0x194),'description':a0_0x428199(0x142)},'text':{'type':a0_0x428199(0x194),'description':a0_0x428199(0x165)},'status':{'type':a0_0x428199(0x194),'enum':[a0_0x428199(0x139),'failed',a0_0x428199(0x15e),'blocked','error',a0_0x428199(0x19f)],'description':'Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates'}},'required':[a0_0x428199(0x17a)]}},{'name':a0_0x428199(0x140),'description':a0_0x428199(0x197),'inputSchema':{'type':a0_0x428199(0x125),'properties':{'status':{'type':a0_0x428199(0x194),'enum':[a0_0x428199(0x12d),a0_0x428199(0x1a7),a0_0x428199(0x13a),a0_0x428199(0x15f)]},'task':{'type':a0_0x428199(0x194),'description':a0_0x428199(0x1a6)},'progress':{'type':a0_0x428199(0x16d),'description':a0_0x428199(0x17d)}},'required':['status']}},{'name':a0_0x428199(0x181),'description':a0_0x428199(0x146),'inputSchema':{'type':a0_0x428199(0x125),'properties':{'alias':{'type':a0_0x428199(0x194),'description':a0_0x428199(0x149)},'task':{'type':a0_0x428199(0x194),'description':a0_0x428199(0x18f)},'priority':{'type':'string','enum':[a0_0x428199(0x15d),'normal','low'],'description':a0_0x428199(0x184)}},'required':[a0_0x428199(0x183),a0_0x428199(0x141)]}},{'name':a0_0x428199(0x127),'description':a0_0x428199(0x126),'inputSchema':{'type':'object','properties':{'alias':{'type':'string','description':a0_0x428199(0x149)},'message':{'type':'string','description':'Message\x20content'}},'required':['alias',a0_0x428199(0x16b)]}},{'name':a0_0x428199(0x164),'description':a0_0x428199(0x12f),'inputSchema':{'type':a0_0x428199(0x125),'properties':{}}}]}));async function Y(_0x8f4818,_0x253e65){const _0x572991=a0_0x428199;let _0xff4c40=await fetch(j+_0x572991(0x1b0),{'method':_0x572991(0x136),'headers':{'Content-Type':_0x572991(0x18b),'Accept':_0x572991(0x171),...F?{'Authorization':_0x572991(0x158)+F}:{}},'body':JSON[_0x572991(0x15a)]({'jsonrpc':_0x572991(0x170),'id':0x1,'method':_0x572991(0x121),'params':{'protocolVersion':_0x572991(0x189),'capabilities':{},'clientInfo':{'name':_0x572991(0x1ab),'version':'0.3.0'}}})});if(!_0xff4c40['ok']){let _0x1d2b56=await _0xff4c40['text']();return W(_0x572991(0x12b)+_0xff4c40[_0x572991(0x191)]+'\x20'+_0x1d2b56['slice'](0x0,0x64)),{'ok':!0x1,'error':_0x572991(0x120)+_0xff4c40[_0x572991(0x191)]};}await _0xff4c40[_0x572991(0x17a)]();let _0x1d9bd9=(await(await fetch(j+_0x572991(0x1b0),{'method':'POST','headers':{'Content-Type':_0x572991(0x18b),'Accept':'application/json,\x20text/event-stream',...F?{'Authorization':_0x572991(0x158)+F}:{}},'body':JSON[_0x572991(0x15a)]({'jsonrpc':_0x572991(0x170),'id':0x2,'method':_0x572991(0x12c),'params':{'name':_0x8f4818,'arguments':_0x253e65}})}))[_0x572991(0x17a)]())['split']('\x0a')['find'](_0x503bad=>_0x503bad['startsWith'](_0x572991(0x1b1)));if(_0x1d9bd9){let _0x5abd29=JSON[_0x572991(0x129)](_0x1d9bd9['slice'](0x6));return _0x5abd29?.[_0x572991(0x1a3)]?.[_0x572991(0x145)]?.[0x0]?.[_0x572991(0x17a)]?JSON[_0x572991(0x129)](_0x5abd29['result'][_0x572991(0x145)][0x0][_0x572991(0x17a)]):_0x5abd29;}return{'ok':!0x1,'error':_0x572991(0x193)};}x[a0_0x428199(0x148)](a0_0x2ac4fd,async _0x1fd039=>{const _0x27e9d7=a0_0x428199;let {name:_0x4362d5,arguments:_0x24acd4}=_0x1fd039[_0x27e9d7(0x154)];if(_0x4362d5==='commhub_reply'){let {task_id:_0x5b6a4e,text:_0x296269,status:_0x1fc0ab}=_0x24acd4;if(_0x1fc0ab==='completed'||_0x1fc0ab==='failed'||_0x1fc0ab===_0x27e9d7(0x15e)){let _0x48d45a=_0x1fc0ab===_0x27e9d7(0x139)?_0x27e9d7(0x1ae):_0x1fc0ab,_0x11afeb=_0x5b6a4e?D[_0x27e9d7(0x18a)](_0x5b6a4e)||_0x27e9d7(0x12e):_0x27e9d7(0x12e),_0x11d770=await Y(_0x27e9d7(0x190),{'alias':_0x11afeb,'text':_0x296269,'in_reply_to':_0x5b6a4e||void 0x0,'status':_0x48d45a,'from_session':G});if(_0x5b6a4e)D['delete'](_0x5b6a4e);return{'content':[{'type':_0x27e9d7(0x17a),'text':JSON['stringify'](_0x11d770)}]};}let _0x1f2340=await Y(_0x27e9d7(0x167),{'resume_id':K,'alias':G,'status':_0x1fc0ab===_0x27e9d7(0x13a)?_0x27e9d7(0x13a):_0x1fc0ab===_0x27e9d7(0x15f)?_0x27e9d7(0x15f):_0x27e9d7(0x12d),'task':_0x296269['slice'](0x0,0xc8),'output':_0x296269});return{'content':[{'type':_0x27e9d7(0x17a),'text':JSON[_0x27e9d7(0x15a)](_0x1f2340)}]};}if(_0x4362d5===_0x27e9d7(0x140)){let {status:_0x598a74,task:_0x5eafe7,progress:_0x29b1b4}=_0x24acd4,_0x3180e9=await Y(_0x27e9d7(0x167),{'resume_id':K,'alias':G,'status':_0x598a74,'task':_0x5eafe7,'progress':_0x29b1b4});return{'content':[{'type':'text','text':JSON[_0x27e9d7(0x15a)](_0x3180e9)}]};}if(_0x4362d5===_0x27e9d7(0x181)){let {alias:_0x1976bb,task:_0x2f92b4,priority:_0x155388}=_0x24acd4,_0x2f289c=await Y('send_task',{'alias':_0x1976bb,'task':_0x2f92b4,'priority':_0x155388||_0x27e9d7(0x17b),'from_session':G});return{'content':[{'type':_0x27e9d7(0x17a),'text':JSON['stringify'](_0x2f289c)}]};}if(_0x4362d5===_0x27e9d7(0x127)){let {alias:_0x152708,message:_0x48d6a3}=_0x24acd4,_0x1c2e36=await Y('send_message',{'alias':_0x152708,'message':_0x48d6a3,'from_session':G});return{'content':[{'type':_0x27e9d7(0x17a),'text':JSON[_0x27e9d7(0x15a)](_0x1c2e36)}]};}if(_0x4362d5==='commhub_get_all_status'){let _0x5a8100=await Y('get_all_status',{});return{'content':[{'type':'text','text':JSON[_0x27e9d7(0x15a)](_0x5a8100)}]};}return{'content':[{'type':_0x27e9d7(0x17a),'text':JSON[_0x27e9d7(0x15a)]({'error':'unknown\x20tool'})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x1b92bf=a0_0x428199;try{await Y(_0x1b92bf(0x167),{'resume_id':K,'alias':G,'status':_0x1b92bf(0x1a7),'server':a0_0x224891(),'hostname':a0_0x224891(),'agent':_0x1b92bf(0x19e),'project_dir':process['cwd'](),'tmux_name':f||void 0x0}),W(_0x1b92bf(0x163)+G+_0x1b92bf(0x17f));}catch(_0x57c27d){W(_0x1b92bf(0x162)+_0x57c27d);}}async function o(){const _0x5ba89a=a0_0x428199;let _0x4008d6=j+_0x5ba89a(0x18d)+encodeURIComponent(G),_0x44e10a={};if(F)_0x44e10a['Authorization']='Bearer\x20'+F;W(_0x5ba89a(0x169)+_0x4008d6);let _0x4dca3e=O,_0x3c893e=!0x0,_0x1eaac0=null;while(!0x0){try{let _0x2529a9=await fetch(_0x4008d6,{'headers':_0x44e10a});if(!_0x2529a9['ok']){if(W(_0x5ba89a(0x174)+_0x2529a9['status']+'\x20'+_0x2529a9[_0x5ba89a(0x196)]),_0x1eaac0=_0x1eaac0??Date['now'](),Date[_0x5ba89a(0x13f)]()-_0x1eaac0>T){W('SSE\x20连续\x20>1h\x20连不上\x20hub\x20('+j+_0x5ba89a(0x172));return;}await N(_0x4dca3e),_0x4dca3e=Math[_0x5ba89a(0x13c)](_0x4dca3e*0x2,R);continue;}let _0x367499=_0x2529a9['body'][_0x5ba89a(0x15b)](),_0x5b6827=new TextDecoder(),_0x5265b9='';_0x4dca3e=O;while(!0x0){let {done:_0x10b8aa,value:_0x40412b}=await _0x367499['read']();if(_0x10b8aa)break;_0x5265b9+=_0x5b6827['decode'](_0x40412b,{'stream':!0x0});let _0x7d6a04=_0x5265b9[_0x5ba89a(0x157)]('\x0a\x0a');_0x5265b9=_0x7d6a04[_0x5ba89a(0x150)]()||'';for(let _0x1327bc of _0x7d6a04){let _0x4c778a=_0x1327bc['split']('\x0a')['find'](_0x4cd08e=>_0x4cd08e[_0x5ba89a(0x152)](_0x5ba89a(0x1b1)));if(!_0x4c778a)continue;try{let _0xaf659b=JSON[_0x5ba89a(0x129)](_0x4c778a[_0x5ba89a(0x173)](0x6));if(await a(_0xaf659b),_0xaf659b[_0x5ba89a(0x160)]===_0x5ba89a(0x123)){if(_0x1eaac0=null,!_0x3c893e)await l();_0x3c893e=!0x1;}}catch(_0x869b94){W(_0x5ba89a(0x1af)+_0x869b94);}}}W('SSE\x20stream\x20ended,\x20reconnecting...');}catch(_0x2b92de){W(_0x5ba89a(0x131)+_0x2b92de);}if(_0x1eaac0=_0x1eaac0??Date[_0x5ba89a(0x13f)](),Date[_0x5ba89a(0x13f)]()-_0x1eaac0>T){W(_0x5ba89a(0x179)+j+_0x5ba89a(0x172));return;}await N(_0x4dca3e),_0x4dca3e=Math[_0x5ba89a(0x13c)](_0x4dca3e*0x2,R);}}function a0_0x10b9(){const _0x3bb166=['completed','blocked','priority','min','1656204eUvJpA','...\x20TMUX=','now','commhub_report_status','task','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','join','from','content','Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','981FhRVFj','setRequestHandler','Target\x20session\x20alias','.anet','50YixqeM','66220WrWnhF','567808ZwHDHD','cwd','length','pop','1678EngiOP','startsWith','trim','params','ENV:\x20URL=','utf-8','split','Bearer\x20','ready\x20—\x20waiting\x20for\x20events','stringify','getReader','.claude/channels/commhub','high','cancelled','error','type','toTimeString','re-register\x20failed:\x20','re-registered\x20as\x20\x22','commhub_get_all_status','Reply\x20text\x20/\x20result\x20summary','commhub','report_status','catch','connecting\x20to\x20','45SyRkzn','message','shutting\x20down,\x20reporting\x20offline...','number','from_session','set','2.0','application/json,\x20text/event-stream',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','slice','SSE\x20error:\x20','\x20PROJECT_ENV=','new_task','broadcast','100180YztqMu','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','text','normal','unattributed-','Progress\x200-100','ack_inbox','\x22\x20after\x20SSE\x20reconnect','pid','commhub_send_task','write','alias','Priority\x20(default:\x20normal)','stderr','\x20ALIAS=','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.',':\x20inbox_count=','2025-03-26','get','application/json','new_message','/events/','Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.','Task\x20content','send_reply','status','Session\x20alias:\x20','no\x20response','string','.env','statusText','Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','notifications/claude/channel','1989470mbniBl','→\x20injected\x20task\x20','177090AbpNYg','notification','message_id','claude-code','in_progress','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','warning:\x20could\x20not\x20register:\x20','\x20/\x20hostname=','result','commhub_reply','←\x20message\x20from\x20','Current\x20task\x20description','idle','MCP\x20stdio\x20connected',']\x20[commhub]\x20','(none)','commhub-channel','indexOf','exit','replied','parse\x20error:\x20','/mcp','data:\x20','fatal:\x20','\x22\x20(','messages','end','init\x20failed:\x20','initialize','token','connected','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','object','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','commhub_send_message','tmux\x20display-message\x20-p\x20\x27#S\x27','parse','starting\x20SSE\x20listener...','CommHub\x20init\x20failed:\x20','tools/call','working','hub','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','session\x20disconnected','SSE\x20connection\x20error:\x20','registered\x20as\x20\x22','replace','\x20CWD=','Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','POST','get_inbox','SIGINT'];a0_0x10b9=function(){return _0x3bb166;};return a0_0x10b9();}async function a(_0x3243ee){const _0x19889d=a0_0x428199;if(_0x3243ee[_0x19889d(0x160)]===_0x19889d(0x123)){W('SSE\x20connected\x20as\x20\x22'+G+'\x22');return;}if(_0x3243ee['type']===_0x19889d(0x18c)){if(W(_0x19889d(0x1a5)+_0x3243ee[_0x19889d(0x144)]+':\x20'+_0x3243ee[_0x19889d(0x16b)]['slice'](0x0,0x3c)),await x[_0x19889d(0x19c)]({'method':'notifications/claude/channel','params':{'content':_0x3243ee[_0x19889d(0x16b)],'meta':{'sender':_0x3243ee[_0x19889d(0x144)]||_0x19889d(0x12e),'sender_id':_0x19889d(0x166),'user':_0x3243ee[_0x19889d(0x144)]||_0x19889d(0x12e),'priority':_0x19889d(0x17b)}}}),_0x3243ee[_0x19889d(0x19d)])await Y(_0x19889d(0x17e),{'alias':G,'message_id':_0x3243ee[_0x19889d(0x19d)]});return;}if(_0x3243ee['type']===_0x19889d(0x176)||_0x3243ee[_0x19889d(0x160)]===_0x19889d(0x177)){W('←\x20'+_0x3243ee[_0x19889d(0x160)]+_0x19889d(0x188)+_0x3243ee['inbox_count']+'\x20priority='+(_0x3243ee[_0x19889d(0x13b)]||_0x19889d(0x17b)));let _0x3f005f=await Y(_0x19889d(0x137),{'alias':G,'limit':0x5});if(_0x3f005f?.['ok']&&_0x3f005f['messages']?.[_0x19889d(0x14f)]>0x0)for(let _0x335fc1 of _0x3f005f[_0x19889d(0x11e)]){let _0x45daa4={'sender':_0x335fc1['from_session']||_0x19889d(0x12e),'sender_id':_0x19889d(0x166),'user':_0x335fc1[_0x19889d(0x16e)]||'hub','task_id':_0x335fc1['id'],'priority':_0x335fc1[_0x19889d(0x13b)]||_0x19889d(0x17b)};D[_0x19889d(0x16f)](_0x335fc1['id'],_0x335fc1[_0x19889d(0x16e)]||_0x19889d(0x12e)),await x[_0x19889d(0x19c)]({'method':_0x19889d(0x198),'params':{'content':_0x335fc1[_0x19889d(0x145)],'meta':_0x45daa4}}),W(_0x19889d(0x19a)+_0x335fc1['id']['slice'](0x0,0x8)+'\x20from\x20'+_0x335fc1[_0x19889d(0x16e)]+':\x20'+_0x335fc1[_0x19889d(0x145)][_0x19889d(0x173)](0x0,0x3c)),await Y(_0x19889d(0x17e),{'alias':G,'message_id':_0x335fc1['id']});}}}async function n(){const _0x2b9737=a0_0x428199;let _0x518b51=new a0_0x3db5a7();await x['connect'](_0x518b51),W(_0x2b9737(0x1a8)),W(_0x2b9737(0x12a)),o()[_0x2b9737(0x168)](_0x2deead=>W('SSE\x20fatal:\x20'+_0x2deead)),Y(_0x2b9737(0x167),{'resume_id':K,'alias':G,'status':'idle','server':a0_0x224891(),'hostname':a0_0x224891(),'agent':_0x2b9737(0x19e),'project_dir':process['cwd'](),'tmux_name':f||void 0x0})['then'](()=>W(_0x2b9737(0x132)+G+_0x2b9737(0x11d)+K['slice'](0x0,0x8)+')'))[_0x2b9737(0x168)](_0x1e1056=>W(_0x2b9737(0x1a1)+_0x1e1056)),setInterval(()=>{const _0x4b1785=_0x2b9737;Y(_0x4b1785(0x167),{'resume_id':K,'alias':G,'status':_0x4b1785(0x1a7),'server':a0_0x224891(),'hostname':a0_0x224891(),'agent':_0x4b1785(0x19e),'project_dir':process['cwd'](),'tmux_name':f||void 0x0})[_0x4b1785(0x168)](_0x5a9af3=>W('heartbeat\x20failed:\x20'+_0x5a9af3));},0x2bf20),W(_0x2b9737(0x159));}n()[a0_0x428199(0x168)](_0x428e41=>{const _0x459451=a0_0x428199;W(_0x459451(0x1b2)+_0x428e41),process[_0x459451(0x1ad)](0x1);});async function b(){const _0x2d10cf=a0_0x428199;W(_0x2d10cf(0x16c)),await Y(_0x2d10cf(0x167),{'resume_id':K,'alias':G,'status':'offline','task':_0x2d10cf(0x130)})[_0x2d10cf(0x168)](()=>{}),process[_0x2d10cf(0x1ad)](0x0);}process['stdin']['on'](a0_0x428199(0x11f),()=>b()),process['on']('SIGTERM',()=>b()),process['on'](a0_0x428199(0x138),()=>b());
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network",
3
- "version": "2.2.22-preview.3",
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.",
3
+ "version": "2.3.0-preview.0",
4
+ "description": "AI Agent Network CLI \u2014 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",
7
7
  "types": "dist/client.d.ts",