@okxweb3/a2a-openclaw 0.0.11 → 0.0.12

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.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -151,8 +151,8 @@ agent to continue this conversation.`;function Jre(e){return bP(e)}var rr=class
151
151
  UPDATE pending_gateway_deliveries
152
152
  SET attempts = attempts + 1, last_error = ?, last_attempt_at = ?
153
153
  WHERE id = ?
154
- `).run(u,new Date().toISOString(),A.id),console.log(`[okx-a2a:outbox-drain] delivery failed id=${A.id} kind=${A.kind}: ${u}`)}return(s>0||a>0)&&N.info(Q.SESSION_DISPATCHED,{onchainosAgentId:"*",source:"gateway_outbox_drain",deliveredCount:String(s),failedCount:String(a),batchSize:String(i.length)}),{delivered:s,failed:a,skipped:!1}}finally{r.close()}}function Ioe(e={}){let t=e.intervalMs??oYe,n=!1,r=async()=>{if(!n){n=!0;try{await uYe({...e.dbPath!==void 0?{dbPath:e.dbPath}:{},...e.limit!==void 0?{limit:e.limit}:{}})}catch(i){console.log("[okx-a2a:outbox-drain] tick failed:",i)}finally{n=!1}}},o=setInterval(()=>{r()},t);return o.unref?.(),r(),()=>{clearInterval(o)}}var Mm=require("node:child_process"),kP=require("node:fs"),Xv=require("node:os"),gp=require("node:path"),Coe=require("node:util");ar();var Boe=(0,Coe.promisify)(Mm.execFile),dYe=12e4,NP=3e4,boe=5e3,Qoe=[(0,gp.join)((0,Xv.homedir)(),".local","bin"),(0,gp.join)((0,Xv.homedir)(),"Library","pnpm"),(0,gp.join)((0,Xv.homedir)(),".npm-global","bin"),"/opt/homebrew/bin","/usr/local/bin"];function Nr(e,t){return{source:"openclaw_gateway",provider:"openclaw",action:e,...t??{}}}async function jv(e,t=NP){let n=process.env.OKX_A2A_BIN?.trim();if(n)return Soe(`${n} ${e.map(Roe).join(" ")}`,t,ew());let r=await lYe();if(!r)return{ok:!1,stdout:"",stderr:"okx-a2a binary not found"};try{let{stdout:o,stderr:i}=await Boe(r,e,{timeout:t,env:ew()});return{ok:!0,stdout:o,stderr:i}}catch(o){let i=o;return{ok:!1,stdout:String(i.stdout??""),stderr:String(i.stderr??i.message??o)}}}async function lYe(){let e=await Soe("command -v okx-a2a",NP),t=e.stdout.trim().split(/\r?\n/)[0]?.trim();if(e.ok&&t)return t;for(let n of Qoe){let r=(0,gp.join)(n,"okx-a2a");if((0,kP.existsSync)(r))return r}return null}function fYe(){let e=voe("command -v okx-a2a",NP),t=e.stdout.trim().split(/\r?\n/)[0]?.trim();if(e.ok&&t)return t;for(let n of Qoe){let r=(0,gp.join)(n,"okx-a2a");if((0,kP.existsSync)(r))return r}return null}async function Soe(e,t,n=process.env){try{let{stdout:r,stderr:o}=await Boe(woe(),["-lc",e],{timeout:t,env:n});return{ok:!0,stdout:r,stderr:o}}catch(r){let o=r;return{ok:!1,stdout:String(o.stdout??""),stderr:String(o.stderr??o.message??r)}}}function _oe(e,t=boe){let n=process.env.OKX_A2A_BIN?.trim();if(n)return voe(`${n} ${e.map(Roe).join(" ")}`,t,ew());let r=fYe();if(!r)return{ok:!1,stdout:"",stderr:"okx-a2a binary not found"};try{return{ok:!0,stdout:(0,Mm.execFileSync)(r,e,{encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:t,env:ew()}),stderr:""}}catch(o){let i=o;return{ok:!1,stdout:String(i.stdout??""),stderr:String(i.stderr??i.message??o)}}}function voe(e,t,n=process.env){try{return{ok:!0,stdout:(0,Mm.execFileSync)(woe(),["-lc",e],{encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:t,env:n}),stderr:""}}catch(r){let o=r;return{ok:!1,stdout:String(o.stdout??""),stderr:String(o.stderr??o.message??r)}}}function woe(){return process.env.SHELL||"/bin/sh"}function ew(){return{...process.env,OKX_A2A_RUNTIME_CONTEXT:"openclaw-gateway",OKX_A2A_IN_GATEWAY:"1",OKX_A2A_GATEWAY_PROVIDER:"openclaw"}}function Roe(e){return`'${e.replace(/'/g,"'\\''")}'`}function gYe(e){let t=e.trim();return t.startsWith("running ")?"running":t.startsWith("stale ")?"stale":t==="stopped"?"stopped":"unknown"}function xoe(e){let t=e.trim().split(/\r?\n/).reverse();for(let n of t){let r=n.trim();if(r.startsWith("{"))try{let o=JSON.parse(r);if(o&&typeof o=="object"&&!Array.isArray(o))return o}catch{}}return null}async function pYe(){let e=await jv(["ai-provider","status","--json"]);if(!e.ok)return console.log("[okx-a2a:daemon] ai-provider status failed:",(e.stderr||e.stdout).trim()),N.error(Q.DAEMON_LIFECYCLE_FAILED,new Error("okx-a2a ai-provider status failed"),Nr("provider_status",{status:"failed",stderr:e.stderr,stdout:e.stdout})),null;let n=xoe(e.stdout)?.provider;return typeof n!="string"&&N.info(Q.DAEMON_LIFECYCLE_SKIPPED,Nr("provider_status",{reason:"invalid_provider_status_output",status:"skipped",stdout:e.stdout})),typeof n=="string"?n:null}function hYe(){let e=_oe(["ai-provider","status","--json"]);if(!e.ok)return console.log("[okx-a2a:daemon] ai-provider status failed during gateway signal:",(e.stderr||e.stdout).trim()),N.error(Q.DAEMON_LIFECYCLE_FAILED,new Error("okx-a2a ai-provider status failed during gateway signal"),Nr("provider_status_signal",{status:"failed",stderr:e.stderr,stdout:e.stdout})),null;let n=xoe(e.stdout)?.provider;return typeof n!="string"&&N.info(Q.DAEMON_LIFECYCLE_SKIPPED,Nr("provider_status_signal",{reason:"invalid_provider_status_output",status:"skipped",stdout:e.stdout})),typeof n=="string"?n:null}async function koe(){let e=await pYe();return e!=="openclaw"?(console.log(`[okx-a2a:daemon] provider=${e??"(not set)"}; skipping OpenClaw-owned daemon lifecycle`),N.info(Q.DAEMON_LIFECYCLE_SKIPPED,Nr("provider_mismatch",{selectedProvider:e??"",reason:"provider_not_openclaw",status:"skipped"})),!1):!0}function EYe(){let e=hYe();return e!=="openclaw"?(console.log(`[okx-a2a:daemon] provider=${e??"(not set)"}; skipping OpenClaw-owned daemon lifecycle during gateway signal`),N.info(Q.DAEMON_LIFECYCLE_SKIPPED,Nr("provider_mismatch_signal",{selectedProvider:e??"",reason:"provider_not_openclaw",status:"skipped"})),!1):!0}async function Noe(){if(!await koe())return;let e=await jv(["daemon","status"]),t=e.ok?gYe(e.stdout):"unknown";e.ok||console.log("[okx-a2a:daemon] status failed:",(e.stderr||e.stdout).trim()),N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("restart",{previousStatus:t,status:"requested"}));let n=await jv(["daemon","restart"],dYe);if(!n.ok){console.log("[okx-a2a:daemon] restart failed:",(n.stderr||n.stdout).trim()),N.error(Q.DAEMON_LIFECYCLE_FAILED,new Error("okx-a2a daemon restart failed"),Nr("restart",{previousStatus:t,status:"failed",stderr:n.stderr,stdout:n.stdout}));return}let r=n.stdout.trim();console.log(`[okx-a2a:daemon] ${r||"restart ok"} selectedProvider=openclaw previousStatus=${t}`),N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("restart",{previousStatus:t,status:"ok"}))}async function Doe(){if(!await koe())return;N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("stop",{status:"requested"}));let e=await jv(["daemon","stop"]);if(!e.ok){console.log("[okx-a2a:daemon] stop failed:",(e.stderr||e.stdout).trim()),N.error(Q.DAEMON_LIFECYCLE_FAILED,new Error("okx-a2a daemon stop failed"),Nr("stop",{status:"failed",stderr:e.stderr,stdout:e.stdout}));return}console.log(`[okx-a2a:daemon] ${e.stdout.trim()||"stop ok"}`),N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("stop",{status:"ok"}))}function mYe(e){if(!EYe())return;N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("stop_signal",{reason:e,status:"requested"}));let t=_oe(["daemon","stop"],boe);if(!t.ok){console.log(`[okx-a2a:daemon] stop failed during ${e}:`,(t.stderr||t.stdout).trim()),N.error(Q.DAEMON_LIFECYCLE_FAILED,new Error("okx-a2a daemon stop failed during gateway signal"),Nr("stop_signal",{reason:e,status:"failed",stderr:t.stderr,stdout:t.stdout}));return}console.log(`[okx-a2a:daemon] ${t.stdout.trim()||"stop ok"} reason=${e}`),N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("stop_signal",{reason:e,status:"ok"}))}function Toe(){let e=t=>{mYe(t)};return process.on("SIGTERM",e),process.on("SIGINT",e),()=>{process.off("SIGTERM",e),process.off("SIGINT",e)}}ar();async function yYe(e,t,n,r){console.log(`[onchainos-signer] executing: onchainos agent xmtp-sign --key-uuid ${t} --message <${r.length} chars>`);let o,i;try{({stdout:o,stderr:i}=await La(["agent","xmtp-sign","--key-uuid",t,"--message",r]))}catch(a){let A=String(a?.stdout??"");throw A&&Om(A)&&Pm("xmtp-sign"),a}i&&console.log(`[onchainos-signer] stderr: ${i}`);let s=lp(o,"xmtp-sign",{onchainosAgentId:e,keyUuid:t,walletAddress:n,messageLength:String(r.length)});if(!s.ok){Om(o)&&Pm("xmtp-sign");let a=new Error("onchainos xmtp-sign failed");throw N.error(Q.ONCHAINOS_CLI_ERROR,a,dp(o,"xmtp-sign",{onchainosAgentId:e,keyUuid:t,walletAddress:n,messageLength:String(r.length)})),a}return console.log(`[onchainos-signer] sign success, signature=${s.data.signature.slice(0,20)}...`),Bi(s.data.signature)}function Ooe(e){let t=e.communicationAddress.toLowerCase(),n=e.keyUuid,r=e.agentId;return console.log(`[onchainos-signer] creating signer for ${t} (keyUuid=${n})`),{type:"EOA",getIdentifier:()=>({identifier:t,identifierKind:0}),signMessage:async o=>(console.log(`[onchainos-signer] signing message for ${t}`),await yYe(r,n,t,o))}}ar();var IYe=process.env.SENTRY_ENV==="dev"?"dev":"prod",DP={projectName:"okx/openclaw-okx-a2a-extension",release:"0.0.11",environment:IYe};var Poe=5,CYe=!1,Vc,pp,hp=!0,Ep=0,mp,yp,Fm;function BYe(e){let t=e?.details?.requestId;return typeof t=="string"&&t.trim()?`openclaw devices approve ${t}`:"openclaw devices approve --latest"}function bYe(e){let t=e?.details??{},n=pk(e);return["OKX A2A plugin needs OpenClaw gateway `operator.admin` scope before it can create sessions, inject chat messages, and route XMTP conversations.","","Ask the user whether they approve granting this scope to the OKX A2A plugin.","","If the user approves, ask them to run this command on the OpenClaw host:","","```bash",BYe(e),"```","",`requestId: ${t.requestId??""}`,`deviceId: ${t.deviceId??""}`,`requestedScopes: ${Array.isArray(t.requestedScopes)?t.requestedScopes.join(","):""}`,`approvedScopes: ${Array.isArray(t.approvedScopes)?t.approvedScopes.join(","):""}`,n?`hint: ${n}`:""].filter(Boolean).join(`
155
- `)}function QYe(){nA({key:gl()}).then(()=>{console.log("[okx-a2a:service] gateway client admin precheck succeeded"),N.info(Q.GATEWAY_STARTED,{source:"gateway_preconnect",outcome:"ok"})},e=>{console.log("[okx-a2a:service] gateway client admin precheck failed:",e),N.error(Q.GATEWAY_CONNECT_FAILED,e instanceof Error?e:new Error(String(e)),{source:"gateway_preconnect",code:String(e?.gatewayCode??e?.details?.code??""),reason:String(e?.details?.reason??""),requestId:String(e?.details?.requestId??"")}),CG(bYe(e),{source:"gateway_preconnect"}).then(({dispatched:t,failed:n})=>{N.info(Q.USER_DISPATCHED,{source:"gateway_preconnect",outcome:n.length===0?"all_ok":"partial",dispatchedChannels:t.join(","),failedChannels:n.join(","),dispatchedCount:String(t.length),failedCount:String(n.length)})},t=>{N.error(Q.USER_DISPATCH_FAILED,t instanceof Error?t:new Error(String(t)),{source:"gateway_preconnect"})})})}async function SYe(e){try{let t=await vP();if(typeof t.sentryDsn=="string"&&t.sentryDsn){sk({dsn:t.sentryDsn,...DP,agentPlatform:"openclaw"});return}console.error("[okx-a2a] system-config did not return sentryDsn; Sentry not initialized \u2014 no further events will be reported to SLS"),N.error(Q.SENTRY_INIT_SKIPPED,void 0,{onchainosAgentId:"*",reason:"system-config missing sentryDsn",pluginId:qa.id,pluginVersion:qa.version,source:e})}catch(t){console.log(`[okx-a2a:service] system-config fetch failed in ${e}:`,t),N.error(Q.CONFIG_LOAD_FAILED,t instanceof Error?t:new Error(String(t)),{source:e})}}function Uoe(e,t){let n=[e?.sessionKey,e?.context?.sessionKey,e?.ctx?.sessionKey,e?.hookContext?.sessionKey,t?.sessionKey];for(let r of n)if(typeof r=="string"&&r.trim())return r;return null}function TP(e,t){let n=e[t];if(typeof n!="string"||!n.trim())throw new Error(`Missing required param ${t}`);return n}function kd(e,t){let n=e[t];return typeof n=="string"&&n.trim()?n:void 0}function _Ye(e,t){let n=e[t];if(!Array.isArray(n))return;let r=n.filter(o=>typeof o=="string"&&o.trim().length>0).map(o=>o.trim());return r.length>0?r:void 0}function vYe(e,t){let n=e[t];return typeof n=="boolean"?n:void 0}var qa={id:"okx-a2a",name:"OKX A2A Plugin",version:"0.0.11",register(e){UP(e.runtime),e.registerChannel({plugin:Uq}),e.registerGatewayMethod("okx-a2a.dispatch_user",async({params:n,respond:r})=>{try{let o=TP(n,"content"),i=kd(n,"label");r(!0,await FI({content:o,label:i}))}catch(o){r(!1,void 0,{code:"INVALID_REQUEST",message:o instanceof Error?o.message:String(o)})}},{scope:"operator.admin"}),e.registerGatewayMethod("okx-a2a.prompt_user",async({params:n,respond:r})=>{try{let o=TP(n,"userContent"),i=TP(n,"llmContent");r(!0,await LI({userContent:o,llmContent:i}))}catch(o){r(!1,void 0,{code:"INVALID_REQUEST",message:o instanceof Error?o.message:String(o)})}},{scope:"operator.admin"}),e.registerGatewayMethod("okx-a2a.delete_sessions",async({params:n,respond:r})=>{try{let o=kd(n,"sessionKey"),i=_Ye(n,"sessionKeys"),s=kd(n,"jobId");if(!o&&!i&&!s)throw new Error("Missing required selector: sessionKey, sessionKeys, or jobId");let a=kd(n,"myAgentId"),A=kd(n,"toAgentId"),c=kd(n,"myXmtpAddress"),u=kd(n,"toXmtpAddress"),d=vYe(n,"deleteTranscript");r(!0,await $re({...o?{sessionKey:o}:{},...i?{sessionKeys:i}:{},...s?{jobId:s}:{},...a?{myAgentId:a}:{},...A?{toAgentId:A}:{},...c?{myXmtpAddress:c}:{},...u?{toXmtpAddress:u}:{},...d!==void 0?{deleteTranscript:d}:{}}))}catch(o){r(!1,void 0,{code:"INVALID_REQUEST",message:o instanceof Error?o.message:String(o)})}},{scope:"operator.admin"});let t=rr.getInstance();e.registerHook("agent:bootstrap",async n=>{let r=n.context,o=r.bootstrapFiles;if(Array.isArray(o))try{let i=o.map(a=>`${a.name}(${a.missing?"missing":`${a.content?.length??0}b`})`).join(", ");console.log(`[okx-a2a:hook] agent:bootstrap agentId=${r.agentId??"?"} files=[${i}]`);let s=o.reduce((a,A)=>a+(A.content?.length??0),0);N.info(Q.BOOTSTRAP_APPLIED,{openclawAgentId:r.agentId??"",promptSize:String(s),fileCount:String(o.length),missingCount:String(o.filter(a=>a.missing).length)})}catch(i){N.error(Q.BOOTSTRAP_FAILED,i instanceof Error?i:void 0,{openclawAgentId:r.agentId??""})}},{name:"okx-a2a-agent-bootstrap"}),e.on("before_agent_run",async(n,r)=>{let o=Uoe(n,r);if(!o){console.log("[xmtp_prompt_user:queue] before_agent_run ignored: missing sessionKey");return}yk(o)}),e.on("agent_end",async(n,r)=>{let o=Uoe(n,r);if(!o){console.log("[xmtp_prompt_user:queue] agent_end ignored: missing sessionKey");return}Ik(o)}),e.registerService({id:"okx-a2a:core",start:async()=>{if(console.log("[okx-a2a:service] okx-a2a:core starting (multi-identity mode); initializing communication identities..."),Fm=Date.now(),N.info(Q.GATEWAY_STARTED,{onchainosAgentId:"*",pid:String(process.pid),pluginId:qa.id,pluginVersion:qa.version,nodeVersion:process.version,startedAt:String(Fm)}),yp&&yp(),yp=Toe(),aG(),await Noe(),QYe(),mp&&mp(),mp=Ioe(),!CYe){await SYe("openclaw_lightweight_gateway_service"),console.log("[okx-a2a:service] legacy OpenClaw XMTP runtime disabled; daemon owns XMTP receive/send/agent sync.");return}t.setTools({listAllAgentsWithMetadata:async p=>coe(p),fetchSensitiveWords:async()=>foe(),fetchSystemConfig:async()=>vP(),notifyAgentsWakeup:async p=>uoe(p),createSigner:p=>Ooe(p),sendMessageToSession:async p=>Os(p),sendToMainSession:async p=>Xre(p),deleteSession:async p=>zre(p),createSession:async p=>Zre(p),notifySessionExpired:p=>{let E="[System Notice] The onchainos login session has expired. Agent management, message verification, file transfer, etc. are temporarily unavailable. Run `onchainos wallet login` on the server to re-authenticate, then run `openclaw gateway restart` to restart the gateway.";MI(E).then(({dispatched:m})=>{if(!(m.length>0))return console.log("[onchainos] no user session; falling back session-expired notice to backup session"),No({key:gl(),message:E})}).catch(m=>{console.log("[onchainos] failed to send session-expired notice:",m),N.error(Q.USER_DISPATCH_FAILED,m instanceof Error?m:new Error(String(m)),{source:"notifySessionExpired",onchainosAgentId:"*"})})},createInboundMiddleware:p=>Eoe(p),processOfflineMessage:async(p,E,m)=>RP(p,E,m)}),t.setPluginVersion("0.0.11"),await t.init();let n=t.pluginVersionStatus;if(n.unavailable){console.error(`[okx-a2a:service] okx-a2a:core start aborted: plugin v0.0.11 is below the required minimum v${n.minVersion}. Run \`openclaw plugins update okx-a2a\` to upgrade.`);return}console.log(`[okx-a2a:service] okx-a2a:core initialized, ${t.getClients().size} clients ready`);let r=t.getSystemConfig();r.sentryDsn?sk({dsn:r.sentryDsn,...DP,agentPlatform:"openclaw"}):(console.error("[okx-a2a] system-config did not return sentryDsn; Sentry not initialized \u2014 no further events will be reported to SLS"),N.error(Q.SENTRY_INIT_SKIPPED,void 0,{onchainosAgentId:"*",reason:"system-config missing sentryDsn",pluginId:qa.id,pluginVersion:qa.version})),Vc&&clearInterval(Vc),pp&&clearInterval(pp);let o=t.getSystemConfig().heartbeatInterval,i=p=>({onchainosAgentId:"*",stage:p,clientCount:String(t.getClients().size),onchainosAgentIds:t.getAllAgents().map(E=>E.agentId).join(",")}),s=t.getAllAgents().length,a=0,A=0;hp=!1;let c=++Ep,u=async()=>{console.log("[okx-a2a:sync] scheduled sync starting");let p=Date.now(),E=!1,m=0;try{let D=Date.now();await t.refreshAgents(),m=Date.now()-D,E=!0,a+=1}catch(D){m=Date.now()-p,console.log(`[okx-a2a:sync] refreshAgents failed duration=${m}ms (continuing with the old agent list):`,D),N.error(Q.AGENT_REFRESH_FAILED,D instanceof Error?D:new Error(String(D)),i("syncTick/refreshAgents"))}let I=t.getAllAgents().length;s===0&&I>0&&(console.log(`[okx-a2a:sync] agent list went 0 \u2192 ${I}; retrying fail-soft init resources`),t.retryFailedInit().catch(D=>{console.log("[okx-a2a:sync] retryFailedInit threw:",D)}),t.ensureSensitiveWordsLoaded(!0).catch(D=>{console.log("[okx-a2a:sync] ensureSensitiveWordsLoaded threw:",D)})),s=I;let C=I>0;C||console.log("[okx-a2a:sync] no active agents, skipping heartbeat");let b=E&&A===0;b||console.log(`[okx-a2a:sync] skipping replayOfflineMessages until ${Poe} successful agent syncs after last replay (count=${A})`);let _={durationMs:0},[w,U]=await Promise.all([C?Moe(()=>doe(_P)):Promise.resolve(_),b?Moe(()=>t.replayOfflineMessages()):Promise.resolve(_)]),L=C&&!w.error;if(C&&w.error){let D=w.error;console.log(`[okx-a2a:sync] heartbeat failed duration=${w.durationMs}ms:`,D),N.error(Q.HEARTBEAT_FAILED,D instanceof Error?D:new Error(String(D)),{...i("syncTick/heartbeat"),chainIndex:_P})}let M=!b||!U.error;if(E&&(A=b?1:(A+1)%Poe),!M){let D=U.error;console.log(`[okx-a2a:sync] replayOfflineMessages failed duration=${U.durationMs}ms:`,D),N.error(Q.OFFLINE_REPLAY_FAILED,D instanceof Error?D:new Error(String(D)),i("syncTick/replayOfflineMessages"))}console.log(`[okx-a2a:sync] scheduled sync done (refreshOk=${E}, heartbeatOk=${L}, heartbeatSkipped=${!C}, replayOk=${M}, replaySkipped=${!b}, total=${Date.now()-p}ms, refresh=${m}ms, heartbeat=${C?`${w.durationMs}ms`:"skipped"}, replay=${b?`${U.durationMs}ms`:"skipped"})`),N.info(Q.SYNC_TICK_COMPLETED,{...i("syncTick"),refreshOk:E?"1":"0",heartbeatOk:L?"1":"0",heartbeatSkipped:C?"0":"1",replayOk:M?"1":"0",replaySkipped:b?"0":"1",agentSyncCount:String(a),agentSyncsSinceOfflineReplay:String(A),durationMs:String(Date.now()-p)})},d=!1,l=async()=>{if(!(hp||c!==Ep)){if(d){console.log("[okx-a2a:sync] previous tick still running, skipping this fire");return}d=!0;try{await u()}finally{d=!1}}},f=p=>{hp||c!==Ep||(Vc&&clearInterval(Vc),o=p,console.log(`[okx-a2a:sync] scheduled sync interval ${o}s (aligned with heartbeat)`),Vc=setInterval(()=>{l()},o*1e3))},g=async()=>{if(hp||c!==Ep)return;let p=o;try{if(await t.refreshSystemConfig(),hp||c!==Ep)return;let E=t.getSystemConfig().heartbeatInterval;E!==p&&(console.log(`[okx-a2a:sync] heartbeat interval changed from ${p}s to ${E}s; rescheduling sync timer`),f(E))}catch(E){console.log("[okx-a2a:sync] system-config refresh failed:",E),N.error(Q.CONFIG_LOAD_FAILED,E instanceof Error?E:new Error(String(E)),i("systemConfigRefresh"))}};l(),f(o),pp=setInterval(()=>{g()},3600*1e3)},stop:async()=>{hp=!0,Ep+=1,mp&&(mp(),mp=void 0),yp&&(yp(),yp=void 0),Vc&&(clearInterval(Vc),Vc=void 0),pp&&(clearInterval(pp),pp=void 0),AG(),await Doe(),console.log("[okx-a2a:service] okx-a2a:core stopped");let n=Date.now();N.info(Q.GATEWAY_STOPPED,{onchainosAgentId:"*",pid:String(process.pid),pluginId:qa.id,pluginVersion:qa.version,stoppedAt:String(n),uptimeMs:Fm?String(n-Fm):"unknown"}),Fm=void 0}})}},wYe=qa;async function Moe(e){let t=Date.now();try{return await e(),{durationMs:Date.now()-t}}catch(n){return{durationMs:Date.now()-t,error:n}}}
154
+ `).run(u,new Date().toISOString(),A.id),console.log(`[okx-a2a:outbox-drain] delivery failed id=${A.id} kind=${A.kind}: ${u}`)}return(s>0||a>0)&&N.info(Q.SESSION_DISPATCHED,{onchainosAgentId:"*",source:"gateway_outbox_drain",deliveredCount:String(s),failedCount:String(a),batchSize:String(i.length)}),{delivered:s,failed:a,skipped:!1}}finally{r.close()}}function Ioe(e={}){let t=e.intervalMs??oYe,n=!1,r=async()=>{if(!n){n=!0;try{await uYe({...e.dbPath!==void 0?{dbPath:e.dbPath}:{},...e.limit!==void 0?{limit:e.limit}:{}})}catch(i){console.log("[okx-a2a:outbox-drain] tick failed:",i)}finally{n=!1}}},o=setInterval(()=>{r()},t);return o.unref?.(),r(),()=>{clearInterval(o)}}var Mm=require("node:child_process"),kP=require("node:fs"),Xv=require("node:os"),gp=require("node:path"),Coe=require("node:util");ar();var Boe=(0,Coe.promisify)(Mm.execFile),dYe=12e4,NP=3e4,boe=5e3,Qoe=[(0,gp.join)((0,Xv.homedir)(),".local","bin"),(0,gp.join)((0,Xv.homedir)(),"Library","pnpm"),(0,gp.join)((0,Xv.homedir)(),".npm-global","bin"),"/opt/homebrew/bin","/usr/local/bin"];function Nr(e,t){return{source:"openclaw_gateway",provider:"openclaw",action:e,...t??{}}}async function jv(e,t=NP){let n=process.env.OKX_A2A_BIN?.trim();if(n)return Soe(`${n} ${e.map(Roe).join(" ")}`,t,ew());let r=await lYe();if(!r)return{ok:!1,stdout:"",stderr:"okx-a2a binary not found"};try{let{stdout:o,stderr:i}=await Boe(r,e,{timeout:t,env:ew()});return{ok:!0,stdout:o,stderr:i}}catch(o){let i=o;return{ok:!1,stdout:String(i.stdout??""),stderr:String(i.stderr??i.message??o)}}}async function lYe(){let e=await Soe("command -v okx-a2a",NP),t=e.stdout.trim().split(/\r?\n/)[0]?.trim();if(e.ok&&t)return t;for(let n of Qoe){let r=(0,gp.join)(n,"okx-a2a");if((0,kP.existsSync)(r))return r}return null}function fYe(){let e=voe("command -v okx-a2a",NP),t=e.stdout.trim().split(/\r?\n/)[0]?.trim();if(e.ok&&t)return t;for(let n of Qoe){let r=(0,gp.join)(n,"okx-a2a");if((0,kP.existsSync)(r))return r}return null}async function Soe(e,t,n=process.env){try{let{stdout:r,stderr:o}=await Boe(woe(),["-lc",e],{timeout:t,env:n});return{ok:!0,stdout:r,stderr:o}}catch(r){let o=r;return{ok:!1,stdout:String(o.stdout??""),stderr:String(o.stderr??o.message??r)}}}function _oe(e,t=boe){let n=process.env.OKX_A2A_BIN?.trim();if(n)return voe(`${n} ${e.map(Roe).join(" ")}`,t,ew());let r=fYe();if(!r)return{ok:!1,stdout:"",stderr:"okx-a2a binary not found"};try{return{ok:!0,stdout:(0,Mm.execFileSync)(r,e,{encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:t,env:ew()}),stderr:""}}catch(o){let i=o;return{ok:!1,stdout:String(i.stdout??""),stderr:String(i.stderr??i.message??o)}}}function voe(e,t,n=process.env){try{return{ok:!0,stdout:(0,Mm.execFileSync)(woe(),["-lc",e],{encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:t,env:n}),stderr:""}}catch(r){let o=r;return{ok:!1,stdout:String(o.stdout??""),stderr:String(o.stderr??o.message??r)}}}function woe(){return process.env.SHELL||"/bin/sh"}function ew(){return{...process.env,OKX_A2A_RUNTIME_CONTEXT:"openclaw-gateway",OKX_A2A_IN_GATEWAY:"1",OKX_A2A_GATEWAY_PROVIDER:"openclaw"}}function Roe(e){return`'${e.replace(/'/g,"'\\''")}'`}function gYe(e){let t=e.trim();return t.startsWith("running ")?"running":t.startsWith("stale ")?"stale":t==="stopped"?"stopped":"unknown"}function xoe(e){let t=e.trim().split(/\r?\n/).reverse();for(let n of t){let r=n.trim();if(r.startsWith("{"))try{let o=JSON.parse(r);if(o&&typeof o=="object"&&!Array.isArray(o))return o}catch{}}return null}async function pYe(){let e=await jv(["ai-provider","status","--json"]);if(!e.ok)return console.log("[okx-a2a:daemon] ai-provider status failed:",(e.stderr||e.stdout).trim()),N.error(Q.DAEMON_LIFECYCLE_FAILED,new Error("okx-a2a ai-provider status failed"),Nr("provider_status",{status:"failed",stderr:e.stderr,stdout:e.stdout})),null;let n=xoe(e.stdout)?.provider;return typeof n!="string"&&N.info(Q.DAEMON_LIFECYCLE_SKIPPED,Nr("provider_status",{reason:"invalid_provider_status_output",status:"skipped",stdout:e.stdout})),typeof n=="string"?n:null}function hYe(){let e=_oe(["ai-provider","status","--json"]);if(!e.ok)return console.log("[okx-a2a:daemon] ai-provider status failed during gateway signal:",(e.stderr||e.stdout).trim()),N.error(Q.DAEMON_LIFECYCLE_FAILED,new Error("okx-a2a ai-provider status failed during gateway signal"),Nr("provider_status_signal",{status:"failed",stderr:e.stderr,stdout:e.stdout})),null;let n=xoe(e.stdout)?.provider;return typeof n!="string"&&N.info(Q.DAEMON_LIFECYCLE_SKIPPED,Nr("provider_status_signal",{reason:"invalid_provider_status_output",status:"skipped",stdout:e.stdout})),typeof n=="string"?n:null}async function koe(){let e=await pYe();return e!=="openclaw"?(console.log(`[okx-a2a:daemon] provider=${e??"(not set)"}; skipping OpenClaw-owned daemon lifecycle`),N.info(Q.DAEMON_LIFECYCLE_SKIPPED,Nr("provider_mismatch",{selectedProvider:e??"",reason:"provider_not_openclaw",status:"skipped"})),!1):!0}function EYe(){let e=hYe();return e!=="openclaw"?(console.log(`[okx-a2a:daemon] provider=${e??"(not set)"}; skipping OpenClaw-owned daemon lifecycle during gateway signal`),N.info(Q.DAEMON_LIFECYCLE_SKIPPED,Nr("provider_mismatch_signal",{selectedProvider:e??"",reason:"provider_not_openclaw",status:"skipped"})),!1):!0}async function Noe(){if(!await koe())return;let e=await jv(["daemon","status"]),t=e.ok?gYe(e.stdout):"unknown";e.ok||console.log("[okx-a2a:daemon] status failed:",(e.stderr||e.stdout).trim()),N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("restart",{previousStatus:t,status:"requested"}));let n=await jv(["daemon","restart"],dYe);if(!n.ok){console.log("[okx-a2a:daemon] restart failed:",(n.stderr||n.stdout).trim()),N.error(Q.DAEMON_LIFECYCLE_FAILED,new Error("okx-a2a daemon restart failed"),Nr("restart",{previousStatus:t,status:"failed",stderr:n.stderr,stdout:n.stdout}));return}let r=n.stdout.trim();console.log(`[okx-a2a:daemon] ${r||"restart ok"} selectedProvider=openclaw previousStatus=${t}`),N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("restart",{previousStatus:t,status:"ok"}))}async function Doe(){if(!await koe())return;N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("stop",{status:"requested"}));let e=await jv(["daemon","stop"]);if(!e.ok){console.log("[okx-a2a:daemon] stop failed:",(e.stderr||e.stdout).trim()),N.error(Q.DAEMON_LIFECYCLE_FAILED,new Error("okx-a2a daemon stop failed"),Nr("stop",{status:"failed",stderr:e.stderr,stdout:e.stdout}));return}console.log(`[okx-a2a:daemon] ${e.stdout.trim()||"stop ok"}`),N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("stop",{status:"ok"}))}function mYe(e){if(!EYe())return;N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("stop_signal",{reason:e,status:"requested"}));let t=_oe(["daemon","stop"],boe);if(!t.ok){console.log(`[okx-a2a:daemon] stop failed during ${e}:`,(t.stderr||t.stdout).trim()),N.error(Q.DAEMON_LIFECYCLE_FAILED,new Error("okx-a2a daemon stop failed during gateway signal"),Nr("stop_signal",{reason:e,status:"failed",stderr:t.stderr,stdout:t.stdout}));return}console.log(`[okx-a2a:daemon] ${t.stdout.trim()||"stop ok"} reason=${e}`),N.info(Q.DAEMON_LIFECYCLE_REQUESTED,Nr("stop_signal",{reason:e,status:"ok"}))}function Toe(){let e=t=>{mYe(t)};return process.on("SIGTERM",e),process.on("SIGINT",e),()=>{process.off("SIGTERM",e),process.off("SIGINT",e)}}ar();async function yYe(e,t,n,r){console.log(`[onchainos-signer] executing: onchainos agent xmtp-sign --key-uuid ${t} --message <${r.length} chars>`);let o,i;try{({stdout:o,stderr:i}=await La(["agent","xmtp-sign","--key-uuid",t,"--message",r]))}catch(a){let A=String(a?.stdout??"");throw A&&Om(A)&&Pm("xmtp-sign"),a}i&&console.log(`[onchainos-signer] stderr: ${i}`);let s=lp(o,"xmtp-sign",{onchainosAgentId:e,keyUuid:t,walletAddress:n,messageLength:String(r.length)});if(!s.ok){Om(o)&&Pm("xmtp-sign");let a=new Error("onchainos xmtp-sign failed");throw N.error(Q.ONCHAINOS_CLI_ERROR,a,dp(o,"xmtp-sign",{onchainosAgentId:e,keyUuid:t,walletAddress:n,messageLength:String(r.length)})),a}return console.log(`[onchainos-signer] sign success, signature=${s.data.signature.slice(0,20)}...`),Bi(s.data.signature)}function Ooe(e){let t=e.communicationAddress.toLowerCase(),n=e.keyUuid,r=e.agentId;return console.log(`[onchainos-signer] creating signer for ${t} (keyUuid=${n})`),{type:"EOA",getIdentifier:()=>({identifier:t,identifierKind:0}),signMessage:async o=>(console.log(`[onchainos-signer] signing message for ${t}`),await yYe(r,n,t,o))}}ar();var IYe=process.env.SENTRY_ENV==="dev"?"dev":"prod",DP={projectName:"okx/openclaw-okx-a2a-extension",release:"0.0.12",environment:IYe};var Poe=5,CYe=!1,Vc,pp,hp=!0,Ep=0,mp,yp,Fm;function BYe(e){let t=e?.details?.requestId;return typeof t=="string"&&t.trim()?`openclaw devices approve ${t}`:"openclaw devices approve --latest"}function bYe(e){let t=e?.details??{},n=pk(e);return["OKX A2A plugin needs OpenClaw gateway `operator.admin` scope before it can create sessions, inject chat messages, and route XMTP conversations.","","Ask the user whether they approve granting this scope to the OKX A2A plugin.","","If the user approves, ask them to run this command on the OpenClaw host:","","```bash",BYe(e),"```","",`requestId: ${t.requestId??""}`,`deviceId: ${t.deviceId??""}`,`requestedScopes: ${Array.isArray(t.requestedScopes)?t.requestedScopes.join(","):""}`,`approvedScopes: ${Array.isArray(t.approvedScopes)?t.approvedScopes.join(","):""}`,n?`hint: ${n}`:""].filter(Boolean).join(`
155
+ `)}function QYe(){nA({key:gl()}).then(()=>{console.log("[okx-a2a:service] gateway client admin precheck succeeded"),N.info(Q.GATEWAY_STARTED,{source:"gateway_preconnect",outcome:"ok"})},e=>{console.log("[okx-a2a:service] gateway client admin precheck failed:",e),N.error(Q.GATEWAY_CONNECT_FAILED,e instanceof Error?e:new Error(String(e)),{source:"gateway_preconnect",code:String(e?.gatewayCode??e?.details?.code??""),reason:String(e?.details?.reason??""),requestId:String(e?.details?.requestId??"")}),CG(bYe(e),{source:"gateway_preconnect"}).then(({dispatched:t,failed:n})=>{N.info(Q.USER_DISPATCHED,{source:"gateway_preconnect",outcome:n.length===0?"all_ok":"partial",dispatchedChannels:t.join(","),failedChannels:n.join(","),dispatchedCount:String(t.length),failedCount:String(n.length)})},t=>{N.error(Q.USER_DISPATCH_FAILED,t instanceof Error?t:new Error(String(t)),{source:"gateway_preconnect"})})})}async function SYe(e){try{let t=await vP();if(typeof t.sentryDsn=="string"&&t.sentryDsn){sk({dsn:t.sentryDsn,...DP,agentPlatform:"openclaw"});return}console.error("[okx-a2a] system-config did not return sentryDsn; Sentry not initialized \u2014 no further events will be reported to SLS"),N.error(Q.SENTRY_INIT_SKIPPED,void 0,{onchainosAgentId:"*",reason:"system-config missing sentryDsn",pluginId:qa.id,pluginVersion:qa.version,source:e})}catch(t){console.log(`[okx-a2a:service] system-config fetch failed in ${e}:`,t),N.error(Q.CONFIG_LOAD_FAILED,t instanceof Error?t:new Error(String(t)),{source:e})}}function Uoe(e,t){let n=[e?.sessionKey,e?.context?.sessionKey,e?.ctx?.sessionKey,e?.hookContext?.sessionKey,t?.sessionKey];for(let r of n)if(typeof r=="string"&&r.trim())return r;return null}function TP(e,t){let n=e[t];if(typeof n!="string"||!n.trim())throw new Error(`Missing required param ${t}`);return n}function kd(e,t){let n=e[t];return typeof n=="string"&&n.trim()?n:void 0}function _Ye(e,t){let n=e[t];if(!Array.isArray(n))return;let r=n.filter(o=>typeof o=="string"&&o.trim().length>0).map(o=>o.trim());return r.length>0?r:void 0}function vYe(e,t){let n=e[t];return typeof n=="boolean"?n:void 0}var qa={id:"okx-a2a",name:"OKX A2A Plugin",version:"0.0.12",register(e){UP(e.runtime),e.registerChannel({plugin:Uq}),e.registerGatewayMethod("okx-a2a.dispatch_user",async({params:n,respond:r})=>{try{let o=TP(n,"content"),i=kd(n,"label");r(!0,await FI({content:o,label:i}))}catch(o){r(!1,void 0,{code:"INVALID_REQUEST",message:o instanceof Error?o.message:String(o)})}},{scope:"operator.admin"}),e.registerGatewayMethod("okx-a2a.prompt_user",async({params:n,respond:r})=>{try{let o=TP(n,"userContent"),i=TP(n,"llmContent");r(!0,await LI({userContent:o,llmContent:i}))}catch(o){r(!1,void 0,{code:"INVALID_REQUEST",message:o instanceof Error?o.message:String(o)})}},{scope:"operator.admin"}),e.registerGatewayMethod("okx-a2a.delete_sessions",async({params:n,respond:r})=>{try{let o=kd(n,"sessionKey"),i=_Ye(n,"sessionKeys"),s=kd(n,"jobId");if(!o&&!i&&!s)throw new Error("Missing required selector: sessionKey, sessionKeys, or jobId");let a=kd(n,"myAgentId"),A=kd(n,"toAgentId"),c=kd(n,"myXmtpAddress"),u=kd(n,"toXmtpAddress"),d=vYe(n,"deleteTranscript");r(!0,await $re({...o?{sessionKey:o}:{},...i?{sessionKeys:i}:{},...s?{jobId:s}:{},...a?{myAgentId:a}:{},...A?{toAgentId:A}:{},...c?{myXmtpAddress:c}:{},...u?{toXmtpAddress:u}:{},...d!==void 0?{deleteTranscript:d}:{}}))}catch(o){r(!1,void 0,{code:"INVALID_REQUEST",message:o instanceof Error?o.message:String(o)})}},{scope:"operator.admin"});let t=rr.getInstance();e.registerHook("agent:bootstrap",async n=>{let r=n.context,o=r.bootstrapFiles;if(Array.isArray(o))try{let i=o.map(a=>`${a.name}(${a.missing?"missing":`${a.content?.length??0}b`})`).join(", ");console.log(`[okx-a2a:hook] agent:bootstrap agentId=${r.agentId??"?"} files=[${i}]`);let s=o.reduce((a,A)=>a+(A.content?.length??0),0);N.info(Q.BOOTSTRAP_APPLIED,{openclawAgentId:r.agentId??"",promptSize:String(s),fileCount:String(o.length),missingCount:String(o.filter(a=>a.missing).length)})}catch(i){N.error(Q.BOOTSTRAP_FAILED,i instanceof Error?i:void 0,{openclawAgentId:r.agentId??""})}},{name:"okx-a2a-agent-bootstrap"}),e.on("before_agent_run",async(n,r)=>{let o=Uoe(n,r);if(!o){console.log("[xmtp_prompt_user:queue] before_agent_run ignored: missing sessionKey");return}yk(o)}),e.on("agent_end",async(n,r)=>{let o=Uoe(n,r);if(!o){console.log("[xmtp_prompt_user:queue] agent_end ignored: missing sessionKey");return}Ik(o)}),e.registerService({id:"okx-a2a:core",start:async()=>{if(console.log("[okx-a2a:service] okx-a2a:core starting (multi-identity mode); initializing communication identities..."),Fm=Date.now(),N.info(Q.GATEWAY_STARTED,{onchainosAgentId:"*",pid:String(process.pid),pluginId:qa.id,pluginVersion:qa.version,nodeVersion:process.version,startedAt:String(Fm)}),yp&&yp(),yp=Toe(),aG(),await Noe(),QYe(),mp&&mp(),mp=Ioe(),!CYe){await SYe("openclaw_lightweight_gateway_service"),console.log("[okx-a2a:service] legacy OpenClaw XMTP runtime disabled; daemon owns XMTP receive/send/agent sync.");return}t.setTools({listAllAgentsWithMetadata:async p=>coe(p),fetchSensitiveWords:async()=>foe(),fetchSystemConfig:async()=>vP(),notifyAgentsWakeup:async p=>uoe(p),createSigner:p=>Ooe(p),sendMessageToSession:async p=>Os(p),sendToMainSession:async p=>Xre(p),deleteSession:async p=>zre(p),createSession:async p=>Zre(p),notifySessionExpired:p=>{let E="[System Notice] The onchainos login session has expired. Agent management, message verification, file transfer, etc. are temporarily unavailable. Run `onchainos wallet login` on the server to re-authenticate, then run `openclaw gateway restart` to restart the gateway.";MI(E).then(({dispatched:m})=>{if(!(m.length>0))return console.log("[onchainos] no user session; falling back session-expired notice to backup session"),No({key:gl(),message:E})}).catch(m=>{console.log("[onchainos] failed to send session-expired notice:",m),N.error(Q.USER_DISPATCH_FAILED,m instanceof Error?m:new Error(String(m)),{source:"notifySessionExpired",onchainosAgentId:"*"})})},createInboundMiddleware:p=>Eoe(p),processOfflineMessage:async(p,E,m)=>RP(p,E,m)}),t.setPluginVersion("0.0.12"),await t.init();let n=t.pluginVersionStatus;if(n.unavailable){console.error(`[okx-a2a:service] okx-a2a:core start aborted: plugin v0.0.12 is below the required minimum v${n.minVersion}. Run \`openclaw plugins update okx-a2a\` to upgrade.`);return}console.log(`[okx-a2a:service] okx-a2a:core initialized, ${t.getClients().size} clients ready`);let r=t.getSystemConfig();r.sentryDsn?sk({dsn:r.sentryDsn,...DP,agentPlatform:"openclaw"}):(console.error("[okx-a2a] system-config did not return sentryDsn; Sentry not initialized \u2014 no further events will be reported to SLS"),N.error(Q.SENTRY_INIT_SKIPPED,void 0,{onchainosAgentId:"*",reason:"system-config missing sentryDsn",pluginId:qa.id,pluginVersion:qa.version})),Vc&&clearInterval(Vc),pp&&clearInterval(pp);let o=t.getSystemConfig().heartbeatInterval,i=p=>({onchainosAgentId:"*",stage:p,clientCount:String(t.getClients().size),onchainosAgentIds:t.getAllAgents().map(E=>E.agentId).join(",")}),s=t.getAllAgents().length,a=0,A=0;hp=!1;let c=++Ep,u=async()=>{console.log("[okx-a2a:sync] scheduled sync starting");let p=Date.now(),E=!1,m=0;try{let D=Date.now();await t.refreshAgents(),m=Date.now()-D,E=!0,a+=1}catch(D){m=Date.now()-p,console.log(`[okx-a2a:sync] refreshAgents failed duration=${m}ms (continuing with the old agent list):`,D),N.error(Q.AGENT_REFRESH_FAILED,D instanceof Error?D:new Error(String(D)),i("syncTick/refreshAgents"))}let I=t.getAllAgents().length;s===0&&I>0&&(console.log(`[okx-a2a:sync] agent list went 0 \u2192 ${I}; retrying fail-soft init resources`),t.retryFailedInit().catch(D=>{console.log("[okx-a2a:sync] retryFailedInit threw:",D)}),t.ensureSensitiveWordsLoaded(!0).catch(D=>{console.log("[okx-a2a:sync] ensureSensitiveWordsLoaded threw:",D)})),s=I;let C=I>0;C||console.log("[okx-a2a:sync] no active agents, skipping heartbeat");let b=E&&A===0;b||console.log(`[okx-a2a:sync] skipping replayOfflineMessages until ${Poe} successful agent syncs after last replay (count=${A})`);let _={durationMs:0},[w,U]=await Promise.all([C?Moe(()=>doe(_P)):Promise.resolve(_),b?Moe(()=>t.replayOfflineMessages()):Promise.resolve(_)]),L=C&&!w.error;if(C&&w.error){let D=w.error;console.log(`[okx-a2a:sync] heartbeat failed duration=${w.durationMs}ms:`,D),N.error(Q.HEARTBEAT_FAILED,D instanceof Error?D:new Error(String(D)),{...i("syncTick/heartbeat"),chainIndex:_P})}let M=!b||!U.error;if(E&&(A=b?1:(A+1)%Poe),!M){let D=U.error;console.log(`[okx-a2a:sync] replayOfflineMessages failed duration=${U.durationMs}ms:`,D),N.error(Q.OFFLINE_REPLAY_FAILED,D instanceof Error?D:new Error(String(D)),i("syncTick/replayOfflineMessages"))}console.log(`[okx-a2a:sync] scheduled sync done (refreshOk=${E}, heartbeatOk=${L}, heartbeatSkipped=${!C}, replayOk=${M}, replaySkipped=${!b}, total=${Date.now()-p}ms, refresh=${m}ms, heartbeat=${C?`${w.durationMs}ms`:"skipped"}, replay=${b?`${U.durationMs}ms`:"skipped"})`),N.info(Q.SYNC_TICK_COMPLETED,{...i("syncTick"),refreshOk:E?"1":"0",heartbeatOk:L?"1":"0",heartbeatSkipped:C?"0":"1",replayOk:M?"1":"0",replaySkipped:b?"0":"1",agentSyncCount:String(a),agentSyncsSinceOfflineReplay:String(A),durationMs:String(Date.now()-p)})},d=!1,l=async()=>{if(!(hp||c!==Ep)){if(d){console.log("[okx-a2a:sync] previous tick still running, skipping this fire");return}d=!0;try{await u()}finally{d=!1}}},f=p=>{hp||c!==Ep||(Vc&&clearInterval(Vc),o=p,console.log(`[okx-a2a:sync] scheduled sync interval ${o}s (aligned with heartbeat)`),Vc=setInterval(()=>{l()},o*1e3))},g=async()=>{if(hp||c!==Ep)return;let p=o;try{if(await t.refreshSystemConfig(),hp||c!==Ep)return;let E=t.getSystemConfig().heartbeatInterval;E!==p&&(console.log(`[okx-a2a:sync] heartbeat interval changed from ${p}s to ${E}s; rescheduling sync timer`),f(E))}catch(E){console.log("[okx-a2a:sync] system-config refresh failed:",E),N.error(Q.CONFIG_LOAD_FAILED,E instanceof Error?E:new Error(String(E)),i("systemConfigRefresh"))}};l(),f(o),pp=setInterval(()=>{g()},3600*1e3)},stop:async()=>{hp=!0,Ep+=1,mp&&(mp(),mp=void 0),yp&&(yp(),yp=void 0),Vc&&(clearInterval(Vc),Vc=void 0),pp&&(clearInterval(pp),pp=void 0),AG(),await Doe(),console.log("[okx-a2a:service] okx-a2a:core stopped");let n=Date.now();N.info(Q.GATEWAY_STOPPED,{onchainosAgentId:"*",pid:String(process.pid),pluginId:qa.id,pluginVersion:qa.version,stoppedAt:String(n),uptimeMs:Fm?String(n-Fm):"unknown"}),Fm=void 0}})}},wYe=qa;async function Moe(e){let t=Date.now();try{return await e(),{durationMs:Date.now()-t}}catch(n){return{durationMs:Date.now()-t,error:n}}}
156
156
  /*! Bundled license information:
157
157
 
158
158
  cookie/index.js:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@okxweb3/a2a-openclaw",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "description": "OpenClaw plugin for E2E encrypted agent-to-agent communication via XMTP",
5
5
  "main": "dist/index.js",
6
6
  "files": [