@sleep2agi/agent-network 2.3.0-preview.2 → 2.3.0-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
- const a0_0x238205=a0_0x2b7c;function a0_0x2b7c(_0x175c5d,_0x2926b1){_0x175c5d=_0x175c5d-0x85;const _0x23a12f=a0_0x23a1();let _0x2b7c69=_0x23a12f[_0x175c5d];return _0x2b7c69;}(function(_0xb48d31,_0x3723fb){const _0x480c8f=a0_0x2b7c,_0x326564=_0xb48d31();while(!![]){try{const _0x381c99=-parseInt(_0x480c8f(0x9e))/0x1+parseInt(_0x480c8f(0xc3))/0x2+-parseInt(_0x480c8f(0x94))/0x3+-parseInt(_0x480c8f(0xa3))/0x4+-parseInt(_0x480c8f(0xab))/0x5+-parseInt(_0x480c8f(0xd4))/0x6*(parseInt(_0x480c8f(0xcb))/0x7)+parseInt(_0x480c8f(0xcf))/0x8;if(_0x381c99===_0x3723fb)break;else _0x326564['push'](_0x326564['shift']());}catch(_0x27405c){_0x326564['push'](_0x326564['shift']());}}}(a0_0x23a1,0x8127b));import{EventEmitter as a0_0x215187}from'events';import{hostname as a0_0x57b3e8}from'os';class T extends a0_0x215187{[a0_0x238205(0xad)];[a0_0x238205(0xb4)];[a0_0x238205(0xc0)];['agent'];[a0_0x238205(0xd2)];[a0_0x238205(0xae)];[a0_0x238205(0x99)];[a0_0x238205(0x9f)];[a0_0x238205(0xaf)];[a0_0x238205(0xd3)]=!0x1;constructor(_0x385ded){const _0x35e6f0=a0_0x238205;super();if(this[_0x35e6f0(0xad)]=_0x385ded['url'][_0x35e6f0(0xc5)](/\/$/,''),this['alias']=_0x385ded[_0x35e6f0(0xb4)],this[_0x35e6f0(0xc0)]=_0x385ded[_0x35e6f0(0xc0)],this[_0x35e6f0(0xb8)]=_0x385ded[_0x35e6f0(0xb8)]||'sdk',this[_0x35e6f0(0xd2)]=_0x35e6f0(0x92)+_0x385ded[_0x35e6f0(0xb4)]+'-'+Date[_0x35e6f0(0xb1)]()['toString'](0x24),this['heartbeatInterval']=_0x385ded[_0x35e6f0(0xae)]??0x2bf20,this[_0x35e6f0(0x99)]=_0x385ded[_0x35e6f0(0x99)]??0xbb8,_0x385ded['autoConnect']!==!0x1)this[_0x35e6f0(0xa2)]();}[a0_0x238205(0xac)](_0x4840fe){const _0x52658d=a0_0x238205;console['log']('['+new Date()[_0x52658d(0xa5)]()[_0x52658d(0xaa)](0x0,0x8)+_0x52658d(0x91)+this[_0x52658d(0xb4)]+']\x20'+_0x4840fe);}async[a0_0x238205(0x96)](_0x517436,_0x2a96c8){const _0x1d3e28=a0_0x238205;let _0x38450b={'Content-Type':_0x1d3e28(0xbf),'Accept':_0x1d3e28(0xa8)};if(this[_0x1d3e28(0xc0)])_0x38450b[_0x1d3e28(0x93)]=_0x1d3e28(0xbe)+this[_0x1d3e28(0xc0)];let _0x3cecd1=await(await fetch(this[_0x1d3e28(0xad)]+_0x1d3e28(0x8a),{'method':_0x1d3e28(0x8c),'headers':_0x38450b,'body':JSON[_0x1d3e28(0xd8)]({'jsonrpc':'2.0','id':Date['now'](),'method':_0x1d3e28(0xc7),'params':{'name':_0x517436,'arguments':_0x2a96c8}})}))[_0x1d3e28(0xa0)](),_0x431d3c=_0x3cecd1['match'](/data: (.+)/),_0x3783ee=_0x431d3c?JSON[_0x1d3e28(0xcc)](_0x431d3c[0x1]):JSON[_0x1d3e28(0xcc)](_0x3cecd1),_0xcfafca=_0x3783ee?.['result']?.[_0x1d3e28(0xbc)]?.[0x0]?.[_0x1d3e28(0xa0)];return _0xcfafca?JSON[_0x1d3e28(0xcc)](_0xcfafca):_0x3783ee;}async[a0_0x238205(0xa2)](){const _0x1bc965=a0_0x238205;if(this[_0x1bc965(0xd3)])return;this[_0x1bc965(0xd3)]=!0x0,await this[_0x1bc965(0xa1)](_0x1bc965(0xa6)),this[_0x1bc965(0xac)](_0x1bc965(0xd7)),this['heartbeatTimer']=setInterval(()=>{const _0x1760d2=_0x1bc965;this['status'](_0x1760d2(0xa6))[_0x1760d2(0xb2)](_0x44a3b6=>this[_0x1760d2(0xac)](_0x1760d2(0xd1)+_0x44a3b6['message']));},this[_0x1bc965(0xae)]),this[_0x1bc965(0xc9)]();}async[a0_0x238205(0x8e)](){const _0x51fa1c=a0_0x238205;if(this[_0x51fa1c(0xd3)]=!0x1,this['sseAbort']?.[_0x51fa1c(0xb7)](),this['heartbeatTimer'])clearInterval(this[_0x51fa1c(0x9f)]);await this[_0x51fa1c(0xa1)]('offline')[_0x51fa1c(0xb2)](()=>{}),this[_0x51fa1c(0xac)]('disconnected');}async[a0_0x238205(0x86)](_0x372dfe,_0x44cc24,_0x22957a='normal'){const _0x29c4b8=a0_0x238205;return this[_0x29c4b8(0x96)](_0x29c4b8(0x8b),{'alias':_0x372dfe,'task':_0x44cc24,'priority':_0x22957a,'from_session':this['alias']});}async['message'](_0x989e93,_0x493467){const _0x12fe94=a0_0x238205;return this[_0x12fe94(0x96)](_0x12fe94(0xd6),{'alias':_0x989e93,'message':_0x493467,'from_session':this['alias']});}async[a0_0x238205(0xa9)](_0x42872c,_0x35fb9b,_0x2c4a30=a0_0x238205(0xca)){const _0x2b0c57=a0_0x238205;return this['call'](_0x2b0c57(0xba),{'in_reply_to':_0x42872c,'text':_0x35fb9b,'status':_0x2c4a30});}async[a0_0x238205(0xa1)](_0x3a3f60,_0x2e5e21){const _0x4098ec=a0_0x238205;return this[_0x4098ec(0x96)](_0x4098ec(0xcd),{'resume_id':this[_0x4098ec(0xd2)],'alias':this[_0x4098ec(0xb4)],'status':_0x3a3f60,'server':a0_0x57b3e8(),'hostname':a0_0x57b3e8(),'agent':this[_0x4098ec(0xb8)],'project_dir':process['cwd'](),..._0x2e5e21});}async[a0_0x238205(0x89)](){return this['call']('get_all_status',{});}async[a0_0x238205(0x87)](_0x275aea,_0x5a5e2f){const _0x3ed4fc=a0_0x238205;return this[_0x3ed4fc(0x96)](_0x3ed4fc(0x87),{'message':_0x275aea,'filter_server':_0x5a5e2f?.[_0x3ed4fc(0xd9)],'filter_status':_0x5a5e2f?.[_0x3ed4fc(0xa1)]});}async['connectSSE'](){const _0x12de34=a0_0x238205;let _0x2fe4c8=encodeURIComponent(this['alias']),_0x3a9f03=this[_0x12de34(0xad)]+_0x12de34(0xb0)+_0x2fe4c8,_0x1aecc9=this[_0x12de34(0x99)];while(this[_0x12de34(0xd3)]){try{this[_0x12de34(0xaf)]=new AbortController();let _0x2cddf1={'Accept':_0x12de34(0x9d)};if(this[_0x12de34(0xc0)])_0x2cddf1[_0x12de34(0x93)]=_0x12de34(0xbe)+this[_0x12de34(0xc0)];let _0x33eda3=await fetch(_0x3a9f03,{'headers':_0x2cddf1,'signal':this[_0x12de34(0xaf)]['signal']});if(!_0x33eda3['ok']||!_0x33eda3['body']){this[_0x12de34(0xac)]('SSE\x20failed:\x20'+_0x33eda3[_0x12de34(0xa1)]),await this[_0x12de34(0xb3)](_0x1aecc9),_0x1aecc9=Math['min'](_0x1aecc9*1.5,0xea60);continue;}_0x1aecc9=this[_0x12de34(0x99)];let _0x341aac=_0x33eda3['body'][_0x12de34(0x8f)](),_0x35cc8e=new TextDecoder(),_0x4b108b='';while(this['running']){let {done:_0x24050f,value:_0x1bfb06}=await _0x341aac[_0x12de34(0x88)]();if(_0x24050f)break;_0x4b108b+=_0x35cc8e[_0x12de34(0x85)](_0x1bfb06,{'stream':!0x0});let _0x5e200b=_0x4b108b[_0x12de34(0x8d)]('\x0a');_0x4b108b=_0x5e200b[_0x12de34(0x9b)]()||'';for(let _0x384271 of _0x5e200b){if(!_0x384271[_0x12de34(0xb5)](_0x12de34(0xc1)))continue;try{let _0x3a961e=JSON[_0x12de34(0xcc)](_0x384271[_0x12de34(0xaa)](0x6));if(_0x3a961e[_0x12de34(0x95)]===_0x12de34(0x9a)){this[_0x12de34(0xac)]('SSE\x20connected'),this[_0x12de34(0x98)]('connected');continue;}if(_0x3a961e['type']===_0x12de34(0xa4)||_0x3a961e[_0x12de34(0x95)]===_0x12de34(0xce)||_0x3a961e[_0x12de34(0x95)]===_0x12de34(0x87))await this['processInbox']();}catch{}}}}catch(_0x571d98){if(_0x571d98[_0x12de34(0xa7)]===_0x12de34(0xc2))break;this[_0x12de34(0x98)](_0x12de34(0xbb),_0x571d98),this[_0x12de34(0xac)](_0x12de34(0xb9)+_0x571d98[_0x12de34(0x9c)]);}if(this[_0x12de34(0xd3)])this['emit'](_0x12de34(0xbd)),this[_0x12de34(0xac)]('SSE\x20reconnecting\x20in\x20'+_0x1aecc9/0x3e8+_0x12de34(0xc6)),await this[_0x12de34(0xb3)](_0x1aecc9),_0x1aecc9=Math[_0x12de34(0xb6)](_0x1aecc9*1.5,0xea60);}}async['processInbox'](){const _0x17178b=a0_0x238205;try{let _0x48b1bc=(await this[_0x17178b(0x96)](_0x17178b(0xd0),{'alias':this[_0x17178b(0xb4)],'limit':0xa}))?.[_0x17178b(0x90)]||[];for(let _0x34f496 of _0x48b1bc)await this['call'](_0x17178b(0xc8),{'alias':this[_0x17178b(0xb4)],'message_id':_0x34f496['id']}),this['log']('←\x20'+_0x34f496[_0x17178b(0xd5)]+':\x20'+_0x34f496[_0x17178b(0xbc)][_0x17178b(0xaa)](0x0,0x3c)),this[_0x17178b(0x98)](_0x17178b(0x97),_0x34f496),this[_0x17178b(0x98)]('message',_0x34f496);}catch(_0x7e4517){this['log'](_0x17178b(0xc4)+_0x7e4517['message']);}}[a0_0x238205(0xb3)](_0x53c25e){return new Promise(_0xb360dd=>setTimeout(_0xb360dd,_0x53c25e));}}var $=T;function a0_0x23a1(){const _0x5453aa=['data:\x20','AbortError','299620tuVXUi','inbox\x20error:\x20','replace','s...','tools/call','ack_inbox','connectSSE','completed','13237xRPZks','parse','report_status','new_message','27442120rKbIIY','get_inbox','heartbeat\x20failed:\x20','resumeId','running','1614SnCWod','from_session','send_message','registered','stringify','server','decode','send','broadcast','read','getAllStatus','/mcp','send_task','POST','split','disconnect','getReader','messages',']\x20[commhub:','sdk-','Authorization','1888005nrYQPX','type','call','task','emit','reconnectDelay','connected','pop','message','text/event-stream','848563eiDPPz','heartbeatTimer','text','status','connect','359936YELHsR','new_task','toTimeString','idle','name','application/json,\x20text/event-stream','reply','slice','4872475dnIcop','log','url','heartbeatInterval','sseAbort','/events/','now','catch','sleep','alias','startsWith','min','abort','agent','SSE\x20error:\x20','send_reply','error','content','disconnected','Bearer\x20','application/json','token'];a0_0x23a1=function(){return _0x5453aa;};return a0_0x23a1();}export{$ as default,T as CommHub};
1
+ const a0_0x5c1182=a0_0x5914;(function(_0x51db45,_0x113a65){const _0x24ca30=a0_0x5914,_0x14be71=_0x51db45();while(!![]){try{const _0x1886ac=parseInt(_0x24ca30(0x159))/0x1*(-parseInt(_0x24ca30(0x181))/0x2)+parseInt(_0x24ca30(0x16c))/0x3*(-parseInt(_0x24ca30(0x18a))/0x4)+parseInt(_0x24ca30(0x198))/0x5*(parseInt(_0x24ca30(0x15b))/0x6)+parseInt(_0x24ca30(0x193))/0x7+-parseInt(_0x24ca30(0x149))/0x8*(-parseInt(_0x24ca30(0x17b))/0x9)+parseInt(_0x24ca30(0x166))/0xa*(-parseInt(_0x24ca30(0x182))/0xb)+-parseInt(_0x24ca30(0x18d))/0xc*(-parseInt(_0x24ca30(0x176))/0xd);if(_0x1886ac===_0x113a65)break;else _0x14be71['push'](_0x14be71['shift']());}catch(_0x5f5a0d){_0x14be71['push'](_0x14be71['shift']());}}}(a0_0x2ae2,0xc9a33));import{EventEmitter as a0_0xa1ec8b}from'events';function a0_0x2ae2(){const _0x5b1a60=['name','autoConnect','sdk-','reconnectDelay','text','3UjQBlG','getAllStatus','normal','connected','resumeId','Authorization','ack_inbox','content','url','error','13FIzYje','type','offline','stringify','connect','819DxMwYi','broadcast','slice','SSE\x20error:\x20','SSE\x20failed:\x20','status','2350706wtAxdJ','756107RHNjlE','heartbeatInterval','parse','now','get_all_status','application/json,\x20text/event-stream','sleep','idle','6380756SQGCkv','abort','catch','21926868wSkZrh','get_inbox','messages','send_message','call',']\x20[commhub:','8056776btrGBG','inbox\x20error:\x20','running','SSE\x20connected','split','55JfBTlj','processInbox','send_reply','toTimeString','registered','message','Bearer\x20','read','getReader','emit','119576YFfynK','replace','s...','alias','from_session','toString','send_task','disconnected','heartbeatTimer','text/event-stream','data:\x20','startsWith','result','agent','tools/call','POST','1olpHZn','SSE\x20reconnecting\x20in\x20','495138mHmuDY','/mcp','token','min','log','heartbeat\x20failed:\x20','disconnect','body','send','sseAbort','2.0','240LCUYXS'];a0_0x2ae2=function(){return _0x5b1a60;};return a0_0x2ae2();}import{hostname as a0_0x45b467}from'os';class T extends a0_0xa1ec8b{['url'];[a0_0x5c1182(0x14c)];[a0_0x5c1182(0x15d)];[a0_0x5c1182(0x156)];[a0_0x5c1182(0x170)];['heartbeatInterval'];[a0_0x5c1182(0x16a)];[a0_0x5c1182(0x151)];['sseAbort'];[a0_0x5c1182(0x195)]=!0x1;constructor(_0x124812){const _0xa2afd8=a0_0x5c1182;super();if(this[_0xa2afd8(0x174)]=_0x124812['url'][_0xa2afd8(0x14a)](/\/$/,''),this[_0xa2afd8(0x14c)]=_0x124812[_0xa2afd8(0x14c)],this[_0xa2afd8(0x15d)]=_0x124812[_0xa2afd8(0x15d)],this[_0xa2afd8(0x156)]=_0x124812[_0xa2afd8(0x156)]||'sdk',this[_0xa2afd8(0x170)]=_0xa2afd8(0x169)+_0x124812[_0xa2afd8(0x14c)]+'-'+Date[_0xa2afd8(0x185)]()[_0xa2afd8(0x14e)](0x24),this[_0xa2afd8(0x183)]=_0x124812['heartbeatInterval']??0x2bf20,this[_0xa2afd8(0x16a)]=_0x124812['reconnectDelay']??0xbb8,_0x124812[_0xa2afd8(0x168)]!==!0x1)this[_0xa2afd8(0x17a)]();}[a0_0x5c1182(0x15f)](_0x559704){const _0x4e23d5=a0_0x5c1182;console[_0x4e23d5(0x15f)]('['+new Date()[_0x4e23d5(0x142)]()[_0x4e23d5(0x17d)](0x0,0x8)+_0x4e23d5(0x192)+this[_0x4e23d5(0x14c)]+']\x20'+_0x559704);}async[a0_0x5c1182(0x191)](_0x365e00,_0x27879d){const _0x4d44d7=a0_0x5c1182;let _0x280753={'Content-Type':'application/json','Accept':_0x4d44d7(0x187)};if(this[_0x4d44d7(0x15d)])_0x280753[_0x4d44d7(0x171)]=_0x4d44d7(0x145)+this[_0x4d44d7(0x15d)];let _0x3af945=await(await fetch(this[_0x4d44d7(0x174)]+_0x4d44d7(0x15c),{'method':_0x4d44d7(0x158),'headers':_0x280753,'body':JSON[_0x4d44d7(0x179)]({'jsonrpc':_0x4d44d7(0x165),'id':Date['now'](),'method':_0x4d44d7(0x157),'params':{'name':_0x365e00,'arguments':_0x27879d}})}))[_0x4d44d7(0x16b)](),_0x1968ba=_0x3af945['match'](/data: (.+)/),_0x45496d=_0x1968ba?JSON['parse'](_0x1968ba[0x1]):JSON['parse'](_0x3af945),_0x333625=_0x45496d?.[_0x4d44d7(0x155)]?.[_0x4d44d7(0x173)]?.[0x0]?.['text'];return _0x333625?JSON[_0x4d44d7(0x184)](_0x333625):_0x45496d;}async[a0_0x5c1182(0x17a)](){const _0xa900b4=a0_0x5c1182;if(this[_0xa900b4(0x195)])return;this[_0xa900b4(0x195)]=!0x0,await this[_0xa900b4(0x180)](_0xa900b4(0x189)),this[_0xa900b4(0x15f)](_0xa900b4(0x143)),this[_0xa900b4(0x151)]=setInterval(()=>{const _0x572032=_0xa900b4;this['status'](_0x572032(0x189))[_0x572032(0x18c)](_0xefe55c=>this[_0x572032(0x15f)](_0x572032(0x160)+_0xefe55c[_0x572032(0x144)]));},this[_0xa900b4(0x183)]),this['connectSSE']();}async[a0_0x5c1182(0x161)](){const _0x5accdc=a0_0x5c1182;if(this['running']=!0x1,this[_0x5accdc(0x164)]?.[_0x5accdc(0x18b)](),this[_0x5accdc(0x151)])clearInterval(this[_0x5accdc(0x151)]);await this[_0x5accdc(0x180)](_0x5accdc(0x178))[_0x5accdc(0x18c)](()=>{}),this[_0x5accdc(0x15f)](_0x5accdc(0x150));}async[a0_0x5c1182(0x163)](_0x3d4a3d,_0x22d67c,_0x2f06c6=a0_0x5c1182(0x16e)){const _0x45e71f=a0_0x5c1182;return this[_0x45e71f(0x191)](_0x45e71f(0x14f),{'alias':_0x3d4a3d,'task':_0x22d67c,'priority':_0x2f06c6,'from_session':this[_0x45e71f(0x14c)]});}async[a0_0x5c1182(0x144)](_0x27cd93,_0x22d08b){const _0x278bf0=a0_0x5c1182;return this[_0x278bf0(0x191)](_0x278bf0(0x190),{'alias':_0x27cd93,'message':_0x22d08b,'from_session':this[_0x278bf0(0x14c)]});}async['reply'](_0x16875b,_0x40b6cb,_0x506bef='completed'){const _0x2e537d=a0_0x5c1182;return this[_0x2e537d(0x191)](_0x2e537d(0x141),{'in_reply_to':_0x16875b,'text':_0x40b6cb,'status':_0x506bef});}async['status'](_0x5e6817,_0xcd65de){const _0x337473=a0_0x5c1182;return this[_0x337473(0x191)]('report_status',{'resume_id':this[_0x337473(0x170)],'alias':this[_0x337473(0x14c)],'status':_0x5e6817,'server':a0_0x45b467(),'hostname':a0_0x45b467(),'agent':this[_0x337473(0x156)],'project_dir':process['cwd'](),..._0xcd65de});}async[a0_0x5c1182(0x16d)](){const _0x2a41ce=a0_0x5c1182;return this[_0x2a41ce(0x191)](_0x2a41ce(0x186),{});}async[a0_0x5c1182(0x17c)](_0x46a6e7,_0x274781){const _0x53017f=a0_0x5c1182;return this['call']('broadcast',{'message':_0x46a6e7,'filter_server':_0x274781?.['server'],'filter_status':_0x274781?.[_0x53017f(0x180)]});}async['connectSSE'](){const _0x124d5a=a0_0x5c1182;let _0x1f5d74=encodeURIComponent(this[_0x124d5a(0x14c)]),_0xfed840=this[_0x124d5a(0x174)]+'/events/'+_0x1f5d74,_0x88fb32=this[_0x124d5a(0x16a)];while(this['running']){try{this[_0x124d5a(0x164)]=new AbortController();let _0x21ffbe={'Accept':_0x124d5a(0x152)};if(this['token'])_0x21ffbe['Authorization']=_0x124d5a(0x145)+this[_0x124d5a(0x15d)];let _0x2f1a92=await fetch(_0xfed840,{'headers':_0x21ffbe,'signal':this['sseAbort']['signal']});if(!_0x2f1a92['ok']||!_0x2f1a92[_0x124d5a(0x162)]){this['log'](_0x124d5a(0x17f)+_0x2f1a92[_0x124d5a(0x180)]),await this[_0x124d5a(0x188)](_0x88fb32),_0x88fb32=Math[_0x124d5a(0x15e)](_0x88fb32*1.5,0xea60);continue;}_0x88fb32=this[_0x124d5a(0x16a)];let _0x40722e=_0x2f1a92[_0x124d5a(0x162)][_0x124d5a(0x147)](),_0x1d3b8d=new TextDecoder(),_0x4e42eb='';while(this[_0x124d5a(0x195)]){let {done:_0x4d22c,value:_0xcf7bcf}=await _0x40722e[_0x124d5a(0x146)]();if(_0x4d22c)break;_0x4e42eb+=_0x1d3b8d['decode'](_0xcf7bcf,{'stream':!0x0});let _0x36dc9b=_0x4e42eb[_0x124d5a(0x197)]('\x0a');_0x4e42eb=_0x36dc9b['pop']()||'';for(let _0x5ee04c of _0x36dc9b){if(!_0x5ee04c[_0x124d5a(0x154)](_0x124d5a(0x153)))continue;try{let _0x1c2e74=JSON['parse'](_0x5ee04c[_0x124d5a(0x17d)](0x6));if(_0x1c2e74['type']===_0x124d5a(0x16f)){this['log'](_0x124d5a(0x196)),this[_0x124d5a(0x148)](_0x124d5a(0x16f));continue;}if(_0x1c2e74[_0x124d5a(0x177)]==='new_task'||_0x1c2e74['type']==='new_message'||_0x1c2e74[_0x124d5a(0x177)]==='broadcast')await this[_0x124d5a(0x140)]();}catch{}}}}catch(_0x2f8c16){if(_0x2f8c16[_0x124d5a(0x167)]==='AbortError')break;this[_0x124d5a(0x148)](_0x124d5a(0x175),_0x2f8c16),this['log'](_0x124d5a(0x17e)+_0x2f8c16[_0x124d5a(0x144)]);}if(this[_0x124d5a(0x195)])this[_0x124d5a(0x148)](_0x124d5a(0x150)),this['log'](_0x124d5a(0x15a)+_0x88fb32/0x3e8+_0x124d5a(0x14b)),await this['sleep'](_0x88fb32),_0x88fb32=Math[_0x124d5a(0x15e)](_0x88fb32*1.5,0xea60);}}async[a0_0x5c1182(0x140)](){const _0x2de56c=a0_0x5c1182;try{let _0x5b4a60=(await this[_0x2de56c(0x191)](_0x2de56c(0x18e),{'alias':this[_0x2de56c(0x14c)],'limit':0xa}))?.[_0x2de56c(0x18f)]||[];for(let _0x11527a of _0x5b4a60)await this[_0x2de56c(0x191)](_0x2de56c(0x172),{'alias':this[_0x2de56c(0x14c)],'message_id':_0x11527a['id']}),this[_0x2de56c(0x15f)]('←\x20'+_0x11527a[_0x2de56c(0x14d)]+':\x20'+_0x11527a[_0x2de56c(0x173)]['slice'](0x0,0x3c)),this[_0x2de56c(0x148)]('task',_0x11527a),this[_0x2de56c(0x148)](_0x2de56c(0x144),_0x11527a);}catch(_0x3589ad){this[_0x2de56c(0x15f)](_0x2de56c(0x194)+_0x3589ad[_0x2de56c(0x144)]);}}[a0_0x5c1182(0x188)](_0x45d8d3){return new Promise(_0x5099b7=>setTimeout(_0x5099b7,_0x45d8d3));}}function a0_0x5914(_0x3a1e5f,_0x260fab){_0x3a1e5f=_0x3a1e5f-0x140;const _0x2ae2cc=a0_0x2ae2();let _0x591478=_0x2ae2cc[_0x3a1e5f];return _0x591478;}var $=T;export{$ as default,T as CommHub};
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Tiny loader that mirrors what `initTelegramChannel` does at boot —
3
+ * read the parsed access.json blob and produce both the raw allowFrom
4
+ * payload (handed to the resolver verbatim) AND a boot-time warning
5
+ * string for the empty / malformed case.
6
+ *
7
+ * Extracted so wiring-level regression tests (e.g. "channel state
8
+ * built from `{allowFrom: [123]}` MUST fail-closed when a message
9
+ * arrives") run without spinning up a real telegram channel + fs
10
+ * mocks. The previous bug — `.map(String)` rewriting [123] into
11
+ * ["123"] at init time — slipped past resolver-only unit tests
12
+ * because the resolver never saw the offending shape; the channel
13
+ * state did.
14
+ */
15
+ export interface LoadedTelegramAccess {
16
+ /** Raw value from access.json — handed verbatim to resolveTelegramAccess. */
17
+ allowFromRaw: unknown;
18
+ /** Boot-time warning string when allowFrom is empty / malformed; null otherwise. */
19
+ bootWarn: string | null;
20
+ }
21
+ export declare function loadTelegramAccess(opts: {
22
+ channelDir: string;
23
+ parsedAccess: {
24
+ allowFrom?: unknown;
25
+ } | null | undefined;
26
+ }): LoadedTelegramAccess;
27
+ /**
28
+ * Discriminated reason for an access decision. Callers can switch on
29
+ * `kind` for routing (e.g. `empty-fail-closed` warrants a louder boot
30
+ * warning than a simple `denied` mid-stream).
31
+ */
32
+ export type AccessKind = "wildcard-allow" | "explicit-allow" | "empty-fail-closed" | "denied";
33
+ export interface AccessDecision {
34
+ allow: boolean;
35
+ kind: AccessKind;
36
+ /** Short, machine-readable reason for logging. */
37
+ reason: string;
38
+ }
39
+ /**
40
+ * Normalise an allowFrom input into a deduped string[] suitable for
41
+ * the lookup checks. Accepts: a real string[] (the happy case), null /
42
+ * undefined (treated as empty), a non-array shape (defensive — treated
43
+ * as empty + reason surfaced).
44
+ */
45
+ export declare function normalizeAllowFrom(raw: unknown): {
46
+ list: string[];
47
+ malformed: boolean;
48
+ };
49
+ /**
50
+ * Resolve whether an inbound Telegram message should be processed.
51
+ *
52
+ * Fail-closed: empty / missing / malformed `allowFrom` always denies.
53
+ * Wildcard `"*"` always allows. Otherwise the sender's id OR username
54
+ * (after non-empty check) must match a list entry.
55
+ *
56
+ * @param opts.allowFrom the access.json `allowFrom` array
57
+ * @param opts.senderId numeric Telegram user id as string
58
+ * (callers already coerce; we trust)
59
+ * @param opts.senderUsername optional `@username` (no `@` prefix)
60
+ */
61
+ export declare function resolveTelegramAccess(opts: {
62
+ allowFrom: unknown;
63
+ senderId: string;
64
+ senderUsername?: string | null;
65
+ }): AccessDecision;
66
+ /**
67
+ * Resolve whether an inbound Feishu/Lark event should be processed.
68
+ *
69
+ * Same fail-closed contract as telegram. DM path checks `allowFrom`;
70
+ * group path checks `allowChats` first, then `groupPolicy` decides
71
+ * whether listed chats trigger the agent (`all` → trigger any message;
72
+ * `observe` → never trigger; `mention` → only on @-mention — caller
73
+ * still has to honour that flag, this helper just returns allow=true).
74
+ *
75
+ * @param opts.conversationType "dm" | "group" | "channel" | "thread"
76
+ * @param opts.allowFrom access.json `allowFrom` array
77
+ * @param opts.allowChats access.json `allowChats` array
78
+ * @param opts.senderId feishu open_id of the sender
79
+ * @param opts.conversationId feishu chat_id of the conversation
80
+ * @param opts.groupPolicy "all" | "mention" | "observe"
81
+ */
82
+ export declare function resolveFeishuAccess(opts: {
83
+ conversationType: "dm" | "group" | "channel" | "thread" | string;
84
+ allowFrom: unknown;
85
+ allowChats: unknown;
86
+ senderId: string;
87
+ conversationId: string;
88
+ groupPolicy: "all" | "mention" | "observe" | string;
89
+ }): AccessDecision;
90
+ /**
91
+ * Build the boot-time warning string when a channel starts with an
92
+ * empty / malformed allowlist. Caller emits this via `warn()` once at
93
+ * startup so operators see the fail-closed posture immediately rather
94
+ * than discovering it the first time a message gets denied.
95
+ *
96
+ * Returns `null` when the allowlist has at least one entry (no boot
97
+ * warning needed).
98
+ */
99
+ export declare function buildEmptyAllowlistWarn(opts: {
100
+ channel: string;
101
+ channelDir: string;
102
+ allowFrom: unknown;
103
+ }): string | null;
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
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}
2
+ import*as F from"@larksuiteoapi/node-sdk";import w from"node:crypto";import{existsSync as I,mkdirSync as h,readFileSync as v,writeFileSync as g}from"node:fs";import{join as A}from"node:path";import{Readable as c}from"node:stream";function L(J){if(Array.isArray(J))return{list:J.filter((V)=>typeof V==="string"&&V.length>0).map((V)=>String(V)),malformed:!1};if(J===void 0||J===null)return{list:[],malformed:!1};return{list:[],malformed:!0}}function C(J){if(J.conversationType==="dm"){let{list:$,malformed:Z}=L(J.allowFrom);if($.length===0)return{allow:!1,kind:"empty-fail-closed",reason:Z?"allowFrom malformed (not a string[]) — fail-closed (dm)":"allowFrom empty — fail-closed (dm)"};if($.includes("*"))return{allow:!0,kind:"wildcard-allow",reason:'allowFrom=["*"] (dm)'};if(J.senderId&&$.includes(J.senderId))return{allow:!0,kind:"explicit-allow",reason:`sender ${J.senderId} in allowFrom (dm)`};return{allow:!1,kind:"denied",reason:"sender not in allowFrom (dm)"}}let Q=L(J.allowChats);if(Q.list.length===0)return{allow:!1,kind:"empty-fail-closed",reason:Q.malformed?"allowChats malformed — fail-closed (group)":"allowChats empty — fail-closed (group)"};if(!(Q.list.includes("*")||Q.list.includes(J.conversationId)))return{allow:!1,kind:"denied",reason:"chat not in allowChats"};if(J.groupPolicy==="all")return{allow:!0,kind:"explicit-allow",reason:"chat in allowChats + groupPolicy=all"};if(J.groupPolicy==="observe")return{allow:!1,kind:"denied",reason:"groupPolicy=observe — chat allowlisted but no trigger"};return{allow:!0,kind:"explicit-allow",reason:`chat allowed + groupPolicy=${J.groupPolicy}`}}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(J){if(J.platform!=="feishu")throw Error(`FeishuAdapter.init: expected platform "feishu", got "${J.platform}"`);let Q=J.platformConfig;if(!Q?.appId||!Q?.appSecret)throw Error("FeishuAdapter.init: appId / appSecret missing in platformConfig");this.feishuConfig=Q,this.connectionName=J.connectionName,this.client=new F.Client({appId:Q.appId,appSecret:Q.appSecret,disableTokenCache:!1}),this.botOpenId=await i(this.client),this.mediaDir=Q.channelDir?A(Q.channelDir,"media"):null}async start(J){if(!this.feishuConfig||!this.client)throw Error("FeishuAdapter.start: call init() first");let{appId:Q,appSecret:V,access:$,groupPolicy:Z}=this.feishuConfig,G=this.connectionName,q=this.botOpenId,X=this.mediaDir,U=this.client,N=new F.EventDispatcher({});N.register({"im.message.receive_v1":async(H)=>{try{this.health_={...this.health_,lastEventAt:Date.now()};let Y=l(H,G,q);if(!Y)return;await p(H,Y,U,X);let B=o(Y,$,Z);if(!B.allow){P("deny",Y,B.reason);return}await J(Y)}catch(Y){let B=Y instanceof Error?Y.message:String(Y);this.health_={...this.health_,lastError:B},P("error",null,B)}}}),this.wsClient=new F.WSClient({appId:Q,appSecret:V,loggerLevel:F.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(J){if(!this.client)throw Error("FeishuAdapter.send: call init() first");let Q,V;if(J.imagePath){let X=await d(this.client,J.imagePath);if(!X)throw Error(`FeishuAdapter.send: image upload failed for ${J.imagePath}`);Q="image",V=JSON.stringify({image_key:X})}else{let X=J.text??J.markdown;if(!X)throw Error("FeishuAdapter.send: requires text, markdown, or imagePath");Q="text",V=JSON.stringify({text:X})}let $=J.replyToMessageId??J.target.threadRootId;if($){let U=(await this.client.im.message.reply({path:{message_id:$},data:{msg_type:Q,content:V}}))?.data?.message_id;if(!U)throw Error("FeishuAdapter.send: reply returned no message_id");return{messageId:U}}let Z=J.target.conversationType==="dm"?"open_id":"chat_id",q=(await this.client.im.message.create({params:{receive_id_type:Z},data:{receive_id:J.target.conversationId,msg_type:Q,content:V}}))?.data?.message_id;if(!q)throw Error("FeishuAdapter.send: create returned no message_id");return{messageId:q}}async edit(J,Q,V){if(!this.client)throw Error("FeishuAdapter.edit: call init() first");let $=V.text??V.markdown;if(!$)throw Error("FeishuAdapter.edit: M3 supports text only");await this.client.im.message.update({path:{message_id:Q},data:{msg_type:"text",content:JSON.stringify({text:$})}})}health(){return{...this.health_}}}function l(J,Q,V){let $=J,Z=$?.message,G=$?.sender,q=G?.sender_id?.open_id;if(!Z||!q)return null;let X;if(Z.message_type==="text")try{X=JSON.parse(Z.content).text}catch{X=Z.content}else if(Z.message_type==="file")try{X=`[文件: ${JSON.parse(Z.content).file_name??"unknown"}]`}catch{X="[文件]"}else if(Z.message_type==="sticker")X="[表情]";else if(Z.message_type==="image")X=void 0;else return null;let U=Z.chat_type==="group"?"group":"dm",N=Array.isArray(Z.mentions)?Z.mentions:[],H=V?N.some((B)=>B?.id?.open_id===V):N.length>0,Y=`${Q}#feishu`;return{platform:"feishu",connectionId:Y,tenantId:G?.tenant_key,conversation:{platform:"feishu",conversationId:Z.chat_id,conversationType:U,threadRootId:Z.root_id},sender:{id:q},messageId:Z.message_id,mentioned:H,content:X?{text:X}:{},receivedAt:Date.now(),idempotencyKey:`feishu:${Y}:${Z.message_id}`}}async function p(J,Q,V,$){if(!V||!$)return;let G=J?.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 m(V,G.message_id,q,$);if(X)Q.content={...Q.content,images:[X]}}async function m(J,Q,V,$){try{let Z=await J.im.messageResource.get({path:{message_id:Q,file_key:V},params:{type:"image"}});if(!Z)return null;let G=Z,q=[];await new Promise((N,H)=>{G.on("data",(Y)=>q.push(Buffer.from(Y))),G.on("end",()=>N()),G.on("error",(Y)=>H(Y))}),h($,{recursive:!0});let X=`img_${Date.now()}_${w.randomBytes(4).toString("hex")}.png`,U=A($,X);return g(U,Buffer.concat(q)),U}catch{return null}}async function d(J,Q){try{if(!I(Q))return null;let V=v(Q),$=c.from(V);return(await J.im.image.create({data:{image_type:"message",image:$}}))?.image_key??null}catch{return null}}async function i(J){try{let V=await J.request({method:"GET",url:"/open-apis/bot/v3/info"});return V?.bot?.open_id??V?.data?.bot?.open_id??null}catch{return null}}function o(J,Q,V){let $=C({conversationType:J.conversation.conversationType,allowFrom:Q.allowFrom,allowChats:Q.allowChats,senderId:J.sender.id,conversationId:J.conversation.conversationId,groupPolicy:V==="command"?"mention":V});if(J.conversation.conversationType==="dm")return{allow:$.allow,reason:$.reason};if(!$.allow)return{allow:!1,reason:$.reason};if(V==="all")return{allow:!0,reason:""};if(J.mentioned)return{allow:!0,reason:""};return{allow:!1,reason:`groupPolicy=${V} requires @bot mention (not mentioned)`}}function P(J,Q,V){let $=new Date().toISOString(),Z=Q?`${Q.conversation.conversationType}:${Q.conversation.conversationId}`:"?",G=Q?Q.sender.id:"?";process.stderr.write(`[${$}] [feishu:audit] ${J} from=${G} conv=${Z} — ${V}
3
+ `)}import{existsSync as E,readFileSync as D}from"node:fs";import{join as M}from"node:path";function b(J){let Q=r(M(J,".env")),V=Q.FEISHU_APP_ID,$=Q.FEISHU_APP_SECRET;if(!V||!$)throw Error(`feishu channel: FEISHU_APP_ID / FEISHU_APP_SECRET missing in ${J}/.env`);let Z=s(M(J,"access.json"));return{appId:V,appSecret:$,access:Z,groupPolicy:"mention",ackPlaceholder:!0,auditRaw:!1,taskTimeoutMs:300000,channelDir:J}}function r(J){if(!E(J))return{};let Q={};for(let V of D(J,"utf-8").split(/\r?\n/)){let $=V.trim();if(!$||$.startsWith("#"))continue;let Z=$.indexOf("=");if(Z<0)continue;let G=$.slice(0,Z).trim(),q=$.slice(Z+1).trim().replace(/^["']|["']$/g,"");Q[G]=q}return Q}function s(J){if(!E(J))return{allowFrom:[],allowChats:[]};try{let Q=JSON.parse(D(J,"utf-8"));return{allowFrom:Array.isArray(Q.allowFrom)?Q.allowFrom:[],allowChats:Array.isArray(Q.allowChats)?Q.allowChats:[]}}catch{return{allowFrom:[],allowChats:[]}}}var a=900000,n=120000,t=3,y=60000,e=2,_=60000,JJ=3,f=60000,QJ="处理频率超出限制,请稍后重试";async function T(J){let Q=b(J.channelDir),V=new R;await V.init({platform:"feishu",connectionName:J.nodeAlias,ingressMode:"socket",groupPolicy:Q.groupPolicy,ackPlaceholder:Q.ackPlaceholder,auditRaw:Q.auditRaw,taskTimeoutMs:Q.taskTimeoutMs,platformConfig:Q});let $=Q.taskTimeoutMs||a,Z=J.onEvent??$J(V,$,Q.ackPlaceholder);return await V.start(VJ(ZJ(Z,V))),V}function VJ(J){let Q=new Map;return async(V)=>{let $=Date.now();if(Q.size>200){for(let[Z,G]of Q)if($-G>n)Q.delete(Z)}if(Q.has(V.idempotencyKey)){process.stderr.write(`[feishu:bridge] dedup drop ${V.idempotencyKey}
4
+ `);return}Q.set(V.idempotencyKey,$),await J(V)}}function ZJ(J,Q){let V=new Map,$=new Map,Z=new Map;function G(Y,B,j){let W=B-j;return Y.filter((K)=>K>=W)}function q(Y,B,j){if(Y.size<=u)return;for(let[W,K]of Y){let z=K[K.length-1]??0;if(B-z>j)Y.delete(W)}}function X(Y,B){if(Y.size<=u)return;for(let[j,W]of Y)if(B-W.windowStart>f)Y.delete(j)}function U(Y,B){if(Y.size<=B)return;let j=[];for(let[K,z]of Y)j.push([K,z[z.length-1]??0]);j.sort((K,z)=>K[1]-z[1]);let W=Y.size-B;for(let K=0;K<W;K++)Y.delete(j[K][0])}function N(Y,B){if(Y.size<=B)return;let j=[];for(let[K,z]of Y)j.push([K,z.windowStart]);j.sort((K,z)=>K[1]-z[1]);let W=Y.size-B;for(let K=0;K<W;K++)Y.delete(j[K][0])}let H=async(Y)=>{let B=Date.now();q(V,B,y),q($,B,_),X(Z,B),U(V,O),U($,O),N(Z,O);let j=!1;if(Y.conversation.conversationType==="dm"){let x=Y.sender.id,S=G(V.get(x)??[],B,y);if(S.length>=t)j=!0,V.set(x,S);else S.push(B),V.set(x,S)}else{let x=Y.conversation.conversationId,S=G($.get(x)??[],B,_);if(S.length>=e)j=!0,$.set(x,S);else S.push(B),$.set(x,S)}if(j){let x=Y.sender.id,S=Y.conversation.conversationId;if(Y.conversation.conversationType==="dm"){let k=V.get(x);if(k&&k.length===0)V.delete(x)}else{let k=$.get(S);if(k&&k.length===0)$.delete(S)}}if(!j){await J(Y);return}let W=Y.sender.id,K=Z.get(W),z;if(!K||B-K.windowStart>f)z={count:1,windowStart:B};else z={count:K.count+1,windowStart:K.windowStart};if(Z.set(W,z),z.count>=JJ)process.stderr.write(`[feishu:audit] flood from=${W} conv=${Y.conversation.conversationType}:${Y.conversation.conversationId} — ${z.count} rate-limit denies in ${Math.round((B-z.windowStart)/1000)}s window
5
+ `);try{await Q.send({target:Y.conversation,text:QJ,replyToMessageId:Y.messageId,correlation:{taskId:Y.idempotencyKey}}),process.stderr.write(`[feishu:bridge] rate-limited (${Y.conversation.conversationType}) from=${W} for ${Y.idempotencyKey}
6
+ `)}catch(x){let S=x instanceof Error?x.message:String(x);process.stderr.write(`[feishu:bridge] rate-limit notice send failed: ${S}
7
+ `)}};return H.__getState=()=>({dmKeyCount:V.size,groupKeyCount:$.size,floodKeyCount:Z.size}),H}var u=50,O=1e4;function $J(J,Q,V){if(typeof process.send==="function")return qJ(J,Q,V);return GJ}var YJ="⏳ 处理中…",XJ="[处理超时,任务可能仍在后台运行]";function qJ(J,Q,V){if(typeof process.send!=="function")throw Error("createIPCEventHandler: parent process.send unavailable (not forked)");let $=new Map;return process.on("message",(Z)=>{if(!BJ(Z))return;let G=$.get(Z.eventKey);if(!G)return;$.delete(Z.eventKey);let{text:q,eventKey:X}=Z,{event:U,placeholderMessageId:N}=G;(async()=>{try{let{messageId:H}=await J.send({target:U.conversation,text:q,replyToMessageId:U.messageId,correlation:{taskId:X}}),Y=N?` (after placeholder=${N})`:"";process.stderr.write(`[feishu:bridge] reply sent (messageId=${H})${Y} for ${X}
8
+ `)}catch(H){let Y=H instanceof Error?H.message:String(H);process.stderr.write(`[feishu:bridge] reply delivery failed: ${Y}
9
+ `)}})()}),async(Z)=>{if($.set(Z.idempotencyKey,{event:Z}),setTimeout(()=>{let q=$.get(Z.idempotencyKey);if(!q)return;$.delete(Z.idempotencyKey);let{placeholderMessageId:X}=q;(async()=>{try{await J.send({target:Z.conversation,text:XJ,replyToMessageId:Z.messageId,correlation:{taskId:Z.idempotencyKey}});let U=X?` (after placeholder=${X})`:"";process.stderr.write(`[feishu:bridge] timeout-notify sent${U} for ${Z.idempotencyKey} after ${Q}ms
10
+ `)}catch(U){let N=U instanceof Error?U.message:String(U);process.stderr.write(`[feishu:bridge] timeout-notify send failed: ${N}
11
+ `)}})()},Q),V)try{let{messageId:q}=await J.send({target:Z.conversation,text:YJ,replyToMessageId:Z.messageId,correlation:{taskId:Z.idempotencyKey}}),X=$.get(Z.idempotencyKey);if(X)X.placeholderMessageId=q,process.stderr.write(`[feishu:bridge] placeholder sent (messageId=${q}) for ${Z.idempotencyKey}
12
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
- `)}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)}}GJ();
13
+ `)}let G={type:"event",event:Z};process.send(G)}}function BJ(J){if(!J||typeof J!=="object")return!1;let Q=J;return Q.type==="reply"&&typeof Q.eventKey==="string"&&typeof Q.text==="string"}async function GJ(J){process.stderr.write(`[feishu:bridge] event from=${J.sender.id} conv=${J.conversation.conversationType}:${J.conversation.conversationId} mentioned=${J.mentioned} text=${(J.content.text??"").slice(0,80)}
14
+ `)}function KJ(J){let Q={};for(let V=0;V<J.length;V++){let $=J[V],Z=J[V+1];if($==="--channel-dir"&&Z)Q.channelDir=Z,V++;else if($==="--node-alias"&&Z)Q.nodeAlias=Z,V++}return Q}async function UJ(){let J=KJ(process.argv.slice(2));if(!J.channelDir||!J.nodeAlias)process.stderr.write(`usage: feishu-worker --channel-dir <path> --node-alias <alias>
15
+ `),process.exit(2);try{await T({channelDir:J.channelDir,nodeAlias:J.nodeAlias}),process.stderr.write(`[feishu:worker] bridge online — node=${J.nodeAlias} dir=${J.channelDir} ipc=${typeof process.send==="function"?"yes":"no"}
16
+ `)}catch(Q){let V=Q instanceof Error?Q.stack??Q.message:String(Q);process.stderr.write(`[feishu:worker] startup failed: ${V}
17
+ `),process.exit(1)}}UJ();
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env bun
2
- const a0_0x193669=a0_0x2430;(function(_0x593117,_0xa976d7){const _0x7bd123=a0_0x2430,_0x5da658=_0x593117();while(!![]){try{const _0x84ab2e=parseInt(_0x7bd123(0x1f3))/0x1*(parseInt(_0x7bd123(0x1c0))/0x2)+-parseInt(_0x7bd123(0x190))/0x3+-parseInt(_0x7bd123(0x1ea))/0x4+parseInt(_0x7bd123(0x19f))/0x5+-parseInt(_0x7bd123(0x1c7))/0x6*(-parseInt(_0x7bd123(0x20c))/0x7)+parseInt(_0x7bd123(0x1d3))/0x8*(parseInt(_0x7bd123(0x1be))/0x9)+-parseInt(_0x7bd123(0x1dc))/0xa;if(_0x84ab2e===_0xa976d7)break;else _0x5da658['push'](_0x5da658['shift']());}catch(_0x493ec9){_0x5da658['push'](_0x5da658['shift']());}}}(a0_0x2a6f,0x4f63c));import{readFileSync as a0_0x44c519,existsSync as a0_0x19da89}from'fs';import{randomUUID as a0_0x4968da}from'crypto';import{join as a0_0x1843f3}from'path';import{hostname as a0_0x4ad13a}from'os';import{execSync as a0_0x4a5f1d}from'child_process';import{Server as a0_0x2a8829}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x58076e}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x449c53,CallToolRequestSchema as a0_0x1520fd}from'@modelcontextprotocol/sdk/types.js';function I(_0x2ca5de){const _0x2e5a27=a0_0x2430;if(!a0_0x19da89(_0x2ca5de))return;for(let _0x908165 of a0_0x44c519(_0x2ca5de,'utf-8')[_0x2e5a27(0x1e6)]('\x0a')){let _0x3448a=_0x908165[_0x2e5a27(0x211)]();if(!_0x3448a||_0x3448a['startsWith']('#'))continue;let _0x5df3da=_0x3448a[_0x2e5a27(0x20e)]('=');if(_0x5df3da<0x0)continue;let _0x31dc80=_0x3448a[_0x2e5a27(0x1ab)](0x0,_0x5df3da)[_0x2e5a27(0x211)](),_0x35d471=_0x3448a[_0x2e5a27(0x1ab)](_0x5df3da+0x1)[_0x2e5a27(0x211)]()['replace'](/^["']|["']$/g,'');if(!process.env[_0x31dc80])process.env[_0x31dc80]=_0x35d471;}}var L=process.env.HOME||'~',U=a0_0x1843f3(L,a0_0x193669(0x1f0));I(a0_0x1843f3(U,a0_0x193669(0x1c1)));var v=process[a0_0x193669(0x19a)]()[a0_0x193669(0x1c3)](/\//g,'-');I(a0_0x1843f3(U,v,a0_0x193669(0x1c1)));function d(){const _0x3d9960=a0_0x193669;try{return a0_0x4a5f1d('tmux\x20display-message\x20-p\x20\x27#S\x27',{'encoding':_0x3d9960(0x19c),'timeout':0x7d0})['trim']();}catch{return'';}}function m(){const _0xb86702=a0_0x193669;try{let _0x2c700e=a0_0x1843f3(L,'.anet',_0xb86702(0x19b));if(a0_0x19da89(_0x2c700e))return JSON[_0xb86702(0x21e)](a0_0x44c519(_0x2c700e,_0xb86702(0x19c)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x193669(0x217)]||a0_0x193669(0x1f2),f=process.env.COMMHUB_TMUX||d();function r(){const _0x146d32=a0_0x193669;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0x146d32(0x211)]())return process.env.COMMHUB_ALIAS[_0x146d32(0x211)]();return process[_0x146d32(0x215)][_0x146d32(0x1fb)]('[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20'+('would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME='+(f||_0x146d32(0x1f5))+_0x146d32(0x1ac)+a0_0x4ad13a()+'.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a')),'unattributed-'+process['pid'];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x4968da(),F=process.env.COMMHUB_TOKEN||u[a0_0x193669(0x1b9)]||'';function W(_0x59cf3d){const _0x300654=a0_0x193669;let _0x4f98e1=new Date()[_0x300654(0x1bc)]()[_0x300654(0x1ab)](0x0,0x8);process[_0x300654(0x215)][_0x300654(0x1fb)]('['+_0x4f98e1+_0x300654(0x1fd)+_0x59cf3d+'\x0a');}function a0_0x2430(_0x4b1b7f,_0x26d08c){_0x4b1b7f=_0x4b1b7f-0x18e;const _0x2a6fa3=a0_0x2a6f();let _0x2430c0=_0x2a6fa3[_0x4b1b7f];return _0x2430c0;}function N(_0x550ac0){return new Promise(_0x47cd66=>setTimeout(_0x47cd66,_0x550ac0));}W(a0_0x193669(0x1a7)+j+'\x20ALIAS='+G+'\x20RESUME_ID='+K[a0_0x193669(0x1ab)](0x0,0x8)+'...\x20TMUX='+(f||a0_0x193669(0x1ee))+a0_0x193669(0x1cc)+process[a0_0x193669(0x19a)]()+a0_0x193669(0x218)+v);var D=new Map(),x=new a0_0x2a8829({'name':'commhub-channel','version':a0_0x193669(0x210)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x193669(0x196),a0_0x193669(0x1bd),a0_0x193669(0x1c4),'You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.',a0_0x193669(0x1e5)+G][a0_0x193669(0x208)]('\x0a')});function a0_0x2a6f(){const _0x156167=['stringify','new_message','2553060GLQrgK','Target\x20session\x20alias','commhub_get_all_status','SSE\x20stream\x20ended,\x20reconnecting...','shutting\x20down,\x20reporting\x20offline...','replied','message','registered\x20as\x20\x22','ENV:\x20URL=','setRequestHandler','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','connecting\x20to\x20','slice','\x20/\x20hostname=','Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','completed','SSE\x20error:\x20','low','no\x20response','alias','blocked','data:\x20','text','fatal:\x20','params','commhub_report_status','token','object','priority','toTimeString','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','117Zqnabv','warning:\x20could\x20not\x20register:\x20','68754wDoSya','.env','Message\x20content','replace','Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.','find','content','1211172CAhCtd','parse\x20error:\x20','startsWith','catch','commhub_send_message','\x20CWD=','offline','SSE\x20connected\x20as\x20\x22','stdin','inbox_count','unknown\x20tool','Current\x20task\x20description','299400qMUItP','from_session','commhub_send_task','decode','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','commhub','min','Bearer\x20','idle','4293020lxYKSl','Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','commhub_reply','notification','commhub-channel','error','length','2.0','type','Session\x20alias:\x20','split','CommHub\x20init\x20failed:\x20','Reply\x20text\x20/\x20result\x20summary','cancelled','1828884FATaHN','MCP\x20stdio\x20connected','session\x20disconnected','exit','none','string','.claude/channels/commhub','statusText','http://127.0.0.1:9200','1CTmwyE','claude-code','(none)','in_progress','from','body','ack_inbox','task','write','SIGTERM',']\x20[commhub]\x20','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','new_task','status','ready\x20—\x20waiting\x20for\x20events','message_id',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','end','get_all_status','\x20from\x20',':\x20inbox_count=','join','tools/call','result','getReader','7HrRCHO','Task\x20content','indexOf','/mcp','0.3.0','trim','report_status','now','notifications/claude/channel','stderr','re-registered\x20as\x20\x22','hub','\x20PROJECT_ENV=','pop','connected','\x22\x20after\x20SSE\x20reconnect','set','broadcast','parse','delete','working','re-register\x20failed:\x20','application/json,\x20text/event-stream','connect','65019dTPoOM','normal','get_inbox','failed','Priority\x20(default:\x20normal)','starting\x20SSE\x20listener...','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>','Progress\x200-100','initialize','POST','cwd','config.json','utf-8'];a0_0x2a6f=function(){return _0x156167;};return a0_0x2a6f();}x[a0_0x193669(0x1a8)](a0_0x449c53,async()=>({'tools':[{'name':a0_0x193669(0x1de),'description':a0_0x193669(0x1dd),'inputSchema':{'type':a0_0x193669(0x1ba),'properties':{'task_id':{'type':a0_0x193669(0x1ef),'description':a0_0x193669(0x1fe)},'text':{'type':a0_0x193669(0x1ef),'description':a0_0x193669(0x1e8)},'status':{'type':a0_0x193669(0x1ef),'enum':[a0_0x193669(0x1ae),a0_0x193669(0x193),a0_0x193669(0x1e9),'blocked',a0_0x193669(0x1e1),a0_0x193669(0x1f6)],'description':a0_0x193669(0x1a9)}},'required':['text']}},{'name':a0_0x193669(0x1b8),'description':'Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','inputSchema':{'type':a0_0x193669(0x1ba),'properties':{'status':{'type':a0_0x193669(0x1ef),'enum':['working','idle',a0_0x193669(0x1b3),a0_0x193669(0x1e1)]},'task':{'type':a0_0x193669(0x1ef),'description':a0_0x193669(0x1d2)},'progress':{'type':'number','description':a0_0x193669(0x197)}},'required':[a0_0x193669(0x200)]}},{'name':a0_0x193669(0x1d5),'description':a0_0x193669(0x1ad),'inputSchema':{'type':a0_0x193669(0x1ba),'properties':{'alias':{'type':'string','description':a0_0x193669(0x1a0)},'task':{'type':'string','description':a0_0x193669(0x20d)},'priority':{'type':a0_0x193669(0x1ef),'enum':['high','normal',a0_0x193669(0x1b0)],'description':a0_0x193669(0x194)}},'required':[a0_0x193669(0x1b2),a0_0x193669(0x1fa)]}},{'name':'commhub_send_message','description':'Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','inputSchema':{'type':'object','properties':{'alias':{'type':a0_0x193669(0x1ef),'description':a0_0x193669(0x1a0)},'message':{'type':a0_0x193669(0x1ef),'description':a0_0x193669(0x1c2)}},'required':[a0_0x193669(0x1b2),a0_0x193669(0x1a5)]}},{'name':a0_0x193669(0x1a1),'description':'Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','inputSchema':{'type':a0_0x193669(0x1ba),'properties':{}}}]}));async function Y(_0x168976,_0x124495){const _0x5b522e=a0_0x193669;let _0x2470ce=await fetch(j+_0x5b522e(0x20f),{'method':_0x5b522e(0x199),'headers':{'Content-Type':'application/json','Accept':_0x5b522e(0x18e),...F?{'Authorization':_0x5b522e(0x1da)+F}:{}},'body':JSON['stringify']({'jsonrpc':'2.0','id':0x1,'method':_0x5b522e(0x198),'params':{'protocolVersion':'2025-03-26','capabilities':{},'clientInfo':{'name':_0x5b522e(0x1e0),'version':_0x5b522e(0x210)}}})});if(!_0x2470ce['ok']){let _0x43c200=await _0x2470ce[_0x5b522e(0x1b5)]();return W(_0x5b522e(0x1e7)+_0x2470ce[_0x5b522e(0x200)]+'\x20'+_0x43c200['slice'](0x0,0x64)),{'ok':!0x1,'error':'init\x20failed:\x20'+_0x2470ce[_0x5b522e(0x200)]};}await _0x2470ce[_0x5b522e(0x1b5)]();let _0x5af720=(await(await fetch(j+_0x5b522e(0x20f),{'method':_0x5b522e(0x199),'headers':{'Content-Type':'application/json','Accept':_0x5b522e(0x18e),...F?{'Authorization':_0x5b522e(0x1da)+F}:{}},'body':JSON[_0x5b522e(0x19d)]({'jsonrpc':_0x5b522e(0x1e3),'id':0x2,'method':_0x5b522e(0x209),'params':{'name':_0x168976,'arguments':_0x124495}})}))[_0x5b522e(0x1b5)]())[_0x5b522e(0x1e6)]('\x0a')[_0x5b522e(0x1c5)](_0x4f6d24=>_0x4f6d24[_0x5b522e(0x1c9)](_0x5b522e(0x1b4)));if(_0x5af720){let _0x4d72bd=JSON[_0x5b522e(0x21e)](_0x5af720[_0x5b522e(0x1ab)](0x6));return _0x4d72bd?.['result']?.['content']?.[0x0]?.['text']?JSON[_0x5b522e(0x21e)](_0x4d72bd[_0x5b522e(0x20a)][_0x5b522e(0x1c6)][0x0][_0x5b522e(0x1b5)]):_0x4d72bd;}return{'ok':!0x1,'error':_0x5b522e(0x1b1)};}x[a0_0x193669(0x1a8)](a0_0x1520fd,async _0x244963=>{const _0x778788=a0_0x193669;let {name:_0x48f7e9,arguments:_0x1639fe}=_0x244963[_0x778788(0x1b7)];if(_0x48f7e9===_0x778788(0x1de)){let {task_id:_0x187c97,text:_0x6adb20,status:_0x59f23f}=_0x1639fe;if(_0x59f23f===_0x778788(0x1ae)||_0x59f23f===_0x778788(0x193)||_0x59f23f==='cancelled'){let _0x31028a=_0x59f23f===_0x778788(0x1ae)?_0x778788(0x1a4):_0x59f23f,_0x37db71=_0x187c97?D['get'](_0x187c97)||_0x778788(0x217):_0x778788(0x217),_0x520dd7=await Y('send_reply',{'alias':_0x37db71,'text':_0x6adb20,'in_reply_to':_0x187c97||void 0x0,'status':_0x31028a,'from_session':G});if(_0x187c97)D[_0x778788(0x21f)](_0x187c97);return{'content':[{'type':_0x778788(0x1b5),'text':JSON['stringify'](_0x520dd7)}]};}let _0x163b96=await Y(_0x778788(0x212),{'resume_id':K,'alias':G,'status':_0x59f23f===_0x778788(0x1b3)?_0x778788(0x1b3):_0x59f23f===_0x778788(0x1e1)?'error':_0x778788(0x220),'task':_0x6adb20[_0x778788(0x1ab)](0x0,0xc8),'output':_0x6adb20});return{'content':[{'type':_0x778788(0x1b5),'text':JSON['stringify'](_0x163b96)}]};}if(_0x48f7e9==='commhub_report_status'){let {status:_0x5dac0d,task:_0x3236a8,progress:_0xc33f86}=_0x1639fe,_0x218117=await Y(_0x778788(0x212),{'resume_id':K,'alias':G,'status':_0x5dac0d,'task':_0x3236a8,'progress':_0xc33f86});return{'content':[{'type':_0x778788(0x1b5),'text':JSON[_0x778788(0x19d)](_0x218117)}]};}if(_0x48f7e9===_0x778788(0x1d5)){let {alias:_0x6cb6b8,task:_0x176a6a,priority:_0x305b0e}=_0x1639fe,_0x3cac46=await Y('send_task',{'alias':_0x6cb6b8,'task':_0x176a6a,'priority':_0x305b0e||_0x778788(0x191),'from_session':G});return{'content':[{'type':_0x778788(0x1b5),'text':JSON[_0x778788(0x19d)](_0x3cac46)}]};}if(_0x48f7e9===_0x778788(0x1cb)){let {alias:_0x1c102f,message:_0xed3ef7}=_0x1639fe,_0x59f59e=await Y('send_message',{'alias':_0x1c102f,'message':_0xed3ef7,'from_session':G});return{'content':[{'type':_0x778788(0x1b5),'text':JSON[_0x778788(0x19d)](_0x59f59e)}]};}if(_0x48f7e9===_0x778788(0x1a1)){let _0x4e0c26=await Y(_0x778788(0x205),{});return{'content':[{'type':_0x778788(0x1b5),'text':JSON[_0x778788(0x19d)](_0x4e0c26)}]};}return{'content':[{'type':_0x778788(0x1b5),'text':JSON['stringify']({'error':_0x778788(0x1d1)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x33edc8=a0_0x193669;try{await Y(_0x33edc8(0x212),{'resume_id':K,'alias':G,'status':'idle','server':a0_0x4ad13a(),'hostname':a0_0x4ad13a(),'agent':_0x33edc8(0x1f4),'project_dir':process[_0x33edc8(0x19a)](),'tmux_name':f||void 0x0}),W(_0x33edc8(0x216)+G+_0x33edc8(0x21b));}catch(_0x597ba7){W(_0x33edc8(0x221)+_0x597ba7);}}async function o(){const _0x1b9c74=a0_0x193669;let _0x54d47c=j+'/events/'+encodeURIComponent(G),_0x472a59={};if(F)_0x472a59['Authorization']=_0x1b9c74(0x1da)+F;W(_0x1b9c74(0x1aa)+_0x54d47c);let _0x2730b0=O,_0x3c5e4b=!0x0,_0x788c4e=null;while(!0x0){try{let _0x4e6f39=await fetch(_0x54d47c,{'headers':_0x472a59});if(!_0x4e6f39['ok']){if(W(_0x1b9c74(0x1af)+_0x4e6f39[_0x1b9c74(0x200)]+'\x20'+_0x4e6f39[_0x1b9c74(0x1f1)]),_0x788c4e=_0x788c4e??Date['now'](),Date[_0x1b9c74(0x213)]()-_0x788c4e>T){W(_0x1b9c74(0x1d7)+j+_0x1b9c74(0x203));return;}await N(_0x2730b0),_0x2730b0=Math[_0x1b9c74(0x1d9)](_0x2730b0*0x2,R);continue;}let _0x1958c6=_0x4e6f39[_0x1b9c74(0x1f8)][_0x1b9c74(0x20b)](),_0x50f421=new TextDecoder(),_0x54c148='';_0x2730b0=O;while(!0x0){let {done:_0x27b274,value:_0xd8f27f}=await _0x1958c6['read']();if(_0x27b274)break;_0x54c148+=_0x50f421[_0x1b9c74(0x1d6)](_0xd8f27f,{'stream':!0x0});let _0xbd4b97=_0x54c148[_0x1b9c74(0x1e6)]('\x0a\x0a');_0x54c148=_0xbd4b97[_0x1b9c74(0x219)]()||'';for(let _0x31f2d2 of _0xbd4b97){let _0x47f9eb=_0x31f2d2[_0x1b9c74(0x1e6)]('\x0a')['find'](_0x22f8ca=>_0x22f8ca['startsWith'](_0x1b9c74(0x1b4)));if(!_0x47f9eb)continue;try{let _0x4752d0=JSON['parse'](_0x47f9eb[_0x1b9c74(0x1ab)](0x6));if(await a(_0x4752d0),_0x4752d0[_0x1b9c74(0x1e4)]===_0x1b9c74(0x21a)){if(_0x788c4e=null,!_0x3c5e4b)await l();_0x3c5e4b=!0x1;}}catch(_0x437e2e){W(_0x1b9c74(0x1c8)+_0x437e2e);}}}W(_0x1b9c74(0x1a2));}catch(_0x35991c){W('SSE\x20connection\x20error:\x20'+_0x35991c);}if(_0x788c4e=_0x788c4e??Date[_0x1b9c74(0x213)](),Date['now']()-_0x788c4e>T){W(_0x1b9c74(0x1d7)+j+')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。');return;}await N(_0x2730b0),_0x2730b0=Math[_0x1b9c74(0x1d9)](_0x2730b0*0x2,R);}}async function a(_0x32771b){const _0x5978c7=a0_0x193669;if(_0x32771b['type']==='connected'){W(_0x5978c7(0x1ce)+G+'\x22');return;}if(_0x32771b[_0x5978c7(0x1e4)]===_0x5978c7(0x19e)){if(W('←\x20message\x20from\x20'+_0x32771b[_0x5978c7(0x1f7)]+':\x20'+_0x32771b[_0x5978c7(0x1a5)][_0x5978c7(0x1ab)](0x0,0x3c)),await x[_0x5978c7(0x1df)]({'method':_0x5978c7(0x214),'params':{'content':_0x32771b['message'],'meta':{'sender':_0x32771b[_0x5978c7(0x1f7)]||_0x5978c7(0x217),'sender_id':_0x5978c7(0x1d8),'user':_0x32771b[_0x5978c7(0x1f7)]||_0x5978c7(0x217),'priority':_0x5978c7(0x191)}}}),_0x32771b[_0x5978c7(0x202)])await Y(_0x5978c7(0x1f9),{'alias':G,'message_id':_0x32771b[_0x5978c7(0x202)]});return;}if(_0x32771b[_0x5978c7(0x1e4)]===_0x5978c7(0x1ff)||_0x32771b[_0x5978c7(0x1e4)]===_0x5978c7(0x21d)){W('←\x20'+_0x32771b['type']+_0x5978c7(0x207)+_0x32771b[_0x5978c7(0x1d0)]+'\x20priority='+(_0x32771b[_0x5978c7(0x1bb)]||_0x5978c7(0x191)));let _0x15e15b=await Y(_0x5978c7(0x192),{'alias':G,'limit':0x5});if(_0x15e15b?.['ok']&&_0x15e15b['messages']?.[_0x5978c7(0x1e2)]>0x0)for(let _0x1be1f6 of _0x15e15b['messages']){let _0x528625={'sender':_0x1be1f6['from_session']||'hub','sender_id':_0x5978c7(0x1d8),'user':_0x1be1f6[_0x5978c7(0x1d4)]||_0x5978c7(0x217),'task_id':_0x1be1f6['id'],'priority':_0x1be1f6['priority']||_0x5978c7(0x191)};D[_0x5978c7(0x21c)](_0x1be1f6['id'],_0x1be1f6['from_session']||_0x5978c7(0x217)),await x[_0x5978c7(0x1df)]({'method':_0x5978c7(0x214),'params':{'content':_0x1be1f6[_0x5978c7(0x1c6)],'meta':_0x528625}}),W('→\x20injected\x20task\x20'+_0x1be1f6['id'][_0x5978c7(0x1ab)](0x0,0x8)+_0x5978c7(0x206)+_0x1be1f6[_0x5978c7(0x1d4)]+':\x20'+_0x1be1f6[_0x5978c7(0x1c6)][_0x5978c7(0x1ab)](0x0,0x3c)),await Y(_0x5978c7(0x1f9),{'alias':G,'message_id':_0x1be1f6['id']});}}}async function n(){const _0x602df3=a0_0x193669;let _0x3540b6=new a0_0x58076e();await x[_0x602df3(0x18f)](_0x3540b6),W(_0x602df3(0x1eb)),W(_0x602df3(0x195)),o()['catch'](_0x45a77a=>W('SSE\x20fatal:\x20'+_0x45a77a)),Y(_0x602df3(0x212),{'resume_id':K,'alias':G,'status':_0x602df3(0x1db),'server':a0_0x4ad13a(),'hostname':a0_0x4ad13a(),'agent':_0x602df3(0x1f4),'project_dir':process[_0x602df3(0x19a)](),'tmux_name':f||void 0x0})['then'](()=>W(_0x602df3(0x1a6)+G+'\x22\x20('+K['slice'](0x0,0x8)+')'))[_0x602df3(0x1ca)](_0x6addf4=>W(_0x602df3(0x1bf)+_0x6addf4)),setInterval(()=>{const _0x2fab15=_0x602df3;Y(_0x2fab15(0x212),{'resume_id':K,'alias':G,'status':_0x2fab15(0x1db),'server':a0_0x4ad13a(),'hostname':a0_0x4ad13a(),'agent':'claude-code','project_dir':process['cwd'](),'tmux_name':f||void 0x0})[_0x2fab15(0x1ca)](_0x27cc4b=>W('heartbeat\x20failed:\x20'+_0x27cc4b));},0x2bf20),W(_0x602df3(0x201));}n()[a0_0x193669(0x1ca)](_0x583d21=>{const _0x1833cf=a0_0x193669;W(_0x1833cf(0x1b6)+_0x583d21),process[_0x1833cf(0x1ed)](0x1);});async function b(){const _0x25c833=a0_0x193669;W(_0x25c833(0x1a3)),await Y(_0x25c833(0x212),{'resume_id':K,'alias':G,'status':_0x25c833(0x1cd),'task':_0x25c833(0x1ec)})[_0x25c833(0x1ca)](()=>{}),process[_0x25c833(0x1ed)](0x0);}process[a0_0x193669(0x1cf)]['on'](a0_0x193669(0x204),()=>b()),process['on'](a0_0x193669(0x1fc),()=>b()),process['on']('SIGINT',()=>b());
2
+ const a0_0x15f4d9=a0_0x2ade;(function(_0x292073,_0x1ea9c2){const _0x2aad4f=a0_0x2ade,_0x2e6e37=_0x292073();while(!![]){try{const _0x1cb1a2=parseInt(_0x2aad4f(0x18d))/0x1+parseInt(_0x2aad4f(0x147))/0x2*(parseInt(_0x2aad4f(0x107))/0x3)+-parseInt(_0x2aad4f(0x115))/0x4+-parseInt(_0x2aad4f(0x119))/0x5+-parseInt(_0x2aad4f(0x19b))/0x6*(parseInt(_0x2aad4f(0x11f))/0x7)+-parseInt(_0x2aad4f(0xfe))/0x8*(-parseInt(_0x2aad4f(0x17e))/0x9)+parseInt(_0x2aad4f(0x16f))/0xa;if(_0x1cb1a2===_0x1ea9c2)break;else _0x2e6e37['push'](_0x2e6e37['shift']());}catch(_0x715d2f){_0x2e6e37['push'](_0x2e6e37['shift']());}}}(a0_0x4501,0xe74f4));import{readFileSync as a0_0x37dd53,existsSync as a0_0x42c8d7}from'fs';import{randomUUID as a0_0x11eb1d}from'crypto';import{join as a0_0x434ea2}from'path';import{hostname as a0_0x237be6}from'os';import{execSync as a0_0x5c9412}from'child_process';import{Server as a0_0x23ed3b}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x246d70}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x1cc1ee,CallToolRequestSchema as a0_0x14e8b6}from'@modelcontextprotocol/sdk/types.js';function I(_0xf1e101){const _0x40e9a1=a0_0x2ade;if(!a0_0x42c8d7(_0xf1e101))return;for(let _0x5d428f of a0_0x37dd53(_0xf1e101,_0x40e9a1(0x192))[_0x40e9a1(0x113)]('\x0a')){let _0x54ed27=_0x5d428f[_0x40e9a1(0x175)]();if(!_0x54ed27||_0x54ed27['startsWith']('#'))continue;let _0x594886=_0x54ed27[_0x40e9a1(0x18e)]('=');if(_0x594886<0x0)continue;let _0x3b7c0b=_0x54ed27[_0x40e9a1(0x16c)](0x0,_0x594886)['trim'](),_0x1b5861=_0x54ed27[_0x40e9a1(0x16c)](_0x594886+0x1)['trim']()[_0x40e9a1(0x14e)](/^["']|["']$/g,'');if(!process.env[_0x3b7c0b])process.env[_0x3b7c0b]=_0x1b5861;}}var L=process.env.HOME||'~',U=a0_0x434ea2(L,a0_0x15f4d9(0x17f));I(a0_0x434ea2(U,a0_0x15f4d9(0x170)));var v=process[a0_0x15f4d9(0x18f)]()[a0_0x15f4d9(0x14e)](/\//g,'-');I(a0_0x434ea2(U,v,'.env'));function d(){const _0x33b9e2=a0_0x15f4d9;try{return a0_0x5c9412('tmux\x20display-message\x20-p\x20\x27#S\x27',{'encoding':_0x33b9e2(0x192),'timeout':0x7d0})[_0x33b9e2(0x175)]();}catch{return'';}}function m(){const _0x4c3005=a0_0x15f4d9;try{let _0x20b3d9=a0_0x434ea2(L,_0x4c3005(0x11c),'config.json');if(a0_0x42c8d7(_0x20b3d9))return JSON[_0x4c3005(0x178)](a0_0x37dd53(_0x20b3d9,_0x4c3005(0x192)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x15f4d9(0x137)]||a0_0x15f4d9(0x138),f=process.env.COMMHUB_TMUX||d();function r(){const _0x95f1d7=a0_0x15f4d9;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS['trim']())return process.env.COMMHUB_ALIAS[_0x95f1d7(0x175)]();return process['stderr'][_0x95f1d7(0x112)](_0x95f1d7(0x10c)+(_0x95f1d7(0x177)+(f||_0x95f1d7(0x116))+_0x95f1d7(0x162)+a0_0x237be6()+_0x95f1d7(0x128))),'unattributed-'+process[_0x95f1d7(0x197)];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x11eb1d(),F=process.env.COMMHUB_TOKEN||u[a0_0x15f4d9(0x12f)]||'';function W(_0x3484a7){const _0x1b9689=a0_0x15f4d9;let _0x1f39ba=new Date()['toTimeString']()['slice'](0x0,0x8);process[_0x1b9689(0x15c)][_0x1b9689(0x112)]('['+_0x1f39ba+_0x1b9689(0x14d)+_0x3484a7+'\x0a');}function N(_0x1ea835){return new Promise(_0x1db6a8=>setTimeout(_0x1db6a8,_0x1ea835));}function a0_0x2ade(_0x5bec9b,_0x4765fc){_0x5bec9b=_0x5bec9b-0xfd;const _0x4501be=a0_0x4501();let _0x2aded2=_0x4501be[_0x5bec9b];return _0x2aded2;}W(a0_0x15f4d9(0x10e)+j+a0_0x15f4d9(0x198)+G+a0_0x15f4d9(0x19d)+K[a0_0x15f4d9(0x16c)](0x0,0x8)+a0_0x15f4d9(0x12b)+(f||a0_0x15f4d9(0x185))+a0_0x15f4d9(0x121)+process[a0_0x15f4d9(0x18f)]()+'\x20PROJECT_ENV='+v);var D=new Map(),x=new a0_0x23ed3b({'name':a0_0x15f4d9(0x13c),'version':a0_0x15f4d9(0x163)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x15f4d9(0x11d),a0_0x15f4d9(0x12e),'Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.',a0_0x15f4d9(0x144),a0_0x15f4d9(0x18c)+G][a0_0x15f4d9(0x11b)]('\x0a')});x[a0_0x15f4d9(0x19a)](a0_0x1cc1ee,async()=>({'tools':[{'name':a0_0x15f4d9(0x176),'description':'Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','inputSchema':{'type':a0_0x15f4d9(0x131),'properties':{'task_id':{'type':a0_0x15f4d9(0x159),'description':a0_0x15f4d9(0x10b)},'text':{'type':'string','description':a0_0x15f4d9(0x140)},'status':{'type':'string','enum':['completed',a0_0x15f4d9(0x199),a0_0x15f4d9(0x130),a0_0x15f4d9(0x134),a0_0x15f4d9(0x125),a0_0x15f4d9(0x154)],'description':a0_0x15f4d9(0x174)}},'required':[a0_0x15f4d9(0x12c)]}},{'name':a0_0x15f4d9(0x102),'description':'Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','inputSchema':{'type':a0_0x15f4d9(0x131),'properties':{'status':{'type':a0_0x15f4d9(0x159),'enum':[a0_0x15f4d9(0x15e),a0_0x15f4d9(0x16a),a0_0x15f4d9(0x134),a0_0x15f4d9(0x125)]},'task':{'type':a0_0x15f4d9(0x159),'description':a0_0x15f4d9(0x148)},'progress':{'type':'number','description':a0_0x15f4d9(0x167)}},'required':[a0_0x15f4d9(0x15f)]}},{'name':'commhub_send_task','description':a0_0x15f4d9(0x16e),'inputSchema':{'type':'object','properties':{'alias':{'type':a0_0x15f4d9(0x159),'description':a0_0x15f4d9(0x103)},'task':{'type':'string','description':a0_0x15f4d9(0x171)},'priority':{'type':a0_0x15f4d9(0x159),'enum':[a0_0x15f4d9(0x179),a0_0x15f4d9(0x111),a0_0x15f4d9(0x166)],'description':a0_0x15f4d9(0x13e)}},'required':['alias',a0_0x15f4d9(0x146)]}},{'name':a0_0x15f4d9(0x183),'description':a0_0x15f4d9(0x150),'inputSchema':{'type':a0_0x15f4d9(0x131),'properties':{'alias':{'type':a0_0x15f4d9(0x159),'description':a0_0x15f4d9(0x103)},'message':{'type':a0_0x15f4d9(0x159),'description':a0_0x15f4d9(0x182)}},'required':[a0_0x15f4d9(0x118),'message']}},{'name':a0_0x15f4d9(0x139),'description':a0_0x15f4d9(0x189),'inputSchema':{'type':'object','properties':{}}}]}));async function Y(_0x23f82d,_0x2f25fa){const _0x41b335=a0_0x15f4d9;let _0x120e4d=await fetch(j+_0x41b335(0x10f),{'method':_0x41b335(0x100),'headers':{'Content-Type':'application/json','Accept':'application/json,\x20text/event-stream',...F?{'Authorization':_0x41b335(0x15b)+F}:{}},'body':JSON[_0x41b335(0x12a)]({'jsonrpc':_0x41b335(0x126),'id':0x1,'method':_0x41b335(0xff),'params':{'protocolVersion':'2025-03-26','capabilities':{},'clientInfo':{'name':_0x41b335(0x13c),'version':_0x41b335(0x163)}}})});if(!_0x120e4d['ok']){let _0x34c0cc=await _0x120e4d[_0x41b335(0x12c)]();return W(_0x41b335(0x191)+_0x120e4d[_0x41b335(0x15f)]+'\x20'+_0x34c0cc[_0x41b335(0x16c)](0x0,0x64)),{'ok':!0x1,'error':'init\x20failed:\x20'+_0x120e4d[_0x41b335(0x15f)]};}await _0x120e4d[_0x41b335(0x12c)]();let _0x531abb=(await(await fetch(j+_0x41b335(0x10f),{'method':_0x41b335(0x100),'headers':{'Content-Type':_0x41b335(0x133),'Accept':_0x41b335(0x143),...F?{'Authorization':_0x41b335(0x15b)+F}:{}},'body':JSON[_0x41b335(0x12a)]({'jsonrpc':_0x41b335(0x126),'id':0x2,'method':'tools/call','params':{'name':_0x23f82d,'arguments':_0x2f25fa}})}))[_0x41b335(0x12c)]())[_0x41b335(0x113)]('\x0a')[_0x41b335(0x114)](_0x3b2957=>_0x3b2957['startsWith'](_0x41b335(0x122)));if(_0x531abb){let _0x3b1479=JSON[_0x41b335(0x178)](_0x531abb['slice'](0x6));return _0x3b1479?.[_0x41b335(0x173)]?.[_0x41b335(0x18b)]?.[0x0]?.[_0x41b335(0x12c)]?JSON[_0x41b335(0x178)](_0x3b1479[_0x41b335(0x173)]['content'][0x0][_0x41b335(0x12c)]):_0x3b1479;}return{'ok':!0x1,'error':_0x41b335(0x181)};}x['setRequestHandler'](a0_0x14e8b6,async _0x5f5af3=>{const _0x544e9b=a0_0x15f4d9;let {name:_0x2b0297,arguments:_0x3b41dc}=_0x5f5af3[_0x544e9b(0x104)];if(_0x2b0297===_0x544e9b(0x176)){let {task_id:_0x3c469d,text:_0x3c71b9,status:_0x3b796c}=_0x3b41dc;if(_0x3b796c===_0x544e9b(0x101)||_0x3b796c===_0x544e9b(0x199)||_0x3b796c===_0x544e9b(0x130)){let _0x202d26=_0x3b796c===_0x544e9b(0x101)?_0x544e9b(0x145):_0x3b796c,_0x3fb581=_0x3c469d?D[_0x544e9b(0x13f)](_0x3c469d)||_0x544e9b(0x137):_0x544e9b(0x137),_0x2ab1cc=await Y('send_reply',{'alias':_0x3fb581,'text':_0x3c71b9,'in_reply_to':_0x3c469d||void 0x0,'status':_0x202d26,'from_session':G});if(_0x3c469d)D[_0x544e9b(0xfd)](_0x3c469d);return{'content':[{'type':'text','text':JSON['stringify'](_0x2ab1cc)}]};}let _0x1af9d3=await Y(_0x544e9b(0x11e),{'resume_id':K,'alias':G,'status':_0x3b796c===_0x544e9b(0x134)?_0x544e9b(0x134):_0x3b796c===_0x544e9b(0x125)?_0x544e9b(0x125):_0x544e9b(0x15e),'task':_0x3c71b9[_0x544e9b(0x16c)](0x0,0xc8),'output':_0x3c71b9});return{'content':[{'type':_0x544e9b(0x12c),'text':JSON[_0x544e9b(0x12a)](_0x1af9d3)}]};}if(_0x2b0297===_0x544e9b(0x102)){let {status:_0x1ec5c4,task:_0x474b26,progress:_0x5265fb}=_0x3b41dc,_0xe719c5=await Y(_0x544e9b(0x11e),{'resume_id':K,'alias':G,'status':_0x1ec5c4,'task':_0x474b26,'progress':_0x5265fb});return{'content':[{'type':_0x544e9b(0x12c),'text':JSON[_0x544e9b(0x12a)](_0xe719c5)}]};}if(_0x2b0297==='commhub_send_task'){let {alias:_0x1a2027,task:_0x33358b,priority:_0x3d67bf}=_0x3b41dc,_0xab37b7=await Y(_0x544e9b(0x15a),{'alias':_0x1a2027,'task':_0x33358b,'priority':_0x3d67bf||_0x544e9b(0x111),'from_session':G});return{'content':[{'type':_0x544e9b(0x12c),'text':JSON[_0x544e9b(0x12a)](_0xab37b7)}]};}if(_0x2b0297===_0x544e9b(0x183)){let {alias:_0x32e534,message:_0x28bde7}=_0x3b41dc,_0x1bb4f1=await Y('send_message',{'alias':_0x32e534,'message':_0x28bde7,'from_session':G});return{'content':[{'type':'text','text':JSON[_0x544e9b(0x12a)](_0x1bb4f1)}]};}if(_0x2b0297==='commhub_get_all_status'){let _0x56ebb6=await Y(_0x544e9b(0x129),{});return{'content':[{'type':'text','text':JSON[_0x544e9b(0x12a)](_0x56ebb6)}]};}return{'content':[{'type':_0x544e9b(0x12c),'text':JSON['stringify']({'error':_0x544e9b(0x13a)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x2695a0=a0_0x15f4d9;try{await Y(_0x2695a0(0x11e),{'resume_id':K,'alias':G,'status':_0x2695a0(0x16a),'server':a0_0x237be6(),'hostname':a0_0x237be6(),'agent':_0x2695a0(0x161),'project_dir':process['cwd'](),'tmux_name':f||void 0x0}),W(_0x2695a0(0x155)+G+_0x2695a0(0x136));}catch(_0x2a073f){W('re-register\x20failed:\x20'+_0x2a073f);}}async function o(){const _0x1bdfe1=a0_0x15f4d9;let _0x33cfc7=j+_0x1bdfe1(0x152)+encodeURIComponent(G),_0x4f9aed={};if(F)_0x4f9aed[_0x1bdfe1(0x18a)]='Bearer\x20'+F;W(_0x1bdfe1(0x180)+_0x33cfc7);let _0xbf5fa6=O,_0x36bd05=!0x0,_0x4a8f52=null;while(!0x0){try{let _0x305ba5=await fetch(_0x33cfc7,{'headers':_0x4f9aed});if(!_0x305ba5['ok']){if(W('SSE\x20error:\x20'+_0x305ba5[_0x1bdfe1(0x15f)]+'\x20'+_0x305ba5[_0x1bdfe1(0x153)]),_0x4a8f52=_0x4a8f52??Date[_0x1bdfe1(0x186)](),Date['now']()-_0x4a8f52>T){W(_0x1bdfe1(0x184)+j+_0x1bdfe1(0x13b));return;}await N(_0xbf5fa6),_0xbf5fa6=Math[_0x1bdfe1(0x19c)](_0xbf5fa6*0x2,R);continue;}let _0x533cb3=_0x305ba5[_0x1bdfe1(0x14f)][_0x1bdfe1(0x17b)](),_0x20e01c=new TextDecoder(),_0x2a85d5='';_0xbf5fa6=O;while(!0x0){let {done:_0x37d50e,value:_0x48b716}=await _0x533cb3[_0x1bdfe1(0x10d)]();if(_0x37d50e)break;_0x2a85d5+=_0x20e01c[_0x1bdfe1(0x160)](_0x48b716,{'stream':!0x0});let _0x1df06d=_0x2a85d5[_0x1bdfe1(0x113)]('\x0a\x0a');_0x2a85d5=_0x1df06d[_0x1bdfe1(0x10a)]()||'';for(let _0x4b5117 of _0x1df06d){let _0x1750a0=_0x4b5117[_0x1bdfe1(0x113)]('\x0a')[_0x1bdfe1(0x114)](_0x20c240=>_0x20c240[_0x1bdfe1(0x195)](_0x1bdfe1(0x122)));if(!_0x1750a0)continue;try{let _0x54b141=JSON['parse'](_0x1750a0[_0x1bdfe1(0x16c)](0x6));if(await a(_0x54b141),_0x54b141[_0x1bdfe1(0x193)]==='connected'){if(_0x4a8f52=null,!_0x36bd05)await l();_0x36bd05=!0x1;}}catch(_0x4ef405){W(_0x1bdfe1(0x14c)+_0x4ef405);}}}W(_0x1bdfe1(0x110));}catch(_0x2cc933){W(_0x1bdfe1(0x135)+_0x2cc933);}if(_0x4a8f52=_0x4a8f52??Date[_0x1bdfe1(0x186)](),Date[_0x1bdfe1(0x186)]()-_0x4a8f52>T){W(_0x1bdfe1(0x184)+j+_0x1bdfe1(0x13b));return;}await N(_0xbf5fa6),_0xbf5fa6=Math[_0x1bdfe1(0x19c)](_0xbf5fa6*0x2,R);}}async function a(_0x598cc1){const _0x53b639=a0_0x15f4d9;if(_0x598cc1[_0x53b639(0x193)]===_0x53b639(0x123)){W(_0x53b639(0x196)+G+'\x22');return;}if(_0x598cc1['type']===_0x53b639(0x142)){if(W(_0x53b639(0x156)+_0x598cc1[_0x53b639(0x151)]+':\x20'+_0x598cc1['message'][_0x53b639(0x16c)](0x0,0x3c)),await x[_0x53b639(0x157)]({'method':'notifications/claude/channel','params':{'content':_0x598cc1[_0x53b639(0x158)],'meta':{'sender':_0x598cc1[_0x53b639(0x151)]||_0x53b639(0x137),'sender_id':'commhub','user':_0x598cc1[_0x53b639(0x151)]||_0x53b639(0x137),'priority':'normal'}}}),_0x598cc1[_0x53b639(0x141)])await Y(_0x53b639(0x105),{'alias':G,'message_id':_0x598cc1[_0x53b639(0x141)]});return;}if(_0x598cc1[_0x53b639(0x193)]===_0x53b639(0x172)||_0x598cc1[_0x53b639(0x193)]==='broadcast'){W('←\x20'+_0x598cc1[_0x53b639(0x193)]+':\x20inbox_count='+_0x598cc1[_0x53b639(0x165)]+_0x53b639(0x13d)+(_0x598cc1[_0x53b639(0x149)]||_0x53b639(0x111)));let _0x56e576=await Y('get_inbox',{'alias':G,'limit':0x5});if(_0x56e576?.['ok']&&_0x56e576[_0x53b639(0x11a)]?.[_0x53b639(0x108)]>0x0)for(let _0x23d285 of _0x56e576['messages']){let _0x107147={'sender':_0x23d285[_0x53b639(0x124)]||_0x53b639(0x137),'sender_id':_0x53b639(0x109),'user':_0x23d285['from_session']||'hub','task_id':_0x23d285['id'],'priority':_0x23d285['priority']||_0x53b639(0x111)};D[_0x53b639(0x127)](_0x23d285['id'],_0x23d285[_0x53b639(0x124)]||_0x53b639(0x137)),await x[_0x53b639(0x157)]({'method':_0x53b639(0x190),'params':{'content':_0x23d285[_0x53b639(0x18b)],'meta':_0x107147}}),W(_0x53b639(0x188)+_0x23d285['id'][_0x53b639(0x16c)](0x0,0x8)+'\x20from\x20'+_0x23d285['from_session']+':\x20'+_0x23d285['content'][_0x53b639(0x16c)](0x0,0x3c)),await Y('ack_inbox',{'alias':G,'message_id':_0x23d285['id']});}}}function a0_0x4501(){const _0x6cac2d=['delete','50808MTtBtu','initialize','POST','completed','commhub_report_status','Target\x20session\x20alias','params','ack_inbox','offline','6kuKwgv','length','commhub','pop','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','read','ENV:\x20URL=','/mcp','SSE\x20stream\x20ended,\x20reconnecting...','normal','write','split','find','6360224cceeZl','(none)','stdin','alias','8666325DAPEBr','messages','join','.anet','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>','report_status','952469PecTou','SIGINT','\x20CWD=','data:\x20','connected','from_session','error','2.0','set','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','get_all_status','stringify','...\x20TMUX=','text','fatal:\x20','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','token','cancelled','object','SIGTERM','application/json','blocked','SSE\x20connection\x20error:\x20','\x22\x20after\x20SSE\x20reconnect','hub','http://127.0.0.1:9200','commhub_get_all_status','unknown\x20tool',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','commhub-channel','\x20priority=','Priority\x20(default:\x20normal)','get','Reply\x20text\x20/\x20result\x20summary','message_id','new_message','application/json,\x20text/event-stream','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','replied','task','906156sglHKg','Current\x20task\x20description','priority','heartbeat\x20failed:\x20','then','parse\x20error:\x20',']\x20[commhub]\x20','replace','body','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','from','/events/','statusText','in_progress','re-registered\x20as\x20\x22','←\x20message\x20from\x20','notification','message','string','send_task','Bearer\x20','stderr','warning:\x20could\x20not\x20register:\x20','working','status','decode','claude-code','\x20/\x20hostname=','0.3.0','session\x20disconnected','inbox_count','low','Progress\x200-100','MCP\x20stdio\x20connected','exit','idle','shutting\x20down,\x20reporting\x20offline...','slice','ready\x20—\x20waiting\x20for\x20events','Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','29466220DuRAdr','.env','Task\x20content','new_task','result','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','trim','commhub_reply','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','parse','high','catch','getReader','\x22\x20(','connect','495ZWUGjY','.claude/channels/commhub','connecting\x20to\x20','no\x20response','Message\x20content','commhub_send_message','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','none','now','starting\x20SSE\x20listener...','→\x20injected\x20task\x20','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','Authorization','content','Session\x20alias:\x20','1565419vuDdEz','indexOf','cwd','notifications/claude/channel','CommHub\x20init\x20failed:\x20','utf-8','type','end','startsWith','SSE\x20connected\x20as\x20\x22','pid','\x20ALIAS=','failed','setRequestHandler','66RrCwQc','min','\x20RESUME_ID='];a0_0x4501=function(){return _0x6cac2d;};return a0_0x4501();}async function n(){const _0x2c16fb=a0_0x15f4d9;let _0x59ee4f=new a0_0x246d70();await x[_0x2c16fb(0x17d)](_0x59ee4f),W(_0x2c16fb(0x168)),W(_0x2c16fb(0x187)),o()['catch'](_0x59681d=>W('SSE\x20fatal:\x20'+_0x59681d)),Y(_0x2c16fb(0x11e),{'resume_id':K,'alias':G,'status':_0x2c16fb(0x16a),'server':a0_0x237be6(),'hostname':a0_0x237be6(),'agent':_0x2c16fb(0x161),'project_dir':process[_0x2c16fb(0x18f)](),'tmux_name':f||void 0x0})[_0x2c16fb(0x14b)](()=>W('registered\x20as\x20\x22'+G+_0x2c16fb(0x17c)+K[_0x2c16fb(0x16c)](0x0,0x8)+')'))[_0x2c16fb(0x17a)](_0x253dbc=>W(_0x2c16fb(0x15d)+_0x253dbc)),setInterval(()=>{const _0x535dd4=_0x2c16fb;Y(_0x535dd4(0x11e),{'resume_id':K,'alias':G,'status':'idle','server':a0_0x237be6(),'hostname':a0_0x237be6(),'agent':'claude-code','project_dir':process[_0x535dd4(0x18f)](),'tmux_name':f||void 0x0})[_0x535dd4(0x17a)](_0x31b110=>W(_0x535dd4(0x14a)+_0x31b110));},0x2bf20),W(_0x2c16fb(0x16d));}n()['catch'](_0x1b8f2d=>{const _0x50c31e=a0_0x15f4d9;W(_0x50c31e(0x12d)+_0x1b8f2d),process[_0x50c31e(0x169)](0x1);});async function b(){const _0x549aac=a0_0x15f4d9;W(_0x549aac(0x16b)),await Y(_0x549aac(0x11e),{'resume_id':K,'alias':G,'status':_0x549aac(0x106),'task':_0x549aac(0x164)})[_0x549aac(0x17a)](()=>{}),process[_0x549aac(0x169)](0x0);}process[a0_0x15f4d9(0x117)]['on'](a0_0x15f4d9(0x194),()=>b()),process['on'](a0_0x15f4d9(0x132),()=>b()),process['on'](a0_0x15f4d9(0x120),()=>b());
@@ -0,0 +1,9 @@
1
+ export type RuntimeName = "claude-code-cli" | "codex-sdk" | "claude-agent-sdk" | "grok-build-acp";
2
+ /** Operator-facing default for any runtime slot that comes in empty / missing / unrecognized. */
3
+ export declare const DEFAULT_RUNTIME: RuntimeName;
4
+ type ProfileLike = {
5
+ runtime?: string;
6
+ codexRuntime?: string;
7
+ };
8
+ export declare function normalizeRuntime(profileOrRuntime?: ProfileLike | string): RuntimeName;
9
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network",
3
- "version": "2.3.0-preview.2",
3
+ "version": "2.3.0-preview.3",
4
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",