@sleep2agi/agent-network 2.3.0-preview.3 → 2.3.0-preview.5
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.
- package/dist/bin/cli.js +1 -1
- package/dist/src/client.js +1 -1
- package/dist/src/im/feishu/worker.js +23 -12
- package/dist/src/node-server.js +1 -1
- package/package.json +1 -1
package/dist/src/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const a0_0x55d81d=a0_0x4e98;(function(_0xbeb9b8,_0x4dc3fa){const _0x837b0=a0_0x4e98,_0x828840=_0xbeb9b8();while(!![]){try{const _0x1f4431=-parseInt(_0x837b0(0x201))/0x1*(-parseInt(_0x837b0(0x1e9))/0x2)+-parseInt(_0x837b0(0x1e0))/0x3*(-parseInt(_0x837b0(0x1b9))/0x4)+parseInt(_0x837b0(0x1bd))/0x5+-parseInt(_0x837b0(0x1fe))/0x6*(parseInt(_0x837b0(0x1fd))/0x7)+parseInt(_0x837b0(0x1f5))/0x8*(-parseInt(_0x837b0(0x1b8))/0x9)+parseInt(_0x837b0(0x20a))/0xa*(-parseInt(_0x837b0(0x1e4))/0xb)+parseInt(_0x837b0(0x1e2))/0xc;if(_0x1f4431===_0x4dc3fa)break;else _0x828840['push'](_0x828840['shift']());}catch(_0x5c26ca){_0x828840['push'](_0x828840['shift']());}}}(a0_0x562b,0xcdbde));import{EventEmitter as a0_0x180c4e}from'events';import{hostname as a0_0x46611e}from'os';function a0_0x4e98(_0x13fe77,_0x5d396f){_0x13fe77=_0x13fe77-0x1b6;const _0x562ba9=a0_0x562b();let _0x4e986c=_0x562ba9[_0x13fe77];return _0x4e986c;}function a0_0x562b(){const _0x13bec3=['min','type','98729dGOQPq','heartbeatTimer','SSE\x20connected','application/json','error','content','Bearer\x20','/mcp','log','4430810kQqtpR','send_reply','registered','task','abort','connect','ack_inbox','toString','agent','connected','completed','new_task','alias','send_message','running','1062081urYIvd','922252EWeFMj','SSE\x20error:\x20','sseAbort','get_inbox','8211425DdatKv','server','name','reply','new_message','Authorization','slice','send_task','report_status','sleep','signal','inbox\x20error:\x20','processInbox','messages','result','autoConnect',']\x20[commhub:','send','broadcast','from_session','reconnectDelay','sdk-','catch','call','POST','get_all_status','body','getAllStatus','resumeId','tools/call','sdk','SSE\x20failed:\x20','connectSSE','match','token','6TPINwo','status','644916nqizwo','getReader','11walScv','emit','pop','normal','disconnected','10pENkcK','idle','text/event-stream','url','text','message','heartbeat\x20failed:\x20','heartbeatInterval','toTimeString','read','parse','startsWith','24fmqLeb','data:\x20','split','/events/','now','stringify','replace','2.0','416283CHXBRR','102vJHbea'];a0_0x562b=function(){return _0x13bec3;};return a0_0x562b();}class T extends a0_0x180c4e{['url'];['alias'];[a0_0x55d81d(0x1df)];[a0_0x55d81d(0x212)];[a0_0x55d81d(0x1d9)];[a0_0x55d81d(0x1f0)];['reconnectDelay'];[a0_0x55d81d(0x202)];[a0_0x55d81d(0x1bb)];['running']=!0x1;constructor(_0x5b1133){const _0x5711f9=a0_0x55d81d;super();if(this[_0x5711f9(0x1ec)]=_0x5b1133[_0x5711f9(0x1ec)][_0x5711f9(0x1fb)](/\/$/,''),this[_0x5711f9(0x216)]=_0x5b1133[_0x5711f9(0x216)],this[_0x5711f9(0x1df)]=_0x5b1133[_0x5711f9(0x1df)],this[_0x5711f9(0x212)]=_0x5b1133[_0x5711f9(0x212)]||_0x5711f9(0x1db),this['resumeId']=_0x5711f9(0x1d2)+_0x5b1133[_0x5711f9(0x216)]+'-'+Date['now']()[_0x5711f9(0x211)](0x24),this[_0x5711f9(0x1f0)]=_0x5b1133[_0x5711f9(0x1f0)]??0x2bf20,this[_0x5711f9(0x1d1)]=_0x5b1133[_0x5711f9(0x1d1)]??0xbb8,_0x5b1133[_0x5711f9(0x1cc)]!==!0x1)this[_0x5711f9(0x20f)]();}[a0_0x55d81d(0x209)](_0x170760){const _0x4bc411=a0_0x55d81d;console[_0x4bc411(0x209)]('['+new Date()[_0x4bc411(0x1f1)]()[_0x4bc411(0x1c3)](0x0,0x8)+_0x4bc411(0x1cd)+this['alias']+']\x20'+_0x170760);}async[a0_0x55d81d(0x1d4)](_0x3ce539,_0x2993f){const _0x48d24d=a0_0x55d81d;let _0x9707de={'Content-Type':_0x48d24d(0x204),'Accept':'application/json,\x20text/event-stream'};if(this[_0x48d24d(0x1df)])_0x9707de[_0x48d24d(0x1c2)]=_0x48d24d(0x207)+this[_0x48d24d(0x1df)];let _0x4b08f0=await(await fetch(this[_0x48d24d(0x1ec)]+_0x48d24d(0x208),{'method':_0x48d24d(0x1d5),'headers':_0x9707de,'body':JSON[_0x48d24d(0x1fa)]({'jsonrpc':_0x48d24d(0x1fc),'id':Date[_0x48d24d(0x1f9)](),'method':_0x48d24d(0x1da),'params':{'name':_0x3ce539,'arguments':_0x2993f}})}))[_0x48d24d(0x1ed)](),_0x5280fa=_0x4b08f0[_0x48d24d(0x1de)](/data: (.+)/),_0x81d7c1=_0x5280fa?JSON[_0x48d24d(0x1f3)](_0x5280fa[0x1]):JSON[_0x48d24d(0x1f3)](_0x4b08f0),_0x1ffed4=_0x81d7c1?.[_0x48d24d(0x1cb)]?.[_0x48d24d(0x206)]?.[0x0]?.[_0x48d24d(0x1ed)];return _0x1ffed4?JSON['parse'](_0x1ffed4):_0x81d7c1;}async[a0_0x55d81d(0x20f)](){const _0x4d940f=a0_0x55d81d;if(this[_0x4d940f(0x1b7)])return;this[_0x4d940f(0x1b7)]=!0x0,await this[_0x4d940f(0x1e1)](_0x4d940f(0x1ea)),this[_0x4d940f(0x209)](_0x4d940f(0x20c)),this[_0x4d940f(0x202)]=setInterval(()=>{const _0x3bd91f=_0x4d940f;this['status']('idle')[_0x3bd91f(0x1d3)](_0x2419ce=>this[_0x3bd91f(0x209)](_0x3bd91f(0x1ef)+_0x2419ce['message']));},this[_0x4d940f(0x1f0)]),this[_0x4d940f(0x1dd)]();}async['disconnect'](){const _0x35f613=a0_0x55d81d;if(this[_0x35f613(0x1b7)]=!0x1,this['sseAbort']?.[_0x35f613(0x20e)](),this['heartbeatTimer'])clearInterval(this[_0x35f613(0x202)]);await this[_0x35f613(0x1e1)]('offline')['catch'](()=>{}),this[_0x35f613(0x209)](_0x35f613(0x1e8));}async[a0_0x55d81d(0x1ce)](_0x280819,_0x2e4661,_0x568659=a0_0x55d81d(0x1e7)){const _0xae56cb=a0_0x55d81d;return this[_0xae56cb(0x1d4)](_0xae56cb(0x1c4),{'alias':_0x280819,'task':_0x2e4661,'priority':_0x568659,'from_session':this['alias']});}async['message'](_0x6da5fe,_0x1125d1){const _0x40d758=a0_0x55d81d;return this[_0x40d758(0x1d4)](_0x40d758(0x1b6),{'alias':_0x6da5fe,'message':_0x1125d1,'from_session':this[_0x40d758(0x216)]});}async[a0_0x55d81d(0x1c0)](_0x179458,_0x558877,_0x40dc6d=a0_0x55d81d(0x214)){const _0x7c53f4=a0_0x55d81d;return this[_0x7c53f4(0x1d4)](_0x7c53f4(0x20b),{'in_reply_to':_0x179458,'text':_0x558877,'status':_0x40dc6d});}async['status'](_0x475e7d,_0x264586){const _0x1837fd=a0_0x55d81d;return this['call'](_0x1837fd(0x1c5),{'resume_id':this[_0x1837fd(0x1d9)],'alias':this[_0x1837fd(0x216)],'status':_0x475e7d,'server':a0_0x46611e(),'hostname':a0_0x46611e(),'agent':this[_0x1837fd(0x212)],'project_dir':process['cwd'](),..._0x264586});}async[a0_0x55d81d(0x1d8)](){const _0x420c96=a0_0x55d81d;return this['call'](_0x420c96(0x1d6),{});}async['broadcast'](_0x13643d,_0x2c7320){const _0x530b2c=a0_0x55d81d;return this[_0x530b2c(0x1d4)](_0x530b2c(0x1cf),{'message':_0x13643d,'filter_server':_0x2c7320?.[_0x530b2c(0x1be)],'filter_status':_0x2c7320?.[_0x530b2c(0x1e1)]});}async[a0_0x55d81d(0x1dd)](){const _0x3dc2ea=a0_0x55d81d;let _0x435bb4=encodeURIComponent(this[_0x3dc2ea(0x216)]),_0x5769ba=this['url']+_0x3dc2ea(0x1f8)+_0x435bb4,_0xdd7941=this[_0x3dc2ea(0x1d1)];while(this['running']){try{this[_0x3dc2ea(0x1bb)]=new AbortController();let _0x52e294={'Accept':_0x3dc2ea(0x1eb)};if(this['token'])_0x52e294['Authorization']='Bearer\x20'+this['token'];let _0x203788=await fetch(_0x5769ba,{'headers':_0x52e294,'signal':this[_0x3dc2ea(0x1bb)][_0x3dc2ea(0x1c7)]});if(!_0x203788['ok']||!_0x203788[_0x3dc2ea(0x1d7)]){this[_0x3dc2ea(0x209)](_0x3dc2ea(0x1dc)+_0x203788[_0x3dc2ea(0x1e1)]),await this[_0x3dc2ea(0x1c6)](_0xdd7941),_0xdd7941=Math['min'](_0xdd7941*1.5,0xea60);continue;}_0xdd7941=this[_0x3dc2ea(0x1d1)];let _0x295ef6=_0x203788[_0x3dc2ea(0x1d7)][_0x3dc2ea(0x1e3)](),_0x6f7893=new TextDecoder(),_0xa91ae1='';while(this['running']){let {done:_0x252d26,value:_0xba285}=await _0x295ef6[_0x3dc2ea(0x1f2)]();if(_0x252d26)break;_0xa91ae1+=_0x6f7893['decode'](_0xba285,{'stream':!0x0});let _0x4524f2=_0xa91ae1[_0x3dc2ea(0x1f7)]('\x0a');_0xa91ae1=_0x4524f2[_0x3dc2ea(0x1e6)]()||'';for(let _0x502b78 of _0x4524f2){if(!_0x502b78[_0x3dc2ea(0x1f4)](_0x3dc2ea(0x1f6)))continue;try{let _0x1594bb=JSON[_0x3dc2ea(0x1f3)](_0x502b78[_0x3dc2ea(0x1c3)](0x6));if(_0x1594bb[_0x3dc2ea(0x200)]==='connected'){this[_0x3dc2ea(0x209)](_0x3dc2ea(0x203)),this[_0x3dc2ea(0x1e5)](_0x3dc2ea(0x213));continue;}if(_0x1594bb[_0x3dc2ea(0x200)]===_0x3dc2ea(0x215)||_0x1594bb[_0x3dc2ea(0x200)]===_0x3dc2ea(0x1c1)||_0x1594bb['type']===_0x3dc2ea(0x1cf))await this[_0x3dc2ea(0x1c9)]();}catch{}}}}catch(_0xad562b){if(_0xad562b[_0x3dc2ea(0x1bf)]==='AbortError')break;this[_0x3dc2ea(0x1e5)](_0x3dc2ea(0x205),_0xad562b),this[_0x3dc2ea(0x209)](_0x3dc2ea(0x1ba)+_0xad562b['message']);}if(this[_0x3dc2ea(0x1b7)])this['emit'](_0x3dc2ea(0x1e8)),this[_0x3dc2ea(0x209)]('SSE\x20reconnecting\x20in\x20'+_0xdd7941/0x3e8+'s...'),await this[_0x3dc2ea(0x1c6)](_0xdd7941),_0xdd7941=Math[_0x3dc2ea(0x1ff)](_0xdd7941*1.5,0xea60);}}async[a0_0x55d81d(0x1c9)](){const _0x5c6ee0=a0_0x55d81d;try{let _0x28fd8e=(await this[_0x5c6ee0(0x1d4)](_0x5c6ee0(0x1bc),{'alias':this[_0x5c6ee0(0x216)],'limit':0xa}))?.[_0x5c6ee0(0x1ca)]||[];for(let _0x288a7f of _0x28fd8e)await this[_0x5c6ee0(0x1d4)](_0x5c6ee0(0x210),{'alias':this[_0x5c6ee0(0x216)],'message_id':_0x288a7f['id']}),this[_0x5c6ee0(0x209)]('←\x20'+_0x288a7f[_0x5c6ee0(0x1d0)]+':\x20'+_0x288a7f[_0x5c6ee0(0x206)][_0x5c6ee0(0x1c3)](0x0,0x3c)),this[_0x5c6ee0(0x1e5)](_0x5c6ee0(0x20d),_0x288a7f),this[_0x5c6ee0(0x1e5)](_0x5c6ee0(0x1ee),_0x288a7f);}catch(_0x29c5f4){this['log'](_0x5c6ee0(0x1c8)+_0x29c5f4[_0x5c6ee0(0x1ee)]);}}[a0_0x55d81d(0x1c6)](_0x31cb43){return new Promise(_0x55aba7=>setTimeout(_0x55aba7,_0x31cb43));}}var $=T;export{$ as default,T as CommHub};
|
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import*as F from"@larksuiteoapi/node-sdk";import
|
|
3
|
-
`)
|
|
4
|
-
`);return}
|
|
2
|
+
import*as F from"@larksuiteoapi/node-sdk";import{existsSync as I,mkdirSync as f,readFileSync as u,writeFileSync as v}from"node:fs";import{join as O}from"node:path";import{Readable as c}from"node:stream";function A(J){if(Array.isArray(J))return{list:J.filter((Z)=>typeof Z==="string"&&Z.length>0).map((Z)=>String(Z)),malformed:!1};if(J===void 0||J===null)return{list:[],malformed:!1};return{list:[],malformed:!0}}function P(J){if(J.conversationType==="dm"){let{list:$,malformed:V}=A(J.allowFrom);if($.length===0)return{allow:!1,kind:"empty-fail-closed",reason:V?"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=A(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);let Z=process.env.ANET_FEISHU_MEDIA_DIR?.trim();if(Z)this.mediaDir=O(Z,this.connectionName);else if(Q.channelDir)this.mediaDir=`/work/feishu-attachments/${this.connectionName}`;else this.mediaDir=null}async start(J){if(!this.feishuConfig||!this.client)throw Error("FeishuAdapter.start: call init() first");let{appId:Q,appSecret:Z,access:$,groupPolicy:V}=this.feishuConfig,K=this.connectionName,q=this.botOpenId,X=this.mediaDir,U=this.client,H=new F.EventDispatcher({});H.register({"im.message.receive_v1":async(z)=>{try{this.health_={...this.health_,lastEventAt:Date.now()};let Y=g(z,K,q);if(!Y)return;await l(z,Y,U,X);let B=o(Y,$,V);if(!B.allow){E("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},E("error",null,B)}}}),this.wsClient=new F.WSClient({appId:Q,appSecret:Z,loggerLevel:F.LoggerLevel.warn}),await this.wsClient.start({eventDispatcher:H}),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,Z;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",Z=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",Z=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:Z}}))?.data?.message_id;if(!U)throw Error("FeishuAdapter.send: reply returned no message_id");return{messageId:U}}let V=J.target.conversationType==="dm"?"open_id":"chat_id",q=(await this.client.im.message.create({params:{receive_id_type:V},data:{receive_id:J.target.conversationId,msg_type:Q,content:Z}}))?.data?.message_id;if(!q)throw Error("FeishuAdapter.send: create returned no message_id");return{messageId:q}}async edit(J,Q,Z){if(!this.client)throw Error("FeishuAdapter.edit: call init() first");let $=Z.text??Z.markdown;if(!$)throw Error("FeishuAdapter.edit: M3 supports text only");await this.client.im.message.update({path:{message_id:Q},data:{msg_type:"text",content:JSON.stringify({text:$})}})}health(){return{...this.health_}}}function g(J,Q,Z){let $=J,V=$?.message,K=$?.sender,q=K?.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 U=V.chat_type==="group"?"group":"dm",H=Array.isArray(V.mentions)?V.mentions:[],z=Z?H.some((B)=>B?.id?.open_id===Z):H.length>0,Y=`${Q}#feishu`;return{platform:"feishu",connectionId:Y,tenantId:K?.tenant_key,conversation:{platform:"feishu",conversationId:V.chat_id,conversationType:U,threadRootId:V.root_id},sender:{id:q},messageId:V.message_id,mentioned:z,content:X?{text:X}:{},receivedAt:Date.now(),idempotencyKey:`feishu:${Y}:${V.message_id}`}}async function l(J,Q,Z,$){let V=Q.messageId;if(!Z){process.stderr.write(`[feishu:image] ${V} skip: no lark client
|
|
3
|
+
`);return}if(!$){process.stderr.write(`[feishu:image] ${V} skip: no mediaDir configured
|
|
4
|
+
`);return}let q=J?.message;if(!q||q.message_type!=="image")return;let X;try{X=JSON.parse(q.content).image_key}catch(H){process.stderr.write(`[feishu:image] ${V} skip: content not JSON (${H?.message??H})
|
|
5
|
+
`);return}if(!X||!q.message_id){process.stderr.write(`[feishu:image] ${V} skip: no image_key/message_id (key=${X})
|
|
6
|
+
`);return}process.stderr.write(`[feishu:image] ${V} download begin (key=${X.slice(0,16)}…, dir=${$})
|
|
7
|
+
`);let U=await m(Z,q.message_id,X,$,Q.conversation?.conversationId);if(U)process.stderr.write(`[feishu:image] ${V} download ok → ${U}
|
|
8
|
+
`),Q.content={...Q.content,images:[U]};else process.stderr.write(`[feishu:image] ${V} download FAILED (see downloadImage stderr above)
|
|
9
|
+
`)}function p(J){if(J.length<12)return null;if(J[0]===137&&J[1]===80&&J[2]===78&&J[3]===71&&J[4]===13&&J[5]===10&&J[6]===26&&J[7]===10)return{mime:"image/png",ext:"png"};if(J[0]===255&&J[1]===216&&J[2]===255)return{mime:"image/jpeg",ext:"jpg"};if(J[0]===71&&J[1]===73&&J[2]===70&&J[3]===56&&(J[4]===55||J[4]===57)&&J[5]===97)return{mime:"image/gif",ext:"gif"};if(J[0]===82&&J[1]===73&&J[2]===70&&J[3]===70&&J[8]===87&&J[9]===69&&J[10]===66&&J[11]===80)return{mime:"image/webp",ext:"webp"};return null}async function m(J,Q,Z,$,V){try{let K=await J.im.messageResource.get({path:{message_id:Q,file_key:Z},params:{type:"image"}});if(!K)return process.stderr.write(`[feishu:image] ${Q} messageResource.get returned falsy (no stream)
|
|
10
|
+
`),null;let q=K,X=[];await new Promise((j,W)=>{q.on("data",(G)=>X.push(Buffer.from(G))),q.on("end",()=>j()),q.on("error",(G)=>W(G))});let U=Buffer.concat(X);process.stderr.write(`[feishu:image] ${Q} stream collected ${U.length} bytes
|
|
11
|
+
`);let H=p(U);if(!H){let j=U.slice(0,16).toString("hex");return process.stderr.write(`[feishu:image] ${Q} mime rejected (head hex: ${j})
|
|
12
|
+
`),null}let z=V?O($,V.replace(/[^a-zA-Z0-9_-]/g,"_")):$;f(z,{recursive:!0});let Y=Q.replace(/[^a-zA-Z0-9_-]/g,"_"),B=O(z,`${Y}.${H.ext}`);return v(B,U),B}catch(K){let q=K?.message??String(K),X=K?.response?.data?.code??K?.code??"";return process.stderr.write(`[feishu:image] ${Q} downloadImage threw: code=${X} msg=${q}
|
|
13
|
+
`),null}}async function d(J,Q){try{if(!I(Q))return null;let Z=u(Q),$=c.from(Z);return(await J.im.image.create({data:{image_type:"message",image:$}}))?.image_key??null}catch{return null}}async function i(J){try{let Z=await J.request({method:"GET",url:"/open-apis/bot/v3/info"});return Z?.bot?.open_id??Z?.data?.bot?.open_id??null}catch{return null}}function o(J,Q,Z){let $=P({conversationType:J.conversation.conversationType,allowFrom:Q.allowFrom,allowChats:Q.allowChats,senderId:J.sender.id,conversationId:J.conversation.conversationId,groupPolicy:Z==="command"?"mention":Z});if(J.conversation.conversationType==="dm")return{allow:$.allow,reason:$.reason};if(!$.allow)return{allow:!1,reason:$.reason};if(Z==="all")return{allow:!0,reason:""};if(J.mentioned)return{allow:!0,reason:""};return{allow:!1,reason:`groupPolicy=${Z} requires @bot mention (not mentioned)`}}function E(J,Q,Z){let $=new Date().toISOString(),V=Q?`${Q.conversation.conversationType}:${Q.conversation.conversationId}`:"?",K=Q?Q.sender.id:"?";process.stderr.write(`[${$}] [feishu:audit] ${J} from=${K} conv=${V} — ${Z}
|
|
14
|
+
`)}import{existsSync as D,readFileSync as y}from"node:fs";import{join as M}from"node:path";function L(J){let Q=r(M(J,".env")),Z=Q.FEISHU_APP_ID,$=Q.FEISHU_APP_SECRET;if(!Z||!$)throw Error(`feishu channel: FEISHU_APP_ID / FEISHU_APP_SECRET missing in ${J}/.env`);let V=s(M(J,"access.json"));return{appId:Z,appSecret:$,access:V,groupPolicy:"mention",ackPlaceholder:!0,auditRaw:!1,taskTimeoutMs:300000,channelDir:J}}function r(J){if(!D(J))return{};let Q={};for(let Z of y(J,"utf-8").split(/\r?\n/)){let $=Z.trim();if(!$||$.startsWith("#"))continue;let V=$.indexOf("=");if(V<0)continue;let K=$.slice(0,V).trim(),q=$.slice(V+1).trim().replace(/^["']|["']$/g,"");Q[K]=q}return Q}function s(J){if(!D(J))return{allowFrom:[],allowChats:[]};try{let Q=JSON.parse(y(J,"utf-8"));return{allowFrom:Array.isArray(Q.allowFrom)?Q.allowFrom:[],allowChats:Array.isArray(Q.allowChats)?Q.allowChats:[]}}catch{return{allowFrom:[],allowChats:[]}}}var n=900000,a=120000,t=3,_=60000,e=2,T=60000,JJ=3,w=60000,QJ="处理频率超出限制,请稍后重试";async function h(J){let Q=L(J.channelDir),Z=new R;await Z.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||n,V=J.onEvent??$J(Z,$,Q.ackPlaceholder);return await Z.start(VJ(ZJ(V,Z))),Z}function VJ(J){let Q=new Map;return async(Z)=>{let $=Date.now();if(Q.size>200){for(let[V,K]of Q)if($-K>a)Q.delete(V)}if(Q.has(Z.idempotencyKey)){process.stderr.write(`[feishu:bridge] dedup drop ${Z.idempotencyKey}
|
|
15
|
+
`);return}Q.set(Z.idempotencyKey,$),await J(Z)}}function ZJ(J,Q){let Z=new Map,$=new Map,V=new Map;function K(Y,B,j){let W=B-j;return Y.filter((G)=>G>=W)}function q(Y,B,j){if(Y.size<=b)return;for(let[W,G]of Y){let N=G[G.length-1]??0;if(B-N>j)Y.delete(W)}}function X(Y,B){if(Y.size<=b)return;for(let[j,W]of Y)if(B-W.windowStart>w)Y.delete(j)}function U(Y,B){if(Y.size<=B)return;let j=[];for(let[G,N]of Y)j.push([G,N[N.length-1]??0]);j.sort((G,N)=>G[1]-N[1]);let W=Y.size-B;for(let G=0;G<W;G++)Y.delete(j[G][0])}function H(Y,B){if(Y.size<=B)return;let j=[];for(let[G,N]of Y)j.push([G,N.windowStart]);j.sort((G,N)=>G[1]-N[1]);let W=Y.size-B;for(let G=0;G<W;G++)Y.delete(j[G][0])}let z=async(Y)=>{let B=Date.now();q(Z,B,_),q($,B,T),X(V,B),U(Z,C),U($,C),H(V,C);let j=!1;if(Y.conversation.conversationType==="dm"){let x=Y.sender.id,S=K(Z.get(x)??[],B,_);if(S.length>=t)j=!0,Z.set(x,S);else S.push(B),Z.set(x,S)}else{let x=Y.conversation.conversationId,S=K($.get(x)??[],B,T);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=Z.get(x);if(k&&k.length===0)Z.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,G=V.get(W),N;if(!G||B-G.windowStart>w)N={count:1,windowStart:B};else N={count:G.count+1,windowStart:G.windowStart};if(V.set(W,N),N.count>=JJ)process.stderr.write(`[feishu:audit] flood from=${W} conv=${Y.conversation.conversationType}:${Y.conversation.conversationId} — ${N.count} rate-limit denies in ${Math.round((B-N.windowStart)/1000)}s window
|
|
5
16
|
`);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
17
|
`)}catch(x){let S=x instanceof Error?x.message:String(x);process.stderr.write(`[feishu:bridge] rate-limit notice send failed: ${S}
|
|
7
|
-
`)}};return
|
|
8
|
-
`)}catch(
|
|
9
|
-
`)}})()}),async(
|
|
10
|
-
`)}catch(U){let
|
|
11
|
-
`)}})()},Q),
|
|
18
|
+
`)}};return z.__getState=()=>({dmKeyCount:Z.size,groupKeyCount:$.size,floodKeyCount:V.size}),z}var b=50,C=1e4;function $J(J,Q,Z){if(typeof process.send==="function")return qJ(J,Q,Z);return GJ}var YJ="⏳ 处理中…",XJ="[处理超时,任务可能仍在后台运行]";function qJ(J,Q,Z){if(typeof process.send!=="function")throw Error("createIPCEventHandler: parent process.send unavailable (not forked)");let $=new Map;return process.on("message",(V)=>{if(!BJ(V))return;let K=$.get(V.eventKey);if(!K)return;$.delete(V.eventKey);let{text:q,eventKey:X}=V,{event:U,placeholderMessageId:H}=K;(async()=>{try{let{messageId:z}=await J.send({target:U.conversation,text:q,replyToMessageId:U.messageId,correlation:{taskId:X}}),Y=H?` (after placeholder=${H})`:"";process.stderr.write(`[feishu:bridge] reply sent (messageId=${z})${Y} for ${X}
|
|
19
|
+
`)}catch(z){let Y=z instanceof Error?z.message:String(z);process.stderr.write(`[feishu:bridge] reply delivery failed: ${Y}
|
|
20
|
+
`)}})()}),async(V)=>{if($.set(V.idempotencyKey,{event:V}),setTimeout(()=>{let q=$.get(V.idempotencyKey);if(!q)return;$.delete(V.idempotencyKey);let{placeholderMessageId:X}=q;(async()=>{try{await J.send({target:V.conversation,text:XJ,replyToMessageId:V.messageId,correlation:{taskId:V.idempotencyKey}});let U=X?` (after placeholder=${X})`:"";process.stderr.write(`[feishu:bridge] timeout-notify sent${U} for ${V.idempotencyKey} after ${Q}ms
|
|
21
|
+
`)}catch(U){let H=U instanceof Error?U.message:String(U);process.stderr.write(`[feishu:bridge] timeout-notify send failed: ${H}
|
|
22
|
+
`)}})()},Q),Z)try{let{messageId:q}=await J.send({target:V.conversation,text:YJ,replyToMessageId:V.messageId,correlation:{taskId:V.idempotencyKey}}),X=$.get(V.idempotencyKey);if(X)X.placeholderMessageId=q,process.stderr.write(`[feishu:bridge] placeholder sent (messageId=${q}) for ${V.idempotencyKey}
|
|
12
23
|
`)}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
|
|
14
|
-
`)}function KJ(J){let Q={};for(let
|
|
15
|
-
`),process.exit(2);try{await
|
|
16
|
-
`)}catch(Q){let
|
|
24
|
+
`)}let K={type:"event",event:V};process.send(K)}}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)}
|
|
25
|
+
`)}function KJ(J){let Q={};for(let Z=0;Z<J.length;Z++){let $=J[Z],V=J[Z+1];if($==="--channel-dir"&&V)Q.channelDir=V,Z++;else if($==="--node-alias"&&V)Q.nodeAlias=V,Z++}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>
|
|
26
|
+
`),process.exit(2);try{await h({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"}
|
|
27
|
+
`)}catch(Q){let Z=Q instanceof Error?Q.stack??Q.message:String(Q);process.stderr.write(`[feishu:worker] startup failed: ${Z}
|
|
17
28
|
`),process.exit(1)}}UJ();
|
package/dist/src/node-server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
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());
|
|
2
|
+
const a0_0x593008=a0_0x17d4;(function(_0x2bf6de,_0x283b76){const _0x262fd7=a0_0x17d4,_0x1c66c3=_0x2bf6de();while(!![]){try{const _0x17c6bf=parseInt(_0x262fd7(0x11a))/0x1+-parseInt(_0x262fd7(0x104))/0x2*(-parseInt(_0x262fd7(0x125))/0x3)+-parseInt(_0x262fd7(0x141))/0x4*(parseInt(_0x262fd7(0x137))/0x5)+-parseInt(_0x262fd7(0x14e))/0x6*(-parseInt(_0x262fd7(0x184))/0x7)+parseInt(_0x262fd7(0x10d))/0x8+parseInt(_0x262fd7(0x17f))/0x9*(parseInt(_0x262fd7(0x15b))/0xa)+-parseInt(_0x262fd7(0x11b))/0xb;if(_0x17c6bf===_0x283b76)break;else _0x1c66c3['push'](_0x1c66c3['shift']());}catch(_0x5289d4){_0x1c66c3['push'](_0x1c66c3['shift']());}}}(a0_0x159b,0x504a1));import{readFileSync as a0_0x168f43,existsSync as a0_0x548334}from'fs';function a0_0x159b(){const _0x1943f9=['notifications/claude/channel','stderr','tools/call','content','commhub-channel','20uNvfLl','low','min','type','offline','alias','Progress\x200-100','completed','send_message','init\x20failed:\x20','re-registered\x20as\x20\x22','re-register\x20failed:\x20','\x20CWD=','873462KkSOJS','0.3.0','CommHub\x20init\x20failed:\x20','/mcp','commhub_send_task','Message\x20content','trim','tmux\x20display-message\x20-p\x20\x27#S\x27','working','idle','application/json,\x20text/event-stream','commhub_get_all_status','Current\x20task\x20description','6518030ykEBRe','http://127.0.0.1:9200','result','Priority\x20(default:\x20normal)','\x20ALIAS=','new_message','failed','/events/','pop','session\x20disconnected','status','claude-code','slice','setRequestHandler','2.0','string','normal','messages','text','decode','now','Target\x20session\x20alias','←\x20message\x20from\x20','ack_inbox','toTimeString','catch','commhub_report_status','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','message','end','registered\x20as\x20\x22','\x20PROJECT_ENV=','SSE\x20stream\x20ended,\x20reconnecting...','...\x20TMUX=','\x20priority=','starting\x20SSE\x20listener...','9lWZbfy','read','startsWith','message_id','parse\x20error:\x20','7ZMHfbe','cwd','Bearer\x20','utf-8','hub','none','params','shutting\x20down,\x20reporting\x20offline...','send_task','notification','Session\x20alias:\x20','parse','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','SIGINT','Authorization','no\x20response','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','connected','unattributed-','token','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','MCP\x20stdio\x20connected','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','commhub_send_message','config.json','application/json','blocked','number','report_status','replace','\x20/\x20hostname=','13274THVTlW','Task\x20content',']\x20[commhub]\x20','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','→\x20injected\x20task\x20','error','write',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','2974392IOWlLu','\x22\x20after\x20SSE\x20reconnect','find','.claude/channels/commhub','from_session','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>',':\x20inbox_count=','POST','priority','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','SSE\x20connected\x20as\x20\x22','\x22\x20(','unknown\x20tool','308433xWoHhV','7309137yPXTTD','get_all_status','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','\x20RESUME_ID=','.env','connecting\x20to\x20','SSE\x20error:\x20','split','commhub_reply','cancelled','30nJILYq','indexOf','from','statusText','inbox_count','connect','heartbeat\x20failed:\x20','broadcast','get','.anet','data:\x20','SIGTERM','stringify','body','Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','length','commhub','pid','550650MZiTSp','delete','getReader','object','join'];a0_0x159b=function(){return _0x1943f9;};return a0_0x159b();}function a0_0x17d4(_0x42c46f,_0x59e902){_0x42c46f=_0x42c46f-0xf1;const _0x159b2b=a0_0x159b();let _0x17d4bf=_0x159b2b[_0x42c46f];return _0x17d4bf;}import{randomUUID as a0_0x4fae02}from'crypto';import{join as a0_0x4c5ab3}from'path';import{hostname as a0_0x4da1b3}from'os';import{execSync as a0_0x5917ed}from'child_process';import{Server as a0_0x3b0b66}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x2ec590}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x452fdb,CallToolRequestSchema as a0_0x56d983}from'@modelcontextprotocol/sdk/types.js';function I(_0x136382){const _0x135572=a0_0x17d4;if(!a0_0x548334(_0x136382))return;for(let _0x540ca4 of a0_0x168f43(_0x136382,_0x135572(0x187))['split']('\x0a')){let _0x343e4d=_0x540ca4['trim']();if(!_0x343e4d||_0x343e4d[_0x135572(0x181)]('#'))continue;let _0x5391d6=_0x343e4d[_0x135572(0x126)]('=');if(_0x5391d6<0x0)continue;let _0x87e23e=_0x343e4d[_0x135572(0x167)](0x0,_0x5391d6)[_0x135572(0x154)](),_0x12e826=_0x343e4d['slice'](_0x5391d6+0x1)['trim']()[_0x135572(0x102)](/^["']|["']$/g,'');if(!process.env[_0x87e23e])process.env[_0x87e23e]=_0x12e826;}}var L=process.env.HOME||'~',U=a0_0x4c5ab3(L,a0_0x593008(0x110));I(a0_0x4c5ab3(U,'.env'));var v=process[a0_0x593008(0x185)]()[a0_0x593008(0x102)](/\//g,'-');I(a0_0x4c5ab3(U,v,a0_0x593008(0x11f)));function d(){const _0x54e075=a0_0x593008;try{return a0_0x5917ed(_0x54e075(0x155),{'encoding':'utf-8','timeout':0x7d0})['trim']();}catch{return'';}}function m(){const _0xf2ae7c=a0_0x593008;try{let _0x395775=a0_0x4c5ab3(L,_0xf2ae7c(0x12e),_0xf2ae7c(0xfd));if(a0_0x548334(_0x395775))return JSON[_0xf2ae7c(0x18f)](a0_0x168f43(_0x395775,'utf-8'));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x593008(0x188)]||a0_0x593008(0x15c),f=process.env.COMMHUB_TMUX||d();function r(){const _0x4f7500=a0_0x593008;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0x4f7500(0x154)]())return process.env.COMMHUB_ALIAS['trim']();return process['stderr'][_0x4f7500(0x10b)](_0x4f7500(0x107)+(_0x4f7500(0xfb)+(f||'(none)')+_0x4f7500(0x103)+a0_0x4da1b3()+_0x4f7500(0xf1))),_0x4f7500(0xf7)+process[_0x4f7500(0x136)];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x4fae02(),F=process.env.COMMHUB_TOKEN||u[a0_0x593008(0xf8)]||'';function W(_0x100191){const _0x393160=a0_0x593008;let _0x19517c=new Date()[_0x393160(0x173)]()['slice'](0x0,0x8);process[_0x393160(0x13d)][_0x393160(0x10b)]('['+_0x19517c+_0x393160(0x106)+_0x100191+'\x0a');}function N(_0x29b0fd){return new Promise(_0x1758b4=>setTimeout(_0x1758b4,_0x29b0fd));}W('ENV:\x20URL='+j+a0_0x593008(0x15f)+G+a0_0x593008(0x11e)+K[a0_0x593008(0x167)](0x0,0x8)+a0_0x593008(0x17c)+(f||a0_0x593008(0x189))+a0_0x593008(0x14d)+process[a0_0x593008(0x185)]()+a0_0x593008(0x17a)+v);var D=new Map(),x=new a0_0x3b0b66({'name':a0_0x593008(0x140),'version':a0_0x593008(0x14f)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x593008(0x112),'These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.',a0_0x593008(0xf5),a0_0x593008(0x18e)+G][a0_0x593008(0x13b)]('\x0a')});x[a0_0x593008(0x168)](a0_0x452fdb,async()=>({'tools':[{'name':a0_0x593008(0x123),'description':'Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','inputSchema':{'type':a0_0x593008(0x13a),'properties':{'task_id':{'type':a0_0x593008(0x16a),'description':a0_0x593008(0x11d)},'text':{'type':'string','description':'Reply\x20text\x20/\x20result\x20summary'},'status':{'type':a0_0x593008(0x16a),'enum':[a0_0x593008(0x148),a0_0x593008(0x161),'cancelled',a0_0x593008(0xff),a0_0x593008(0x10a),'in_progress'],'description':a0_0x593008(0x116)}},'required':['text']}},{'name':a0_0x593008(0x175),'description':a0_0x593008(0x133),'inputSchema':{'type':a0_0x593008(0x13a),'properties':{'status':{'type':a0_0x593008(0x16a),'enum':['working','idle',a0_0x593008(0xff),a0_0x593008(0x10a)]},'task':{'type':a0_0x593008(0x16a),'description':a0_0x593008(0x15a)},'progress':{'type':a0_0x593008(0x100),'description':a0_0x593008(0x147)}},'required':[a0_0x593008(0x165)]}},{'name':'commhub_send_task','description':a0_0x593008(0x108),'inputSchema':{'type':a0_0x593008(0x13a),'properties':{'alias':{'type':a0_0x593008(0x16a),'description':a0_0x593008(0x170)},'task':{'type':'string','description':a0_0x593008(0x105)},'priority':{'type':'string','enum':['high',a0_0x593008(0x16b),a0_0x593008(0x142)],'description':a0_0x593008(0x15e)}},'required':[a0_0x593008(0x146),'task']}},{'name':a0_0x593008(0xfc),'description':a0_0x593008(0xf9),'inputSchema':{'type':a0_0x593008(0x13a),'properties':{'alias':{'type':'string','description':a0_0x593008(0x170)},'message':{'type':a0_0x593008(0x16a),'description':a0_0x593008(0x153)}},'required':[a0_0x593008(0x146),a0_0x593008(0x177)]}},{'name':a0_0x593008(0x159),'description':'Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','inputSchema':{'type':a0_0x593008(0x13a),'properties':{}}}]}));async function Y(_0x1264d3,_0x24398d){const _0x138a4c=a0_0x593008;let _0x485932=await fetch(j+_0x138a4c(0x151),{'method':_0x138a4c(0x114),'headers':{'Content-Type':_0x138a4c(0xfe),'Accept':_0x138a4c(0x158),...F?{'Authorization':_0x138a4c(0x186)+F}:{}},'body':JSON[_0x138a4c(0x131)]({'jsonrpc':_0x138a4c(0x169),'id':0x1,'method':'initialize','params':{'protocolVersion':'2025-03-26','capabilities':{},'clientInfo':{'name':_0x138a4c(0x140),'version':_0x138a4c(0x14f)}}})});if(!_0x485932['ok']){let _0x5c3d35=await _0x485932[_0x138a4c(0x16d)]();return W(_0x138a4c(0x150)+_0x485932[_0x138a4c(0x165)]+'\x20'+_0x5c3d35[_0x138a4c(0x167)](0x0,0x64)),{'ok':!0x1,'error':_0x138a4c(0x14a)+_0x485932['status']};}await _0x485932[_0x138a4c(0x16d)]();let _0x54b611=(await(await fetch(j+_0x138a4c(0x151),{'method':_0x138a4c(0x114),'headers':{'Content-Type':_0x138a4c(0xfe),'Accept':_0x138a4c(0x158),...F?{'Authorization':_0x138a4c(0x186)+F}:{}},'body':JSON['stringify']({'jsonrpc':_0x138a4c(0x169),'id':0x2,'method':_0x138a4c(0x13e),'params':{'name':_0x1264d3,'arguments':_0x24398d}})}))[_0x138a4c(0x16d)]())['split']('\x0a')[_0x138a4c(0x10f)](_0x6d1853=>_0x6d1853[_0x138a4c(0x181)](_0x138a4c(0x12f)));if(_0x54b611){let _0x4c0805=JSON[_0x138a4c(0x18f)](_0x54b611[_0x138a4c(0x167)](0x6));return _0x4c0805?.[_0x138a4c(0x15d)]?.[_0x138a4c(0x13f)]?.[0x0]?.[_0x138a4c(0x16d)]?JSON[_0x138a4c(0x18f)](_0x4c0805['result'][_0x138a4c(0x13f)][0x0][_0x138a4c(0x16d)]):_0x4c0805;}return{'ok':!0x1,'error':_0x138a4c(0xf4)};}x['setRequestHandler'](a0_0x56d983,async _0xcc6134=>{const _0xa0d1ae=a0_0x593008;let {name:_0x4a4f67,arguments:_0x475d75}=_0xcc6134[_0xa0d1ae(0x18a)];if(_0x4a4f67==='commhub_reply'){let {task_id:_0x236a9b,text:_0xc13283,status:_0x43da6a}=_0x475d75;if(_0x43da6a===_0xa0d1ae(0x148)||_0x43da6a===_0xa0d1ae(0x161)||_0x43da6a===_0xa0d1ae(0x124)){let _0xbb1111=_0x43da6a==='completed'?'replied':_0x43da6a,_0xb2d48a=_0x236a9b?D[_0xa0d1ae(0x12d)](_0x236a9b)||_0xa0d1ae(0x188):_0xa0d1ae(0x188),_0x49357f=await Y('send_reply',{'alias':_0xb2d48a,'text':_0xc13283,'in_reply_to':_0x236a9b||void 0x0,'status':_0xbb1111,'from_session':G});if(_0x236a9b)D[_0xa0d1ae(0x138)](_0x236a9b);return{'content':[{'type':_0xa0d1ae(0x16d),'text':JSON[_0xa0d1ae(0x131)](_0x49357f)}]};}let _0xafcaee=await Y(_0xa0d1ae(0x101),{'resume_id':K,'alias':G,'status':_0x43da6a===_0xa0d1ae(0xff)?_0xa0d1ae(0xff):_0x43da6a===_0xa0d1ae(0x10a)?'error':_0xa0d1ae(0x156),'task':_0xc13283[_0xa0d1ae(0x167)](0x0,0xc8),'output':_0xc13283});return{'content':[{'type':_0xa0d1ae(0x16d),'text':JSON[_0xa0d1ae(0x131)](_0xafcaee)}]};}if(_0x4a4f67===_0xa0d1ae(0x175)){let {status:_0x1b21d9,task:_0x4b3f78,progress:_0x101418}=_0x475d75,_0x3f3f4f=await Y('report_status',{'resume_id':K,'alias':G,'status':_0x1b21d9,'task':_0x4b3f78,'progress':_0x101418});return{'content':[{'type':_0xa0d1ae(0x16d),'text':JSON[_0xa0d1ae(0x131)](_0x3f3f4f)}]};}if(_0x4a4f67===_0xa0d1ae(0x152)){let {alias:_0x396212,task:_0x3a74a8,priority:_0x80099d}=_0x475d75,_0x4c4f54=await Y(_0xa0d1ae(0x18c),{'alias':_0x396212,'task':_0x3a74a8,'priority':_0x80099d||'normal','from_session':G});return{'content':[{'type':_0xa0d1ae(0x16d),'text':JSON[_0xa0d1ae(0x131)](_0x4c4f54)}]};}if(_0x4a4f67==='commhub_send_message'){let {alias:_0x201e84,message:_0x401531}=_0x475d75,_0x2733ad=await Y(_0xa0d1ae(0x149),{'alias':_0x201e84,'message':_0x401531,'from_session':G});return{'content':[{'type':'text','text':JSON[_0xa0d1ae(0x131)](_0x2733ad)}]};}if(_0x4a4f67==='commhub_get_all_status'){let _0x56562a=await Y(_0xa0d1ae(0x11c),{});return{'content':[{'type':_0xa0d1ae(0x16d),'text':JSON[_0xa0d1ae(0x131)](_0x56562a)}]};}return{'content':[{'type':'text','text':JSON[_0xa0d1ae(0x131)]({'error':_0xa0d1ae(0x119)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x5e5a4a=a0_0x593008;try{await Y(_0x5e5a4a(0x101),{'resume_id':K,'alias':G,'status':_0x5e5a4a(0x157),'server':a0_0x4da1b3(),'hostname':a0_0x4da1b3(),'agent':_0x5e5a4a(0x166),'project_dir':process[_0x5e5a4a(0x185)](),'tmux_name':f||void 0x0}),W(_0x5e5a4a(0x14b)+G+_0x5e5a4a(0x10e));}catch(_0x291c84){W(_0x5e5a4a(0x14c)+_0x291c84);}}async function o(){const _0x233c7c=a0_0x593008;let _0x527ad7=j+_0x233c7c(0x162)+encodeURIComponent(G),_0x2820af={};if(F)_0x2820af[_0x233c7c(0xf3)]='Bearer\x20'+F;W(_0x233c7c(0x120)+_0x527ad7);let _0xff61b1=O,_0x3a444a=!0x0,_0x240922=null;while(!0x0){try{let _0x25a6cf=await fetch(_0x527ad7,{'headers':_0x2820af});if(!_0x25a6cf['ok']){if(W(_0x233c7c(0x121)+_0x25a6cf[_0x233c7c(0x165)]+'\x20'+_0x25a6cf[_0x233c7c(0x128)]),_0x240922=_0x240922??Date['now'](),Date[_0x233c7c(0x16f)]()-_0x240922>T){W(_0x233c7c(0x176)+j+_0x233c7c(0x10c));return;}await N(_0xff61b1),_0xff61b1=Math[_0x233c7c(0x143)](_0xff61b1*0x2,R);continue;}let _0xe233e1=_0x25a6cf[_0x233c7c(0x132)][_0x233c7c(0x139)](),_0x48ae5c=new TextDecoder(),_0x5e9d61='';_0xff61b1=O;while(!0x0){let {done:_0x51bba1,value:_0x5a0c2d}=await _0xe233e1[_0x233c7c(0x180)]();if(_0x51bba1)break;_0x5e9d61+=_0x48ae5c[_0x233c7c(0x16e)](_0x5a0c2d,{'stream':!0x0});let _0x1c7f1d=_0x5e9d61['split']('\x0a\x0a');_0x5e9d61=_0x1c7f1d[_0x233c7c(0x163)]()||'';for(let _0x5b050a of _0x1c7f1d){let _0x21b0db=_0x5b050a[_0x233c7c(0x122)]('\x0a')[_0x233c7c(0x10f)](_0x514331=>_0x514331[_0x233c7c(0x181)]('data:\x20'));if(!_0x21b0db)continue;try{let _0x3d38fc=JSON[_0x233c7c(0x18f)](_0x21b0db[_0x233c7c(0x167)](0x6));if(await a(_0x3d38fc),_0x3d38fc[_0x233c7c(0x144)]===_0x233c7c(0xf6)){if(_0x240922=null,!_0x3a444a)await l();_0x3a444a=!0x1;}}catch(_0x43747c){W(_0x233c7c(0x183)+_0x43747c);}}}W(_0x233c7c(0x17b));}catch(_0xdf27fc){W('SSE\x20connection\x20error:\x20'+_0xdf27fc);}if(_0x240922=_0x240922??Date[_0x233c7c(0x16f)](),Date[_0x233c7c(0x16f)]()-_0x240922>T){W(_0x233c7c(0x176)+j+')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。');return;}await N(_0xff61b1),_0xff61b1=Math[_0x233c7c(0x143)](_0xff61b1*0x2,R);}}async function a(_0x12e96e){const _0x1a3e01=a0_0x593008;if(_0x12e96e['type']===_0x1a3e01(0xf6)){W(_0x1a3e01(0x117)+G+'\x22');return;}if(_0x12e96e[_0x1a3e01(0x144)]===_0x1a3e01(0x160)){if(W(_0x1a3e01(0x171)+_0x12e96e[_0x1a3e01(0x127)]+':\x20'+_0x12e96e[_0x1a3e01(0x177)][_0x1a3e01(0x167)](0x0,0x3c)),await x[_0x1a3e01(0x18d)]({'method':_0x1a3e01(0x13c),'params':{'content':_0x12e96e[_0x1a3e01(0x177)],'meta':{'sender':_0x12e96e[_0x1a3e01(0x127)]||_0x1a3e01(0x188),'sender_id':_0x1a3e01(0x135),'user':_0x12e96e[_0x1a3e01(0x127)]||'hub','priority':_0x1a3e01(0x16b)}}}),_0x12e96e[_0x1a3e01(0x182)])await Y(_0x1a3e01(0x172),{'alias':G,'message_id':_0x12e96e['message_id']});return;}if(_0x12e96e[_0x1a3e01(0x144)]==='new_task'||_0x12e96e[_0x1a3e01(0x144)]===_0x1a3e01(0x12c)){W('←\x20'+_0x12e96e[_0x1a3e01(0x144)]+_0x1a3e01(0x113)+_0x12e96e[_0x1a3e01(0x129)]+_0x1a3e01(0x17d)+(_0x12e96e[_0x1a3e01(0x115)]||_0x1a3e01(0x16b)));let _0xd51adc=await Y('get_inbox',{'alias':G,'limit':0x5});if(_0xd51adc?.['ok']&&_0xd51adc['messages']?.[_0x1a3e01(0x134)]>0x0)for(let _0x58de4a of _0xd51adc[_0x1a3e01(0x16c)]){let _0xc4c728={'sender':_0x58de4a[_0x1a3e01(0x111)]||'hub','sender_id':_0x1a3e01(0x135),'user':_0x58de4a['from_session']||_0x1a3e01(0x188),'task_id':_0x58de4a['id'],'priority':_0x58de4a[_0x1a3e01(0x115)]||_0x1a3e01(0x16b)};D['set'](_0x58de4a['id'],_0x58de4a[_0x1a3e01(0x111)]||_0x1a3e01(0x188)),await x[_0x1a3e01(0x18d)]({'method':_0x1a3e01(0x13c),'params':{'content':_0x58de4a['content'],'meta':_0xc4c728}}),W(_0x1a3e01(0x109)+_0x58de4a['id'][_0x1a3e01(0x167)](0x0,0x8)+'\x20from\x20'+_0x58de4a[_0x1a3e01(0x111)]+':\x20'+_0x58de4a[_0x1a3e01(0x13f)][_0x1a3e01(0x167)](0x0,0x3c)),await Y(_0x1a3e01(0x172),{'alias':G,'message_id':_0x58de4a['id']});}}}async function n(){const _0x46f08=a0_0x593008;let _0x27cc08=new a0_0x2ec590();await x[_0x46f08(0x12a)](_0x27cc08),W(_0x46f08(0xfa)),W(_0x46f08(0x17e)),o()[_0x46f08(0x174)](_0x45070d=>W('SSE\x20fatal:\x20'+_0x45070d)),Y('report_status',{'resume_id':K,'alias':G,'status':_0x46f08(0x157),'server':a0_0x4da1b3(),'hostname':a0_0x4da1b3(),'agent':_0x46f08(0x166),'project_dir':process['cwd'](),'tmux_name':f||void 0x0})['then'](()=>W(_0x46f08(0x179)+G+_0x46f08(0x118)+K[_0x46f08(0x167)](0x0,0x8)+')'))['catch'](_0x1baf64=>W('warning:\x20could\x20not\x20register:\x20'+_0x1baf64)),setInterval(()=>{const _0x1aa89d=_0x46f08;Y('report_status',{'resume_id':K,'alias':G,'status':'idle','server':a0_0x4da1b3(),'hostname':a0_0x4da1b3(),'agent':_0x1aa89d(0x166),'project_dir':process[_0x1aa89d(0x185)](),'tmux_name':f||void 0x0})['catch'](_0x5f3343=>W(_0x1aa89d(0x12b)+_0x5f3343));},0x2bf20),W('ready\x20—\x20waiting\x20for\x20events');}n()[a0_0x593008(0x174)](_0x505027=>{W('fatal:\x20'+_0x505027),process['exit'](0x1);});async function b(){const _0x497889=a0_0x593008;W(_0x497889(0x18b)),await Y('report_status',{'resume_id':K,'alias':G,'status':_0x497889(0x145),'task':_0x497889(0x164)})[_0x497889(0x174)](()=>{}),process['exit'](0x0);}process['stdin']['on'](a0_0x593008(0x178),()=>b()),process['on'](a0_0x593008(0x130),()=>b()),process['on'](a0_0x593008(0xf2),()=>b());
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sleep2agi/agent-network",
|
|
3
|
-
"version": "2.3.0-preview.
|
|
3
|
+
"version": "2.3.0-preview.5",
|
|
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",
|