@dcrays/dcgchat 0.5.3 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +2 -2
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -100,7 +100,7 @@ ${t.join(`
|
|
|
100
100
|
`+Object.keys(n).map(i=>`${i}: ${n[i]}`).join(`\r
|
|
101
101
|
`)+`\r
|
|
102
102
|
\r
|
|
103
|
-
`+r)}function as(e,t,r,n,i,s){if(e.listenerCount("wsClientError")){let o=new Error(i);Error.captureStackTrace(o,as),e.emit("wsClientError",o,r,t)}else oc(r,n,i,s)}});var tJ,rJ,nJ,mf,iJ,oI,uv=oe(()=>{tJ=or(JR(),1),rJ=or(Qy(),1),nJ=or(tv(),1),mf=or(df(),1),iJ=or(sI(),1),oI=mf.default});import yf from"crypto";function cI(e){let t=yf.createPublicKey(e).export({type:"spki",format:"der"});return t.length===gf.length+32&&t.subarray(0,gf.length).equals(gf)?t.subarray(gf.length):t}function uI(e){return e.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function lv(e){return uI(cI(e))}function pv(e){let t=cI(e);return yf.createHash("sha256").update(t).digest("hex")}function lI(e,t,r="base64url"){let n=yf.createPrivateKey(e),i=yf.sign(null,Buffer.from(t,"utf8"),n);return r==="base64url"?uI(i):i.toString("base64")}function sJ(e){if(typeof e!="string")return"";let t=e.trim();return t||""}function oJ(e){return e.replace(/[A-Z]/g,t=>String.fromCharCode(t.charCodeAt(0)+32))}function aI(e){let t=sJ(e);return t?oJ(t):""}function pI(e){let t=e.scopes.join(","),r=e.token??"",n=aI(e.platform??""),i=aI(e.deviceFamily??"");return["v3",e.deviceId,e.clientId,e.clientMode,e.role,t,String(e.signedAtMs),r,e.nonce,n,i].join("|")}var gf,fI=oe(()=>{"use strict";gf=Buffer.from("302a300506032b6570032100","hex")});import aJ from"node:path";import dv from"node:fs";function ni(){let t=Ot().replace("workspace","cron");return aJ.join(t,"jobs.json")}function cs(e,t){let r=t?.trim();if(!r)return null;if(!dv.existsSync(e))return W(`readCronJobSessionKey: file not found ${e}`,"error"),null;try{let n=dv.readFileSync(e,"utf8");return(JSON.parse(n).jobs??[]).find(o=>o.id===r)||null}catch(n){return W(`readCronJobSessionKey: failed to read ${e}: ${String(n)}`,"error"),null}}async function uJ(e){let t=ni(),r=Ar().botToken;if(dv.existsSync(t))try{let n=await Yp(t,r??"",0);W(`\u5B9A\u65F6\u4EFB\u52A1\u66F4\u65B0\u6210\u529F: ${n}`);let i=e?.split(":")||[],s=i.at(-1)??"",o=i.at(-2)??"";QA({event_type:"cron",operation_type:"install",session_id:s,agent_id:o,oss_url:n})}catch(n){W(`${t} upload failed: ${n}`,"error")}else W(`${t} not found`,"error")}function vf(e){let t=ni(),{sessionKey:r}=cs(t,e)||{};W(`sessionKey: ${r}, jobId: ${e}`),fv!==null&&clearTimeout(fv),fv=setTimeout(()=>{uJ(r)},cJ)}var cJ,fv,dI,hI,mI,gI,yI,bf=oe(()=>{"use strict";Rr();lt();Uy();et();us();Yr();cJ=2400,fv=null;dI=async e=>{if(!e?.trim()){W("onRemoveCronJob: empty jobId","error");return}qt({method:"cron.remove",params:{id:e}})},hI=async e=>{if(!e?.trim()){W("onRemoveCronJob: empty jobId","error");return}qt({method:"cron.update",params:{id:e,patch:{enabled:!1}}})},mI=async e=>{if(!e?.trim()){W("onRemoveCronJob: empty jobId","error");return}qt({method:"cron.update",params:{id:e,patch:{enabled:!0}}})},gI=async(e,t)=>{let r=e?.trim();if(!r){W("onRemoveCronJob: empty jobId","error");return}let n=ni(),{sessionKey:i}=cs(n,e)||{};if(!i){W(`finishedDcgchatCron: no sessionKey for job id=${r}`,"error");return}rs(i,t),qt({method:"cron.runs",params:{scope:"job",id:e,limit:50,offset:0,status:"all",sortDir:"desc"}}),qt({method:"cron.run",params:{id:e,mode:"force"}})},yI=async(e,t,r)=>{let n=e?.trim();if(!n){W("finishedDcgchatCron: empty jobId","error");return}let i=ni(),{sessionKey:s,name:o}=cs(i,n)||{};if(!s){W(`finishedDcgchatCron: no sessionKey for job id=${n}`,"error");return}let a=vn(s)||`${Date.now()}`,c=s.split(":"),u=c.at(-1)??"",l=c.at(-2)??"",p=XA({agentId:l,sessionId:`${u}`,messageId:a||`${Date.now()}`,real_mobook:u?"":1}),f={source:"cron"};r&&(f.hasFile=!0),Qr(p,{response:t,message_tags:f,is_finish:-1}),setTimeout(()=>{gr(p,"cron send")},200);let d=hr(),h=Ar();mr()&&d?.send(JSON.stringify({messageType:"openclaw_bot_event",source:"client",content:{event_type:"notify",operation_type:"cron",bot_token:h.botToken,app_id:h.appId,session_id:u,agent_id:l,real_mobook:u?"":1,title:o}})),W(`\u5B9A\u65F6\u4EFB\u52A1\u6267\u884C\u6210\u529F: ${n}`),DA(s),W(`finishedDcgchatCron: job=${n} sessionKey=${s}`)}});import hv from"node:os";import ii from"node:path";function bI(e){return ii.normalize(e.trim()).replace(/\\/g,"/")}function vI(e,t){let r=ii.resolve(t),n=ii.resolve(e),i=ii.relative(r,n);return!(i.startsWith("..")||ii.isAbsolute(i))}function mv(e,t,r){let n=t?.trim();if(n&&vI(e,n))return!0;if(r?.length){for(let s of r)if(vI(e,s))return!0}let i=bI(e);return i.startsWith("/workspace/")||i==="/workspace"||i.startsWith("/mobook/")||i==="/mobook"?!0:/^[A-Za-z]:\/(workspace|mobook)(\/|$)/.test(i)}function gv(e){return e.replace(/[`'",,*_)\]]+$/u,"").trimEnd()}function yv(e){let t=e.trim();return t&&(t==="~"?hv.homedir():t.startsWith("~/")?ii.resolve(hv.homedir(),t.slice(2)):t.startsWith("~\\")?ii.resolve(hv.homedir(),t.slice(2)):t)}function xI(e,t){if(!e)return[];let r=e.match(/\/workspace\/[^\s]+|\/mobook\/[^\s]+/g)??[],n=e.match(/[A-Za-z]:[/\\](?:workspace|mobook)[/\\][^\s]+/g)??[],i=e.match(/~[/\\][^\s`'")\]]+/g)??[],s=[],o=t?.trim();if(o){let u=new Set;u.add(o),u.add(bI(o)),ii.sep==="\\"&&u.add(o.replace(/\//g,"\\"));for(let l of u){if(!l)continue;let p=0;for(;p<e.length;){let f=e.indexOf(l,p);if(f===-1)break;let d=f+l.length;for(;d<e.length&&!/\s/.test(e[d]);)d++;s.push(e.slice(f,d)),p=f+1}}}let c=[...r,...n,...i,...s].map(u=>gv(u)).filter(Boolean).map(u=>u.startsWith("~")?yv(u):u);return[...new Set(c)]}var wI=oe(()=>{"use strict"});function lJ(e,t){if(typeof e=="string"){let r=e.trim();r&&t.push(r);return}if(e&&typeof e=="object"){let r=e,n=typeof r.path=="string"?r.path.trim():"",i=typeof r.file=="string"?r.file.trim():"",s=n||i;s&&t.push(s)}}function pJ(e){if(e==null||typeof e!="object")return[];let r=e.attachments;if(!Array.isArray(r))return[];let n=[];for(let o of r)lJ(o,n);let i=new Set,s=[];for(let o of n)i.has(o)||(i.add(o),s.push(o));return s}function _I(e){let t=new Set,r=[];for(let n of e)!n||t.has(n)||(t.add(n),r.push(n));return r}function SI(e,t,r,n){let s=pJ(e).map(a=>yv(gv(a))).filter(Boolean).filter(a=>mv(a,r,n));if(s.length>0)return _I(s);let o=xI(t,r).filter(a=>mv(a,r,n));return _I(o)}var EI=oe(()=>{"use strict";wI()});async function kI(e){try{if(e.event==="agent"){let t=e.payload,r=LA(t.runId),n=Zt(r);t.data?.delta&&n.sessionId&&Zp(t.data.delta,n,0)}if(e.event==="cron"){let t=e.payload;if(W(`[Gateway] \u6536\u5230\u5B9A\u65F6\u4EFB\u52A1\u4E8B\u4EF6: ${JSON.stringify(t)}`),t?.action==="added"&&vf(t?.jobId),t?.action==="updated"&&vf(t?.jobId),t?.action==="removed"&&vf(t?.jobId),t?.action==="finished"&&t?.status==="ok"){let r=typeof t?.summary=="string"?t.summary:"";r.indexOf("HEARTBEAT_OK")>=0&&r!=="HEARTBEAT_OK"&&(r=r.replace("HEARTBEAT_OK",""));let n=typeof t?.jobId=="string"?t.jobId.trim():"",s=Lt()?.channels?.dcgchat,o=SI(t,r,Ot(),s?.allowedPaths),a=ni(),c=n?cs(a,n):null,u=c&&typeof c.sessionKey=="string"?c.sessionKey.trim():"";if(u&&o.length>0){let p=vn(u)||`${Date.now()}`;rs(u,p);for(let f of o)try{await tn({sessionKey:u,mediaUrl:f,messageId:p})}catch(d){W(`[Gateway] cron \u9644\u4EF6\u7ECF\u901A\u9053\u53D1\u9001\u5931\u8D25: ${f} ${String(d)}`,"error")}}else o.length>0&&!u&&W(`[Gateway] cron finished \u6709\u53EF\u53D1\u9001\u9644\u4EF6\u8DEF\u5F84\u4F46 jobs.json \u65E0 sessionKey: jobId=${n}`,"error");let l=o.length>0;yI(n,r,l)}}}catch(t){W(`[Gateway] \u5904\u7406\u4E8B\u4EF6\u5931\u8D25: ${t}`,"error")}return{type:e.event,payload:e.payload,seq:e.seq}}var TI=oe(()=>{"use strict";bf();_o();EI();et();Yr();Rr();lt()});import CI from"crypto";var xf,OI=oe(()=>{"use strict";uv();fI();et();lt();TI();xf=class{ws=null;config;deviceId;privateKeyPem;publicKeyB64Url;connected=!1;connId=null;connectChallengeNonce=null;connectSent=!1;pendingRpcById=new Map;eventHandlers=new Set;constructor(t){this.config={url:t.url,token:t.token,role:t.role||"operator",scopes:t.scopes||["operator.admin"],reconnectInterval:t.reconnectInterval||5e3,maxReconnectAttempts:t.maxReconnectAttempts||10};let r=this.loadOrCreateDeviceIdentity();this.deviceId=r.deviceId,this.privateKeyPem=r.privateKeyPem,this.publicKeyB64Url=r.publicKeyB64Url}loadOrCreateDeviceIdentity(){let t=z("fs"),r=z("path"),n=Ot(),i=r.join(n,".state"),s=r.join(i,"device.json");if(t.existsSync(s)){let p=JSON.parse(t.readFileSync(s,"utf8"));if(p.deviceId&&p.publicKeyPem&&p.privateKeyPem){let f=pv(p.publicKeyPem),d=f!==p.deviceId?f:p.deviceId;if(f!==p.deviceId)try{t.writeFileSync(s,JSON.stringify({...p,deviceId:f},null,2))}catch{}return{deviceId:d,publicKeyPem:p.publicKeyPem,privateKeyPem:p.privateKeyPem,publicKeyB64Url:lv(p.publicKeyPem)}}}let o=CI.generateKeyPairSync("ed25519"),a=o.publicKey.export({type:"spki",format:"pem"}).toString(),c=o.privateKey.export({type:"pkcs8",format:"pem"}).toString(),u=pv(a),l=lv(a);return t.existsSync(i)||t.mkdirSync(i,{recursive:!0}),t.writeFileSync(s,JSON.stringify({version:1,deviceId:u,publicKeyPem:a,privateKeyPem:c,createdAtMs:Date.now()},null,2)),t.chmodSync(s,384),{deviceId:u,publicKeyPem:a,privateKeyPem:c,publicKeyB64Url:l}}async connect(){return new Promise((t,r)=>{this.connectChallengeNonce=null,this.connectSent=!1,this.ws=new mf.default(this.config.url);let n=!1,i=o=>{n||(n=!0,clearTimeout(s),o())},s=setTimeout(()=>{i(()=>r(new Error("Gateway connection timeout")))},15e3);this.ws.on("open",()=>{W("Gateway connection opened\uFF08\u7B49\u5F85 connect.challenge\uFF09")}),this.ws.on("message",(o,...a)=>{try{let c=JSON.parse(o.toString());this.handleMessage(c,u=>i(()=>t(u)),u=>i(()=>r(u)),s)}catch(c){W(`[Gateway=>\u63D2\u4EF6]-[\u6D88\u606F\u89E3\u6790\u5931\u8D25]: ${c}`,"error")}}),this.ws.on("close",()=>{this.connected=!1,i(()=>r(new Error("Gateway \u5728\u63E1\u624B\u5B8C\u6210\u524D\u5173\u95ED\u4E86\u8FDE\u63A5")))}),this.ws.on("error",o=>{W(`Gateway \u8FDE\u63A5\u9519\u8BEF: ${o}`,"error"),i(()=>r(o))})})}sendConnect(){if(this.connectSent)return;let t=this.connectChallengeNonce?.trim()??"";if(!t)return;this.connectSent=!0;let r=Date.now(),n=process.platform,i=pI({deviceId:this.deviceId,clientId:"gateway-client",clientMode:"backend",role:this.config.role,scopes:this.config.scopes,signedAtMs:r,token:this.config.token,nonce:t,platform:n,deviceFamily:""}),s=lI(this.privateKeyPem,i),o=JSON.stringify({type:"req",id:"1",method:"connect",params:{minProtocol:3,maxProtocol:3,client:{id:"gateway-client",version:"1.0.0",platform:n,mode:"backend"},auth:{token:this.config.token},role:this.config.role,scopes:this.config.scopes,device:{id:this.deviceId,publicKey:this.publicKeyB64Url,signature:s,signedAt:r,nonce:t}}});this.ws?.send(o),W(`[\u63D2\u4EF6=>Gateway]-[sendConnect]: ${o}`)}mapHelloPayloadToHelloOk(t){let r=t.server,n=t.features;return{server:{connId:typeof r?.connId=="string"?r.connId:""},features:{methods:Array.isArray(n?.methods)?n.methods:[],events:Array.isArray(n?.events)?n.events:[]},policy:t.policy,auth:t.auth}}handleMessage(t,r,n,i){let s=t.type;if(t.type==="event"&&t.event==="connect.challenge"){let o=t.payload,a=typeof o?.nonce=="string"?o.nonce.trim():"";if(!a){n(new Error("connect.challenge \u7F3A\u5C11 nonce"));return}this.connectChallengeNonce=a,this.sendConnect();return}if(t.type==="res"&&!this.connected){let o=t.ok===!0,a=t.payload;if(o&&a&&a.type==="hello-ok"){this.connected=!0;let c=a.server;this.connId=typeof c?.connId=="string"?c.connId:null,clearTimeout(i),W(`[Gateway] \u5DF2\u8FDE\u63A5 connId=${this.connId??"(none)"}`),r(this.mapHelloPayloadToHelloOk(a));return}if(t.ok===!1){let c=t.error,u=typeof c?.message=="string"&&c.message||"Gateway connect \u88AB\u62D2\u7EDD";clearTimeout(i),n(new Error(u));return}}if(s==="hello-ok"||!s&&t.server){this.connected=!0,this.connId=t.server?.connId||null,clearTimeout(i),W(`[Gateway] \u5DF2\u8FDE\u63A5 connId=${this.connId??"(none)"}`),r(t);return}if(t.type==="res"){let o=this.pendingRpcById.get(t.id);o&&(this.pendingRpcById.delete(t.id),o(t));return}t.type==="event"&&kI(t).then(o=>{this.eventHandlers.forEach(a=>a(o))}).catch(o=>{W(`[Gateway] event \u5904\u7406\u5F02\u6B65\u5931\u8D25: ${String(o)}`,"error")})}async callMethod(t,r={}){let n=CI.randomUUID();return new Promise((i,s)=>{if(!this.connected||!this.ws){s(new Error("Not connected to gateway"));return}let o=setTimeout(()=>{this.pendingRpcById.delete(n),s(new Error("Method call timeout"))},3e4);this.pendingRpcById.set(n,c=>{if(clearTimeout(o),c.ok){let u=c.result!==void 0?c.result:c.payload;i(u)}else s(new Error(c.error?.message||"Method call failed"))});let a=JSON.stringify({type:"req",id:n,method:t,params:r});this.ws.send(a),W(`[\u63D2\u4EF6=>Gateway]-[callMethod]: ${a}`)})}onEvent(t){return this.eventHandlers.add(t),()=>this.eventHandlers.delete(t)}close(){this.ws?.close(1e3,"Plugin stopped"),this.connected=!1}isConnected(){return this.connected}getConnId(){return this.connId}getWebSocket(){return this.ws}ping(){this.ws?.ping()}}});function hJ(e){return e.gateway}function mJ(e){if(!e)throw new Error("OpenClaw \u914D\u7F6E\u672A\u521D\u59CB\u5316\uFF08\u9700\u5148\u5B8C\u6210\u63D2\u4EF6 register\uFF09");let t=hJ(e),r=process.env.OPENCLAW_GATEWAY_TOKEN||t?.auth?.token||"";if(!r)throw new Error("\u7F3A\u5C11 Gateway token\uFF1A\u8BF7\u5728 openclaw.json \u7684 gateway.auth.token \u8BBE\u7F6E\uFF0C\u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF OPENCLAW_GATEWAY_TOKEN");let n=t?.tls?.enabled===!0?"wss":"ws";return{url:process.env.OPENCLAW_GATEWAY_URL||t?.remote?.url||`${n}://127.0.0.1:${t?.port??18789}`,token:r,role:"operator",scopes:["operator.admin"]}}function gJ(){try{return mJ(Lt())}catch(e){return W(`Gateway \u6301\u4E45\u8FDE\u63A5\u672A\u542F\u52A8: ${e}`,"error"),null}}function xv(){wf&&(clearInterval(wf),wf=null)}function yJ(){So&&(clearTimeout(So),So=null)}function vJ(e){xv(),wf=setInterval(()=>{if(e.isConnected())try{e.ping()}catch(t){W(`Gateway ping \u5931\u8D25: ${t}`,"error")}},fJ)}function RI(){Eo||So||(So=setTimeout(()=>{So=null,II()},dJ))}function bJ(e,t){let r=e.getWebSocket();if(!r)return;let n=()=>{t===_f&&(xv(),rn===e&&(rn=null),W("Gateway WebSocket \u5DF2\u65AD\u5F00\uFF0C\u5C06\u5728 5s \u540E\u91CD\u8FDE","error"),Eo||RI())};r.once("close",n),r.once("error",n)}async function II(){if(Eo||rn?.isConnected()||bv)return;let e=gJ();if(e){bv=!0;try{_f+=1;let t=_f;if(rn){try{rn.close()}catch{}rn=null}let r=new xf(e);if(await r.connect(),Eo){try{r.close()}catch{}return}if(t!==_f){try{r.close()}catch{}return}rn=r,bJ(r,t),vJ(r),W(`Gateway \u6301\u4E45\u8FDE\u63A5\u6210\u529F connId=${r.getConnId()??"?"}`)}catch(t){W(`Gateway \u8FDE\u63A5\u5931\u8D25: ${t}`,"error"),rn=null,xv(),Eo||RI()}finally{bv=!1}}}function qI(){Eo=!1,yJ(),vv==null&&(vv=setTimeout(()=>{vv=null,II()},0))}function AI(){return rn?.isConnected()??!1}async function PI(e){let t=e?.timeoutMs??xJ,r=e?.intervalMs??wJ,n=Date.now()+t;for(;;){if(e?.signal?.aborted)return!1;if(AI())return!0;if(Date.now()>=n)return AI();await new Promise(i=>setTimeout(i,r))}}async function _J(e,t={}){let r=rn;if(!r?.isConnected())throw new Error("Gateway \u672A\u8FDE\u63A5\uFF08\u7B49\u5F85\u91CD\u8FDE\u6216\u68C0\u67E5\u914D\u7F6E\uFF09");return r.callMethod(e,t)}async function qt(e){return _J(e.method,e.params??{})}var fJ,dJ,rn,wf,So,vv,bv,Eo,_f,xJ,wJ,us=oe(()=>{"use strict";lt();OI();et();fJ=3e4,dJ=5e3;rn=null,wf=null,So=null,vv=null,bv=!1,Eo=!0,_f=0;xJ=12e4,wJ=150});import oi from"node:fs";import wv from"node:path";function Sv(){let e=Ot();return e?wv.join(wv.dirname(e),SJ):null}function DI(e){let t=Sv();if(!t){W("writeSessionStateFile: workspace dir not initialized, skip","error");return}let r={version:_v,savedAt:Date.now(),params:UA(),global:NA(),subagent:e};try{let n=wv.dirname(t);oi.existsSync(n)||oi.mkdirSync(n,{recursive:!0});let i=`${t}.tmp`;oi.writeFileSync(i,JSON.stringify(r,null,2),"utf8"),oi.renameSync(i,t),W(`session state persisted: ${t}`)}catch(n){W(`writeSessionStateFile failed: ${String(n)}`,"error")}}function NI(){let e=Sv();if(!e||!oi.existsSync(e))return null;try{let t=oi.readFileSync(e,"utf8"),r=JSON.parse(t);return!r||typeof r!="object"?null:r.version!==_v?(W(`readSessionStateFile: version mismatch ${r.version} vs ${_v}`,"error"),null):r}catch(t){return W(`readSessionStateFile failed: ${String(t)}`,"error"),null}}function FI(e){e&&($A(e.params),FA(e.global))}function jI(){let e=Sv();if(e)try{oi.existsSync(e)&&oi.unlinkSync(e)}catch(t){W(`removeSessionStateFile failed: ${String(t)}`,"error")}}function si(e,t){let r=t?.trim();r&&e.add(r)}function MI(e){if(!e)return[];let t=new Set;for(let[r]of e.params?.paramsMessageMap??[])si(t,r);for(let[,r]of e.params?.subagentRunIdMap??[])si(t,r);for(let[r]of e.global?.msgStatusBySessionKey??[])si(t,r);for(let[r]of e.global?.cronMessageIdMap??[])si(t,r);for(let[r]of e.subagent?.activeSubagentRunIdsByRequester??[])si(t,r);for(let[r,n]of e.subagent?.requesterByChildSessionKey??[])si(t,r),si(t,n);for(let[r]of e.subagent?.runIdByChildSessionKey??[])si(t,r);return[...t]}var _v,SJ,LI=oe(()=>{"use strict";lt();Yr();et();_v=1,SJ="session-state.json"});import{randomUUID as EJ}from"node:crypto";function zI(e){let t=e.trim(),r=Zt(t);if(r.messageId?.trim()||r.sessionId?.trim())return r;let n=br.get(t);if(n){let i=Zt(n);if(i.messageId?.trim()||i.sessionId?.trim())return i}return r}function ac(e){let t=e.trim();if(!t)return!1;if(Py(t)==="running")return!0;let r=br.get(t);return r?Py(r)==="running":!1}function Ev(e,t,r,n){let i=zI(e);Qr(i,{is_finish:-1,tool_call_id:r,is_cover:n,thinking_content:t,response:""},!1)}function BI(e){let t=xr.get(e);return t||(t=new Set,xr.set(e,t)),t}function TJ(e){let t=xr.get(e);if(t&&t.size>0)return;xr.delete(e);let r=ai.get(e);if(r?.size){ai.delete(e);for(let n of r)try{n()}catch(i){W(`subagent idle waiter error: ${String(i)}`,"error")}}}function CJ(e,t,r){let n=e.trim(),i=t.trim(),s=r.trim();if(!n||!i||!s){W(`subagent track spawn skipped: missing key req=${n} runId=${i} child=${s}`);return}BI(n).add(i),br.set(s,n),ci.set(s,i),W(`subagent track spawn: requester=${n} runId=${i} child=${s} active=${BI(n).size}`)}function OJ(e,t,r){let n=t.trim();if(!n)return;let i=e.requesterSessionKey?.trim()||br.get(n)||e.sessionKey?.trim()||"",s=(r?.trim()||ci.get(n)||"").trim();if(Fy(s),!i){W(`subagent track end: no requester for child=${n} runId=${s}`),br.delete(n),ci.delete(n);return}let o=xr.get(i);o&&s&&o.delete(s),br.delete(n),ci.delete(n),W(`subagent track end: requester=${i} runId=${s||"n/a"} remaining=${o?.size??0}`),o&&o.size===0&&xr.delete(i),TJ(i)}function UI(e){let t=e.trim();if(!t)return[];let r=[];for(let[n,i]of br.entries())i===t&&r.push(n);return r}function HI(e){let t=e.trim();if(!t)return[];let r=[],n=new Set,i=UI(t);for(;i.length>0;){let s=[];for(let o of i){let a=o.trim();!a||n.has(a)||(n.add(a),r.push(a),s.push(...UI(a)))}i=s}return r}function Sf(e){let t=e.trim();if(!t)return;let r=xr.get(t);if(r)for(let i of r)Fy(i);for(let[i,s]of[...br.entries()])s===t&&(br.delete(i),ci.delete(i));xr.delete(t);let n=ai.get(t);if(n?.size){ai.delete(t);for(let i of n)try{i()}catch(s){W(`subagent idle waiter error: ${String(s)}`,"error")}}}function $I(e){let t=e?.trim();return t?xr.get(t)?.size??0:0}function WI(e,t){let r=e?.trim();return!r||$I(r)===0?Promise.resolve():new Promise((n,i)=>{let s=!1,o=f=>{s||(s=!0,l&&clearTimeout(l),t?.signal?.removeEventListener("abort",u),a(),f())},a=()=>{let f=ai.get(r);f&&(f.delete(c),f.size===0&&ai.delete(r))},c=()=>o(()=>n()),u=()=>{let f=t?.signal?.reason;o(()=>i(f instanceof Error?f:new Error(String(f??"Aborted"))))},l;if(t?.timeoutMs!=null&&t.timeoutMs>0&&(l=setTimeout(()=>o(()=>i(new Error(`waitUntilSubagentsIdle timeout ${t.timeoutMs}ms`))),t.timeoutMs)),t?.signal){if(t.signal.aborted){u();return}t.signal.addEventListener("abort",u,{once:!0})}let p=ai.get(r);p||(p=new Set,ai.set(r,p)),p.add(c),$I(r)===0&&c()})}function AJ(e,t){return e==="subagent_spawned"||e==="subagent_ended"||e==="subagent_spawning"||e==="subagent_delivery_target"?(t?.runId&&t?.requesterSessionKey&&BA(t?.runId,t?.requesterSessionKey),(t?.requesterSessionKey||t?.sessionKey||"").trim()):(t?.sessionKey||"").trim()}function RJ(e){if(e?.toolName==="cron")return!0;let t=e?.params?.command;return e?.toolName==="exec"&&typeof t=="string"?t.includes("cron create")||t.includes("cron add"):!1}function IJ(){return{activeSubagentRunIdsByRequester:[...xr.entries()].map(([e,t])=>[e,[...t]]),requesterByChildSessionKey:[...br.entries()],runIdByChildSessionKey:[...ci.entries()]}}function qJ(e){if(xr.clear(),br.clear(),ci.clear(),!!e){for(let[t,r]of e.activeSubagentRunIdsByRequester??[]){if(typeof t!="string"||!t||!Array.isArray(r))continue;let n=new Set;for(let i of r)typeof i=="string"&&i&&n.add(i);n.size>0&&xr.set(t,n)}for(let[t,r]of e.requesterByChildSessionKey??[])typeof t=="string"&&typeof r=="string"&&t&&r&&br.set(t,r);for(let[t,r]of e.runIdByChildSessionKey??[])typeof t=="string"&&typeof r=="string"&&t&&r&&ci.set(t,r)}}async function PJ(e){if(e.length===0)return;if(!await PI({timeoutMs:12e4,intervalMs:150})){W("gateway_start resume: Gateway \u5728\u8D85\u65F6\u5185\u672A\u5C31\u7EEA\uFF0C\u5DF2\u8DF3\u8FC7\u300C\u7EE7\u7EED\u6267\u884C\u300D chat.send\uFF1B\u8BF7\u91CD\u8FDE\u540E\u624B\u52A8\u53D1\u6D88\u606F\u6216\u518D\u6B21\u89E6\u53D1\u6062\u590D","error");return}for(let r of e)try{await qt({method:"chat.send",params:{sessionKey:r,message:"\u7EE7\u7EED\u6267\u884C",deliver:!1,idempotencyKey:EJ()}}),W(`gateway_start resume: chat.send ok sessionKey=${r}`)}catch(n){W(`gateway_start resume: chat.send failed sessionKey=${r}: ${String(n)}`,"error")}}function DJ(e,t,r){if(e==="subagent_spawned"){let n=typeof t?.runId=="string"?t.runId:"",i=typeof t?.childSessionKey=="string"?t.childSessionKey:"",s=typeof r?.requesterSessionKey=="string"?r.requesterSessionKey:typeof r?.sessionKey=="string"?r.sessionKey:"";CJ(s,n,i);return}if(e==="subagent_ended"){let n=typeof t?.targetSessionKey=="string"?t.targetSessionKey:"",i=typeof t?.runId=="string"?t.runId:void 0;OJ(r??{},n,i)}}function GI(e){e.on("gateway_stop",(t,r)=>{try{DI(IJ())}catch(n){W(`gateway_stopped persist session state failed: ${String(n)}`,"error")}}),e.on("gateway_start",(t,r)=>{try{let n=NI();if(!n)return;let i=MI(n);FI(n),qJ(n?.subagent),jI(),W(`gateway_started session state restored (savedAt=${n.savedAt}) keys=${i.length}`),PJ(i)}catch(n){W(`gateway_started restore session state failed: ${String(n)}`,"error")}});for(let t of kJ)e.on(t.event,(r,n)=>{if(t.event==="subagent_ended"&&r?.targetKind==="acp")return;DJ(t.event,r,n);let i=AJ(t.event,n??{});if(i){if(ac(i)||t.event==="before_tool_call"&&RJ(r)){if(["after_tool_call","before_tool_call"].includes(t.event)){let{result:o,...a}=r;if(W(`\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\uFF1A ~ event:${t.event} ~ params:${JSON.stringify(a)}`),t.event==="before_tool_call"){let u=eR(a,i),l=JSON.stringify({type:t.event,specialIdentification:"dcgchat_tool_call_special_identification",callId:r.toolCallId||r.runId||Date.now().toString(),...a,status:"running"});return Ev(i,l,r.toolCallId||r.runId||Date.now().toString(),0),u}let c=JSON.stringify({type:t.event,specialIdentification:"dcgchat_tool_call_special_identification",callId:r.toolCallId||r.runId||Date.now().toString(),...a,status:t.event==="after_tool_call"?"finished":"running"});Ev(i,c,r.toolCallId||r.runId||Date.now().toString(),t.event==="after_tool_call"?1:0)}else if(t.event){let o=zI(i);if(t.event==="llm_output"&&(console.log("\u{1F680} ~ monitoringToolMessage ~ item.event:",t.event),r.lastAssistant?.errorMessage==="1003-\u989D\u5EA6\u4E0D\u8DB3\u8BF7\u5145\u503C")){Zr("\u60A8\u7684\u58A8\u6EF4\u5DF2\u6D88\u8017\u5B8C\uFF0C\u60A8\u53EF\u4EE5\u901A\u8FC7\u5145\u503C\u58A8\u6EF4\u6765\u7EE7\u7EED\u4F7F\u7528",o,{message_tags:{insufficient_balance:1},is_finish:-1}),gr(o,"\u58A8\u6EF4\u4E0D\u8DB3");return}let a=JSON.stringify({type:t.event,specialIdentification:"dcgchat_tool_call_special_identification",toolName:"",callId:r.runId||Date.now().toString(),params:t.message});Ev(i,a,r.runId||Date.now().toString(),0),W(`\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\uFF1A ~ event:${t.event}`)}}}else t.event!=="before_tool_call"&&W(`\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\uFF1A ~ event:${t.event} ~ \u6CA1\u6709sessionKey \u4E3A\u6267\u884C`)})}var kJ,xr,br,ci,ai,ko=oe(()=>{"use strict";lt();et();Rr();Yr();tR();us();LI();kJ=[{event:"subagent_spawning",message:""},{event:"subagent_spawned",message:""},{event:"subagent_delivery_target",message:""},{event:"llm_output",message:""},{event:"subagent_ended",message:""},{event:"before_tool_call",message:""},{event:"after_tool_call",message:""}];xr=new Map,br=new Map,ci=new Map,ai=new Map});function NJ(e){return e instanceof Error?e.message:typeof e=="string"?e:String(e)}function Ef(e){let t=NJ(e);return/context overflow/i.test(t)||/prompt too large/i.test(t)||/auto-compaction failed/i.test(t)||/\(precheck\)/i.test(t)}function kf(){return"\u5F53\u524D\u5BF9\u8BDD\u8FC7\u957F\uFF0C\u5DF2\u8D85\u8FC7\u6A21\u578B\u4E0A\u4E0B\u6587\u9650\u5236\uFF1B\u81EA\u52A8\u538B\u7F29\u672A\u5B8C\u5168\u751F\u6548\u65F6\u4F1A\u51FA\u73B0\u6B64\u60C5\u51B5\u3002\u8BF7\u5C1D\u8BD5\u65B0\u5F00\u5BF9\u8BDD\u3001\u7F29\u77ED\u4EFB\u52A1\uFF0C\u6216\u6362\u7528\u66F4\u5927\u4E0A\u4E0B\u6587\u7684\u6A21\u578B\u3002"}var KI=oe(()=>{"use strict"});function VI(e,t){Tf.set(e,t)}function XI(e){Tf.delete(e)}function To(e){return Cf.has(e)}function Tv(e){Cf.delete(e)}function FJ(e){Cf.add(e)}function JI(e){let t=ui.get(e);t&&(t.abort(),ui.delete(e)),kv.set(e,Promise.resolve()),Cv(e,"interrupt").catch(r=>W(`preempt: gateway abort: ${String(r)}`,"error")),W(`inbound queue: reset tail for /stop sessionKey=${e}`)}async function YI(e,t){let n=(kv.get(e)??Promise.resolve()).catch(()=>{}).then(t);kv.set(e,n.catch(()=>{})),await n}async function Cv(e,t){let r=t==="interrupt"?"interrupt":"supersede",i=[...HI(e)].reverse(),s=Tf.get(e);i.length>0&&W(`${r}: chat.abort ${i.length} subagent session(s) (nested incl.)`);for(let o of i)try{await qt({method:"chat.abort",params:{sessionKey:o}})}catch(a){W(`${r}: chat.abort subagent ${o}: ${String(a)}`,"error")}try{await qt({method:"chat.abort",params:s?{sessionKey:e,runId:s}:{sessionKey:e}})}catch(o){W(`${r}: chat.abort main ${e}: ${String(o)}`,"error")}Tf.delete(e),Sf(e)}async function QI(e){ui.get(e)?.abort(),await Cv(e,"supersede"),Cf.delete(e);let t=new AbortController;return ui.set(e,t),t}function ZI(e,t){t&&ui.get(e)===t&&ui.delete(e)}async function eq(e,t){W(`interrupt command: sessionKey=${e}`);let r=ui.get(e);r&&(W(`interrupt: AbortController.abort() in-process run sessionKey=${e}`),r.abort(),ui.delete(e));let n=t.messageId?.trim()?t:{...t,messageId:`${Date.now()}`};gr(n,"abort"),FJ(e),await Cv(e,"interrupt")}var Tf,ui,Cf,kv,Of=oe(()=>{"use strict";us();Rr();et();ko();Tf=new Map,ui=new Map,Cf=new Set,kv=new Map});import tq from"node:path";import{buildAgentMediaPayload as jJ}from"openclaw/plugin-sdk/agent-media-payload";function rq(e,t){for(let r of t){let n=e[r];if(typeof n=="string"&&n.trim())return n.trim()}}function Ov(e){try{return tq.basename(new URL(e).pathname)||"file"}catch{let t=e.split(/[\\/]/).pop()??e;return tq.basename(t.split("?")[0]||t)||"file"}}function nq(e){if(e==null)return null;if(typeof e=="string"){let i=e.trim();return i?{url:i,name:Ov(i)}:null}if(typeof e!="object")return null;let t=e,r=rq(t,LJ);if(!r)return null;let n=rq(t,BJ)??"";return{url:r,name:n||Ov(r)}}function $J(e){if(Array.isArray(e))return e;if(typeof e=="string"){let t=e.trim();if(!t)return[];try{let r=JSON.parse(t);return Array.isArray(r)?r:[]}catch{return[]}}return[]}function iq(e){let t=new Set,r=[];for(let n of UJ)for(let i of $J(e[n])){let s=nq(i);s&&!t.has(s.url)&&(t.add(s.url),r.push(s))}for(let n of["file","attachment","media"]){let i=nq(e[n]);i&&!t.has(i.url)&&(t.add(i.url),r.push(i))}return r}function zJ(e){let t=(e||"").toLowerCase();return t.startsWith("image/")?"<media:image>":t.startsWith("video/")?"<media:video>":t.startsWith("audio/")?"<media:audio>":(t==="application/pdf"||t.includes("word")||t.includes("document")||t.includes("msword")||t.includes("officedocument")||t.includes("spreadsheet")||t.includes("presentation"),"<media:document>")}function sq(e){if(e.length===0)return{};let t=jJ(e.map(n=>({path:n.path,contentType:n.contentType||null}))),r=e.map(n=>n.fileName).filter(Boolean);return r.length===0?{...t}:{...t,MediaFileName:r[0],MediaFileNames:r}}function oq(e,t){if(t.length===0)return e;let r=t.map((i,s)=>`${s+1}) ${i.fileName} [${i.contentType||"unknown"}]`).join("; "),n=t.map(i=>i.placeholder).join(`
|
|
103
|
+
`+r)}function as(e,t,r,n,i,s){if(e.listenerCount("wsClientError")){let o=new Error(i);Error.captureStackTrace(o,as),e.emit("wsClientError",o,r,t)}else oc(r,n,i,s)}});var tJ,rJ,nJ,mf,iJ,oI,uv=oe(()=>{tJ=or(JR(),1),rJ=or(Qy(),1),nJ=or(tv(),1),mf=or(df(),1),iJ=or(sI(),1),oI=mf.default});import yf from"crypto";function cI(e){let t=yf.createPublicKey(e).export({type:"spki",format:"der"});return t.length===gf.length+32&&t.subarray(0,gf.length).equals(gf)?t.subarray(gf.length):t}function uI(e){return e.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function lv(e){return uI(cI(e))}function pv(e){let t=cI(e);return yf.createHash("sha256").update(t).digest("hex")}function lI(e,t,r="base64url"){let n=yf.createPrivateKey(e),i=yf.sign(null,Buffer.from(t,"utf8"),n);return r==="base64url"?uI(i):i.toString("base64")}function sJ(e){if(typeof e!="string")return"";let t=e.trim();return t||""}function oJ(e){return e.replace(/[A-Z]/g,t=>String.fromCharCode(t.charCodeAt(0)+32))}function aI(e){let t=sJ(e);return t?oJ(t):""}function pI(e){let t=e.scopes.join(","),r=e.token??"",n=aI(e.platform??""),i=aI(e.deviceFamily??"");return["v3",e.deviceId,e.clientId,e.clientMode,e.role,t,String(e.signedAtMs),r,e.nonce,n,i].join("|")}var gf,fI=oe(()=>{"use strict";gf=Buffer.from("302a300506032b6570032100","hex")});import aJ from"node:path";import dv from"node:fs";function ni(){let t=Ot().replace("workspace","cron");return aJ.join(t,"jobs.json")}function cs(e,t){let r=t?.trim();if(!r)return null;if(!dv.existsSync(e))return W(`readCronJobSessionKey: file not found ${e}`,"error"),null;try{let n=dv.readFileSync(e,"utf8");return(JSON.parse(n).jobs??[]).find(o=>o.id===r)||null}catch(n){return W(`readCronJobSessionKey: failed to read ${e}: ${String(n)}`,"error"),null}}async function uJ(e){let t=ni(),r=Ar().botToken;if(dv.existsSync(t))try{let n=await Yp(t,r??"",0);W(`\u5B9A\u65F6\u4EFB\u52A1\u66F4\u65B0\u6210\u529F: ${n}`);let i=e?.split(":")||[],s=i.at(-1)??"",o=i.at(-2)??"";QA({event_type:"cron",operation_type:"install",session_id:s,agent_id:o,oss_url:n})}catch(n){W(`${t} upload failed: ${n}`,"error")}else W(`${t} not found`,"error")}function vf(e){let t=ni(),{sessionKey:r}=cs(t,e)||{};W(`sessionKey: ${r}, jobId: ${e}`),fv!==null&&clearTimeout(fv),fv=setTimeout(()=>{uJ(r)},cJ)}var cJ,fv,dI,hI,mI,gI,yI,bf=oe(()=>{"use strict";Rr();lt();Uy();et();us();Yr();cJ=2400,fv=null;dI=async e=>{if(!e?.trim()){W("onRemoveCronJob: empty jobId","error");return}qt({method:"cron.remove",params:{id:e}})},hI=async e=>{if(!e?.trim()){W("onRemoveCronJob: empty jobId","error");return}qt({method:"cron.update",params:{id:e,patch:{enabled:!1}}})},mI=async e=>{if(!e?.trim()){W("onRemoveCronJob: empty jobId","error");return}qt({method:"cron.update",params:{id:e,patch:{enabled:!0}}})},gI=async(e,t)=>{let r=e?.trim();if(!r){W("onRemoveCronJob: empty jobId","error");return}let n=ni(),{sessionKey:i}=cs(n,e)||{};if(!i){W(`finishedDcgchatCron: no sessionKey for job id=${r}`,"error");return}rs(i,t),qt({method:"cron.runs",params:{scope:"job",id:e,limit:50,offset:0,status:"all",sortDir:"desc"}}),qt({method:"cron.run",params:{id:e,mode:"force"}})},yI=async(e,t,r)=>{let n=e?.trim();if(!n){W("finishedDcgchatCron: empty jobId","error");return}let i=ni(),{sessionKey:s,name:o}=cs(i,n)||{};if(!s){W(`finishedDcgchatCron: no sessionKey for job id=${n}`,"error");return}let a=vn(s)||`${Date.now()}`,c=s.split(":"),u=c.at(-1)??"",l=c.at(-2)??"",p=XA({agentId:l,sessionId:`${u}`,messageId:a||`${Date.now()}`,real_mobook:u?"":1}),f={source:"cron"};r&&(f.hasFile=!0),Qr(p,{response:t,message_tags:f,is_finish:-1}),setTimeout(()=>{gr(p,"cron send")},200);let d=hr(),h=Ar();mr()&&d?.send(JSON.stringify({messageType:"openclaw_bot_event",source:"client",content:{event_type:"notify",operation_type:"cron",bot_token:h.botToken,app_id:h.appId,session_id:u,agent_id:l,real_mobook:u?"":1,title:o}})),W(`\u5B9A\u65F6\u4EFB\u52A1\u6267\u884C\u6210\u529F: ${n}`),DA(s),W(`finishedDcgchatCron: job=${n} sessionKey=${s}`)}});import hv from"node:os";import ii from"node:path";function bI(e){return ii.normalize(e.trim()).replace(/\\/g,"/")}function vI(e,t){let r=ii.resolve(t),n=ii.resolve(e),i=ii.relative(r,n);return!(i.startsWith("..")||ii.isAbsolute(i))}function mv(e,t,r){let n=t?.trim();if(n&&vI(e,n))return!0;if(r?.length){for(let s of r)if(vI(e,s))return!0}let i=bI(e);return i.startsWith("/workspace/")||i==="/workspace"||i.startsWith("/mobook/")||i==="/mobook"?!0:/^[A-Za-z]:\/(workspace|mobook)(\/|$)/.test(i)}function gv(e){return e.replace(/[`'",,*_)\]]+$/u,"").trimEnd()}function yv(e){let t=e.trim();return t&&(t==="~"?hv.homedir():t.startsWith("~/")?ii.resolve(hv.homedir(),t.slice(2)):t.startsWith("~\\")?ii.resolve(hv.homedir(),t.slice(2)):t)}function xI(e,t){if(!e)return[];let r=e.match(/\/workspace\/[^\s]+|\/mobook\/[^\s]+/g)??[],n=e.match(/[A-Za-z]:[/\\](?:workspace|mobook)[/\\][^\s]+/g)??[],i=e.match(/~[/\\][^\s`'")\]]+/g)??[],s=[],o=t?.trim();if(o){let u=new Set;u.add(o),u.add(bI(o)),ii.sep==="\\"&&u.add(o.replace(/\//g,"\\"));for(let l of u){if(!l)continue;let p=0;for(;p<e.length;){let f=e.indexOf(l,p);if(f===-1)break;let d=f+l.length;for(;d<e.length&&!/\s/.test(e[d]);)d++;s.push(e.slice(f,d)),p=f+1}}}let c=[...r,...n,...i,...s].map(u=>gv(u)).filter(Boolean).map(u=>u.startsWith("~")?yv(u):u);return[...new Set(c)]}var wI=oe(()=>{"use strict"});function lJ(e,t){if(typeof e=="string"){let r=e.trim();r&&t.push(r);return}if(e&&typeof e=="object"){let r=e,n=typeof r.path=="string"?r.path.trim():"",i=typeof r.file=="string"?r.file.trim():"",s=n||i;s&&t.push(s)}}function pJ(e){if(e==null||typeof e!="object")return[];let r=e.attachments;if(!Array.isArray(r))return[];let n=[];for(let o of r)lJ(o,n);let i=new Set,s=[];for(let o of n)i.has(o)||(i.add(o),s.push(o));return s}function _I(e){let t=new Set,r=[];for(let n of e)!n||t.has(n)||(t.add(n),r.push(n));return r}function SI(e,t,r,n){let s=pJ(e).map(a=>yv(gv(a))).filter(Boolean).filter(a=>mv(a,r,n));if(s.length>0)return _I(s);let o=xI(t,r).filter(a=>mv(a,r,n));return _I(o)}var EI=oe(()=>{"use strict";wI()});async function kI(e){try{if(e.event==="agent"){let t=e.payload,r=LA(t.runId),n=Zt(r);t.data?.delta&&n.sessionId&&Zp(t.data.delta,n,0)}if(e.event==="cron"){let t=e.payload;if(W(`[Gateway] \u6536\u5230\u5B9A\u65F6\u4EFB\u52A1\u4E8B\u4EF6: ${JSON.stringify(t)}`),t?.action==="added"&&vf(t?.jobId),t?.action==="updated"&&vf(t?.jobId),t?.action==="removed"&&vf(t?.jobId),t?.action==="finished"&&t?.status==="ok"){let r=typeof t?.summary=="string"?t.summary:"";r.indexOf("HEARTBEAT_OK")>=0&&r!=="HEARTBEAT_OK"&&(r=r.replace("HEARTBEAT_OK",""));let n=typeof t?.jobId=="string"?t.jobId.trim():"",s=Lt()?.channels?.dcgchat,o=SI(t,r,Ot(),s?.allowedPaths),a=ni(),c=n?cs(a,n):null,u=c&&typeof c.sessionKey=="string"?c.sessionKey.trim():"";if(u&&o.length>0){let p=vn(u)||`${Date.now()}`;rs(u,p);for(let f of o)try{await tn({sessionKey:u,mediaUrl:f,messageId:p})}catch(d){W(`[Gateway] cron \u9644\u4EF6\u7ECF\u901A\u9053\u53D1\u9001\u5931\u8D25: ${f} ${String(d)}`,"error")}}else o.length>0&&!u&&W(`[Gateway] cron finished \u6709\u53EF\u53D1\u9001\u9644\u4EF6\u8DEF\u5F84\u4F46 jobs.json \u65E0 sessionKey: jobId=${n}`,"error");let l=o.length>0;yI(n,r,l)}}}catch(t){W(`[Gateway] \u5904\u7406\u4E8B\u4EF6\u5931\u8D25: ${t}`,"error")}return{type:e.event,payload:e.payload,seq:e.seq}}var TI=oe(()=>{"use strict";bf();_o();EI();et();Yr();Rr();lt()});import CI from"crypto";var xf,OI=oe(()=>{"use strict";uv();fI();et();lt();TI();xf=class{ws=null;config;deviceId;privateKeyPem;publicKeyB64Url;connected=!1;connId=null;connectChallengeNonce=null;connectSent=!1;pendingRpcById=new Map;eventHandlers=new Set;constructor(t){this.config={url:t.url,token:t.token,role:t.role||"operator",scopes:t.scopes||["operator.admin"],reconnectInterval:t.reconnectInterval||5e3,maxReconnectAttempts:t.maxReconnectAttempts||10};let r=this.loadOrCreateDeviceIdentity();this.deviceId=r.deviceId,this.privateKeyPem=r.privateKeyPem,this.publicKeyB64Url=r.publicKeyB64Url}loadOrCreateDeviceIdentity(){let t=z("fs"),r=z("path"),n=Ot(),i=r.join(n,".state"),s=r.join(i,"device.json");if(t.existsSync(s)){let p=JSON.parse(t.readFileSync(s,"utf8"));if(p.deviceId&&p.publicKeyPem&&p.privateKeyPem){let f=pv(p.publicKeyPem),d=f!==p.deviceId?f:p.deviceId;if(f!==p.deviceId)try{t.writeFileSync(s,JSON.stringify({...p,deviceId:f},null,2))}catch{}return{deviceId:d,publicKeyPem:p.publicKeyPem,privateKeyPem:p.privateKeyPem,publicKeyB64Url:lv(p.publicKeyPem)}}}let o=CI.generateKeyPairSync("ed25519"),a=o.publicKey.export({type:"spki",format:"pem"}).toString(),c=o.privateKey.export({type:"pkcs8",format:"pem"}).toString(),u=pv(a),l=lv(a);return t.existsSync(i)||t.mkdirSync(i,{recursive:!0}),t.writeFileSync(s,JSON.stringify({version:1,deviceId:u,publicKeyPem:a,privateKeyPem:c,createdAtMs:Date.now()},null,2)),t.chmodSync(s,384),{deviceId:u,publicKeyPem:a,privateKeyPem:c,publicKeyB64Url:l}}async connect(){return new Promise((t,r)=>{this.connectChallengeNonce=null,this.connectSent=!1,this.ws=new mf.default(this.config.url);let n=!1,i=o=>{n||(n=!0,clearTimeout(s),o())},s=setTimeout(()=>{i(()=>r(new Error("Gateway connection timeout")))},15e3);this.ws.on("open",()=>{W("Gateway connection opened\uFF08\u7B49\u5F85 connect.challenge\uFF09")}),this.ws.on("message",(o,...a)=>{try{let c=JSON.parse(o.toString());this.handleMessage(c,u=>i(()=>t(u)),u=>i(()=>r(u)),s)}catch(c){W(`[Gateway=>\u63D2\u4EF6]-[\u6D88\u606F\u89E3\u6790\u5931\u8D25]: ${c}`,"error")}}),this.ws.on("close",()=>{this.connected=!1,i(()=>r(new Error("Gateway \u5728\u63E1\u624B\u5B8C\u6210\u524D\u5173\u95ED\u4E86\u8FDE\u63A5")))}),this.ws.on("error",o=>{W(`Gateway \u8FDE\u63A5\u9519\u8BEF: ${o}`,"error"),i(()=>r(o))})})}sendConnect(){if(this.connectSent)return;let t=this.connectChallengeNonce?.trim()??"";if(!t)return;this.connectSent=!0;let r=Date.now(),n=process.platform,i=pI({deviceId:this.deviceId,clientId:"gateway-client",clientMode:"backend",role:this.config.role,scopes:this.config.scopes,signedAtMs:r,token:this.config.token,nonce:t,platform:n,deviceFamily:""}),s=lI(this.privateKeyPem,i),o=JSON.stringify({type:"req",id:"1",method:"connect",params:{minProtocol:3,maxProtocol:3,client:{id:"gateway-client",version:"1.0.0",platform:n,mode:"backend"},auth:{token:this.config.token},role:this.config.role,scopes:this.config.scopes,device:{id:this.deviceId,publicKey:this.publicKeyB64Url,signature:s,signedAt:r,nonce:t}}});this.ws?.send(o),W(`[\u63D2\u4EF6=>Gateway]-[sendConnect]: ${o}`)}mapHelloPayloadToHelloOk(t){let r=t.server,n=t.features;return{server:{connId:typeof r?.connId=="string"?r.connId:""},features:{methods:Array.isArray(n?.methods)?n.methods:[],events:Array.isArray(n?.events)?n.events:[]},policy:t.policy,auth:t.auth}}handleMessage(t,r,n,i){let s=t.type;if(t.type==="event"&&t.event==="connect.challenge"){let o=t.payload,a=typeof o?.nonce=="string"?o.nonce.trim():"";if(!a){n(new Error("connect.challenge \u7F3A\u5C11 nonce"));return}this.connectChallengeNonce=a,this.sendConnect();return}if(t.type==="res"&&!this.connected){let o=t.ok===!0,a=t.payload;if(o&&a&&a.type==="hello-ok"){this.connected=!0;let c=a.server;this.connId=typeof c?.connId=="string"?c.connId:null,clearTimeout(i),W(`[Gateway] \u5DF2\u8FDE\u63A5 connId=${this.connId??"(none)"}`),r(this.mapHelloPayloadToHelloOk(a));return}if(t.ok===!1){let c=t.error,u=typeof c?.message=="string"&&c.message||"Gateway connect \u88AB\u62D2\u7EDD";clearTimeout(i),n(new Error(u));return}}if(s==="hello-ok"||!s&&t.server){this.connected=!0,this.connId=t.server?.connId||null,clearTimeout(i),W(`[Gateway] \u5DF2\u8FDE\u63A5 connId=${this.connId??"(none)"}`),r(t);return}if(t.type==="res"){let o=this.pendingRpcById.get(t.id);o&&(this.pendingRpcById.delete(t.id),o(t));return}t.type==="event"&&kI(t).then(o=>{this.eventHandlers.forEach(a=>a(o))}).catch(o=>{W(`[Gateway] event \u5904\u7406\u5F02\u6B65\u5931\u8D25: ${String(o)}`,"error")})}async callMethod(t,r={}){let n=CI.randomUUID();return new Promise((i,s)=>{if(!this.connected||!this.ws){s(new Error("Not connected to gateway"));return}let o=setTimeout(()=>{this.pendingRpcById.delete(n),s(new Error("Method call timeout"))},3e4);this.pendingRpcById.set(n,c=>{if(clearTimeout(o),c.ok){let u=c.result!==void 0?c.result:c.payload;i(u)}else s(new Error(c.error?.message||"Method call failed"))});let a=JSON.stringify({type:"req",id:n,method:t,params:r});this.ws.send(a),W(`[\u63D2\u4EF6=>Gateway]-[callMethod]: ${a}`)})}onEvent(t){return this.eventHandlers.add(t),()=>this.eventHandlers.delete(t)}close(){this.ws?.close(1e3,"Plugin stopped"),this.connected=!1}isConnected(){return this.connected}getConnId(){return this.connId}getWebSocket(){return this.ws}ping(){this.ws?.ping()}}});function hJ(e){return e.gateway}function mJ(e){if(!e)throw new Error("OpenClaw \u914D\u7F6E\u672A\u521D\u59CB\u5316\uFF08\u9700\u5148\u5B8C\u6210\u63D2\u4EF6 register\uFF09");let t=hJ(e),r=process.env.OPENCLAW_GATEWAY_TOKEN||t?.auth?.token||"";if(!r)throw new Error("\u7F3A\u5C11 Gateway token\uFF1A\u8BF7\u5728 openclaw.json \u7684 gateway.auth.token \u8BBE\u7F6E\uFF0C\u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF OPENCLAW_GATEWAY_TOKEN");let n=t?.tls?.enabled===!0?"wss":"ws";return{url:process.env.OPENCLAW_GATEWAY_URL||t?.remote?.url||`${n}://127.0.0.1:${t?.port??18789}`,token:r,role:"operator",scopes:["operator.admin"]}}function gJ(){try{return mJ(Lt())}catch(e){return W(`Gateway \u6301\u4E45\u8FDE\u63A5\u672A\u542F\u52A8: ${e}`,"error"),null}}function xv(){wf&&(clearInterval(wf),wf=null)}function yJ(){So&&(clearTimeout(So),So=null)}function vJ(e){xv(),wf=setInterval(()=>{if(e.isConnected())try{e.ping()}catch(t){W(`Gateway ping \u5931\u8D25: ${t}`,"error")}},fJ)}function RI(){Eo||So||(So=setTimeout(()=>{So=null,II()},dJ))}function bJ(e,t){let r=e.getWebSocket();if(!r)return;let n=()=>{t===_f&&(xv(),rn===e&&(rn=null),W("Gateway WebSocket \u5DF2\u65AD\u5F00\uFF0C\u5C06\u5728 5s \u540E\u91CD\u8FDE","error"),Eo||RI())};r.once("close",n),r.once("error",n)}async function II(){if(Eo||rn?.isConnected()||bv)return;let e=gJ();if(e){bv=!0;try{_f+=1;let t=_f;if(rn){try{rn.close()}catch{}rn=null}let r=new xf(e);if(await r.connect(),Eo){try{r.close()}catch{}return}if(t!==_f){try{r.close()}catch{}return}rn=r,bJ(r,t),vJ(r),W(`Gateway \u6301\u4E45\u8FDE\u63A5\u6210\u529F connId=${r.getConnId()??"?"}`)}catch(t){W(`Gateway \u8FDE\u63A5\u5931\u8D25: ${t}`,"error"),rn=null,xv(),Eo||RI()}finally{bv=!1}}}function qI(){Eo=!1,yJ(),vv==null&&(vv=setTimeout(()=>{vv=null,II()},0))}function AI(){return rn?.isConnected()??!1}async function PI(e){let t=e?.timeoutMs??xJ,r=e?.intervalMs??wJ,n=Date.now()+t;for(;;){if(e?.signal?.aborted)return!1;if(AI())return!0;if(Date.now()>=n)return AI();await new Promise(i=>setTimeout(i,r))}}async function _J(e,t={}){let r=rn;if(!r?.isConnected())throw new Error("Gateway \u672A\u8FDE\u63A5\uFF08\u7B49\u5F85\u91CD\u8FDE\u6216\u68C0\u67E5\u914D\u7F6E\uFF09");return r.callMethod(e,t)}async function qt(e){return _J(e.method,e.params??{})}var fJ,dJ,rn,wf,So,vv,bv,Eo,_f,xJ,wJ,us=oe(()=>{"use strict";lt();OI();et();fJ=3e4,dJ=5e3;rn=null,wf=null,So=null,vv=null,bv=!1,Eo=!0,_f=0;xJ=12e4,wJ=150});import oi from"node:fs";import wv from"node:path";function Sv(){let e=Ot();return e?wv.join(wv.dirname(e),SJ):null}function DI(e){let t=Sv();if(!t){W("writeSessionStateFile: workspace dir not initialized, skip","error");return}let r={version:_v,savedAt:Date.now(),params:UA(),global:NA(),subagent:e};try{let n=wv.dirname(t);oi.existsSync(n)||oi.mkdirSync(n,{recursive:!0});let i=`${t}.tmp`;oi.writeFileSync(i,JSON.stringify(r,null,2),"utf8"),oi.renameSync(i,t),W(`session state persisted: ${t}`)}catch(n){W(`writeSessionStateFile failed: ${String(n)}`,"error")}}function NI(){let e=Sv();if(!e||!oi.existsSync(e))return null;try{let t=oi.readFileSync(e,"utf8"),r=JSON.parse(t);return!r||typeof r!="object"?null:r.version!==_v?(W(`readSessionStateFile: version mismatch ${r.version} vs ${_v}`,"error"),null):r}catch(t){return W(`readSessionStateFile failed: ${String(t)}`,"error"),null}}function FI(e){e&&($A(e.params),FA(e.global))}function jI(){let e=Sv();if(e)try{oi.existsSync(e)&&oi.unlinkSync(e)}catch(t){W(`removeSessionStateFile failed: ${String(t)}`,"error")}}function si(e,t){let r=t?.trim();r&&e.add(r)}function MI(e){if(!e)return[];let t=new Set;for(let[r]of e.params?.paramsMessageMap??[])si(t,r);for(let[,r]of e.params?.subagentRunIdMap??[])si(t,r);for(let[r]of e.global?.msgStatusBySessionKey??[])si(t,r);for(let[r]of e.global?.cronMessageIdMap??[])si(t,r);for(let[r]of e.subagent?.activeSubagentRunIdsByRequester??[])si(t,r);for(let[r,n]of e.subagent?.requesterByChildSessionKey??[])si(t,r),si(t,n);for(let[r]of e.subagent?.runIdByChildSessionKey??[])si(t,r);return[...t]}var _v,SJ,LI=oe(()=>{"use strict";lt();Yr();et();_v=1,SJ="session-state.json"});import{randomUUID as EJ}from"node:crypto";function zI(e){let t=e.trim(),r=Zt(t);if(r.messageId?.trim()||r.sessionId?.trim())return r;let n=br.get(t);if(n){let i=Zt(n);if(i.messageId?.trim()||i.sessionId?.trim())return i}return r}function ac(e){let t=e.trim();if(!t)return!1;if(Py(t)==="running")return!0;let r=br.get(t);return r?Py(r)==="running":!1}function Ev(e,t,r,n){let i=zI(e);Qr(i,{is_finish:-1,tool_call_id:r,is_cover:n,thinking_content:t,response:""},!1)}function BI(e){let t=xr.get(e);return t||(t=new Set,xr.set(e,t)),t}function TJ(e){let t=xr.get(e);if(t&&t.size>0)return;xr.delete(e);let r=ai.get(e);if(r?.size){ai.delete(e);for(let n of r)try{n()}catch(i){W(`subagent idle waiter error: ${String(i)}`,"error")}}}function CJ(e,t,r){let n=e.trim(),i=t.trim(),s=r.trim();if(!n||!i||!s){W(`subagent track spawn skipped: missing key req=${n} runId=${i} child=${s}`);return}BI(n).add(i),br.set(s,n),ci.set(s,i),W(`subagent track spawn: requester=${n} runId=${i} child=${s} active=${BI(n).size}`)}function OJ(e,t,r){let n=t.trim();if(!n)return;let i=e.requesterSessionKey?.trim()||br.get(n)||e.sessionKey?.trim()||"",s=(r?.trim()||ci.get(n)||"").trim();if(Fy(s),!i){W(`subagent track end: no requester for child=${n} runId=${s}`),br.delete(n),ci.delete(n);return}let o=xr.get(i);o&&s&&o.delete(s),br.delete(n),ci.delete(n),W(`subagent track end: requester=${i} runId=${s||"n/a"} remaining=${o?.size??0}`),o&&o.size===0&&xr.delete(i),TJ(i)}function UI(e){let t=e.trim();if(!t)return[];let r=[];for(let[n,i]of br.entries())i===t&&r.push(n);return r}function HI(e){let t=e.trim();if(!t)return[];let r=[],n=new Set,i=UI(t);for(;i.length>0;){let s=[];for(let o of i){let a=o.trim();!a||n.has(a)||(n.add(a),r.push(a),s.push(...UI(a)))}i=s}return r}function Sf(e){let t=e.trim();if(!t)return;let r=xr.get(t);if(r)for(let i of r)Fy(i);for(let[i,s]of[...br.entries()])s===t&&(br.delete(i),ci.delete(i));xr.delete(t);let n=ai.get(t);if(n?.size){ai.delete(t);for(let i of n)try{i()}catch(s){W(`subagent idle waiter error: ${String(s)}`,"error")}}}function $I(e){let t=e?.trim();return t?xr.get(t)?.size??0:0}function WI(e,t){let r=e?.trim();return!r||$I(r)===0?Promise.resolve():new Promise((n,i)=>{let s=!1,o=f=>{s||(s=!0,l&&clearTimeout(l),t?.signal?.removeEventListener("abort",u),a(),f())},a=()=>{let f=ai.get(r);f&&(f.delete(c),f.size===0&&ai.delete(r))},c=()=>o(()=>n()),u=()=>{let f=t?.signal?.reason;o(()=>i(f instanceof Error?f:new Error(String(f??"Aborted"))))},l;if(t?.timeoutMs!=null&&t.timeoutMs>0&&(l=setTimeout(()=>o(()=>i(new Error(`waitUntilSubagentsIdle timeout ${t.timeoutMs}ms`))),t.timeoutMs)),t?.signal){if(t.signal.aborted){u();return}t.signal.addEventListener("abort",u,{once:!0})}let p=ai.get(r);p||(p=new Set,ai.set(r,p)),p.add(c),$I(r)===0&&c()})}function AJ(e,t){return e==="subagent_spawned"||e==="subagent_ended"||e==="subagent_spawning"||e==="subagent_delivery_target"?(t?.runId&&t?.requesterSessionKey&&BA(t?.runId,t?.requesterSessionKey),(t?.requesterSessionKey||t?.sessionKey||"").trim()):(t?.sessionKey||"").trim()}function RJ(e){if(e?.toolName==="cron")return!0;let t=e?.params?.command;return e?.toolName==="exec"&&typeof t=="string"?t.includes("cron create")||t.includes("cron add"):!1}function IJ(){return{activeSubagentRunIdsByRequester:[...xr.entries()].map(([e,t])=>[e,[...t]]),requesterByChildSessionKey:[...br.entries()],runIdByChildSessionKey:[...ci.entries()]}}function qJ(e){if(xr.clear(),br.clear(),ci.clear(),!!e){for(let[t,r]of e.activeSubagentRunIdsByRequester??[]){if(typeof t!="string"||!t||!Array.isArray(r))continue;let n=new Set;for(let i of r)typeof i=="string"&&i&&n.add(i);n.size>0&&xr.set(t,n)}for(let[t,r]of e.requesterByChildSessionKey??[])typeof t=="string"&&typeof r=="string"&&t&&r&&br.set(t,r);for(let[t,r]of e.runIdByChildSessionKey??[])typeof t=="string"&&typeof r=="string"&&t&&r&&ci.set(t,r)}}async function PJ(e){if(e.length===0)return;if(!await PI({timeoutMs:12e4,intervalMs:150})){W("gateway_start resume: Gateway \u5728\u8D85\u65F6\u5185\u672A\u5C31\u7EEA\uFF0C\u5DF2\u8DF3\u8FC7\u300C\u7EE7\u7EED\u6267\u884C\u300D chat.send\uFF1B\u8BF7\u91CD\u8FDE\u540E\u624B\u52A8\u53D1\u6D88\u606F\u6216\u518D\u6B21\u89E6\u53D1\u6062\u590D","error");return}for(let r of e)try{await qt({method:"chat.send",params:{sessionKey:r,message:"\u7EE7\u7EED\u6267\u884C",deliver:!1,idempotencyKey:EJ()}}),W(`gateway_start resume: chat.send ok sessionKey=${r}`)}catch(n){W(`gateway_start resume: chat.send failed sessionKey=${r}: ${String(n)}`,"error")}}function DJ(e,t,r){if(e==="subagent_spawned"){let n=typeof t?.runId=="string"?t.runId:"",i=typeof t?.childSessionKey=="string"?t.childSessionKey:"",s=typeof r?.requesterSessionKey=="string"?r.requesterSessionKey:typeof r?.sessionKey=="string"?r.sessionKey:"";CJ(s,n,i);return}if(e==="subagent_ended"){let n=typeof t?.targetSessionKey=="string"?t.targetSessionKey:"",i=typeof t?.runId=="string"?t.runId:void 0;OJ(r??{},n,i)}}function GI(e){e.on("gateway_stop",(t,r)=>{try{DI(IJ())}catch(n){W(`gateway_stopped persist session state failed: ${String(n)}`,"error")}}),e.on("gateway_start",(t,r)=>{try{let n=NI();if(!n)return;let i=MI(n);FI(n),qJ(n?.subagent),jI(),W(`gateway_started session state restored (savedAt=${n.savedAt}) keys=${i.length}`),PJ(i)}catch(n){W(`gateway_started restore session state failed: ${String(n)}`,"error")}});for(let t of kJ)e.on(t.event,(r,n)=>{if(t.event==="subagent_ended"&&r?.targetKind==="acp")return;DJ(t.event,r,n);let i=AJ(t.event,n??{});if(i){if(ac(i)||t.event==="before_tool_call"&&RJ(r)){if(["after_tool_call","before_tool_call"].includes(t.event)){let{result:o,...a}=r;if(W(`\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\uFF1A ~ event:${t.event} ~ params:${JSON.stringify(a)}`),t.event==="before_tool_call"){let u=eR(a,i),l=JSON.stringify({type:t.event,specialIdentification:"dcgchat_tool_call_special_identification",callId:r.toolCallId||r.runId||Date.now().toString(),...a,status:"running"});return Ev(i,l,r.toolCallId||r.runId||Date.now().toString(),0),u}let c=JSON.stringify({type:t.event,specialIdentification:"dcgchat_tool_call_special_identification",callId:r.toolCallId||r.runId||Date.now().toString(),...a,status:t.event==="after_tool_call"?"finished":"running"});Ev(i,c,r.toolCallId||r.runId||Date.now().toString(),t.event==="after_tool_call"?1:0)}else if(t.event){let o=zI(i);if(t.event==="llm_output"&&r.lastAssistant?.errorMessage==="1003-\u989D\u5EA6\u4E0D\u8DB3\u8BF7\u5145\u503C"){Zr("\u60A8\u7684\u58A8\u6EF4\u5DF2\u6D88\u8017\u5B8C\uFF0C\u60A8\u53EF\u4EE5\u901A\u8FC7\u5145\u503C\u58A8\u6EF4\u6765\u7EE7\u7EED\u4F7F\u7528",o,{message_tags:{insufficient_balance:1},is_finish:-1}),gr(o,"\u58A8\u6EF4\u4E0D\u8DB3");return}let a=JSON.stringify({type:t.event,specialIdentification:"dcgchat_tool_call_special_identification",toolName:"",callId:r.runId||Date.now().toString(),params:t.message});Ev(i,a,r.runId||Date.now().toString(),0),W(`\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\uFF1A ~ event:${t.event}`)}}}else t.event!=="before_tool_call"&&W(`\u5DE5\u5177\u8C03\u7528\u7ED3\u679C\uFF1A ~ event:${t.event} ~ \u6CA1\u6709sessionKey \u4E3A\u6267\u884C`)})}var kJ,xr,br,ci,ai,ko=oe(()=>{"use strict";lt();et();Rr();Yr();tR();us();LI();kJ=[{event:"subagent_spawning",message:""},{event:"subagent_spawned",message:""},{event:"subagent_delivery_target",message:""},{event:"llm_output",message:""},{event:"subagent_ended",message:""},{event:"before_tool_call",message:""},{event:"after_tool_call",message:""}];xr=new Map,br=new Map,ci=new Map,ai=new Map});function NJ(e){return e instanceof Error?e.message:typeof e=="string"?e:String(e)}function Ef(e){let t=NJ(e);return/context overflow/i.test(t)||/prompt too large/i.test(t)||/auto-compaction failed/i.test(t)||/\(precheck\)/i.test(t)}function kf(){return"\u5F53\u524D\u5BF9\u8BDD\u8FC7\u957F\uFF0C\u5DF2\u8D85\u8FC7\u6A21\u578B\u4E0A\u4E0B\u6587\u9650\u5236\uFF1B\u81EA\u52A8\u538B\u7F29\u672A\u5B8C\u5168\u751F\u6548\u65F6\u4F1A\u51FA\u73B0\u6B64\u60C5\u51B5\u3002\u8BF7\u5C1D\u8BD5\u65B0\u5F00\u5BF9\u8BDD\u3001\u7F29\u77ED\u4EFB\u52A1\uFF0C\u6216\u6362\u7528\u66F4\u5927\u4E0A\u4E0B\u6587\u7684\u6A21\u578B\u3002"}var KI=oe(()=>{"use strict"});function VI(e,t){Tf.set(e,t)}function XI(e){Tf.delete(e)}function To(e){return Cf.has(e)}function Tv(e){Cf.delete(e)}function FJ(e){Cf.add(e)}function JI(e){let t=ui.get(e);t&&(t.abort(),ui.delete(e)),kv.set(e,Promise.resolve()),Cv(e,"interrupt").catch(r=>W(`preempt: gateway abort: ${String(r)}`,"error")),W(`inbound queue: reset tail for /stop sessionKey=${e}`)}async function YI(e,t){let n=(kv.get(e)??Promise.resolve()).catch(()=>{}).then(t);kv.set(e,n.catch(()=>{})),await n}async function Cv(e,t){let r=t==="interrupt"?"interrupt":"supersede",i=[...HI(e)].reverse(),s=Tf.get(e);i.length>0&&W(`${r}: chat.abort ${i.length} subagent session(s) (nested incl.)`);for(let o of i)try{await qt({method:"chat.abort",params:{sessionKey:o}})}catch(a){W(`${r}: chat.abort subagent ${o}: ${String(a)}`,"error")}try{await qt({method:"chat.abort",params:s?{sessionKey:e,runId:s}:{sessionKey:e}})}catch(o){W(`${r}: chat.abort main ${e}: ${String(o)}`,"error")}Tf.delete(e),Sf(e)}async function QI(e){ui.get(e)?.abort(),await Cv(e,"supersede"),Cf.delete(e);let t=new AbortController;return ui.set(e,t),t}function ZI(e,t){t&&ui.get(e)===t&&ui.delete(e)}async function eq(e,t){W(`interrupt command: sessionKey=${e}`);let r=ui.get(e);r&&(W(`interrupt: AbortController.abort() in-process run sessionKey=${e}`),r.abort(),ui.delete(e));let n=t.messageId?.trim()?t:{...t,messageId:`${Date.now()}`};gr(n,"abort"),FJ(e),await Cv(e,"interrupt")}var Tf,ui,Cf,kv,Of=oe(()=>{"use strict";us();Rr();et();ko();Tf=new Map,ui=new Map,Cf=new Set,kv=new Map});import tq from"node:path";import{buildAgentMediaPayload as jJ}from"openclaw/plugin-sdk/agent-media-payload";function rq(e,t){for(let r of t){let n=e[r];if(typeof n=="string"&&n.trim())return n.trim()}}function Ov(e){try{return tq.basename(new URL(e).pathname)||"file"}catch{let t=e.split(/[\\/]/).pop()??e;return tq.basename(t.split("?")[0]||t)||"file"}}function nq(e){if(e==null)return null;if(typeof e=="string"){let i=e.trim();return i?{url:i,name:Ov(i)}:null}if(typeof e!="object")return null;let t=e,r=rq(t,LJ);if(!r)return null;let n=rq(t,BJ)??"";return{url:r,name:n||Ov(r)}}function $J(e){if(Array.isArray(e))return e;if(typeof e=="string"){let t=e.trim();if(!t)return[];try{let r=JSON.parse(t);return Array.isArray(r)?r:[]}catch{return[]}}return[]}function iq(e){let t=new Set,r=[];for(let n of UJ)for(let i of $J(e[n])){let s=nq(i);s&&!t.has(s.url)&&(t.add(s.url),r.push(s))}for(let n of["file","attachment","media"]){let i=nq(e[n]);i&&!t.has(i.url)&&(t.add(i.url),r.push(i))}return r}function zJ(e){let t=(e||"").toLowerCase();return t.startsWith("image/")?"<media:image>":t.startsWith("video/")?"<media:video>":t.startsWith("audio/")?"<media:audio>":(t==="application/pdf"||t.includes("word")||t.includes("document")||t.includes("msword")||t.includes("officedocument")||t.includes("spreadsheet")||t.includes("presentation"),"<media:document>")}function sq(e){if(e.length===0)return{};let t=jJ(e.map(n=>({path:n.path,contentType:n.contentType||null}))),r=e.map(n=>n.fileName).filter(Boolean);return r.length===0?{...t}:{...t,MediaFileName:r[0],MediaFileNames:r}}function oq(e,t){if(t.length===0)return e;let r=t.map((i,s)=>`${s+1}) ${i.fileName} [${i.contentType||"unknown"}]`).join("; "),n=t.map(i=>i.placeholder).join(`
|
|
104
104
|
`);return`${e}
|
|
105
105
|
|
|
106
106
|
[\u7CFB\u7EDF: \u7528\u6237\u5DF2\u968F\u672C\u6D88\u606F\u4E0A\u4F20 ${t.length} \u4E2A\u9644\u4EF6: ${r}\u3002\u8BF7\u52FF\u8981\u6C42\u7528\u6237\u518D\u6B21\u4E0A\u4F20\uFF1B\u4E0B\u5217\u69FD\u4F4D\u4E0E MediaPaths/MediaTypes \u987A\u5E8F\u4E00\u81F4\u3002]
|
|
@@ -293,4 +293,4 @@ ${n}`}async function aq(e,t,r){let n=ts(),i=r?.maxBytes??MJ,s=[];W(`media: user
|
|
|
293
293
|
\u5982\u679C\u53D1\u9001\u9644\u4EF6\uFF1A\u5FC5\u987B\u4F7F\u7528 media \u5B57\u6BB5
|
|
294
294
|
\u6587\u4EF6\u8DEF\u5F84\u987B\u5728\u5F53\u524D Agent \u5DE5\u4F5C\u533A\u76EE\u5F55\u4E0B\uFF08\u968F\u90E8\u7F72\u53D8\u5316\uFF0C\u5982 ~/.openclaw/workspace-xxx/...\uFF09\uFF0C\u6216\u4E3A\u517C\u5BB9\u73AF\u5883\u7684 /workspace/\u3001/mobook/\uFF08Windows \u76D8\u7B26\u4E0B workspace\u3001mobook\uFF09\u3002
|
|
295
295
|
\u7981\u6B62\u5728\u6B63\u6587\u4E2D\u76F4\u63A5\u8F93\u51FA\u53EF\u8BBF\u95EE\u8DEF\u5F84\uFF08\u5E94\u901A\u8FC7 media \u53D1\u9001\uFF09
|
|
296
|
-
`,parameters:xte,execute:async(r,n,i)=>{if(i?.aborted){let o=new Error("Message send aborted");throw o.name="AbortError",o}let s=e.sessionKey?.trim();if(!s)return
|
|
296
|
+
`,parameters:xte,execute:async(r,n,i)=>{if(i?.aborted){let o=new Error("Message send aborted");throw o.name="AbortError",o}let s=e.sessionKey?.trim();if(!s)return{...Nc({error:"\u7F3A\u5C11 sessionKey\uFF0C\u65E0\u6CD5\u5411\u5F53\u524D\u4F1A\u8BDD\u53D1\u9001\u6D88\u606F"}),terminate:!0};if(!ac(s))return W(`dcgchat_message: skipped (session not active, likely stale run after /stop or turn end): ${s}`,"error"),{...Nc({success:!1,error:"\u5F53\u524D\u4F1A\u8BDD\u65E0\u6D3B\u8DC3\u5165\u7AD9\u8F6E\u6B21\uFF0C\u5DF2\u5FFD\u7565\u53D1\u9001\uFF1B\u4F1A\u8BDD\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u52FF\u518D\u8C03\u7528\u672C\u5DE5\u5177\u3002"}),terminate:!0};try{let o=new Set,a=new Set,c=e.workspaceDir,u=e.allowedPaths;if(n.media?.length)for(let f of n.media){let d=f.file;if(!d||!mN(d,c,u)||!yN(d,t))continue;let h=gN(d);a.has(h)||(await tn({sessionKey:s,mediaUrl:d}),o.add(d),a.add(h))}let l=wte(n.content,c);for(let f of l){if(!mN(f,c,u)||!yN(f,t))continue;let d=gN(f);a.has(d)||(await tn({sessionKey:s,mediaUrl:f}),o.add(f),a.add(d))}if(n.media?.length&&o.size===0)return Nc({success:!1,error:"\u672A\u80FD\u53D1\u9001\u4EFB\u4F55\u9644\u4EF6\uFF1A\u8DEF\u5F84\u987B\u4F4D\u4E8E\u5F53\u524D Agent \u5DE5\u4F5C\u533A\uFF0C\u6216\u4E3A /workspace/\u3001/mobook/ \u4E0B\u7684\u771F\u5B9E\u6587\u4EF6\uFF08\u975E\u7A7A\u3001\u6269\u5C55\u540D\u5728\u767D\u540D\u5355\u5185\uFF09\u3002",sentMediaCount:0});let p=n.content??"";for(let f of o){let d=Wb(f),h=d===f?[f]:[f,d],m=new Set;for(let y of h)!y||m.has(y)||(m.add(y),p=p.split(y).join(""))}if(p=p.trim(),p.length>0){let f=fo(s);Zr(p,f)}return Nc({success:!0,sentMediaCount:o.size})}catch(o){return Nc({error:o instanceof Error?o.message:String(o)})}}}}var Dge=_te({id:"dcgchat",name:"\u4E66\u7075\u58A8\u5B9D",description:"\u8FDE\u63A5 OpenClaw \u4E0E \u4E66\u7075\u58A8\u5B9D \u4EA7\u54C1\uFF08WebSocket\uFF09",plugin:fN,setRuntime:e=>{RA(e)},registerFull:e=>{GI(e),OA(e.config),AA(e.config?.agents?.defaults?.workspace),e.registerTool(t=>vN(t))}});export{Dge as default};
|