@sleep2agi/agent-network 2.3.0-preview.6 → 2.3.0-preview.7
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/adapter.d.ts +31 -0
- package/dist/src/im/feishu/worker.js +23 -23
- 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_0x399040=a0_0x340f;(function(_0x39361b,_0x4180f8){const _0x315c67=a0_0x340f,_0x271cd3=_0x39361b();while(!![]){try{const _0x5a31d2=-parseInt(_0x315c67(0x142))/0x1*(-parseInt(_0x315c67(0x110))/0x2)+-parseInt(_0x315c67(0x149))/0x3+-parseInt(_0x315c67(0x15c))/0x4*(-parseInt(_0x315c67(0x130))/0x5)+-parseInt(_0x315c67(0x155))/0x6+parseInt(_0x315c67(0x118))/0x7*(parseInt(_0x315c67(0x153))/0x8)+parseInt(_0x315c67(0x11a))/0x9+parseInt(_0x315c67(0x12a))/0xa*(-parseInt(_0x315c67(0x147))/0xb);if(_0x5a31d2===_0x4180f8)break;else _0x271cd3['push'](_0x271cd3['shift']());}catch(_0x4b1e5a){_0x271cd3['push'](_0x271cd3['shift']());}}}(a0_0x5a89,0x54140));import{EventEmitter as a0_0x55ec56}from'events';function a0_0x340f(_0x5ea411,_0x424a15){_0x5ea411=_0x5ea411-0x108;const _0x5a89f0=a0_0x5a89();let _0x340f9e=_0x5a89f0[_0x5ea411];return _0x340f9e;}function a0_0x5a89(){const _0x31783e=['get_inbox','send_message','application/json,\x20text/event-stream','pop','min','send','report_status','2AnWlsV','offline','processInbox','heartbeatTimer','message','connect','autoConnect','ack_inbox','128996RRPghX','AbortError','5791725jsDCBh','catch','read','content','now','application/json','sseAbort','/events/','sdk-','task','getAllStatus','resumeId','startsWith','token','cwd','completed','6028210yecmod','heartbeatInterval','status','inbox\x20error:\x20','registered','heartbeat\x20failed:\x20','743455qDgZJb','url','result','replace','type','server','getReader','alias','reply','name','error','messages','POST','call',']\x20[commhub:','SSE\x20connected','disconnected','sdk','683419MzHxpd','abort','connectSSE','Authorization','disconnect','11GkgKBc','emit','2029374jmbGrS','sleep','agent','toTimeString','send_task','text','/mcp','broadcast','toString','body','152kdkLSg','new_task','3889062KUpUJH','log','parse','slice','Bearer\x20','idle','signal','16QlcPHD','split','reconnectDelay','text/event-stream','running'];a0_0x5a89=function(){return _0x31783e;};return a0_0x5a89();}import{hostname as a0_0x236b0c}from'os';class T extends a0_0x55ec56{['url'];['alias'];[a0_0x399040(0x127)];[a0_0x399040(0x14b)];[a0_0x399040(0x125)];[a0_0x399040(0x12b)];[a0_0x399040(0x15e)];[a0_0x399040(0x113)];['sseAbort'];[a0_0x399040(0x108)]=!0x1;constructor(_0x57aedd){const _0x5c20d6=a0_0x399040;super();if(this[_0x5c20d6(0x131)]=_0x57aedd[_0x5c20d6(0x131)][_0x5c20d6(0x133)](/\/$/,''),this['alias']=_0x57aedd[_0x5c20d6(0x137)],this[_0x5c20d6(0x127)]=_0x57aedd[_0x5c20d6(0x127)],this[_0x5c20d6(0x14b)]=_0x57aedd[_0x5c20d6(0x14b)]||_0x5c20d6(0x141),this[_0x5c20d6(0x125)]=_0x5c20d6(0x122)+_0x57aedd['alias']+'-'+Date[_0x5c20d6(0x11e)]()[_0x5c20d6(0x151)](0x24),this[_0x5c20d6(0x12b)]=_0x57aedd[_0x5c20d6(0x12b)]??0x2bf20,this['reconnectDelay']=_0x57aedd['reconnectDelay']??0xbb8,_0x57aedd[_0x5c20d6(0x116)]!==!0x1)this['connect']();}[a0_0x399040(0x156)](_0x2e1f5f){const _0xfaeef9=a0_0x399040;console['log']('['+new Date()[_0xfaeef9(0x14c)]()[_0xfaeef9(0x158)](0x0,0x8)+_0xfaeef9(0x13e)+this['alias']+']\x20'+_0x2e1f5f);}async['call'](_0x32db5e,_0x4993e1){const _0x25c2d5=a0_0x399040;let _0x50ec78={'Content-Type':_0x25c2d5(0x11f),'Accept':_0x25c2d5(0x10b)};if(this[_0x25c2d5(0x127)])_0x50ec78[_0x25c2d5(0x145)]=_0x25c2d5(0x159)+this['token'];let _0x19eff5=await(await fetch(this[_0x25c2d5(0x131)]+_0x25c2d5(0x14f),{'method':_0x25c2d5(0x13c),'headers':_0x50ec78,'body':JSON['stringify']({'jsonrpc':'2.0','id':Date['now'](),'method':'tools/call','params':{'name':_0x32db5e,'arguments':_0x4993e1}})}))[_0x25c2d5(0x14e)](),_0xa1ada5=_0x19eff5['match'](/data: (.+)/),_0x172873=_0xa1ada5?JSON[_0x25c2d5(0x157)](_0xa1ada5[0x1]):JSON['parse'](_0x19eff5),_0x286359=_0x172873?.[_0x25c2d5(0x132)]?.[_0x25c2d5(0x11d)]?.[0x0]?.[_0x25c2d5(0x14e)];return _0x286359?JSON[_0x25c2d5(0x157)](_0x286359):_0x172873;}async[a0_0x399040(0x115)](){const _0x4c706f=a0_0x399040;if(this[_0x4c706f(0x108)])return;this[_0x4c706f(0x108)]=!0x0,await this[_0x4c706f(0x12c)](_0x4c706f(0x15a)),this['log'](_0x4c706f(0x12e)),this[_0x4c706f(0x113)]=setInterval(()=>{const _0x5bddf2=_0x4c706f;this[_0x5bddf2(0x12c)](_0x5bddf2(0x15a))['catch'](_0x9c819b=>this[_0x5bddf2(0x156)](_0x5bddf2(0x12f)+_0x9c819b['message']));},this['heartbeatInterval']),this[_0x4c706f(0x144)]();}async[a0_0x399040(0x146)](){const _0x578f3e=a0_0x399040;if(this['running']=!0x1,this['sseAbort']?.[_0x578f3e(0x143)](),this[_0x578f3e(0x113)])clearInterval(this[_0x578f3e(0x113)]);await this[_0x578f3e(0x12c)](_0x578f3e(0x111))[_0x578f3e(0x11b)](()=>{}),this[_0x578f3e(0x156)](_0x578f3e(0x140));}async[a0_0x399040(0x10e)](_0x30a6e0,_0x587824,_0x3fb8ac='normal'){const _0x4203ac=a0_0x399040;return this['call'](_0x4203ac(0x14d),{'alias':_0x30a6e0,'task':_0x587824,'priority':_0x3fb8ac,'from_session':this['alias']});}async[a0_0x399040(0x114)](_0x5bcff8,_0x3108bf){const _0x4d65d5=a0_0x399040;return this[_0x4d65d5(0x13d)](_0x4d65d5(0x10a),{'alias':_0x5bcff8,'message':_0x3108bf,'from_session':this[_0x4d65d5(0x137)]});}async[a0_0x399040(0x138)](_0x41a286,_0x20add6,_0x1d8e7c=a0_0x399040(0x129)){const _0x36fa1f=a0_0x399040;return this[_0x36fa1f(0x13d)]('send_reply',{'in_reply_to':_0x41a286,'text':_0x20add6,'status':_0x1d8e7c});}async['status'](_0x18ece1,_0x2352f3){const _0x573b42=a0_0x399040;return this[_0x573b42(0x13d)](_0x573b42(0x10f),{'resume_id':this[_0x573b42(0x125)],'alias':this[_0x573b42(0x137)],'status':_0x18ece1,'server':a0_0x236b0c(),'hostname':a0_0x236b0c(),'agent':this[_0x573b42(0x14b)],'project_dir':process[_0x573b42(0x128)](),..._0x2352f3});}async[a0_0x399040(0x124)](){const _0x5825f9=a0_0x399040;return this[_0x5825f9(0x13d)]('get_all_status',{});}async[a0_0x399040(0x150)](_0x16d6d3,_0x41cfe1){const _0x3aa5fe=a0_0x399040;return this[_0x3aa5fe(0x13d)](_0x3aa5fe(0x150),{'message':_0x16d6d3,'filter_server':_0x41cfe1?.[_0x3aa5fe(0x135)],'filter_status':_0x41cfe1?.[_0x3aa5fe(0x12c)]});}async[a0_0x399040(0x144)](){const _0x532a18=a0_0x399040;let _0x114f53=encodeURIComponent(this[_0x532a18(0x137)]),_0x5df645=this[_0x532a18(0x131)]+_0x532a18(0x121)+_0x114f53,_0x10afd0=this[_0x532a18(0x15e)];while(this['running']){try{this[_0x532a18(0x120)]=new AbortController();let _0x1bd2b5={'Accept':_0x532a18(0x15f)};if(this[_0x532a18(0x127)])_0x1bd2b5['Authorization']='Bearer\x20'+this[_0x532a18(0x127)];let _0x195262=await fetch(_0x5df645,{'headers':_0x1bd2b5,'signal':this[_0x532a18(0x120)][_0x532a18(0x15b)]});if(!_0x195262['ok']||!_0x195262[_0x532a18(0x152)]){this[_0x532a18(0x156)]('SSE\x20failed:\x20'+_0x195262[_0x532a18(0x12c)]),await this[_0x532a18(0x14a)](_0x10afd0),_0x10afd0=Math['min'](_0x10afd0*1.5,0xea60);continue;}_0x10afd0=this['reconnectDelay'];let _0x673f17=_0x195262['body'][_0x532a18(0x136)](),_0x526c55=new TextDecoder(),_0x3d58f6='';while(this[_0x532a18(0x108)]){let {done:_0x185423,value:_0x52b3aa}=await _0x673f17[_0x532a18(0x11c)]();if(_0x185423)break;_0x3d58f6+=_0x526c55['decode'](_0x52b3aa,{'stream':!0x0});let _0x113149=_0x3d58f6[_0x532a18(0x15d)]('\x0a');_0x3d58f6=_0x113149[_0x532a18(0x10c)]()||'';for(let _0xda92e9 of _0x113149){if(!_0xda92e9[_0x532a18(0x126)]('data:\x20'))continue;try{let _0x297867=JSON[_0x532a18(0x157)](_0xda92e9['slice'](0x6));if(_0x297867[_0x532a18(0x134)]==='connected'){this[_0x532a18(0x156)](_0x532a18(0x13f)),this[_0x532a18(0x148)]('connected');continue;}if(_0x297867[_0x532a18(0x134)]===_0x532a18(0x154)||_0x297867[_0x532a18(0x134)]==='new_message'||_0x297867['type']===_0x532a18(0x150))await this[_0x532a18(0x112)]();}catch{}}}}catch(_0x4c7cae){if(_0x4c7cae[_0x532a18(0x139)]===_0x532a18(0x119))break;this[_0x532a18(0x148)](_0x532a18(0x13a),_0x4c7cae),this[_0x532a18(0x156)]('SSE\x20error:\x20'+_0x4c7cae[_0x532a18(0x114)]);}if(this[_0x532a18(0x108)])this[_0x532a18(0x148)](_0x532a18(0x140)),this['log']('SSE\x20reconnecting\x20in\x20'+_0x10afd0/0x3e8+'s...'),await this[_0x532a18(0x14a)](_0x10afd0),_0x10afd0=Math[_0x532a18(0x10d)](_0x10afd0*1.5,0xea60);}}async[a0_0x399040(0x112)](){const _0x1bd4ba=a0_0x399040;try{let _0x344cd2=(await this[_0x1bd4ba(0x13d)](_0x1bd4ba(0x109),{'alias':this['alias'],'limit':0xa}))?.[_0x1bd4ba(0x13b)]||[];for(let _0x5244ff of _0x344cd2)await this['call'](_0x1bd4ba(0x117),{'alias':this[_0x1bd4ba(0x137)],'message_id':_0x5244ff['id']}),this[_0x1bd4ba(0x156)]('←\x20'+_0x5244ff['from_session']+':\x20'+_0x5244ff[_0x1bd4ba(0x11d)][_0x1bd4ba(0x158)](0x0,0x3c)),this['emit'](_0x1bd4ba(0x123),_0x5244ff),this[_0x1bd4ba(0x148)](_0x1bd4ba(0x114),_0x5244ff);}catch(_0xe0b16d){this['log'](_0x1bd4ba(0x12d)+_0xe0b16d['message']);}}[a0_0x399040(0x14a)](_0x576196){return new Promise(_0x278a9=>setTimeout(_0x278a9,_0x576196));}}var $=T;export{$ as default,T as CommHub};
|
|
@@ -17,6 +17,17 @@ export declare class FeishuAdapter implements IMAdapter {
|
|
|
17
17
|
/** Where to persist downloaded inbound media (M5c). */
|
|
18
18
|
private mediaDir;
|
|
19
19
|
private health_;
|
|
20
|
+
/**
|
|
21
|
+
* Snapshot of the current `access.allowFrom` list (from access.json).
|
|
22
|
+
* Used by the bridge's rate-limiter to exempt operator-vouched explicit
|
|
23
|
+
* sender ids from the DM flood limit (2026-06-29: Vincent's multi-turn
|
|
24
|
+
* heavy work was tripping the 3-msg/60s DM limit; explicit-listed
|
|
25
|
+
* users are already operator-trusted via the access whitelist, no
|
|
26
|
+
* need to also flood-limit them). Returns `[]` before `init()`. The
|
|
27
|
+
* wildcard `["*"]` allowlist does NOT count as "explicit" — that's
|
|
28
|
+
* the public-channel shape and still needs flood protection.
|
|
29
|
+
*/
|
|
30
|
+
getAllowFrom(): readonly string[];
|
|
20
31
|
init(config: IMChannelConfig): Promise<void>;
|
|
21
32
|
start(onEvent: OnEventHandler): Promise<void>;
|
|
22
33
|
stop(): Promise<void>;
|
|
@@ -26,4 +37,24 @@ export declare class FeishuAdapter implements IMAdapter {
|
|
|
26
37
|
edit(_target: IMConversationRef, messageId: string, message: NormalizedIMMessage): Promise<void>;
|
|
27
38
|
health(): IMAdapterHealth;
|
|
28
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Heuristic — does this text look like it contains markdown syntax that
|
|
42
|
+
* Feishu's plain-text `msg_type:"text"` would render as literal source?
|
|
43
|
+
* Catches the patterns Vincent's heavy work produces: tables (`|...|`
|
|
44
|
+
* + separator row), fenced code blocks (`` ``` ``), ATX headings (`#`),
|
|
45
|
+
* bold/italic (`**text**` / `*text*`), unordered/ordered lists, inline
|
|
46
|
+
* code (`` `code` ``), markdown links (`[label](url)`).
|
|
47
|
+
*
|
|
48
|
+
* Returns true for at least one match; the adapter then upgrades to
|
|
49
|
+
* `msg_type:"interactive"` with a `markdown` element. Returns false for
|
|
50
|
+
* plain prose so the text path stays untouched (no perf cost, no
|
|
51
|
+
* behavior change for non-markdown replies).
|
|
52
|
+
*
|
|
53
|
+
* Conservative — single-character matches (e.g., a `|` in prose, one
|
|
54
|
+
* `*` for emphasis-of-one-word that Feishu would render OK as text)
|
|
55
|
+
* are NOT enough to trigger. We want false-positives < false-negatives
|
|
56
|
+
* (a false-positive upgrade renders fine; a false-negative shows raw
|
|
57
|
+
* `|` and `**`).
|
|
58
|
+
*/
|
|
59
|
+
export declare function looksLikeMarkdown(text: string): boolean;
|
|
29
60
|
export {};
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import*as
|
|
3
|
-
`);return}if(!$){process.stderr.write(`[feishu:image] ${
|
|
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] ${
|
|
5
|
-
`);return}if(!X||!q.message_id){process.stderr.write(`[feishu:image] ${
|
|
6
|
-
`);return}process.stderr.write(`[feishu:image] ${
|
|
7
|
-
`);let U=await
|
|
8
|
-
`),Q.content={...Q.content,images:[U]};else process.stderr.write(`[feishu:image] ${
|
|
9
|
-
`)}function
|
|
2
|
+
import*as R from"@larksuiteoapi/node-sdk";import{existsSync as I,mkdirSync as f,readFileSync as u,writeFileSync as v}from"node:fs";import{join as O}from"node:path";import{Readable as c}from"node:stream";function P(J){if(Array.isArray(J))return{list:J.filter((V)=>typeof V==="string"&&V.length>0).map((V)=>String(V)),malformed:!1};if(J===void 0||J===null)return{list:[],malformed:!1};return{list:[],malformed:!0}}function x(J){if(J.conversationType==="dm"){let{list:$,malformed:Z}=P(J.allowFrom);if($.length===0)return{allow:!1,kind:"empty-fail-closed",reason:Z?"allowFrom malformed (not a string[]) — fail-closed (dm)":"allowFrom empty — fail-closed (dm)"};if($.includes("*"))return{allow:!0,kind:"wildcard-allow",reason:'allowFrom=["*"] (dm)'};if(J.senderId&&$.includes(J.senderId))return{allow:!0,kind:"explicit-allow",reason:`sender ${J.senderId} in allowFrom (dm)`};return{allow:!1,kind:"denied",reason:"sender not in allowFrom (dm)"}}let Q=P(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 L{platform="feishu";ingressMode="socket";feishuConfig=null;connectionName="";client=null;wsClient=null;botOpenId=null;mediaDir=null;health_={connected:!1,lastEventAt:null,lastError:null};getAllowFrom(){return this.feishuConfig?.access?.allowFrom??[]}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 R.Client({appId:Q.appId,appSecret:Q.appSecret,disableTokenCache:!1}),this.botOpenId=await o(this.client);let V=process.env.ANET_FEISHU_MEDIA_DIR?.trim();if(V)this.mediaDir=O(V,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:V,access:$,groupPolicy:Z}=this.feishuConfig,G=this.connectionName,q=this.botOpenId,X=this.mediaDir,U=this.client,j=new R.EventDispatcher({});j.register({"im.message.receive_v1":async(S)=>{try{this.health_={...this.health_,lastEventAt:Date.now()};let Y=g(S,G,q);if(!Y)return;await p(S,Y,U,X);let B=r(Y,$,Z);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 R.WSClient({appId:Q,appSecret:V,loggerLevel:R.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,V;if(J.imagePath){let X=await i(this.client,J.imagePath);if(!X)throw Error(`FeishuAdapter.send: image upload failed for ${J.imagePath}`);Q="image",V=JSON.stringify({image_key:X})}else{let X=J.text??J.markdown;if(!X)throw Error("FeishuAdapter.send: requires text, markdown, or imagePath");if(l(X))Q="interactive",V=JSON.stringify({config:{wide_screen_mode:!0},elements:[{tag:"markdown",content:X}]});else Q="text",V=JSON.stringify({text:X})}let $=J.replyToMessageId??J.target.threadRootId;if($){let U=(await this.client.im.message.reply({path:{message_id:$},data:{msg_type:Q,content:V}}))?.data?.message_id;if(!U)throw Error("FeishuAdapter.send: reply returned no message_id");return{messageId:U}}let Z=J.target.conversationType==="dm"?"open_id":"chat_id",q=(await this.client.im.message.create({params:{receive_id_type:Z},data:{receive_id:J.target.conversationId,msg_type:Q,content:V}}))?.data?.message_id;if(!q)throw Error("FeishuAdapter.send: create returned no message_id");return{messageId:q}}async edit(J,Q,V){if(!this.client)throw Error("FeishuAdapter.edit: call init() first");let $=V.text??V.markdown;if(!$)throw Error("FeishuAdapter.edit: M3 supports text only");await this.client.im.message.update({path:{message_id:Q},data:{msg_type:"text",content:JSON.stringify({text:$})}})}health(){return{...this.health_}}}function g(J,Q,V){let $=J,Z=$?.message,G=$?.sender,q=G?.sender_id?.open_id;if(!Z||!q)return null;let X;if(Z.message_type==="text")try{X=JSON.parse(Z.content).text}catch{X=Z.content}else if(Z.message_type==="file")try{X=`[文件: ${JSON.parse(Z.content).file_name??"unknown"}]`}catch{X="[文件]"}else if(Z.message_type==="sticker")X="[表情]";else if(Z.message_type==="image")X=void 0;else return null;let U=Z.chat_type==="group"?"group":"dm",j=Array.isArray(Z.mentions)?Z.mentions:[],S=V?j.some((B)=>B?.id?.open_id===V):j.length>0,Y=`${Q}#feishu`;return{platform:"feishu",connectionId:Y,tenantId:G?.tenant_key,conversation:{platform:"feishu",conversationId:Z.chat_id,conversationType:U,threadRootId:Z.root_id},sender:{id:q},messageId:Z.message_id,mentioned:S,content:X?{text:X}:{},receivedAt:Date.now(),idempotencyKey:`feishu:${Y}:${Z.message_id}`}}function l(J){if(!J||typeof J!=="string")return!1;if(/```/.test(J))return!0;if(/(^|\n)#{1,6}\s/.test(J))return!0;if(/(^|\n)\|[^\n]*\|\n\|[\s:|-]+\|/.test(J))return!0;if(/\*\*[^*\s][^*]*\*\*/.test(J))return!0;if(/(^|\n)[-*+]\s+\S/.test(J))return!0;if(/(^|\n)\d+\.\s+\S/.test(J))return!0;if(/\[[^\]\n]+\]\([^)\n]+\)/.test(J))return!0;if(/`[^`\n]+`/.test(J))return!0;return!1}async function p(J,Q,V,$){let Z=Q.messageId;if(!V){process.stderr.write(`[feishu:image] ${Z} skip: no lark client
|
|
3
|
+
`);return}if(!$){process.stderr.write(`[feishu:image] ${Z} 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] ${Z} skip: content not JSON (${j?.message??j})
|
|
5
|
+
`);return}if(!X||!q.message_id){process.stderr.write(`[feishu:image] ${Z} skip: no image_key/message_id (key=${X})
|
|
6
|
+
`);return}process.stderr.write(`[feishu:image] ${Z} download begin (key=${X.slice(0,16)}…, dir=${$})
|
|
7
|
+
`);let U=await d(V,q.message_id,X,$,Q.conversation?.conversationId);if(U)process.stderr.write(`[feishu:image] ${Z} download ok → ${U}
|
|
8
|
+
`),Q.content={...Q.content,images:[U]};else process.stderr.write(`[feishu:image] ${Z} download FAILED (see downloadImage stderr above)
|
|
9
|
+
`)}function m(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 d(J,Q,V,$,Z){try{let G=await J.im.messageResource.get({path:{message_id:Q,file_key:V},params:{type:"image"}});if(!G)return process.stderr.write(`[feishu:image] ${Q} messageResource.get returned falsy (no stream)
|
|
10
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
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
|
|
13
|
-
`),null}let Y=
|
|
14
|
-
`),null}}async function
|
|
15
|
-
`)}import{existsSync as D,readFileSync as y}from"node:fs";import{join as M}from"node:path";function
|
|
16
|
-
`);return}Q.set(
|
|
17
|
-
`);try{await Q.send({target:Y.conversation,text:
|
|
18
|
-
`)}catch(
|
|
19
|
-
`)}};return
|
|
20
|
-
`)}catch(
|
|
21
|
-
`)}})()}),async(
|
|
12
|
+
`);let S=m(j);if(!S){let z=j.slice(0,16).toString("hex");return process.stderr.write(`[feishu:image] ${Q} mime rejected (head hex: ${z})
|
|
13
|
+
`),null}let Y=Z?O($,Z.replace(/[^a-zA-Z0-9_-]/g,"_")):$;f(Y,{recursive:!0});let B=Q.replace(/[^a-zA-Z0-9_-]/g,"_"),H=O(Y,`${B}.${S.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 i(J,Q){try{if(!I(Q))return null;let V=u(Q),$=c.from(V);return(await J.im.image.create({data:{image_type:"message",image:$}}))?.image_key??null}catch{return null}}async function o(J){try{let V=await J.request({method:"GET",url:"/open-apis/bot/v3/info"});return V?.bot?.open_id??V?.data?.bot?.open_id??null}catch{return null}}function r(J,Q,V){let $=x({conversationType:J.conversation.conversationType,allowFrom:Q.allowFrom,allowChats:Q.allowChats,senderId:J.sender.id,conversationId:J.conversation.conversationId,groupPolicy:V==="command"?"mention":V});if(J.conversation.conversationType==="dm")return{allow:$.allow,reason:$.reason};if(!$.allow)return{allow:!1,reason:$.reason};if(V==="all")return{allow:!0,reason:""};if(J.mentioned)return{allow:!0,reason:""};return{allow:!1,reason:`groupPolicy=${V} requires @bot mention (not mentioned)`}}function E(J,Q,V){let $=new Date().toISOString(),Z=Q?`${Q.conversation.conversationType}:${Q.conversation.conversationId}`:"?",G=Q?Q.sender.id:"?";process.stderr.write(`[${$}] [feishu:audit] ${J} from=${G} conv=${Z} — ${V}
|
|
15
|
+
`)}import{existsSync as D,readFileSync as y}from"node:fs";import{join as M}from"node:path";function C(J){let Q=s(M(J,".env")),V=Q.FEISHU_APP_ID,$=Q.FEISHU_APP_SECRET;if(!V||!$)throw Error(`feishu channel: FEISHU_APP_ID / FEISHU_APP_SECRET missing in ${J}/.env`);let Z=n(M(J,"access.json"));return{appId:V,appSecret:$,access:Z,groupPolicy:"mention",ackPlaceholder:!0,auditRaw:!1,taskTimeoutMs:300000,channelDir:J}}function s(J){if(!D(J))return{};let Q={};for(let V of y(J,"utf-8").split(/\r?\n/)){let $=V.trim();if(!$||$.startsWith("#"))continue;let Z=$.indexOf("=");if(Z<0)continue;let G=$.slice(0,Z).trim(),q=$.slice(Z+1).trim().replace(/^["']|["']$/g,"");Q[G]=q}return Q}function 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 a=900000,t=120000,e=3,_=60000,JJ=2,T=60000,QJ=3,w=60000,VJ="处理频率超出限制,请稍后重试";async function h(J){let Q=C(J.channelDir),V=new L;await V.init({platform:"feishu",connectionName:J.nodeAlias,ingressMode:"socket",groupPolicy:Q.groupPolicy,ackPlaceholder:Q.ackPlaceholder,auditRaw:Q.auditRaw,taskTimeoutMs:Q.taskTimeoutMs,platformConfig:Q});let $=Q.taskTimeoutMs||a,Z=J.onEvent??YJ(V,$,Q.ackPlaceholder);return await V.start(ZJ($J(Z,V))),V}function ZJ(J){let Q=new Map;return async(V)=>{let $=Date.now();if(Q.size>200){for(let[Z,G]of Q)if($-G>t)Q.delete(Z)}if(Q.has(V.idempotencyKey)){process.stderr.write(`[feishu:bridge] dedup drop ${V.idempotencyKey}
|
|
16
|
+
`);return}Q.set(V.idempotencyKey,$),await J(V)}}function $J(J,Q){let V=new Map,$=new Map,Z=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 S=async(Y)=>{let B=Date.now();if(Y.conversation.conversationType==="dm"){let W=Q.getAllowFrom();if(!W.includes("*")&&W.includes(Y.sender.id)){await J(Y);return}}q(V,B,_),q($,B,T),X(Z,B),U(V,A),U($,A),j(Z,A);let H=!1;if(Y.conversation.conversationType==="dm"){let W=Y.sender.id,F=G(V.get(W)??[],B,_);if(F.length>=e)H=!0,V.set(W,F);else F.push(B),V.set(W,F)}else{let W=Y.conversation.conversationId,F=G($.get(W)??[],B,T);if(F.length>=JJ)H=!0,$.set(W,F);else F.push(B),$.set(W,F)}if(H){let W=Y.sender.id,F=Y.conversation.conversationId;if(Y.conversation.conversationType==="dm"){let k=V.get(W);if(k&&k.length===0)V.delete(W)}else{let k=$.get(F);if(k&&k.length===0)$.delete(F)}}if(!H){await J(Y);return}let z=Y.sender.id,K=Z.get(z),N;if(!K||B-K.windowStart>w)N={count:1,windowStart:B};else N={count:K.count+1,windowStart:K.windowStart};if(Z.set(z,N),N.count>=QJ)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:VJ,replyToMessageId:Y.messageId,correlation:{taskId:Y.idempotencyKey}}),process.stderr.write(`[feishu:bridge] rate-limited (${Y.conversation.conversationType}) from=${z} for ${Y.idempotencyKey}
|
|
18
|
+
`)}catch(W){let F=W instanceof Error?W.message:String(W);process.stderr.write(`[feishu:bridge] rate-limit notice send failed: ${F}
|
|
19
|
+
`)}};return S.__getState=()=>({dmKeyCount:V.size,groupKeyCount:$.size,floodKeyCount:Z.size}),S}var b=50,A=1e4;function YJ(J,Q,V){if(typeof process.send==="function")return BJ(J,Q,V);return KJ}var XJ="⏳ 处理中…",qJ="[处理超时,任务可能仍在后台运行]";function BJ(J,Q,V){if(typeof process.send!=="function")throw Error("createIPCEventHandler: parent process.send unavailable (not forked)");let $=new Map;return process.on("message",(Z)=>{if(!GJ(Z))return;let G=$.get(Z.eventKey);if(!G)return;$.delete(Z.eventKey);let{text:q,eventKey:X}=Z,{event:U,placeholderMessageId:j}=G;(async()=>{try{let{messageId:S}=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=${S})${Y} for ${X}
|
|
20
|
+
`)}catch(S){let Y=S instanceof Error?S.message:String(S);process.stderr.write(`[feishu:bridge] reply delivery failed: ${Y}
|
|
21
|
+
`)}})()}),async(Z)=>{if($.set(Z.idempotencyKey,{event:Z}),setTimeout(()=>{let q=$.get(Z.idempotencyKey);if(!q)return;$.delete(Z.idempotencyKey);let{placeholderMessageId:X}=q;(async()=>{try{await J.send({target:Z.conversation,text:qJ,replyToMessageId:Z.messageId,correlation:{taskId:Z.idempotencyKey}});let U=X?` (after placeholder=${X})`:"";process.stderr.write(`[feishu:bridge] timeout-notify sent${U} for ${Z.idempotencyKey} after ${Q}ms
|
|
22
22
|
`)}catch(U){let j=U instanceof Error?U.message:String(U);process.stderr.write(`[feishu:bridge] timeout-notify send failed: ${j}
|
|
23
|
-
`)}})()},Q),
|
|
23
|
+
`)}})()},Q),V)try{let{messageId:q}=await J.send({target:Z.conversation,text:XJ,replyToMessageId:Z.messageId,correlation:{taskId:Z.idempotencyKey}}),X=$.get(Z.idempotencyKey);if(X)X.placeholderMessageId=q,process.stderr.write(`[feishu:bridge] placeholder sent (messageId=${q}) for ${Z.idempotencyKey}
|
|
24
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
|
|
25
|
-
`)}let G={type:"event",event:
|
|
26
|
-
`)}function
|
|
25
|
+
`)}let G={type:"event",event:Z};process.send(G)}}function GJ(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 KJ(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 UJ(J){let Q={};for(let V=0;V<J.length;V++){let $=J[V],Z=J[V+1];if($==="--channel-dir"&&Z)Q.channelDir=Z,V++;else if($==="--node-alias"&&Z)Q.nodeAlias=Z,V++}return Q}async function HJ(){let J=UJ(process.argv.slice(2));if(!J.channelDir||!J.nodeAlias)process.stderr.write(`usage: feishu-worker --channel-dir <path> --node-alias <alias>
|
|
27
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
|
|
29
|
-
`),process.exit(1)}}
|
|
28
|
+
`)}catch(Q){let V=Q instanceof Error?Q.stack??Q.message:String(Q);process.stderr.write(`[feishu:worker] startup failed: ${V}
|
|
29
|
+
`),process.exit(1)}}HJ();
|
package/dist/src/node-server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
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());
|
|
2
|
+
const a0_0x7beace=a0_0x2a61;(function(_0x2c669b,_0x40b6fb){const _0x10ede5=a0_0x2a61,_0x4919c3=_0x2c669b();while(!![]){try{const _0x1f9e8e=parseInt(_0x10ede5(0xc6))/0x1+parseInt(_0x10ede5(0x105))/0x2+parseInt(_0x10ede5(0xe2))/0x3*(parseInt(_0x10ede5(0xa1))/0x4)+-parseInt(_0x10ede5(0x72))/0x5+-parseInt(_0x10ede5(0xe7))/0x6*(-parseInt(_0x10ede5(0x71))/0x7)+-parseInt(_0x10ede5(0xa4))/0x8+parseInt(_0x10ede5(0x9e))/0x9*(-parseInt(_0x10ede5(0x6c))/0xa);if(_0x1f9e8e===_0x40b6fb)break;else _0x4919c3['push'](_0x4919c3['shift']());}catch(_0x450732){_0x4919c3['push'](_0x4919c3['shift']());}}}(a0_0x37ee,0x8dce1));import{readFileSync as a0_0x2b5c16,existsSync as a0_0xd70620}from'fs';function a0_0x37ee(){const _0x264273=['re-registered\x20as\x20\x22','Authorization','POST','length','find','text','decode','working','tmux\x20display-message\x20-p\x20\x27#S\x27','new_task','Message\x20content','ENV:\x20URL=','getReader','trim','message_id','get_inbox','shutting\x20down,\x20reporting\x20offline...','get','alias','MCP\x20stdio\x20connected','pop','\x20from\x20','utf-8','from_session','notifications/claude/channel','2343357wmGjcg','slice','task','2529772TWoihG','session\x20disconnected','failed','1603552uhazMi','Bearer\x20','Update\x20this\x20session\x27s\x20status\x20in\x20CommHub\x20(working/idle/blocked/error).\x20Returns\x20inbox_count.','re-register\x20failed:\x20','connecting\x20to\x20','type','content','SIGTERM','set','send_reply','0.3.0','normal','no\x20response','read','Reply\x20using\x20the\x20commhub_reply\x20tool\x20to\x20report\x20status\x20or\x20results\x20back.','startsWith','toTimeString','offline',')\x20—\x20放弃自动重连。手动\x20anet\x20node\x20start\x20恢复。','pid','error','status','→\x20injected\x20task\x20','claude-code','blocked','object','connected','high','broadcast','min','fatal:\x20','get_all_status','Session\x20alias:\x20','join','765964mOSZgD','Progress\x200-100','inbox_count','.anet','from','split','init\x20failed:\x20','then',']\x20[commhub]\x20','token','SIGINT','ack_inbox','You\x20can\x20also\x20use\x20commhub_report_status\x20to\x20update\x20your\x20session\x20status.','application/json','priority','Get\x20status\x20of\x20all\x20sessions\x20from\x20CommHub.','write','indexOf','Target\x20session\x20alias','.\x20Restart\x20node\x20via\x20`anet\x20node\x20start\x20<alias>`\x20so\x20the\x20env\x20is\x20set\x20explicitly\x20(#203).\x0a','completed','SSE\x20error:\x20','replace','cancelled','\x20priority=','unknown\x20tool',':\x20inbox_count=','replied','3rhAyBy','connect','.env','/mcp','Priority\x20(default:\x20normal)','2532wNkRGS','idle','starting\x20SSE\x20listener...','string','Send\x20a\x20task\x20to\x20another\x20session\x20via\x20CommHub.','stderr','These\x20are\x20tasks\x20dispatched\x20by\x20the\x20hub\x20or\x20other\x20sessions\x20via\x20the\x20CommHub\x20Server.','none','SSE\x20stream\x20ended,\x20reconnecting...','\x20PROJECT_ENV=','parse','cwd','would\x20mis-attribute.\x20Refusing\x20to\x20guess\x20from\x20TMUX_NAME=','delete','←\x20message\x20from\x20','result','message','report_status','2.0','notification','catch','commhub_report_status','warning:\x20could\x20not\x20register:\x20','\x22\x20after\x20SSE\x20reconnect','in_progress','Reply\x20text\x20/\x20result\x20summary','(none)','messages','config.json','commhub','820138DoNuTa','http://127.0.0.1:9200','body','stringify','Reply\x20to\x20a\x20CommHub\x20task\x20—\x20report\x20completion\x20or\x20send\x20a\x20message\x20back\x20to\x20the\x20hub.','30ITqXOP','hub','setRequestHandler','\x20/\x20hostname=','commhub_send_task','11347DwKDlM','4650710DnpfSY','now','commhub_get_all_status','application/json,\x20text/event-stream','SSE\x20连续\x20>1h\x20连不上\x20hub\x20(','exit','tools/call','/events/','\x20RESUME_ID=','The\x20task_id\x20from\x20the\x20channel\x20message\x20(or\x20\x27hub\x27\x20for\x20general)','SSE\x20fatal:\x20','commhub_reply','initialize','commhub-channel','commhub_send_message','end','number','ready\x20—\x20waiting\x20for\x20events','CommHub\x20init\x20failed:\x20'];a0_0x37ee=function(){return _0x264273;};return a0_0x37ee();}import{randomUUID as a0_0x1f9615}from'crypto';function a0_0x2a61(_0x466a48,_0x51f23c){_0x466a48=_0x466a48-0x68;const _0x37ee82=a0_0x37ee();let _0x2a61cb=_0x37ee82[_0x466a48];return _0x2a61cb;}import{join as a0_0x4fdbfd}from'path';import{hostname as a0_0x3b0449}from'os';import{execSync as a0_0x1d2b0a}from'child_process';import{Server as a0_0x3c07b4}from'@modelcontextprotocol/sdk/server/index.js';import{StdioServerTransport as a0_0x679c35}from'@modelcontextprotocol/sdk/server/stdio.js';import{ListToolsRequestSchema as a0_0x36d40e,CallToolRequestSchema as a0_0x476b71}from'@modelcontextprotocol/sdk/types.js';function I(_0xd73dee){const _0x4a92ac=a0_0x2a61;if(!a0_0xd70620(_0xd73dee))return;for(let _0x5f4010 of a0_0x2b5c16(_0xd73dee,_0x4a92ac(0x9b))[_0x4a92ac(0xcb)]('\x0a')){let _0x2307a7=_0x5f4010[_0x4a92ac(0x92)]();if(!_0x2307a7||_0x2307a7[_0x4a92ac(0xb3)]('#'))continue;let _0x27cdcc=_0x2307a7[_0x4a92ac(0xd7)]('=');if(_0x27cdcc<0x0)continue;let _0x3c728f=_0x2307a7[_0x4a92ac(0x9f)](0x0,_0x27cdcc)[_0x4a92ac(0x92)](),_0x107563=_0x2307a7[_0x4a92ac(0x9f)](_0x27cdcc+0x1)[_0x4a92ac(0x92)]()[_0x4a92ac(0xdc)](/^["']|["']$/g,'');if(!process.env[_0x3c728f])process.env[_0x3c728f]=_0x107563;}}var L=process.env.HOME||'~',U=a0_0x4fdbfd(L,'.claude/channels/commhub');I(a0_0x4fdbfd(U,a0_0x7beace(0xe4)));var v=process[a0_0x7beace(0xf2)]()['replace'](/\//g,'-');I(a0_0x4fdbfd(U,v,'.env'));function d(){const _0x4d1f3a=a0_0x7beace;try{return a0_0x1d2b0a(_0x4d1f3a(0x8d),{'encoding':_0x4d1f3a(0x9b),'timeout':0x7d0})[_0x4d1f3a(0x92)]();}catch{return'';}}function m(){const _0x3f611e=a0_0x7beace;try{let _0x1457b9=a0_0x4fdbfd(L,_0x3f611e(0xc9),_0x3f611e(0x103));if(a0_0xd70620(_0x1457b9))return JSON[_0x3f611e(0xf1)](a0_0x2b5c16(_0x1457b9,_0x3f611e(0x9b)));}catch{}return{};}var u=m(),j=process.env.COMMHUB_URL||u[a0_0x7beace(0x6d)]||a0_0x7beace(0x68),f=process.env.COMMHUB_TMUX||d();function r(){const _0x986920=a0_0x7beace;if(process.env.COMMHUB_ALIAS&&process.env.COMMHUB_ALIAS[_0x986920(0x92)]())return process.env.COMMHUB_ALIAS['trim']();return process[_0x986920(0xec)][_0x986920(0xd6)]('[commhub]\x20WARN:\x20COMMHUB_ALIAS\x20env\x20var\x20is\x20unset\x20—\x20outbound\x20from_session\x20'+(_0x986920(0xf3)+(f||_0x986920(0x101))+_0x986920(0x6f)+a0_0x3b0449()+_0x986920(0xd9))),'unattributed-'+process[_0x986920(0xb7)];}var G=r(),K=process.env.COMMHUB_RESUME_ID||process.env.CLAUDE_RESUME_ID||a0_0x1f9615(),F=process.env.COMMHUB_TOKEN||u[a0_0x7beace(0xcf)]||'';function W(_0x512e41){const _0x580f9a=a0_0x7beace;let _0x4d2393=new Date()[_0x580f9a(0xb4)]()[_0x580f9a(0x9f)](0x0,0x8);process[_0x580f9a(0xec)][_0x580f9a(0xd6)]('['+_0x4d2393+_0x580f9a(0xce)+_0x512e41+'\x0a');}function N(_0x281a15){return new Promise(_0x599574=>setTimeout(_0x599574,_0x281a15));}W(a0_0x7beace(0x90)+j+'\x20ALIAS='+G+a0_0x7beace(0x7a)+K[a0_0x7beace(0x9f)](0x0,0x8)+'...\x20TMUX='+(f||a0_0x7beace(0xee))+'\x20CWD='+process['cwd']()+a0_0x7beace(0xf0)+v);var D=new Map(),x=new a0_0x3c07b4({'name':a0_0x7beace(0x7f),'version':a0_0x7beace(0xae)},{'capabilities':{'experimental':{'claude/channel':{}},'tools':{}},'instructions':['Messages\x20from\x20CommHub\x20arrive\x20as\x20<channel\x20source=\x22commhub\x22\x20task_id=\x22...\x22\x20priority=\x22...\x22\x20from=\x22...\x22>',a0_0x7beace(0xed),a0_0x7beace(0xb2),a0_0x7beace(0xd2),a0_0x7beace(0xc4)+G][a0_0x7beace(0xc5)]('\x0a')});x['setRequestHandler'](a0_0x36d40e,async()=>({'tools':[{'name':a0_0x7beace(0x7d),'description':a0_0x7beace(0x6b),'inputSchema':{'type':a0_0x7beace(0xbd),'properties':{'task_id':{'type':'string','description':a0_0x7beace(0x7b)},'text':{'type':a0_0x7beace(0xea),'description':a0_0x7beace(0x100)},'status':{'type':a0_0x7beace(0xea),'enum':[a0_0x7beace(0xda),a0_0x7beace(0xa3),a0_0x7beace(0xdd),a0_0x7beace(0xbc),'error',a0_0x7beace(0xff)],'description':'Task\x20outcome:\x20completed/failed/cancelled\x20for\x20final\x20results,\x20blocked/error/in_progress\x20for\x20status\x20updates'}},'required':[a0_0x7beace(0x8a)]}},{'name':a0_0x7beace(0xfc),'description':a0_0x7beace(0xa6),'inputSchema':{'type':'object','properties':{'status':{'type':'string','enum':[a0_0x7beace(0x8c),a0_0x7beace(0xe8),'blocked',a0_0x7beace(0xb8)]},'task':{'type':a0_0x7beace(0xea),'description':'Current\x20task\x20description'},'progress':{'type':a0_0x7beace(0x82),'description':a0_0x7beace(0xc7)}},'required':['status']}},{'name':a0_0x7beace(0x70),'description':a0_0x7beace(0xeb),'inputSchema':{'type':a0_0x7beace(0xbd),'properties':{'alias':{'type':'string','description':'Target\x20session\x20alias'},'task':{'type':a0_0x7beace(0xea),'description':'Task\x20content'},'priority':{'type':a0_0x7beace(0xea),'enum':[a0_0x7beace(0xbf),a0_0x7beace(0xaf),'low'],'description':a0_0x7beace(0xe6)}},'required':['alias',a0_0x7beace(0xa0)]}},{'name':a0_0x7beace(0x80),'description':'Send\x20a\x20message\x20to\x20another\x20session\x20(no\x20task\x20lifecycle,\x20just\x20chat).\x20Use\x20for\x20replies\x20and\x20status\x20updates.','inputSchema':{'type':'object','properties':{'alias':{'type':a0_0x7beace(0xea),'description':a0_0x7beace(0xd8)},'message':{'type':a0_0x7beace(0xea),'description':a0_0x7beace(0x8f)}},'required':[a0_0x7beace(0x97),a0_0x7beace(0xf7)]}},{'name':a0_0x7beace(0x74),'description':a0_0x7beace(0xd5),'inputSchema':{'type':'object','properties':{}}}]}));async function Y(_0x477c7f,_0x290fa1){const _0xff0c62=a0_0x7beace;let _0x1d60b5=await fetch(j+'/mcp',{'method':_0xff0c62(0x87),'headers':{'Content-Type':_0xff0c62(0xd3),'Accept':'application/json,\x20text/event-stream',...F?{'Authorization':'Bearer\x20'+F}:{}},'body':JSON[_0xff0c62(0x6a)]({'jsonrpc':_0xff0c62(0xf9),'id':0x1,'method':_0xff0c62(0x7e),'params':{'protocolVersion':'2025-03-26','capabilities':{},'clientInfo':{'name':'commhub-channel','version':_0xff0c62(0xae)}}})});if(!_0x1d60b5['ok']){let _0x4b1b58=await _0x1d60b5['text']();return W(_0xff0c62(0x84)+_0x1d60b5[_0xff0c62(0xb9)]+'\x20'+_0x4b1b58['slice'](0x0,0x64)),{'ok':!0x1,'error':_0xff0c62(0xcc)+_0x1d60b5['status']};}await _0x1d60b5[_0xff0c62(0x8a)]();let _0x514237=(await(await fetch(j+_0xff0c62(0xe5),{'method':_0xff0c62(0x87),'headers':{'Content-Type':_0xff0c62(0xd3),'Accept':_0xff0c62(0x75),...F?{'Authorization':_0xff0c62(0xa5)+F}:{}},'body':JSON[_0xff0c62(0x6a)]({'jsonrpc':_0xff0c62(0xf9),'id':0x2,'method':_0xff0c62(0x78),'params':{'name':_0x477c7f,'arguments':_0x290fa1}})}))[_0xff0c62(0x8a)]())[_0xff0c62(0xcb)]('\x0a')[_0xff0c62(0x89)](_0x6702a0=>_0x6702a0[_0xff0c62(0xb3)]('data:\x20'));if(_0x514237){let _0xc5ed4=JSON[_0xff0c62(0xf1)](_0x514237['slice'](0x6));return _0xc5ed4?.[_0xff0c62(0xf6)]?.[_0xff0c62(0xaa)]?.[0x0]?.[_0xff0c62(0x8a)]?JSON[_0xff0c62(0xf1)](_0xc5ed4[_0xff0c62(0xf6)][_0xff0c62(0xaa)][0x0][_0xff0c62(0x8a)]):_0xc5ed4;}return{'ok':!0x1,'error':_0xff0c62(0xb0)};}x[a0_0x7beace(0x6e)](a0_0x476b71,async _0x378403=>{const _0x366cf4=a0_0x7beace;let {name:_0x37e95b,arguments:_0x1b73d7}=_0x378403['params'];if(_0x37e95b===_0x366cf4(0x7d)){let {task_id:_0x353830,text:_0x5d4a21,status:_0x1f9a42}=_0x1b73d7;if(_0x1f9a42==='completed'||_0x1f9a42===_0x366cf4(0xa3)||_0x1f9a42==='cancelled'){let _0x44ba66=_0x1f9a42===_0x366cf4(0xda)?_0x366cf4(0xe1):_0x1f9a42,_0x54c240=_0x353830?D[_0x366cf4(0x96)](_0x353830)||_0x366cf4(0x6d):_0x366cf4(0x6d),_0x1c00eb=await Y(_0x366cf4(0xad),{'alias':_0x54c240,'text':_0x5d4a21,'in_reply_to':_0x353830||void 0x0,'status':_0x44ba66,'from_session':G});if(_0x353830)D[_0x366cf4(0xf4)](_0x353830);return{'content':[{'type':_0x366cf4(0x8a),'text':JSON[_0x366cf4(0x6a)](_0x1c00eb)}]};}let _0x563934=await Y(_0x366cf4(0xf8),{'resume_id':K,'alias':G,'status':_0x1f9a42===_0x366cf4(0xbc)?_0x366cf4(0xbc):_0x1f9a42===_0x366cf4(0xb8)?_0x366cf4(0xb8):_0x366cf4(0x8c),'task':_0x5d4a21[_0x366cf4(0x9f)](0x0,0xc8),'output':_0x5d4a21});return{'content':[{'type':'text','text':JSON[_0x366cf4(0x6a)](_0x563934)}]};}if(_0x37e95b===_0x366cf4(0xfc)){let {status:_0x409303,task:_0x5bdeeb,progress:_0x564a29}=_0x1b73d7,_0x3dc60c=await Y(_0x366cf4(0xf8),{'resume_id':K,'alias':G,'status':_0x409303,'task':_0x5bdeeb,'progress':_0x564a29});return{'content':[{'type':'text','text':JSON[_0x366cf4(0x6a)](_0x3dc60c)}]};}if(_0x37e95b==='commhub_send_task'){let {alias:_0x4a049c,task:_0x1d9253,priority:_0x1d93d7}=_0x1b73d7,_0xc567d6=await Y('send_task',{'alias':_0x4a049c,'task':_0x1d9253,'priority':_0x1d93d7||_0x366cf4(0xaf),'from_session':G});return{'content':[{'type':'text','text':JSON[_0x366cf4(0x6a)](_0xc567d6)}]};}if(_0x37e95b==='commhub_send_message'){let {alias:_0x305424,message:_0x468fbe}=_0x1b73d7,_0x513ba0=await Y('send_message',{'alias':_0x305424,'message':_0x468fbe,'from_session':G});return{'content':[{'type':'text','text':JSON[_0x366cf4(0x6a)](_0x513ba0)}]};}if(_0x37e95b===_0x366cf4(0x74)){let _0x1a812f=await Y(_0x366cf4(0xc3),{});return{'content':[{'type':_0x366cf4(0x8a),'text':JSON[_0x366cf4(0x6a)](_0x1a812f)}]};}return{'content':[{'type':_0x366cf4(0x8a),'text':JSON[_0x366cf4(0x6a)]({'error':_0x366cf4(0xdf)})}]};});var O=0x3e8,R=0x7530,T=0x36ee80;async function l(){const _0x4f90a5=a0_0x7beace;try{await Y(_0x4f90a5(0xf8),{'resume_id':K,'alias':G,'status':'idle','server':a0_0x3b0449(),'hostname':a0_0x3b0449(),'agent':'claude-code','project_dir':process[_0x4f90a5(0xf2)](),'tmux_name':f||void 0x0}),W(_0x4f90a5(0x85)+G+_0x4f90a5(0xfe));}catch(_0x5befa3){W(_0x4f90a5(0xa7)+_0x5befa3);}}async function o(){const _0x4548c8=a0_0x7beace;let _0x403072=j+_0x4548c8(0x79)+encodeURIComponent(G),_0x486d79={};if(F)_0x486d79[_0x4548c8(0x86)]=_0x4548c8(0xa5)+F;W(_0x4548c8(0xa8)+_0x403072);let _0x2ea422=O,_0x20127c=!0x0,_0x366f3a=null;while(!0x0){try{let _0x4ecc93=await fetch(_0x403072,{'headers':_0x486d79});if(!_0x4ecc93['ok']){if(W(_0x4548c8(0xdb)+_0x4ecc93[_0x4548c8(0xb9)]+'\x20'+_0x4ecc93['statusText']),_0x366f3a=_0x366f3a??Date['now'](),Date['now']()-_0x366f3a>T){W(_0x4548c8(0x76)+j+_0x4548c8(0xb6));return;}await N(_0x2ea422),_0x2ea422=Math[_0x4548c8(0xc1)](_0x2ea422*0x2,R);continue;}let _0x4f7c36=_0x4ecc93[_0x4548c8(0x69)][_0x4548c8(0x91)](),_0x2d75ad=new TextDecoder(),_0x4c2c02='';_0x2ea422=O;while(!0x0){let {done:_0x33bd34,value:_0x4c58c3}=await _0x4f7c36[_0x4548c8(0xb1)]();if(_0x33bd34)break;_0x4c2c02+=_0x2d75ad[_0x4548c8(0x8b)](_0x4c58c3,{'stream':!0x0});let _0x279091=_0x4c2c02[_0x4548c8(0xcb)]('\x0a\x0a');_0x4c2c02=_0x279091[_0x4548c8(0x99)]()||'';for(let _0xc2790a of _0x279091){let _0x3af4e5=_0xc2790a['split']('\x0a')[_0x4548c8(0x89)](_0x591c6=>_0x591c6['startsWith']('data:\x20'));if(!_0x3af4e5)continue;try{let _0x3917cc=JSON[_0x4548c8(0xf1)](_0x3af4e5[_0x4548c8(0x9f)](0x6));if(await a(_0x3917cc),_0x3917cc[_0x4548c8(0xa9)]===_0x4548c8(0xbe)){if(_0x366f3a=null,!_0x20127c)await l();_0x20127c=!0x1;}}catch(_0x25758b){W('parse\x20error:\x20'+_0x25758b);}}}W(_0x4548c8(0xef));}catch(_0x5d4cb5){W('SSE\x20connection\x20error:\x20'+_0x5d4cb5);}if(_0x366f3a=_0x366f3a??Date[_0x4548c8(0x73)](),Date[_0x4548c8(0x73)]()-_0x366f3a>T){W(_0x4548c8(0x76)+j+_0x4548c8(0xb6));return;}await N(_0x2ea422),_0x2ea422=Math[_0x4548c8(0xc1)](_0x2ea422*0x2,R);}}async function a(_0x1fac62){const _0x33c8ce=a0_0x7beace;if(_0x1fac62[_0x33c8ce(0xa9)]===_0x33c8ce(0xbe)){W('SSE\x20connected\x20as\x20\x22'+G+'\x22');return;}if(_0x1fac62[_0x33c8ce(0xa9)]==='new_message'){if(W(_0x33c8ce(0xf5)+_0x1fac62[_0x33c8ce(0xca)]+':\x20'+_0x1fac62[_0x33c8ce(0xf7)][_0x33c8ce(0x9f)](0x0,0x3c)),await x['notification']({'method':_0x33c8ce(0x9d),'params':{'content':_0x1fac62[_0x33c8ce(0xf7)],'meta':{'sender':_0x1fac62[_0x33c8ce(0xca)]||_0x33c8ce(0x6d),'sender_id':_0x33c8ce(0x104),'user':_0x1fac62[_0x33c8ce(0xca)]||_0x33c8ce(0x6d),'priority':_0x33c8ce(0xaf)}}}),_0x1fac62['message_id'])await Y(_0x33c8ce(0xd1),{'alias':G,'message_id':_0x1fac62[_0x33c8ce(0x93)]});return;}if(_0x1fac62[_0x33c8ce(0xa9)]===_0x33c8ce(0x8e)||_0x1fac62[_0x33c8ce(0xa9)]===_0x33c8ce(0xc0)){W('←\x20'+_0x1fac62[_0x33c8ce(0xa9)]+_0x33c8ce(0xe0)+_0x1fac62[_0x33c8ce(0xc8)]+_0x33c8ce(0xde)+(_0x1fac62[_0x33c8ce(0xd4)]||_0x33c8ce(0xaf)));let _0x2859c6=await Y(_0x33c8ce(0x94),{'alias':G,'limit':0x5});if(_0x2859c6?.['ok']&&_0x2859c6[_0x33c8ce(0x102)]?.[_0x33c8ce(0x88)]>0x0)for(let _0x1a026d of _0x2859c6['messages']){let _0x5d2459={'sender':_0x1a026d[_0x33c8ce(0x9c)]||_0x33c8ce(0x6d),'sender_id':_0x33c8ce(0x104),'user':_0x1a026d['from_session']||_0x33c8ce(0x6d),'task_id':_0x1a026d['id'],'priority':_0x1a026d[_0x33c8ce(0xd4)]||_0x33c8ce(0xaf)};D[_0x33c8ce(0xac)](_0x1a026d['id'],_0x1a026d[_0x33c8ce(0x9c)]||_0x33c8ce(0x6d)),await x[_0x33c8ce(0xfa)]({'method':_0x33c8ce(0x9d),'params':{'content':_0x1a026d[_0x33c8ce(0xaa)],'meta':_0x5d2459}}),W(_0x33c8ce(0xba)+_0x1a026d['id'][_0x33c8ce(0x9f)](0x0,0x8)+_0x33c8ce(0x9a)+_0x1a026d[_0x33c8ce(0x9c)]+':\x20'+_0x1a026d[_0x33c8ce(0xaa)][_0x33c8ce(0x9f)](0x0,0x3c)),await Y(_0x33c8ce(0xd1),{'alias':G,'message_id':_0x1a026d['id']});}}}async function n(){const _0x5a1605=a0_0x7beace;let _0xdfc6fe=new a0_0x679c35();await x[_0x5a1605(0xe3)](_0xdfc6fe),W(_0x5a1605(0x98)),W(_0x5a1605(0xe9)),o()[_0x5a1605(0xfb)](_0x3953a8=>W(_0x5a1605(0x7c)+_0x3953a8)),Y('report_status',{'resume_id':K,'alias':G,'status':'idle','server':a0_0x3b0449(),'hostname':a0_0x3b0449(),'agent':_0x5a1605(0xbb),'project_dir':process[_0x5a1605(0xf2)](),'tmux_name':f||void 0x0})[_0x5a1605(0xcd)](()=>W('registered\x20as\x20\x22'+G+'\x22\x20('+K['slice'](0x0,0x8)+')'))[_0x5a1605(0xfb)](_0x35f2ca=>W(_0x5a1605(0xfd)+_0x35f2ca)),setInterval(()=>{const _0x53dee4=_0x5a1605;Y('report_status',{'resume_id':K,'alias':G,'status':'idle','server':a0_0x3b0449(),'hostname':a0_0x3b0449(),'agent':_0x53dee4(0xbb),'project_dir':process[_0x53dee4(0xf2)](),'tmux_name':f||void 0x0})['catch'](_0x2d878f=>W('heartbeat\x20failed:\x20'+_0x2d878f));},0x2bf20),W(_0x5a1605(0x83));}n()[a0_0x7beace(0xfb)](_0x149442=>{const _0x38bebe=a0_0x7beace;W(_0x38bebe(0xc2)+_0x149442),process[_0x38bebe(0x77)](0x1);});async function b(){const _0xa118e5=a0_0x7beace;W(_0xa118e5(0x95)),await Y('report_status',{'resume_id':K,'alias':G,'status':_0xa118e5(0xb5),'task':_0xa118e5(0xa2)})[_0xa118e5(0xfb)](()=>{}),process[_0xa118e5(0x77)](0x0);}process['stdin']['on'](a0_0x7beace(0x81),()=>b()),process['on'](a0_0x7beace(0xab),()=>b()),process['on'](a0_0x7beace(0xd0),()=>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.7",
|
|
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",
|