@sleep2agi/agent-network 2.3.0-preview.4 → 2.3.0-preview.6
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 +25 -13
- package/dist/src/node-server.js +1 -1
- package/package.json +1 -1
package/dist/src/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function a0_0x4787(){const _0xc49f0=['connect','normal','autoConnect','getReader','resumeId','emit','toString','sdk','disconnected','result','get_all_status','token','5087173NCbOmp','inbox\x20error:\x20','report_status','11665LrFOiw','connectSSE','message','log','AbortError','SSE\x20reconnecting\x20in\x20','from_session','application/json,\x20text/event-stream','messages','now','slice','min','content','signal','connected','cwd','decode','6982710isOHgq','url','new_task','getAllStatus','text','3606sAtYsO','type','running','catch','toTimeString','27873XqlSYg','alias','replace','text/event-stream','abort','call','broadcast','send_task','sdk-','status','completed','3JfxsGH','POST','new_message','1544pwkTLR','tools/call','SSE\x20failed:\x20','send_reply','idle','reply','heartbeatTimer','s...','heartbeatInterval','application/json','task','Bearer\x20','693624aRuhkw','offline','startsWith','name','get_inbox','server','reconnectDelay','267133AQpkhs','ack_inbox','parse','body','1519210AfjkqA','processInbox','SSE\x20connected','sseAbort','/mcp','2.0','match','agent','/events/','sleep'];a0_0x4787=function(){return _0xc49f0;};return a0_0x4787();}const a0_0x326ef2=a0_0x1d92;(function(_0x2d9f93,_0x55e142){const _0x4352d2=a0_0x1d92,_0x46163d=_0x2d9f93();while(!![]){try{const _0x9c32c4=-parseInt(_0x4352d2(0x1ce))/0x1+parseInt(_0x4352d2(0x1d2))/0x2+-parseInt(_0x4352d2(0x1b8))/0x3*(parseInt(_0x4352d2(0x1c7))/0x4)+-parseInt(_0x4352d2(0x1eb))/0x5*(-parseInt(_0x4352d2(0x1a8))/0x6)+-parseInt(_0x4352d2(0x1e8))/0x7+parseInt(_0x4352d2(0x1bb))/0x8*(parseInt(_0x4352d2(0x1ad))/0x9)+-parseInt(_0x4352d2(0x1a3))/0xa;if(_0x9c32c4===_0x55e142)break;else _0x46163d['push'](_0x46163d['shift']());}catch(_0x87a9d4){_0x46163d['push'](_0x46163d['shift']());}}}(a0_0x4787,0xda3d6));import{EventEmitter as a0_0x9a4b33}from'events';function a0_0x1d92(_0x589de0,_0x7570f1){_0x589de0=_0x589de0-0x195;const _0x4787e6=a0_0x4787();let _0x1d926f=_0x4787e6[_0x589de0];return _0x1d926f;}import{hostname as a0_0x3440fe}from'os';class T extends a0_0x9a4b33{[a0_0x326ef2(0x1a4)];['alias'];[a0_0x326ef2(0x1e7)];['agent'];[a0_0x326ef2(0x1e0)];['heartbeatInterval'];[a0_0x326ef2(0x1cd)];[a0_0x326ef2(0x1c1)];[a0_0x326ef2(0x1d5)];[a0_0x326ef2(0x1aa)]=!0x1;constructor(_0x27d2ee){const _0x2b74ed=a0_0x326ef2;super();if(this[_0x2b74ed(0x1a4)]=_0x27d2ee[_0x2b74ed(0x1a4)][_0x2b74ed(0x1af)](/\/$/,''),this[_0x2b74ed(0x1ae)]=_0x27d2ee[_0x2b74ed(0x1ae)],this['token']=_0x27d2ee[_0x2b74ed(0x1e7)],this[_0x2b74ed(0x1d9)]=_0x27d2ee[_0x2b74ed(0x1d9)]||_0x2b74ed(0x1e3),this[_0x2b74ed(0x1e0)]=_0x2b74ed(0x1b5)+_0x27d2ee[_0x2b74ed(0x1ae)]+'-'+Date[_0x2b74ed(0x19b)]()[_0x2b74ed(0x1e2)](0x24),this[_0x2b74ed(0x1c3)]=_0x27d2ee[_0x2b74ed(0x1c3)]??0x2bf20,this[_0x2b74ed(0x1cd)]=_0x27d2ee['reconnectDelay']??0xbb8,_0x27d2ee[_0x2b74ed(0x1de)]!==!0x1)this[_0x2b74ed(0x1dc)]();}['log'](_0x553859){const _0x5a30db=a0_0x326ef2;console['log']('['+new Date()[_0x5a30db(0x1ac)]()[_0x5a30db(0x19c)](0x0,0x8)+']\x20[commhub:'+this['alias']+']\x20'+_0x553859);}async[a0_0x326ef2(0x1b2)](_0xd1a490,_0x48238b){const _0x8c93f1=a0_0x326ef2;let _0x5074b0={'Content-Type':_0x8c93f1(0x1c4),'Accept':_0x8c93f1(0x199)};if(this[_0x8c93f1(0x1e7)])_0x5074b0['Authorization']=_0x8c93f1(0x1c6)+this[_0x8c93f1(0x1e7)];let _0x504a96=await(await fetch(this[_0x8c93f1(0x1a4)]+_0x8c93f1(0x1d6),{'method':_0x8c93f1(0x1b9),'headers':_0x5074b0,'body':JSON['stringify']({'jsonrpc':_0x8c93f1(0x1d7),'id':Date[_0x8c93f1(0x19b)](),'method':_0x8c93f1(0x1bc),'params':{'name':_0xd1a490,'arguments':_0x48238b}})}))[_0x8c93f1(0x1a7)](),_0x150935=_0x504a96[_0x8c93f1(0x1d8)](/data: (.+)/),_0x4be016=_0x150935?JSON[_0x8c93f1(0x1d0)](_0x150935[0x1]):JSON['parse'](_0x504a96),_0x28a021=_0x4be016?.[_0x8c93f1(0x1e5)]?.['content']?.[0x0]?.['text'];return _0x28a021?JSON[_0x8c93f1(0x1d0)](_0x28a021):_0x4be016;}async[a0_0x326ef2(0x1dc)](){const _0x2cb871=a0_0x326ef2;if(this[_0x2cb871(0x1aa)])return;this[_0x2cb871(0x1aa)]=!0x0,await this['status'](_0x2cb871(0x1bf)),this[_0x2cb871(0x195)]('registered'),this[_0x2cb871(0x1c1)]=setInterval(()=>{const _0x430408=_0x2cb871;this[_0x430408(0x1b6)](_0x430408(0x1bf))[_0x430408(0x1ab)](_0x321f90=>this[_0x430408(0x195)]('heartbeat\x20failed:\x20'+_0x321f90[_0x430408(0x1ed)]));},this[_0x2cb871(0x1c3)]),this[_0x2cb871(0x1ec)]();}async['disconnect'](){const _0x4338ba=a0_0x326ef2;if(this['running']=!0x1,this[_0x4338ba(0x1d5)]?.[_0x4338ba(0x1b1)](),this[_0x4338ba(0x1c1)])clearInterval(this[_0x4338ba(0x1c1)]);await this[_0x4338ba(0x1b6)](_0x4338ba(0x1c8))[_0x4338ba(0x1ab)](()=>{}),this[_0x4338ba(0x195)]('disconnected');}async['send'](_0x5b1ecc,_0x641df2,_0x303ada=a0_0x326ef2(0x1dd)){const _0x393393=a0_0x326ef2;return this[_0x393393(0x1b2)](_0x393393(0x1b4),{'alias':_0x5b1ecc,'task':_0x641df2,'priority':_0x303ada,'from_session':this[_0x393393(0x1ae)]});}async[a0_0x326ef2(0x1ed)](_0x3fea6c,_0x1636f5){const _0x10430c=a0_0x326ef2;return this[_0x10430c(0x1b2)]('send_message',{'alias':_0x3fea6c,'message':_0x1636f5,'from_session':this[_0x10430c(0x1ae)]});}async[a0_0x326ef2(0x1c0)](_0x4ba4b3,_0x3a3281,_0x467043=a0_0x326ef2(0x1b7)){const _0x3706a8=a0_0x326ef2;return this[_0x3706a8(0x1b2)](_0x3706a8(0x1be),{'in_reply_to':_0x4ba4b3,'text':_0x3a3281,'status':_0x467043});}async['status'](_0x1814b2,_0x14f949){const _0x450020=a0_0x326ef2;return this[_0x450020(0x1b2)](_0x450020(0x1ea),{'resume_id':this[_0x450020(0x1e0)],'alias':this['alias'],'status':_0x1814b2,'server':a0_0x3440fe(),'hostname':a0_0x3440fe(),'agent':this['agent'],'project_dir':process[_0x450020(0x1a1)](),..._0x14f949});}async[a0_0x326ef2(0x1a6)](){const _0x254179=a0_0x326ef2;return this['call'](_0x254179(0x1e6),{});}async[a0_0x326ef2(0x1b3)](_0x3010a6,_0x1a36d3){const _0x214d2c=a0_0x326ef2;return this[_0x214d2c(0x1b2)](_0x214d2c(0x1b3),{'message':_0x3010a6,'filter_server':_0x1a36d3?.[_0x214d2c(0x1cc)],'filter_status':_0x1a36d3?.[_0x214d2c(0x1b6)]});}async[a0_0x326ef2(0x1ec)](){const _0x1a0fde=a0_0x326ef2;let _0x5b4d94=encodeURIComponent(this['alias']),_0x1e94a5=this[_0x1a0fde(0x1a4)]+_0x1a0fde(0x1da)+_0x5b4d94,_0x459bbb=this['reconnectDelay'];while(this[_0x1a0fde(0x1aa)]){try{this['sseAbort']=new AbortController();let _0x37d4c5={'Accept':_0x1a0fde(0x1b0)};if(this[_0x1a0fde(0x1e7)])_0x37d4c5['Authorization']=_0x1a0fde(0x1c6)+this['token'];let _0x535b5e=await fetch(_0x1e94a5,{'headers':_0x37d4c5,'signal':this[_0x1a0fde(0x1d5)][_0x1a0fde(0x19f)]});if(!_0x535b5e['ok']||!_0x535b5e[_0x1a0fde(0x1d1)]){this[_0x1a0fde(0x195)](_0x1a0fde(0x1bd)+_0x535b5e[_0x1a0fde(0x1b6)]),await this['sleep'](_0x459bbb),_0x459bbb=Math['min'](_0x459bbb*1.5,0xea60);continue;}_0x459bbb=this[_0x1a0fde(0x1cd)];let _0x51d767=_0x535b5e[_0x1a0fde(0x1d1)][_0x1a0fde(0x1df)](),_0x3c31e1=new TextDecoder(),_0x442bf4='';while(this[_0x1a0fde(0x1aa)]){let {done:_0x4cce5c,value:_0x31f076}=await _0x51d767['read']();if(_0x4cce5c)break;_0x442bf4+=_0x3c31e1[_0x1a0fde(0x1a2)](_0x31f076,{'stream':!0x0});let _0x17f025=_0x442bf4['split']('\x0a');_0x442bf4=_0x17f025['pop']()||'';for(let _0x2b251d of _0x17f025){if(!_0x2b251d[_0x1a0fde(0x1c9)]('data:\x20'))continue;try{let _0x23afbd=JSON[_0x1a0fde(0x1d0)](_0x2b251d[_0x1a0fde(0x19c)](0x6));if(_0x23afbd['type']===_0x1a0fde(0x1a0)){this[_0x1a0fde(0x195)](_0x1a0fde(0x1d4)),this[_0x1a0fde(0x1e1)]('connected');continue;}if(_0x23afbd['type']===_0x1a0fde(0x1a5)||_0x23afbd[_0x1a0fde(0x1a9)]===_0x1a0fde(0x1ba)||_0x23afbd[_0x1a0fde(0x1a9)]==='broadcast')await this[_0x1a0fde(0x1d3)]();}catch{}}}}catch(_0x4ba1f7){if(_0x4ba1f7[_0x1a0fde(0x1ca)]===_0x1a0fde(0x196))break;this[_0x1a0fde(0x1e1)]('error',_0x4ba1f7),this[_0x1a0fde(0x195)]('SSE\x20error:\x20'+_0x4ba1f7[_0x1a0fde(0x1ed)]);}if(this[_0x1a0fde(0x1aa)])this[_0x1a0fde(0x1e1)](_0x1a0fde(0x1e4)),this['log'](_0x1a0fde(0x197)+_0x459bbb/0x3e8+_0x1a0fde(0x1c2)),await this[_0x1a0fde(0x1db)](_0x459bbb),_0x459bbb=Math[_0x1a0fde(0x19d)](_0x459bbb*1.5,0xea60);}}async['processInbox'](){const _0x3ed557=a0_0x326ef2;try{let _0x4d28a0=(await this[_0x3ed557(0x1b2)](_0x3ed557(0x1cb),{'alias':this[_0x3ed557(0x1ae)],'limit':0xa}))?.[_0x3ed557(0x19a)]||[];for(let _0x3d91c7 of _0x4d28a0)await this[_0x3ed557(0x1b2)](_0x3ed557(0x1cf),{'alias':this['alias'],'message_id':_0x3d91c7['id']}),this[_0x3ed557(0x195)]('←\x20'+_0x3d91c7[_0x3ed557(0x198)]+':\x20'+_0x3d91c7[_0x3ed557(0x19e)][_0x3ed557(0x19c)](0x0,0x3c)),this[_0x3ed557(0x1e1)](_0x3ed557(0x1c5),_0x3d91c7),this[_0x3ed557(0x1e1)](_0x3ed557(0x1ed),_0x3d91c7);}catch(_0x4ee1c5){this[_0x3ed557(0x195)](_0x3ed557(0x1e9)+_0x4ee1c5[_0x3ed557(0x1ed)]);}}[a0_0x326ef2(0x1db)](_0x40caed){return new Promise(_0x5e6710=>setTimeout(_0x5e6710,_0x40caed));}}var $=T;export{$ as default,T as CommHub};
|
|
@@ -1,17 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import*as F from"@larksuiteoapi/node-sdk";import
|
|
3
|
-
`)
|
|
4
|
-
`);return}
|
|
5
|
-
`);
|
|
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 L}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=L(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,G=this.connectionName,q=this.botOpenId,X=this.mediaDir,U=this.client,j=new F.EventDispatcher({});j.register({"im.message.receive_v1":async(W)=>{try{this.health_={...this.health_,lastEventAt:Date.now()};let Y=l(W,G,q);if(!Y)return;await g(W,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:j}),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 l(J,Q,Z){let $=J,V=$?.message,G=$?.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 U=V.chat_type==="group"?"group":"dm",j=Array.isArray(V.mentions)?V.mentions:[],W=Z?j.some((B)=>B?.id?.open_id===Z):j.length>0,Y=`${Q}#feishu`;return{platform:"feishu",connectionId:Y,tenantId:G?.tenant_key,conversation:{platform:"feishu",conversationId:V.chat_id,conversationType:U,threadRootId:V.root_id},sender:{id:q},messageId:V.message_id,mentioned:W,content:X?{text:X}:{},receivedAt:Date.now(),idempotencyKey:`feishu:${Y}:${V.message_id}`}}async function g(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(j){process.stderr.write(`[feishu:image] ${V} skip: content not JSON (${j?.message??j})
|
|
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 G=await J.im.messageResource.get({path:{message_id:Q,file_key:Z},params:{type:"image"}});if(!G)return process.stderr.write(`[feishu:image] ${Q} messageResource.get returned falsy (no stream)
|
|
10
|
+
`),null;let q=G;if(typeof q.getReadableStream!=="function")return process.stderr.write(`[feishu:image] ${Q} resp shape unexpected — no getReadableStream() method (lark SDK version drift?)
|
|
11
|
+
`),null;let X=q.getReadableStream(),U=[];await new Promise((z,K)=>{X.on("data",(N)=>U.push(Buffer.from(N))),X.on("end",()=>z()),X.on("error",(N)=>K(N))});let j=Buffer.concat(U);process.stderr.write(`[feishu:image] ${Q} stream collected ${j.length} bytes
|
|
12
|
+
`);let W=p(j);if(!W){let z=j.slice(0,16).toString("hex");return process.stderr.write(`[feishu:image] ${Q} mime rejected (head hex: ${z})
|
|
13
|
+
`),null}let Y=V?L($,V.replace(/[^a-zA-Z0-9_-]/g,"_")):$;f(Y,{recursive:!0});let B=Q.replace(/[^a-zA-Z0-9_-]/g,"_"),H=L(Y,`${B}.${W.ext}`);return v(H,j),H}catch(G){let q=G?.message??String(G),X=G?.response?.data?.code??G?.code??"";return process.stderr.write(`[feishu:image] ${Q} downloadImage threw: code=${X} msg=${q}
|
|
14
|
+
`),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}`:"?",G=Q?Q.sender.id:"?";process.stderr.write(`[${$}] [feishu:audit] ${J} from=${G} conv=${V} — ${Z}
|
|
15
|
+
`)}import{existsSync as D,readFileSync as y}from"node:fs";import{join as M}from"node:path";function O(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=n(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 G=$.slice(0,V).trim(),q=$.slice(V+1).trim().replace(/^["']|["']$/g,"");Q[G]=q}return Q}function n(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 s=900000,a=120000,t=3,_=60000,e=2,T=60000,JJ=3,w=60000,QJ="处理频率超出限制,请稍后重试";async function h(J){let Q=O(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||s,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,G]of Q)if($-G>a)Q.delete(V)}if(Q.has(Z.idempotencyKey)){process.stderr.write(`[feishu:bridge] dedup drop ${Z.idempotencyKey}
|
|
16
|
+
`);return}Q.set(Z.idempotencyKey,$),await J(Z)}}function ZJ(J,Q){let Z=new Map,$=new Map,V=new Map;function G(Y,B,H){let z=B-H;return Y.filter((K)=>K>=z)}function q(Y,B,H){if(Y.size<=b)return;for(let[z,K]of Y){let N=K[K.length-1]??0;if(B-N>H)Y.delete(z)}}function X(Y,B){if(Y.size<=b)return;for(let[H,z]of Y)if(B-z.windowStart>w)Y.delete(H)}function U(Y,B){if(Y.size<=B)return;let H=[];for(let[K,N]of Y)H.push([K,N[N.length-1]??0]);H.sort((K,N)=>K[1]-N[1]);let z=Y.size-B;for(let K=0;K<z;K++)Y.delete(H[K][0])}function j(Y,B){if(Y.size<=B)return;let H=[];for(let[K,N]of Y)H.push([K,N.windowStart]);H.sort((K,N)=>K[1]-N[1]);let z=Y.size-B;for(let K=0;K<z;K++)Y.delete(H[K][0])}let W=async(Y)=>{let B=Date.now();q(Z,B,_),q($,B,T),X(V,B),U(Z,C),U($,C),j(V,C);let H=!1;if(Y.conversation.conversationType==="dm"){let x=Y.sender.id,S=G(Z.get(x)??[],B,_);if(S.length>=t)H=!0,Z.set(x,S);else S.push(B),Z.set(x,S)}else{let x=Y.conversation.conversationId,S=G($.get(x)??[],B,T);if(S.length>=e)H=!0,$.set(x,S);else S.push(B),$.set(x,S)}if(H){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(!H){await J(Y);return}let z=Y.sender.id,K=V.get(z),N;if(!K||B-K.windowStart>w)N={count:1,windowStart:B};else N={count:K.count+1,windowStart:K.windowStart};if(V.set(z,N),N.count>=JJ)process.stderr.write(`[feishu:audit] flood from=${z} conv=${Y.conversation.conversationType}:${Y.conversation.conversationId} — ${N.count} rate-limit denies in ${Math.round((B-N.windowStart)/1000)}s window
|
|
17
|
+
`);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=${z} for ${Y.idempotencyKey}
|
|
6
18
|
`)}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),
|
|
19
|
+
`)}};return W.__getState=()=>({dmKeyCount:Z.size,groupKeyCount:$.size,floodKeyCount:V.size}),W}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 G=$.get(V.eventKey);if(!G)return;$.delete(V.eventKey);let{text:q,eventKey:X}=V,{event:U,placeholderMessageId:j}=G;(async()=>{try{let{messageId:W}=await J.send({target:U.conversation,text:q,replyToMessageId:U.messageId,correlation:{taskId:X}}),Y=j?` (after placeholder=${j})`:"";process.stderr.write(`[feishu:bridge] reply sent (messageId=${W})${Y} for ${X}
|
|
20
|
+
`)}catch(W){let Y=W instanceof Error?W.message:String(W);process.stderr.write(`[feishu:bridge] reply delivery failed: ${Y}
|
|
21
|
+
`)}})()}),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
|
|
22
|
+
`)}catch(U){let j=U instanceof Error?U.message:String(U);process.stderr.write(`[feishu:bridge] timeout-notify send failed: ${j}
|
|
23
|
+
`)}})()},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
24
|
`)}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:
|
|
14
|
-
`)}function KJ(J){let Q={};for(let
|
|
15
|
-
`),process.exit(2);try{await
|
|
16
|
-
`)}catch(Q){let
|
|
25
|
+
`)}let G={type:"event",event:V};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)}
|
|
26
|
+
`)}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>
|
|
27
|
+
`),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"}
|
|
28
|
+
`)}catch(Q){let Z=Q instanceof Error?Q.stack??Q.message:String(Q);process.stderr.write(`[feishu:worker] startup failed: ${Z}
|
|
17
29
|
`),process.exit(1)}}UJ();
|
package/dist/src/node-server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
const a0_0x2cadd7=a0_0x1a70;(function(_0x4f6fe9,_0x3ae20f){const _0x5175bb=a0_0x1a70,_0x55d0b6=_0x4f6fe9();while(!![]){try{const _0x28043f=-parseInt(_0x5175bb(0xc9))/0x1+parseInt(_0x5175bb(0x111))/0x2*(-parseInt(_0x5175bb(0x102))/0x3)+parseInt(_0x5175bb(0x9f))/0x4+parseInt(_0x5175bb(0x90))/0x5+-parseInt(_0x5175bb(0xaf))/0x6*(-parseInt(_0x5175bb(0x7e))/0x7)+-parseInt(_0x5175bb(0xe4))/0x8*(parseInt(_0x5175bb(0x8f))/0x9)+parseInt(_0x5175bb(0xe1))/0xa;if(_0x28043f===_0x3ae20f)break;else _0x55d0b6['push'](_0x55d0b6['shift']());}catch(_0x4a531b){_0x55d0b6['push'](_0x55d0b6['shift']());}}}(a0_0x208b,0xa0c1a));import{readFileSync as a0_0x3c5cb3,existsSync as a0_0x180657}from'fs';import{randomUUID as a0_0x463c50}from'crypto';import{join as a0_0x26f6cc}from'path';import{hostname as a0_0x14132c}from'os';import{execSync as a0_0x263fad}from'child_process';import{Server as a0_0x3ad946}from'@modelcontextprotocol/sdk/server/index.js';function a0_0x1a70(_0x4a4f2f,_0x26c261){_0x4a4f2f=_0x4a4f2f-0x7e;const _0x208b20=a0_0x208b();let _0x1a709c=_0x208b20[_0x4a4f2f];return _0x1a709c;}import{StdioServerTransport as a0_0x3b24fd}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x38c89a,CallToolRequestSchema as a0_0x56a585}from'@modelcontextprotocol/sdk/types.js';function I(_0x4a6704){const _0x57d571=a0_0x1a70;if(!a0_0x180657(_0x4a6704))return;for(let _0x275ec2 of a0_0x3c5cb3(_0x4a6704,_0x57d571(0x85))['split']('\x0a')){let _0x2b2fe8=_0x275ec2[_0x57d571(0x86)]();if(!_0x2b2fe8||_0x2b2fe8[_0x57d571(0xcd)]('#'))continue;let _0x14e75b=_0x2b2fe8['indexOf']('=');if(_0x14e75b<0x0)continue;let _0x43b509=_0x2b2fe8[_0x57d571(0x9a)](0x0,_0x14e75b)['trim'](),_0x33f8db=_0x2b2fe8[_0x57d571(0x9a)](_0x14e75b+0x1)['trim']()['replace'](/^["']|["']$/g,'');if(!process.env[_0x43b509])process.env[_0x43b509]=_0x33f8db;}}var L=process.env.HOME||'~',U=a0_0x26f6cc(L,'.claude/channels/commhub');I(a0_0x26f6cc(U,'.env'));var v=process[a0_0x2cadd7(0x114)]()[a0_0x2cadd7(0x92)](/\//g,'-');I(a0_0x26f6cc(U,v,a0_0x2cadd7(0x104)));function d(){const _0x2164e8=a0_0x2cadd7;try{return a0_0x263fad('tmux\x20display-message\x20-p\x20\x27#S\x27',{'encoding':_0x2164e8(0x85),'timeout':0x7d0})['trim']();}catch{return'';}}function m(){const _0x586f57=a0_0x2cadd7;try{let _0x1ac11d=a0_0x26f6cc(L,_0x586f57(0x101),_0x586f57(0xd5));if(a0_0x180657(_0x1ac11d))return JSON[_0x586f57(0xee)](a0_0x3c5cb3(_0x1ac11d,_0x586f57(0x85)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x2cadd7(0xdb)]||a0_0x2cadd7(0x99),f=process.env.COMMHUB_TMUX||d();function r(){const _0x41ca4b=a0_0x2cadd7;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0x41ca4b(0x86)]())return process.env.COMMHUB_ALIAS['trim']();return process['stderr']['write'](_0x41ca4b(0x8a)+(_0x41ca4b(0x8d)+(f||_0x41ca4b(0xcc))+'\x20/\x20hostname='+a0_0x14132c()+_0x41ca4b(0xfd))),_0x41ca4b(0x108)+process[_0x41ca4b(0xd0)];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x463c50(),F=process.env.COMMHUB_TOKEN||u['token']||'';function a0_0x208b(){const _0x2047c3=['re-registered\x20as\x20\x22','find','object','Bearer\x20','/mcp','new_message',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','commhub_send_message','parse\x20error:\x20','cancelled','stringify','write','split','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','application/json','number','delete','.anet','1154199DeQRdZ','status','.env','MCP\x20stdio\x20connected','SSE\x20connection\x20error:\x20','SSE\x20connected\x20as\x20\x22','unattributed-','failed','SSE\x20stream\x20ended,\x20reconnecting...','\x20ALIAS=','low','Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','stderr','normal','\x20from\x20','6XAxgiD','high','warning:\x20could\x20not\x20register:\x20','cwd','commhub_send_task','application/json,\x20text/event-stream','get_all_status','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>','9040101thHTIA','string','heartbeat\x20failed:\x20','SIGINT','params','→\x20injected\x20task\x20','Reply\x20text\x20/\x20result\x20summary','utf-8','trim','init\x20failed:\x20','2025-03-26','pop','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.','9Wrgjnw','3363265mkRzTB','SIGTERM','replace','commhub_get_all_status','notifications/claude/channel','blocked','then','Target\x20session\x20alias','data:\x20','http://127.0.0.1:9200','slice',':\x20inbox_count=','←\x20message\x20from\x20','none','replied','478504cuRPfo','exit','report_status','set','\x20CWD=','get_inbox','SSE\x20fatal:\x20','CommHub\x20init\x20failed:\x20','\x22\x20after\x20SSE\x20reconnect','length','Message\x20content','read','message','re-register\x20failed:\x20','setRequestHandler','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','6QXrqWY','toTimeString','0.3.0','text','commhub_reply','completed','/events/','\x20PROJECT_ENV=','initialize','registered\x20as\x20\x22','now','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','...\x20TMUX=',']\x20[commhub]\x20','POST','Authorization','in_progress','working','connecting\x20to\x20','from_session','notification','send_message','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','commhub_report_status','claude-code','837060cxCtCq','Session\x20alias:\x20','inbox_count','(none)','startsWith','statusText','connect','pid','from','result','SSE\x20error:\x20','catch','config.json','shutting\x20down,\x20reporting\x20offline...','priority','error','connected','offline','hub','2.0','type','idle','decode','min','8515640TJXFGX','\x22\x20(','ready\x20—\x20waiting\x20for\x20events','2284552ZeOzfG','getReader','\x20priority=','commhub-channel','commhub','tools/call','no\x20response','message_id','content','\x20RESUME_ID=','parse','ack_inbox'];a0_0x208b=function(){return _0x2047c3;};return a0_0x208b();}function W(_0x4eeafc){const _0x29d353=a0_0x2cadd7;let _0xf8db39=new Date()[_0x29d353(0xb0)]()[_0x29d353(0x9a)](0x0,0x8);process[_0x29d353(0x10e)][_0x29d353(0xfb)]('['+_0xf8db39+_0x29d353(0xbc)+_0x4eeafc+'\x0a');}function N(_0xe21453){return new Promise(_0x588bd5=>setTimeout(_0x588bd5,_0xe21453));}W('ENV:\x20URL='+j+a0_0x2cadd7(0x10b)+G+a0_0x2cadd7(0xed)+K[a0_0x2cadd7(0x9a)](0x0,0x8)+a0_0x2cadd7(0xbb)+(f||a0_0x2cadd7(0x9d))+a0_0x2cadd7(0xa3)+process['cwd']()+a0_0x2cadd7(0xb6)+v);var D=new Map(),x=new a0_0x3ad946({'name':a0_0x2cadd7(0xe7),'version':a0_0x2cadd7(0xb1)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x2cadd7(0x119),a0_0x2cadd7(0x8b),a0_0x2cadd7(0x8e),a0_0x2cadd7(0xae),a0_0x2cadd7(0xca)+G]['join']('\x0a')});x[a0_0x2cadd7(0xad)](a0_0x38c89a,async()=>({'tools':[{'name':a0_0x2cadd7(0xb3),'description':'Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','inputSchema':{'type':a0_0x2cadd7(0xf2),'properties':{'task_id':{'type':a0_0x2cadd7(0x7f),'description':a0_0x2cadd7(0xc6)},'text':{'type':'string','description':a0_0x2cadd7(0x84)},'status':{'type':a0_0x2cadd7(0x7f),'enum':[a0_0x2cadd7(0xb4),a0_0x2cadd7(0x109),a0_0x2cadd7(0xf9),a0_0x2cadd7(0x95),a0_0x2cadd7(0xd8),a0_0x2cadd7(0xbf)],'description':a0_0x2cadd7(0x118)}},'required':[a0_0x2cadd7(0xb2)]}},{'name':a0_0x2cadd7(0xc7),'description':a0_0x2cadd7(0x10d),'inputSchema':{'type':a0_0x2cadd7(0xf2),'properties':{'status':{'type':'string','enum':[a0_0x2cadd7(0xc0),a0_0x2cadd7(0xde),a0_0x2cadd7(0x95),a0_0x2cadd7(0xd8)]},'task':{'type':a0_0x2cadd7(0x7f),'description':'Current\x20task\x20description'},'progress':{'type':a0_0x2cadd7(0xff),'description':'Progress\x200-100'}},'required':['status']}},{'name':a0_0x2cadd7(0x115),'description':'Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','inputSchema':{'type':a0_0x2cadd7(0xf2),'properties':{'alias':{'type':'string','description':a0_0x2cadd7(0x97)},'task':{'type':a0_0x2cadd7(0x7f),'description':'Task\x20content'},'priority':{'type':a0_0x2cadd7(0x7f),'enum':[a0_0x2cadd7(0x112),a0_0x2cadd7(0x10f),a0_0x2cadd7(0x10c)],'description':'Priority\x20(default:\x20normal)'}},'required':['alias','task']}},{'name':a0_0x2cadd7(0xf7),'description':a0_0x2cadd7(0x8c),'inputSchema':{'type':a0_0x2cadd7(0xf2),'properties':{'alias':{'type':a0_0x2cadd7(0x7f),'description':a0_0x2cadd7(0x97)},'message':{'type':a0_0x2cadd7(0x7f),'description':a0_0x2cadd7(0xa9)}},'required':['alias',a0_0x2cadd7(0xab)]}},{'name':'commhub_get_all_status','description':a0_0x2cadd7(0xba),'inputSchema':{'type':'object','properties':{}}}]}));async function Y(_0x320501,_0x549053){const _0x56de7f=a0_0x2cadd7;let _0x33c12e=await fetch(j+_0x56de7f(0xf4),{'method':_0x56de7f(0xbd),'headers':{'Content-Type':_0x56de7f(0xfe),'Accept':_0x56de7f(0x116),...F?{'Authorization':_0x56de7f(0xf3)+F}:{}},'body':JSON[_0x56de7f(0xfa)]({'jsonrpc':_0x56de7f(0xdc),'id':0x1,'method':_0x56de7f(0xb7),'params':{'protocolVersion':_0x56de7f(0x88),'capabilities':{},'clientInfo':{'name':_0x56de7f(0xe7),'version':_0x56de7f(0xb1)}}})});if(!_0x33c12e['ok']){let _0x16da2e=await _0x33c12e['text']();return W(_0x56de7f(0xa6)+_0x33c12e[_0x56de7f(0x103)]+'\x20'+_0x16da2e['slice'](0x0,0x64)),{'ok':!0x1,'error':_0x56de7f(0x87)+_0x33c12e[_0x56de7f(0x103)]};}await _0x33c12e[_0x56de7f(0xb2)]();let _0x55d10=(await(await fetch(j+_0x56de7f(0xf4),{'method':_0x56de7f(0xbd),'headers':{'Content-Type':_0x56de7f(0xfe),'Accept':_0x56de7f(0x116),...F?{'Authorization':'Bearer\x20'+F}:{}},'body':JSON['stringify']({'jsonrpc':_0x56de7f(0xdc),'id':0x2,'method':_0x56de7f(0xe9),'params':{'name':_0x320501,'arguments':_0x549053}})}))['text']())[_0x56de7f(0xfc)]('\x0a')[_0x56de7f(0xf1)](_0x17ccd4=>_0x17ccd4['startsWith'](_0x56de7f(0x98)));if(_0x55d10){let _0x4628f7=JSON[_0x56de7f(0xee)](_0x55d10[_0x56de7f(0x9a)](0x6));return _0x4628f7?.['result']?.[_0x56de7f(0xec)]?.[0x0]?.['text']?JSON['parse'](_0x4628f7[_0x56de7f(0xd2)]['content'][0x0][_0x56de7f(0xb2)]):_0x4628f7;}return{'ok':!0x1,'error':_0x56de7f(0xea)};}x[a0_0x2cadd7(0xad)](a0_0x56a585,async _0x2a9bed=>{const _0x474ae6=a0_0x2cadd7;let {name:_0x1e39fb,arguments:_0x1e0ade}=_0x2a9bed[_0x474ae6(0x82)];if(_0x1e39fb===_0x474ae6(0xb3)){let {task_id:_0x467d18,text:_0x5b2c19,status:_0x4dde24}=_0x1e0ade;if(_0x4dde24===_0x474ae6(0xb4)||_0x4dde24===_0x474ae6(0x109)||_0x4dde24===_0x474ae6(0xf9)){let _0x4d4e92=_0x4dde24===_0x474ae6(0xb4)?_0x474ae6(0x9e):_0x4dde24,_0x40dd15=_0x467d18?D['get'](_0x467d18)||_0x474ae6(0xdb):_0x474ae6(0xdb),_0x38f506=await Y('send_reply',{'alias':_0x40dd15,'text':_0x5b2c19,'in_reply_to':_0x467d18||void 0x0,'status':_0x4d4e92,'from_session':G});if(_0x467d18)D[_0x474ae6(0x100)](_0x467d18);return{'content':[{'type':'text','text':JSON['stringify'](_0x38f506)}]};}let _0x150ea4=await Y('report_status',{'resume_id':K,'alias':G,'status':_0x4dde24===_0x474ae6(0x95)?_0x474ae6(0x95):_0x4dde24==='error'?_0x474ae6(0xd8):_0x474ae6(0xc0),'task':_0x5b2c19[_0x474ae6(0x9a)](0x0,0xc8),'output':_0x5b2c19});return{'content':[{'type':_0x474ae6(0xb2),'text':JSON['stringify'](_0x150ea4)}]};}if(_0x1e39fb===_0x474ae6(0xc7)){let {status:_0x169633,task:_0x4d7da,progress:_0x522449}=_0x1e0ade,_0x25bf65=await Y(_0x474ae6(0xa1),{'resume_id':K,'alias':G,'status':_0x169633,'task':_0x4d7da,'progress':_0x522449});return{'content':[{'type':'text','text':JSON['stringify'](_0x25bf65)}]};}if(_0x1e39fb===_0x474ae6(0x115)){let {alias:_0x16e433,task:_0x54cf1d,priority:_0x252800}=_0x1e0ade,_0xe7b924=await Y('send_task',{'alias':_0x16e433,'task':_0x54cf1d,'priority':_0x252800||_0x474ae6(0x10f),'from_session':G});return{'content':[{'type':_0x474ae6(0xb2),'text':JSON['stringify'](_0xe7b924)}]};}if(_0x1e39fb===_0x474ae6(0xf7)){let {alias:_0xffcc6f,message:_0x451b00}=_0x1e0ade,_0x97737=await Y(_0x474ae6(0xc4),{'alias':_0xffcc6f,'message':_0x451b00,'from_session':G});return{'content':[{'type':_0x474ae6(0xb2),'text':JSON[_0x474ae6(0xfa)](_0x97737)}]};}if(_0x1e39fb===_0x474ae6(0x93)){let _0x502385=await Y(_0x474ae6(0x117),{});return{'content':[{'type':_0x474ae6(0xb2),'text':JSON['stringify'](_0x502385)}]};}return{'content':[{'type':_0x474ae6(0xb2),'text':JSON[_0x474ae6(0xfa)]({'error':'unknown\x20tool'})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x2230de=a0_0x2cadd7;try{await Y('report_status',{'resume_id':K,'alias':G,'status':'idle','server':a0_0x14132c(),'hostname':a0_0x14132c(),'agent':_0x2230de(0xc8),'project_dir':process[_0x2230de(0x114)](),'tmux_name':f||void 0x0}),W(_0x2230de(0xf0)+G+_0x2230de(0xa7));}catch(_0x422e78){W(_0x2230de(0xac)+_0x422e78);}}async function o(){const _0x15f365=a0_0x2cadd7;let _0x55adf7=j+_0x15f365(0xb5)+encodeURIComponent(G),_0x521acc={};if(F)_0x521acc[_0x15f365(0xbe)]=_0x15f365(0xf3)+F;W(_0x15f365(0xc1)+_0x55adf7);let _0x53068d=O,_0x43a692=!0x0,_0x2b324e=null;while(!0x0){try{let _0x2a6540=await fetch(_0x55adf7,{'headers':_0x521acc});if(!_0x2a6540['ok']){if(W(_0x15f365(0xd3)+_0x2a6540['status']+'\x20'+_0x2a6540[_0x15f365(0xce)]),_0x2b324e=_0x2b324e??Date[_0x15f365(0xb9)](),Date[_0x15f365(0xb9)]()-_0x2b324e>T){W(_0x15f365(0xc5)+j+_0x15f365(0xf6));return;}await N(_0x53068d),_0x53068d=Math[_0x15f365(0xe0)](_0x53068d*0x2,R);continue;}let _0x14f8fb=_0x2a6540['body'][_0x15f365(0xe5)](),_0x51cd85=new TextDecoder(),_0x57304a='';_0x53068d=O;while(!0x0){let {done:_0x4523cd,value:_0x3286c7}=await _0x14f8fb[_0x15f365(0xaa)]();if(_0x4523cd)break;_0x57304a+=_0x51cd85[_0x15f365(0xdf)](_0x3286c7,{'stream':!0x0});let _0x4b9b04=_0x57304a[_0x15f365(0xfc)]('\x0a\x0a');_0x57304a=_0x4b9b04[_0x15f365(0x89)]()||'';for(let _0x2626ed of _0x4b9b04){let _0xd561f5=_0x2626ed[_0x15f365(0xfc)]('\x0a')['find'](_0x504040=>_0x504040[_0x15f365(0xcd)]('data:\x20'));if(!_0xd561f5)continue;try{let _0x1c3f81=JSON[_0x15f365(0xee)](_0xd561f5[_0x15f365(0x9a)](0x6));if(await a(_0x1c3f81),_0x1c3f81[_0x15f365(0xdd)]===_0x15f365(0xd9)){if(_0x2b324e=null,!_0x43a692)await l();_0x43a692=!0x1;}}catch(_0x91c733){W(_0x15f365(0xf8)+_0x91c733);}}}W(_0x15f365(0x10a));}catch(_0x1b6db9){W(_0x15f365(0x106)+_0x1b6db9);}if(_0x2b324e=_0x2b324e??Date[_0x15f365(0xb9)](),Date[_0x15f365(0xb9)]()-_0x2b324e>T){W('SSE\x20连续\x20>1h\x20连不上\x20hub\x20('+j+')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。');return;}await N(_0x53068d),_0x53068d=Math['min'](_0x53068d*0x2,R);}}async function a(_0x33e82b){const _0x59a017=a0_0x2cadd7;if(_0x33e82b['type']===_0x59a017(0xd9)){W(_0x59a017(0x107)+G+'\x22');return;}if(_0x33e82b[_0x59a017(0xdd)]===_0x59a017(0xf5)){if(W(_0x59a017(0x9c)+_0x33e82b[_0x59a017(0xd1)]+':\x20'+_0x33e82b['message'][_0x59a017(0x9a)](0x0,0x3c)),await x[_0x59a017(0xc3)]({'method':_0x59a017(0x94),'params':{'content':_0x33e82b['message'],'meta':{'sender':_0x33e82b[_0x59a017(0xd1)]||_0x59a017(0xdb),'sender_id':_0x59a017(0xe8),'user':_0x33e82b[_0x59a017(0xd1)]||_0x59a017(0xdb),'priority':'normal'}}}),_0x33e82b[_0x59a017(0xeb)])await Y(_0x59a017(0xef),{'alias':G,'message_id':_0x33e82b[_0x59a017(0xeb)]});return;}if(_0x33e82b[_0x59a017(0xdd)]==='new_task'||_0x33e82b['type']==='broadcast'){W('←\x20'+_0x33e82b[_0x59a017(0xdd)]+_0x59a017(0x9b)+_0x33e82b[_0x59a017(0xcb)]+_0x59a017(0xe6)+(_0x33e82b[_0x59a017(0xd7)]||_0x59a017(0x10f)));let _0x2fdb95=await Y(_0x59a017(0xa4),{'alias':G,'limit':0x5});if(_0x2fdb95?.['ok']&&_0x2fdb95['messages']?.[_0x59a017(0xa8)]>0x0)for(let _0x369c51 of _0x2fdb95['messages']){let _0x14d057={'sender':_0x369c51[_0x59a017(0xc2)]||'hub','sender_id':_0x59a017(0xe8),'user':_0x369c51[_0x59a017(0xc2)]||_0x59a017(0xdb),'task_id':_0x369c51['id'],'priority':_0x369c51[_0x59a017(0xd7)]||_0x59a017(0x10f)};D[_0x59a017(0xa2)](_0x369c51['id'],_0x369c51['from_session']||_0x59a017(0xdb)),await x['notification']({'method':_0x59a017(0x94),'params':{'content':_0x369c51[_0x59a017(0xec)],'meta':_0x14d057}}),W(_0x59a017(0x83)+_0x369c51['id'][_0x59a017(0x9a)](0x0,0x8)+_0x59a017(0x110)+_0x369c51[_0x59a017(0xc2)]+':\x20'+_0x369c51[_0x59a017(0xec)][_0x59a017(0x9a)](0x0,0x3c)),await Y(_0x59a017(0xef),{'alias':G,'message_id':_0x369c51['id']});}}}async function n(){const _0x1185c4=a0_0x2cadd7;let _0x1cf6d9=new a0_0x3b24fd();await x[_0x1185c4(0xcf)](_0x1cf6d9),W(_0x1185c4(0x105)),W('starting\x20SSE\x20listener...'),o()['catch'](_0x301bde=>W(_0x1185c4(0xa5)+_0x301bde)),Y('report_status',{'resume_id':K,'alias':G,'status':_0x1185c4(0xde),'server':a0_0x14132c(),'hostname':a0_0x14132c(),'agent':_0x1185c4(0xc8),'project_dir':process[_0x1185c4(0x114)](),'tmux_name':f||void 0x0})[_0x1185c4(0x96)](()=>W(_0x1185c4(0xb8)+G+_0x1185c4(0xe2)+K[_0x1185c4(0x9a)](0x0,0x8)+')'))[_0x1185c4(0xd4)](_0x105617=>W(_0x1185c4(0x113)+_0x105617)),setInterval(()=>{const _0x1ca181=_0x1185c4;Y(_0x1ca181(0xa1),{'resume_id':K,'alias':G,'status':_0x1ca181(0xde),'server':a0_0x14132c(),'hostname':a0_0x14132c(),'agent':_0x1ca181(0xc8),'project_dir':process[_0x1ca181(0x114)](),'tmux_name':f||void 0x0})[_0x1ca181(0xd4)](_0x299bdc=>W(_0x1ca181(0x80)+_0x299bdc));},0x2bf20),W(_0x1185c4(0xe3));}n()[a0_0x2cadd7(0xd4)](_0x416659=>{const _0xb2b78e=a0_0x2cadd7;W('fatal:\x20'+_0x416659),process[_0xb2b78e(0xa0)](0x1);});async function b(){const _0x3be58b=a0_0x2cadd7;W(_0x3be58b(0xd6)),await Y(_0x3be58b(0xa1),{'resume_id':K,'alias':G,'status':_0x3be58b(0xda),'task':'session\x20disconnected'})[_0x3be58b(0xd4)](()=>{}),process[_0x3be58b(0xa0)](0x0);}process['stdin']['on']('end',()=>b()),process['on'](a0_0x2cadd7(0x91),()=>b()),process['on'](a0_0x2cadd7(0x81),()=>b());
|
|
2
|
+
const a0_0x5753db=a0_0x4b20;(function(_0x4fee08,_0x46104e){const _0x25d465=a0_0x4b20,_0x36282a=_0x4fee08();while(!![]){try{const _0x267f8b=parseInt(_0x25d465(0x215))/0x1*(parseInt(_0x25d465(0x1e9))/0x2)+-parseInt(_0x25d465(0x1cb))/0x3+-parseInt(_0x25d465(0x1e0))/0x4+-parseInt(_0x25d465(0x1ae))/0x5*(-parseInt(_0x25d465(0x1a6))/0x6)+-parseInt(_0x25d465(0x227))/0x7+-parseInt(_0x25d465(0x1eb))/0x8+parseInt(_0x25d465(0x20a))/0x9;if(_0x267f8b===_0x46104e)break;else _0x36282a['push'](_0x36282a['shift']());}catch(_0x15d76b){_0x36282a['push'](_0x36282a['shift']());}}}(a0_0x4f36,0xf15af));import{readFileSync as a0_0x38d950,existsSync as a0_0x302ea2}from'fs';import{randomUUID as a0_0x48b480}from'crypto';import{join as a0_0x2231c0}from'path';import{hostname as a0_0x18ad52}from'os';import{execSync as a0_0x2b2ec7}from'child_process';import{Server as a0_0x5f5825}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0xddf142}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x5517e1,CallToolRequestSchema as a0_0x5f39c3}from'@modelcontextprotocol/sdk/types.js';function I(_0x312326){const _0x4e217c=a0_0x4b20;if(!a0_0x302ea2(_0x312326))return;for(let _0x549dbc of a0_0x38d950(_0x312326,_0x4e217c(0x219))[_0x4e217c(0x1e5)]('\x0a')){let _0x664018=_0x549dbc['trim']();if(!_0x664018||_0x664018[_0x4e217c(0x1e4)]('#'))continue;let _0x1958e2=_0x664018[_0x4e217c(0x1c6)]('=');if(_0x1958e2<0x0)continue;let _0x4b47d5=_0x664018[_0x4e217c(0x1c4)](0x0,_0x1958e2)[_0x4e217c(0x20d)](),_0x41e550=_0x664018[_0x4e217c(0x1c4)](_0x1958e2+0x1)[_0x4e217c(0x20d)]()['replace'](/^["']|["']$/g,'');if(!process.env[_0x4b47d5])process.env[_0x4b47d5]=_0x41e550;}}var L=process.env.HOME||'~',U=a0_0x2231c0(L,a0_0x5753db(0x1f8));I(a0_0x2231c0(U,a0_0x5753db(0x1fb)));var v=process['cwd']()['replace'](/\//g,'-');I(a0_0x2231c0(U,v,a0_0x5753db(0x1fb)));function d(){const _0x1fba36=a0_0x5753db;try{return a0_0x2b2ec7('tmux\x20display-message\x20-p\x20\x27#S\x27',{'encoding':_0x1fba36(0x219),'timeout':0x7d0})[_0x1fba36(0x20d)]();}catch{return'';}}function m(){const _0xb19e82=a0_0x5753db;try{let _0x4b7b01=a0_0x2231c0(L,'.anet',_0xb19e82(0x1b7));if(a0_0x302ea2(_0x4b7b01))return JSON[_0xb19e82(0x1a2)](a0_0x38d950(_0x4b7b01,'utf-8'));}catch{}return{};}function a0_0x4b20(_0x449e7b,_0x412d08){_0x449e7b=_0x449e7b-0x19b;const _0x4f362e=a0_0x4f36();let _0x4b2057=_0x4f362e[_0x449e7b];return _0x4b2057;}var u=m(),j=process.env.COMMHUB_URL||u['hub']||a0_0x5753db(0x1dd),f=process.env.COMMHUB_TMUX||d();function r(){const _0xf01f7e=a0_0x5753db;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0xf01f7e(0x20d)]())return process.env.COMMHUB_ALIAS[_0xf01f7e(0x20d)]();return process['stderr'][_0xf01f7e(0x207)](_0xf01f7e(0x20e)+(_0xf01f7e(0x1fd)+(f||_0xf01f7e(0x1f4))+'\x20/\x20hostname='+a0_0x18ad52()+_0xf01f7e(0x211))),_0xf01f7e(0x200)+process[_0xf01f7e(0x1d9)];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x48b480(),F=process.env.COMMHUB_TOKEN||u['token']||'';function W(_0x3b2a73){const _0x146d86=a0_0x5753db;let _0x53a6b6=new Date()[_0x146d86(0x1c7)]()[_0x146d86(0x1c4)](0x0,0x8);process[_0x146d86(0x1a4)][_0x146d86(0x207)]('['+_0x53a6b6+_0x146d86(0x21b)+_0x3b2a73+'\x0a');}function N(_0x2d200c){return new Promise(_0x26b6ed=>setTimeout(_0x26b6ed,_0x2d200c));}W('ENV:\x20URL='+j+a0_0x5753db(0x1ff)+G+a0_0x5753db(0x1c2)+K[a0_0x5753db(0x1c4)](0x0,0x8)+a0_0x5753db(0x1f3)+(f||a0_0x5753db(0x205))+a0_0x5753db(0x1e1)+process[a0_0x5753db(0x230)]()+a0_0x5753db(0x1ba)+v);function a0_0x4f36(){const _0x409be9=['set','.env','parse\x20error:\x20','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','body','\x20ALIAS=','unattributed-','stdin','re-register\x20failed:\x20','failed',':\x20inbox_count=','none','broadcast','write','string','send_reply','27421272YBEwfE','Progress\x200-100','tools/call','trim','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','hub','Current\x20task\x20description','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','\x20from\x20','/mcp','text','1857869idKQmh','/events/','→\x20injected\x20task\x20','SSE\x20fatal:\x20','utf-8','application/json',']\x20[commhub]\x20','from_session','SIGTERM','statusText','ready\x20—\x20waiting\x20for\x20events','messages','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','number','alias','message_id','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','11354693dayMvH','report_status','init\x20failed:\x20','error','get','replied','shutting\x20down,\x20reporting\x20offline...','Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','normal','cwd','commhub_report_status','registered\x20as\x20\x22','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','completed','commhub_reply','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','commhub_send_task',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','starting\x20SSE\x20listener...','CommHub\x20init\x20failed:\x20','parse','Priority\x20(default:\x20normal)','stderr','exit','6rTXsdA','notification','working','SSE\x20connection\x20error:\x20','Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','object','blocked','←\x20message\x20from\x20','5227535zNHaja','end','Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>','send_message','idle','status','notifications/claude/channel','unknown\x20tool','config.json','MCP\x20stdio\x20connected','commhub_get_all_status','\x20PROJECT_ENV=','from','priority','Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.','Authorization','find','2025-03-26','delete','\x20RESUME_ID=','catch','slice','\x20priority=','indexOf','toTimeString','claude-code','stringify','message','5843850sDZZcP','pop','cancelled','re-registered\x20as\x20\x22','Reply\x20text\x20/\x20result\x20summary','high','POST','no\x20response','Message\x20content','then','type','heartbeat\x20failed:\x20','Bearer\x20','Target\x20session\x20alias','pid','SIGINT','send_task','application/json,\x20text/event-stream','http://127.0.0.1:9200','commhub','SSE\x20connected\x20as\x20\x22','1129560RXssva','\x20CWD=','session\x20disconnected','getReader','startsWith','split','result','params','now','2iHmfmP','commhub-channel','8873232jKKsOU','2.0','connect','\x22\x20after\x20SSE\x20reconnect','inbox_count','commhub_send_message','content','ack_inbox','...\x20TMUX=','(none)','setRequestHandler','0.3.0','initialize','.claude/channels/commhub','decode'];a0_0x4f36=function(){return _0x409be9;};return a0_0x4f36();}var D=new Map(),x=new a0_0x5f5825({'name':a0_0x5753db(0x1ea),'version':a0_0x5753db(0x1f6)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x5753db(0x1b1),a0_0x5753db(0x226),a0_0x5753db(0x1bd),'You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','Session\x20alias:\x20'+G]['join']('\x0a')});x[a0_0x5753db(0x1f5)](a0_0x5517e1,async()=>({'tools':[{'name':'commhub_reply','description':a0_0x5753db(0x1b0),'inputSchema':{'type':a0_0x5753db(0x1ab),'properties':{'task_id':{'type':'string','description':'The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)'},'text':{'type':a0_0x5753db(0x208),'description':a0_0x5753db(0x1cf)},'status':{'type':a0_0x5753db(0x208),'enum':[a0_0x5753db(0x19b),a0_0x5753db(0x203),'cancelled','blocked',a0_0x5753db(0x22a),'in_progress'],'description':a0_0x5753db(0x221)}},'required':[a0_0x5753db(0x214)]}},{'name':a0_0x5753db(0x231),'description':a0_0x5753db(0x22e),'inputSchema':{'type':a0_0x5753db(0x1ab),'properties':{'status':{'type':a0_0x5753db(0x208),'enum':[a0_0x5753db(0x1a8),a0_0x5753db(0x1b3),'blocked',a0_0x5753db(0x22a)]},'task':{'type':a0_0x5753db(0x208),'description':a0_0x5753db(0x210)},'progress':{'type':a0_0x5753db(0x223),'description':a0_0x5753db(0x20b)}},'required':['status']}},{'name':'commhub_send_task','description':a0_0x5753db(0x1aa),'inputSchema':{'type':a0_0x5753db(0x1ab),'properties':{'alias':{'type':'string','description':a0_0x5753db(0x1d8)},'task':{'type':'string','description':'Task\x20content'},'priority':{'type':'string','enum':[a0_0x5753db(0x1d0),a0_0x5753db(0x22f),'low'],'description':a0_0x5753db(0x1a3)}},'required':[a0_0x5753db(0x224),'task']}},{'name':a0_0x5753db(0x1f0),'description':a0_0x5753db(0x19d),'inputSchema':{'type':a0_0x5753db(0x1ab),'properties':{'alias':{'type':a0_0x5753db(0x208),'description':a0_0x5753db(0x1d8)},'message':{'type':a0_0x5753db(0x208),'description':a0_0x5753db(0x1d3)}},'required':[a0_0x5753db(0x224),'message']}},{'name':'commhub_get_all_status','description':a0_0x5753db(0x233),'inputSchema':{'type':a0_0x5753db(0x1ab),'properties':{}}}]}));async function Y(_0x1ca9c4,_0x178de7){const _0x1210b0=a0_0x5753db;let _0x1effd0=await fetch(j+_0x1210b0(0x213),{'method':'POST','headers':{'Content-Type':_0x1210b0(0x21a),'Accept':_0x1210b0(0x1dc),...F?{'Authorization':_0x1210b0(0x1d7)+F}:{}},'body':JSON[_0x1210b0(0x1c9)]({'jsonrpc':_0x1210b0(0x1ec),'id':0x1,'method':_0x1210b0(0x1f7),'params':{'protocolVersion':_0x1210b0(0x1c0),'capabilities':{},'clientInfo':{'name':_0x1210b0(0x1ea),'version':_0x1210b0(0x1f6)}}})});if(!_0x1effd0['ok']){let _0x1eb23f=await _0x1effd0[_0x1210b0(0x214)]();return W(_0x1210b0(0x1a1)+_0x1effd0[_0x1210b0(0x1b4)]+'\x20'+_0x1eb23f['slice'](0x0,0x64)),{'ok':!0x1,'error':_0x1210b0(0x229)+_0x1effd0[_0x1210b0(0x1b4)]};}await _0x1effd0[_0x1210b0(0x214)]();let _0x2dde72=(await(await fetch(j+'/mcp',{'method':_0x1210b0(0x1d1),'headers':{'Content-Type':'application/json','Accept':'application/json,\x20text/event-stream',...F?{'Authorization':'Bearer\x20'+F}:{}},'body':JSON[_0x1210b0(0x1c9)]({'jsonrpc':_0x1210b0(0x1ec),'id':0x2,'method':_0x1210b0(0x20c),'params':{'name':_0x1ca9c4,'arguments':_0x178de7}})}))[_0x1210b0(0x214)]())['split']('\x0a')[_0x1210b0(0x1bf)](_0x14c8b3=>_0x14c8b3[_0x1210b0(0x1e4)]('data:\x20'));if(_0x2dde72){let _0x4075f7=JSON['parse'](_0x2dde72[_0x1210b0(0x1c4)](0x6));return _0x4075f7?.[_0x1210b0(0x1e6)]?.['content']?.[0x0]?.['text']?JSON[_0x1210b0(0x1a2)](_0x4075f7[_0x1210b0(0x1e6)][_0x1210b0(0x1f1)][0x0][_0x1210b0(0x214)]):_0x4075f7;}return{'ok':!0x1,'error':_0x1210b0(0x1d2)};}x[a0_0x5753db(0x1f5)](a0_0x5f39c3,async _0x4443e6=>{const _0x30e643=a0_0x5753db;let {name:_0x5329c0,arguments:_0x29bbc7}=_0x4443e6[_0x30e643(0x1e7)];if(_0x5329c0===_0x30e643(0x19c)){let {task_id:_0x135ca8,text:_0x20b32d,status:_0x388bdf}=_0x29bbc7;if(_0x388bdf===_0x30e643(0x19b)||_0x388bdf===_0x30e643(0x203)||_0x388bdf===_0x30e643(0x1cd)){let _0x236199=_0x388bdf===_0x30e643(0x19b)?_0x30e643(0x22c):_0x388bdf,_0x19317b=_0x135ca8?D[_0x30e643(0x22b)](_0x135ca8)||_0x30e643(0x20f):_0x30e643(0x20f),_0xf8750d=await Y(_0x30e643(0x209),{'alias':_0x19317b,'text':_0x20b32d,'in_reply_to':_0x135ca8||void 0x0,'status':_0x236199,'from_session':G});if(_0x135ca8)D[_0x30e643(0x1c1)](_0x135ca8);return{'content':[{'type':'text','text':JSON[_0x30e643(0x1c9)](_0xf8750d)}]};}let _0x44b1d3=await Y(_0x30e643(0x228),{'resume_id':K,'alias':G,'status':_0x388bdf==='blocked'?_0x30e643(0x1ac):_0x388bdf===_0x30e643(0x22a)?_0x30e643(0x22a):_0x30e643(0x1a8),'task':_0x20b32d[_0x30e643(0x1c4)](0x0,0xc8),'output':_0x20b32d});return{'content':[{'type':_0x30e643(0x214),'text':JSON[_0x30e643(0x1c9)](_0x44b1d3)}]};}if(_0x5329c0===_0x30e643(0x231)){let {status:_0x2a9525,task:_0x18d02c,progress:_0x2753b3}=_0x29bbc7,_0x3b9082=await Y(_0x30e643(0x228),{'resume_id':K,'alias':G,'status':_0x2a9525,'task':_0x18d02c,'progress':_0x2753b3});return{'content':[{'type':_0x30e643(0x214),'text':JSON[_0x30e643(0x1c9)](_0x3b9082)}]};}if(_0x5329c0===_0x30e643(0x19e)){let {alias:_0x490cc1,task:_0x44f237,priority:_0x327cad}=_0x29bbc7,_0x2d31e6=await Y(_0x30e643(0x1db),{'alias':_0x490cc1,'task':_0x44f237,'priority':_0x327cad||'normal','from_session':G});return{'content':[{'type':'text','text':JSON[_0x30e643(0x1c9)](_0x2d31e6)}]};}if(_0x5329c0===_0x30e643(0x1f0)){let {alias:_0x3a1f32,message:_0x8d493c}=_0x29bbc7,_0x5a33bd=await Y(_0x30e643(0x1b2),{'alias':_0x3a1f32,'message':_0x8d493c,'from_session':G});return{'content':[{'type':_0x30e643(0x214),'text':JSON[_0x30e643(0x1c9)](_0x5a33bd)}]};}if(_0x5329c0===_0x30e643(0x1b9)){let _0xd5e4d6=await Y('get_all_status',{});return{'content':[{'type':'text','text':JSON['stringify'](_0xd5e4d6)}]};}return{'content':[{'type':_0x30e643(0x214),'text':JSON[_0x30e643(0x1c9)]({'error':_0x30e643(0x1b6)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x132a07=a0_0x5753db;try{await Y(_0x132a07(0x228),{'resume_id':K,'alias':G,'status':_0x132a07(0x1b3),'server':a0_0x18ad52(),'hostname':a0_0x18ad52(),'agent':_0x132a07(0x1c8),'project_dir':process['cwd'](),'tmux_name':f||void 0x0}),W(_0x132a07(0x1ce)+G+_0x132a07(0x1ee));}catch(_0x361265){W(_0x132a07(0x202)+_0x361265);}}async function o(){const _0x205736=a0_0x5753db;let _0x2f29bd=j+_0x205736(0x216)+encodeURIComponent(G),_0x59293d={};if(F)_0x59293d[_0x205736(0x1be)]='Bearer\x20'+F;W('connecting\x20to\x20'+_0x2f29bd);let _0x5b237e=O,_0x568cb0=!0x0,_0x5948fb=null;while(!0x0){try{let _0x1b71e0=await fetch(_0x2f29bd,{'headers':_0x59293d});if(!_0x1b71e0['ok']){if(W('SSE\x20error:\x20'+_0x1b71e0[_0x205736(0x1b4)]+'\x20'+_0x1b71e0[_0x205736(0x21e)]),_0x5948fb=_0x5948fb??Date[_0x205736(0x1e8)](),Date[_0x205736(0x1e8)]()-_0x5948fb>T){W(_0x205736(0x222)+j+_0x205736(0x19f));return;}await N(_0x5b237e),_0x5b237e=Math['min'](_0x5b237e*0x2,R);continue;}let _0xc3c5ca=_0x1b71e0[_0x205736(0x1fe)][_0x205736(0x1e3)](),_0x575cfa=new TextDecoder(),_0x52adcf='';_0x5b237e=O;while(!0x0){let {done:_0x485c4c,value:_0x219296}=await _0xc3c5ca['read']();if(_0x485c4c)break;_0x52adcf+=_0x575cfa[_0x205736(0x1f9)](_0x219296,{'stream':!0x0});let _0x3d575d=_0x52adcf['split']('\x0a\x0a');_0x52adcf=_0x3d575d[_0x205736(0x1cc)]()||'';for(let _0x4c44e1 of _0x3d575d){let _0x555ec6=_0x4c44e1[_0x205736(0x1e5)]('\x0a')[_0x205736(0x1bf)](_0x22cf8f=>_0x22cf8f[_0x205736(0x1e4)]('data:\x20'));if(!_0x555ec6)continue;try{let _0x3db402=JSON[_0x205736(0x1a2)](_0x555ec6['slice'](0x6));if(await a(_0x3db402),_0x3db402['type']==='connected'){if(_0x5948fb=null,!_0x568cb0)await l();_0x568cb0=!0x1;}}catch(_0x36ee22){W(_0x205736(0x1fc)+_0x36ee22);}}}W('SSE\x20stream\x20ended,\x20reconnecting...');}catch(_0x36d107){W(_0x205736(0x1a9)+_0x36d107);}if(_0x5948fb=_0x5948fb??Date[_0x205736(0x1e8)](),Date[_0x205736(0x1e8)]()-_0x5948fb>T){W(_0x205736(0x222)+j+_0x205736(0x19f));return;}await N(_0x5b237e),_0x5b237e=Math['min'](_0x5b237e*0x2,R);}}async function a(_0x3fb329){const _0x15f9f6=a0_0x5753db;if(_0x3fb329[_0x15f9f6(0x1d5)]==='connected'){W(_0x15f9f6(0x1df)+G+'\x22');return;}if(_0x3fb329[_0x15f9f6(0x1d5)]==='new_message'){if(W(_0x15f9f6(0x1ad)+_0x3fb329[_0x15f9f6(0x1bb)]+':\x20'+_0x3fb329[_0x15f9f6(0x1ca)][_0x15f9f6(0x1c4)](0x0,0x3c)),await x[_0x15f9f6(0x1a7)]({'method':_0x15f9f6(0x1b5),'params':{'content':_0x3fb329['message'],'meta':{'sender':_0x3fb329[_0x15f9f6(0x1bb)]||_0x15f9f6(0x20f),'sender_id':_0x15f9f6(0x1de),'user':_0x3fb329['from']||_0x15f9f6(0x20f),'priority':_0x15f9f6(0x22f)}}}),_0x3fb329[_0x15f9f6(0x225)])await Y(_0x15f9f6(0x1f2),{'alias':G,'message_id':_0x3fb329[_0x15f9f6(0x225)]});return;}if(_0x3fb329[_0x15f9f6(0x1d5)]==='new_task'||_0x3fb329[_0x15f9f6(0x1d5)]===_0x15f9f6(0x206)){W('←\x20'+_0x3fb329['type']+_0x15f9f6(0x204)+_0x3fb329[_0x15f9f6(0x1ef)]+_0x15f9f6(0x1c5)+(_0x3fb329[_0x15f9f6(0x1bc)]||'normal'));let _0x1b9c87=await Y('get_inbox',{'alias':G,'limit':0x5});if(_0x1b9c87?.['ok']&&_0x1b9c87[_0x15f9f6(0x220)]?.['length']>0x0)for(let _0x243513 of _0x1b9c87[_0x15f9f6(0x220)]){let _0x2cd431={'sender':_0x243513[_0x15f9f6(0x21c)]||_0x15f9f6(0x20f),'sender_id':_0x15f9f6(0x1de),'user':_0x243513[_0x15f9f6(0x21c)]||'hub','task_id':_0x243513['id'],'priority':_0x243513[_0x15f9f6(0x1bc)]||_0x15f9f6(0x22f)};D[_0x15f9f6(0x1fa)](_0x243513['id'],_0x243513[_0x15f9f6(0x21c)]||_0x15f9f6(0x20f)),await x[_0x15f9f6(0x1a7)]({'method':_0x15f9f6(0x1b5),'params':{'content':_0x243513['content'],'meta':_0x2cd431}}),W(_0x15f9f6(0x217)+_0x243513['id'][_0x15f9f6(0x1c4)](0x0,0x8)+_0x15f9f6(0x212)+_0x243513[_0x15f9f6(0x21c)]+':\x20'+_0x243513[_0x15f9f6(0x1f1)][_0x15f9f6(0x1c4)](0x0,0x3c)),await Y(_0x15f9f6(0x1f2),{'alias':G,'message_id':_0x243513['id']});}}}async function n(){const _0x1eba0d=a0_0x5753db;let _0x544209=new a0_0xddf142();await x[_0x1eba0d(0x1ed)](_0x544209),W(_0x1eba0d(0x1b8)),W(_0x1eba0d(0x1a0)),o()[_0x1eba0d(0x1c3)](_0x4faf63=>W(_0x1eba0d(0x218)+_0x4faf63)),Y('report_status',{'resume_id':K,'alias':G,'status':_0x1eba0d(0x1b3),'server':a0_0x18ad52(),'hostname':a0_0x18ad52(),'agent':_0x1eba0d(0x1c8),'project_dir':process[_0x1eba0d(0x230)](),'tmux_name':f||void 0x0})[_0x1eba0d(0x1d4)](()=>W(_0x1eba0d(0x232)+G+'\x22\x20('+K[_0x1eba0d(0x1c4)](0x0,0x8)+')'))[_0x1eba0d(0x1c3)](_0x3d7dbc=>W('warning:\x20could\x20not\x20register:\x20'+_0x3d7dbc)),setInterval(()=>{const _0xac38cf=_0x1eba0d;Y(_0xac38cf(0x228),{'resume_id':K,'alias':G,'status':_0xac38cf(0x1b3),'server':a0_0x18ad52(),'hostname':a0_0x18ad52(),'agent':_0xac38cf(0x1c8),'project_dir':process[_0xac38cf(0x230)](),'tmux_name':f||void 0x0})[_0xac38cf(0x1c3)](_0xf57ef3=>W(_0xac38cf(0x1d6)+_0xf57ef3));},0x2bf20),W(_0x1eba0d(0x21f));}n()['catch'](_0x169d1e=>{W('fatal:\x20'+_0x169d1e),process['exit'](0x1);});async function b(){const _0x43e490=a0_0x5753db;W(_0x43e490(0x22d)),await Y('report_status',{'resume_id':K,'alias':G,'status':'offline','task':_0x43e490(0x1e2)})[_0x43e490(0x1c3)](()=>{}),process[_0x43e490(0x1a5)](0x0);}process[a0_0x5753db(0x201)]['on'](a0_0x5753db(0x1af),()=>b()),process['on'](a0_0x5753db(0x21d),()=>b()),process['on'](a0_0x5753db(0x1da),()=>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.6",
|
|
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",
|