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

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_0x189926=a0_0x1d56;function a0_0x31dc(){const _0x3c4d50=['cwd','toString','broadcast','content','log','heartbeatInterval','completed','1312130QwErEn','type','toTimeString','registered','startsWith','url','POST','192630AoXeUB','signal','sleep','5577182ljVZTj','sdk-','agent','read','text','disconnect','2.0','status','Bearer\x20','autoConnect','server','reply','SSE\x20reconnecting\x20in\x20','report_status','getAllStatus','48PpsnpG','ack_inbox','task','messages','slice','41722TVqCKm','now','6CbCxXj','SSE\x20error:\x20','application/json','running','sseAbort','7ZjzGAK','name','heartbeatTimer','42150QMxcME','get_inbox','min','1274152mxgTMQ','body','parse','normal','new_task','token','sdk','disconnected','from_session','resumeId','data:\x20','12ivUixo','emit','message','catch','connectSSE','56oQvQji','81KblxoM','call','/mcp','13979irOMkQ','pop','abort','idle','decode','Authorization','alias','AbortError','new_message','getReader','s...','connect','tools/call','send_reply','reconnectDelay','send','send_task','processInbox'];a0_0x31dc=function(){return _0x3c4d50;};return a0_0x31dc();}(function(_0x4aada5,_0x173b1f){const _0x2b4e33=a0_0x1d56,_0x310a8a=_0x4aada5();while(!![]){try{const _0x16fe90=-parseInt(_0x2b4e33(0xcf))/0x1*(parseInt(_0x2b4e33(0xc8))/0x2)+-parseInt(_0x2b4e33(0xd2))/0x3*(parseInt(_0x2b4e33(0xc3))/0x4)+-parseInt(_0x2b4e33(0xaa))/0x5*(parseInt(_0x2b4e33(0xca))/0x6)+-parseInt(_0x2b4e33(0x91))/0x7*(-parseInt(_0x2b4e33(0x8d))/0x8)+parseInt(_0x2b4e33(0x8e))/0x9*(parseInt(_0x2b4e33(0xb1))/0xa)+parseInt(_0x2b4e33(0xd5))/0xb+parseInt(_0x2b4e33(0x88))/0xc*(parseInt(_0x2b4e33(0xb4))/0xd);if(_0x16fe90===_0x173b1f)break;else _0x310a8a['push'](_0x310a8a['shift']());}catch(_0x1d19aa){_0x310a8a['push'](_0x310a8a['shift']());}}}(a0_0x31dc,0x25e03));import{EventEmitter as a0_0x342fd7}from'events';function a0_0x1d56(_0x2ae1b2,_0x54313e){_0x2ae1b2=_0x2ae1b2-0x83;const _0x31dc3b=a0_0x31dc();let _0x1d565f=_0x31dc3b[_0x2ae1b2];return _0x1d565f;}import{hostname as a0_0x20dba2}from'os';class T extends a0_0x342fd7{[a0_0x189926(0xaf)];[a0_0x189926(0x97)];['token'];[a0_0x189926(0xb6)];[a0_0x189926(0x86)];['heartbeatInterval'];[a0_0x189926(0x9f)];[a0_0x189926(0xd1)];[a0_0x189926(0xce)];[a0_0x189926(0xcd)]=!0x1;constructor(_0x51461a){const _0xff97f3=a0_0x189926;super();if(this['url']=_0x51461a[_0xff97f3(0xaf)]['replace'](/\/$/,''),this[_0xff97f3(0x97)]=_0x51461a['alias'],this[_0xff97f3(0xda)]=_0x51461a[_0xff97f3(0xda)],this['agent']=_0x51461a['agent']||_0xff97f3(0x83),this[_0xff97f3(0x86)]=_0xff97f3(0xb5)+_0x51461a[_0xff97f3(0x97)]+'-'+Date[_0xff97f3(0xc9)]()[_0xff97f3(0xa4)](0x24),this['heartbeatInterval']=_0x51461a['heartbeatInterval']??0x2bf20,this['reconnectDelay']=_0x51461a['reconnectDelay']??0xbb8,_0x51461a[_0xff97f3(0xbd)]!==!0x1)this[_0xff97f3(0x9c)]();}['log'](_0x521869){const _0x3e8f83=a0_0x189926;console[_0x3e8f83(0xa7)]('['+new Date()[_0x3e8f83(0xac)]()[_0x3e8f83(0xc7)](0x0,0x8)+']\x20[commhub:'+this['alias']+']\x20'+_0x521869);}async['call'](_0x19720c,_0x4f4a11){const _0x34a129=a0_0x189926;let _0x3f6119={'Content-Type':_0x34a129(0xcc),'Accept':'application/json,\x20text/event-stream'};if(this[_0x34a129(0xda)])_0x3f6119[_0x34a129(0x96)]=_0x34a129(0xbc)+this[_0x34a129(0xda)];let _0x5612cb=await(await fetch(this[_0x34a129(0xaf)]+_0x34a129(0x90),{'method':_0x34a129(0xb0),'headers':_0x3f6119,'body':JSON['stringify']({'jsonrpc':_0x34a129(0xba),'id':Date[_0x34a129(0xc9)](),'method':_0x34a129(0x9d),'params':{'name':_0x19720c,'arguments':_0x4f4a11}})}))[_0x34a129(0xb8)](),_0x119f6b=_0x5612cb['match'](/data: (.+)/),_0x6b0629=_0x119f6b?JSON[_0x34a129(0xd7)](_0x119f6b[0x1]):JSON['parse'](_0x5612cb),_0x143bd8=_0x6b0629?.['result']?.[_0x34a129(0xa6)]?.[0x0]?.[_0x34a129(0xb8)];return _0x143bd8?JSON['parse'](_0x143bd8):_0x6b0629;}async['connect'](){const _0x50fd4d=a0_0x189926;if(this[_0x50fd4d(0xcd)])return;this['running']=!0x0,await this[_0x50fd4d(0xbb)]('idle'),this[_0x50fd4d(0xa7)](_0x50fd4d(0xad)),this[_0x50fd4d(0xd1)]=setInterval(()=>{const _0x190b99=_0x50fd4d;this[_0x190b99(0xbb)](_0x190b99(0x94))[_0x190b99(0x8b)](_0x20c10f=>this[_0x190b99(0xa7)]('heartbeat\x20failed:\x20'+_0x20c10f[_0x190b99(0x8a)]));},this[_0x50fd4d(0xa8)]),this[_0x50fd4d(0x8c)]();}async[a0_0x189926(0xb9)](){const _0xf6748b=a0_0x189926;if(this[_0xf6748b(0xcd)]=!0x1,this[_0xf6748b(0xce)]?.[_0xf6748b(0x93)](),this['heartbeatTimer'])clearInterval(this['heartbeatTimer']);await this['status']('offline')[_0xf6748b(0x8b)](()=>{}),this['log'](_0xf6748b(0x84));}async[a0_0x189926(0xa0)](_0x2d514f,_0x54234c,_0x133f19=a0_0x189926(0xd8)){const _0x13e986=a0_0x189926;return this['call'](_0x13e986(0xa1),{'alias':_0x2d514f,'task':_0x54234c,'priority':_0x133f19,'from_session':this['alias']});}async[a0_0x189926(0x8a)](_0xddb59f,_0x179151){const _0x2b26e4=a0_0x189926;return this[_0x2b26e4(0x8f)]('send_message',{'alias':_0xddb59f,'message':_0x179151,'from_session':this[_0x2b26e4(0x97)]});}async[a0_0x189926(0xbf)](_0x5ab6e5,_0x436043,_0x45a639=a0_0x189926(0xa9)){const _0x579933=a0_0x189926;return this['call'](_0x579933(0x9e),{'in_reply_to':_0x5ab6e5,'text':_0x436043,'status':_0x45a639});}async[a0_0x189926(0xbb)](_0x3156e9,_0x5a225a){const _0x592759=a0_0x189926;return this['call'](_0x592759(0xc1),{'resume_id':this[_0x592759(0x86)],'alias':this['alias'],'status':_0x3156e9,'server':a0_0x20dba2(),'hostname':a0_0x20dba2(),'agent':this['agent'],'project_dir':process[_0x592759(0xa3)](),..._0x5a225a});}async[a0_0x189926(0xc2)](){const _0x11d772=a0_0x189926;return this[_0x11d772(0x8f)]('get_all_status',{});}async[a0_0x189926(0xa5)](_0xb21fb9,_0x358371){const _0x59f6e9=a0_0x189926;return this[_0x59f6e9(0x8f)]('broadcast',{'message':_0xb21fb9,'filter_server':_0x358371?.[_0x59f6e9(0xbe)],'filter_status':_0x358371?.[_0x59f6e9(0xbb)]});}async[a0_0x189926(0x8c)](){const _0x2e4e27=a0_0x189926;let _0x1228db=encodeURIComponent(this[_0x2e4e27(0x97)]),_0x284210=this[_0x2e4e27(0xaf)]+'/events/'+_0x1228db,_0x2326c6=this[_0x2e4e27(0x9f)];while(this[_0x2e4e27(0xcd)]){try{this[_0x2e4e27(0xce)]=new AbortController();let _0x102fb7={'Accept':'text/event-stream'};if(this['token'])_0x102fb7[_0x2e4e27(0x96)]='Bearer\x20'+this['token'];let _0x1eb203=await fetch(_0x284210,{'headers':_0x102fb7,'signal':this[_0x2e4e27(0xce)][_0x2e4e27(0xb2)]});if(!_0x1eb203['ok']||!_0x1eb203[_0x2e4e27(0xd6)]){this[_0x2e4e27(0xa7)]('SSE\x20failed:\x20'+_0x1eb203['status']),await this['sleep'](_0x2326c6),_0x2326c6=Math[_0x2e4e27(0xd4)](_0x2326c6*1.5,0xea60);continue;}_0x2326c6=this[_0x2e4e27(0x9f)];let _0x243899=_0x1eb203[_0x2e4e27(0xd6)][_0x2e4e27(0x9a)](),_0x5373a6=new TextDecoder(),_0x2c1250='';while(this[_0x2e4e27(0xcd)]){let {done:_0x42957d,value:_0x3d3fef}=await _0x243899[_0x2e4e27(0xb7)]();if(_0x42957d)break;_0x2c1250+=_0x5373a6[_0x2e4e27(0x95)](_0x3d3fef,{'stream':!0x0});let _0x1b3757=_0x2c1250['split']('\x0a');_0x2c1250=_0x1b3757[_0x2e4e27(0x92)]()||'';for(let _0x347344 of _0x1b3757){if(!_0x347344[_0x2e4e27(0xae)](_0x2e4e27(0x87)))continue;try{let _0x52e81e=JSON[_0x2e4e27(0xd7)](_0x347344[_0x2e4e27(0xc7)](0x6));if(_0x52e81e[_0x2e4e27(0xab)]==='connected'){this[_0x2e4e27(0xa7)]('SSE\x20connected'),this[_0x2e4e27(0x89)]('connected');continue;}if(_0x52e81e[_0x2e4e27(0xab)]===_0x2e4e27(0xd9)||_0x52e81e[_0x2e4e27(0xab)]===_0x2e4e27(0x99)||_0x52e81e[_0x2e4e27(0xab)]==='broadcast')await this[_0x2e4e27(0xa2)]();}catch{}}}}catch(_0xde8b79){if(_0xde8b79[_0x2e4e27(0xd0)]===_0x2e4e27(0x98))break;this[_0x2e4e27(0x89)]('error',_0xde8b79),this[_0x2e4e27(0xa7)](_0x2e4e27(0xcb)+_0xde8b79[_0x2e4e27(0x8a)]);}if(this[_0x2e4e27(0xcd)])this['emit'](_0x2e4e27(0x84)),this[_0x2e4e27(0xa7)](_0x2e4e27(0xc0)+_0x2326c6/0x3e8+_0x2e4e27(0x9b)),await this[_0x2e4e27(0xb3)](_0x2326c6),_0x2326c6=Math[_0x2e4e27(0xd4)](_0x2326c6*1.5,0xea60);}}async[a0_0x189926(0xa2)](){const _0x24679b=a0_0x189926;try{let _0x48cb70=(await this[_0x24679b(0x8f)](_0x24679b(0xd3),{'alias':this[_0x24679b(0x97)],'limit':0xa}))?.[_0x24679b(0xc6)]||[];for(let _0x3b18f5 of _0x48cb70)await this['call'](_0x24679b(0xc4),{'alias':this[_0x24679b(0x97)],'message_id':_0x3b18f5['id']}),this['log']('←\x20'+_0x3b18f5[_0x24679b(0x85)]+':\x20'+_0x3b18f5['content'][_0x24679b(0xc7)](0x0,0x3c)),this[_0x24679b(0x89)](_0x24679b(0xc5),_0x3b18f5),this['emit'](_0x24679b(0x8a),_0x3b18f5);}catch(_0x51b58f){this[_0x24679b(0xa7)]('inbox\x20error:\x20'+_0x51b58f[_0x24679b(0x8a)]);}}['sleep'](_0x5aaf25){return new Promise(_0x2d730e=>setTimeout(_0x2d730e,_0x5aaf25));}}var $=T;export{$ as default,T as CommHub};
1
+ function a0_0xe11e(){const _0x141971=['send_message','disconnected','from_session','application/json','idle','toString','registered','ack_inbox','2DwpuCm','send','decode','url','content','42smZJdH','body','new_task','connectSSE','match','9978950oGiwSZ','send_task','parse','completed','heartbeat\x20failed:\x20','get_inbox','get_all_status','2.0','/events/','sseAbort','status','cwd','type','connect','log','resumeId','agent','startsWith','processInbox','SSE\x20connected','heartbeatInterval','signal','4587213XFPpnl','tools/call','min','965100yutfBv','disconnect',']\x20[commhub:','sleep','inbox\x20error:\x20','message','task','broadcast','call','name','750256lglDUs','alias','text','catch','error','autoConnect','reconnectDelay','Bearer\x20','heartbeatTimer','result','14125365keppuy','sdk','emit','3075xIcTlY','AbortError','data:\x20','/mcp','SSE\x20failed:\x20','split','slice','abort','running','stringify','connected','reply','6618zCJEJT','sdk-','getReader','pop','now','83120VvoLsD','token','SSE\x20reconnecting\x20in\x20','Authorization','replace'];a0_0xe11e=function(){return _0x141971;};return a0_0xe11e();}const a0_0x4f1d7a=a0_0x580f;(function(_0x512ea7,_0x10ec59){const _0x292ab0=a0_0x580f,_0x24cbb3=_0x512ea7();while(!![]){try{const _0x105923=parseInt(_0x292ab0(0x15a))/0x1+-parseInt(_0x292ab0(0x137))/0x2*(parseInt(_0x292ab0(0x157))/0x3)+parseInt(_0x292ab0(0x164))/0x4+parseInt(_0x292ab0(0x171))/0x5*(parseInt(_0x292ab0(0x125))/0x6)+-parseInt(_0x292ab0(0x13c))/0x7*(-parseInt(_0x292ab0(0x12a))/0x8)+parseInt(_0x292ab0(0x16e))/0x9+-parseInt(_0x292ab0(0x141))/0xa;if(_0x105923===_0x10ec59)break;else _0x24cbb3['push'](_0x24cbb3['shift']());}catch(_0x34d8c0){_0x24cbb3['push'](_0x24cbb3['shift']());}}}(a0_0xe11e,0xe47bc));function a0_0x580f(_0x265e6,_0x4a4740){_0x265e6=_0x265e6-0x125;const _0xe11e28=a0_0xe11e();let _0x580fb2=_0xe11e28[_0x265e6];return _0x580fb2;}import{EventEmitter as a0_0x371f24}from'events';import{hostname as a0_0x11daac}from'os';class T extends a0_0x371f24{[a0_0x4f1d7a(0x13a)];[a0_0x4f1d7a(0x165)];['token'];['agent'];[a0_0x4f1d7a(0x150)];[a0_0x4f1d7a(0x155)];[a0_0x4f1d7a(0x16a)];['heartbeatTimer'];[a0_0x4f1d7a(0x14a)];[a0_0x4f1d7a(0x179)]=!0x1;constructor(_0x186dab){const _0x207316=a0_0x4f1d7a;super();if(this[_0x207316(0x13a)]=_0x186dab[_0x207316(0x13a)][_0x207316(0x12e)](/\/$/,''),this[_0x207316(0x165)]=_0x186dab[_0x207316(0x165)],this[_0x207316(0x12b)]=_0x186dab['token'],this[_0x207316(0x151)]=_0x186dab[_0x207316(0x151)]||_0x207316(0x16f),this['resumeId']=_0x207316(0x126)+_0x186dab[_0x207316(0x165)]+'-'+Date['now']()[_0x207316(0x134)](0x24),this[_0x207316(0x155)]=_0x186dab[_0x207316(0x155)]??0x2bf20,this['reconnectDelay']=_0x186dab[_0x207316(0x16a)]??0xbb8,_0x186dab[_0x207316(0x169)]!==!0x1)this[_0x207316(0x14e)]();}[a0_0x4f1d7a(0x14f)](_0x2c698a){const _0x52d480=a0_0x4f1d7a;console['log']('['+new Date()['toTimeString']()[_0x52d480(0x177)](0x0,0x8)+_0x52d480(0x15c)+this[_0x52d480(0x165)]+']\x20'+_0x2c698a);}async[a0_0x4f1d7a(0x162)](_0x59d317,_0x41e41a){const _0xe96894=a0_0x4f1d7a;let _0x27aafc={'Content-Type':_0xe96894(0x132),'Accept':'application/json,\x20text/event-stream'};if(this['token'])_0x27aafc[_0xe96894(0x12d)]=_0xe96894(0x16b)+this[_0xe96894(0x12b)];let _0x325bed=await(await fetch(this[_0xe96894(0x13a)]+_0xe96894(0x174),{'method':'POST','headers':_0x27aafc,'body':JSON[_0xe96894(0x17a)]({'jsonrpc':_0xe96894(0x148),'id':Date[_0xe96894(0x129)](),'method':_0xe96894(0x158),'params':{'name':_0x59d317,'arguments':_0x41e41a}})}))[_0xe96894(0x166)](),_0x595402=_0x325bed[_0xe96894(0x140)](/data: (.+)/),_0x682efc=_0x595402?JSON[_0xe96894(0x143)](_0x595402[0x1]):JSON[_0xe96894(0x143)](_0x325bed),_0x59375e=_0x682efc?.[_0xe96894(0x16d)]?.[_0xe96894(0x13b)]?.[0x0]?.[_0xe96894(0x166)];return _0x59375e?JSON[_0xe96894(0x143)](_0x59375e):_0x682efc;}async[a0_0x4f1d7a(0x14e)](){const _0x89a310=a0_0x4f1d7a;if(this[_0x89a310(0x179)])return;this[_0x89a310(0x179)]=!0x0,await this[_0x89a310(0x14b)](_0x89a310(0x133)),this[_0x89a310(0x14f)](_0x89a310(0x135)),this[_0x89a310(0x16c)]=setInterval(()=>{const _0x239124=_0x89a310;this[_0x239124(0x14b)]('idle')[_0x239124(0x167)](_0x445367=>this[_0x239124(0x14f)](_0x239124(0x145)+_0x445367[_0x239124(0x15f)]));},this[_0x89a310(0x155)]),this['connectSSE']();}async[a0_0x4f1d7a(0x15b)](){const _0x29013e=a0_0x4f1d7a;if(this[_0x29013e(0x179)]=!0x1,this[_0x29013e(0x14a)]?.[_0x29013e(0x178)](),this[_0x29013e(0x16c)])clearInterval(this[_0x29013e(0x16c)]);await this[_0x29013e(0x14b)]('offline')[_0x29013e(0x167)](()=>{}),this['log'](_0x29013e(0x130));}async[a0_0x4f1d7a(0x138)](_0x53ef83,_0x48e0f7,_0x3271e8='normal'){const _0x5a59e6=a0_0x4f1d7a;return this[_0x5a59e6(0x162)](_0x5a59e6(0x142),{'alias':_0x53ef83,'task':_0x48e0f7,'priority':_0x3271e8,'from_session':this[_0x5a59e6(0x165)]});}async[a0_0x4f1d7a(0x15f)](_0x8554bb,_0x2a8610){const _0x53df64=a0_0x4f1d7a;return this['call'](_0x53df64(0x12f),{'alias':_0x8554bb,'message':_0x2a8610,'from_session':this[_0x53df64(0x165)]});}async[a0_0x4f1d7a(0x17c)](_0x3e5afe,_0x52eeea,_0x40334f=a0_0x4f1d7a(0x144)){const _0x198b23=a0_0x4f1d7a;return this[_0x198b23(0x162)]('send_reply',{'in_reply_to':_0x3e5afe,'text':_0x52eeea,'status':_0x40334f});}async[a0_0x4f1d7a(0x14b)](_0x5a6158,_0x59a4d6){const _0x231d2a=a0_0x4f1d7a;return this['call']('report_status',{'resume_id':this[_0x231d2a(0x150)],'alias':this[_0x231d2a(0x165)],'status':_0x5a6158,'server':a0_0x11daac(),'hostname':a0_0x11daac(),'agent':this[_0x231d2a(0x151)],'project_dir':process[_0x231d2a(0x14c)](),..._0x59a4d6});}async['getAllStatus'](){const _0x3efbe4=a0_0x4f1d7a;return this['call'](_0x3efbe4(0x147),{});}async[a0_0x4f1d7a(0x161)](_0x458703,_0x37e048){const _0x4b9bcc=a0_0x4f1d7a;return this[_0x4b9bcc(0x162)]('broadcast',{'message':_0x458703,'filter_server':_0x37e048?.['server'],'filter_status':_0x37e048?.[_0x4b9bcc(0x14b)]});}async[a0_0x4f1d7a(0x13f)](){const _0x1aa116=a0_0x4f1d7a;let _0x3299ea=encodeURIComponent(this['alias']),_0x5c2dd0=this[_0x1aa116(0x13a)]+_0x1aa116(0x149)+_0x3299ea,_0x2d4759=this[_0x1aa116(0x16a)];while(this[_0x1aa116(0x179)]){try{this[_0x1aa116(0x14a)]=new AbortController();let _0xe06dff={'Accept':'text/event-stream'};if(this[_0x1aa116(0x12b)])_0xe06dff[_0x1aa116(0x12d)]=_0x1aa116(0x16b)+this['token'];let _0x1ad18e=await fetch(_0x5c2dd0,{'headers':_0xe06dff,'signal':this[_0x1aa116(0x14a)][_0x1aa116(0x156)]});if(!_0x1ad18e['ok']||!_0x1ad18e[_0x1aa116(0x13d)]){this[_0x1aa116(0x14f)](_0x1aa116(0x175)+_0x1ad18e[_0x1aa116(0x14b)]),await this['sleep'](_0x2d4759),_0x2d4759=Math['min'](_0x2d4759*1.5,0xea60);continue;}_0x2d4759=this[_0x1aa116(0x16a)];let _0x123a78=_0x1ad18e[_0x1aa116(0x13d)][_0x1aa116(0x127)](),_0x8e0164=new TextDecoder(),_0x1b23d4='';while(this[_0x1aa116(0x179)]){let {done:_0x40eba2,value:_0x594f07}=await _0x123a78['read']();if(_0x40eba2)break;_0x1b23d4+=_0x8e0164[_0x1aa116(0x139)](_0x594f07,{'stream':!0x0});let _0x3e5ae5=_0x1b23d4[_0x1aa116(0x176)]('\x0a');_0x1b23d4=_0x3e5ae5[_0x1aa116(0x128)]()||'';for(let _0xe79d41 of _0x3e5ae5){if(!_0xe79d41[_0x1aa116(0x152)](_0x1aa116(0x173)))continue;try{let _0x347e01=JSON[_0x1aa116(0x143)](_0xe79d41[_0x1aa116(0x177)](0x6));if(_0x347e01['type']===_0x1aa116(0x17b)){this[_0x1aa116(0x14f)](_0x1aa116(0x154)),this[_0x1aa116(0x170)](_0x1aa116(0x17b));continue;}if(_0x347e01[_0x1aa116(0x14d)]===_0x1aa116(0x13e)||_0x347e01[_0x1aa116(0x14d)]==='new_message'||_0x347e01[_0x1aa116(0x14d)]==='broadcast')await this[_0x1aa116(0x153)]();}catch{}}}}catch(_0x561a52){if(_0x561a52[_0x1aa116(0x163)]===_0x1aa116(0x172))break;this['emit'](_0x1aa116(0x168),_0x561a52),this[_0x1aa116(0x14f)]('SSE\x20error:\x20'+_0x561a52[_0x1aa116(0x15f)]);}if(this['running'])this[_0x1aa116(0x170)](_0x1aa116(0x130)),this['log'](_0x1aa116(0x12c)+_0x2d4759/0x3e8+'s...'),await this[_0x1aa116(0x15d)](_0x2d4759),_0x2d4759=Math[_0x1aa116(0x159)](_0x2d4759*1.5,0xea60);}}async['processInbox'](){const _0x4e2db8=a0_0x4f1d7a;try{let _0x14c8e0=(await this[_0x4e2db8(0x162)](_0x4e2db8(0x146),{'alias':this[_0x4e2db8(0x165)],'limit':0xa}))?.['messages']||[];for(let _0x58d8e2 of _0x14c8e0)await this[_0x4e2db8(0x162)](_0x4e2db8(0x136),{'alias':this[_0x4e2db8(0x165)],'message_id':_0x58d8e2['id']}),this[_0x4e2db8(0x14f)]('←\x20'+_0x58d8e2[_0x4e2db8(0x131)]+':\x20'+_0x58d8e2[_0x4e2db8(0x13b)][_0x4e2db8(0x177)](0x0,0x3c)),this[_0x4e2db8(0x170)](_0x4e2db8(0x160),_0x58d8e2),this[_0x4e2db8(0x170)](_0x4e2db8(0x15f),_0x58d8e2);}catch(_0x949fa8){this[_0x4e2db8(0x14f)](_0x4e2db8(0x15e)+_0x949fa8[_0x4e2db8(0x15f)]);}}['sleep'](_0x4fb1f1){return new Promise(_0x4510f7=>setTimeout(_0x4510f7,_0x4fb1f1));}}var $=T;export{$ as default,T as CommHub};
@@ -0,0 +1,29 @@
1
+ import type { IMAdapter, IMAdapterHealth, IMChannelConfig, IMConversationRef, IMIngressMode, NormalizedIMEvent, NormalizedIMMessage } from "../types.js";
2
+ type OnEventHandler = (event: NormalizedIMEvent) => Promise<void>;
3
+ export declare class FeishuAdapter implements IMAdapter {
4
+ readonly platform = "feishu";
5
+ readonly ingressMode: IMIngressMode;
6
+ private feishuConfig;
7
+ private connectionName;
8
+ private client;
9
+ private wsClient;
10
+ /**
11
+ * The bot's own open_id, resolved at init() via /open-apis/bot/v3/info.
12
+ * Used to detect real @bot mentions (vs any mention) in group messages.
13
+ * Falls back to null on lookup failure — `mentioned` then degrades to the
14
+ * naive `mentions.length > 0` check.
15
+ */
16
+ private botOpenId;
17
+ /** Where to persist downloaded inbound media (M5c). */
18
+ private mediaDir;
19
+ private health_;
20
+ init(config: IMChannelConfig): Promise<void>;
21
+ start(onEvent: OnEventHandler): Promise<void>;
22
+ stop(): Promise<void>;
23
+ send(message: NormalizedIMMessage): Promise<{
24
+ messageId: string;
25
+ }>;
26
+ edit(_target: IMConversationRef, messageId: string, message: NormalizedIMMessage): Promise<void>;
27
+ health(): IMAdapterHealth;
28
+ }
29
+ export {};
@@ -0,0 +1,67 @@
1
+ /**
2
+ * RFC-020 §2.5 / RFC-002 §2.2 — Feishu bridge worker.
3
+ *
4
+ * Entry point spawned by agent-node when a node profile has `channels.feishu`
5
+ * enabled. Per Vincent 2026-06-24 decision, the first-cut is the simplified
6
+ * "agent-node direct bridge" model, not the full commhub-gateway:
7
+ *
8
+ * - This worker owns the FeishuAdapter and its WSClient connection.
9
+ * - Inbound IM event → access whitelist gate → forward to agent-node's main
10
+ * `think()` via parent IPC.
11
+ * - think() result → adapter.send() back to the originating conversation.
12
+ *
13
+ * Differences vs RFC-020 §2.5 full commhub-gateway path:
14
+ * - No separate gateway ntok_ / dedicated commhub alias.
15
+ * - IM messages do NOT pass through commhub task dispatch.
16
+ * - Feishu messages do NOT appear in Dashboard topology / Chat.
17
+ *
18
+ * The full §2.9 path (meta_json columns, SSE passthrough, persisted
19
+ * IMCorrelationStore) lands as the follow-up PR after this demo ships
20
+ * — tracked in #182.
21
+ *
22
+ * Milestones:
23
+ * M1: worker entry scaffold.
24
+ * M2: adapter + WSClient wiring with a noop event handler.
25
+ * M3 (this file): IPC contract for the think() round-trip — when running
26
+ * as a forked child the bridge auto-uses `process.send` /
27
+ * `process.on("message")`; standalone, it falls back to a
28
+ * stderr logger so the inbound path stays observable.
29
+ * M4: agent-node spawn integration (fork(this) wired by agent-node).
30
+ * M5: group @bot trigger refinement, image up/down, Docker smoke.
31
+ */
32
+ import type { NormalizedIMEvent } from "../types.js";
33
+ import { FeishuAdapter } from "./adapter.js";
34
+ export interface FeishuBridgeOptions {
35
+ /** Absolute path to `.anet/nodes/<node>/channels/feishu/`. */
36
+ channelDir: string;
37
+ /** Node alias — used for audit log + IPC framing. */
38
+ nodeAlias: string;
39
+ /**
40
+ * Optional inbound event sink for tests or custom integrations. When omitted
41
+ * the bridge picks an automatic strategy:
42
+ * - IPC handler when `process.send` exists (i.e. running as a forked
43
+ * child of agent-node).
44
+ * - stderr logger otherwise (standalone smoke debugging).
45
+ */
46
+ onEvent?: (event: NormalizedIMEvent) => Promise<void>;
47
+ }
48
+ /** Bridge → parent: inbound IM event ready for think(). */
49
+ export interface BridgeIncomingEnvelope {
50
+ type: "event";
51
+ event: NormalizedIMEvent;
52
+ }
53
+ /** Parent → bridge: agent reply text for a previously-forwarded event. */
54
+ export interface BridgeReplyEnvelope {
55
+ type: "reply";
56
+ /** Echoes the originating event's idempotencyKey. */
57
+ eventKey: string;
58
+ text: string;
59
+ }
60
+ /**
61
+ * Wire and start the Feishu bridge. Resolves once the underlying WSClient is
62
+ * connected and the EventDispatcher is registered.
63
+ */
64
+ export declare function startFeishuBridge(opts: FeishuBridgeOptions): Promise<FeishuAdapter>;
65
+ export { FeishuAdapter } from "./adapter.js";
66
+ export { loadFeishuChannelConfig } from "./config.js";
67
+ export type { FeishuAccessList, FeishuChannelConfig, FeishuChannelEnv, } from "./config.js";
@@ -0,0 +1,34 @@
1
+ export interface FeishuChannelEnv {
2
+ FEISHU_APP_ID: string;
3
+ FEISHU_APP_SECRET: string;
4
+ }
5
+ export interface FeishuAccessList {
6
+ /** Feishu open_ids permitted to DM the bot. */
7
+ allowFrom: string[];
8
+ /** Feishu chat_ids the bot is permitted to listen in. */
9
+ allowChats: string[];
10
+ }
11
+ export interface FeishuChannelConfig {
12
+ appId: string;
13
+ appSecret: string;
14
+ access: FeishuAccessList;
15
+ /** RFC-020 §4.3 group trigger policy. Default `mention`. */
16
+ groupPolicy: "mention" | "command" | "all" | "observe";
17
+ /** Send a "⏳ 处理中…" placeholder before agent reply (RFC-020 §4.2). */
18
+ ackPlaceholder: boolean;
19
+ /** Persist redacted raw payload to local audit log (RFC-020 §2.3 / §12.10). */
20
+ auditRaw: boolean;
21
+ /** Per-task timeout in ms; default 5 min (RFC-020 §4.5). */
22
+ taskTimeoutMs: number;
23
+ /**
24
+ * Absolute path to the channel directory. The adapter writes downloaded
25
+ * inbound media to `<channelDir>/media/` (M5c). Populated by the loader so
26
+ * callers do not have to thread it separately.
27
+ */
28
+ channelDir: string;
29
+ }
30
+ /**
31
+ * Load Feishu channel config from a node's channels/feishu directory.
32
+ * Throws if required secrets are missing.
33
+ */
34
+ export declare function loadFeishuChannelConfig(channelDir: string): FeishuChannelConfig;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * RFC-020 §3.1 — Feishu (Lark) IM channel public surface.
3
+ *
4
+ * - `FeishuAdapter` — IMAdapter implementation backed by `@larksuiteoapi/node-sdk` WSClient.
5
+ * - `startFeishuBridge` — entry point spawned by agent-node for SDK runtimes.
6
+ * - `loadFeishuChannelConfig` — loader for `.anet/nodes/<node>/channels/feishu/`.
7
+ *
8
+ * Tracking: issues #179 (parent RFC), #182 (P0 tracker).
9
+ */
10
+ export { FeishuAdapter } from "./adapter.js";
11
+ export { startFeishuBridge } from "./bridge.js";
12
+ export type { FeishuBridgeOptions } from "./bridge.js";
13
+ export { loadFeishuChannelConfig } from "./config.js";
14
+ export type { FeishuAccessList, FeishuChannelConfig, FeishuChannelEnv, } from "./config.js";
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import*as B from"@larksuiteoapi/node-sdk";import T from"node:crypto";import{existsSync as C,mkdirSync as M,readFileSync as S,writeFileSync as F}from"node:fs";import{join as O}from"node:path";import{Readable as x}from"node:stream";class N{platform="feishu";ingressMode="socket";feishuConfig=null;connectionName="";client=null;wsClient=null;botOpenId=null;mediaDir=null;health_={connected:!1,lastEventAt:null,lastError:null};async init(Q){if(Q.platform!=="feishu")throw Error(`FeishuAdapter.init: expected platform "feishu", got "${Q.platform}"`);let J=Q.platformConfig;if(!J?.appId||!J?.appSecret)throw Error("FeishuAdapter.init: appId / appSecret missing in platformConfig");this.feishuConfig=J,this.connectionName=Q.connectionName,this.client=new B.Client({appId:J.appId,appSecret:J.appSecret,disableTokenCache:!1}),this.botOpenId=await D(this.client),this.mediaDir=J.channelDir?O(J.channelDir,"media"):null}async start(Q){if(!this.feishuConfig||!this.client)throw Error("FeishuAdapter.start: call init() first");let{appId:J,appSecret:V,access:X,groupPolicy:Z}=this.feishuConfig,$=this.connectionName,Y=this.botOpenId,G=this.mediaDir,W=this.client,U=new B.EventDispatcher({});U.register({"im.message.receive_v1":async(R)=>{try{this.health_={...this.health_,lastEventAt:Date.now()};let H=k(R,$,Y);if(!H)return;await E(R,H,W,G);let q=I(H,X,Z);if(!q.allow){L("deny",H,q.reason);return}await Q(H)}catch(H){let q=H instanceof Error?H.message:String(H);this.health_={...this.health_,lastError:q},L("error",null,q)}}}),this.wsClient=new B.WSClient({appId:J,appSecret:V,loggerLevel:B.LoggerLevel.warn}),await this.wsClient.start({eventDispatcher:U}),this.health_={...this.health_,connected:!0,lastError:null}}async stop(){this.health_={...this.health_,connected:!1},this.wsClient=null,this.client=null,this.feishuConfig=null}async send(Q){if(!this.client)throw Error("FeishuAdapter.send: call init() first");let J,V;if(Q.imagePath){let G=await P(this.client,Q.imagePath);if(!G)throw Error(`FeishuAdapter.send: image upload failed for ${Q.imagePath}`);J="image",V=JSON.stringify({image_key:G})}else{let G=Q.text??Q.markdown;if(!G)throw Error("FeishuAdapter.send: requires text, markdown, or imagePath");J="text",V=JSON.stringify({text:G})}let X=Q.replyToMessageId??Q.target.threadRootId;if(X){let W=(await this.client.im.message.reply({path:{message_id:X},data:{msg_type:J,content:V}}))?.data?.message_id;if(!W)throw Error("FeishuAdapter.send: reply returned no message_id");return{messageId:W}}let Z=Q.target.conversationType==="dm"?"open_id":"chat_id",Y=(await this.client.im.message.create({params:{receive_id_type:Z},data:{receive_id:Q.target.conversationId,msg_type:J,content:V}}))?.data?.message_id;if(!Y)throw Error("FeishuAdapter.send: create returned no message_id");return{messageId:Y}}async edit(Q,J,V){if(!this.client)throw Error("FeishuAdapter.edit: call init() first");let X=V.text??V.markdown;if(!X)throw Error("FeishuAdapter.edit: M3 supports text only");await this.client.im.message.update({path:{message_id:J},data:{msg_type:"text",content:JSON.stringify({text:X})}})}health(){return{...this.health_}}}function k(Q,J,V){let X=Q,Z=X?.message,$=X?.sender,Y=$?.sender_id?.open_id;if(!Z||!Y)return null;let G;if(Z.message_type==="text")try{G=JSON.parse(Z.content).text}catch{G=Z.content}else if(Z.message_type==="file")try{G=`[文件: ${JSON.parse(Z.content).file_name??"unknown"}]`}catch{G="[文件]"}else if(Z.message_type==="sticker")G="[表情]";else if(Z.message_type==="image")G=void 0;else return null;let W=Z.chat_type==="group"?"group":"dm",U=Array.isArray(Z.mentions)?Z.mentions:[],R=V?U.some((q)=>q?.id?.open_id===V):U.length>0,H=`${J}#feishu`;return{platform:"feishu",connectionId:H,tenantId:$?.tenant_key,conversation:{platform:"feishu",conversationId:Z.chat_id,conversationType:W,threadRootId:Z.root_id},sender:{id:Y},messageId:Z.message_id,mentioned:R,content:G?{text:G}:{},receivedAt:Date.now(),idempotencyKey:`feishu:${H}:${Z.message_id}`}}async function E(Q,J,V,X){if(!V||!X)return;let $=Q?.message;if(!$||$.message_type!=="image")return;let Y;try{Y=JSON.parse($.content).image_key}catch{return}if(!Y||!$.message_id)return;let G=await b(V,$.message_id,Y,X);if(G)J.content={...J.content,images:[G]}}async function b(Q,J,V,X){try{let Z=await Q.im.messageResource.get({path:{message_id:J,file_key:V},params:{type:"image"}});if(!Z)return null;let $=Z,Y=[];await new Promise((U,R)=>{$.on("data",(H)=>Y.push(Buffer.from(H))),$.on("end",()=>U()),$.on("error",(H)=>R(H))}),M(X,{recursive:!0});let G=`img_${Date.now()}_${T.randomBytes(4).toString("hex")}.png`,W=O(X,G);return F(W,Buffer.concat(Y)),W}catch{return null}}async function P(Q,J){try{if(!C(J))return null;let V=S(J),X=x.from(V);return(await Q.im.image.create({data:{image_type:"message",image:X}}))?.image_key??null}catch{return null}}async function D(Q){try{let V=await Q.request({method:"GET",url:"/open-apis/bot/v3/info"});return V?.bot?.open_id??V?.data?.bot?.open_id??null}catch{return null}}function I(Q,J,V){if(Q.conversation.conversationType==="dm")return J.allowFrom.includes(Q.sender.id)?{allow:!0,reason:""}:{allow:!1,reason:"sender not in allowFrom (dm)"};if(!J.allowChats.includes(Q.conversation.conversationId))return{allow:!1,reason:"chat not in allowChats"};if(V==="all")return{allow:!0,reason:""};if(V==="observe")return{allow:!1,reason:"groupPolicy=observe — chat in allowChats but no trigger"};if(Q.mentioned)return{allow:!0,reason:""};return{allow:!1,reason:`groupPolicy=${V} requires @bot mention (not mentioned)`}}function L(Q,J,V){let X=new Date().toISOString(),Z=J?`${J.conversation.conversationType}:${J.conversation.conversationId}`:"?",$=J?J.sender.id:"?";process.stderr.write(`[${X}] [feishu:audit] ${Q} from=${$} conv=${Z} — ${V}
3
+ `)}import{existsSync as _,readFileSync as z}from"node:fs";import{join as K}from"node:path";function A(Q){let J=w(K(Q,".env")),V=J.FEISHU_APP_ID,X=J.FEISHU_APP_SECRET;if(!V||!X)throw Error(`feishu channel: FEISHU_APP_ID / FEISHU_APP_SECRET missing in ${Q}/.env`);let Z=y(K(Q,"access.json"));return{appId:V,appSecret:X,access:Z,groupPolicy:"mention",ackPlaceholder:!0,auditRaw:!1,taskTimeoutMs:300000,channelDir:Q}}function w(Q){if(!_(Q))return{};let J={};for(let V of z(Q,"utf-8").split(/\r?\n/)){let X=V.trim();if(!X||X.startsWith("#"))continue;let Z=X.indexOf("=");if(Z<0)continue;let $=X.slice(0,Z).trim(),Y=X.slice(Z+1).trim().replace(/^["']|["']$/g,"");J[$]=Y}return J}function y(Q){if(!_(Q))return{allowFrom:[],allowChats:[]};try{let J=JSON.parse(z(Q,"utf-8"));return{allowFrom:Array.isArray(J.allowFrom)?J.allowFrom:[],allowChats:Array.isArray(J.allowChats)?J.allowChats:[]}}catch{return{allowFrom:[],allowChats:[]}}}var u=900000,f=120000;async function j(Q){let J=A(Q.channelDir),V=new N;await V.init({platform:"feishu",connectionName:Q.nodeAlias,ingressMode:"socket",groupPolicy:J.groupPolicy,ackPlaceholder:J.ackPlaceholder,auditRaw:J.auditRaw,taskTimeoutMs:J.taskTimeoutMs,platformConfig:J});let X=J.taskTimeoutMs||u,Z=Q.onEvent??p(V,X);return await V.start(h(Z)),V}function h(Q){let J=new Map;return async(V)=>{let X=Date.now();if(J.size>200){for(let[Z,$]of J)if(X-$>f)J.delete(Z)}if(J.has(V.idempotencyKey)){process.stderr.write(`[feishu:bridge] dedup drop ${V.idempotencyKey}
4
+ `);return}J.set(V.idempotencyKey,X),await Q(V)}}function p(Q,J){if(typeof process.send==="function")return v(Q,J);return m}function v(Q,J){if(typeof process.send!=="function")throw Error("createIPCEventHandler: parent process.send unavailable (not forked)");let V=new Map;return process.on("message",(X)=>{if(!l(X))return;let Z=V.get(X.eventKey);if(!Z)return;V.delete(X.eventKey);let{text:$,eventKey:Y}=X;(async()=>{try{await Q.send({target:Z.conversation,text:$,replyToMessageId:Z.messageId,correlation:{taskId:Y}})}catch(G){let W=G instanceof Error?G.message:String(G);process.stderr.write(`[feishu:bridge] reply send failed: ${W}
5
+ `)}})()}),async(X)=>{V.set(X.idempotencyKey,X),setTimeout(()=>{if(!V.has(X.idempotencyKey))return;V.delete(X.idempotencyKey),(async()=>{try{await Q.send({target:X.conversation,text:"[处理超时,任务可能仍在后台运行]",replyToMessageId:X.messageId,correlation:{taskId:X.idempotencyKey}}),process.stderr.write(`[feishu:bridge] timeout-notify sent for ${X.idempotencyKey} after ${J}ms
6
+ `)}catch($){let Y=$ instanceof Error?$.message:String($);process.stderr.write(`[feishu:bridge] timeout-notify send failed: ${Y}
7
+ `)}})()},J);let Z={type:"event",event:X};process.send(Z)}}function l(Q){if(!Q||typeof Q!=="object")return!1;let J=Q;return J.type==="reply"&&typeof J.eventKey==="string"&&typeof J.text==="string"}async function m(Q){process.stderr.write(`[feishu:bridge] event from=${Q.sender.id} conv=${Q.conversation.conversationType}:${Q.conversation.conversationId} mentioned=${Q.mentioned} text=${(Q.content.text??"").slice(0,80)}
8
+ `)}function c(Q){let J={};for(let V=0;V<Q.length;V++){let X=Q[V],Z=Q[V+1];if(X==="--channel-dir"&&Z)J.channelDir=Z,V++;else if(X==="--node-alias"&&Z)J.nodeAlias=Z,V++}return J}async function d(){let Q=c(process.argv.slice(2));if(!Q.channelDir||!Q.nodeAlias)process.stderr.write(`usage: feishu-worker --channel-dir <path> --node-alias <alias>
9
+ `),process.exit(2);try{await j({channelDir:Q.channelDir,nodeAlias:Q.nodeAlias}),process.stderr.write(`[feishu:worker] bridge online — node=${Q.nodeAlias} dir=${Q.channelDir} ipc=${typeof process.send==="function"?"yes":"no"}
10
+ `)}catch(J){let V=J instanceof Error?J.stack??J.message:String(J);process.stderr.write(`[feishu:worker] startup failed: ${V}
11
+ `),process.exit(1)}}d();
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env bun
2
- const a0_0x5076e2=a0_0xcb2a;(function(_0x1ff7ba,_0x45c8c6){const _0x2a0d38=a0_0xcb2a,_0x1de4e0=_0x1ff7ba();while(!![]){try{const _0x11b957=parseInt(_0x2a0d38(0x187))/0x1+-parseInt(_0x2a0d38(0x20c))/0x2+parseInt(_0x2a0d38(0x1be))/0x3*(parseInt(_0x2a0d38(0x193))/0x4)+parseInt(_0x2a0d38(0x1bc))/0x5+-parseInt(_0x2a0d38(0x1a8))/0x6+parseInt(_0x2a0d38(0x1bf))/0x7+-parseInt(_0x2a0d38(0x1e9))/0x8*(parseInt(_0x2a0d38(0x19e))/0x9);if(_0x11b957===_0x45c8c6)break;else _0x1de4e0['push'](_0x1de4e0['shift']());}catch(_0x1796b5){_0x1de4e0['push'](_0x1de4e0['shift']());}}}(a0_0x4f30,0xf25fd));import{readFileSync as a0_0x5ecebf,existsSync as a0_0x223d03}from'fs';import{randomUUID as a0_0xc5b628}from'crypto';import{join as a0_0x39926c}from'path';import{hostname as a0_0xd90332}from'os';import{execSync as a0_0x42eb80}from'child_process';import{Server as a0_0x50fcc5}from'@modelcontextprotocol/sdk/server/index.js';function a0_0xcb2a(_0x49e910,_0x1feaba){_0x49e910=_0x49e910-0x17d;const _0x4f3097=a0_0x4f30();let _0xcb2a6d=_0x4f3097[_0x49e910];return _0xcb2a6d;}import{StdioServerTransport as a0_0x1557d3}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x413e24,CallToolRequestSchema as a0_0x1b81a8}from'@modelcontextprotocol/sdk/types.js';function I(_0x52512d){const _0x5d5d1b=a0_0xcb2a;if(!a0_0x223d03(_0x52512d))return;for(let _0x4eabd6 of a0_0x5ecebf(_0x52512d,_0x5d5d1b(0x213))[_0x5d5d1b(0x18a)]('\x0a')){let _0x3bc212=_0x4eabd6[_0x5d5d1b(0x1ae)]();if(!_0x3bc212||_0x3bc212[_0x5d5d1b(0x216)]('#'))continue;let _0x5e302c=_0x3bc212[_0x5d5d1b(0x1e3)]('=');if(_0x5e302c<0x0)continue;let _0x2792f2=_0x3bc212[_0x5d5d1b(0x1a2)](0x0,_0x5e302c)['trim'](),_0x26e716=_0x3bc212[_0x5d5d1b(0x1a2)](_0x5e302c+0x1)[_0x5d5d1b(0x1ae)]()[_0x5d5d1b(0x1c4)](/^["']|["']$/g,'');if(!process.env[_0x2792f2])process.env[_0x2792f2]=_0x26e716;}}var L=process.env.HOME||'~',U=a0_0x39926c(L,'.claude/channels/commhub');I(a0_0x39926c(U,a0_0x5076e2(0x1c5)));var v=process[a0_0x5076e2(0x19a)]()[a0_0x5076e2(0x1c4)](/\//g,'-');I(a0_0x39926c(U,v,'.env'));function d(){const _0x37f15b=a0_0x5076e2;try{return a0_0x42eb80(_0x37f15b(0x17e),{'encoding':_0x37f15b(0x213),'timeout':0x7d0})['trim']();}catch{return'';}}function m(){const _0x239593=a0_0x5076e2;try{let _0x20a067=a0_0x39926c(L,_0x239593(0x212),_0x239593(0x1af));if(a0_0x223d03(_0x20a067))return JSON[_0x239593(0x1d9)](a0_0x5ecebf(_0x20a067,_0x239593(0x213)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u['hub']||a0_0x5076e2(0x1db),f=process.env.COMMHUB_TMUX||d();function r(){const _0x3e2bb4=a0_0x5076e2;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0x3e2bb4(0x1ae)]())return process.env.COMMHUB_ALIAS[_0x3e2bb4(0x1ae)]();return process['stderr'][_0x3e2bb4(0x200)](_0x3e2bb4(0x201)+(_0x3e2bb4(0x1ee)+(f||_0x3e2bb4(0x17f))+'\x20/\x20hostname='+a0_0xd90332()+_0x3e2bb4(0x1f4))),_0x3e2bb4(0x180)+process['pid'];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0xc5b628(),F=process.env.COMMHUB_TOKEN||u[a0_0x5076e2(0x188)]||'';function W(_0x2c52b0){const _0x2a738c=a0_0x5076e2;let _0x3eeeaf=new Date()[_0x2a738c(0x215)]()[_0x2a738c(0x1a2)](0x0,0x8);process[_0x2a738c(0x1ca)][_0x2a738c(0x200)]('['+_0x3eeeaf+']\x20[commhub]\x20'+_0x2c52b0+'\x0a');}function N(_0x59a12c){return new Promise(_0x40f87a=>setTimeout(_0x40f87a,_0x59a12c));}W(a0_0x5076e2(0x18b)+j+a0_0x5076e2(0x1dd)+G+a0_0x5076e2(0x1c3)+K[a0_0x5076e2(0x1a2)](0x0,0x8)+a0_0x5076e2(0x1e2)+(f||a0_0x5076e2(0x1c8))+a0_0x5076e2(0x1cd)+process[a0_0x5076e2(0x19a)]()+'\x20PROJECT_ENV='+v);var D=new Map(),x=new a0_0x50fcc5({'name':a0_0x5076e2(0x1d3),'version':'0.3.0'},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x5076e2(0x1da),a0_0x5076e2(0x1b7),'Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.',a0_0x5076e2(0x1b3),'Session\x20alias:\x20'+G][a0_0x5076e2(0x190)]('\x0a')});x['setRequestHandler'](a0_0x413e24,async()=>({'tools':[{'name':a0_0x5076e2(0x20d),'description':a0_0x5076e2(0x1ac),'inputSchema':{'type':a0_0x5076e2(0x219),'properties':{'task_id':{'type':a0_0x5076e2(0x1de),'description':a0_0x5076e2(0x1b9)},'text':{'type':a0_0x5076e2(0x1de),'description':'Reply\x20text\x20/\x20result\x20summary'},'status':{'type':a0_0x5076e2(0x1de),'enum':['completed','failed',a0_0x5076e2(0x1fa),a0_0x5076e2(0x1e8),'error',a0_0x5076e2(0x1b0)],'description':a0_0x5076e2(0x218)}},'required':[a0_0x5076e2(0x1f7)]}},{'name':a0_0x5076e2(0x1b6),'description':'Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','inputSchema':{'type':a0_0x5076e2(0x219),'properties':{'status':{'type':a0_0x5076e2(0x1de),'enum':[a0_0x5076e2(0x1d7),'idle','blocked','error']},'task':{'type':a0_0x5076e2(0x1de),'description':a0_0x5076e2(0x1f2)},'progress':{'type':a0_0x5076e2(0x1c0),'description':a0_0x5076e2(0x1fd)}},'required':[a0_0x5076e2(0x182)]}},{'name':a0_0x5076e2(0x1bb),'description':a0_0x5076e2(0x1ce),'inputSchema':{'type':a0_0x5076e2(0x219),'properties':{'alias':{'type':a0_0x5076e2(0x1de),'description':a0_0x5076e2(0x199)},'task':{'type':a0_0x5076e2(0x1de),'description':a0_0x5076e2(0x1b5)},'priority':{'type':a0_0x5076e2(0x1de),'enum':[a0_0x5076e2(0x181),a0_0x5076e2(0x19f),a0_0x5076e2(0x1a7)],'description':a0_0x5076e2(0x1a9)}},'required':['alias',a0_0x5076e2(0x1d2)]}},{'name':a0_0x5076e2(0x20b),'description':a0_0x5076e2(0x1d8),'inputSchema':{'type':a0_0x5076e2(0x219),'properties':{'alias':{'type':a0_0x5076e2(0x1de),'description':a0_0x5076e2(0x199)},'message':{'type':a0_0x5076e2(0x1de),'description':a0_0x5076e2(0x1ef)}},'required':[a0_0x5076e2(0x1bd),a0_0x5076e2(0x1f5)]}},{'name':a0_0x5076e2(0x1d1),'description':'Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','inputSchema':{'type':a0_0x5076e2(0x219),'properties':{}}}]}));async function Y(_0x18f641,_0x2bb795){const _0x49a02f=a0_0x5076e2;let _0x293398=await fetch(j+_0x49a02f(0x198),{'method':_0x49a02f(0x1e4),'headers':{'Content-Type':_0x49a02f(0x1e0),'Accept':_0x49a02f(0x18f),...F?{'Authorization':'Bearer\x20'+F}:{}},'body':JSON[_0x49a02f(0x1aa)]({'jsonrpc':_0x49a02f(0x206),'id':0x1,'method':_0x49a02f(0x208),'params':{'protocolVersion':_0x49a02f(0x1fc),'capabilities':{},'clientInfo':{'name':_0x49a02f(0x1d3),'version':_0x49a02f(0x19c)}}})});if(!_0x293398['ok']){let _0xaf1e8a=await _0x293398[_0x49a02f(0x1f7)]();return W(_0x49a02f(0x1a4)+_0x293398[_0x49a02f(0x182)]+'\x20'+_0xaf1e8a[_0x49a02f(0x1a2)](0x0,0x64)),{'ok':!0x1,'error':_0x49a02f(0x189)+_0x293398[_0x49a02f(0x182)]};}await _0x293398[_0x49a02f(0x1f7)]();let _0x3d0eac=(await(await fetch(j+'/mcp',{'method':'POST','headers':{'Content-Type':_0x49a02f(0x1e0),'Accept':_0x49a02f(0x18f),...F?{'Authorization':_0x49a02f(0x185)+F}:{}},'body':JSON['stringify']({'jsonrpc':_0x49a02f(0x206),'id':0x2,'method':_0x49a02f(0x207),'params':{'name':_0x18f641,'arguments':_0x2bb795}})}))['text']())[_0x49a02f(0x18a)]('\x0a')['find'](_0x5a8366=>_0x5a8366[_0x49a02f(0x216)]('data:\x20'));if(_0x3d0eac){let _0x25ec7f=JSON[_0x49a02f(0x1d9)](_0x3d0eac['slice'](0x6));return _0x25ec7f?.['result']?.['content']?.[0x0]?.[_0x49a02f(0x1f7)]?JSON[_0x49a02f(0x1d9)](_0x25ec7f[_0x49a02f(0x1b4)][_0x49a02f(0x194)][0x0][_0x49a02f(0x1f7)]):_0x25ec7f;}return{'ok':!0x1,'error':'no\x20response'};}x[a0_0x5076e2(0x1ed)](a0_0x1b81a8,async _0x5a4113=>{const _0x35244f=a0_0x5076e2;let {name:_0x217d86,arguments:_0x4fc3a1}=_0x5a4113['params'];if(_0x217d86==='commhub_reply'){let {task_id:_0x51d966,text:_0x2b9be9,status:_0x49c71d}=_0x4fc3a1;if(_0x49c71d===_0x35244f(0x1c6)||_0x49c71d==='failed'||_0x49c71d===_0x35244f(0x1fa)){let _0x45495b=_0x49c71d===_0x35244f(0x1c6)?_0x35244f(0x1d6):_0x49c71d,_0x82167f=_0x51d966?D['get'](_0x51d966)||_0x35244f(0x1e6):_0x35244f(0x1e6),_0xeb2e05=await Y(_0x35244f(0x196),{'alias':_0x82167f,'text':_0x2b9be9,'in_reply_to':_0x51d966||void 0x0,'status':_0x45495b,'from_session':G});if(_0x51d966)D[_0x35244f(0x1e1)](_0x51d966);return{'content':[{'type':_0x35244f(0x1f7),'text':JSON[_0x35244f(0x1aa)](_0xeb2e05)}]};}let _0x4031c2=await Y(_0x35244f(0x1df),{'resume_id':K,'alias':G,'status':_0x49c71d===_0x35244f(0x1e8)?_0x35244f(0x1e8):_0x49c71d==='error'?'error':_0x35244f(0x1d7),'task':_0x2b9be9['slice'](0x0,0xc8),'output':_0x2b9be9});return{'content':[{'type':_0x35244f(0x1f7),'text':JSON[_0x35244f(0x1aa)](_0x4031c2)}]};}if(_0x217d86===_0x35244f(0x1b6)){let {status:_0x59e42d,task:_0x4390fb,progress:_0x24edd2}=_0x4fc3a1,_0x58978b=await Y(_0x35244f(0x1df),{'resume_id':K,'alias':G,'status':_0x59e42d,'task':_0x4390fb,'progress':_0x24edd2});return{'content':[{'type':_0x35244f(0x1f7),'text':JSON[_0x35244f(0x1aa)](_0x58978b)}]};}if(_0x217d86===_0x35244f(0x1bb)){let {alias:_0x2cabad,task:_0x54b3a5,priority:_0x4a6c93}=_0x4fc3a1,_0x3219c6=await Y(_0x35244f(0x1a5),{'alias':_0x2cabad,'task':_0x54b3a5,'priority':_0x4a6c93||_0x35244f(0x19f),'from_session':G});return{'content':[{'type':'text','text':JSON[_0x35244f(0x1aa)](_0x3219c6)}]};}if(_0x217d86===_0x35244f(0x20b)){let {alias:_0x11beda,message:_0x1b537d}=_0x4fc3a1,_0x2e04df=await Y(_0x35244f(0x1a3),{'alias':_0x11beda,'message':_0x1b537d,'from_session':G});return{'content':[{'type':_0x35244f(0x1f7),'text':JSON['stringify'](_0x2e04df)}]};}if(_0x217d86===_0x35244f(0x1d1)){let _0x50201a=await Y('get_all_status',{});return{'content':[{'type':_0x35244f(0x1f7),'text':JSON[_0x35244f(0x1aa)](_0x50201a)}]};}return{'content':[{'type':_0x35244f(0x1f7),'text':JSON[_0x35244f(0x1aa)]({'error':_0x35244f(0x1fb)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x2aa51e=a0_0x5076e2;try{await Y(_0x2aa51e(0x1df),{'resume_id':K,'alias':G,'status':'idle','server':a0_0xd90332(),'hostname':a0_0xd90332(),'agent':_0x2aa51e(0x197),'project_dir':process[_0x2aa51e(0x19a)](),'tmux_name':f||void 0x0}),W('re-registered\x20as\x20\x22'+G+'\x22\x20after\x20SSE\x20reconnect');}catch(_0x1c398c){W('re-register\x20failed:\x20'+_0x1c398c);}}async function o(){const _0x1f926a=a0_0x5076e2;let _0x38935c=j+_0x1f926a(0x1b8)+encodeURIComponent(G),_0x22b7e8={};if(F)_0x22b7e8[_0x1f926a(0x1dc)]=_0x1f926a(0x185)+F;W(_0x1f926a(0x1b2)+_0x38935c);let _0x5e9dc3=O,_0x3032ba=!0x0,_0x216e07=null;while(!0x0){try{let _0x26a6c4=await fetch(_0x38935c,{'headers':_0x22b7e8});if(!_0x26a6c4['ok']){if(W('SSE\x20error:\x20'+_0x26a6c4[_0x1f926a(0x182)]+'\x20'+_0x26a6c4[_0x1f926a(0x1cc)]),_0x216e07=_0x216e07??Date['now'](),Date[_0x1f926a(0x1d0)]()-_0x216e07>T){W(_0x1f926a(0x19b)+j+_0x1f926a(0x1d5));return;}await N(_0x5e9dc3),_0x5e9dc3=Math[_0x1f926a(0x1b1)](_0x5e9dc3*0x2,R);continue;}let _0x175e39=_0x26a6c4[_0x1f926a(0x18c)][_0x1f926a(0x195)](),_0x95196c=new TextDecoder(),_0x2aaa5b='';_0x5e9dc3=O;while(!0x0){let {done:_0x4299fd,value:_0x1d271d}=await _0x175e39[_0x1f926a(0x1ff)]();if(_0x4299fd)break;_0x2aaa5b+=_0x95196c[_0x1f926a(0x1ab)](_0x1d271d,{'stream':!0x0});let _0x3be6c3=_0x2aaa5b[_0x1f926a(0x18a)]('\x0a\x0a');_0x2aaa5b=_0x3be6c3['pop']()||'';for(let _0x9c542b of _0x3be6c3){let _0x514789=_0x9c542b[_0x1f926a(0x18a)]('\x0a')[_0x1f926a(0x1e5)](_0x27d550=>_0x27d550[_0x1f926a(0x216)](_0x1f926a(0x19d)));if(!_0x514789)continue;try{let _0x5321c7=JSON[_0x1f926a(0x1d9)](_0x514789['slice'](0x6));if(await a(_0x5321c7),_0x5321c7[_0x1f926a(0x1cb)]===_0x1f926a(0x1c1)){if(_0x216e07=null,!_0x3032ba)await l();_0x3032ba=!0x1;}}catch(_0x42e762){W('parse\x20error:\x20'+_0x42e762);}}}W(_0x1f926a(0x1fe));}catch(_0x3ecd77){W(_0x1f926a(0x1a0)+_0x3ecd77);}if(_0x216e07=_0x216e07??Date[_0x1f926a(0x1d0)](),Date[_0x1f926a(0x1d0)]()-_0x216e07>T){W(_0x1f926a(0x19b)+j+_0x1f926a(0x1d5));return;}await N(_0x5e9dc3),_0x5e9dc3=Math[_0x1f926a(0x1b1)](_0x5e9dc3*0x2,R);}}async function a(_0x480a41){const _0x44013a=a0_0x5076e2;if(_0x480a41[_0x44013a(0x1cb)]===_0x44013a(0x1c1)){W(_0x44013a(0x17d)+G+'\x22');return;}if(_0x480a41[_0x44013a(0x1cb)]===_0x44013a(0x1f6)){if(W(_0x44013a(0x204)+_0x480a41[_0x44013a(0x183)]+':\x20'+_0x480a41[_0x44013a(0x1f5)][_0x44013a(0x1a2)](0x0,0x3c)),await x[_0x44013a(0x211)]({'method':'notifications/claude/channel','params':{'content':_0x480a41['message'],'meta':{'sender':_0x480a41[_0x44013a(0x183)]||'hub','sender_id':_0x44013a(0x214),'user':_0x480a41[_0x44013a(0x183)]||'hub','priority':'normal'}}}),_0x480a41[_0x44013a(0x186)])await Y('ack_inbox',{'alias':G,'message_id':_0x480a41['message_id']});return;}if(_0x480a41[_0x44013a(0x1cb)]===_0x44013a(0x1a1)||_0x480a41[_0x44013a(0x1cb)]==='broadcast'){W('←\x20'+_0x480a41[_0x44013a(0x1cb)]+_0x44013a(0x1ec)+_0x480a41[_0x44013a(0x1f0)]+_0x44013a(0x1f3)+(_0x480a41[_0x44013a(0x1a6)]||_0x44013a(0x19f)));let _0x47a122=await Y(_0x44013a(0x217),{'alias':G,'limit':0x5});if(_0x47a122?.['ok']&&_0x47a122[_0x44013a(0x191)]?.[_0x44013a(0x18d)]>0x0)for(let _0x572b3a of _0x47a122[_0x44013a(0x191)]){let _0x46e61c={'sender':_0x572b3a[_0x44013a(0x210)]||_0x44013a(0x1e6),'sender_id':'commhub','user':_0x572b3a[_0x44013a(0x210)]||'hub','task_id':_0x572b3a['id'],'priority':_0x572b3a[_0x44013a(0x1a6)]||'normal'};D[_0x44013a(0x1c2)](_0x572b3a['id'],_0x572b3a['from_session']||'hub'),await x[_0x44013a(0x211)]({'method':_0x44013a(0x20f),'params':{'content':_0x572b3a[_0x44013a(0x194)],'meta':_0x46e61c}}),W(_0x44013a(0x1ea)+_0x572b3a['id']['slice'](0x0,0x8)+_0x44013a(0x184)+_0x572b3a['from_session']+':\x20'+_0x572b3a[_0x44013a(0x194)][_0x44013a(0x1a2)](0x0,0x3c)),await Y(_0x44013a(0x1ad),{'alias':G,'message_id':_0x572b3a['id']});}}}async function n(){const _0x16f298=a0_0x5076e2;let _0x1b92ea=new a0_0x1557d3();await x[_0x16f298(0x1e7)](_0x1b92ea),W(_0x16f298(0x1eb)),W(_0x16f298(0x1d4)),o()[_0x16f298(0x1c9)](_0x2b0bf7=>W(_0x16f298(0x205)+_0x2b0bf7)),Y(_0x16f298(0x1df),{'resume_id':K,'alias':G,'status':_0x16f298(0x1ba),'server':a0_0xd90332(),'hostname':a0_0xd90332(),'agent':_0x16f298(0x197),'project_dir':process[_0x16f298(0x19a)](),'tmux_name':f||void 0x0})[_0x16f298(0x203)](()=>W(_0x16f298(0x1cf)+G+'\x22\x20('+K[_0x16f298(0x1a2)](0x0,0x8)+')'))[_0x16f298(0x1c9)](_0x429164=>W('warning:\x20could\x20not\x20register:\x20'+_0x429164)),setInterval(()=>{const _0x32c2e6=_0x16f298;Y(_0x32c2e6(0x1df),{'resume_id':K,'alias':G,'status':_0x32c2e6(0x1ba),'server':a0_0xd90332(),'hostname':a0_0xd90332(),'agent':_0x32c2e6(0x197),'project_dir':process[_0x32c2e6(0x19a)](),'tmux_name':f||void 0x0})[_0x32c2e6(0x1c9)](_0x1b2e41=>W(_0x32c2e6(0x18e)+_0x1b2e41));},0x2bf20),W(_0x16f298(0x202));}function a0_0x4f30(){const _0xfc2e80=['registered\x20as\x20\x22','now','commhub_get_all_status','task','commhub-channel','starting\x20SSE\x20listener...',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','replied','working','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','parse','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>','http://127.0.0.1:9200','Authorization','\x20ALIAS=','string','report_status','application/json','delete','...\x20TMUX=','indexOf','POST','find','hub','connect','blocked','836704oXLVpb','→\x20injected\x20task\x20','MCP\x20stdio\x20connected',':\x20inbox_count=','setRequestHandler','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','Message\x20content','inbox_count','shutting\x20down,\x20reporting\x20offline...','Current\x20task\x20description','\x20priority=','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','message','new_message','text','offline','SIGTERM','cancelled','unknown\x20tool','2025-03-26','Progress\x200-100','SSE\x20stream\x20ended,\x20reconnecting...','read','write','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','ready\x20—\x20waiting\x20for\x20events','then','←\x20message\x20from\x20','SSE\x20fatal:\x20','2.0','tools/call','initialize','stdin','fatal:\x20','commhub_send_message','2985078cxWUKQ','commhub_reply','exit','notifications/claude/channel','from_session','notification','.anet','utf-8','commhub','toTimeString','startsWith','get_inbox','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','object','SSE\x20connected\x20as\x20\x22','tmux\x20display-message\x20-p\x20\x27#S\x27','(none)','unattributed-','high','status','from','\x20from\x20','Bearer\x20','message_id','1492761CGcvUf','token','init\x20failed:\x20','split','ENV:\x20URL=','body','length','heartbeat\x20failed:\x20','application/json,\x20text/event-stream','join','messages','SIGINT','155132IFGRnC','content','getReader','send_reply','claude-code','/mcp','Target\x20session\x20alias','cwd','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','0.3.0','data:\x20','45ZsiXqX','normal','SSE\x20connection\x20error:\x20','new_task','slice','send_message','CommHub\x20init\x20failed:\x20','send_task','priority','low','8605344aldfDZ','Priority\x20(default:\x20normal)','stringify','decode','Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','ack_inbox','trim','config.json','in_progress','min','connecting\x20to\x20','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','result','Task\x20content','commhub_report_status','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','/events/','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','idle','commhub_send_task','1600665IiZdjD','alias','117khKxEA','7819259dGKgfR','number','connected','set','\x20RESUME_ID=','replace','.env','completed','end','none','catch','stderr','type','statusText','\x20CWD=','Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.'];a0_0x4f30=function(){return _0xfc2e80;};return a0_0x4f30();}n()[a0_0x5076e2(0x1c9)](_0x162fd2=>{const _0xe1dee7=a0_0x5076e2;W(_0xe1dee7(0x20a)+_0x162fd2),process[_0xe1dee7(0x20e)](0x1);});async function b(){const _0x25952a=a0_0x5076e2;W(_0x25952a(0x1f1)),await Y(_0x25952a(0x1df),{'resume_id':K,'alias':G,'status':_0x25952a(0x1f8),'task':'session\x20disconnected'})[_0x25952a(0x1c9)](()=>{}),process[_0x25952a(0x20e)](0x0);}process[a0_0x5076e2(0x209)]['on'](a0_0x5076e2(0x1c7),()=>b()),process['on'](a0_0x5076e2(0x1f9),()=>b()),process['on'](a0_0x5076e2(0x192),()=>b());
2
+ const a0_0x17c1bc=a0_0x4414;(function(_0x77249,_0x5847e6){const _0x129619=a0_0x4414,_0x80b5c=_0x77249();while(!![]){try{const _0x2eba18=-parseInt(_0x129619(0x1cd))/0x1*(parseInt(_0x129619(0x1d8))/0x2)+parseInt(_0x129619(0x1f9))/0x3*(parseInt(_0x129619(0x1bd))/0x4)+-parseInt(_0x129619(0x20f))/0x5*(-parseInt(_0x129619(0x17f))/0x6)+-parseInt(_0x129619(0x1ef))/0x7*(parseInt(_0x129619(0x180))/0x8)+parseInt(_0x129619(0x1fc))/0x9+parseInt(_0x129619(0x209))/0xa+parseInt(_0x129619(0x1c7))/0xb*(parseInt(_0x129619(0x203))/0xc);if(_0x2eba18===_0x5847e6)break;else _0x80b5c['push'](_0x80b5c['shift']());}catch(_0x4652cc){_0x80b5c['push'](_0x80b5c['shift']());}}}(a0_0x4702,0xd4ef2));import{readFileSync as a0_0x55a13d,existsSync as a0_0x4a890e}from'fs';import{randomUUID as a0_0x67fdc4}from'crypto';import{join as a0_0x44fc85}from'path';import{hostname as a0_0x3a479e}from'os';import{execSync as a0_0x4e7458}from'child_process';function a0_0x4414(_0x5ce452,_0xee8614){_0x5ce452=_0x5ce452-0x178;const _0x47022b=a0_0x4702();let _0x441445=_0x47022b[_0x5ce452];return _0x441445;}import{Server as a0_0x59a242}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x261411}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x3c4e48,CallToolRequestSchema as a0_0x9dc23a}from'@modelcontextprotocol/sdk/types.js';function I(_0x56b155){const _0x6cfbe7=a0_0x4414;if(!a0_0x4a890e(_0x56b155))return;for(let _0x40df68 of a0_0x55a13d(_0x56b155,_0x6cfbe7(0x1eb))[_0x6cfbe7(0x19c)]('\x0a')){let _0x26ef8c=_0x40df68[_0x6cfbe7(0x1e0)]();if(!_0x26ef8c||_0x26ef8c[_0x6cfbe7(0x1ca)]('#'))continue;let _0x2a672b=_0x26ef8c[_0x6cfbe7(0x1e2)]('=');if(_0x2a672b<0x0)continue;let _0x713907=_0x26ef8c[_0x6cfbe7(0x1aa)](0x0,_0x2a672b)[_0x6cfbe7(0x1e0)](),_0x27e093=_0x26ef8c[_0x6cfbe7(0x1aa)](_0x2a672b+0x1)[_0x6cfbe7(0x1e0)]()['replace'](/^["']|["']$/g,'');if(!process.env[_0x713907])process.env[_0x713907]=_0x27e093;}}var L=process.env.HOME||'~',U=a0_0x44fc85(L,'.claude/channels/commhub');I(a0_0x44fc85(U,'.env'));var v=process[a0_0x17c1bc(0x201)]()['replace'](/\//g,'-');I(a0_0x44fc85(U,v,a0_0x17c1bc(0x1f3)));function d(){const _0x16959d=a0_0x17c1bc;try{return a0_0x4e7458(_0x16959d(0x17b),{'encoding':_0x16959d(0x1eb),'timeout':0x7d0})[_0x16959d(0x1e0)]();}catch{return'';}}function m(){const _0x2c413f=a0_0x17c1bc;try{let _0x157f8a=a0_0x44fc85(L,_0x2c413f(0x1de),_0x2c413f(0x1e1));if(a0_0x4a890e(_0x157f8a))return JSON[_0x2c413f(0x210)](a0_0x55a13d(_0x157f8a,_0x2c413f(0x1eb)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x17c1bc(0x1b2)]||a0_0x17c1bc(0x1b1),f=process.env.COMMHUB_TMUX||d();function r(){const _0x202ba5=a0_0x17c1bc;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0x202ba5(0x1e0)]())return process.env.COMMHUB_ALIAS[_0x202ba5(0x1e0)]();return process[_0x202ba5(0x1ad)]['write'](_0x202ba5(0x184)+(_0x202ba5(0x19d)+(f||'(none)')+_0x202ba5(0x1cb)+a0_0x3a479e()+_0x202ba5(0x1be))),'unattributed-'+process[_0x202ba5(0x17d)];}function a0_0x4702(){const _0x20ca3c=['1162CgRgJu','tools/call','working','Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','.env',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','SSE\x20connected\x20as\x20\x22','delete','2025-03-26','ack_inbox','27315koFvNi','idle','end','5601600ILkURQ',':\x20inbox_count=','commhub_send_message','from_session','commhub_send_task','cwd','unknown\x20tool','36FDTHmT','0.3.0','\x22\x20(','setRequestHandler','Authorization',']\x20[commhub]\x20','6596250XCtnGU','commhub-channel','text','connect','result','in_progress','75geFUcb','parse','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','CommHub\x20init\x20failed:\x20','session\x20disconnected','tmux\x20display-message\x20-p\x20\x27#S\x27','alias','pid','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','245034NSLmvR','41008XvifJd','now','notification','object','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','ready\x20—\x20waiting\x20for\x20events','commhub_report_status','...\x20TMUX=','number','stringify','message','warning:\x20could\x20not\x20register:\x20','min','getReader','offline','content','body','SSE\x20fatal:\x20','string','set','Bearer\x20','\x20ALIAS=','initialize','new_task','replied','broadcast','send_message','normal','split','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','completed','Reply\x20text\x20/\x20result\x20summary','priority','high','task','commhub_get_all_status','get_all_status','decode','commhub_reply','\x20PROJECT_ENV=','POST','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','slice','registered\x20as\x20\x22','send_reply','stderr','from','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','\x20RESUME_ID=','http://127.0.0.1:9200','hub','fatal:\x20','connected','catch','error','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','stdin','cancelled','read','get','report_status','508SyQSwu','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','/events/','find','pop','token','commhub','SSE\x20stream\x20ended,\x20reconnecting...','data:\x20','params','1057793JsQacA','2.0','MCP\x20stdio\x20connected','startsWith','\x20/\x20hostname=','none','5214szetws','blocked','application/json,\x20text/event-stream','Message\x20content','write','failed','SIGINT','Priority\x20(default:\x20normal)','send_task','Session\x20alias:\x20','heartbeat\x20failed:\x20','620cKvzAx','re-registered\x20as\x20\x22','/mcp','type','\x20priority=','claude-code','.anet','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','trim','config.json','indexOf','connecting\x20to\x20','ENV:\x20URL=','SSE\x20error:\x20','application/json','no\x20response','exit','\x20from\x20','Target\x20session\x20alias','utf-8','inbox_count','status','SSE\x20connection\x20error:\x20'];a0_0x4702=function(){return _0x20ca3c;};return a0_0x4702();}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x67fdc4(),F=process.env.COMMHUB_TOKEN||u[a0_0x17c1bc(0x1c2)]||'';function W(_0x4e0066){const _0x453734=a0_0x17c1bc;let _0x3d2421=new Date()['toTimeString']()[_0x453734(0x1aa)](0x0,0x8);process['stderr'][_0x453734(0x1d1)]('['+_0x3d2421+_0x453734(0x208)+_0x4e0066+'\x0a');}function N(_0x170604){return new Promise(_0x40bbd0=>setTimeout(_0x40bbd0,_0x170604));}W(a0_0x17c1bc(0x1e4)+j+a0_0x17c1bc(0x195)+G+a0_0x17c1bc(0x1b0)+K['slice'](0x0,0x8)+a0_0x17c1bc(0x187)+(f||a0_0x17c1bc(0x1cc))+'\x20CWD='+process[a0_0x17c1bc(0x201)]()+a0_0x17c1bc(0x1a7)+v);var D=new Map(),x=new a0_0x59a242({'name':'commhub-channel','version':a0_0x17c1bc(0x204)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':['Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>',a0_0x17c1bc(0x1df),'Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.',a0_0x17c1bc(0x1d6)+G]['join']('\x0a')});x[a0_0x17c1bc(0x206)](a0_0x3c4e48,async()=>({'tools':[{'name':'commhub_reply','description':a0_0x17c1bc(0x1f2),'inputSchema':{'type':'object','properties':{'task_id':{'type':'string','description':a0_0x17c1bc(0x1a9)},'text':{'type':'string','description':a0_0x17c1bc(0x19f)},'status':{'type':'string','enum':[a0_0x17c1bc(0x19e),a0_0x17c1bc(0x1d2),a0_0x17c1bc(0x1b9),a0_0x17c1bc(0x1ce),a0_0x17c1bc(0x1b6),a0_0x17c1bc(0x20e)],'description':a0_0x17c1bc(0x178)}},'required':['text']}},{'name':a0_0x17c1bc(0x186),'description':'Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','inputSchema':{'type':'object','properties':{'status':{'type':'string','enum':['working',a0_0x17c1bc(0x1fa),'blocked',a0_0x17c1bc(0x1b6)]},'task':{'type':a0_0x17c1bc(0x192),'description':'Current\x20task\x20description'},'progress':{'type':a0_0x17c1bc(0x188),'description':'Progress\x200-100'}},'required':['status']}},{'name':a0_0x17c1bc(0x200),'description':'Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','inputSchema':{'type':'object','properties':{'alias':{'type':'string','description':a0_0x17c1bc(0x1ea)},'task':{'type':a0_0x17c1bc(0x192),'description':'Task\x20content'},'priority':{'type':a0_0x17c1bc(0x192),'enum':[a0_0x17c1bc(0x1a1),'normal','low'],'description':a0_0x17c1bc(0x1d4)}},'required':[a0_0x17c1bc(0x17c),a0_0x17c1bc(0x1a2)]}},{'name':a0_0x17c1bc(0x1fe),'description':a0_0x17c1bc(0x1b7),'inputSchema':{'type':a0_0x17c1bc(0x183),'properties':{'alias':{'type':a0_0x17c1bc(0x192),'description':a0_0x17c1bc(0x1ea)},'message':{'type':a0_0x17c1bc(0x192),'description':a0_0x17c1bc(0x1d0)}},'required':[a0_0x17c1bc(0x17c),a0_0x17c1bc(0x18a)]}},{'name':a0_0x17c1bc(0x1a3),'description':a0_0x17c1bc(0x1af),'inputSchema':{'type':a0_0x17c1bc(0x183),'properties':{}}}]}));async function Y(_0x5cf483,_0x50c3d9){const _0x401bc5=a0_0x17c1bc;let _0x52aa0d=await fetch(j+_0x401bc5(0x1da),{'method':'POST','headers':{'Content-Type':_0x401bc5(0x1e6),'Accept':_0x401bc5(0x1cf),...F?{'Authorization':_0x401bc5(0x194)+F}:{}},'body':JSON['stringify']({'jsonrpc':'2.0','id':0x1,'method':_0x401bc5(0x196),'params':{'protocolVersion':_0x401bc5(0x1f7),'capabilities':{},'clientInfo':{'name':_0x401bc5(0x20a),'version':'0.3.0'}}})});if(!_0x52aa0d['ok']){let _0x2a7191=await _0x52aa0d[_0x401bc5(0x20b)]();return W(_0x401bc5(0x179)+_0x52aa0d[_0x401bc5(0x1ed)]+'\x20'+_0x2a7191[_0x401bc5(0x1aa)](0x0,0x64)),{'ok':!0x1,'error':'init\x20failed:\x20'+_0x52aa0d['status']};}await _0x52aa0d[_0x401bc5(0x20b)]();let _0x53f56d=(await(await fetch(j+_0x401bc5(0x1da),{'method':_0x401bc5(0x1a8),'headers':{'Content-Type':'application/json','Accept':_0x401bc5(0x1cf),...F?{'Authorization':_0x401bc5(0x194)+F}:{}},'body':JSON[_0x401bc5(0x189)]({'jsonrpc':_0x401bc5(0x1c8),'id':0x2,'method':_0x401bc5(0x1f0),'params':{'name':_0x5cf483,'arguments':_0x50c3d9}})}))['text']())[_0x401bc5(0x19c)]('\x0a')[_0x401bc5(0x1c0)](_0x1369c6=>_0x1369c6[_0x401bc5(0x1ca)](_0x401bc5(0x1c5)));if(_0x53f56d){let _0x14d068=JSON[_0x401bc5(0x210)](_0x53f56d[_0x401bc5(0x1aa)](0x6));return _0x14d068?.[_0x401bc5(0x20d)]?.['content']?.[0x0]?.[_0x401bc5(0x20b)]?JSON['parse'](_0x14d068['result'][_0x401bc5(0x18f)][0x0][_0x401bc5(0x20b)]):_0x14d068;}return{'ok':!0x1,'error':_0x401bc5(0x1e7)};}x[a0_0x17c1bc(0x206)](a0_0x9dc23a,async _0x2ef731=>{const _0x54d149=a0_0x17c1bc;let {name:_0x364735,arguments:_0x5b3a25}=_0x2ef731[_0x54d149(0x1c6)];if(_0x364735===_0x54d149(0x1a6)){let {task_id:_0xb39255,text:_0x35f77a,status:_0x22cd40}=_0x5b3a25;if(_0x22cd40===_0x54d149(0x19e)||_0x22cd40===_0x54d149(0x1d2)||_0x22cd40==='cancelled'){let _0x2a1ea6=_0x22cd40===_0x54d149(0x19e)?_0x54d149(0x198):_0x22cd40,_0x28d91f=_0xb39255?D[_0x54d149(0x1bb)](_0xb39255)||'hub':_0x54d149(0x1b2),_0x2c79e5=await Y(_0x54d149(0x1ac),{'alias':_0x28d91f,'text':_0x35f77a,'in_reply_to':_0xb39255||void 0x0,'status':_0x2a1ea6,'from_session':G});if(_0xb39255)D[_0x54d149(0x1f6)](_0xb39255);return{'content':[{'type':_0x54d149(0x20b),'text':JSON['stringify'](_0x2c79e5)}]};}let _0x1e539d=await Y('report_status',{'resume_id':K,'alias':G,'status':_0x22cd40==='blocked'?_0x54d149(0x1ce):_0x22cd40===_0x54d149(0x1b6)?'error':_0x54d149(0x1f1),'task':_0x35f77a[_0x54d149(0x1aa)](0x0,0xc8),'output':_0x35f77a});return{'content':[{'type':_0x54d149(0x20b),'text':JSON[_0x54d149(0x189)](_0x1e539d)}]};}if(_0x364735===_0x54d149(0x186)){let {status:_0x4294a2,task:_0x481198,progress:_0x65b46b}=_0x5b3a25,_0x3bb439=await Y(_0x54d149(0x1bc),{'resume_id':K,'alias':G,'status':_0x4294a2,'task':_0x481198,'progress':_0x65b46b});return{'content':[{'type':'text','text':JSON[_0x54d149(0x189)](_0x3bb439)}]};}if(_0x364735===_0x54d149(0x200)){let {alias:_0x5ba93e,task:_0x3104e0,priority:_0x293bed}=_0x5b3a25,_0x9c13cb=await Y(_0x54d149(0x1d5),{'alias':_0x5ba93e,'task':_0x3104e0,'priority':_0x293bed||_0x54d149(0x19b),'from_session':G});return{'content':[{'type':_0x54d149(0x20b),'text':JSON[_0x54d149(0x189)](_0x9c13cb)}]};}if(_0x364735==='commhub_send_message'){let {alias:_0x1c6d39,message:_0x3f642b}=_0x5b3a25,_0x511c23=await Y(_0x54d149(0x19a),{'alias':_0x1c6d39,'message':_0x3f642b,'from_session':G});return{'content':[{'type':_0x54d149(0x20b),'text':JSON[_0x54d149(0x189)](_0x511c23)}]};}if(_0x364735==='commhub_get_all_status'){let _0x512679=await Y(_0x54d149(0x1a4),{});return{'content':[{'type':_0x54d149(0x20b),'text':JSON[_0x54d149(0x189)](_0x512679)}]};}return{'content':[{'type':_0x54d149(0x20b),'text':JSON[_0x54d149(0x189)]({'error':_0x54d149(0x202)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x211d8a=a0_0x17c1bc;try{await Y(_0x211d8a(0x1bc),{'resume_id':K,'alias':G,'status':_0x211d8a(0x1fa),'server':a0_0x3a479e(),'hostname':a0_0x3a479e(),'agent':_0x211d8a(0x1dd),'project_dir':process[_0x211d8a(0x201)](),'tmux_name':f||void 0x0}),W(_0x211d8a(0x1d9)+G+'\x22\x20after\x20SSE\x20reconnect');}catch(_0xc18921){W('re-register\x20failed:\x20'+_0xc18921);}}async function o(){const _0x1a595c=a0_0x17c1bc;let _0x5278d4=j+_0x1a595c(0x1bf)+encodeURIComponent(G),_0x20dc16={};if(F)_0x20dc16[_0x1a595c(0x207)]='Bearer\x20'+F;W(_0x1a595c(0x1e3)+_0x5278d4);let _0x177279=O,_0x442cfa=!0x0,_0x577267=null;while(!0x0){try{let _0x5e052e=await fetch(_0x5278d4,{'headers':_0x20dc16});if(!_0x5e052e['ok']){if(W(_0x1a595c(0x1e5)+_0x5e052e['status']+'\x20'+_0x5e052e['statusText']),_0x577267=_0x577267??Date[_0x1a595c(0x181)](),Date[_0x1a595c(0x181)]()-_0x577267>T){W(_0x1a595c(0x17e)+j+_0x1a595c(0x1f4));return;}await N(_0x177279),_0x177279=Math[_0x1a595c(0x18c)](_0x177279*0x2,R);continue;}let _0x2682c0=_0x5e052e[_0x1a595c(0x190)][_0x1a595c(0x18d)](),_0x34663e=new TextDecoder(),_0x2f5fe2='';_0x177279=O;while(!0x0){let {done:_0x2225e0,value:_0x36f060}=await _0x2682c0[_0x1a595c(0x1ba)]();if(_0x2225e0)break;_0x2f5fe2+=_0x34663e[_0x1a595c(0x1a5)](_0x36f060,{'stream':!0x0});let _0x4a7190=_0x2f5fe2[_0x1a595c(0x19c)]('\x0a\x0a');_0x2f5fe2=_0x4a7190[_0x1a595c(0x1c1)]()||'';for(let _0x487918 of _0x4a7190){let _0x5cff5b=_0x487918['split']('\x0a')[_0x1a595c(0x1c0)](_0x2f91a8=>_0x2f91a8[_0x1a595c(0x1ca)](_0x1a595c(0x1c5)));if(!_0x5cff5b)continue;try{let _0x46f52c=JSON[_0x1a595c(0x210)](_0x5cff5b[_0x1a595c(0x1aa)](0x6));if(await a(_0x46f52c),_0x46f52c[_0x1a595c(0x1db)]==='connected'){if(_0x577267=null,!_0x442cfa)await l();_0x442cfa=!0x1;}}catch(_0x33be10){W('parse\x20error:\x20'+_0x33be10);}}}W(_0x1a595c(0x1c4));}catch(_0x510fc2){W(_0x1a595c(0x1ee)+_0x510fc2);}if(_0x577267=_0x577267??Date[_0x1a595c(0x181)](),Date[_0x1a595c(0x181)]()-_0x577267>T){W(_0x1a595c(0x17e)+j+_0x1a595c(0x1f4));return;}await N(_0x177279),_0x177279=Math[_0x1a595c(0x18c)](_0x177279*0x2,R);}}async function a(_0x275bb5){const _0xaa8c71=a0_0x17c1bc;if(_0x275bb5[_0xaa8c71(0x1db)]===_0xaa8c71(0x1b4)){W(_0xaa8c71(0x1f5)+G+'\x22');return;}if(_0x275bb5[_0xaa8c71(0x1db)]==='new_message'){if(W('←\x20message\x20from\x20'+_0x275bb5[_0xaa8c71(0x1ae)]+':\x20'+_0x275bb5['message'][_0xaa8c71(0x1aa)](0x0,0x3c)),await x[_0xaa8c71(0x182)]({'method':'notifications/claude/channel','params':{'content':_0x275bb5[_0xaa8c71(0x18a)],'meta':{'sender':_0x275bb5[_0xaa8c71(0x1ae)]||'hub','sender_id':_0xaa8c71(0x1c3),'user':_0x275bb5[_0xaa8c71(0x1ae)]||'hub','priority':_0xaa8c71(0x19b)}}}),_0x275bb5['message_id'])await Y(_0xaa8c71(0x1f8),{'alias':G,'message_id':_0x275bb5['message_id']});return;}if(_0x275bb5[_0xaa8c71(0x1db)]===_0xaa8c71(0x197)||_0x275bb5['type']===_0xaa8c71(0x199)){W('←\x20'+_0x275bb5[_0xaa8c71(0x1db)]+_0xaa8c71(0x1fd)+_0x275bb5[_0xaa8c71(0x1ec)]+_0xaa8c71(0x1dc)+(_0x275bb5['priority']||_0xaa8c71(0x19b)));let _0xf9ab14=await Y('get_inbox',{'alias':G,'limit':0x5});if(_0xf9ab14?.['ok']&&_0xf9ab14['messages']?.['length']>0x0)for(let _0x1cfe55 of _0xf9ab14['messages']){let _0x4c1d65={'sender':_0x1cfe55[_0xaa8c71(0x1ff)]||_0xaa8c71(0x1b2),'sender_id':_0xaa8c71(0x1c3),'user':_0x1cfe55[_0xaa8c71(0x1ff)]||'hub','task_id':_0x1cfe55['id'],'priority':_0x1cfe55[_0xaa8c71(0x1a0)]||_0xaa8c71(0x19b)};D[_0xaa8c71(0x193)](_0x1cfe55['id'],_0x1cfe55[_0xaa8c71(0x1ff)]||'hub'),await x[_0xaa8c71(0x182)]({'method':'notifications/claude/channel','params':{'content':_0x1cfe55[_0xaa8c71(0x18f)],'meta':_0x4c1d65}}),W('→\x20injected\x20task\x20'+_0x1cfe55['id']['slice'](0x0,0x8)+_0xaa8c71(0x1e9)+_0x1cfe55[_0xaa8c71(0x1ff)]+':\x20'+_0x1cfe55[_0xaa8c71(0x18f)][_0xaa8c71(0x1aa)](0x0,0x3c)),await Y('ack_inbox',{'alias':G,'message_id':_0x1cfe55['id']});}}}async function n(){const _0x51c430=a0_0x17c1bc;let _0x7b948f=new a0_0x261411();await x[_0x51c430(0x20c)](_0x7b948f),W(_0x51c430(0x1c9)),W('starting\x20SSE\x20listener...'),o()['catch'](_0x1566e0=>W(_0x51c430(0x191)+_0x1566e0)),Y(_0x51c430(0x1bc),{'resume_id':K,'alias':G,'status':_0x51c430(0x1fa),'server':a0_0x3a479e(),'hostname':a0_0x3a479e(),'agent':'claude-code','project_dir':process[_0x51c430(0x201)](),'tmux_name':f||void 0x0})['then'](()=>W(_0x51c430(0x1ab)+G+_0x51c430(0x205)+K['slice'](0x0,0x8)+')'))[_0x51c430(0x1b5)](_0x6663fe=>W(_0x51c430(0x18b)+_0x6663fe)),setInterval(()=>{const _0x59552d=_0x51c430;Y(_0x59552d(0x1bc),{'resume_id':K,'alias':G,'status':_0x59552d(0x1fa),'server':a0_0x3a479e(),'hostname':a0_0x3a479e(),'agent':_0x59552d(0x1dd),'project_dir':process[_0x59552d(0x201)](),'tmux_name':f||void 0x0})[_0x59552d(0x1b5)](_0x2e8ed1=>W(_0x59552d(0x1d7)+_0x2e8ed1));},0x2bf20),W(_0x51c430(0x185));}n()[a0_0x17c1bc(0x1b5)](_0xa153a8=>{const _0xbec6e9=a0_0x17c1bc;W(_0xbec6e9(0x1b3)+_0xa153a8),process[_0xbec6e9(0x1e8)](0x1);});async function b(){const _0x17983e=a0_0x17c1bc;W('shutting\x20down,\x20reporting\x20offline...'),await Y(_0x17983e(0x1bc),{'resume_id':K,'alias':G,'status':_0x17983e(0x18e),'task':_0x17983e(0x17a)})[_0x17983e(0x1b5)](()=>{}),process[_0x17983e(0x1e8)](0x0);}process[a0_0x17c1bc(0x1b8)]['on'](a0_0x17c1bc(0x1fb),()=>b()),process['on']('SIGTERM',()=>b()),process['on'](a0_0x17c1bc(0x1d3),()=>b());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network",
3
- "version": "2.2.21",
3
+ "version": "2.2.22-preview.1",
4
4
  "description": "AI Agent Network CLI — Local-first multi-agent orchestration across 4 runtimes (Claude Code CLI / Claude Agent SDK / Codex SDK / Grok Build ACP) and 8+ LLM providers (Anthropic / OpenAI / xAI Grok / MiniMax / DeepSeek / GLM / Kimi / InternLM / Xiaomi MiMo / OpenRouter). Apache 2.0.",
5
5
  "type": "module",
6
6
  "main": "dist/src/client.js",
@@ -19,7 +19,7 @@
19
19
  ],
20
20
  "scripts": {
21
21
  "typecheck": "tsc --noEmit",
22
- "build": "bun build src/client.ts --outdir dist/src --target node --minify && bun build bin/cli.ts --outdir dist/bin --target node --minify --external @sleep2agi/commhub-server --external bun:sqlite --external '../../server/*' && bun build src/node-server.ts --outdir dist/src --target node --minify --external @modelcontextprotocol/sdk && tsc --emitDeclarationOnly --declaration --outDir dist && npx javascript-obfuscator dist/bin/cli.js --output dist/bin/cli.js --compact true --string-array true --string-array-encoding base64 && npx javascript-obfuscator dist/src/client.js --output dist/src/client.js --compact true --string-array true && npx javascript-obfuscator dist/src/node-server.js --output dist/src/node-server.js --compact true --string-array true",
22
+ "build": "bun build src/client.ts --outdir dist/src --target node --minify && bun build bin/cli.ts --outdir dist/bin --target node --minify --external @sleep2agi/commhub-server --external bun:sqlite --external '../../server/*' && bun build src/node-server.ts --outdir dist/src --target node --minify --external @modelcontextprotocol/sdk && bun build src/im/feishu/worker.ts --outdir dist/src/im/feishu --target node --minify --external @larksuiteoapi/node-sdk && tsc --emitDeclarationOnly --declaration --outDir dist && npx javascript-obfuscator dist/bin/cli.js --output dist/bin/cli.js --compact true --string-array true --string-array-encoding base64 && npx javascript-obfuscator dist/src/client.js --output dist/src/client.js --compact true --string-array true && npx javascript-obfuscator dist/src/node-server.js --output dist/src/node-server.js --compact true --string-array true",
23
23
  "prepublishOnly": "npm run build"
24
24
  },
25
25
  "keywords": [
@@ -63,7 +63,8 @@
63
63
  "node": ">=22.13.0"
64
64
  },
65
65
  "dependencies": {
66
- "@inquirer/prompts": "^8.4.3"
66
+ "@inquirer/prompts": "^8.4.3",
67
+ "@larksuiteoapi/node-sdk": "^1.42.0"
67
68
  },
68
69
  "devDependencies": {
69
70
  "@modelcontextprotocol/sdk": "^1.12.0",