@sleep2agi/agent-network 2.3.0-preview.2 → 2.3.0-preview.4

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
+ function a0_0x1b4a(_0x20b83e,_0x424c1c){_0x20b83e=_0x20b83e-0x1b9;const _0x1be9b5=a0_0x1be9();let _0x1b4afe=_0x1be9b5[_0x20b83e];return _0x1b4afe;}const a0_0x18f1eb=a0_0x1b4a;function a0_0x1be9(){const _0x53ac8f=['application/json','sdk-','processInbox','sdk','parse','body','ack_inbox','agent','text','POST','cwd','9FEzhgA','status','text/event-stream','send_reply','log','slice','min','connectSSE','new_task','new_message','tools/call','35826gtIMkF','report_status','reconnectDelay','send','205361RXDODK','match','type','messages','call','6315128hpwPVu','s...','heartbeat\x20failed:\x20','token','234GjDFCc','url','toTimeString','SSE\x20failed:\x20','alias','decode','pop','get_inbox','result','/mcp','57550NbZbyM','broadcast','SSE\x20connected','connect','connected','Authorization','12030630sgXszq','autoConnect','toString','getReader','data:\x20','sseAbort','content','signal','idle','error','emit',']\x20[commhub:','resumeId','4801734hWoLCt','message','getAllStatus','inbox\x20error:\x20','send_task','server','disconnected','reply','heartbeatInterval','from_session','Bearer\x20','2.0','send_message','2037516OMBPBZ','stringify','completed','registered','sleep','now','heartbeatTimer','AbortError','catch','running','118lrtnUT','offline'];a0_0x1be9=function(){return _0x53ac8f;};return a0_0x1be9();}(function(_0x1bbcb7,_0x59746d){const _0x17ce5b=a0_0x1b4a,_0x8590de=_0x1bbcb7();while(!![]){try{const _0x3684fa=-parseInt(_0x17ce5b(0x1ea))/0x1+parseInt(_0x17ce5b(0x1ce))/0x2*(-parseInt(_0x17ce5b(0x1e6))/0x3)+parseInt(_0x17ce5b(0x1c4))/0x4+parseInt(_0x17ce5b(0x1fd))/0x5*(-parseInt(_0x17ce5b(0x1f3))/0x6)+-parseInt(_0x17ce5b(0x210))/0x7+-parseInt(_0x17ce5b(0x1ef))/0x8*(-parseInt(_0x17ce5b(0x1db))/0x9)+parseInt(_0x17ce5b(0x203))/0xa;if(_0x3684fa===_0x59746d)break;else _0x8590de['push'](_0x8590de['shift']());}catch(_0x5b3a29){_0x8590de['push'](_0x8590de['shift']());}}}(a0_0x1be9,0x6f952));import{EventEmitter as a0_0x2ec4a1}from'events';import{hostname as a0_0xcedff1}from'os';class T extends a0_0x2ec4a1{[a0_0x18f1eb(0x1f4)];['alias'];[a0_0x18f1eb(0x1f2)];[a0_0x18f1eb(0x1d7)];[a0_0x18f1eb(0x20f)];['heartbeatInterval'];['reconnectDelay'];['heartbeatTimer'];[a0_0x18f1eb(0x208)];[a0_0x18f1eb(0x1cd)]=!0x1;constructor(_0x75a67){const _0x5655a=a0_0x18f1eb;super();if(this[_0x5655a(0x1f4)]=_0x75a67[_0x5655a(0x1f4)]['replace'](/\/$/,''),this['alias']=_0x75a67[_0x5655a(0x1f7)],this['token']=_0x75a67[_0x5655a(0x1f2)],this['agent']=_0x75a67[_0x5655a(0x1d7)]||_0x5655a(0x1d3),this['resumeId']=_0x5655a(0x1d1)+_0x75a67[_0x5655a(0x1f7)]+'-'+Date[_0x5655a(0x1c9)]()[_0x5655a(0x205)](0x24),this[_0x5655a(0x1bf)]=_0x75a67['heartbeatInterval']??0x2bf20,this['reconnectDelay']=_0x75a67[_0x5655a(0x1e8)]??0xbb8,_0x75a67[_0x5655a(0x204)]!==!0x1)this[_0x5655a(0x200)]();}[a0_0x18f1eb(0x1df)](_0x1239eb){const _0x408863=a0_0x18f1eb;console[_0x408863(0x1df)]('['+new Date()[_0x408863(0x1f5)]()['slice'](0x0,0x8)+_0x408863(0x20e)+this['alias']+']\x20'+_0x1239eb);}async[a0_0x18f1eb(0x1ee)](_0x28565e,_0x5c96aa){const _0x5347fc=a0_0x18f1eb;let _0x432bd8={'Content-Type':_0x5347fc(0x1d0),'Accept':'application/json,\x20text/event-stream'};if(this[_0x5347fc(0x1f2)])_0x432bd8[_0x5347fc(0x202)]=_0x5347fc(0x1c1)+this['token'];let _0x41a028=await(await fetch(this[_0x5347fc(0x1f4)]+_0x5347fc(0x1fc),{'method':_0x5347fc(0x1d9),'headers':_0x432bd8,'body':JSON[_0x5347fc(0x1c5)]({'jsonrpc':_0x5347fc(0x1c2),'id':Date[_0x5347fc(0x1c9)](),'method':_0x5347fc(0x1e5),'params':{'name':_0x28565e,'arguments':_0x5c96aa}})}))[_0x5347fc(0x1d8)](),_0x12da1a=_0x41a028[_0x5347fc(0x1eb)](/data: (.+)/),_0x2f5dbd=_0x12da1a?JSON[_0x5347fc(0x1d4)](_0x12da1a[0x1]):JSON[_0x5347fc(0x1d4)](_0x41a028),_0x438df3=_0x2f5dbd?.[_0x5347fc(0x1fb)]?.['content']?.[0x0]?.[_0x5347fc(0x1d8)];return _0x438df3?JSON[_0x5347fc(0x1d4)](_0x438df3):_0x2f5dbd;}async[a0_0x18f1eb(0x200)](){const _0x156b7e=a0_0x18f1eb;if(this['running'])return;this[_0x156b7e(0x1cd)]=!0x0,await this['status'](_0x156b7e(0x20b)),this[_0x156b7e(0x1df)](_0x156b7e(0x1c7)),this[_0x156b7e(0x1ca)]=setInterval(()=>{const _0xf9a1a2=_0x156b7e;this[_0xf9a1a2(0x1dc)](_0xf9a1a2(0x20b))[_0xf9a1a2(0x1cc)](_0x441651=>this[_0xf9a1a2(0x1df)](_0xf9a1a2(0x1f1)+_0x441651[_0xf9a1a2(0x211)]));},this[_0x156b7e(0x1bf)]),this[_0x156b7e(0x1e2)]();}async['disconnect'](){const _0x89c940=a0_0x18f1eb;if(this[_0x89c940(0x1cd)]=!0x1,this[_0x89c940(0x208)]?.['abort'](),this[_0x89c940(0x1ca)])clearInterval(this[_0x89c940(0x1ca)]);await this['status'](_0x89c940(0x1cf))[_0x89c940(0x1cc)](()=>{}),this[_0x89c940(0x1df)](_0x89c940(0x1bd));}async[a0_0x18f1eb(0x1e9)](_0x50240f,_0x5f075d,_0x540d03='normal'){const _0x504586=a0_0x18f1eb;return this['call'](_0x504586(0x1bb),{'alias':_0x50240f,'task':_0x5f075d,'priority':_0x540d03,'from_session':this['alias']});}async[a0_0x18f1eb(0x211)](_0x581196,_0x1e7262){const _0xd29dd9=a0_0x18f1eb;return this[_0xd29dd9(0x1ee)](_0xd29dd9(0x1c3),{'alias':_0x581196,'message':_0x1e7262,'from_session':this[_0xd29dd9(0x1f7)]});}async[a0_0x18f1eb(0x1be)](_0x480f4a,_0x408973,_0x1d4426=a0_0x18f1eb(0x1c6)){const _0x4f9f77=a0_0x18f1eb;return this[_0x4f9f77(0x1ee)](_0x4f9f77(0x1de),{'in_reply_to':_0x480f4a,'text':_0x408973,'status':_0x1d4426});}async[a0_0x18f1eb(0x1dc)](_0x141b38,_0x22c6d0){const _0x592027=a0_0x18f1eb;return this['call'](_0x592027(0x1e7),{'resume_id':this[_0x592027(0x20f)],'alias':this[_0x592027(0x1f7)],'status':_0x141b38,'server':a0_0xcedff1(),'hostname':a0_0xcedff1(),'agent':this[_0x592027(0x1d7)],'project_dir':process[_0x592027(0x1da)](),..._0x22c6d0});}async[a0_0x18f1eb(0x1b9)](){const _0x29fdbf=a0_0x18f1eb;return this[_0x29fdbf(0x1ee)]('get_all_status',{});}async[a0_0x18f1eb(0x1fe)](_0x2094b1,_0x138c23){const _0x221f79=a0_0x18f1eb;return this[_0x221f79(0x1ee)](_0x221f79(0x1fe),{'message':_0x2094b1,'filter_server':_0x138c23?.[_0x221f79(0x1bc)],'filter_status':_0x138c23?.[_0x221f79(0x1dc)]});}async[a0_0x18f1eb(0x1e2)](){const _0x5bd1b0=a0_0x18f1eb;let _0x99902=encodeURIComponent(this[_0x5bd1b0(0x1f7)]),_0x59f477=this[_0x5bd1b0(0x1f4)]+'/events/'+_0x99902,_0x1d1e41=this[_0x5bd1b0(0x1e8)];while(this[_0x5bd1b0(0x1cd)]){try{this[_0x5bd1b0(0x208)]=new AbortController();let _0x247406={'Accept':_0x5bd1b0(0x1dd)};if(this[_0x5bd1b0(0x1f2)])_0x247406[_0x5bd1b0(0x202)]='Bearer\x20'+this['token'];let _0x5afda3=await fetch(_0x59f477,{'headers':_0x247406,'signal':this[_0x5bd1b0(0x208)][_0x5bd1b0(0x20a)]});if(!_0x5afda3['ok']||!_0x5afda3[_0x5bd1b0(0x1d5)]){this[_0x5bd1b0(0x1df)](_0x5bd1b0(0x1f6)+_0x5afda3[_0x5bd1b0(0x1dc)]),await this[_0x5bd1b0(0x1c8)](_0x1d1e41),_0x1d1e41=Math[_0x5bd1b0(0x1e1)](_0x1d1e41*1.5,0xea60);continue;}_0x1d1e41=this[_0x5bd1b0(0x1e8)];let _0x1c50a0=_0x5afda3['body'][_0x5bd1b0(0x206)](),_0x22cd7d=new TextDecoder(),_0x3c7634='';while(this[_0x5bd1b0(0x1cd)]){let {done:_0x8ef69c,value:_0x58e2bf}=await _0x1c50a0['read']();if(_0x8ef69c)break;_0x3c7634+=_0x22cd7d[_0x5bd1b0(0x1f8)](_0x58e2bf,{'stream':!0x0});let _0x551170=_0x3c7634['split']('\x0a');_0x3c7634=_0x551170[_0x5bd1b0(0x1f9)]()||'';for(let _0x4581b3 of _0x551170){if(!_0x4581b3['startsWith'](_0x5bd1b0(0x207)))continue;try{let _0x320e27=JSON[_0x5bd1b0(0x1d4)](_0x4581b3[_0x5bd1b0(0x1e0)](0x6));if(_0x320e27[_0x5bd1b0(0x1ec)]==='connected'){this[_0x5bd1b0(0x1df)](_0x5bd1b0(0x1ff)),this['emit'](_0x5bd1b0(0x201));continue;}if(_0x320e27['type']===_0x5bd1b0(0x1e3)||_0x320e27['type']===_0x5bd1b0(0x1e4)||_0x320e27[_0x5bd1b0(0x1ec)]===_0x5bd1b0(0x1fe))await this[_0x5bd1b0(0x1d2)]();}catch{}}}}catch(_0x23760d){if(_0x23760d['name']===_0x5bd1b0(0x1cb))break;this[_0x5bd1b0(0x20d)](_0x5bd1b0(0x20c),_0x23760d),this[_0x5bd1b0(0x1df)]('SSE\x20error:\x20'+_0x23760d[_0x5bd1b0(0x211)]);}if(this[_0x5bd1b0(0x1cd)])this[_0x5bd1b0(0x20d)](_0x5bd1b0(0x1bd)),this[_0x5bd1b0(0x1df)]('SSE\x20reconnecting\x20in\x20'+_0x1d1e41/0x3e8+_0x5bd1b0(0x1f0)),await this['sleep'](_0x1d1e41),_0x1d1e41=Math[_0x5bd1b0(0x1e1)](_0x1d1e41*1.5,0xea60);}}async['processInbox'](){const _0x2decae=a0_0x18f1eb;try{let _0x19d6da=(await this[_0x2decae(0x1ee)](_0x2decae(0x1fa),{'alias':this[_0x2decae(0x1f7)],'limit':0xa}))?.[_0x2decae(0x1ed)]||[];for(let _0x4134f1 of _0x19d6da)await this[_0x2decae(0x1ee)](_0x2decae(0x1d6),{'alias':this['alias'],'message_id':_0x4134f1['id']}),this[_0x2decae(0x1df)]('←\x20'+_0x4134f1[_0x2decae(0x1c0)]+':\x20'+_0x4134f1[_0x2decae(0x209)]['slice'](0x0,0x3c)),this[_0x2decae(0x20d)]('task',_0x4134f1),this['emit']('message',_0x4134f1);}catch(_0x4e427b){this[_0x2decae(0x1df)](_0x2decae(0x1ba)+_0x4e427b[_0x2decae(0x211)]);}}['sleep'](_0x46346e){return new Promise(_0xc44451=>setTimeout(_0xc44451,_0x46346e));}}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_0x2cadd7=a0_0x1a70;(function(_0x4f6fe9,_0x3ae20f){const _0x5175bb=a0_0x1a70,_0x55d0b6=_0x4f6fe9();while(!![]){try{const _0x28043f=-parseInt(_0x5175bb(0xc9))/0x1+parseInt(_0x5175bb(0x111))/0x2*(-parseInt(_0x5175bb(0x102))/0x3)+parseInt(_0x5175bb(0x9f))/0x4+parseInt(_0x5175bb(0x90))/0x5+-parseInt(_0x5175bb(0xaf))/0x6*(-parseInt(_0x5175bb(0x7e))/0x7)+-parseInt(_0x5175bb(0xe4))/0x8*(parseInt(_0x5175bb(0x8f))/0x9)+parseInt(_0x5175bb(0xe1))/0xa;if(_0x28043f===_0x3ae20f)break;else _0x55d0b6['push'](_0x55d0b6['shift']());}catch(_0x4a531b){_0x55d0b6['push'](_0x55d0b6['shift']());}}}(a0_0x208b,0xa0c1a));import{readFileSync as a0_0x3c5cb3,existsSync as a0_0x180657}from'fs';import{randomUUID as a0_0x463c50}from'crypto';import{join as a0_0x26f6cc}from'path';import{hostname as a0_0x14132c}from'os';import{execSync as a0_0x263fad}from'child_process';import{Server as a0_0x3ad946}from'@modelcontextprotocol/sdk/server/index.js';function a0_0x1a70(_0x4a4f2f,_0x26c261){_0x4a4f2f=_0x4a4f2f-0x7e;const _0x208b20=a0_0x208b();let _0x1a709c=_0x208b20[_0x4a4f2f];return _0x1a709c;}import{StdioServerTransport as a0_0x3b24fd}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x38c89a,CallToolRequestSchema as a0_0x56a585}from'@modelcontextprotocol/sdk/types.js';function I(_0x4a6704){const _0x57d571=a0_0x1a70;if(!a0_0x180657(_0x4a6704))return;for(let _0x275ec2 of a0_0x3c5cb3(_0x4a6704,_0x57d571(0x85))['split']('\x0a')){let _0x2b2fe8=_0x275ec2[_0x57d571(0x86)]();if(!_0x2b2fe8||_0x2b2fe8[_0x57d571(0xcd)]('#'))continue;let _0x14e75b=_0x2b2fe8['indexOf']('=');if(_0x14e75b<0x0)continue;let _0x43b509=_0x2b2fe8[_0x57d571(0x9a)](0x0,_0x14e75b)['trim'](),_0x33f8db=_0x2b2fe8[_0x57d571(0x9a)](_0x14e75b+0x1)['trim']()['replace'](/^["']|["']$/g,'');if(!process.env[_0x43b509])process.env[_0x43b509]=_0x33f8db;}}var L=process.env.HOME||'~',U=a0_0x26f6cc(L,'.claude/channels/commhub');I(a0_0x26f6cc(U,'.env'));var v=process[a0_0x2cadd7(0x114)]()[a0_0x2cadd7(0x92)](/\//g,'-');I(a0_0x26f6cc(U,v,a0_0x2cadd7(0x104)));function d(){const _0x2164e8=a0_0x2cadd7;try{return a0_0x263fad('tmux\x20display-message\x20-p\x20\x27#S\x27',{'encoding':_0x2164e8(0x85),'timeout':0x7d0})['trim']();}catch{return'';}}function m(){const _0x586f57=a0_0x2cadd7;try{let _0x1ac11d=a0_0x26f6cc(L,_0x586f57(0x101),_0x586f57(0xd5));if(a0_0x180657(_0x1ac11d))return JSON[_0x586f57(0xee)](a0_0x3c5cb3(_0x1ac11d,_0x586f57(0x85)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x2cadd7(0xdb)]||a0_0x2cadd7(0x99),f=process.env.COMMHUB_TMUX||d();function r(){const _0x41ca4b=a0_0x2cadd7;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0x41ca4b(0x86)]())return process.env.COMMHUB_ALIAS['trim']();return process['stderr']['write'](_0x41ca4b(0x8a)+(_0x41ca4b(0x8d)+(f||_0x41ca4b(0xcc))+'\x20/\x20hostname='+a0_0x14132c()+_0x41ca4b(0xfd))),_0x41ca4b(0x108)+process[_0x41ca4b(0xd0)];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x463c50(),F=process.env.COMMHUB_TOKEN||u['token']||'';function a0_0x208b(){const _0x2047c3=['re-registered\x20as\x20\x22','find','object','Bearer\x20','/mcp','new_message',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','commhub_send_message','parse\x20error:\x20','cancelled','stringify','write','split','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','application/json','number','delete','.anet','1154199DeQRdZ','status','.env','MCP\x20stdio\x20connected','SSE\x20connection\x20error:\x20','SSE\x20connected\x20as\x20\x22','unattributed-','failed','SSE\x20stream\x20ended,\x20reconnecting...','\x20ALIAS=','low','Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','stderr','normal','\x20from\x20','6XAxgiD','high','warning:\x20could\x20not\x20register:\x20','cwd','commhub_send_task','application/json,\x20text/event-stream','get_all_status','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>','9040101thHTIA','string','heartbeat\x20failed:\x20','SIGINT','params','→\x20injected\x20task\x20','Reply\x20text\x20/\x20result\x20summary','utf-8','trim','init\x20failed:\x20','2025-03-26','pop','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.','9Wrgjnw','3363265mkRzTB','SIGTERM','replace','commhub_get_all_status','notifications/claude/channel','blocked','then','Target\x20session\x20alias','data:\x20','http://127.0.0.1:9200','slice',':\x20inbox_count=','←\x20message\x20from\x20','none','replied','478504cuRPfo','exit','report_status','set','\x20CWD=','get_inbox','SSE\x20fatal:\x20','CommHub\x20init\x20failed:\x20','\x22\x20after\x20SSE\x20reconnect','length','Message\x20content','read','message','re-register\x20failed:\x20','setRequestHandler','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','6QXrqWY','toTimeString','0.3.0','text','commhub_reply','completed','/events/','\x20PROJECT_ENV=','initialize','registered\x20as\x20\x22','now','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','...\x20TMUX=',']\x20[commhub]\x20','POST','Authorization','in_progress','working','connecting\x20to\x20','from_session','notification','send_message','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','commhub_report_status','claude-code','837060cxCtCq','Session\x20alias:\x20','inbox_count','(none)','startsWith','statusText','connect','pid','from','result','SSE\x20error:\x20','catch','config.json','shutting\x20down,\x20reporting\x20offline...','priority','error','connected','offline','hub','2.0','type','idle','decode','min','8515640TJXFGX','\x22\x20(','ready\x20—\x20waiting\x20for\x20events','2284552ZeOzfG','getReader','\x20priority=','commhub-channel','commhub','tools/call','no\x20response','message_id','content','\x20RESUME_ID=','parse','ack_inbox'];a0_0x208b=function(){return _0x2047c3;};return a0_0x208b();}function W(_0x4eeafc){const _0x29d353=a0_0x2cadd7;let _0xf8db39=new Date()[_0x29d353(0xb0)]()[_0x29d353(0x9a)](0x0,0x8);process[_0x29d353(0x10e)][_0x29d353(0xfb)]('['+_0xf8db39+_0x29d353(0xbc)+_0x4eeafc+'\x0a');}function N(_0xe21453){return new Promise(_0x588bd5=>setTimeout(_0x588bd5,_0xe21453));}W('ENV:\x20URL='+j+a0_0x2cadd7(0x10b)+G+a0_0x2cadd7(0xed)+K[a0_0x2cadd7(0x9a)](0x0,0x8)+a0_0x2cadd7(0xbb)+(f||a0_0x2cadd7(0x9d))+a0_0x2cadd7(0xa3)+process['cwd']()+a0_0x2cadd7(0xb6)+v);var D=new Map(),x=new a0_0x3ad946({'name':a0_0x2cadd7(0xe7),'version':a0_0x2cadd7(0xb1)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x2cadd7(0x119),a0_0x2cadd7(0x8b),a0_0x2cadd7(0x8e),a0_0x2cadd7(0xae),a0_0x2cadd7(0xca)+G]['join']('\x0a')});x[a0_0x2cadd7(0xad)](a0_0x38c89a,async()=>({'tools':[{'name':a0_0x2cadd7(0xb3),'description':'Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','inputSchema':{'type':a0_0x2cadd7(0xf2),'properties':{'task_id':{'type':a0_0x2cadd7(0x7f),'description':a0_0x2cadd7(0xc6)},'text':{'type':'string','description':a0_0x2cadd7(0x84)},'status':{'type':a0_0x2cadd7(0x7f),'enum':[a0_0x2cadd7(0xb4),a0_0x2cadd7(0x109),a0_0x2cadd7(0xf9),a0_0x2cadd7(0x95),a0_0x2cadd7(0xd8),a0_0x2cadd7(0xbf)],'description':a0_0x2cadd7(0x118)}},'required':[a0_0x2cadd7(0xb2)]}},{'name':a0_0x2cadd7(0xc7),'description':a0_0x2cadd7(0x10d),'inputSchema':{'type':a0_0x2cadd7(0xf2),'properties':{'status':{'type':'string','enum':[a0_0x2cadd7(0xc0),a0_0x2cadd7(0xde),a0_0x2cadd7(0x95),a0_0x2cadd7(0xd8)]},'task':{'type':a0_0x2cadd7(0x7f),'description':'Current\x20task\x20description'},'progress':{'type':a0_0x2cadd7(0xff),'description':'Progress\x200-100'}},'required':['status']}},{'name':a0_0x2cadd7(0x115),'description':'Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','inputSchema':{'type':a0_0x2cadd7(0xf2),'properties':{'alias':{'type':'string','description':a0_0x2cadd7(0x97)},'task':{'type':a0_0x2cadd7(0x7f),'description':'Task\x20content'},'priority':{'type':a0_0x2cadd7(0x7f),'enum':[a0_0x2cadd7(0x112),a0_0x2cadd7(0x10f),a0_0x2cadd7(0x10c)],'description':'Priority\x20(default:\x20normal)'}},'required':['alias','task']}},{'name':a0_0x2cadd7(0xf7),'description':a0_0x2cadd7(0x8c),'inputSchema':{'type':a0_0x2cadd7(0xf2),'properties':{'alias':{'type':a0_0x2cadd7(0x7f),'description':a0_0x2cadd7(0x97)},'message':{'type':a0_0x2cadd7(0x7f),'description':a0_0x2cadd7(0xa9)}},'required':['alias',a0_0x2cadd7(0xab)]}},{'name':'commhub_get_all_status','description':a0_0x2cadd7(0xba),'inputSchema':{'type':'object','properties':{}}}]}));async function Y(_0x320501,_0x549053){const _0x56de7f=a0_0x2cadd7;let _0x33c12e=await fetch(j+_0x56de7f(0xf4),{'method':_0x56de7f(0xbd),'headers':{'Content-Type':_0x56de7f(0xfe),'Accept':_0x56de7f(0x116),...F?{'Authorization':_0x56de7f(0xf3)+F}:{}},'body':JSON[_0x56de7f(0xfa)]({'jsonrpc':_0x56de7f(0xdc),'id':0x1,'method':_0x56de7f(0xb7),'params':{'protocolVersion':_0x56de7f(0x88),'capabilities':{},'clientInfo':{'name':_0x56de7f(0xe7),'version':_0x56de7f(0xb1)}}})});if(!_0x33c12e['ok']){let _0x16da2e=await _0x33c12e['text']();return W(_0x56de7f(0xa6)+_0x33c12e[_0x56de7f(0x103)]+'\x20'+_0x16da2e['slice'](0x0,0x64)),{'ok':!0x1,'error':_0x56de7f(0x87)+_0x33c12e[_0x56de7f(0x103)]};}await _0x33c12e[_0x56de7f(0xb2)]();let _0x55d10=(await(await fetch(j+_0x56de7f(0xf4),{'method':_0x56de7f(0xbd),'headers':{'Content-Type':_0x56de7f(0xfe),'Accept':_0x56de7f(0x116),...F?{'Authorization':'Bearer\x20'+F}:{}},'body':JSON['stringify']({'jsonrpc':_0x56de7f(0xdc),'id':0x2,'method':_0x56de7f(0xe9),'params':{'name':_0x320501,'arguments':_0x549053}})}))['text']())[_0x56de7f(0xfc)]('\x0a')[_0x56de7f(0xf1)](_0x17ccd4=>_0x17ccd4['startsWith'](_0x56de7f(0x98)));if(_0x55d10){let _0x4628f7=JSON[_0x56de7f(0xee)](_0x55d10[_0x56de7f(0x9a)](0x6));return _0x4628f7?.['result']?.[_0x56de7f(0xec)]?.[0x0]?.['text']?JSON['parse'](_0x4628f7[_0x56de7f(0xd2)]['content'][0x0][_0x56de7f(0xb2)]):_0x4628f7;}return{'ok':!0x1,'error':_0x56de7f(0xea)};}x[a0_0x2cadd7(0xad)](a0_0x56a585,async _0x2a9bed=>{const _0x474ae6=a0_0x2cadd7;let {name:_0x1e39fb,arguments:_0x1e0ade}=_0x2a9bed[_0x474ae6(0x82)];if(_0x1e39fb===_0x474ae6(0xb3)){let {task_id:_0x467d18,text:_0x5b2c19,status:_0x4dde24}=_0x1e0ade;if(_0x4dde24===_0x474ae6(0xb4)||_0x4dde24===_0x474ae6(0x109)||_0x4dde24===_0x474ae6(0xf9)){let _0x4d4e92=_0x4dde24===_0x474ae6(0xb4)?_0x474ae6(0x9e):_0x4dde24,_0x40dd15=_0x467d18?D['get'](_0x467d18)||_0x474ae6(0xdb):_0x474ae6(0xdb),_0x38f506=await Y('send_reply',{'alias':_0x40dd15,'text':_0x5b2c19,'in_reply_to':_0x467d18||void 0x0,'status':_0x4d4e92,'from_session':G});if(_0x467d18)D[_0x474ae6(0x100)](_0x467d18);return{'content':[{'type':'text','text':JSON['stringify'](_0x38f506)}]};}let _0x150ea4=await Y('report_status',{'resume_id':K,'alias':G,'status':_0x4dde24===_0x474ae6(0x95)?_0x474ae6(0x95):_0x4dde24==='error'?_0x474ae6(0xd8):_0x474ae6(0xc0),'task':_0x5b2c19[_0x474ae6(0x9a)](0x0,0xc8),'output':_0x5b2c19});return{'content':[{'type':_0x474ae6(0xb2),'text':JSON['stringify'](_0x150ea4)}]};}if(_0x1e39fb===_0x474ae6(0xc7)){let {status:_0x169633,task:_0x4d7da,progress:_0x522449}=_0x1e0ade,_0x25bf65=await Y(_0x474ae6(0xa1),{'resume_id':K,'alias':G,'status':_0x169633,'task':_0x4d7da,'progress':_0x522449});return{'content':[{'type':'text','text':JSON['stringify'](_0x25bf65)}]};}if(_0x1e39fb===_0x474ae6(0x115)){let {alias:_0x16e433,task:_0x54cf1d,priority:_0x252800}=_0x1e0ade,_0xe7b924=await Y('send_task',{'alias':_0x16e433,'task':_0x54cf1d,'priority':_0x252800||_0x474ae6(0x10f),'from_session':G});return{'content':[{'type':_0x474ae6(0xb2),'text':JSON['stringify'](_0xe7b924)}]};}if(_0x1e39fb===_0x474ae6(0xf7)){let {alias:_0xffcc6f,message:_0x451b00}=_0x1e0ade,_0x97737=await Y(_0x474ae6(0xc4),{'alias':_0xffcc6f,'message':_0x451b00,'from_session':G});return{'content':[{'type':_0x474ae6(0xb2),'text':JSON[_0x474ae6(0xfa)](_0x97737)}]};}if(_0x1e39fb===_0x474ae6(0x93)){let _0x502385=await Y(_0x474ae6(0x117),{});return{'content':[{'type':_0x474ae6(0xb2),'text':JSON['stringify'](_0x502385)}]};}return{'content':[{'type':_0x474ae6(0xb2),'text':JSON[_0x474ae6(0xfa)]({'error':'unknown\x20tool'})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x2230de=a0_0x2cadd7;try{await Y('report_status',{'resume_id':K,'alias':G,'status':'idle','server':a0_0x14132c(),'hostname':a0_0x14132c(),'agent':_0x2230de(0xc8),'project_dir':process[_0x2230de(0x114)](),'tmux_name':f||void 0x0}),W(_0x2230de(0xf0)+G+_0x2230de(0xa7));}catch(_0x422e78){W(_0x2230de(0xac)+_0x422e78);}}async function o(){const _0x15f365=a0_0x2cadd7;let _0x55adf7=j+_0x15f365(0xb5)+encodeURIComponent(G),_0x521acc={};if(F)_0x521acc[_0x15f365(0xbe)]=_0x15f365(0xf3)+F;W(_0x15f365(0xc1)+_0x55adf7);let _0x53068d=O,_0x43a692=!0x0,_0x2b324e=null;while(!0x0){try{let _0x2a6540=await fetch(_0x55adf7,{'headers':_0x521acc});if(!_0x2a6540['ok']){if(W(_0x15f365(0xd3)+_0x2a6540['status']+'\x20'+_0x2a6540[_0x15f365(0xce)]),_0x2b324e=_0x2b324e??Date[_0x15f365(0xb9)](),Date[_0x15f365(0xb9)]()-_0x2b324e>T){W(_0x15f365(0xc5)+j+_0x15f365(0xf6));return;}await N(_0x53068d),_0x53068d=Math[_0x15f365(0xe0)](_0x53068d*0x2,R);continue;}let _0x14f8fb=_0x2a6540['body'][_0x15f365(0xe5)](),_0x51cd85=new TextDecoder(),_0x57304a='';_0x53068d=O;while(!0x0){let {done:_0x4523cd,value:_0x3286c7}=await _0x14f8fb[_0x15f365(0xaa)]();if(_0x4523cd)break;_0x57304a+=_0x51cd85[_0x15f365(0xdf)](_0x3286c7,{'stream':!0x0});let _0x4b9b04=_0x57304a[_0x15f365(0xfc)]('\x0a\x0a');_0x57304a=_0x4b9b04[_0x15f365(0x89)]()||'';for(let _0x2626ed of _0x4b9b04){let _0xd561f5=_0x2626ed[_0x15f365(0xfc)]('\x0a')['find'](_0x504040=>_0x504040[_0x15f365(0xcd)]('data:\x20'));if(!_0xd561f5)continue;try{let _0x1c3f81=JSON[_0x15f365(0xee)](_0xd561f5[_0x15f365(0x9a)](0x6));if(await a(_0x1c3f81),_0x1c3f81[_0x15f365(0xdd)]===_0x15f365(0xd9)){if(_0x2b324e=null,!_0x43a692)await l();_0x43a692=!0x1;}}catch(_0x91c733){W(_0x15f365(0xf8)+_0x91c733);}}}W(_0x15f365(0x10a));}catch(_0x1b6db9){W(_0x15f365(0x106)+_0x1b6db9);}if(_0x2b324e=_0x2b324e??Date[_0x15f365(0xb9)](),Date[_0x15f365(0xb9)]()-_0x2b324e>T){W('SSE\x20连续\x20>1h\x20连不上\x20hub\x20('+j+')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。');return;}await N(_0x53068d),_0x53068d=Math['min'](_0x53068d*0x2,R);}}async function a(_0x33e82b){const _0x59a017=a0_0x2cadd7;if(_0x33e82b['type']===_0x59a017(0xd9)){W(_0x59a017(0x107)+G+'\x22');return;}if(_0x33e82b[_0x59a017(0xdd)]===_0x59a017(0xf5)){if(W(_0x59a017(0x9c)+_0x33e82b[_0x59a017(0xd1)]+':\x20'+_0x33e82b['message'][_0x59a017(0x9a)](0x0,0x3c)),await x[_0x59a017(0xc3)]({'method':_0x59a017(0x94),'params':{'content':_0x33e82b['message'],'meta':{'sender':_0x33e82b[_0x59a017(0xd1)]||_0x59a017(0xdb),'sender_id':_0x59a017(0xe8),'user':_0x33e82b[_0x59a017(0xd1)]||_0x59a017(0xdb),'priority':'normal'}}}),_0x33e82b[_0x59a017(0xeb)])await Y(_0x59a017(0xef),{'alias':G,'message_id':_0x33e82b[_0x59a017(0xeb)]});return;}if(_0x33e82b[_0x59a017(0xdd)]==='new_task'||_0x33e82b['type']==='broadcast'){W('←\x20'+_0x33e82b[_0x59a017(0xdd)]+_0x59a017(0x9b)+_0x33e82b[_0x59a017(0xcb)]+_0x59a017(0xe6)+(_0x33e82b[_0x59a017(0xd7)]||_0x59a017(0x10f)));let _0x2fdb95=await Y(_0x59a017(0xa4),{'alias':G,'limit':0x5});if(_0x2fdb95?.['ok']&&_0x2fdb95['messages']?.[_0x59a017(0xa8)]>0x0)for(let _0x369c51 of _0x2fdb95['messages']){let _0x14d057={'sender':_0x369c51[_0x59a017(0xc2)]||'hub','sender_id':_0x59a017(0xe8),'user':_0x369c51[_0x59a017(0xc2)]||_0x59a017(0xdb),'task_id':_0x369c51['id'],'priority':_0x369c51[_0x59a017(0xd7)]||_0x59a017(0x10f)};D[_0x59a017(0xa2)](_0x369c51['id'],_0x369c51['from_session']||_0x59a017(0xdb)),await x['notification']({'method':_0x59a017(0x94),'params':{'content':_0x369c51[_0x59a017(0xec)],'meta':_0x14d057}}),W(_0x59a017(0x83)+_0x369c51['id'][_0x59a017(0x9a)](0x0,0x8)+_0x59a017(0x110)+_0x369c51[_0x59a017(0xc2)]+':\x20'+_0x369c51[_0x59a017(0xec)][_0x59a017(0x9a)](0x0,0x3c)),await Y(_0x59a017(0xef),{'alias':G,'message_id':_0x369c51['id']});}}}async function n(){const _0x1185c4=a0_0x2cadd7;let _0x1cf6d9=new a0_0x3b24fd();await x[_0x1185c4(0xcf)](_0x1cf6d9),W(_0x1185c4(0x105)),W('starting\x20SSE\x20listener...'),o()['catch'](_0x301bde=>W(_0x1185c4(0xa5)+_0x301bde)),Y('report_status',{'resume_id':K,'alias':G,'status':_0x1185c4(0xde),'server':a0_0x14132c(),'hostname':a0_0x14132c(),'agent':_0x1185c4(0xc8),'project_dir':process[_0x1185c4(0x114)](),'tmux_name':f||void 0x0})[_0x1185c4(0x96)](()=>W(_0x1185c4(0xb8)+G+_0x1185c4(0xe2)+K[_0x1185c4(0x9a)](0x0,0x8)+')'))[_0x1185c4(0xd4)](_0x105617=>W(_0x1185c4(0x113)+_0x105617)),setInterval(()=>{const _0x1ca181=_0x1185c4;Y(_0x1ca181(0xa1),{'resume_id':K,'alias':G,'status':_0x1ca181(0xde),'server':a0_0x14132c(),'hostname':a0_0x14132c(),'agent':_0x1ca181(0xc8),'project_dir':process[_0x1ca181(0x114)](),'tmux_name':f||void 0x0})[_0x1ca181(0xd4)](_0x299bdc=>W(_0x1ca181(0x80)+_0x299bdc));},0x2bf20),W(_0x1185c4(0xe3));}n()[a0_0x2cadd7(0xd4)](_0x416659=>{const _0xb2b78e=a0_0x2cadd7;W('fatal:\x20'+_0x416659),process[_0xb2b78e(0xa0)](0x1);});async function b(){const _0x3be58b=a0_0x2cadd7;W(_0x3be58b(0xd6)),await Y(_0x3be58b(0xa1),{'resume_id':K,'alias':G,'status':_0x3be58b(0xda),'task':'session\x20disconnected'})[_0x3be58b(0xd4)](()=>{}),process[_0x3be58b(0xa0)](0x0);}process['stdin']['on']('end',()=>b()),process['on'](a0_0x2cadd7(0x91),()=>b()),process['on'](a0_0x2cadd7(0x81),()=>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.4",
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",