@sleep2agi/agent-network 2.2.22-preview.3 → 2.2.22-preview.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cli.js +1 -1
- package/dist/src/client.js +1 -1
- package/dist/src/im/feishu/bridge.d.ts +10 -1
- package/dist/src/im/feishu/worker.js +15 -15
- package/dist/src/node-server.js +1 -1
- package/package.json +1 -1
package/dist/src/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
const a0_0x4b397d=a0_0x1405;(function(_0x142921,_0x2f137f){const _0xb2c17f=a0_0x1405,_0x5e7735=_0x142921();while(!![]){try{const _0x221887=parseInt(_0xb2c17f(0xb6))/0x1*(parseInt(_0xb2c17f(0xd9))/0x2)+-parseInt(_0xb2c17f(0xa4))/0x3+parseInt(_0xb2c17f(0xcc))/0x4+-parseInt(_0xb2c17f(0xc6))/0x5+parseInt(_0xb2c17f(0xb5))/0x6+parseInt(_0xb2c17f(0xbd))/0x7+-parseInt(_0xb2c17f(0xc7))/0x8*(parseInt(_0xb2c17f(0xd2))/0x9);if(_0x221887===_0x2f137f)break;else _0x5e7735['push'](_0x5e7735['shift']());}catch(_0x231c65){_0x5e7735['push'](_0x5e7735['shift']());}}}(a0_0xa6cb,0xefc2b));function a0_0x1405(_0x31b3ce,_0x37592b){_0x31b3ce=_0x31b3ce-0x93;const _0xa6cbc2=a0_0xa6cb();let _0x1405d2=_0xa6cbc2[_0x31b3ce];return _0x1405d2;}import{EventEmitter as a0_0x9dfe0b}from'events';import{hostname as a0_0x26019b}from'os';class T extends a0_0x9dfe0b{[a0_0x4b397d(0xd7)];[a0_0x4b397d(0xd6)];[a0_0x4b397d(0xca)];[a0_0x4b397d(0x94)];[a0_0x4b397d(0xba)];[a0_0x4b397d(0xc5)];[a0_0x4b397d(0xb4)];[a0_0x4b397d(0xb2)];[a0_0x4b397d(0xac)];[a0_0x4b397d(0xd1)]=!0x1;constructor(_0x326d50){const _0xdbb1b8=a0_0x4b397d;super();if(this[_0xdbb1b8(0xd7)]=_0x326d50[_0xdbb1b8(0xd7)][_0xdbb1b8(0xc3)](/\/$/,''),this['alias']=_0x326d50[_0xdbb1b8(0xd6)],this[_0xdbb1b8(0xca)]=_0x326d50['token'],this[_0xdbb1b8(0x94)]=_0x326d50['agent']||_0xdbb1b8(0xe1),this[_0xdbb1b8(0xba)]=_0xdbb1b8(0xce)+_0x326d50[_0xdbb1b8(0xd6)]+'-'+Date[_0xdbb1b8(0xde)]()[_0xdbb1b8(0xe3)](0x24),this[_0xdbb1b8(0xc5)]=_0x326d50[_0xdbb1b8(0xc5)]??0x2bf20,this[_0xdbb1b8(0xb4)]=_0x326d50[_0xdbb1b8(0xb4)]??0xbb8,_0x326d50['autoConnect']!==!0x1)this[_0xdbb1b8(0x99)]();}[a0_0x4b397d(0xd8)](_0x4bbd57){const _0x3ee55b=a0_0x4b397d;console[_0x3ee55b(0xd8)]('['+new Date()[_0x3ee55b(0x9c)]()[_0x3ee55b(0xe6)](0x0,0x8)+_0x3ee55b(0xdd)+this[_0x3ee55b(0xd6)]+']\x20'+_0x4bbd57);}async['call'](_0x41c671,_0x2c9689){const _0x511a55=a0_0x4b397d;let _0x476b32={'Content-Type':_0x511a55(0xc9),'Accept':_0x511a55(0xb1)};if(this['token'])_0x476b32[_0x511a55(0xa7)]='Bearer\x20'+this[_0x511a55(0xca)];let _0x2aab7b=await(await fetch(this['url']+'/mcp',{'method':_0x511a55(0xd3),'headers':_0x476b32,'body':JSON[_0x511a55(0xcd)]({'jsonrpc':_0x511a55(0xc2),'id':Date[_0x511a55(0xde)](),'method':'tools/call','params':{'name':_0x41c671,'arguments':_0x2c9689}})}))[_0x511a55(0xa6)](),_0x401177=_0x2aab7b[_0x511a55(0xc4)](/data: (.+)/),_0x488450=_0x401177?JSON[_0x511a55(0xbc)](_0x401177[0x1]):JSON['parse'](_0x2aab7b),_0x31e6e6=_0x488450?.[_0x511a55(0xd0)]?.['content']?.[0x0]?.[_0x511a55(0xa6)];return _0x31e6e6?JSON['parse'](_0x31e6e6):_0x488450;}async[a0_0x4b397d(0x99)](){const _0x4c68ef=a0_0x4b397d;if(this[_0x4c68ef(0xd1)])return;this[_0x4c68ef(0xd1)]=!0x0,await this[_0x4c68ef(0xd4)]('idle'),this['log'](_0x4c68ef(0xa3)),this[_0x4c68ef(0xb2)]=setInterval(()=>{const _0x1ec5ab=_0x4c68ef;this[_0x1ec5ab(0xd4)](_0x1ec5ab(0xb7))[_0x1ec5ab(0xe4)](_0x5bbdbc=>this[_0x1ec5ab(0xd8)](_0x1ec5ab(0xe5)+_0x5bbdbc[_0x1ec5ab(0xa8)]));},this[_0x4c68ef(0xc5)]),this[_0x4c68ef(0x98)]();}async['disconnect'](){const _0x3e891c=a0_0x4b397d;if(this[_0x3e891c(0xd1)]=!0x1,this[_0x3e891c(0xac)]?.[_0x3e891c(0xda)](),this[_0x3e891c(0xb2)])clearInterval(this[_0x3e891c(0xb2)]);await this[_0x3e891c(0xd4)]('offline')[_0x3e891c(0xe4)](()=>{}),this['log'](_0x3e891c(0xe0));}async['send'](_0x532a1b,_0x5796f6,_0x241792='normal'){const _0x1e9521=a0_0x4b397d;return this[_0x1e9521(0xa1)](_0x1e9521(0xd5),{'alias':_0x532a1b,'task':_0x5796f6,'priority':_0x241792,'from_session':this[_0x1e9521(0xd6)]});}async[a0_0x4b397d(0xa8)](_0x35da9b,_0x4a5ff1){const _0xb23d66=a0_0x4b397d;return this[_0xb23d66(0xa1)]('send_message',{'alias':_0x35da9b,'message':_0x4a5ff1,'from_session':this['alias']});}async['reply'](_0xaa4e02,_0x3491cb,_0xe4d4c=a0_0x4b397d(0xbe)){const _0xc53964=a0_0x4b397d;return this[_0xc53964(0xa1)](_0xc53964(0x9f),{'in_reply_to':_0xaa4e02,'text':_0x3491cb,'status':_0xe4d4c});}async[a0_0x4b397d(0xd4)](_0x5a4d47,_0x4b2863){const _0x149cbf=a0_0x4b397d;return this[_0x149cbf(0xa1)](_0x149cbf(0xa9),{'resume_id':this[_0x149cbf(0xba)],'alias':this[_0x149cbf(0xd6)],'status':_0x5a4d47,'server':a0_0x26019b(),'hostname':a0_0x26019b(),'agent':this[_0x149cbf(0x94)],'project_dir':process['cwd'](),..._0x4b2863});}async[a0_0x4b397d(0xa0)](){const _0x2a769c=a0_0x4b397d;return this[_0x2a769c(0xa1)](_0x2a769c(0xa5),{});}async[a0_0x4b397d(0x9b)](_0x147f66,_0x5ab487){const _0x1a624b=a0_0x4b397d;return this[_0x1a624b(0xa1)](_0x1a624b(0x9b),{'message':_0x147f66,'filter_server':_0x5ab487?.[_0x1a624b(0xdb)],'filter_status':_0x5ab487?.[_0x1a624b(0xd4)]});}async[a0_0x4b397d(0x98)](){const _0x4c2b6e=a0_0x4b397d;let _0x444ee7=encodeURIComponent(this['alias']),_0x67882=this[_0x4c2b6e(0xd7)]+_0x4c2b6e(0xc0)+_0x444ee7,_0x1cfc5c=this[_0x4c2b6e(0xb4)];while(this[_0x4c2b6e(0xd1)]){try{this['sseAbort']=new AbortController();let _0x393420={'Accept':_0x4c2b6e(0xe2)};if(this[_0x4c2b6e(0xca)])_0x393420[_0x4c2b6e(0xa7)]=_0x4c2b6e(0xc1)+this[_0x4c2b6e(0xca)];let _0x205bd5=await fetch(_0x67882,{'headers':_0x393420,'signal':this[_0x4c2b6e(0xac)][_0x4c2b6e(0xaa)]});if(!_0x205bd5['ok']||!_0x205bd5[_0x4c2b6e(0xa2)]){this[_0x4c2b6e(0xd8)](_0x4c2b6e(0x9d)+_0x205bd5[_0x4c2b6e(0xd4)]),await this[_0x4c2b6e(0x97)](_0x1cfc5c),_0x1cfc5c=Math[_0x4c2b6e(0xc8)](_0x1cfc5c*1.5,0xea60);continue;}_0x1cfc5c=this[_0x4c2b6e(0xb4)];let _0x14143d=_0x205bd5[_0x4c2b6e(0xa2)]['getReader'](),_0x5904d3=new TextDecoder(),_0x350091='';while(this[_0x4c2b6e(0xd1)]){let {done:_0x2bff13,value:_0xe49e91}=await _0x14143d[_0x4c2b6e(0xaf)]();if(_0x2bff13)break;_0x350091+=_0x5904d3['decode'](_0xe49e91,{'stream':!0x0});let _0x394fde=_0x350091[_0x4c2b6e(0xb8)]('\x0a');_0x350091=_0x394fde[_0x4c2b6e(0x96)]()||'';for(let _0x4e6362 of _0x394fde){if(!_0x4e6362[_0x4c2b6e(0xad)](_0x4c2b6e(0xbb)))continue;try{let _0x1c5241=JSON[_0x4c2b6e(0xbc)](_0x4e6362['slice'](0x6));if(_0x1c5241['type']===_0x4c2b6e(0xcf)){this[_0x4c2b6e(0xd8)](_0x4c2b6e(0x9e)),this[_0x4c2b6e(0xb3)](_0x4c2b6e(0xcf));continue;}if(_0x1c5241[_0x4c2b6e(0x9a)]===_0x4c2b6e(0xe7)||_0x1c5241[_0x4c2b6e(0x9a)]===_0x4c2b6e(0xcb)||_0x1c5241[_0x4c2b6e(0x9a)]==='broadcast')await this['processInbox']();}catch{}}}}catch(_0x1053cb){if(_0x1053cb[_0x4c2b6e(0xab)]===_0x4c2b6e(0xae))break;this['emit'](_0x4c2b6e(0xdf),_0x1053cb),this[_0x4c2b6e(0xd8)](_0x4c2b6e(0x95)+_0x1053cb['message']);}if(this[_0x4c2b6e(0xd1)])this[_0x4c2b6e(0xb3)](_0x4c2b6e(0xe0)),this['log']('SSE\x20reconnecting\x20in\x20'+_0x1cfc5c/0x3e8+_0x4c2b6e(0xb0)),await this[_0x4c2b6e(0x97)](_0x1cfc5c),_0x1cfc5c=Math['min'](_0x1cfc5c*1.5,0xea60);}}async[a0_0x4b397d(0xbf)](){const _0x1d41b1=a0_0x4b397d;try{let _0x32b248=(await this[_0x1d41b1(0xa1)]('get_inbox',{'alias':this[_0x1d41b1(0xd6)],'limit':0xa}))?.[_0x1d41b1(0xb9)]||[];for(let _0x23cd7e of _0x32b248)await this[_0x1d41b1(0xa1)]('ack_inbox',{'alias':this[_0x1d41b1(0xd6)],'message_id':_0x23cd7e['id']}),this[_0x1d41b1(0xd8)]('←\x20'+_0x23cd7e['from_session']+':\x20'+_0x23cd7e['content']['slice'](0x0,0x3c)),this[_0x1d41b1(0xb3)](_0x1d41b1(0x93),_0x23cd7e),this[_0x1d41b1(0xb3)](_0x1d41b1(0xa8),_0x23cd7e);}catch(_0x779bce){this[_0x1d41b1(0xd8)](_0x1d41b1(0xdc)+_0x779bce[_0x1d41b1(0xa8)]);}}[a0_0x4b397d(0x97)](_0x391763){return new Promise(_0x53b40f=>setTimeout(_0x53b40f,_0x391763));}}function a0_0xa6cb(){const _0x291d7e=['21BehwSj','idle','split','messages','resumeId','data:\x20','parse','13605767YxXNVJ','completed','processInbox','/events/','Bearer\x20','2.0','replace','match','heartbeatInterval','7153130xlirlw','7865616cfJDFG','min','application/json','token','new_message','4663300FXlezg','stringify','sdk-','connected','result','running','18DMYhmw','POST','status','send_task','alias','url','log','60284vnChOR','abort','server','inbox\x20error:\x20',']\x20[commhub:','now','error','disconnected','sdk','text/event-stream','toString','catch','heartbeat\x20failed:\x20','slice','new_task','task','agent','SSE\x20error:\x20','pop','sleep','connectSSE','connect','type','broadcast','toTimeString','SSE\x20failed:\x20','SSE\x20connected','send_reply','getAllStatus','call','body','registered','2928978nozQuu','get_all_status','text','Authorization','message','report_status','signal','name','sseAbort','startsWith','AbortError','read','s...','application/json,\x20text/event-stream','heartbeatTimer','emit','reconnectDelay','9677562KJjDlO'];a0_0xa6cb=function(){return _0x291d7e;};return a0_0xa6cb();}var $=T;export{$ as default,T as CommHub};
|
|
@@ -84,7 +84,16 @@ export declare function withDedup(inner: (event: NormalizedIMEvent) => Promise<v
|
|
|
84
84
|
*
|
|
85
85
|
* @internal exported for test harness.
|
|
86
86
|
*/
|
|
87
|
-
export declare function withRateLimit(inner: (event: NormalizedIMEvent) => Promise<void>, adapter: FeishuAdapter):
|
|
87
|
+
export declare function withRateLimit(inner: (event: NormalizedIMEvent) => Promise<void>, adapter: FeishuAdapter): WithRateLimitHandle;
|
|
88
|
+
/** @internal — wrapped handler with state-inspection escape hatch for tests. */
|
|
89
|
+
export type WithRateLimitHandle = {
|
|
90
|
+
(event: NormalizedIMEvent): Promise<void>;
|
|
91
|
+
__getState(): {
|
|
92
|
+
dmKeyCount: number;
|
|
93
|
+
groupKeyCount: number;
|
|
94
|
+
floodKeyCount: number;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
88
97
|
/**
|
|
89
98
|
* IPC handler — forwards inbound events to the parent agent-node and routes
|
|
90
99
|
* the parent's reply back to Feishu via the adapter. The parent contract is
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import*as
|
|
3
|
-
`)}import{existsSync as
|
|
4
|
-
`);return}J.set(Z.idempotencyKey
|
|
5
|
-
`);try{await J.send({target
|
|
6
|
-
`)}catch(
|
|
7
|
-
`)}}}function
|
|
8
|
-
`)}catch(
|
|
9
|
-
`)}})()}),async(V)=>{if(
|
|
10
|
-
`)}catch(
|
|
11
|
-
`)}})()},J),Z)try{let{messageId:
|
|
12
|
-
`)}catch(
|
|
13
|
-
`)}let
|
|
14
|
-
`)}function
|
|
15
|
-
`),process.exit(2);try{await
|
|
2
|
+
import*as b from"@larksuiteoapi/node-sdk";import f from"node:crypto";import{existsSync as w,mkdirSync as T,readFileSync as I,writeFileSync as h}from"node:fs";import{join as L}from"node:path";import{Readable as v}from"node:stream";class R{platform="feishu";ingressMode="socket";feishuConfig=null;connectionName="";client=null;wsClient=null;botOpenId=null;mediaDir=null;health_={connected:!1,lastEventAt:null,lastError:null};async init(Q){if(Q.platform!=="feishu")throw Error(`FeishuAdapter.init: expected platform "feishu", got "${Q.platform}"`);let J=Q.platformConfig;if(!J?.appId||!J?.appSecret)throw Error("FeishuAdapter.init: appId / appSecret missing in platformConfig");this.feishuConfig=J,this.connectionName=Q.connectionName,this.client=new b.Client({appId:J.appId,appSecret:J.appSecret,disableTokenCache:!1}),this.botOpenId=await m(this.client),this.mediaDir=J.channelDir?L(J.channelDir,"media"):null}async start(Q){if(!this.feishuConfig||!this.client)throw Error("FeishuAdapter.start: call init() first");let{appId:J,appSecret:Z,access:Y,groupPolicy:V}=this.feishuConfig,G=this.connectionName,q=this.botOpenId,X=this.mediaDir,K=this.client,N=new b.EventDispatcher({});N.register({"im.message.receive_v1":async(H)=>{try{this.health_={...this.health_,lastEventAt:Date.now()};let $=l(H,G,q);if(!$)return;await p(H,$,K,X);let B=d($,Y,V);if(!B.allow){O("deny",$,B.reason);return}await Q($)}catch($){let B=$ instanceof Error?$.message:String($);this.health_={...this.health_,lastError:B},O("error",null,B)}}}),this.wsClient=new b.WSClient({appId:J,appSecret:Z,loggerLevel:b.LoggerLevel.warn}),await this.wsClient.start({eventDispatcher:N}),this.health_={...this.health_,connected:!0,lastError:null}}async stop(){this.health_={...this.health_,connected:!1},this.wsClient=null,this.client=null,this.feishuConfig=null}async send(Q){if(!this.client)throw Error("FeishuAdapter.send: call init() first");let J,Z;if(Q.imagePath){let X=await c(this.client,Q.imagePath);if(!X)throw Error(`FeishuAdapter.send: image upload failed for ${Q.imagePath}`);J="image",Z=JSON.stringify({image_key:X})}else{let X=Q.text??Q.markdown;if(!X)throw Error("FeishuAdapter.send: requires text, markdown, or imagePath");J="text",Z=JSON.stringify({text:X})}let Y=Q.replyToMessageId??Q.target.threadRootId;if(Y){let K=(await this.client.im.message.reply({path:{message_id:Y},data:{msg_type:J,content:Z}}))?.data?.message_id;if(!K)throw Error("FeishuAdapter.send: reply returned no message_id");return{messageId:K}}let V=Q.target.conversationType==="dm"?"open_id":"chat_id",q=(await this.client.im.message.create({params:{receive_id_type:V},data:{receive_id:Q.target.conversationId,msg_type:J,content:Z}}))?.data?.message_id;if(!q)throw Error("FeishuAdapter.send: create returned no message_id");return{messageId:q}}async edit(Q,J,Z){if(!this.client)throw Error("FeishuAdapter.edit: call init() first");let Y=Z.text??Z.markdown;if(!Y)throw Error("FeishuAdapter.edit: M3 supports text only");await this.client.im.message.update({path:{message_id:J},data:{msg_type:"text",content:JSON.stringify({text:Y})}})}health(){return{...this.health_}}}function l(Q,J,Z){let Y=Q,V=Y?.message,G=Y?.sender,q=G?.sender_id?.open_id;if(!V||!q)return null;let X;if(V.message_type==="text")try{X=JSON.parse(V.content).text}catch{X=V.content}else if(V.message_type==="file")try{X=`[文件: ${JSON.parse(V.content).file_name??"unknown"}]`}catch{X="[文件]"}else if(V.message_type==="sticker")X="[表情]";else if(V.message_type==="image")X=void 0;else return null;let K=V.chat_type==="group"?"group":"dm",N=Array.isArray(V.mentions)?V.mentions:[],H=Z?N.some((B)=>B?.id?.open_id===Z):N.length>0,$=`${J}#feishu`;return{platform:"feishu",connectionId:$,tenantId:G?.tenant_key,conversation:{platform:"feishu",conversationId:V.chat_id,conversationType:K,threadRootId:V.root_id},sender:{id:q},messageId:V.message_id,mentioned:H,content:X?{text:X}:{},receivedAt:Date.now(),idempotencyKey:`feishu:${$}:${V.message_id}`}}async function p(Q,J,Z,Y){if(!Z||!Y)return;let G=Q?.message;if(!G||G.message_type!=="image")return;let q;try{q=JSON.parse(G.content).image_key}catch{return}if(!q||!G.message_id)return;let X=await g(Z,G.message_id,q,Y);if(X)J.content={...J.content,images:[X]}}async function g(Q,J,Z,Y){try{let V=await Q.im.messageResource.get({path:{message_id:J,file_key:Z},params:{type:"image"}});if(!V)return null;let G=V,q=[];await new Promise((N,H)=>{G.on("data",($)=>q.push(Buffer.from($))),G.on("end",()=>N()),G.on("error",($)=>H($))}),T(Y,{recursive:!0});let X=`img_${Date.now()}_${f.randomBytes(4).toString("hex")}.png`,K=L(Y,X);return h(K,Buffer.concat(q)),K}catch{return null}}async function c(Q,J){try{if(!w(J))return null;let Z=I(J),Y=v.from(Z);return(await Q.im.image.create({data:{image_type:"message",image:Y}}))?.image_key??null}catch{return null}}async function m(Q){try{let Z=await Q.request({method:"GET",url:"/open-apis/bot/v3/info"});return Z?.bot?.open_id??Z?.data?.bot?.open_id??null}catch{return null}}function d(Q,J,Z){if(Q.conversation.conversationType==="dm"){if(J.allowFrom.includes("*")||J.allowFrom.includes(Q.sender.id))return{allow:!0,reason:""};return{allow:!1,reason:"sender not in allowFrom (dm)"}}if(!(J.allowChats.includes("*")||J.allowChats.includes(Q.conversation.conversationId)))return{allow:!1,reason:"chat not in allowChats"};if(Z==="all")return{allow:!0,reason:""};if(Z==="observe")return{allow:!1,reason:"groupPolicy=observe — chat in allowChats but no trigger"};if(Q.mentioned)return{allow:!0,reason:""};return{allow:!1,reason:`groupPolicy=${Z} requires @bot mention (not mentioned)`}}function O(Q,J,Z){let Y=new Date().toISOString(),V=J?`${J.conversation.conversationType}:${J.conversation.conversationId}`:"?",G=J?J.sender.id:"?";process.stderr.write(`[${Y}] [feishu:audit] ${Q} from=${G} conv=${V} — ${Z}
|
|
3
|
+
`)}import{existsSync as C,readFileSync as E}from"node:fs";import{join as P}from"node:path";function k(Q){let J=o(P(Q,".env")),Z=J.FEISHU_APP_ID,Y=J.FEISHU_APP_SECRET;if(!Z||!Y)throw Error(`feishu channel: FEISHU_APP_ID / FEISHU_APP_SECRET missing in ${Q}/.env`);let V=i(P(Q,"access.json"));return{appId:Z,appSecret:Y,access:V,groupPolicy:"mention",ackPlaceholder:!0,auditRaw:!1,taskTimeoutMs:300000,channelDir:Q}}function o(Q){if(!C(Q))return{};let J={};for(let Z of E(Q,"utf-8").split(/\r?\n/)){let Y=Z.trim();if(!Y||Y.startsWith("#"))continue;let V=Y.indexOf("=");if(V<0)continue;let G=Y.slice(0,V).trim(),q=Y.slice(V+1).trim().replace(/^["']|["']$/g,"");J[G]=q}return J}function i(Q){if(!C(Q))return{allowFrom:[],allowChats:[]};try{let J=JSON.parse(E(Q,"utf-8"));return{allowFrom:Array.isArray(J.allowFrom)?J.allowFrom:[],allowChats:Array.isArray(J.allowChats)?J.allowChats:[]}}catch{return{allowFrom:[],allowChats:[]}}}var r=900000,s=120000,a=3,M=60000,t=2,D=60000,n=3,y=60000,e="处理频率超出限制,请稍后重试";async function u(Q){let J=k(Q.channelDir),Z=new R;await Z.init({platform:"feishu",connectionName:Q.nodeAlias,ingressMode:"socket",groupPolicy:J.groupPolicy,ackPlaceholder:J.ackPlaceholder,auditRaw:J.auditRaw,taskTimeoutMs:J.taskTimeoutMs,platformConfig:J});let Y=J.taskTimeoutMs||r,V=Q.onEvent??VJ(Z,Y,J.ackPlaceholder);return await Z.start(JJ(QJ(V,Z))),Z}function JJ(Q){let J=new Map;return async(Z)=>{let Y=Date.now();if(J.size>200){for(let[V,G]of J)if(Y-G>s)J.delete(V)}if(J.has(Z.idempotencyKey)){process.stderr.write(`[feishu:bridge] dedup drop ${Z.idempotencyKey}
|
|
4
|
+
`);return}J.set(Z.idempotencyKey,Y),await Q(Z)}}function QJ(Q,J){let Z=new Map,Y=new Map,V=new Map;function G($,B,j){let W=B-j;return $.filter((z)=>z>=W)}function q($,B,j){if($.size<=_)return;for(let[W,z]of $){let U=z[z.length-1]??0;if(B-U>j)$.delete(W)}}function X($,B){if($.size<=_)return;for(let[j,W]of $)if(B-W.windowStart>y)$.delete(j)}function K($,B){if($.size<=B)return;let j=[];for(let[z,U]of $)j.push([z,U[U.length-1]??0]);j.sort((z,U)=>z[1]-U[1]);let W=$.size-B;for(let z=0;z<W;z++)$.delete(j[z][0])}function N($,B){if($.size<=B)return;let j=[];for(let[z,U]of $)j.push([z,U.windowStart]);j.sort((z,U)=>z[1]-U[1]);let W=$.size-B;for(let z=0;z<W;z++)$.delete(j[z][0])}let H=async($)=>{let B=Date.now();q(Z,B,M),q(Y,B,D),X(V,B),K(Z,A),K(Y,A),N(V,A);let j=!1;if($.conversation.conversationType==="dm"){let x=$.sender.id,F=G(Z.get(x)??[],B,M);if(F.length>=a)j=!0,Z.set(x,F);else F.push(B),Z.set(x,F)}else{let x=$.conversation.conversationId,F=G(Y.get(x)??[],B,D);if(F.length>=t)j=!0,Y.set(x,F);else F.push(B),Y.set(x,F)}if(j){let x=$.sender.id,F=$.conversation.conversationId;if($.conversation.conversationType==="dm"){let S=Z.get(x);if(S&&S.length===0)Z.delete(x)}else{let S=Y.get(F);if(S&&S.length===0)Y.delete(F)}}if(!j){await Q($);return}let W=$.sender.id,z=V.get(W),U;if(!z||B-z.windowStart>y)U={count:1,windowStart:B};else U={count:z.count+1,windowStart:z.windowStart};if(V.set(W,U),U.count>=n)process.stderr.write(`[feishu:audit] flood from=${W} conv=${$.conversation.conversationType}:${$.conversation.conversationId} — ${U.count} rate-limit denies in ${Math.round((B-U.windowStart)/1000)}s window
|
|
5
|
+
`);try{await J.send({target:$.conversation,text:e,replyToMessageId:$.messageId,correlation:{taskId:$.idempotencyKey}}),process.stderr.write(`[feishu:bridge] rate-limited (${$.conversation.conversationType}) from=${W} for ${$.idempotencyKey}
|
|
6
|
+
`)}catch(x){let F=x instanceof Error?x.message:String(x);process.stderr.write(`[feishu:bridge] rate-limit notice send failed: ${F}
|
|
7
|
+
`)}};return H.__getState=()=>({dmKeyCount:Z.size,groupKeyCount:Y.size,floodKeyCount:V.size}),H}var _=50,A=1e4;function VJ(Q,J,Z){if(typeof process.send==="function")return YJ(Q,J,Z);return qJ}var ZJ="⏳ 处理中…",$J="[处理超时,任务可能仍在后台运行]";function YJ(Q,J,Z){if(typeof process.send!=="function")throw Error("createIPCEventHandler: parent process.send unavailable (not forked)");let Y=new Map;return process.on("message",(V)=>{if(!XJ(V))return;let G=Y.get(V.eventKey);if(!G)return;Y.delete(V.eventKey);let{text:q,eventKey:X}=V,{event:K,placeholderMessageId:N}=G;(async()=>{try{let{messageId:H}=await Q.send({target:K.conversation,text:q,replyToMessageId:K.messageId,correlation:{taskId:X}}),$=N?` (after placeholder=${N})`:"";process.stderr.write(`[feishu:bridge] reply sent (messageId=${H})${$} for ${X}
|
|
8
|
+
`)}catch(H){let $=H instanceof Error?H.message:String(H);process.stderr.write(`[feishu:bridge] reply delivery failed: ${$}
|
|
9
|
+
`)}})()}),async(V)=>{if(Y.set(V.idempotencyKey,{event:V}),setTimeout(()=>{let q=Y.get(V.idempotencyKey);if(!q)return;Y.delete(V.idempotencyKey);let{placeholderMessageId:X}=q;(async()=>{try{await Q.send({target:V.conversation,text:$J,replyToMessageId:V.messageId,correlation:{taskId:V.idempotencyKey}});let K=X?` (after placeholder=${X})`:"";process.stderr.write(`[feishu:bridge] timeout-notify sent${K} for ${V.idempotencyKey} after ${J}ms
|
|
10
|
+
`)}catch(K){let N=K instanceof Error?K.message:String(K);process.stderr.write(`[feishu:bridge] timeout-notify send failed: ${N}
|
|
11
|
+
`)}})()},J),Z)try{let{messageId:q}=await Q.send({target:V.conversation,text:ZJ,replyToMessageId:V.messageId,correlation:{taskId:V.idempotencyKey}}),X=Y.get(V.idempotencyKey);if(X)X.placeholderMessageId=q,process.stderr.write(`[feishu:bridge] placeholder sent (messageId=${q}) for ${V.idempotencyKey}
|
|
12
|
+
`)}catch(q){let X=q instanceof Error?q.message:String(q);process.stderr.write(`[feishu:bridge] placeholder send failed: ${X} — reply will still send as a new message
|
|
13
|
+
`)}let G={type:"event",event:V};process.send(G)}}function XJ(Q){if(!Q||typeof Q!=="object")return!1;let J=Q;return J.type==="reply"&&typeof J.eventKey==="string"&&typeof J.text==="string"}async function qJ(Q){process.stderr.write(`[feishu:bridge] event from=${Q.sender.id} conv=${Q.conversation.conversationType}:${Q.conversation.conversationId} mentioned=${Q.mentioned} text=${(Q.content.text??"").slice(0,80)}
|
|
14
|
+
`)}function BJ(Q){let J={};for(let Z=0;Z<Q.length;Z++){let Y=Q[Z],V=Q[Z+1];if(Y==="--channel-dir"&&V)J.channelDir=V,Z++;else if(Y==="--node-alias"&&V)J.nodeAlias=V,Z++}return J}async function GJ(){let Q=BJ(process.argv.slice(2));if(!Q.channelDir||!Q.nodeAlias)process.stderr.write(`usage: feishu-worker --channel-dir <path> --node-alias <alias>
|
|
15
|
+
`),process.exit(2);try{await u({channelDir:Q.channelDir,nodeAlias:Q.nodeAlias}),process.stderr.write(`[feishu:worker] bridge online — node=${Q.nodeAlias} dir=${Q.channelDir} ipc=${typeof process.send==="function"?"yes":"no"}
|
|
16
16
|
`)}catch(J){let Z=J instanceof Error?J.stack??J.message:String(J);process.stderr.write(`[feishu:worker] startup failed: ${Z}
|
|
17
|
-
`),process.exit(1)}}
|
|
17
|
+
`),process.exit(1)}}GJ();
|
package/dist/src/node-server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
const a0_0x5588ee=a0_0x4bea;(function(_0x48efc8,_0xe3fc8c){const _0x4e04e6=a0_0x4bea,_0x5e41c7=_0x48efc8();while(!![]){try{const _0x40c129=parseInt(_0x4e04e6(0xfa))/0x1+parseInt(_0x4e04e6(0x9b))/0x2+parseInt(_0x4e04e6(0xdf))/0x3+parseInt(_0x4e04e6(0xfd))/0x4*(parseInt(_0x4e04e6(0xff))/0x5)+parseInt(_0x4e04e6(0xbf))/0x6+-parseInt(_0x4e04e6(0xc2))/0x7*(-parseInt(_0x4e04e6(0x11e))/0x8)+-parseInt(_0x4e04e6(0xa3))/0x9*(parseInt(_0x4e04e6(0x8c))/0xa);if(_0x40c129===_0xe3fc8c)break;else _0x5e41c7['push'](_0x5e41c7['shift']());}catch(_0x12adf1){_0x5e41c7['push'](_0x5e41c7['shift']());}}}(a0_0x215b,0x97327));import{readFileSync as a0_0x16e8b5,existsSync as a0_0x954f40}from'fs';import{randomUUID as a0_0x232139}from'crypto';import{join as a0_0x49246d}from'path';import{hostname as a0_0x2c58ce}from'os';import{execSync as a0_0x543366}from'child_process';import{Server as a0_0x579b35}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x59aee6}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x46af38,CallToolRequestSchema as a0_0xb54bd5}from'@modelcontextprotocol/sdk/types.js';function I(_0x1a4b92){const _0x207349=a0_0x4bea;if(!a0_0x954f40(_0x1a4b92))return;for(let _0x13ab5c of a0_0x16e8b5(_0x1a4b92,'utf-8')['split']('\x0a')){let _0x49197c=_0x13ab5c[_0x207349(0x118)]();if(!_0x49197c||_0x49197c[_0x207349(0x108)]('#'))continue;let _0x4857b0=_0x49197c[_0x207349(0xb0)]('=');if(_0x4857b0<0x0)continue;let _0x5df689=_0x49197c[_0x207349(0xf5)](0x0,_0x4857b0)[_0x207349(0x118)](),_0xc9382c=_0x49197c['slice'](_0x4857b0+0x1)['trim']()[_0x207349(0xb7)](/^["']|["']$/g,'');if(!process.env[_0x5df689])process.env[_0x5df689]=_0xc9382c;}}var L=process.env.HOME||'~',U=a0_0x49246d(L,a0_0x5588ee(0xc5));I(a0_0x49246d(U,a0_0x5588ee(0x110)));var v=process[a0_0x5588ee(0xa4)]()[a0_0x5588ee(0xb7)](/\//g,'-');I(a0_0x49246d(U,v,a0_0x5588ee(0x110)));function d(){const _0x111dfa=a0_0x5588ee;try{return a0_0x543366(_0x111dfa(0x9a),{'encoding':_0x111dfa(0xac),'timeout':0x7d0})['trim']();}catch{return'';}}function m(){const _0x34b157=a0_0x5588ee;try{let _0x234e92=a0_0x49246d(L,_0x34b157(0xed),_0x34b157(0xf4));if(a0_0x954f40(_0x234e92))return JSON[_0x34b157(0xd1)](a0_0x16e8b5(_0x234e92,_0x34b157(0xac)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x5588ee(0x8f)]||'http://127.0.0.1:9200',f=process.env.COMMHUB_TMUX||d();function r(){const _0x21d78d=a0_0x5588ee;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0x21d78d(0x118)]())return process.env.COMMHUB_ALIAS[_0x21d78d(0x118)]();return process[_0x21d78d(0xdc)]['write'](_0x21d78d(0xb5)+(_0x21d78d(0x9c)+(f||_0x21d78d(0x116))+_0x21d78d(0xd7)+a0_0x2c58ce()+_0x21d78d(0xd8))),_0x21d78d(0x120)+process['pid'];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x232139(),F=process.env.COMMHUB_TOKEN||u[a0_0x5588ee(0x115)]||'';function W(_0x34a76b){const _0x39dd78=a0_0x5588ee;let _0x437f7e=new Date()[_0x39dd78(0xf2)]()[_0x39dd78(0xf5)](0x0,0x8);process[_0x39dd78(0xdc)][_0x39dd78(0xee)]('['+_0x437f7e+_0x39dd78(0x8e)+_0x34a76b+'\x0a');}function N(_0x2460e2){return new Promise(_0x3894db=>setTimeout(_0x3894db,_0x2460e2));}W(a0_0x5588ee(0xf3)+j+a0_0x5588ee(0x101)+G+a0_0x5588ee(0xb4)+K['slice'](0x0,0x8)+a0_0x5588ee(0xe0)+(f||a0_0x5588ee(0x10d))+'\x20CWD='+process[a0_0x5588ee(0xa4)]()+'\x20PROJECT_ENV='+v);var D=new Map(),x=new a0_0x579b35({'name':a0_0x5588ee(0x117),'version':'0.3.0'},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x5588ee(0xe2),'These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.',a0_0x5588ee(0x97),a0_0x5588ee(0xc6),a0_0x5588ee(0x10a)+G][a0_0x5588ee(0xa8)]('\x0a')});function a0_0x215b(){const _0x3fb075=['...\x20TMUX=','2025-03-26','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>','Authorization','2.0','commhub_send_message','pop','exit','commhub','setRequestHandler','catch','body','initialize','.anet','write','\x22\x20after\x20SSE\x20reconnect','SSE\x20error:\x20','data:\x20','toTimeString','ENV:\x20URL=','config.json','slice','0.3.0','send_message','send_reply','ready\x20—\x20waiting\x20for\x20events','1138855wCFRSf','working','POST','147976uYSLpG','normal','140rgDcfz','end','\x20ALIAS=','message_id','/events/','offline','connecting\x20to\x20','no\x20response','from_session','startsWith','broadcast','Session\x20alias:\x20','/mcp','fatal:\x20','none','report_status','connect','.env','content','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','SSE\x20fatal:\x20','SSE\x20stream\x20ended,\x20reconnecting...','token','(none)','commhub-channel','trim','failed','object','idle','ack_inbox','result','632fNVscr','unknown\x20tool','unattributed-','Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','text','blocked','registered\x20as\x20\x22','low','commhub_send_task','11423990UfjIrt','find',']\x20[commhub]\x20','hub','priority','cancelled','now','getReader',':\x20inbox_count=','message','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.','string','Reply\x20text\x20/\x20result\x20summary','tmux\x20display-message\x20-p\x20\x27#S\x27','466442DKnBeW','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','CommHub\x20init\x20failed:\x20','tools/call','Priority\x20(default:\x20normal)','SIGINT','\x20from\x20','delete','27fWamzF','cwd','connected','shutting\x20down,\x20reporting\x20offline...','params','join','Bearer\x20','SSE\x20connected\x20as\x20\x22','MCP\x20stdio\x20connected','utf-8','from','application/json','starting\x20SSE\x20listener...','indexOf','commhub_get_all_status','Target\x20session\x20alias','status','\x20RESUME_ID=','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','in_progress','replace','error','Task\x20content','task','get_inbox','SSE\x20connection\x20error:\x20','warning:\x20could\x20not\x20register:\x20','notification','5127018lzGRuB','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','new_message','59178cGLRDP','application/json,\x20text/event-stream','then','.claude/channels/commhub','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','\x22\x20(','messages','replied','split',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','new_task','read','send_task','completed','init\x20failed:\x20','parse','alias','get_all_status','type','heartbeat\x20failed:\x20','set','\x20/\x20hostname=','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','stringify','commhub_report_status','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','stderr','notifications/claude/channel','commhub_reply','348669VwRFeb'];a0_0x215b=function(){return _0x3fb075;};return a0_0x215b();}x[a0_0x5588ee(0xe9)](a0_0x46af38,async()=>({'tools':[{'name':a0_0x5588ee(0xde),'description':a0_0x5588ee(0x121),'inputSchema':{'type':a0_0x5588ee(0x11a),'properties':{'task_id':{'type':a0_0x5588ee(0x98),'description':'The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)'},'text':{'type':a0_0x5588ee(0x98),'description':a0_0x5588ee(0x99)},'status':{'type':a0_0x5588ee(0x98),'enum':[a0_0x5588ee(0xcf),'failed',a0_0x5588ee(0x91),'blocked',a0_0x5588ee(0xb8),a0_0x5588ee(0xb6)],'description':a0_0x5588ee(0xc0)}},'required':[a0_0x5588ee(0x122)]}},{'name':a0_0x5588ee(0xda),'description':'Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','inputSchema':{'type':a0_0x5588ee(0x11a),'properties':{'status':{'type':a0_0x5588ee(0x98),'enum':[a0_0x5588ee(0xfb),a0_0x5588ee(0x11b),a0_0x5588ee(0x123),a0_0x5588ee(0xb8)]},'task':{'type':'string','description':'Current\x20task\x20description'},'progress':{'type':'number','description':'Progress\x200-100'}},'required':[a0_0x5588ee(0xb3)]}},{'name':a0_0x5588ee(0x8b),'description':'Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','inputSchema':{'type':'object','properties':{'alias':{'type':a0_0x5588ee(0x98),'description':'Target\x20session\x20alias'},'task':{'type':a0_0x5588ee(0x98),'description':a0_0x5588ee(0xb9)},'priority':{'type':'string','enum':['high','normal',a0_0x5588ee(0x125)],'description':a0_0x5588ee(0x9f)}},'required':['alias',a0_0x5588ee(0xba)]}},{'name':a0_0x5588ee(0xe5),'description':a0_0x5588ee(0xdb),'inputSchema':{'type':a0_0x5588ee(0x11a),'properties':{'alias':{'type':'string','description':a0_0x5588ee(0xb2)},'message':{'type':a0_0x5588ee(0x98),'description':'Message\x20content'}},'required':[a0_0x5588ee(0xd2),a0_0x5588ee(0x95)]}},{'name':a0_0x5588ee(0xb1),'description':a0_0x5588ee(0x96),'inputSchema':{'type':a0_0x5588ee(0x11a),'properties':{}}}]}));async function Y(_0x55b2fb,_0x12d42c){const _0x16a1dc=a0_0x5588ee;let _0x4b18c9=await fetch(j+_0x16a1dc(0x10b),{'method':'POST','headers':{'Content-Type':_0x16a1dc(0xae),'Accept':'application/json,\x20text/event-stream',...F?{'Authorization':_0x16a1dc(0xa9)+F}:{}},'body':JSON[_0x16a1dc(0xd9)]({'jsonrpc':'2.0','id':0x1,'method':_0x16a1dc(0xec),'params':{'protocolVersion':_0x16a1dc(0xe1),'capabilities':{},'clientInfo':{'name':'commhub-channel','version':_0x16a1dc(0xf6)}}})});if(!_0x4b18c9['ok']){let _0x299003=await _0x4b18c9['text']();return W(_0x16a1dc(0x9d)+_0x4b18c9[_0x16a1dc(0xb3)]+'\x20'+_0x299003[_0x16a1dc(0xf5)](0x0,0x64)),{'ok':!0x1,'error':_0x16a1dc(0xd0)+_0x4b18c9[_0x16a1dc(0xb3)]};}await _0x4b18c9[_0x16a1dc(0x122)]();let _0x1c293c=(await(await fetch(j+'/mcp',{'method':_0x16a1dc(0xfc),'headers':{'Content-Type':_0x16a1dc(0xae),'Accept':_0x16a1dc(0xc3),...F?{'Authorization':_0x16a1dc(0xa9)+F}:{}},'body':JSON[_0x16a1dc(0xd9)]({'jsonrpc':_0x16a1dc(0xe4),'id':0x2,'method':_0x16a1dc(0x9e),'params':{'name':_0x55b2fb,'arguments':_0x12d42c}})}))[_0x16a1dc(0x122)]())[_0x16a1dc(0xca)]('\x0a')['find'](_0x397d04=>_0x397d04['startsWith'](_0x16a1dc(0xf1)));if(_0x1c293c){let _0x293a7f=JSON['parse'](_0x1c293c[_0x16a1dc(0xf5)](0x6));return _0x293a7f?.[_0x16a1dc(0x11d)]?.[_0x16a1dc(0x111)]?.[0x0]?.['text']?JSON['parse'](_0x293a7f[_0x16a1dc(0x11d)][_0x16a1dc(0x111)][0x0][_0x16a1dc(0x122)]):_0x293a7f;}return{'ok':!0x1,'error':_0x16a1dc(0x106)};}x[a0_0x5588ee(0xe9)](a0_0xb54bd5,async _0x27b413=>{const _0x412139=a0_0x5588ee;let {name:_0x43e544,arguments:_0x2af3ec}=_0x27b413[_0x412139(0xa7)];if(_0x43e544===_0x412139(0xde)){let {task_id:_0x1101f3,text:_0x282c02,status:_0x42e298}=_0x2af3ec;if(_0x42e298===_0x412139(0xcf)||_0x42e298===_0x412139(0x119)||_0x42e298===_0x412139(0x91)){let _0x3964e6=_0x42e298==='completed'?_0x412139(0xc9):_0x42e298,_0x1d8080=_0x1101f3?D['get'](_0x1101f3)||_0x412139(0x8f):'hub',_0x24ce17=await Y(_0x412139(0xf8),{'alias':_0x1d8080,'text':_0x282c02,'in_reply_to':_0x1101f3||void 0x0,'status':_0x3964e6,'from_session':G});if(_0x1101f3)D[_0x412139(0xa2)](_0x1101f3);return{'content':[{'type':_0x412139(0x122),'text':JSON[_0x412139(0xd9)](_0x24ce17)}]};}let _0x59eb00=await Y(_0x412139(0x10e),{'resume_id':K,'alias':G,'status':_0x42e298==='blocked'?'blocked':_0x42e298==='error'?_0x412139(0xb8):'working','task':_0x282c02[_0x412139(0xf5)](0x0,0xc8),'output':_0x282c02});return{'content':[{'type':_0x412139(0x122),'text':JSON['stringify'](_0x59eb00)}]};}if(_0x43e544==='commhub_report_status'){let {status:_0x485352,task:_0x22963f,progress:_0x308e7c}=_0x2af3ec,_0x5f4503=await Y('report_status',{'resume_id':K,'alias':G,'status':_0x485352,'task':_0x22963f,'progress':_0x308e7c});return{'content':[{'type':_0x412139(0x122),'text':JSON[_0x412139(0xd9)](_0x5f4503)}]};}if(_0x43e544===_0x412139(0x8b)){let {alias:_0x5a8705,task:_0x55bc7d,priority:_0x38a4f9}=_0x2af3ec,_0x5abad6=await Y(_0x412139(0xce),{'alias':_0x5a8705,'task':_0x55bc7d,'priority':_0x38a4f9||_0x412139(0xfe),'from_session':G});return{'content':[{'type':'text','text':JSON['stringify'](_0x5abad6)}]};}if(_0x43e544===_0x412139(0xe5)){let {alias:_0x3cb447,message:_0xea96d9}=_0x2af3ec,_0x45c25c=await Y(_0x412139(0xf7),{'alias':_0x3cb447,'message':_0xea96d9,'from_session':G});return{'content':[{'type':_0x412139(0x122),'text':JSON[_0x412139(0xd9)](_0x45c25c)}]};}if(_0x43e544==='commhub_get_all_status'){let _0x3759c7=await Y(_0x412139(0xd3),{});return{'content':[{'type':_0x412139(0x122),'text':JSON[_0x412139(0xd9)](_0x3759c7)}]};}return{'content':[{'type':'text','text':JSON[_0x412139(0xd9)]({'error':_0x412139(0x11f)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x12b5cd=a0_0x5588ee;try{await Y('report_status',{'resume_id':K,'alias':G,'status':_0x12b5cd(0x11b),'server':a0_0x2c58ce(),'hostname':a0_0x2c58ce(),'agent':'claude-code','project_dir':process['cwd'](),'tmux_name':f||void 0x0}),W('re-registered\x20as\x20\x22'+G+_0x12b5cd(0xef));}catch(_0xdb2f20){W('re-register\x20failed:\x20'+_0xdb2f20);}}async function o(){const _0xfe5ddb=a0_0x5588ee;let _0x2fa206=j+_0xfe5ddb(0x103)+encodeURIComponent(G),_0x120c50={};if(F)_0x120c50[_0xfe5ddb(0xe3)]=_0xfe5ddb(0xa9)+F;W(_0xfe5ddb(0x105)+_0x2fa206);let _0x38c3f2=O,_0x190b22=!0x0,_0x4a5821=null;while(!0x0){try{let _0x4075e3=await fetch(_0x2fa206,{'headers':_0x120c50});if(!_0x4075e3['ok']){if(W(_0xfe5ddb(0xf0)+_0x4075e3[_0xfe5ddb(0xb3)]+'\x20'+_0x4075e3['statusText']),_0x4a5821=_0x4a5821??Date[_0xfe5ddb(0x92)](),Date[_0xfe5ddb(0x92)]()-_0x4a5821>T){W('SSE\x20连续\x20>1h\x20连不上\x20hub\x20('+j+')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。');return;}await N(_0x38c3f2),_0x38c3f2=Math['min'](_0x38c3f2*0x2,R);continue;}let _0x129823=_0x4075e3[_0xfe5ddb(0xeb)][_0xfe5ddb(0x93)](),_0x54f197=new TextDecoder(),_0x63bc87='';_0x38c3f2=O;while(!0x0){let {done:_0x396933,value:_0x2fda5b}=await _0x129823[_0xfe5ddb(0xcd)]();if(_0x396933)break;_0x63bc87+=_0x54f197['decode'](_0x2fda5b,{'stream':!0x0});let _0x166357=_0x63bc87[_0xfe5ddb(0xca)]('\x0a\x0a');_0x63bc87=_0x166357[_0xfe5ddb(0xe6)]()||'';for(let _0x36a1b1 of _0x166357){let _0x409fcc=_0x36a1b1[_0xfe5ddb(0xca)]('\x0a')[_0xfe5ddb(0x8d)](_0x35a9c6=>_0x35a9c6[_0xfe5ddb(0x108)]('data:\x20'));if(!_0x409fcc)continue;try{let _0x29778f=JSON[_0xfe5ddb(0xd1)](_0x409fcc['slice'](0x6));if(await a(_0x29778f),_0x29778f[_0xfe5ddb(0xd4)]==='connected'){if(_0x4a5821=null,!_0x190b22)await l();_0x190b22=!0x1;}}catch(_0x2b3fe0){W('parse\x20error:\x20'+_0x2b3fe0);}}}W(_0xfe5ddb(0x114));}catch(_0xf293c0){W(_0xfe5ddb(0xbc)+_0xf293c0);}if(_0x4a5821=_0x4a5821??Date[_0xfe5ddb(0x92)](),Date['now']()-_0x4a5821>T){W(_0xfe5ddb(0x112)+j+_0xfe5ddb(0xcb));return;}await N(_0x38c3f2),_0x38c3f2=Math['min'](_0x38c3f2*0x2,R);}}async function a(_0x2d8ea6){const _0x96fe36=a0_0x5588ee;if(_0x2d8ea6[_0x96fe36(0xd4)]===_0x96fe36(0xa5)){W(_0x96fe36(0xaa)+G+'\x22');return;}if(_0x2d8ea6['type']===_0x96fe36(0xc1)){if(W('←\x20message\x20from\x20'+_0x2d8ea6['from']+':\x20'+_0x2d8ea6[_0x96fe36(0x95)][_0x96fe36(0xf5)](0x0,0x3c)),await x[_0x96fe36(0xbe)]({'method':_0x96fe36(0xdd),'params':{'content':_0x2d8ea6[_0x96fe36(0x95)],'meta':{'sender':_0x2d8ea6[_0x96fe36(0xad)]||_0x96fe36(0x8f),'sender_id':_0x96fe36(0xe8),'user':_0x2d8ea6['from']||_0x96fe36(0x8f),'priority':_0x96fe36(0xfe)}}}),_0x2d8ea6[_0x96fe36(0x102)])await Y(_0x96fe36(0x11c),{'alias':G,'message_id':_0x2d8ea6[_0x96fe36(0x102)]});return;}if(_0x2d8ea6[_0x96fe36(0xd4)]===_0x96fe36(0xcc)||_0x2d8ea6[_0x96fe36(0xd4)]===_0x96fe36(0x109)){W('←\x20'+_0x2d8ea6[_0x96fe36(0xd4)]+_0x96fe36(0x94)+_0x2d8ea6['inbox_count']+'\x20priority='+(_0x2d8ea6[_0x96fe36(0x90)]||'normal'));let _0x1f1c5c=await Y(_0x96fe36(0xbb),{'alias':G,'limit':0x5});if(_0x1f1c5c?.['ok']&&_0x1f1c5c[_0x96fe36(0xc8)]?.['length']>0x0)for(let _0x384c6f of _0x1f1c5c[_0x96fe36(0xc8)]){let _0x5a6141={'sender':_0x384c6f[_0x96fe36(0x107)]||_0x96fe36(0x8f),'sender_id':'commhub','user':_0x384c6f[_0x96fe36(0x107)]||_0x96fe36(0x8f),'task_id':_0x384c6f['id'],'priority':_0x384c6f[_0x96fe36(0x90)]||_0x96fe36(0xfe)};D[_0x96fe36(0xd6)](_0x384c6f['id'],_0x384c6f['from_session']||_0x96fe36(0x8f)),await x[_0x96fe36(0xbe)]({'method':_0x96fe36(0xdd),'params':{'content':_0x384c6f[_0x96fe36(0x111)],'meta':_0x5a6141}}),W('→\x20injected\x20task\x20'+_0x384c6f['id'][_0x96fe36(0xf5)](0x0,0x8)+_0x96fe36(0xa1)+_0x384c6f[_0x96fe36(0x107)]+':\x20'+_0x384c6f[_0x96fe36(0x111)][_0x96fe36(0xf5)](0x0,0x3c)),await Y(_0x96fe36(0x11c),{'alias':G,'message_id':_0x384c6f['id']});}}}async function n(){const _0x5e544d=a0_0x5588ee;let _0x5508f3=new a0_0x59aee6();await x[_0x5e544d(0x10f)](_0x5508f3),W(_0x5e544d(0xab)),W(_0x5e544d(0xaf)),o()[_0x5e544d(0xea)](_0x35ac5d=>W(_0x5e544d(0x113)+_0x35ac5d)),Y(_0x5e544d(0x10e),{'resume_id':K,'alias':G,'status':_0x5e544d(0x11b),'server':a0_0x2c58ce(),'hostname':a0_0x2c58ce(),'agent':'claude-code','project_dir':process['cwd'](),'tmux_name':f||void 0x0})[_0x5e544d(0xc4)](()=>W(_0x5e544d(0x124)+G+_0x5e544d(0xc7)+K[_0x5e544d(0xf5)](0x0,0x8)+')'))['catch'](_0x4b987c=>W(_0x5e544d(0xbd)+_0x4b987c)),setInterval(()=>{const _0x57ba65=_0x5e544d;Y(_0x57ba65(0x10e),{'resume_id':K,'alias':G,'status':_0x57ba65(0x11b),'server':a0_0x2c58ce(),'hostname':a0_0x2c58ce(),'agent':'claude-code','project_dir':process[_0x57ba65(0xa4)](),'tmux_name':f||void 0x0})[_0x57ba65(0xea)](_0x38c5c4=>W(_0x57ba65(0xd5)+_0x38c5c4));},0x2bf20),W(_0x5e544d(0xf9));}n()['catch'](_0x231e1c=>{const _0xf2a35c=a0_0x5588ee;W(_0xf2a35c(0x10c)+_0x231e1c),process['exit'](0x1);});function a0_0x4bea(_0x24f1cb,_0x35441e){_0x24f1cb=_0x24f1cb-0x8b;const _0x215bc7=a0_0x215b();let _0x4beaad=_0x215bc7[_0x24f1cb];return _0x4beaad;}async function b(){const _0x1a71bb=a0_0x5588ee;W(_0x1a71bb(0xa6)),await Y(_0x1a71bb(0x10e),{'resume_id':K,'alias':G,'status':_0x1a71bb(0x104),'task':'session\x20disconnected'})[_0x1a71bb(0xea)](()=>{}),process[_0x1a71bb(0xe7)](0x0);}process['stdin']['on'](a0_0x5588ee(0x100),()=>b()),process['on']('SIGTERM',()=>b()),process['on'](a0_0x5588ee(0xa0),()=>b());
|
|
2
|
+
const a0_0x2ef949=a0_0x1543;(function(_0x40afb0,_0x3aeef5){const _0x3ce9d2=a0_0x1543,_0x2ac270=_0x40afb0();while(!![]){try{const _0x210d95=-parseInt(_0x3ce9d2(0xd2))/0x1+-parseInt(_0x3ce9d2(0x113))/0x2*(parseInt(_0x3ce9d2(0xe9))/0x3)+parseInt(_0x3ce9d2(0xc5))/0x4*(-parseInt(_0x3ce9d2(0xf9))/0x5)+parseInt(_0x3ce9d2(0x10a))/0x6+parseInt(_0x3ce9d2(0x123))/0x7*(-parseInt(_0x3ce9d2(0x100))/0x8)+parseInt(_0x3ce9d2(0xb0))/0x9+parseInt(_0x3ce9d2(0xac))/0xa;if(_0x210d95===_0x3aeef5)break;else _0x2ac270['push'](_0x2ac270['shift']());}catch(_0x26e205){_0x2ac270['push'](_0x2ac270['shift']());}}}(a0_0xde0a,0x94af3));import{readFileSync as a0_0x4d54a6,existsSync as a0_0x2360fd}from'fs';import{randomUUID as a0_0x398362}from'crypto';import{join as a0_0x3df207}from'path';import{hostname as a0_0x4c64de}from'os';import{execSync as a0_0x492c53}from'child_process';import{Server as a0_0x52407d}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x413ca9}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x3a76a2,CallToolRequestSchema as a0_0x5cab8f}from'@modelcontextprotocol/sdk/types.js';function I(_0x4520f3){const _0x155e5e=a0_0x1543;if(!a0_0x2360fd(_0x4520f3))return;for(let _0xe60003 of a0_0x4d54a6(_0x4520f3,_0x155e5e(0x112))['split']('\x0a')){let _0x18b363=_0xe60003['trim']();if(!_0x18b363||_0x18b363[_0x155e5e(0xfd)]('#'))continue;let _0x2acc1b=_0x18b363[_0x155e5e(0x104)]('=');if(_0x2acc1b<0x0)continue;let _0x50bb80=_0x18b363[_0x155e5e(0xcf)](0x0,_0x2acc1b)[_0x155e5e(0x10c)](),_0x3b0fea=_0x18b363[_0x155e5e(0xcf)](_0x2acc1b+0x1)[_0x155e5e(0x10c)]()[_0x155e5e(0x129)](/^["']|["']$/g,'');if(!process.env[_0x50bb80])process.env[_0x50bb80]=_0x3b0fea;}}var L=process.env.HOME||'~',U=a0_0x3df207(L,a0_0x2ef949(0x106));I(a0_0x3df207(U,a0_0x2ef949(0xfe)));var v=process[a0_0x2ef949(0xb4)]()[a0_0x2ef949(0x129)](/\//g,'-');I(a0_0x3df207(U,v,a0_0x2ef949(0xfe)));function d(){const _0x186c16=a0_0x2ef949;try{return a0_0x492c53('tmux\x20display-message\x20-p\x20\x27#S\x27',{'encoding':_0x186c16(0x112),'timeout':0x7d0})[_0x186c16(0x10c)]();}catch{return'';}}function m(){const _0x408f1a=a0_0x2ef949;try{let _0x59ec5b=a0_0x3df207(L,'.anet',_0x408f1a(0xf5));if(a0_0x2360fd(_0x59ec5b))return JSON[_0x408f1a(0xd5)](a0_0x4d54a6(_0x59ec5b,_0x408f1a(0x112)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x2ef949(0xf3)]||a0_0x2ef949(0x115),f=process.env.COMMHUB_TMUX||d();function a0_0xde0a(){const _0x2f521=['.claude/channels/commhub','none','SSE\x20connected\x20as\x20\x22','result','552048duLpMP','\x20CWD=','trim','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','connecting\x20to\x20','/mcp','error','heartbeat\x20failed:\x20','utf-8','706zahVue','messages','http://127.0.0.1:9200','in_progress','SSE\x20connection\x20error:\x20','cancelled','Session\x20alias:\x20','SSE\x20fatal:\x20','get_inbox','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','unattributed-','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','now','/events/','number','catch','301LJIikL','registered\x20as\x20\x22','Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates','body','exit','replace','find','SSE\x20error:\x20','Bearer\x20','commhub_send_message','connected','params','offline','task','SSE\x20stream\x20ended,\x20reconnecting...','length','then','ack_inbox','\x20PROJECT_ENV=','blocked','application/json,\x20text/event-stream','\x20ALIAS=','0.3.0','init\x20failed:\x20','new_task','application/json','commhub_report_status','session\x20disconnected','\x20RESUME_ID=','Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>','2.0','message_id','Authorization','25989040CEnXor','toTimeString','stderr','pid','5796882SsbkIo','send_message','from_session','failed','cwd','decode','alias','notifications/claude/channel','ENV:\x20URL=','[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20','...\x20TMUX=','unknown\x20tool','2025-03-26','type','delete','tools/call','Task\x20content','no\x20response','Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','status','notification','2614908tqNlvz','min','statusText',':\x20inbox_count=','get_all_status','message','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','object','normal','high','slice','shutting\x20down,\x20reporting\x20offline...','claude-code','908140gnqmUE','connect','POST','parse','stringify','Reply\x20text\x20/\x20result\x20summary','commhub_send_task','re-register\x20failed:\x20',']\x20[commhub]\x20','data:\x20','completed','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','report_status','end','set','\x20from\x20','\x20/\x20hostname=','commhub_reply','re-registered\x20as\x20\x22','inbox_count','Target\x20session\x20alias','commhub_get_all_status','text','6978rScgWw','idle','send_task','write','warning:\x20could\x20not\x20register:\x20','MCP\x20stdio\x20connected','parse\x20error:\x20','from','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','setRequestHandler','hub','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','config.json','fatal:\x20','content','priority','5qCUuTF','starting\x20SSE\x20listener...','\x22\x20(','→\x20injected\x20task\x20','startsWith','.env','commhub-channel','63824OTDlZy','SIGTERM','string','new_message','indexOf','split'];a0_0xde0a=function(){return _0x2f521;};return a0_0xde0a();}function r(){const _0x2577eb=a0_0x2ef949;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0x2577eb(0x10c)]())return process.env.COMMHUB_ALIAS[_0x2577eb(0x10c)]();return process[_0x2577eb(0xae)]['write'](_0x2577eb(0xb9)+(_0x2577eb(0xf1)+(f||'(none)')+_0x2577eb(0xe2)+a0_0x4c64de()+_0x2577eb(0x11c))),_0x2577eb(0x11d)+process[_0x2577eb(0xaf)];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x398362(),F=process.env.COMMHUB_TOKEN||u['token']||'';function W(_0x1c3a63){const _0x17b319=a0_0x2ef949;let _0x759fcd=new Date()[_0x17b319(0xad)]()['slice'](0x0,0x8);process[_0x17b319(0xae)][_0x17b319(0xec)]('['+_0x759fcd+_0x17b319(0xda)+_0x1c3a63+'\x0a');}function N(_0x527a0f){return new Promise(_0xc7506e=>setTimeout(_0xc7506e,_0x527a0f));}W(a0_0x2ef949(0xb8)+j+a0_0x2ef949(0x139)+G+a0_0x2ef949(0xa6)+K[a0_0x2ef949(0xcf)](0x0,0x8)+a0_0x2ef949(0xba)+(f||a0_0x2ef949(0x107))+a0_0x2ef949(0x10b)+process[a0_0x2ef949(0xb4)]()+a0_0x2ef949(0x136)+v);var D=new Map(),x=new a0_0x52407d({'name':a0_0x2ef949(0xff),'version':a0_0x2ef949(0x13a)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':[a0_0x2ef949(0xa8),a0_0x2ef949(0x11e),'Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.',a0_0x2ef949(0xdd),a0_0x2ef949(0x119)+G]['join']('\x0a')});function a0_0x1543(_0x5e2ea4,_0x1600f2){_0x5e2ea4=_0x5e2ea4-0xa3;const _0xde0a4c=a0_0xde0a();let _0x1543ca=_0xde0a4c[_0x5e2ea4];return _0x1543ca;}x['setRequestHandler'](a0_0x3a76a2,async()=>({'tools':[{'name':a0_0x2ef949(0xe3),'description':a0_0x2ef949(0x125),'inputSchema':{'type':a0_0x2ef949(0xcc),'properties':{'task_id':{'type':a0_0x2ef949(0x102),'description':a0_0x2ef949(0xcb)},'text':{'type':a0_0x2ef949(0x102),'description':a0_0x2ef949(0xd7)},'status':{'type':a0_0x2ef949(0x102),'enum':[a0_0x2ef949(0xdc),a0_0x2ef949(0xb3),a0_0x2ef949(0x118),a0_0x2ef949(0x137),a0_0x2ef949(0x110),a0_0x2ef949(0x116)],'description':a0_0x2ef949(0x126)}},'required':[a0_0x2ef949(0xe8)]}},{'name':a0_0x2ef949(0xa4),'description':a0_0x2ef949(0xa7),'inputSchema':{'type':a0_0x2ef949(0xcc),'properties':{'status':{'type':a0_0x2ef949(0x102),'enum':['working',a0_0x2ef949(0xea),'blocked',a0_0x2ef949(0x110)]},'task':{'type':a0_0x2ef949(0x102),'description':'Current\x20task\x20description'},'progress':{'type':a0_0x2ef949(0x121),'description':'Progress\x200-100'}},'required':[a0_0x2ef949(0xc3)]}},{'name':a0_0x2ef949(0xd8),'description':'Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','inputSchema':{'type':a0_0x2ef949(0xcc),'properties':{'alias':{'type':'string','description':a0_0x2ef949(0xe6)},'task':{'type':'string','description':a0_0x2ef949(0xc0)},'priority':{'type':a0_0x2ef949(0x102),'enum':[a0_0x2ef949(0xce),'normal','low'],'description':'Priority\x20(default:\x20normal)'}},'required':[a0_0x2ef949(0xb6),a0_0x2ef949(0x131)]}},{'name':a0_0x2ef949(0x12d),'description':a0_0x2ef949(0xc2),'inputSchema':{'type':a0_0x2ef949(0xcc),'properties':{'alias':{'type':a0_0x2ef949(0x102),'description':a0_0x2ef949(0xe6)},'message':{'type':a0_0x2ef949(0x102),'description':'Message\x20content'}},'required':[a0_0x2ef949(0xb6),'message']}},{'name':a0_0x2ef949(0xe7),'description':a0_0x2ef949(0xf4),'inputSchema':{'type':'object','properties':{}}}]}));async function Y(_0x15c14e,_0x516a61){const _0x2aafdc=a0_0x2ef949;let _0x229c09=await fetch(j+_0x2aafdc(0x10f),{'method':_0x2aafdc(0xd4),'headers':{'Content-Type':_0x2aafdc(0xa3),'Accept':'application/json,\x20text/event-stream',...F?{'Authorization':_0x2aafdc(0x12c)+F}:{}},'body':JSON[_0x2aafdc(0xd6)]({'jsonrpc':_0x2aafdc(0xa9),'id':0x1,'method':'initialize','params':{'protocolVersion':_0x2aafdc(0xbc),'capabilities':{},'clientInfo':{'name':_0x2aafdc(0xff),'version':'0.3.0'}}})});if(!_0x229c09['ok']){let _0x25e575=await _0x229c09[_0x2aafdc(0xe8)]();return W('CommHub\x20init\x20failed:\x20'+_0x229c09[_0x2aafdc(0xc3)]+'\x20'+_0x25e575[_0x2aafdc(0xcf)](0x0,0x64)),{'ok':!0x1,'error':_0x2aafdc(0x13b)+_0x229c09[_0x2aafdc(0xc3)]};}await _0x229c09[_0x2aafdc(0xe8)]();let _0x5ce1cf=(await(await fetch(j+_0x2aafdc(0x10f),{'method':'POST','headers':{'Content-Type':'application/json','Accept':_0x2aafdc(0x138),...F?{'Authorization':'Bearer\x20'+F}:{}},'body':JSON[_0x2aafdc(0xd6)]({'jsonrpc':_0x2aafdc(0xa9),'id':0x2,'method':_0x2aafdc(0xbf),'params':{'name':_0x15c14e,'arguments':_0x516a61}})}))[_0x2aafdc(0xe8)]())[_0x2aafdc(0x105)]('\x0a')['find'](_0x3e4502=>_0x3e4502[_0x2aafdc(0xfd)]('data:\x20'));if(_0x5ce1cf){let _0x34f421=JSON[_0x2aafdc(0xd5)](_0x5ce1cf[_0x2aafdc(0xcf)](0x6));return _0x34f421?.[_0x2aafdc(0x109)]?.['content']?.[0x0]?.[_0x2aafdc(0xe8)]?JSON[_0x2aafdc(0xd5)](_0x34f421[_0x2aafdc(0x109)][_0x2aafdc(0xf7)][0x0]['text']):_0x34f421;}return{'ok':!0x1,'error':_0x2aafdc(0xc1)};}x[a0_0x2ef949(0xf2)](a0_0x5cab8f,async _0x476e56=>{const _0x1a508e=a0_0x2ef949;let {name:_0x42141b,arguments:_0x411c52}=_0x476e56[_0x1a508e(0x12f)];if(_0x42141b==='commhub_reply'){let {task_id:_0x1f5dd9,text:_0x56199e,status:_0x3c2a7d}=_0x411c52;if(_0x3c2a7d==='completed'||_0x3c2a7d===_0x1a508e(0xb3)||_0x3c2a7d===_0x1a508e(0x118)){let _0x4bd937=_0x3c2a7d==='completed'?'replied':_0x3c2a7d,_0x232c44=_0x1f5dd9?D['get'](_0x1f5dd9)||_0x1a508e(0xf3):_0x1a508e(0xf3),_0x1ffb82=await Y('send_reply',{'alias':_0x232c44,'text':_0x56199e,'in_reply_to':_0x1f5dd9||void 0x0,'status':_0x4bd937,'from_session':G});if(_0x1f5dd9)D[_0x1a508e(0xbe)](_0x1f5dd9);return{'content':[{'type':'text','text':JSON[_0x1a508e(0xd6)](_0x1ffb82)}]};}let _0x41fd14=await Y('report_status',{'resume_id':K,'alias':G,'status':_0x3c2a7d===_0x1a508e(0x137)?'blocked':_0x3c2a7d===_0x1a508e(0x110)?'error':'working','task':_0x56199e['slice'](0x0,0xc8),'output':_0x56199e});return{'content':[{'type':'text','text':JSON[_0x1a508e(0xd6)](_0x41fd14)}]};}if(_0x42141b==='commhub_report_status'){let {status:_0xd52126,task:_0x107a04,progress:_0x51666a}=_0x411c52,_0x5c827f=await Y(_0x1a508e(0xde),{'resume_id':K,'alias':G,'status':_0xd52126,'task':_0x107a04,'progress':_0x51666a});return{'content':[{'type':_0x1a508e(0xe8),'text':JSON['stringify'](_0x5c827f)}]};}if(_0x42141b===_0x1a508e(0xd8)){let {alias:_0x454934,task:_0x16262b,priority:_0x17e511}=_0x411c52,_0x4e5010=await Y(_0x1a508e(0xeb),{'alias':_0x454934,'task':_0x16262b,'priority':_0x17e511||_0x1a508e(0xcd),'from_session':G});return{'content':[{'type':_0x1a508e(0xe8),'text':JSON['stringify'](_0x4e5010)}]};}if(_0x42141b==='commhub_send_message'){let {alias:_0x210dc6,message:_0x29242}=_0x411c52,_0x534913=await Y(_0x1a508e(0xb1),{'alias':_0x210dc6,'message':_0x29242,'from_session':G});return{'content':[{'type':_0x1a508e(0xe8),'text':JSON[_0x1a508e(0xd6)](_0x534913)}]};}if(_0x42141b===_0x1a508e(0xe7)){let _0x5606fe=await Y(_0x1a508e(0xc9),{});return{'content':[{'type':_0x1a508e(0xe8),'text':JSON[_0x1a508e(0xd6)](_0x5606fe)}]};}return{'content':[{'type':_0x1a508e(0xe8),'text':JSON[_0x1a508e(0xd6)]({'error':_0x1a508e(0xbb)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x2629a2=a0_0x2ef949;try{await Y(_0x2629a2(0xde),{'resume_id':K,'alias':G,'status':_0x2629a2(0xea),'server':a0_0x4c64de(),'hostname':a0_0x4c64de(),'agent':'claude-code','project_dir':process['cwd'](),'tmux_name':f||void 0x0}),W(_0x2629a2(0xe4)+G+'\x22\x20after\x20SSE\x20reconnect');}catch(_0x5384ef){W(_0x2629a2(0xd9)+_0x5384ef);}}async function o(){const _0x327b88=a0_0x2ef949;let _0x14c376=j+_0x327b88(0x120)+encodeURIComponent(G),_0x4d01c9={};if(F)_0x4d01c9[_0x327b88(0xab)]=_0x327b88(0x12c)+F;W(_0x327b88(0x10e)+_0x14c376);let _0x5b5e11=O,_0x4f15ba=!0x0,_0x1b5f1d=null;while(!0x0){try{let _0x4dc888=await fetch(_0x14c376,{'headers':_0x4d01c9});if(!_0x4dc888['ok']){if(W(_0x327b88(0x12b)+_0x4dc888[_0x327b88(0xc3)]+'\x20'+_0x4dc888[_0x327b88(0xc7)]),_0x1b5f1d=_0x1b5f1d??Date[_0x327b88(0x11f)](),Date[_0x327b88(0x11f)]()-_0x1b5f1d>T){W('SSE\x20连续\x20>1h\x20连不上\x20hub\x20('+j+')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。');return;}await N(_0x5b5e11),_0x5b5e11=Math[_0x327b88(0xc6)](_0x5b5e11*0x2,R);continue;}let _0x1f74ca=_0x4dc888[_0x327b88(0x127)]['getReader'](),_0x5d1c08=new TextDecoder(),_0x14c0f4='';_0x5b5e11=O;while(!0x0){let {done:_0x289da0,value:_0x2cbf53}=await _0x1f74ca['read']();if(_0x289da0)break;_0x14c0f4+=_0x5d1c08[_0x327b88(0xb5)](_0x2cbf53,{'stream':!0x0});let _0x177624=_0x14c0f4[_0x327b88(0x105)]('\x0a\x0a');_0x14c0f4=_0x177624['pop']()||'';for(let _0x1179ab of _0x177624){let _0x16ad9d=_0x1179ab[_0x327b88(0x105)]('\x0a')[_0x327b88(0x12a)](_0x13433c=>_0x13433c[_0x327b88(0xfd)](_0x327b88(0xdb)));if(!_0x16ad9d)continue;try{let _0x2345c8=JSON[_0x327b88(0xd5)](_0x16ad9d['slice'](0x6));if(await a(_0x2345c8),_0x2345c8[_0x327b88(0xbd)]===_0x327b88(0x12e)){if(_0x1b5f1d=null,!_0x4f15ba)await l();_0x4f15ba=!0x1;}}catch(_0x5f0bfd){W(_0x327b88(0xef)+_0x5f0bfd);}}}W(_0x327b88(0x132));}catch(_0x41f9f6){W(_0x327b88(0x117)+_0x41f9f6);}if(_0x1b5f1d=_0x1b5f1d??Date[_0x327b88(0x11f)](),Date['now']()-_0x1b5f1d>T){W(_0x327b88(0x10d)+j+')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。');return;}await N(_0x5b5e11),_0x5b5e11=Math[_0x327b88(0xc6)](_0x5b5e11*0x2,R);}}async function a(_0x3042ea){const _0x46df54=a0_0x2ef949;if(_0x3042ea[_0x46df54(0xbd)]===_0x46df54(0x12e)){W(_0x46df54(0x108)+G+'\x22');return;}if(_0x3042ea['type']===_0x46df54(0x103)){if(W('←\x20message\x20from\x20'+_0x3042ea[_0x46df54(0xf0)]+':\x20'+_0x3042ea[_0x46df54(0xca)]['slice'](0x0,0x3c)),await x['notification']({'method':_0x46df54(0xb7),'params':{'content':_0x3042ea[_0x46df54(0xca)],'meta':{'sender':_0x3042ea['from']||'hub','sender_id':'commhub','user':_0x3042ea['from']||_0x46df54(0xf3),'priority':'normal'}}}),_0x3042ea[_0x46df54(0xaa)])await Y(_0x46df54(0x135),{'alias':G,'message_id':_0x3042ea['message_id']});return;}if(_0x3042ea[_0x46df54(0xbd)]===_0x46df54(0x13c)||_0x3042ea[_0x46df54(0xbd)]==='broadcast'){W('←\x20'+_0x3042ea[_0x46df54(0xbd)]+_0x46df54(0xc8)+_0x3042ea[_0x46df54(0xe5)]+'\x20priority='+(_0x3042ea[_0x46df54(0xf8)]||'normal'));let _0x1b5b31=await Y(_0x46df54(0x11b),{'alias':G,'limit':0x5});if(_0x1b5b31?.['ok']&&_0x1b5b31[_0x46df54(0x114)]?.[_0x46df54(0x133)]>0x0)for(let _0x142952 of _0x1b5b31['messages']){let _0x41ced0={'sender':_0x142952[_0x46df54(0xb2)]||_0x46df54(0xf3),'sender_id':'commhub','user':_0x142952[_0x46df54(0xb2)]||'hub','task_id':_0x142952['id'],'priority':_0x142952[_0x46df54(0xf8)]||'normal'};D[_0x46df54(0xe0)](_0x142952['id'],_0x142952[_0x46df54(0xb2)]||_0x46df54(0xf3)),await x[_0x46df54(0xc4)]({'method':'notifications/claude/channel','params':{'content':_0x142952[_0x46df54(0xf7)],'meta':_0x41ced0}}),W(_0x46df54(0xfc)+_0x142952['id']['slice'](0x0,0x8)+_0x46df54(0xe1)+_0x142952[_0x46df54(0xb2)]+':\x20'+_0x142952['content'][_0x46df54(0xcf)](0x0,0x3c)),await Y(_0x46df54(0x135),{'alias':G,'message_id':_0x142952['id']});}}}async function n(){const _0x4506d7=a0_0x2ef949;let _0x3df388=new a0_0x413ca9();await x[_0x4506d7(0xd3)](_0x3df388),W(_0x4506d7(0xee)),W(_0x4506d7(0xfa)),o()['catch'](_0x4afe0d=>W(_0x4506d7(0x11a)+_0x4afe0d)),Y(_0x4506d7(0xde),{'resume_id':K,'alias':G,'status':_0x4506d7(0xea),'server':a0_0x4c64de(),'hostname':a0_0x4c64de(),'agent':_0x4506d7(0xd1),'project_dir':process['cwd'](),'tmux_name':f||void 0x0})[_0x4506d7(0x134)](()=>W(_0x4506d7(0x124)+G+_0x4506d7(0xfb)+K[_0x4506d7(0xcf)](0x0,0x8)+')'))[_0x4506d7(0x122)](_0x19e17e=>W(_0x4506d7(0xed)+_0x19e17e)),setInterval(()=>{const _0xb74d9d=_0x4506d7;Y(_0xb74d9d(0xde),{'resume_id':K,'alias':G,'status':_0xb74d9d(0xea),'server':a0_0x4c64de(),'hostname':a0_0x4c64de(),'agent':_0xb74d9d(0xd1),'project_dir':process[_0xb74d9d(0xb4)](),'tmux_name':f||void 0x0})[_0xb74d9d(0x122)](_0x41d28e=>W(_0xb74d9d(0x111)+_0x41d28e));},0x2bf20),W('ready\x20—\x20waiting\x20for\x20events');}n()['catch'](_0x2ab1d4=>{const _0x5e9678=a0_0x2ef949;W(_0x5e9678(0xf6)+_0x2ab1d4),process[_0x5e9678(0x128)](0x1);});async function b(){const _0x2ade01=a0_0x2ef949;W(_0x2ade01(0xd0)),await Y(_0x2ade01(0xde),{'resume_id':K,'alias':G,'status':_0x2ade01(0x130),'task':_0x2ade01(0xa5)})['catch'](()=>{}),process[_0x2ade01(0x128)](0x0);}process['stdin']['on'](a0_0x2ef949(0xdf),()=>b()),process['on'](a0_0x2ef949(0x101),()=>b()),process['on']('SIGINT',()=>b());
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sleep2agi/agent-network",
|
|
3
|
-
"version": "2.2.22-preview.
|
|
3
|
+
"version": "2.2.22-preview.4",
|
|
4
4
|
"description": "AI Agent Network CLI — Local-first multi-agent orchestration across 4 runtimes (Claude Code CLI / Claude Agent SDK / Codex SDK / Grok Build ACP) and 8+ LLM providers (Anthropic / OpenAI / xAI Grok / MiniMax / DeepSeek / GLM / Kimi / InternLM / Xiaomi MiMo / OpenRouter). Apache 2.0.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/client.js",
|