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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- const a0_0x245f1e=a0_0x3d1a;(function(_0x5a7b1c,_0x4b0e95){const _0x195303=a0_0x3d1a,_0x510511=_0x5a7b1c();while(!![]){try{const _0x5d2b32=parseInt(_0x195303(0x95))/0x1*(parseInt(_0x195303(0xd5))/0x2)+-parseInt(_0x195303(0x93))/0x3+parseInt(_0x195303(0xb7))/0x4+parseInt(_0x195303(0xd0))/0x5*(-parseInt(_0x195303(0x9c))/0x6)+parseInt(_0x195303(0xa7))/0x7+parseInt(_0x195303(0xb0))/0x8*(parseInt(_0x195303(0x91))/0x9)+-parseInt(_0x195303(0xcb))/0xa;if(_0x5d2b32===_0x4b0e95)break;else _0x510511['push'](_0x510511['shift']());}catch(_0x317665){_0x510511['push'](_0x510511['shift']());}}}(a0_0x1cd6,0xf200d));import{EventEmitter as a0_0x317040}from'events';import{hostname as a0_0x33f726}from'os';class T extends a0_0x317040{[a0_0x245f1e(0xda)];['alias'];[a0_0x245f1e(0xbb)];[a0_0x245f1e(0xae)];[a0_0x245f1e(0xb5)];[a0_0x245f1e(0xa3)];[a0_0x245f1e(0xaa)];[a0_0x245f1e(0xe2)];[a0_0x245f1e(0x92)];['running']=!0x1;constructor(_0x3540c6){const _0x4346c9=a0_0x245f1e;super();if(this[_0x4346c9(0xda)]=_0x3540c6['url'][_0x4346c9(0xbd)](/\/$/,''),this[_0x4346c9(0x90)]=_0x3540c6[_0x4346c9(0x90)],this[_0x4346c9(0xbb)]=_0x3540c6[_0x4346c9(0xbb)],this[_0x4346c9(0xae)]=_0x3540c6['agent']||'sdk',this[_0x4346c9(0xb5)]=_0x4346c9(0xbc)+_0x3540c6[_0x4346c9(0x90)]+'-'+Date['now']()[_0x4346c9(0xde)](0x24),this[_0x4346c9(0xa3)]=_0x3540c6['heartbeatInterval']??0x2bf20,this[_0x4346c9(0xaa)]=_0x3540c6[_0x4346c9(0xaa)]??0xbb8,_0x3540c6[_0x4346c9(0xd7)]!==!0x1)this['connect']();}[a0_0x245f1e(0x8e)](_0xd56960){const _0x5dd363=a0_0x245f1e;console[_0x5dd363(0x8e)]('['+new Date()[_0x5dd363(0xc2)]()[_0x5dd363(0x9b)](0x0,0x8)+_0x5dd363(0xb9)+this[_0x5dd363(0x90)]+']\x20'+_0xd56960);}async['call'](_0x236515,_0x5739fa){const _0x5fbf37=a0_0x245f1e;let _0x5a9633={'Content-Type':_0x5fbf37(0xc1),'Accept':_0x5fbf37(0xc0)};if(this[_0x5fbf37(0xbb)])_0x5a9633['Authorization']=_0x5fbf37(0xac)+this[_0x5fbf37(0xbb)];let _0x4a86b4=await(await fetch(this[_0x5fbf37(0xda)]+_0x5fbf37(0xca),{'method':_0x5fbf37(0xbf),'headers':_0x5a9633,'body':JSON['stringify']({'jsonrpc':_0x5fbf37(0xb3),'id':Date[_0x5fbf37(0xab)](),'method':_0x5fbf37(0xe1),'params':{'name':_0x236515,'arguments':_0x5739fa}})}))[_0x5fbf37(0xa9)](),_0x3a2838=_0x4a86b4['match'](/data: (.+)/),_0x4be409=_0x3a2838?JSON[_0x5fbf37(0xba)](_0x3a2838[0x1]):JSON[_0x5fbf37(0xba)](_0x4a86b4),_0xdebda4=_0x4be409?.[_0x5fbf37(0xc6)]?.[_0x5fbf37(0xd1)]?.[0x0]?.[_0x5fbf37(0xa9)];return _0xdebda4?JSON[_0x5fbf37(0xba)](_0xdebda4):_0x4be409;}async[a0_0x245f1e(0xdc)](){const _0x2af897=a0_0x245f1e;if(this['running'])return;this[_0x2af897(0x98)]=!0x0,await this[_0x2af897(0xdb)]('idle'),this['log'](_0x2af897(0xdf)),this['heartbeatTimer']=setInterval(()=>{const _0xf7761b=_0x2af897;this['status'](_0xf7761b(0xb6))[_0xf7761b(0xb8)](_0x1d94bf=>this[_0xf7761b(0x8e)](_0xf7761b(0x9a)+_0x1d94bf[_0xf7761b(0xa8)]));},this[_0x2af897(0xa3)]),this['connectSSE']();}async['disconnect'](){const _0x2dd220=a0_0x245f1e;if(this['running']=!0x1,this['sseAbort']?.[_0x2dd220(0xc4)](),this[_0x2dd220(0xe2)])clearInterval(this[_0x2dd220(0xe2)]);await this[_0x2dd220(0xdb)](_0x2dd220(0xcc))['catch'](()=>{}),this[_0x2dd220(0x8e)]('disconnected');}async[a0_0x245f1e(0x99)](_0x3255d1,_0x2949d9,_0x5906df=a0_0x245f1e(0xa4)){const _0xdee442=a0_0x245f1e;return this[_0xdee442(0xa5)]('send_task',{'alias':_0x3255d1,'task':_0x2949d9,'priority':_0x5906df,'from_session':this[_0xdee442(0x90)]});}async[a0_0x245f1e(0xa8)](_0x464b56,_0x3f02f1){const _0x3ac9b0=a0_0x245f1e;return this[_0x3ac9b0(0xa5)](_0x3ac9b0(0xc3),{'alias':_0x464b56,'message':_0x3f02f1,'from_session':this['alias']});}async['reply'](_0x324d53,_0x2a7c95,_0x4b9720=a0_0x245f1e(0xa2)){const _0x50586d=a0_0x245f1e;return this[_0x50586d(0xa5)](_0x50586d(0x94),{'in_reply_to':_0x324d53,'text':_0x2a7c95,'status':_0x4b9720});}async[a0_0x245f1e(0xdb)](_0x28e8f1,_0x52782d){const _0x3b4b62=a0_0x245f1e;return this[_0x3b4b62(0xa5)](_0x3b4b62(0xd9),{'resume_id':this[_0x3b4b62(0xb5)],'alias':this[_0x3b4b62(0x90)],'status':_0x28e8f1,'server':a0_0x33f726(),'hostname':a0_0x33f726(),'agent':this[_0x3b4b62(0xae)],'project_dir':process[_0x3b4b62(0xa6)](),..._0x52782d});}async['getAllStatus'](){const _0x2c6071=a0_0x245f1e;return this['call'](_0x2c6071(0xa0),{});}async['broadcast'](_0x7c59df,_0xcf53ba){const _0x585bf2=a0_0x245f1e;return this['call'](_0x585bf2(0xb4),{'message':_0x7c59df,'filter_server':_0xcf53ba?.['server'],'filter_status':_0xcf53ba?.[_0x585bf2(0xdb)]});}async['connectSSE'](){const _0xb28033=a0_0x245f1e;let _0xd4bf68=encodeURIComponent(this[_0xb28033(0x90)]),_0x520900=this[_0xb28033(0xda)]+_0xb28033(0xc5)+_0xd4bf68,_0x3bce39=this[_0xb28033(0xaa)];while(this[_0xb28033(0x98)]){try{this[_0xb28033(0x92)]=new AbortController();let _0x59294e={'Accept':_0xb28033(0xd6)};if(this[_0xb28033(0xbb)])_0x59294e[_0xb28033(0xd4)]=_0xb28033(0xac)+this[_0xb28033(0xbb)];let _0x50d661=await fetch(_0x520900,{'headers':_0x59294e,'signal':this[_0xb28033(0x92)]['signal']});if(!_0x50d661['ok']||!_0x50d661[_0xb28033(0xe0)]){this['log'](_0xb28033(0xce)+_0x50d661[_0xb28033(0xdb)]),await this['sleep'](_0x3bce39),_0x3bce39=Math[_0xb28033(0x96)](_0x3bce39*1.5,0xea60);continue;}_0x3bce39=this[_0xb28033(0xaa)];let _0x159a22=_0x50d661[_0xb28033(0xe0)]['getReader'](),_0x1b774a=new TextDecoder(),_0x25826f='';while(this[_0xb28033(0x98)]){let {done:_0x5396de,value:_0x25d01e}=await _0x159a22['read']();if(_0x5396de)break;_0x25826f+=_0x1b774a[_0xb28033(0xb2)](_0x25d01e,{'stream':!0x0});let _0x5349c3=_0x25826f[_0xb28033(0x8f)]('\x0a');_0x25826f=_0x5349c3[_0xb28033(0xbe)]()||'';for(let _0x47522b of _0x5349c3){if(!_0x47522b[_0xb28033(0xaf)]('data:\x20'))continue;try{let _0x47de2b=JSON[_0xb28033(0xba)](_0x47522b[_0xb28033(0x9b)](0x6));if(_0x47de2b['type']===_0xb28033(0x9f)){this[_0xb28033(0x8e)](_0xb28033(0xc7)),this[_0xb28033(0xcf)](_0xb28033(0x9f));continue;}if(_0x47de2b[_0xb28033(0xcd)]===_0xb28033(0xd3)||_0x47de2b[_0xb28033(0xcd)]===_0xb28033(0xdd)||_0x47de2b[_0xb28033(0xcd)]==='broadcast')await this[_0xb28033(0xad)]();}catch{}}}}catch(_0x569f3b){if(_0x569f3b['name']==='AbortError')break;this[_0xb28033(0xcf)](_0xb28033(0xc9),_0x569f3b),this['log'](_0xb28033(0x97)+_0x569f3b[_0xb28033(0xa8)]);}if(this[_0xb28033(0x98)])this[_0xb28033(0xcf)]('disconnected'),this[_0xb28033(0x8e)](_0xb28033(0xd2)+_0x3bce39/0x3e8+_0xb28033(0xd8)),await this['sleep'](_0x3bce39),_0x3bce39=Math[_0xb28033(0x96)](_0x3bce39*1.5,0xea60);}}async[a0_0x245f1e(0xad)](){const _0x45a32b=a0_0x245f1e;try{let _0x28bc89=(await this[_0x45a32b(0xa5)](_0x45a32b(0xc8),{'alias':this[_0x45a32b(0x90)],'limit':0xa}))?.[_0x45a32b(0x9d)]||[];for(let _0x38a57c of _0x28bc89)await this[_0x45a32b(0xa5)](_0x45a32b(0xa1),{'alias':this[_0x45a32b(0x90)],'message_id':_0x38a57c['id']}),this[_0x45a32b(0x8e)]('←\x20'+_0x38a57c[_0x45a32b(0x9e)]+':\x20'+_0x38a57c[_0x45a32b(0xd1)]['slice'](0x0,0x3c)),this['emit']('task',_0x38a57c),this[_0x45a32b(0xcf)]('message',_0x38a57c);}catch(_0x13b4ce){this[_0x45a32b(0x8e)](_0x45a32b(0xb1)+_0x13b4ce[_0x45a32b(0xa8)]);}}['sleep'](_0xa5e5){return new Promise(_0x57f733=>setTimeout(_0x57f733,_0xa5e5));}}function a0_0x1cd6(){const _0x10bc79=['split','alias','1143891ZKyEnI','sseAbort','1703472VBATGc','send_reply','1VeVDAQ','min','SSE\x20error:\x20','running','send','heartbeat\x20failed:\x20','slice','54nnbnqB','messages','from_session','connected','get_all_status','ack_inbox','completed','heartbeatInterval','normal','call','cwd','13518295FYUktq','message','text','reconnectDelay','now','Bearer\x20','processInbox','agent','startsWith','40tZELig','inbox\x20error:\x20','decode','2.0','broadcast','resumeId','idle','7633244eBvtLX','catch',']\x20[commhub:','parse','token','sdk-','replace','pop','POST','application/json,\x20text/event-stream','application/json','toTimeString','send_message','abort','/events/','result','SSE\x20connected','get_inbox','error','/mcp','21919240vKZNvu','offline','type','SSE\x20failed:\x20','emit','831005QfhfqY','content','SSE\x20reconnecting\x20in\x20','new_task','Authorization','1543622CGGAMX','text/event-stream','autoConnect','s...','report_status','url','status','connect','new_message','toString','registered','body','tools/call','heartbeatTimer','log'];a0_0x1cd6=function(){return _0x10bc79;};return a0_0x1cd6();}function a0_0x3d1a(_0x272d91,_0x1e3d59){_0x272d91=_0x272d91-0x8e;const _0x1cd602=a0_0x1cd6();let _0x3d1ab0=_0x1cd602[_0x272d91];return _0x3d1ab0;}var $=T;export{$ as default,T as CommHub};
1
+ const a0_0x5c1182=a0_0x5914;(function(_0x51db45,_0x113a65){const _0x24ca30=a0_0x5914,_0x14be71=_0x51db45();while(!![]){try{const _0x1886ac=parseInt(_0x24ca30(0x159))/0x1*(-parseInt(_0x24ca30(0x181))/0x2)+parseInt(_0x24ca30(0x16c))/0x3*(-parseInt(_0x24ca30(0x18a))/0x4)+parseInt(_0x24ca30(0x198))/0x5*(parseInt(_0x24ca30(0x15b))/0x6)+parseInt(_0x24ca30(0x193))/0x7+-parseInt(_0x24ca30(0x149))/0x8*(-parseInt(_0x24ca30(0x17b))/0x9)+parseInt(_0x24ca30(0x166))/0xa*(-parseInt(_0x24ca30(0x182))/0xb)+-parseInt(_0x24ca30(0x18d))/0xc*(-parseInt(_0x24ca30(0x176))/0xd);if(_0x1886ac===_0x113a65)break;else _0x14be71['push'](_0x14be71['shift']());}catch(_0x5f5a0d){_0x14be71['push'](_0x14be71['shift']());}}}(a0_0x2ae2,0xc9a33));import{EventEmitter as a0_0xa1ec8b}from'events';function a0_0x2ae2(){const _0x5b1a60=['name','autoConnect','sdk-','reconnectDelay','text','3UjQBlG','getAllStatus','normal','connected','resumeId','Authorization','ack_inbox','content','url','error','13FIzYje','type','offline','stringify','connect','819DxMwYi','broadcast','slice','SSE\x20error:\x20','SSE\x20failed:\x20','status','2350706wtAxdJ','756107RHNjlE','heartbeatInterval','parse','now','get_all_status','application/json,\x20text/event-stream','sleep','idle','6380756SQGCkv','abort','catch','21926868wSkZrh','get_inbox','messages','send_message','call',']\x20[commhub:','8056776btrGBG','inbox\x20error:\x20','running','SSE\x20connected','split','55JfBTlj','processInbox','send_reply','toTimeString','registered','message','Bearer\x20','read','getReader','emit','119576YFfynK','replace','s...','alias','from_session','toString','send_task','disconnected','heartbeatTimer','text/event-stream','data:\x20','startsWith','result','agent','tools/call','POST','1olpHZn','SSE\x20reconnecting\x20in\x20','495138mHmuDY','/mcp','token','min','log','heartbeat\x20failed:\x20','disconnect','body','send','sseAbort','2.0','240LCUYXS'];a0_0x2ae2=function(){return _0x5b1a60;};return a0_0x2ae2();}import{hostname as a0_0x45b467}from'os';class T extends a0_0xa1ec8b{['url'];[a0_0x5c1182(0x14c)];[a0_0x5c1182(0x15d)];[a0_0x5c1182(0x156)];[a0_0x5c1182(0x170)];['heartbeatInterval'];[a0_0x5c1182(0x16a)];[a0_0x5c1182(0x151)];['sseAbort'];[a0_0x5c1182(0x195)]=!0x1;constructor(_0x124812){const _0xa2afd8=a0_0x5c1182;super();if(this[_0xa2afd8(0x174)]=_0x124812['url'][_0xa2afd8(0x14a)](/\/$/,''),this[_0xa2afd8(0x14c)]=_0x124812[_0xa2afd8(0x14c)],this[_0xa2afd8(0x15d)]=_0x124812[_0xa2afd8(0x15d)],this[_0xa2afd8(0x156)]=_0x124812[_0xa2afd8(0x156)]||'sdk',this[_0xa2afd8(0x170)]=_0xa2afd8(0x169)+_0x124812[_0xa2afd8(0x14c)]+'-'+Date[_0xa2afd8(0x185)]()[_0xa2afd8(0x14e)](0x24),this[_0xa2afd8(0x183)]=_0x124812['heartbeatInterval']??0x2bf20,this[_0xa2afd8(0x16a)]=_0x124812['reconnectDelay']??0xbb8,_0x124812[_0xa2afd8(0x168)]!==!0x1)this[_0xa2afd8(0x17a)]();}[a0_0x5c1182(0x15f)](_0x559704){const _0x4e23d5=a0_0x5c1182;console[_0x4e23d5(0x15f)]('['+new Date()[_0x4e23d5(0x142)]()[_0x4e23d5(0x17d)](0x0,0x8)+_0x4e23d5(0x192)+this[_0x4e23d5(0x14c)]+']\x20'+_0x559704);}async[a0_0x5c1182(0x191)](_0x365e00,_0x27879d){const _0x4d44d7=a0_0x5c1182;let _0x280753={'Content-Type':'application/json','Accept':_0x4d44d7(0x187)};if(this[_0x4d44d7(0x15d)])_0x280753[_0x4d44d7(0x171)]=_0x4d44d7(0x145)+this[_0x4d44d7(0x15d)];let _0x3af945=await(await fetch(this[_0x4d44d7(0x174)]+_0x4d44d7(0x15c),{'method':_0x4d44d7(0x158),'headers':_0x280753,'body':JSON[_0x4d44d7(0x179)]({'jsonrpc':_0x4d44d7(0x165),'id':Date['now'](),'method':_0x4d44d7(0x157),'params':{'name':_0x365e00,'arguments':_0x27879d}})}))[_0x4d44d7(0x16b)](),_0x1968ba=_0x3af945['match'](/data: (.+)/),_0x45496d=_0x1968ba?JSON['parse'](_0x1968ba[0x1]):JSON['parse'](_0x3af945),_0x333625=_0x45496d?.[_0x4d44d7(0x155)]?.[_0x4d44d7(0x173)]?.[0x0]?.['text'];return _0x333625?JSON[_0x4d44d7(0x184)](_0x333625):_0x45496d;}async[a0_0x5c1182(0x17a)](){const _0xa900b4=a0_0x5c1182;if(this[_0xa900b4(0x195)])return;this[_0xa900b4(0x195)]=!0x0,await this[_0xa900b4(0x180)](_0xa900b4(0x189)),this[_0xa900b4(0x15f)](_0xa900b4(0x143)),this[_0xa900b4(0x151)]=setInterval(()=>{const _0x572032=_0xa900b4;this['status'](_0x572032(0x189))[_0x572032(0x18c)](_0xefe55c=>this[_0x572032(0x15f)](_0x572032(0x160)+_0xefe55c[_0x572032(0x144)]));},this[_0xa900b4(0x183)]),this['connectSSE']();}async[a0_0x5c1182(0x161)](){const _0x5accdc=a0_0x5c1182;if(this['running']=!0x1,this[_0x5accdc(0x164)]?.[_0x5accdc(0x18b)](),this[_0x5accdc(0x151)])clearInterval(this[_0x5accdc(0x151)]);await this[_0x5accdc(0x180)](_0x5accdc(0x178))[_0x5accdc(0x18c)](()=>{}),this[_0x5accdc(0x15f)](_0x5accdc(0x150));}async[a0_0x5c1182(0x163)](_0x3d4a3d,_0x22d67c,_0x2f06c6=a0_0x5c1182(0x16e)){const _0x45e71f=a0_0x5c1182;return this[_0x45e71f(0x191)](_0x45e71f(0x14f),{'alias':_0x3d4a3d,'task':_0x22d67c,'priority':_0x2f06c6,'from_session':this[_0x45e71f(0x14c)]});}async[a0_0x5c1182(0x144)](_0x27cd93,_0x22d08b){const _0x278bf0=a0_0x5c1182;return this[_0x278bf0(0x191)](_0x278bf0(0x190),{'alias':_0x27cd93,'message':_0x22d08b,'from_session':this[_0x278bf0(0x14c)]});}async['reply'](_0x16875b,_0x40b6cb,_0x506bef='completed'){const _0x2e537d=a0_0x5c1182;return this[_0x2e537d(0x191)](_0x2e537d(0x141),{'in_reply_to':_0x16875b,'text':_0x40b6cb,'status':_0x506bef});}async['status'](_0x5e6817,_0xcd65de){const _0x337473=a0_0x5c1182;return this[_0x337473(0x191)]('report_status',{'resume_id':this[_0x337473(0x170)],'alias':this[_0x337473(0x14c)],'status':_0x5e6817,'server':a0_0x45b467(),'hostname':a0_0x45b467(),'agent':this[_0x337473(0x156)],'project_dir':process['cwd'](),..._0xcd65de});}async[a0_0x5c1182(0x16d)](){const _0x2a41ce=a0_0x5c1182;return this[_0x2a41ce(0x191)](_0x2a41ce(0x186),{});}async[a0_0x5c1182(0x17c)](_0x46a6e7,_0x274781){const _0x53017f=a0_0x5c1182;return this['call']('broadcast',{'message':_0x46a6e7,'filter_server':_0x274781?.['server'],'filter_status':_0x274781?.[_0x53017f(0x180)]});}async['connectSSE'](){const _0x124d5a=a0_0x5c1182;let _0x1f5d74=encodeURIComponent(this[_0x124d5a(0x14c)]),_0xfed840=this[_0x124d5a(0x174)]+'/events/'+_0x1f5d74,_0x88fb32=this[_0x124d5a(0x16a)];while(this['running']){try{this[_0x124d5a(0x164)]=new AbortController();let _0x21ffbe={'Accept':_0x124d5a(0x152)};if(this['token'])_0x21ffbe['Authorization']=_0x124d5a(0x145)+this[_0x124d5a(0x15d)];let _0x2f1a92=await fetch(_0xfed840,{'headers':_0x21ffbe,'signal':this['sseAbort']['signal']});if(!_0x2f1a92['ok']||!_0x2f1a92[_0x124d5a(0x162)]){this['log'](_0x124d5a(0x17f)+_0x2f1a92[_0x124d5a(0x180)]),await this[_0x124d5a(0x188)](_0x88fb32),_0x88fb32=Math[_0x124d5a(0x15e)](_0x88fb32*1.5,0xea60);continue;}_0x88fb32=this[_0x124d5a(0x16a)];let _0x40722e=_0x2f1a92[_0x124d5a(0x162)][_0x124d5a(0x147)](),_0x1d3b8d=new TextDecoder(),_0x4e42eb='';while(this[_0x124d5a(0x195)]){let {done:_0x4d22c,value:_0xcf7bcf}=await _0x40722e[_0x124d5a(0x146)]();if(_0x4d22c)break;_0x4e42eb+=_0x1d3b8d['decode'](_0xcf7bcf,{'stream':!0x0});let _0x36dc9b=_0x4e42eb[_0x124d5a(0x197)]('\x0a');_0x4e42eb=_0x36dc9b['pop']()||'';for(let _0x5ee04c of _0x36dc9b){if(!_0x5ee04c[_0x124d5a(0x154)](_0x124d5a(0x153)))continue;try{let _0x1c2e74=JSON['parse'](_0x5ee04c[_0x124d5a(0x17d)](0x6));if(_0x1c2e74['type']===_0x124d5a(0x16f)){this['log'](_0x124d5a(0x196)),this[_0x124d5a(0x148)](_0x124d5a(0x16f));continue;}if(_0x1c2e74[_0x124d5a(0x177)]==='new_task'||_0x1c2e74['type']==='new_message'||_0x1c2e74[_0x124d5a(0x177)]==='broadcast')await this[_0x124d5a(0x140)]();}catch{}}}}catch(_0x2f8c16){if(_0x2f8c16[_0x124d5a(0x167)]==='AbortError')break;this[_0x124d5a(0x148)](_0x124d5a(0x175),_0x2f8c16),this['log'](_0x124d5a(0x17e)+_0x2f8c16[_0x124d5a(0x144)]);}if(this[_0x124d5a(0x195)])this[_0x124d5a(0x148)](_0x124d5a(0x150)),this['log'](_0x124d5a(0x15a)+_0x88fb32/0x3e8+_0x124d5a(0x14b)),await this['sleep'](_0x88fb32),_0x88fb32=Math[_0x124d5a(0x15e)](_0x88fb32*1.5,0xea60);}}async[a0_0x5c1182(0x140)](){const _0x2de56c=a0_0x5c1182;try{let _0x5b4a60=(await this[_0x2de56c(0x191)](_0x2de56c(0x18e),{'alias':this[_0x2de56c(0x14c)],'limit':0xa}))?.[_0x2de56c(0x18f)]||[];for(let _0x11527a of _0x5b4a60)await this[_0x2de56c(0x191)](_0x2de56c(0x172),{'alias':this[_0x2de56c(0x14c)],'message_id':_0x11527a['id']}),this[_0x2de56c(0x15f)]('←\x20'+_0x11527a[_0x2de56c(0x14d)]+':\x20'+_0x11527a[_0x2de56c(0x173)]['slice'](0x0,0x3c)),this[_0x2de56c(0x148)]('task',_0x11527a),this[_0x2de56c(0x148)](_0x2de56c(0x144),_0x11527a);}catch(_0x3589ad){this[_0x2de56c(0x15f)](_0x2de56c(0x194)+_0x3589ad[_0x2de56c(0x144)]);}}[a0_0x5c1182(0x188)](_0x45d8d3){return new Promise(_0x5099b7=>setTimeout(_0x5099b7,_0x45d8d3));}}function a0_0x5914(_0x3a1e5f,_0x260fab){_0x3a1e5f=_0x3a1e5f-0x140;const _0x2ae2cc=a0_0x2ae2();let _0x591478=_0x2ae2cc[_0x3a1e5f];return _0x591478;}var $=T;export{$ as default,T as CommHub};
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Tiny loader that mirrors what `initTelegramChannel` does at boot —
3
+ * read the parsed access.json blob and produce both the raw allowFrom
4
+ * payload (handed to the resolver verbatim) AND a boot-time warning
5
+ * string for the empty / malformed case.
6
+ *
7
+ * Extracted so wiring-level regression tests (e.g. "channel state
8
+ * built from `{allowFrom: [123]}` MUST fail-closed when a message
9
+ * arrives") run without spinning up a real telegram channel + fs
10
+ * mocks. The previous bug — `.map(String)` rewriting [123] into
11
+ * ["123"] at init time — slipped past resolver-only unit tests
12
+ * because the resolver never saw the offending shape; the channel
13
+ * state did.
14
+ */
15
+ export interface LoadedTelegramAccess {
16
+ /** Raw value from access.json — handed verbatim to resolveTelegramAccess. */
17
+ allowFromRaw: unknown;
18
+ /** Boot-time warning string when allowFrom is empty / malformed; null otherwise. */
19
+ bootWarn: string | null;
20
+ }
21
+ export declare function loadTelegramAccess(opts: {
22
+ channelDir: string;
23
+ parsedAccess: {
24
+ allowFrom?: unknown;
25
+ } | null | undefined;
26
+ }): LoadedTelegramAccess;
27
+ /**
28
+ * Discriminated reason for an access decision. Callers can switch on
29
+ * `kind` for routing (e.g. `empty-fail-closed` warrants a louder boot
30
+ * warning than a simple `denied` mid-stream).
31
+ */
32
+ export type AccessKind = "wildcard-allow" | "explicit-allow" | "empty-fail-closed" | "denied";
33
+ export interface AccessDecision {
34
+ allow: boolean;
35
+ kind: AccessKind;
36
+ /** Short, machine-readable reason for logging. */
37
+ reason: string;
38
+ }
39
+ /**
40
+ * Normalise an allowFrom input into a deduped string[] suitable for
41
+ * the lookup checks. Accepts: a real string[] (the happy case), null /
42
+ * undefined (treated as empty), a non-array shape (defensive — treated
43
+ * as empty + reason surfaced).
44
+ */
45
+ export declare function normalizeAllowFrom(raw: unknown): {
46
+ list: string[];
47
+ malformed: boolean;
48
+ };
49
+ /**
50
+ * Resolve whether an inbound Telegram message should be processed.
51
+ *
52
+ * Fail-closed: empty / missing / malformed `allowFrom` always denies.
53
+ * Wildcard `"*"` always allows. Otherwise the sender's id OR username
54
+ * (after non-empty check) must match a list entry.
55
+ *
56
+ * @param opts.allowFrom the access.json `allowFrom` array
57
+ * @param opts.senderId numeric Telegram user id as string
58
+ * (callers already coerce; we trust)
59
+ * @param opts.senderUsername optional `@username` (no `@` prefix)
60
+ */
61
+ export declare function resolveTelegramAccess(opts: {
62
+ allowFrom: unknown;
63
+ senderId: string;
64
+ senderUsername?: string | null;
65
+ }): AccessDecision;
66
+ /**
67
+ * Resolve whether an inbound Feishu/Lark event should be processed.
68
+ *
69
+ * Same fail-closed contract as telegram. DM path checks `allowFrom`;
70
+ * group path checks `allowChats` first, then `groupPolicy` decides
71
+ * whether listed chats trigger the agent (`all` → trigger any message;
72
+ * `observe` → never trigger; `mention` → only on @-mention — caller
73
+ * still has to honour that flag, this helper just returns allow=true).
74
+ *
75
+ * @param opts.conversationType "dm" | "group" | "channel" | "thread"
76
+ * @param opts.allowFrom access.json `allowFrom` array
77
+ * @param opts.allowChats access.json `allowChats` array
78
+ * @param opts.senderId feishu open_id of the sender
79
+ * @param opts.conversationId feishu chat_id of the conversation
80
+ * @param opts.groupPolicy "all" | "mention" | "observe"
81
+ */
82
+ export declare function resolveFeishuAccess(opts: {
83
+ conversationType: "dm" | "group" | "channel" | "thread" | string;
84
+ allowFrom: unknown;
85
+ allowChats: unknown;
86
+ senderId: string;
87
+ conversationId: string;
88
+ groupPolicy: "all" | "mention" | "observe" | string;
89
+ }): AccessDecision;
90
+ /**
91
+ * Build the boot-time warning string when a channel starts with an
92
+ * empty / malformed allowlist. Caller emits this via `warn()` once at
93
+ * startup so operators see the fail-closed posture immediately rather
94
+ * than discovering it the first time a message gets denied.
95
+ *
96
+ * Returns `null` when the allowlist has at least one entry (no boot
97
+ * warning needed).
98
+ */
99
+ export declare function buildEmptyAllowlistWarn(opts: {
100
+ channel: string;
101
+ channelDir: string;
102
+ allowFrom: unknown;
103
+ }): string | null;
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import*as b from"@larksuiteoapi/node-sdk";import f from"node:crypto";import{existsSync as w,mkdirSync as T,readFileSync as I,writeFileSync as h}from"node:fs";import{join as L}from"node:path";import{Readable as v}from"node:stream";class R{platform="feishu";ingressMode="socket";feishuConfig=null;connectionName="";client=null;wsClient=null;botOpenId=null;mediaDir=null;health_={connected:!1,lastEventAt:null,lastError:null};async init(Q){if(Q.platform!=="feishu")throw Error(`FeishuAdapter.init: expected platform "feishu", got "${Q.platform}"`);let J=Q.platformConfig;if(!J?.appId||!J?.appSecret)throw Error("FeishuAdapter.init: appId / appSecret missing in platformConfig");this.feishuConfig=J,this.connectionName=Q.connectionName,this.client=new b.Client({appId:J.appId,appSecret:J.appSecret,disableTokenCache:!1}),this.botOpenId=await m(this.client),this.mediaDir=J.channelDir?L(J.channelDir,"media"):null}async start(Q){if(!this.feishuConfig||!this.client)throw Error("FeishuAdapter.start: call init() first");let{appId:J,appSecret:Z,access:Y,groupPolicy:V}=this.feishuConfig,G=this.connectionName,q=this.botOpenId,X=this.mediaDir,K=this.client,N=new b.EventDispatcher({});N.register({"im.message.receive_v1":async(H)=>{try{this.health_={...this.health_,lastEventAt:Date.now()};let $=l(H,G,q);if(!$)return;await p(H,$,K,X);let B=d($,Y,V);if(!B.allow){O("deny",$,B.reason);return}await Q($)}catch($){let B=$ instanceof Error?$.message:String($);this.health_={...this.health_,lastError:B},O("error",null,B)}}}),this.wsClient=new b.WSClient({appId:J,appSecret:Z,loggerLevel:b.LoggerLevel.warn}),await this.wsClient.start({eventDispatcher:N}),this.health_={...this.health_,connected:!0,lastError:null}}async stop(){this.health_={...this.health_,connected:!1},this.wsClient=null,this.client=null,this.feishuConfig=null}async send(Q){if(!this.client)throw Error("FeishuAdapter.send: call init() first");let J,Z;if(Q.imagePath){let X=await c(this.client,Q.imagePath);if(!X)throw Error(`FeishuAdapter.send: image upload failed for ${Q.imagePath}`);J="image",Z=JSON.stringify({image_key:X})}else{let X=Q.text??Q.markdown;if(!X)throw Error("FeishuAdapter.send: requires text, markdown, or imagePath");J="text",Z=JSON.stringify({text:X})}let Y=Q.replyToMessageId??Q.target.threadRootId;if(Y){let K=(await this.client.im.message.reply({path:{message_id:Y},data:{msg_type:J,content:Z}}))?.data?.message_id;if(!K)throw Error("FeishuAdapter.send: reply returned no message_id");return{messageId:K}}let V=Q.target.conversationType==="dm"?"open_id":"chat_id",q=(await this.client.im.message.create({params:{receive_id_type:V},data:{receive_id:Q.target.conversationId,msg_type:J,content:Z}}))?.data?.message_id;if(!q)throw Error("FeishuAdapter.send: create returned no message_id");return{messageId:q}}async edit(Q,J,Z){if(!this.client)throw Error("FeishuAdapter.edit: call init() first");let Y=Z.text??Z.markdown;if(!Y)throw Error("FeishuAdapter.edit: M3 supports text only");await this.client.im.message.update({path:{message_id:J},data:{msg_type:"text",content:JSON.stringify({text:Y})}})}health(){return{...this.health_}}}function l(Q,J,Z){let Y=Q,V=Y?.message,G=Y?.sender,q=G?.sender_id?.open_id;if(!V||!q)return null;let X;if(V.message_type==="text")try{X=JSON.parse(V.content).text}catch{X=V.content}else if(V.message_type==="file")try{X=`[文件: ${JSON.parse(V.content).file_name??"unknown"}]`}catch{X="[文件]"}else if(V.message_type==="sticker")X="[表情]";else if(V.message_type==="image")X=void 0;else return null;let K=V.chat_type==="group"?"group":"dm",N=Array.isArray(V.mentions)?V.mentions:[],H=Z?N.some((B)=>B?.id?.open_id===Z):N.length>0,$=`${J}#feishu`;return{platform:"feishu",connectionId:$,tenantId:G?.tenant_key,conversation:{platform:"feishu",conversationId:V.chat_id,conversationType:K,threadRootId:V.root_id},sender:{id:q},messageId:V.message_id,mentioned:H,content:X?{text:X}:{},receivedAt:Date.now(),idempotencyKey:`feishu:${$}:${V.message_id}`}}async function p(Q,J,Z,Y){if(!Z||!Y)return;let G=Q?.message;if(!G||G.message_type!=="image")return;let q;try{q=JSON.parse(G.content).image_key}catch{return}if(!q||!G.message_id)return;let X=await g(Z,G.message_id,q,Y);if(X)J.content={...J.content,images:[X]}}async function g(Q,J,Z,Y){try{let V=await Q.im.messageResource.get({path:{message_id:J,file_key:Z},params:{type:"image"}});if(!V)return null;let G=V,q=[];await new Promise((N,H)=>{G.on("data",($)=>q.push(Buffer.from($))),G.on("end",()=>N()),G.on("error",($)=>H($))}),T(Y,{recursive:!0});let X=`img_${Date.now()}_${f.randomBytes(4).toString("hex")}.png`,K=L(Y,X);return h(K,Buffer.concat(q)),K}catch{return null}}async function c(Q,J){try{if(!w(J))return null;let Z=I(J),Y=v.from(Z);return(await Q.im.image.create({data:{image_type:"message",image:Y}}))?.image_key??null}catch{return null}}async function m(Q){try{let Z=await Q.request({method:"GET",url:"/open-apis/bot/v3/info"});return Z?.bot?.open_id??Z?.data?.bot?.open_id??null}catch{return null}}function d(Q,J,Z){if(Q.conversation.conversationType==="dm"){if(J.allowFrom.includes("*")||J.allowFrom.includes(Q.sender.id))return{allow:!0,reason:""};return{allow:!1,reason:"sender not in allowFrom (dm)"}}if(!(J.allowChats.includes("*")||J.allowChats.includes(Q.conversation.conversationId)))return{allow:!1,reason:"chat not in allowChats"};if(Z==="all")return{allow:!0,reason:""};if(Z==="observe")return{allow:!1,reason:"groupPolicy=observe — chat in allowChats but no trigger"};if(Q.mentioned)return{allow:!0,reason:""};return{allow:!1,reason:`groupPolicy=${Z} requires @bot mention (not mentioned)`}}function O(Q,J,Z){let Y=new Date().toISOString(),V=J?`${J.conversation.conversationType}:${J.conversation.conversationId}`:"?",G=J?J.sender.id:"?";process.stderr.write(`[${Y}] [feishu:audit] ${Q} from=${G} conv=${V} — ${Z}
3
- `)}import{existsSync as C,readFileSync as E}from"node:fs";import{join as P}from"node:path";function k(Q){let J=o(P(Q,".env")),Z=J.FEISHU_APP_ID,Y=J.FEISHU_APP_SECRET;if(!Z||!Y)throw Error(`feishu channel: FEISHU_APP_ID / FEISHU_APP_SECRET missing in ${Q}/.env`);let V=i(P(Q,"access.json"));return{appId:Z,appSecret:Y,access:V,groupPolicy:"mention",ackPlaceholder:!0,auditRaw:!1,taskTimeoutMs:300000,channelDir:Q}}function o(Q){if(!C(Q))return{};let J={};for(let Z of E(Q,"utf-8").split(/\r?\n/)){let Y=Z.trim();if(!Y||Y.startsWith("#"))continue;let V=Y.indexOf("=");if(V<0)continue;let G=Y.slice(0,V).trim(),q=Y.slice(V+1).trim().replace(/^["']|["']$/g,"");J[G]=q}return J}function i(Q){if(!C(Q))return{allowFrom:[],allowChats:[]};try{let J=JSON.parse(E(Q,"utf-8"));return{allowFrom:Array.isArray(J.allowFrom)?J.allowFrom:[],allowChats:Array.isArray(J.allowChats)?J.allowChats:[]}}catch{return{allowFrom:[],allowChats:[]}}}var r=900000,s=120000,a=3,M=60000,t=2,D=60000,n=3,y=60000,e="处理频率超出限制,请稍后重试";async function u(Q){let J=k(Q.channelDir),Z=new R;await Z.init({platform:"feishu",connectionName:Q.nodeAlias,ingressMode:"socket",groupPolicy:J.groupPolicy,ackPlaceholder:J.ackPlaceholder,auditRaw:J.auditRaw,taskTimeoutMs:J.taskTimeoutMs,platformConfig:J});let Y=J.taskTimeoutMs||r,V=Q.onEvent??VJ(Z,Y,J.ackPlaceholder);return await Z.start(JJ(QJ(V,Z))),Z}function JJ(Q){let J=new Map;return async(Z)=>{let Y=Date.now();if(J.size>200){for(let[V,G]of J)if(Y-G>s)J.delete(V)}if(J.has(Z.idempotencyKey)){process.stderr.write(`[feishu:bridge] dedup drop ${Z.idempotencyKey}
4
- `);return}J.set(Z.idempotencyKey,Y),await Q(Z)}}function QJ(Q,J){let Z=new Map,Y=new Map,V=new Map;function G($,B,j){let W=B-j;return $.filter((z)=>z>=W)}function q($,B,j){if($.size<=_)return;for(let[W,z]of $){let U=z[z.length-1]??0;if(B-U>j)$.delete(W)}}function X($,B){if($.size<=_)return;for(let[j,W]of $)if(B-W.windowStart>y)$.delete(j)}function K($,B){if($.size<=B)return;let j=[];for(let[z,U]of $)j.push([z,U[U.length-1]??0]);j.sort((z,U)=>z[1]-U[1]);let W=$.size-B;for(let z=0;z<W;z++)$.delete(j[z][0])}function N($,B){if($.size<=B)return;let j=[];for(let[z,U]of $)j.push([z,U.windowStart]);j.sort((z,U)=>z[1]-U[1]);let W=$.size-B;for(let z=0;z<W;z++)$.delete(j[z][0])}let H=async($)=>{let B=Date.now();q(Z,B,M),q(Y,B,D),X(V,B),K(Z,A),K(Y,A),N(V,A);let j=!1;if($.conversation.conversationType==="dm"){let x=$.sender.id,F=G(Z.get(x)??[],B,M);if(F.length>=a)j=!0,Z.set(x,F);else F.push(B),Z.set(x,F)}else{let x=$.conversation.conversationId,F=G(Y.get(x)??[],B,D);if(F.length>=t)j=!0,Y.set(x,F);else F.push(B),Y.set(x,F)}if(j){let x=$.sender.id,F=$.conversation.conversationId;if($.conversation.conversationType==="dm"){let S=Z.get(x);if(S&&S.length===0)Z.delete(x)}else{let S=Y.get(F);if(S&&S.length===0)Y.delete(F)}}if(!j){await Q($);return}let W=$.sender.id,z=V.get(W),U;if(!z||B-z.windowStart>y)U={count:1,windowStart:B};else U={count:z.count+1,windowStart:z.windowStart};if(V.set(W,U),U.count>=n)process.stderr.write(`[feishu:audit] flood from=${W} conv=${$.conversation.conversationType}:${$.conversation.conversationId} — ${U.count} rate-limit denies in ${Math.round((B-U.windowStart)/1000)}s window
5
- `);try{await J.send({target:$.conversation,text:e,replyToMessageId:$.messageId,correlation:{taskId:$.idempotencyKey}}),process.stderr.write(`[feishu:bridge] rate-limited (${$.conversation.conversationType}) from=${W} for ${$.idempotencyKey}
6
- `)}catch(x){let F=x instanceof Error?x.message:String(x);process.stderr.write(`[feishu:bridge] rate-limit notice send failed: ${F}
7
- `)}};return H.__getState=()=>({dmKeyCount:Z.size,groupKeyCount:Y.size,floodKeyCount:V.size}),H}var _=50,A=1e4;function VJ(Q,J,Z){if(typeof process.send==="function")return YJ(Q,J,Z);return qJ}var ZJ="⏳ 处理中…",$J="[处理超时,任务可能仍在后台运行]";function YJ(Q,J,Z){if(typeof process.send!=="function")throw Error("createIPCEventHandler: parent process.send unavailable (not forked)");let Y=new Map;return process.on("message",(V)=>{if(!XJ(V))return;let G=Y.get(V.eventKey);if(!G)return;Y.delete(V.eventKey);let{text:q,eventKey:X}=V,{event:K,placeholderMessageId:N}=G;(async()=>{try{let{messageId:H}=await Q.send({target:K.conversation,text:q,replyToMessageId:K.messageId,correlation:{taskId:X}}),$=N?` (after placeholder=${N})`:"";process.stderr.write(`[feishu:bridge] reply sent (messageId=${H})${$} for ${X}
8
- `)}catch(H){let $=H instanceof Error?H.message:String(H);process.stderr.write(`[feishu:bridge] reply delivery failed: ${$}
9
- `)}})()}),async(V)=>{if(Y.set(V.idempotencyKey,{event:V}),setTimeout(()=>{let q=Y.get(V.idempotencyKey);if(!q)return;Y.delete(V.idempotencyKey);let{placeholderMessageId:X}=q;(async()=>{try{await Q.send({target:V.conversation,text:$J,replyToMessageId:V.messageId,correlation:{taskId:V.idempotencyKey}});let K=X?` (after placeholder=${X})`:"";process.stderr.write(`[feishu:bridge] timeout-notify sent${K} for ${V.idempotencyKey} after ${J}ms
10
- `)}catch(K){let N=K instanceof Error?K.message:String(K);process.stderr.write(`[feishu:bridge] timeout-notify send failed: ${N}
11
- `)}})()},J),Z)try{let{messageId:q}=await Q.send({target:V.conversation,text:ZJ,replyToMessageId:V.messageId,correlation:{taskId:V.idempotencyKey}}),X=Y.get(V.idempotencyKey);if(X)X.placeholderMessageId=q,process.stderr.write(`[feishu:bridge] placeholder sent (messageId=${q}) for ${V.idempotencyKey}
2
+ import*as F from"@larksuiteoapi/node-sdk";import w from"node:crypto";import{existsSync as I,mkdirSync as h,readFileSync as v,writeFileSync as g}from"node:fs";import{join as A}from"node:path";import{Readable as c}from"node:stream";function L(J){if(Array.isArray(J))return{list:J.filter((V)=>typeof V==="string"&&V.length>0).map((V)=>String(V)),malformed:!1};if(J===void 0||J===null)return{list:[],malformed:!1};return{list:[],malformed:!0}}function C(J){if(J.conversationType==="dm"){let{list:$,malformed:Z}=L(J.allowFrom);if($.length===0)return{allow:!1,kind:"empty-fail-closed",reason:Z?"allowFrom malformed (not a string[]) — fail-closed (dm)":"allowFrom empty — fail-closed (dm)"};if($.includes("*"))return{allow:!0,kind:"wildcard-allow",reason:'allowFrom=["*"] (dm)'};if(J.senderId&&$.includes(J.senderId))return{allow:!0,kind:"explicit-allow",reason:`sender ${J.senderId} in allowFrom (dm)`};return{allow:!1,kind:"denied",reason:"sender not in allowFrom (dm)"}}let Q=L(J.allowChats);if(Q.list.length===0)return{allow:!1,kind:"empty-fail-closed",reason:Q.malformed?"allowChats malformed — fail-closed (group)":"allowChats empty — fail-closed (group)"};if(!(Q.list.includes("*")||Q.list.includes(J.conversationId)))return{allow:!1,kind:"denied",reason:"chat not in allowChats"};if(J.groupPolicy==="all")return{allow:!0,kind:"explicit-allow",reason:"chat in allowChats + groupPolicy=all"};if(J.groupPolicy==="observe")return{allow:!1,kind:"denied",reason:"groupPolicy=observe — chat allowlisted but no trigger"};return{allow:!0,kind:"explicit-allow",reason:`chat allowed + groupPolicy=${J.groupPolicy}`}}class R{platform="feishu";ingressMode="socket";feishuConfig=null;connectionName="";client=null;wsClient=null;botOpenId=null;mediaDir=null;health_={connected:!1,lastEventAt:null,lastError:null};async init(J){if(J.platform!=="feishu")throw Error(`FeishuAdapter.init: expected platform "feishu", got "${J.platform}"`);let Q=J.platformConfig;if(!Q?.appId||!Q?.appSecret)throw Error("FeishuAdapter.init: appId / appSecret missing in platformConfig");this.feishuConfig=Q,this.connectionName=J.connectionName,this.client=new F.Client({appId:Q.appId,appSecret:Q.appSecret,disableTokenCache:!1}),this.botOpenId=await i(this.client),this.mediaDir=Q.channelDir?A(Q.channelDir,"media"):null}async start(J){if(!this.feishuConfig||!this.client)throw Error("FeishuAdapter.start: call init() first");let{appId:Q,appSecret:V,access:$,groupPolicy:Z}=this.feishuConfig,G=this.connectionName,q=this.botOpenId,X=this.mediaDir,U=this.client,N=new F.EventDispatcher({});N.register({"im.message.receive_v1":async(H)=>{try{this.health_={...this.health_,lastEventAt:Date.now()};let Y=l(H,G,q);if(!Y)return;await p(H,Y,U,X);let B=o(Y,$,Z);if(!B.allow){P("deny",Y,B.reason);return}await J(Y)}catch(Y){let B=Y instanceof Error?Y.message:String(Y);this.health_={...this.health_,lastError:B},P("error",null,B)}}}),this.wsClient=new F.WSClient({appId:Q,appSecret:V,loggerLevel:F.LoggerLevel.warn}),await this.wsClient.start({eventDispatcher:N}),this.health_={...this.health_,connected:!0,lastError:null}}async stop(){this.health_={...this.health_,connected:!1},this.wsClient=null,this.client=null,this.feishuConfig=null}async send(J){if(!this.client)throw Error("FeishuAdapter.send: call init() first");let Q,V;if(J.imagePath){let X=await d(this.client,J.imagePath);if(!X)throw Error(`FeishuAdapter.send: image upload failed for ${J.imagePath}`);Q="image",V=JSON.stringify({image_key:X})}else{let X=J.text??J.markdown;if(!X)throw Error("FeishuAdapter.send: requires text, markdown, or imagePath");Q="text",V=JSON.stringify({text:X})}let $=J.replyToMessageId??J.target.threadRootId;if($){let U=(await this.client.im.message.reply({path:{message_id:$},data:{msg_type:Q,content:V}}))?.data?.message_id;if(!U)throw Error("FeishuAdapter.send: reply returned no message_id");return{messageId:U}}let Z=J.target.conversationType==="dm"?"open_id":"chat_id",q=(await this.client.im.message.create({params:{receive_id_type:Z},data:{receive_id:J.target.conversationId,msg_type:Q,content:V}}))?.data?.message_id;if(!q)throw Error("FeishuAdapter.send: create returned no message_id");return{messageId:q}}async edit(J,Q,V){if(!this.client)throw Error("FeishuAdapter.edit: call init() first");let $=V.text??V.markdown;if(!$)throw Error("FeishuAdapter.edit: M3 supports text only");await this.client.im.message.update({path:{message_id:Q},data:{msg_type:"text",content:JSON.stringify({text:$})}})}health(){return{...this.health_}}}function l(J,Q,V){let $=J,Z=$?.message,G=$?.sender,q=G?.sender_id?.open_id;if(!Z||!q)return null;let X;if(Z.message_type==="text")try{X=JSON.parse(Z.content).text}catch{X=Z.content}else if(Z.message_type==="file")try{X=`[文件: ${JSON.parse(Z.content).file_name??"unknown"}]`}catch{X="[文件]"}else if(Z.message_type==="sticker")X="[表情]";else if(Z.message_type==="image")X=void 0;else return null;let U=Z.chat_type==="group"?"group":"dm",N=Array.isArray(Z.mentions)?Z.mentions:[],H=V?N.some((B)=>B?.id?.open_id===V):N.length>0,Y=`${Q}#feishu`;return{platform:"feishu",connectionId:Y,tenantId:G?.tenant_key,conversation:{platform:"feishu",conversationId:Z.chat_id,conversationType:U,threadRootId:Z.root_id},sender:{id:q},messageId:Z.message_id,mentioned:H,content:X?{text:X}:{},receivedAt:Date.now(),idempotencyKey:`feishu:${Y}:${Z.message_id}`}}async function p(J,Q,V,$){if(!V||!$)return;let G=J?.message;if(!G||G.message_type!=="image")return;let q;try{q=JSON.parse(G.content).image_key}catch{return}if(!q||!G.message_id)return;let X=await m(V,G.message_id,q,$);if(X)Q.content={...Q.content,images:[X]}}async function m(J,Q,V,$){try{let Z=await J.im.messageResource.get({path:{message_id:Q,file_key:V},params:{type:"image"}});if(!Z)return null;let G=Z,q=[];await new Promise((N,H)=>{G.on("data",(Y)=>q.push(Buffer.from(Y))),G.on("end",()=>N()),G.on("error",(Y)=>H(Y))}),h($,{recursive:!0});let X=`img_${Date.now()}_${w.randomBytes(4).toString("hex")}.png`,U=A($,X);return g(U,Buffer.concat(q)),U}catch{return null}}async function d(J,Q){try{if(!I(Q))return null;let V=v(Q),$=c.from(V);return(await J.im.image.create({data:{image_type:"message",image:$}}))?.image_key??null}catch{return null}}async function i(J){try{let V=await J.request({method:"GET",url:"/open-apis/bot/v3/info"});return V?.bot?.open_id??V?.data?.bot?.open_id??null}catch{return null}}function o(J,Q,V){let $=C({conversationType:J.conversation.conversationType,allowFrom:Q.allowFrom,allowChats:Q.allowChats,senderId:J.sender.id,conversationId:J.conversation.conversationId,groupPolicy:V==="command"?"mention":V});if(J.conversation.conversationType==="dm")return{allow:$.allow,reason:$.reason};if(!$.allow)return{allow:!1,reason:$.reason};if(V==="all")return{allow:!0,reason:""};if(J.mentioned)return{allow:!0,reason:""};return{allow:!1,reason:`groupPolicy=${V} requires @bot mention (not mentioned)`}}function P(J,Q,V){let $=new Date().toISOString(),Z=Q?`${Q.conversation.conversationType}:${Q.conversation.conversationId}`:"?",G=Q?Q.sender.id:"?";process.stderr.write(`[${$}] [feishu:audit] ${J} from=${G} conv=${Z} — ${V}
3
+ `)}import{existsSync as E,readFileSync as D}from"node:fs";import{join as M}from"node:path";function b(J){let Q=r(M(J,".env")),V=Q.FEISHU_APP_ID,$=Q.FEISHU_APP_SECRET;if(!V||!$)throw Error(`feishu channel: FEISHU_APP_ID / FEISHU_APP_SECRET missing in ${J}/.env`);let Z=s(M(J,"access.json"));return{appId:V,appSecret:$,access:Z,groupPolicy:"mention",ackPlaceholder:!0,auditRaw:!1,taskTimeoutMs:300000,channelDir:J}}function r(J){if(!E(J))return{};let Q={};for(let V of D(J,"utf-8").split(/\r?\n/)){let $=V.trim();if(!$||$.startsWith("#"))continue;let Z=$.indexOf("=");if(Z<0)continue;let G=$.slice(0,Z).trim(),q=$.slice(Z+1).trim().replace(/^["']|["']$/g,"");Q[G]=q}return Q}function s(J){if(!E(J))return{allowFrom:[],allowChats:[]};try{let Q=JSON.parse(D(J,"utf-8"));return{allowFrom:Array.isArray(Q.allowFrom)?Q.allowFrom:[],allowChats:Array.isArray(Q.allowChats)?Q.allowChats:[]}}catch{return{allowFrom:[],allowChats:[]}}}var a=900000,n=120000,t=3,y=60000,e=2,_=60000,JJ=3,f=60000,QJ="处理频率超出限制,请稍后重试";async function T(J){let Q=b(J.channelDir),V=new R;await V.init({platform:"feishu",connectionName:J.nodeAlias,ingressMode:"socket",groupPolicy:Q.groupPolicy,ackPlaceholder:Q.ackPlaceholder,auditRaw:Q.auditRaw,taskTimeoutMs:Q.taskTimeoutMs,platformConfig:Q});let $=Q.taskTimeoutMs||a,Z=J.onEvent??$J(V,$,Q.ackPlaceholder);return await V.start(VJ(ZJ(Z,V))),V}function VJ(J){let Q=new Map;return async(V)=>{let $=Date.now();if(Q.size>200){for(let[Z,G]of Q)if($-G>n)Q.delete(Z)}if(Q.has(V.idempotencyKey)){process.stderr.write(`[feishu:bridge] dedup drop ${V.idempotencyKey}
4
+ `);return}Q.set(V.idempotencyKey,$),await J(V)}}function ZJ(J,Q){let V=new Map,$=new Map,Z=new Map;function G(Y,B,j){let W=B-j;return Y.filter((K)=>K>=W)}function q(Y,B,j){if(Y.size<=u)return;for(let[W,K]of Y){let z=K[K.length-1]??0;if(B-z>j)Y.delete(W)}}function X(Y,B){if(Y.size<=u)return;for(let[j,W]of Y)if(B-W.windowStart>f)Y.delete(j)}function U(Y,B){if(Y.size<=B)return;let j=[];for(let[K,z]of Y)j.push([K,z[z.length-1]??0]);j.sort((K,z)=>K[1]-z[1]);let W=Y.size-B;for(let K=0;K<W;K++)Y.delete(j[K][0])}function N(Y,B){if(Y.size<=B)return;let j=[];for(let[K,z]of Y)j.push([K,z.windowStart]);j.sort((K,z)=>K[1]-z[1]);let W=Y.size-B;for(let K=0;K<W;K++)Y.delete(j[K][0])}let H=async(Y)=>{let B=Date.now();q(V,B,y),q($,B,_),X(Z,B),U(V,O),U($,O),N(Z,O);let j=!1;if(Y.conversation.conversationType==="dm"){let x=Y.sender.id,S=G(V.get(x)??[],B,y);if(S.length>=t)j=!0,V.set(x,S);else S.push(B),V.set(x,S)}else{let x=Y.conversation.conversationId,S=G($.get(x)??[],B,_);if(S.length>=e)j=!0,$.set(x,S);else S.push(B),$.set(x,S)}if(j){let x=Y.sender.id,S=Y.conversation.conversationId;if(Y.conversation.conversationType==="dm"){let k=V.get(x);if(k&&k.length===0)V.delete(x)}else{let k=$.get(S);if(k&&k.length===0)$.delete(S)}}if(!j){await J(Y);return}let W=Y.sender.id,K=Z.get(W),z;if(!K||B-K.windowStart>f)z={count:1,windowStart:B};else z={count:K.count+1,windowStart:K.windowStart};if(Z.set(W,z),z.count>=JJ)process.stderr.write(`[feishu:audit] flood from=${W} conv=${Y.conversation.conversationType}:${Y.conversation.conversationId} — ${z.count} rate-limit denies in ${Math.round((B-z.windowStart)/1000)}s window
5
+ `);try{await Q.send({target:Y.conversation,text:QJ,replyToMessageId:Y.messageId,correlation:{taskId:Y.idempotencyKey}}),process.stderr.write(`[feishu:bridge] rate-limited (${Y.conversation.conversationType}) from=${W} for ${Y.idempotencyKey}
6
+ `)}catch(x){let S=x instanceof Error?x.message:String(x);process.stderr.write(`[feishu:bridge] rate-limit notice send failed: ${S}
7
+ `)}};return H.__getState=()=>({dmKeyCount:V.size,groupKeyCount:$.size,floodKeyCount:Z.size}),H}var u=50,O=1e4;function $J(J,Q,V){if(typeof process.send==="function")return qJ(J,Q,V);return GJ}var YJ="⏳ 处理中…",XJ="[处理超时,任务可能仍在后台运行]";function qJ(J,Q,V){if(typeof process.send!=="function")throw Error("createIPCEventHandler: parent process.send unavailable (not forked)");let $=new Map;return process.on("message",(Z)=>{if(!BJ(Z))return;let G=$.get(Z.eventKey);if(!G)return;$.delete(Z.eventKey);let{text:q,eventKey:X}=Z,{event:U,placeholderMessageId:N}=G;(async()=>{try{let{messageId:H}=await J.send({target:U.conversation,text:q,replyToMessageId:U.messageId,correlation:{taskId:X}}),Y=N?` (after placeholder=${N})`:"";process.stderr.write(`[feishu:bridge] reply sent (messageId=${H})${Y} for ${X}
8
+ `)}catch(H){let Y=H instanceof Error?H.message:String(H);process.stderr.write(`[feishu:bridge] reply delivery failed: ${Y}
9
+ `)}})()}),async(Z)=>{if($.set(Z.idempotencyKey,{event:Z}),setTimeout(()=>{let q=$.get(Z.idempotencyKey);if(!q)return;$.delete(Z.idempotencyKey);let{placeholderMessageId:X}=q;(async()=>{try{await J.send({target:Z.conversation,text:XJ,replyToMessageId:Z.messageId,correlation:{taskId:Z.idempotencyKey}});let U=X?` (after placeholder=${X})`:"";process.stderr.write(`[feishu:bridge] timeout-notify sent${U} for ${Z.idempotencyKey} after ${Q}ms
10
+ `)}catch(U){let N=U instanceof Error?U.message:String(U);process.stderr.write(`[feishu:bridge] timeout-notify send failed: ${N}
11
+ `)}})()},Q),V)try{let{messageId:q}=await J.send({target:Z.conversation,text:YJ,replyToMessageId:Z.messageId,correlation:{taskId:Z.idempotencyKey}}),X=$.get(Z.idempotencyKey);if(X)X.placeholderMessageId=q,process.stderr.write(`[feishu:bridge] placeholder sent (messageId=${q}) for ${Z.idempotencyKey}
12
12
  `)}catch(q){let X=q instanceof Error?q.message:String(q);process.stderr.write(`[feishu:bridge] placeholder send failed: ${X} — reply will still send as a new message
13
- `)}let G={type:"event",event:V};process.send(G)}}function XJ(Q){if(!Q||typeof Q!=="object")return!1;let J=Q;return J.type==="reply"&&typeof J.eventKey==="string"&&typeof J.text==="string"}async function qJ(Q){process.stderr.write(`[feishu:bridge] event from=${Q.sender.id} conv=${Q.conversation.conversationType}:${Q.conversation.conversationId} mentioned=${Q.mentioned} text=${(Q.content.text??"").slice(0,80)}
14
- `)}function BJ(Q){let J={};for(let Z=0;Z<Q.length;Z++){let Y=Q[Z],V=Q[Z+1];if(Y==="--channel-dir"&&V)J.channelDir=V,Z++;else if(Y==="--node-alias"&&V)J.nodeAlias=V,Z++}return J}async function GJ(){let Q=BJ(process.argv.slice(2));if(!Q.channelDir||!Q.nodeAlias)process.stderr.write(`usage: feishu-worker --channel-dir <path> --node-alias <alias>
15
- `),process.exit(2);try{await u({channelDir:Q.channelDir,nodeAlias:Q.nodeAlias}),process.stderr.write(`[feishu:worker] bridge online — node=${Q.nodeAlias} dir=${Q.channelDir} ipc=${typeof process.send==="function"?"yes":"no"}
16
- `)}catch(J){let Z=J instanceof Error?J.stack??J.message:String(J);process.stderr.write(`[feishu:worker] startup failed: ${Z}
17
- `),process.exit(1)}}GJ();
13
+ `)}let G={type:"event",event:Z};process.send(G)}}function BJ(J){if(!J||typeof J!=="object")return!1;let Q=J;return Q.type==="reply"&&typeof Q.eventKey==="string"&&typeof Q.text==="string"}async function GJ(J){process.stderr.write(`[feishu:bridge] event from=${J.sender.id} conv=${J.conversation.conversationType}:${J.conversation.conversationId} mentioned=${J.mentioned} text=${(J.content.text??"").slice(0,80)}
14
+ `)}function KJ(J){let Q={};for(let V=0;V<J.length;V++){let $=J[V],Z=J[V+1];if($==="--channel-dir"&&Z)Q.channelDir=Z,V++;else if($==="--node-alias"&&Z)Q.nodeAlias=Z,V++}return Q}async function UJ(){let J=KJ(process.argv.slice(2));if(!J.channelDir||!J.nodeAlias)process.stderr.write(`usage: feishu-worker --channel-dir <path> --node-alias <alias>
15
+ `),process.exit(2);try{await T({channelDir:J.channelDir,nodeAlias:J.nodeAlias}),process.stderr.write(`[feishu:worker] bridge online — node=${J.nodeAlias} dir=${J.channelDir} ipc=${typeof process.send==="function"?"yes":"no"}
16
+ `)}catch(Q){let V=Q instanceof Error?Q.stack??Q.message:String(Q);process.stderr.write(`[feishu:worker] startup failed: ${V}
17
+ `),process.exit(1)}}UJ();
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env bun
2
- const a0_0x2f6489=a0_0x910f;(function(_0x10285f,_0x31ae8e){const _0x252300=a0_0x910f,_0x29240d=_0x10285f();while(!![]){try{const _0x240ff0=-parseInt(_0x252300(0x1d7))/0x1*(-parseInt(_0x252300(0x235))/0x2)+-parseInt(_0x252300(0x1d5))/0x3*(-parseInt(_0x252300(0x220))/0x4)+-parseInt(_0x252300(0x1b3))/0x5+-parseInt(_0x252300(0x221))/0x6+-parseInt(_0x252300(0x23e))/0x7*(parseInt(_0x252300(0x1cd))/0x8)+parseInt(_0x252300(0x20b))/0x9+parseInt(_0x252300(0x201))/0xa;if(_0x240ff0===_0x31ae8e)break;else _0x29240d['push'](_0x29240d['shift']());}catch(_0x7d01d6){_0x29240d['push'](_0x29240d['shift']());}}}(a0_0x26a1,0x6ff10));import{readFileSync as a0_0x125c3b,existsSync as a0_0x4d8313}from'fs';import{randomUUID as a0_0x57c336}from'crypto';import{join as a0_0x293d60}from'path';import{hostname as a0_0x26e9c9}from'os';import{execSync as a0_0x4c624f}from'child_process';import{Server as a0_0x11b58c}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x57ed7a}from'@modelcontextprotocol/sdk/server/stdio.js';function a0_0x910f(_0x5d44f4,_0x2fe00d){_0x5d44f4=_0x5d44f4-0x1af;const _0x26a11c=a0_0x26a1();let _0x910f7=_0x26a11c[_0x5d44f4];return _0x910f7;}import{ListToolsRequestSchema as a0_0x4a3abc,CallToolRequestSchema as a0_0x49d6db}from'@modelcontextprotocol/sdk/types.js';function I(_0x912882){const _0x5b7df3=a0_0x910f;if(!a0_0x4d8313(_0x912882))return;for(let _0x161f68 of a0_0x125c3b(_0x912882,_0x5b7df3(0x236))[_0x5b7df3(0x1d4)]('\x0a')){let _0x28c117=_0x161f68[_0x5b7df3(0x244)]();if(!_0x28c117||_0x28c117[_0x5b7df3(0x246)]('#'))continue;let _0x13a768=_0x28c117['indexOf']('=');if(_0x13a768<0x0)continue;let _0x3ed58c=_0x28c117[_0x5b7df3(0x210)](0x0,_0x13a768)[_0x5b7df3(0x244)](),_0x287877=_0x28c117[_0x5b7df3(0x210)](_0x13a768+0x1)[_0x5b7df3(0x244)]()[_0x5b7df3(0x208)](/^["']|["']$/g,'');if(!process.env[_0x3ed58c])process.env[_0x3ed58c]=_0x287877;}}var L=process.env.HOME||'~',U=a0_0x293d60(L,a0_0x2f6489(0x1e3));I(a0_0x293d60(U,a0_0x2f6489(0x1e1)));var v=process[a0_0x2f6489(0x1dd)]()[a0_0x2f6489(0x208)](/\//g,'-');I(a0_0x293d60(U,v,a0_0x2f6489(0x1e1)));function d(){const _0x3b3e6c=a0_0x2f6489;try{return a0_0x4c624f(_0x3b3e6c(0x1c1),{'encoding':_0x3b3e6c(0x236),'timeout':0x7d0})[_0x3b3e6c(0x244)]();}catch{return'';}}function m(){const _0x1c7b18=a0_0x2f6489;try{let _0x2f66c3=a0_0x293d60(L,'.anet',_0x1c7b18(0x1d9));if(a0_0x4d8313(_0x2f66c3))return JSON['parse'](a0_0x125c3b(_0x2f66c3,_0x1c7b18(0x236)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x2f6489(0x1ce)]||a0_0x2f6489(0x24b),f=process.env.COMMHUB_TMUX||d();function r(){const _0x3a4531=a0_0x2f6489;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS['trim']())return process.env.COMMHUB_ALIAS['trim']();return process[_0x3a4531(0x22d)][_0x3a4531(0x1bc)](_0x3a4531(0x21c)+(_0x3a4531(0x1c7)+(f||_0x3a4531(0x1ff))+_0x3a4531(0x1c9)+a0_0x26e9c9()+_0x3a4531(0x230))),_0x3a4531(0x243)+process[_0x3a4531(0x234)];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x57c336(),F=process.env.COMMHUB_TOKEN||u[a0_0x2f6489(0x1d6)]||'';function W(_0x432d7e){const _0x1f663a=a0_0x2f6489;let _0x3ac2ec=new Date()[_0x1f663a(0x1f3)]()[_0x1f663a(0x210)](0x0,0x8);process['stderr']['write']('['+_0x3ac2ec+_0x1f663a(0x23b)+_0x432d7e+'\x0a');}function N(_0x5b13a9){return new Promise(_0x32ec43=>setTimeout(_0x32ec43,_0x5b13a9));}W(a0_0x2f6489(0x24a)+j+a0_0x2f6489(0x245)+G+a0_0x2f6489(0x1cb)+K[a0_0x2f6489(0x210)](0x0,0x8)+'...\x20TMUX='+(f||a0_0x2f6489(0x218))+a0_0x2f6489(0x242)+process[a0_0x2f6489(0x1dd)]()+a0_0x2f6489(0x1cc)+v);var D=new Map(),x=new a0_0x11b58c({'name':a0_0x2f6489(0x228),'version':a0_0x2f6489(0x20d)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x2f6489(0x1af),a0_0x2f6489(0x1b8),a0_0x2f6489(0x240),'You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','Session\x20alias:\x20'+G][a0_0x2f6489(0x1f5)]('\x0a')});x[a0_0x2f6489(0x214)](a0_0x4a3abc,async()=>({'tools':[{'name':a0_0x2f6489(0x1f4),'description':a0_0x2f6489(0x204),'inputSchema':{'type':a0_0x2f6489(0x1dc),'properties':{'task_id':{'type':a0_0x2f6489(0x1c6),'description':'The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)'},'text':{'type':a0_0x2f6489(0x1c6),'description':'Reply\x20text\x20/\x20result\x20summary'},'status':{'type':a0_0x2f6489(0x1c6),'enum':[a0_0x2f6489(0x1c0),a0_0x2f6489(0x1b7),a0_0x2f6489(0x1be),'blocked','error','in_progress'],'description':'Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates'}},'required':[a0_0x2f6489(0x1e4)]}},{'name':a0_0x2f6489(0x1ea),'description':a0_0x2f6489(0x1b0),'inputSchema':{'type':'object','properties':{'status':{'type':a0_0x2f6489(0x1c6),'enum':[a0_0x2f6489(0x1f9),'idle',a0_0x2f6489(0x20e),a0_0x2f6489(0x1fa)]},'task':{'type':'string','description':a0_0x2f6489(0x21a)},'progress':{'type':a0_0x2f6489(0x224),'description':'Progress\x200-100'}},'required':[a0_0x2f6489(0x1b2)]}},{'name':a0_0x2f6489(0x22f),'description':'Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','inputSchema':{'type':a0_0x2f6489(0x1dc),'properties':{'alias':{'type':a0_0x2f6489(0x1c6),'description':a0_0x2f6489(0x1ef)},'task':{'type':a0_0x2f6489(0x1c6),'description':a0_0x2f6489(0x1ba)},'priority':{'type':a0_0x2f6489(0x1c6),'enum':[a0_0x2f6489(0x206),a0_0x2f6489(0x1bd),'low'],'description':a0_0x2f6489(0x1f1)}},'required':[a0_0x2f6489(0x1d1),'task']}},{'name':a0_0x2f6489(0x241),'description':a0_0x2f6489(0x203),'inputSchema':{'type':a0_0x2f6489(0x1dc),'properties':{'alias':{'type':a0_0x2f6489(0x1c6),'description':a0_0x2f6489(0x1ef)},'message':{'type':'string','description':a0_0x2f6489(0x1da)}},'required':[a0_0x2f6489(0x1d1),a0_0x2f6489(0x225)]}},{'name':'commhub_get_all_status','description':a0_0x2f6489(0x219),'inputSchema':{'type':a0_0x2f6489(0x1dc),'properties':{}}}]}));async function Y(_0x43e00e,_0x330ede){const _0x5ad611=a0_0x2f6489;let _0xeb0fe3=await fetch(j+_0x5ad611(0x1bf),{'method':'POST','headers':{'Content-Type':_0x5ad611(0x1fd),'Accept':'application/json,\x20text/event-stream',...F?{'Authorization':_0x5ad611(0x21d)+F}:{}},'body':JSON[_0x5ad611(0x1c4)]({'jsonrpc':'2.0','id':0x1,'method':_0x5ad611(0x215),'params':{'protocolVersion':_0x5ad611(0x20c),'capabilities':{},'clientInfo':{'name':_0x5ad611(0x228),'version':_0x5ad611(0x20d)}}})});if(!_0xeb0fe3['ok']){let _0x21e042=await _0xeb0fe3['text']();return W(_0x5ad611(0x216)+_0xeb0fe3[_0x5ad611(0x1b2)]+'\x20'+_0x21e042[_0x5ad611(0x210)](0x0,0x64)),{'ok':!0x1,'error':'init\x20failed:\x20'+_0xeb0fe3[_0x5ad611(0x1b2)]};}await _0xeb0fe3[_0x5ad611(0x1e4)]();let _0x2e6801=(await(await fetch(j+_0x5ad611(0x1bf),{'method':_0x5ad611(0x223),'headers':{'Content-Type':_0x5ad611(0x1fd),'Accept':'application/json,\x20text/event-stream',...F?{'Authorization':_0x5ad611(0x21d)+F}:{}},'body':JSON[_0x5ad611(0x1c4)]({'jsonrpc':_0x5ad611(0x232),'id':0x2,'method':_0x5ad611(0x1b9),'params':{'name':_0x43e00e,'arguments':_0x330ede}})}))[_0x5ad611(0x1e4)]())[_0x5ad611(0x1d4)]('\x0a')[_0x5ad611(0x239)](_0x50e346=>_0x50e346[_0x5ad611(0x246)](_0x5ad611(0x226)));if(_0x2e6801){let _0x558dbe=JSON[_0x5ad611(0x231)](_0x2e6801[_0x5ad611(0x210)](0x6));return _0x558dbe?.[_0x5ad611(0x238)]?.[_0x5ad611(0x1c8)]?.[0x0]?.[_0x5ad611(0x1e4)]?JSON[_0x5ad611(0x231)](_0x558dbe[_0x5ad611(0x238)][_0x5ad611(0x1c8)][0x0][_0x5ad611(0x1e4)]):_0x558dbe;}return{'ok':!0x1,'error':_0x5ad611(0x247)};}x[a0_0x2f6489(0x214)](a0_0x49d6db,async _0x6c7e78=>{const _0x67f01=a0_0x2f6489;let {name:_0x5d7ba4,arguments:_0x4bd0a8}=_0x6c7e78['params'];if(_0x5d7ba4===_0x67f01(0x1f4)){let {task_id:_0x97858b,text:_0x2a3a1a,status:_0x27e114}=_0x4bd0a8;if(_0x27e114===_0x67f01(0x1c0)||_0x27e114==='failed'||_0x27e114===_0x67f01(0x1be)){let _0x25d572=_0x27e114==='completed'?_0x67f01(0x233):_0x27e114,_0x368820=_0x97858b?D[_0x67f01(0x213)](_0x97858b)||_0x67f01(0x1ce):_0x67f01(0x1ce),_0x143467=await Y(_0x67f01(0x1f8),{'alias':_0x368820,'text':_0x2a3a1a,'in_reply_to':_0x97858b||void 0x0,'status':_0x25d572,'from_session':G});if(_0x97858b)D[_0x67f01(0x1e6)](_0x97858b);return{'content':[{'type':_0x67f01(0x1e4),'text':JSON[_0x67f01(0x1c4)](_0x143467)}]};}let _0x45b44e=await Y(_0x67f01(0x1d0),{'resume_id':K,'alias':G,'status':_0x27e114==='blocked'?'blocked':_0x27e114==='error'?_0x67f01(0x1fa):_0x67f01(0x1f9),'task':_0x2a3a1a[_0x67f01(0x210)](0x0,0xc8),'output':_0x2a3a1a});return{'content':[{'type':_0x67f01(0x1e4),'text':JSON[_0x67f01(0x1c4)](_0x45b44e)}]};}if(_0x5d7ba4===_0x67f01(0x1ea)){let {status:_0x243ced,task:_0x6b3607,progress:_0x24b30b}=_0x4bd0a8,_0x5cf599=await Y(_0x67f01(0x1d0),{'resume_id':K,'alias':G,'status':_0x243ced,'task':_0x6b3607,'progress':_0x24b30b});return{'content':[{'type':'text','text':JSON[_0x67f01(0x1c4)](_0x5cf599)}]};}if(_0x5d7ba4===_0x67f01(0x22f)){let {alias:_0x2774a0,task:_0x21befa,priority:_0x718814}=_0x4bd0a8,_0x5adf2f=await Y(_0x67f01(0x209),{'alias':_0x2774a0,'task':_0x21befa,'priority':_0x718814||_0x67f01(0x1bd),'from_session':G});return{'content':[{'type':_0x67f01(0x1e4),'text':JSON[_0x67f01(0x1c4)](_0x5adf2f)}]};}if(_0x5d7ba4==='commhub_send_message'){let {alias:_0x55f867,message:_0x119296}=_0x4bd0a8,_0x37cfcf=await Y(_0x67f01(0x237),{'alias':_0x55f867,'message':_0x119296,'from_session':G});return{'content':[{'type':_0x67f01(0x1e4),'text':JSON[_0x67f01(0x1c4)](_0x37cfcf)}]};}if(_0x5d7ba4===_0x67f01(0x249)){let _0x475d0b=await Y(_0x67f01(0x1f0),{});return{'content':[{'type':_0x67f01(0x1e4),'text':JSON[_0x67f01(0x1c4)](_0x475d0b)}]};}return{'content':[{'type':_0x67f01(0x1e4),'text':JSON['stringify']({'error':_0x67f01(0x1b4)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x328c5e=a0_0x2f6489;try{await Y(_0x328c5e(0x1d0),{'resume_id':K,'alias':G,'status':_0x328c5e(0x1e9),'server':a0_0x26e9c9(),'hostname':a0_0x26e9c9(),'agent':_0x328c5e(0x1f2),'project_dir':process[_0x328c5e(0x1dd)](),'tmux_name':f||void 0x0}),W(_0x328c5e(0x21f)+G+'\x22\x20after\x20SSE\x20reconnect');}catch(_0x807f81){W(_0x328c5e(0x1cf)+_0x807f81);}}async function o(){const _0x462214=a0_0x2f6489;let _0x2b4bf=j+_0x462214(0x20a)+encodeURIComponent(G),_0x6d743f={};if(F)_0x6d743f[_0x462214(0x1fe)]=_0x462214(0x21d)+F;W(_0x462214(0x1e0)+_0x2b4bf);let _0x29848f=O,_0x4dd33d=!0x0,_0x85c049=null;while(!0x0){try{let _0x2ce17d=await fetch(_0x2b4bf,{'headers':_0x6d743f});if(!_0x2ce17d['ok']){if(W(_0x462214(0x1f6)+_0x2ce17d[_0x462214(0x1b2)]+'\x20'+_0x2ce17d['statusText']),_0x85c049=_0x85c049??Date[_0x462214(0x1db)](),Date['now']()-_0x85c049>T){W(_0x462214(0x217)+j+_0x462214(0x22a));return;}await N(_0x29848f),_0x29848f=Math[_0x462214(0x24c)](_0x29848f*0x2,R);continue;}let _0x68713e=_0x2ce17d[_0x462214(0x1c3)][_0x462214(0x1ee)](),_0x37bc22=new TextDecoder(),_0x48b9e8='';_0x29848f=O;while(!0x0){let {done:_0x5848e3,value:_0x48e64b}=await _0x68713e[_0x462214(0x22e)]();if(_0x5848e3)break;_0x48b9e8+=_0x37bc22[_0x462214(0x1b6)](_0x48e64b,{'stream':!0x0});let _0x109970=_0x48b9e8[_0x462214(0x1d4)]('\x0a\x0a');_0x48b9e8=_0x109970[_0x462214(0x207)]()||'';for(let _0x464724 of _0x109970){let _0x5bb1ec=_0x464724[_0x462214(0x1d4)]('\x0a')[_0x462214(0x239)](_0x257d8a=>_0x257d8a['startsWith'](_0x462214(0x226)));if(!_0x5bb1ec)continue;try{let _0x3904b3=JSON['parse'](_0x5bb1ec[_0x462214(0x210)](0x6));if(await a(_0x3904b3),_0x3904b3['type']===_0x462214(0x205)){if(_0x85c049=null,!_0x4dd33d)await l();_0x4dd33d=!0x1;}}catch(_0x195748){W('parse\x20error:\x20'+_0x195748);}}}W(_0x462214(0x248));}catch(_0x208427){W(_0x462214(0x1e7)+_0x208427);}if(_0x85c049=_0x85c049??Date['now'](),Date[_0x462214(0x1db)]()-_0x85c049>T){W(_0x462214(0x217)+j+_0x462214(0x22a));return;}await N(_0x29848f),_0x29848f=Math[_0x462214(0x24c)](_0x29848f*0x2,R);}}async function a(_0x3cb4d0){const _0x177a92=a0_0x2f6489;if(_0x3cb4d0[_0x177a92(0x23c)]===_0x177a92(0x205)){W(_0x177a92(0x1b1)+G+'\x22');return;}if(_0x3cb4d0[_0x177a92(0x23c)]===_0x177a92(0x23f)){if(W(_0x177a92(0x23d)+_0x3cb4d0[_0x177a92(0x1d2)]+':\x20'+_0x3cb4d0[_0x177a92(0x225)][_0x177a92(0x210)](0x0,0x3c)),await x['notification']({'method':_0x177a92(0x1fc),'params':{'content':_0x3cb4d0[_0x177a92(0x225)],'meta':{'sender':_0x3cb4d0[_0x177a92(0x1d2)]||_0x177a92(0x1ce),'sender_id':_0x177a92(0x1eb),'user':_0x3cb4d0['from']||_0x177a92(0x1ce),'priority':_0x177a92(0x1bd)}}}),_0x3cb4d0[_0x177a92(0x23a)])await Y('ack_inbox',{'alias':G,'message_id':_0x3cb4d0['message_id']});return;}if(_0x3cb4d0[_0x177a92(0x23c)]===_0x177a92(0x222)||_0x3cb4d0[_0x177a92(0x23c)]===_0x177a92(0x229)){W('←\x20'+_0x3cb4d0[_0x177a92(0x23c)]+':\x20inbox_count='+_0x3cb4d0[_0x177a92(0x20f)]+'\x20priority='+(_0x3cb4d0[_0x177a92(0x1c5)]||_0x177a92(0x1bd)));let _0x45477f=await Y(_0x177a92(0x227),{'alias':G,'limit':0x5});if(_0x45477f?.['ok']&&_0x45477f['messages']?.['length']>0x0)for(let _0x1456fe of _0x45477f[_0x177a92(0x1df)]){let _0x2867d5={'sender':_0x1456fe[_0x177a92(0x1d8)]||_0x177a92(0x1ce),'sender_id':_0x177a92(0x1eb),'user':_0x1456fe[_0x177a92(0x1d8)]||'hub','task_id':_0x1456fe['id'],'priority':_0x1456fe[_0x177a92(0x1c5)]||_0x177a92(0x1bd)};D[_0x177a92(0x1fb)](_0x1456fe['id'],_0x1456fe['from_session']||_0x177a92(0x1ce)),await x[_0x177a92(0x22c)]({'method':_0x177a92(0x1fc),'params':{'content':_0x1456fe[_0x177a92(0x1c8)],'meta':_0x2867d5}}),W(_0x177a92(0x21b)+_0x1456fe['id'][_0x177a92(0x210)](0x0,0x8)+_0x177a92(0x1f7)+_0x1456fe[_0x177a92(0x1d8)]+':\x20'+_0x1456fe[_0x177a92(0x1c8)]['slice'](0x0,0x3c)),await Y(_0x177a92(0x1de),{'alias':G,'message_id':_0x1456fe['id']});}}}async function n(){const _0x67c7e0=a0_0x2f6489;let _0x4b278a=new a0_0x57ed7a();await x[_0x67c7e0(0x1d3)](_0x4b278a),W(_0x67c7e0(0x1bb)),W(_0x67c7e0(0x1ed)),o()[_0x67c7e0(0x21e)](_0x44845c=>W('SSE\x20fatal:\x20'+_0x44845c)),Y(_0x67c7e0(0x1d0),{'resume_id':K,'alias':G,'status':_0x67c7e0(0x1e9),'server':a0_0x26e9c9(),'hostname':a0_0x26e9c9(),'agent':_0x67c7e0(0x1f2),'project_dir':process['cwd'](),'tmux_name':f||void 0x0})[_0x67c7e0(0x22b)](()=>W(_0x67c7e0(0x1ca)+G+_0x67c7e0(0x212)+K['slice'](0x0,0x8)+')'))['catch'](_0x2d793d=>W(_0x67c7e0(0x1c2)+_0x2d793d)),setInterval(()=>{const _0x29e1c4=_0x67c7e0;Y(_0x29e1c4(0x1d0),{'resume_id':K,'alias':G,'status':_0x29e1c4(0x1e9),'server':a0_0x26e9c9(),'hostname':a0_0x26e9c9(),'agent':'claude-code','project_dir':process[_0x29e1c4(0x1dd)](),'tmux_name':f||void 0x0})['catch'](_0x3266a1=>W(_0x29e1c4(0x1b5)+_0x3266a1));},0x2bf20),W('ready\x20—\x20waiting\x20for\x20events');}n()[a0_0x2f6489(0x21e)](_0x5cf806=>{const _0x544197=a0_0x2f6489;W(_0x544197(0x200)+_0x5cf806),process[_0x544197(0x1e2)](0x1);});async function b(){const _0x4792be=a0_0x2f6489;W(_0x4792be(0x1ec)),await Y(_0x4792be(0x1d0),{'resume_id':K,'alias':G,'status':_0x4792be(0x1e5),'task':_0x4792be(0x202)})['catch'](()=>{}),process['exit'](0x0);}function a0_0x26a1(){const _0x16e9a3=['Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','connected','high','pop','replace','send_task','/events/','2098539ewpQsv','2025-03-26','0.3.0','blocked','inbox_count','slice','SIGINT','\x22\x20(','get','setRequestHandler','initialize','CommHub\x20init\x20failed:\x20','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','none','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','Current\x20task\x20description','→\x20injected\x20task\x20','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','Bearer\x20','catch','re-registered\x20as\x20\x22','135384SjeJgn','1809060PeZmym','new_task','POST','number','message','data:\x20','get_inbox','commhub-channel','broadcast',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','then','notification','stderr','read','commhub_send_task','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','parse','2.0','replied','pid','4vEJiwy','utf-8','send_message','result','find','message_id',']\x20[commhub]\x20','type','←\x20message\x20from\x20','105WmlXAI','new_message','Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.','commhub_send_message','\x20CWD=','unattributed-','trim','\x20ALIAS=','startsWith','no\x20response','SSE\x20stream\x20ended,\x20reconnecting...','commhub_get_all_status','ENV:\x20URL=','http://127.0.0.1:9200','min','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>','Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','SSE\x20connected\x20as\x20\x22','status','1671705ttOHou','unknown\x20tool','heartbeat\x20failed:\x20','decode','failed','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','tools/call','Task\x20content','MCP\x20stdio\x20connected','write','normal','cancelled','/mcp','completed','tmux\x20display-message\x20-p\x20\x27#S\x27','warning:\x20could\x20not\x20register:\x20','body','stringify','priority','string','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','content','\x20/\x20hostname=','registered\x20as\x20\x22','\x20RESUME_ID=','\x20PROJECT_ENV=','206224mpKvdl','hub','re-register\x20failed:\x20','report_status','alias','from','connect','split','51PSphXB','token','253513AuHoLA','from_session','config.json','Message\x20content','now','object','cwd','ack_inbox','messages','connecting\x20to\x20','.env','exit','.claude/channels/commhub','text','offline','delete','SSE\x20connection\x20error:\x20','SIGTERM','idle','commhub_report_status','commhub','shutting\x20down,\x20reporting\x20offline...','starting\x20SSE\x20listener...','getReader','Target\x20session\x20alias','get_all_status','Priority\x20(default:\x20normal)','claude-code','toTimeString','commhub_reply','join','SSE\x20error:\x20','\x20from\x20','send_reply','working','error','set','notifications/claude/channel','application/json','Authorization','(none)','fatal:\x20','1654540KfjULG','session\x20disconnected','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.'];a0_0x26a1=function(){return _0x16e9a3;};return a0_0x26a1();}process['stdin']['on']('end',()=>b()),process['on'](a0_0x2f6489(0x1e8),()=>b()),process['on'](a0_0x2f6489(0x211),()=>b());
2
+ const a0_0x15f4d9=a0_0x2ade;(function(_0x292073,_0x1ea9c2){const _0x2aad4f=a0_0x2ade,_0x2e6e37=_0x292073();while(!![]){try{const _0x1cb1a2=parseInt(_0x2aad4f(0x18d))/0x1+parseInt(_0x2aad4f(0x147))/0x2*(parseInt(_0x2aad4f(0x107))/0x3)+-parseInt(_0x2aad4f(0x115))/0x4+-parseInt(_0x2aad4f(0x119))/0x5+-parseInt(_0x2aad4f(0x19b))/0x6*(parseInt(_0x2aad4f(0x11f))/0x7)+-parseInt(_0x2aad4f(0xfe))/0x8*(-parseInt(_0x2aad4f(0x17e))/0x9)+parseInt(_0x2aad4f(0x16f))/0xa;if(_0x1cb1a2===_0x1ea9c2)break;else _0x2e6e37['push'](_0x2e6e37['shift']());}catch(_0x715d2f){_0x2e6e37['push'](_0x2e6e37['shift']());}}}(a0_0x4501,0xe74f4));import{readFileSync as a0_0x37dd53,existsSync as a0_0x42c8d7}from'fs';import{randomUUID as a0_0x11eb1d}from'crypto';import{join as a0_0x434ea2}from'path';import{hostname as a0_0x237be6}from'os';import{execSync as a0_0x5c9412}from'child_process';import{Server as a0_0x23ed3b}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x246d70}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x1cc1ee,CallToolRequestSchema as a0_0x14e8b6}from'@modelcontextprotocol/sdk/types.js';function I(_0xf1e101){const _0x40e9a1=a0_0x2ade;if(!a0_0x42c8d7(_0xf1e101))return;for(let _0x5d428f of a0_0x37dd53(_0xf1e101,_0x40e9a1(0x192))[_0x40e9a1(0x113)]('\x0a')){let _0x54ed27=_0x5d428f[_0x40e9a1(0x175)]();if(!_0x54ed27||_0x54ed27['startsWith']('#'))continue;let _0x594886=_0x54ed27[_0x40e9a1(0x18e)]('=');if(_0x594886<0x0)continue;let _0x3b7c0b=_0x54ed27[_0x40e9a1(0x16c)](0x0,_0x594886)['trim'](),_0x1b5861=_0x54ed27[_0x40e9a1(0x16c)](_0x594886+0x1)['trim']()[_0x40e9a1(0x14e)](/^["']|["']$/g,'');if(!process.env[_0x3b7c0b])process.env[_0x3b7c0b]=_0x1b5861;}}var L=process.env.HOME||'~',U=a0_0x434ea2(L,a0_0x15f4d9(0x17f));I(a0_0x434ea2(U,a0_0x15f4d9(0x170)));var v=process[a0_0x15f4d9(0x18f)]()[a0_0x15f4d9(0x14e)](/\//g,'-');I(a0_0x434ea2(U,v,'.env'));function d(){const _0x33b9e2=a0_0x15f4d9;try{return a0_0x5c9412('tmux\x20display-message\x20-p\x20\x27#S\x27',{'encoding':_0x33b9e2(0x192),'timeout':0x7d0})[_0x33b9e2(0x175)]();}catch{return'';}}function m(){const _0x4c3005=a0_0x15f4d9;try{let _0x20b3d9=a0_0x434ea2(L,_0x4c3005(0x11c),'config.json');if(a0_0x42c8d7(_0x20b3d9))return JSON[_0x4c3005(0x178)](a0_0x37dd53(_0x20b3d9,_0x4c3005(0x192)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x15f4d9(0x137)]||a0_0x15f4d9(0x138),f=process.env.COMMHUB_TMUX||d();function r(){const _0x95f1d7=a0_0x15f4d9;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS['trim']())return process.env.COMMHUB_ALIAS[_0x95f1d7(0x175)]();return process['stderr'][_0x95f1d7(0x112)](_0x95f1d7(0x10c)+(_0x95f1d7(0x177)+(f||_0x95f1d7(0x116))+_0x95f1d7(0x162)+a0_0x237be6()+_0x95f1d7(0x128))),'unattributed-'+process[_0x95f1d7(0x197)];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x11eb1d(),F=process.env.COMMHUB_TOKEN||u[a0_0x15f4d9(0x12f)]||'';function W(_0x3484a7){const _0x1b9689=a0_0x15f4d9;let _0x1f39ba=new Date()['toTimeString']()['slice'](0x0,0x8);process[_0x1b9689(0x15c)][_0x1b9689(0x112)]('['+_0x1f39ba+_0x1b9689(0x14d)+_0x3484a7+'\x0a');}function N(_0x1ea835){return new Promise(_0x1db6a8=>setTimeout(_0x1db6a8,_0x1ea835));}function a0_0x2ade(_0x5bec9b,_0x4765fc){_0x5bec9b=_0x5bec9b-0xfd;const _0x4501be=a0_0x4501();let _0x2aded2=_0x4501be[_0x5bec9b];return _0x2aded2;}W(a0_0x15f4d9(0x10e)+j+a0_0x15f4d9(0x198)+G+a0_0x15f4d9(0x19d)+K[a0_0x15f4d9(0x16c)](0x0,0x8)+a0_0x15f4d9(0x12b)+(f||a0_0x15f4d9(0x185))+a0_0x15f4d9(0x121)+process[a0_0x15f4d9(0x18f)]()+'\x20PROJECT_ENV='+v);var D=new Map(),x=new a0_0x23ed3b({'name':a0_0x15f4d9(0x13c),'version':a0_0x15f4d9(0x163)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x15f4d9(0x11d),a0_0x15f4d9(0x12e),'Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.',a0_0x15f4d9(0x144),a0_0x15f4d9(0x18c)+G][a0_0x15f4d9(0x11b)]('\x0a')});x[a0_0x15f4d9(0x19a)](a0_0x1cc1ee,async()=>({'tools':[{'name':a0_0x15f4d9(0x176),'description':'Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','inputSchema':{'type':a0_0x15f4d9(0x131),'properties':{'task_id':{'type':a0_0x15f4d9(0x159),'description':a0_0x15f4d9(0x10b)},'text':{'type':'string','description':a0_0x15f4d9(0x140)},'status':{'type':'string','enum':['completed',a0_0x15f4d9(0x199),a0_0x15f4d9(0x130),a0_0x15f4d9(0x134),a0_0x15f4d9(0x125),a0_0x15f4d9(0x154)],'description':a0_0x15f4d9(0x174)}},'required':[a0_0x15f4d9(0x12c)]}},{'name':a0_0x15f4d9(0x102),'description':'Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','inputSchema':{'type':a0_0x15f4d9(0x131),'properties':{'status':{'type':a0_0x15f4d9(0x159),'enum':[a0_0x15f4d9(0x15e),a0_0x15f4d9(0x16a),a0_0x15f4d9(0x134),a0_0x15f4d9(0x125)]},'task':{'type':a0_0x15f4d9(0x159),'description':a0_0x15f4d9(0x148)},'progress':{'type':'number','description':a0_0x15f4d9(0x167)}},'required':[a0_0x15f4d9(0x15f)]}},{'name':'commhub_send_task','description':a0_0x15f4d9(0x16e),'inputSchema':{'type':'object','properties':{'alias':{'type':a0_0x15f4d9(0x159),'description':a0_0x15f4d9(0x103)},'task':{'type':'string','description':a0_0x15f4d9(0x171)},'priority':{'type':a0_0x15f4d9(0x159),'enum':[a0_0x15f4d9(0x179),a0_0x15f4d9(0x111),a0_0x15f4d9(0x166)],'description':a0_0x15f4d9(0x13e)}},'required':['alias',a0_0x15f4d9(0x146)]}},{'name':a0_0x15f4d9(0x183),'description':a0_0x15f4d9(0x150),'inputSchema':{'type':a0_0x15f4d9(0x131),'properties':{'alias':{'type':a0_0x15f4d9(0x159),'description':a0_0x15f4d9(0x103)},'message':{'type':a0_0x15f4d9(0x159),'description':a0_0x15f4d9(0x182)}},'required':[a0_0x15f4d9(0x118),'message']}},{'name':a0_0x15f4d9(0x139),'description':a0_0x15f4d9(0x189),'inputSchema':{'type':'object','properties':{}}}]}));async function Y(_0x23f82d,_0x2f25fa){const _0x41b335=a0_0x15f4d9;let _0x120e4d=await fetch(j+_0x41b335(0x10f),{'method':_0x41b335(0x100),'headers':{'Content-Type':'application/json','Accept':'application/json,\x20text/event-stream',...F?{'Authorization':_0x41b335(0x15b)+F}:{}},'body':JSON[_0x41b335(0x12a)]({'jsonrpc':_0x41b335(0x126),'id':0x1,'method':_0x41b335(0xff),'params':{'protocolVersion':'2025-03-26','capabilities':{},'clientInfo':{'name':_0x41b335(0x13c),'version':_0x41b335(0x163)}}})});if(!_0x120e4d['ok']){let _0x34c0cc=await _0x120e4d[_0x41b335(0x12c)]();return W(_0x41b335(0x191)+_0x120e4d[_0x41b335(0x15f)]+'\x20'+_0x34c0cc[_0x41b335(0x16c)](0x0,0x64)),{'ok':!0x1,'error':'init\x20failed:\x20'+_0x120e4d[_0x41b335(0x15f)]};}await _0x120e4d[_0x41b335(0x12c)]();let _0x531abb=(await(await fetch(j+_0x41b335(0x10f),{'method':_0x41b335(0x100),'headers':{'Content-Type':_0x41b335(0x133),'Accept':_0x41b335(0x143),...F?{'Authorization':_0x41b335(0x15b)+F}:{}},'body':JSON[_0x41b335(0x12a)]({'jsonrpc':_0x41b335(0x126),'id':0x2,'method':'tools/call','params':{'name':_0x23f82d,'arguments':_0x2f25fa}})}))[_0x41b335(0x12c)]())[_0x41b335(0x113)]('\x0a')[_0x41b335(0x114)](_0x3b2957=>_0x3b2957['startsWith'](_0x41b335(0x122)));if(_0x531abb){let _0x3b1479=JSON[_0x41b335(0x178)](_0x531abb['slice'](0x6));return _0x3b1479?.[_0x41b335(0x173)]?.[_0x41b335(0x18b)]?.[0x0]?.[_0x41b335(0x12c)]?JSON[_0x41b335(0x178)](_0x3b1479[_0x41b335(0x173)]['content'][0x0][_0x41b335(0x12c)]):_0x3b1479;}return{'ok':!0x1,'error':_0x41b335(0x181)};}x['setRequestHandler'](a0_0x14e8b6,async _0x5f5af3=>{const _0x544e9b=a0_0x15f4d9;let {name:_0x2b0297,arguments:_0x3b41dc}=_0x5f5af3[_0x544e9b(0x104)];if(_0x2b0297===_0x544e9b(0x176)){let {task_id:_0x3c469d,text:_0x3c71b9,status:_0x3b796c}=_0x3b41dc;if(_0x3b796c===_0x544e9b(0x101)||_0x3b796c===_0x544e9b(0x199)||_0x3b796c===_0x544e9b(0x130)){let _0x202d26=_0x3b796c===_0x544e9b(0x101)?_0x544e9b(0x145):_0x3b796c,_0x3fb581=_0x3c469d?D[_0x544e9b(0x13f)](_0x3c469d)||_0x544e9b(0x137):_0x544e9b(0x137),_0x2ab1cc=await Y('send_reply',{'alias':_0x3fb581,'text':_0x3c71b9,'in_reply_to':_0x3c469d||void 0x0,'status':_0x202d26,'from_session':G});if(_0x3c469d)D[_0x544e9b(0xfd)](_0x3c469d);return{'content':[{'type':'text','text':JSON['stringify'](_0x2ab1cc)}]};}let _0x1af9d3=await Y(_0x544e9b(0x11e),{'resume_id':K,'alias':G,'status':_0x3b796c===_0x544e9b(0x134)?_0x544e9b(0x134):_0x3b796c===_0x544e9b(0x125)?_0x544e9b(0x125):_0x544e9b(0x15e),'task':_0x3c71b9[_0x544e9b(0x16c)](0x0,0xc8),'output':_0x3c71b9});return{'content':[{'type':_0x544e9b(0x12c),'text':JSON[_0x544e9b(0x12a)](_0x1af9d3)}]};}if(_0x2b0297===_0x544e9b(0x102)){let {status:_0x1ec5c4,task:_0x474b26,progress:_0x5265fb}=_0x3b41dc,_0xe719c5=await Y(_0x544e9b(0x11e),{'resume_id':K,'alias':G,'status':_0x1ec5c4,'task':_0x474b26,'progress':_0x5265fb});return{'content':[{'type':_0x544e9b(0x12c),'text':JSON[_0x544e9b(0x12a)](_0xe719c5)}]};}if(_0x2b0297==='commhub_send_task'){let {alias:_0x1a2027,task:_0x33358b,priority:_0x3d67bf}=_0x3b41dc,_0xab37b7=await Y(_0x544e9b(0x15a),{'alias':_0x1a2027,'task':_0x33358b,'priority':_0x3d67bf||_0x544e9b(0x111),'from_session':G});return{'content':[{'type':_0x544e9b(0x12c),'text':JSON[_0x544e9b(0x12a)](_0xab37b7)}]};}if(_0x2b0297===_0x544e9b(0x183)){let {alias:_0x32e534,message:_0x28bde7}=_0x3b41dc,_0x1bb4f1=await Y('send_message',{'alias':_0x32e534,'message':_0x28bde7,'from_session':G});return{'content':[{'type':'text','text':JSON[_0x544e9b(0x12a)](_0x1bb4f1)}]};}if(_0x2b0297==='commhub_get_all_status'){let _0x56ebb6=await Y(_0x544e9b(0x129),{});return{'content':[{'type':'text','text':JSON[_0x544e9b(0x12a)](_0x56ebb6)}]};}return{'content':[{'type':_0x544e9b(0x12c),'text':JSON['stringify']({'error':_0x544e9b(0x13a)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x2695a0=a0_0x15f4d9;try{await Y(_0x2695a0(0x11e),{'resume_id':K,'alias':G,'status':_0x2695a0(0x16a),'server':a0_0x237be6(),'hostname':a0_0x237be6(),'agent':_0x2695a0(0x161),'project_dir':process['cwd'](),'tmux_name':f||void 0x0}),W(_0x2695a0(0x155)+G+_0x2695a0(0x136));}catch(_0x2a073f){W('re-register\x20failed:\x20'+_0x2a073f);}}async function o(){const _0x1bdfe1=a0_0x15f4d9;let _0x33cfc7=j+_0x1bdfe1(0x152)+encodeURIComponent(G),_0x4f9aed={};if(F)_0x4f9aed[_0x1bdfe1(0x18a)]='Bearer\x20'+F;W(_0x1bdfe1(0x180)+_0x33cfc7);let _0xbf5fa6=O,_0x36bd05=!0x0,_0x4a8f52=null;while(!0x0){try{let _0x305ba5=await fetch(_0x33cfc7,{'headers':_0x4f9aed});if(!_0x305ba5['ok']){if(W('SSE\x20error:\x20'+_0x305ba5[_0x1bdfe1(0x15f)]+'\x20'+_0x305ba5[_0x1bdfe1(0x153)]),_0x4a8f52=_0x4a8f52??Date[_0x1bdfe1(0x186)](),Date['now']()-_0x4a8f52>T){W(_0x1bdfe1(0x184)+j+_0x1bdfe1(0x13b));return;}await N(_0xbf5fa6),_0xbf5fa6=Math[_0x1bdfe1(0x19c)](_0xbf5fa6*0x2,R);continue;}let _0x533cb3=_0x305ba5[_0x1bdfe1(0x14f)][_0x1bdfe1(0x17b)](),_0x20e01c=new TextDecoder(),_0x2a85d5='';_0xbf5fa6=O;while(!0x0){let {done:_0x37d50e,value:_0x48b716}=await _0x533cb3[_0x1bdfe1(0x10d)]();if(_0x37d50e)break;_0x2a85d5+=_0x20e01c[_0x1bdfe1(0x160)](_0x48b716,{'stream':!0x0});let _0x1df06d=_0x2a85d5[_0x1bdfe1(0x113)]('\x0a\x0a');_0x2a85d5=_0x1df06d[_0x1bdfe1(0x10a)]()||'';for(let _0x4b5117 of _0x1df06d){let _0x1750a0=_0x4b5117[_0x1bdfe1(0x113)]('\x0a')[_0x1bdfe1(0x114)](_0x20c240=>_0x20c240[_0x1bdfe1(0x195)](_0x1bdfe1(0x122)));if(!_0x1750a0)continue;try{let _0x54b141=JSON['parse'](_0x1750a0[_0x1bdfe1(0x16c)](0x6));if(await a(_0x54b141),_0x54b141[_0x1bdfe1(0x193)]==='connected'){if(_0x4a8f52=null,!_0x36bd05)await l();_0x36bd05=!0x1;}}catch(_0x4ef405){W(_0x1bdfe1(0x14c)+_0x4ef405);}}}W(_0x1bdfe1(0x110));}catch(_0x2cc933){W(_0x1bdfe1(0x135)+_0x2cc933);}if(_0x4a8f52=_0x4a8f52??Date[_0x1bdfe1(0x186)](),Date[_0x1bdfe1(0x186)]()-_0x4a8f52>T){W(_0x1bdfe1(0x184)+j+_0x1bdfe1(0x13b));return;}await N(_0xbf5fa6),_0xbf5fa6=Math[_0x1bdfe1(0x19c)](_0xbf5fa6*0x2,R);}}async function a(_0x598cc1){const _0x53b639=a0_0x15f4d9;if(_0x598cc1[_0x53b639(0x193)]===_0x53b639(0x123)){W(_0x53b639(0x196)+G+'\x22');return;}if(_0x598cc1['type']===_0x53b639(0x142)){if(W(_0x53b639(0x156)+_0x598cc1[_0x53b639(0x151)]+':\x20'+_0x598cc1['message'][_0x53b639(0x16c)](0x0,0x3c)),await x[_0x53b639(0x157)]({'method':'notifications/claude/channel','params':{'content':_0x598cc1[_0x53b639(0x158)],'meta':{'sender':_0x598cc1[_0x53b639(0x151)]||_0x53b639(0x137),'sender_id':'commhub','user':_0x598cc1[_0x53b639(0x151)]||_0x53b639(0x137),'priority':'normal'}}}),_0x598cc1[_0x53b639(0x141)])await Y(_0x53b639(0x105),{'alias':G,'message_id':_0x598cc1[_0x53b639(0x141)]});return;}if(_0x598cc1[_0x53b639(0x193)]===_0x53b639(0x172)||_0x598cc1[_0x53b639(0x193)]==='broadcast'){W('←\x20'+_0x598cc1[_0x53b639(0x193)]+':\x20inbox_count='+_0x598cc1[_0x53b639(0x165)]+_0x53b639(0x13d)+(_0x598cc1[_0x53b639(0x149)]||_0x53b639(0x111)));let _0x56e576=await Y('get_inbox',{'alias':G,'limit':0x5});if(_0x56e576?.['ok']&&_0x56e576[_0x53b639(0x11a)]?.[_0x53b639(0x108)]>0x0)for(let _0x23d285 of _0x56e576['messages']){let _0x107147={'sender':_0x23d285[_0x53b639(0x124)]||_0x53b639(0x137),'sender_id':_0x53b639(0x109),'user':_0x23d285['from_session']||'hub','task_id':_0x23d285['id'],'priority':_0x23d285['priority']||_0x53b639(0x111)};D[_0x53b639(0x127)](_0x23d285['id'],_0x23d285[_0x53b639(0x124)]||_0x53b639(0x137)),await x[_0x53b639(0x157)]({'method':_0x53b639(0x190),'params':{'content':_0x23d285[_0x53b639(0x18b)],'meta':_0x107147}}),W(_0x53b639(0x188)+_0x23d285['id'][_0x53b639(0x16c)](0x0,0x8)+'\x20from\x20'+_0x23d285['from_session']+':\x20'+_0x23d285['content'][_0x53b639(0x16c)](0x0,0x3c)),await Y('ack_inbox',{'alias':G,'message_id':_0x23d285['id']});}}}function a0_0x4501(){const _0x6cac2d=['delete','50808MTtBtu','initialize','POST','completed','commhub_report_status','Target\x20session\x20alias','params','ack_inbox','offline','6kuKwgv','length','commhub','pop','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','read','ENV:\x20URL=','/mcp','SSE\x20stream\x20ended,\x20reconnecting...','normal','write','split','find','6360224cceeZl','(none)','stdin','alias','8666325DAPEBr','messages','join','.anet','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>','report_status','952469PecTou','SIGINT','\x20CWD=','data:\x20','connected','from_session','error','2.0','set','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','get_all_status','stringify','...\x20TMUX=','text','fatal:\x20','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','token','cancelled','object','SIGTERM','application/json','blocked','SSE\x20connection\x20error:\x20','\x22\x20after\x20SSE\x20reconnect','hub','http://127.0.0.1:9200','commhub_get_all_status','unknown\x20tool',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','commhub-channel','\x20priority=','Priority\x20(default:\x20normal)','get','Reply\x20text\x20/\x20result\x20summary','message_id','new_message','application/json,\x20text/event-stream','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','replied','task','906156sglHKg','Current\x20task\x20description','priority','heartbeat\x20failed:\x20','then','parse\x20error:\x20',']\x20[commhub]\x20','replace','body','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','from','/events/','statusText','in_progress','re-registered\x20as\x20\x22','←\x20message\x20from\x20','notification','message','string','send_task','Bearer\x20','stderr','warning:\x20could\x20not\x20register:\x20','working','status','decode','claude-code','\x20/\x20hostname=','0.3.0','session\x20disconnected','inbox_count','low','Progress\x200-100','MCP\x20stdio\x20connected','exit','idle','shutting\x20down,\x20reporting\x20offline...','slice','ready\x20—\x20waiting\x20for\x20events','Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','29466220DuRAdr','.env','Task\x20content','new_task','result','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','trim','commhub_reply','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','parse','high','catch','getReader','\x22\x20(','connect','495ZWUGjY','.claude/channels/commhub','connecting\x20to\x20','no\x20response','Message\x20content','commhub_send_message','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','none','now','starting\x20SSE\x20listener...','→\x20injected\x20task\x20','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','Authorization','content','Session\x20alias:\x20','1565419vuDdEz','indexOf','cwd','notifications/claude/channel','CommHub\x20init\x20failed:\x20','utf-8','type','end','startsWith','SSE\x20connected\x20as\x20\x22','pid','\x20ALIAS=','failed','setRequestHandler','66RrCwQc','min','\x20RESUME_ID='];a0_0x4501=function(){return _0x6cac2d;};return a0_0x4501();}async function n(){const _0x2c16fb=a0_0x15f4d9;let _0x59ee4f=new a0_0x246d70();await x[_0x2c16fb(0x17d)](_0x59ee4f),W(_0x2c16fb(0x168)),W(_0x2c16fb(0x187)),o()['catch'](_0x59681d=>W('SSE\x20fatal:\x20'+_0x59681d)),Y(_0x2c16fb(0x11e),{'resume_id':K,'alias':G,'status':_0x2c16fb(0x16a),'server':a0_0x237be6(),'hostname':a0_0x237be6(),'agent':_0x2c16fb(0x161),'project_dir':process[_0x2c16fb(0x18f)](),'tmux_name':f||void 0x0})[_0x2c16fb(0x14b)](()=>W('registered\x20as\x20\x22'+G+_0x2c16fb(0x17c)+K[_0x2c16fb(0x16c)](0x0,0x8)+')'))[_0x2c16fb(0x17a)](_0x253dbc=>W(_0x2c16fb(0x15d)+_0x253dbc)),setInterval(()=>{const _0x535dd4=_0x2c16fb;Y(_0x535dd4(0x11e),{'resume_id':K,'alias':G,'status':'idle','server':a0_0x237be6(),'hostname':a0_0x237be6(),'agent':'claude-code','project_dir':process[_0x535dd4(0x18f)](),'tmux_name':f||void 0x0})[_0x535dd4(0x17a)](_0x31b110=>W(_0x535dd4(0x14a)+_0x31b110));},0x2bf20),W(_0x2c16fb(0x16d));}n()['catch'](_0x1b8f2d=>{const _0x50c31e=a0_0x15f4d9;W(_0x50c31e(0x12d)+_0x1b8f2d),process[_0x50c31e(0x169)](0x1);});async function b(){const _0x549aac=a0_0x15f4d9;W(_0x549aac(0x16b)),await Y(_0x549aac(0x11e),{'resume_id':K,'alias':G,'status':_0x549aac(0x106),'task':_0x549aac(0x164)})[_0x549aac(0x17a)](()=>{}),process[_0x549aac(0x169)](0x0);}process[a0_0x15f4d9(0x117)]['on'](a0_0x15f4d9(0x194),()=>b()),process['on'](a0_0x15f4d9(0x132),()=>b()),process['on'](a0_0x15f4d9(0x120),()=>b());
@@ -0,0 +1,9 @@
1
+ export type RuntimeName = "claude-code-cli" | "codex-sdk" | "claude-agent-sdk" | "grok-build-acp";
2
+ /** Operator-facing default for any runtime slot that comes in empty / missing / unrecognized. */
3
+ export declare const DEFAULT_RUNTIME: RuntimeName;
4
+ type ProfileLike = {
5
+ runtime?: string;
6
+ codexRuntime?: string;
7
+ };
8
+ export declare function normalizeRuntime(profileOrRuntime?: ProfileLike | string): RuntimeName;
9
+ export {};
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Per-iteration controller passed into `runOnce`. Today exposes only
3
+ * `markStable`; a future stop-the-current-iteration affordance would
4
+ * be a sibling field on this interface.
5
+ */
6
+ export interface SupervisedIterationController {
7
+ /**
8
+ * Signal that this iteration crossed the "actually working" threshold.
9
+ * Resets the backoff to `baseDelayMs` and zeroes the cumulative
10
+ * downtime counter. Safe to call multiple times per iteration — only
11
+ * the first call has effect within a single iteration.
12
+ */
13
+ markStable(): void;
14
+ }
15
+ export interface SuperviseChildOpts {
16
+ /** Short label for log / error messages. e.g. "feishu" / "sse". */
17
+ label: string;
18
+ /** Returns true when the supervisor should stop without rescheduling. */
19
+ shutdownGate: () => boolean;
20
+ /**
21
+ * One iteration of the supervised child. Resolves when the iteration
22
+ * ends (child exits / stream closes); throws to log + reschedule.
23
+ * Receives a controller for the iteration to call `markStable` on
24
+ * once the work crosses its "really working" threshold.
25
+ */
26
+ runOnce: (ctrl: SupervisedIterationController) => Promise<void>;
27
+ /** Initial backoff delay in ms. Default 1_000. */
28
+ baseDelayMs?: number;
29
+ /** Maximum backoff after exponential growth. Default 30_000. */
30
+ maxDelayMs?: number;
31
+ /**
32
+ * Jitter ratio (±N×delay). Default 0.25 (±25%). Set 0 to disable.
33
+ * The waited time per backoff is `max(100, delay + delay * jitter *
34
+ * (Math.random() * 2 - 1))`.
35
+ */
36
+ jitterRatio?: number;
37
+ /**
38
+ * If cumulative downtime (consecutive iterations that did NOT call
39
+ * markStable, plus their inter-iteration sleeps) exceeds this, the
40
+ * supervisor invokes `onAbandon` and returns. Default `Infinity`
41
+ * (never abandon). Set to a finite value (e.g. 3_600_000 = 1 h) to
42
+ * give up after a long unsuccessful run.
43
+ */
44
+ abandonAfterMs?: number;
45
+ /** Called once if the supervisor abandons. */
46
+ onAbandon?: () => void;
47
+ /** Called with the runOnce error before scheduling the next iteration. */
48
+ onError?: (err: unknown) => void;
49
+ /** Called before sleeping with the resolved backoff (and the jittered wait). */
50
+ onRetryWait?: (waitMs: number, backoffMs: number) => void;
51
+ /**
52
+ * Sleep primitive — overridden by tests to skip real timers. Default
53
+ * uses `setTimeout`. Must respect `ms <= 0` as "no wait".
54
+ */
55
+ sleep?: (ms: number) => Promise<void>;
56
+ /**
57
+ * Random source — overridden by tests for deterministic jitter.
58
+ * Default `Math.random`.
59
+ */
60
+ random?: () => number;
61
+ /** Current-time source — overridden by tests. Default `Date.now`. */
62
+ now?: () => number;
63
+ }
64
+ /**
65
+ * Run the supervisor loop. Resolves when the shutdown gate triggers or
66
+ * the abandon threshold fires; never throws (runOnce errors are routed
67
+ * to `onError`).
68
+ */
69
+ export declare function superviseChild(opts: SuperviseChildOpts): Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network",
3
- "version": "2.3.0-preview.1",
3
+ "version": "2.3.0-preview.3",
4
4
  "description": "AI Agent Network CLI \u2014 Local-first multi-agent orchestration across 4 runtimes (Claude Code CLI / Claude Agent SDK / Codex SDK / Grok Build ACP) and 8+ LLM providers (Anthropic / OpenAI / xAI Grok / MiniMax / DeepSeek / GLM / Kimi / InternLM / Xiaomi MiMo / OpenRouter). Apache 2.0.",
5
5
  "type": "module",
6
6
  "main": "dist/src/client.js",