@okxweb3/a2a-openclaw 0.0.0-beta.4 → 0.0.0-beta.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/dist/index.js CHANGED
@@ -128,7 +128,7 @@ ${t.format(r)}
128
128
  \u2022 Key Package valid until: ${d.toLocaleString()}
129
129
  \u2022 Networks: ${i}
130
130
  ${s.map(f=>`\u2022 URL: ${f}`).join(`
131
- `)}`)};var kqe=e=>!!e.contentType?.sameAs(dh),Nqe=e=>!!e.contentType?.sameAs(Pm),Dqe=e=>Nqe(e)&&typeof e.content.content=="string",Kte=e=>!!e.contentType?.sameAs(zo);var $te=e=>{switch(!0){case kqe(e):case Dqe(e):return e.content.content;case Kte(e):return e.content}};function Tqe(){return(e,t)=>e.senderInboxId!==t.inboxId}function Oqe(){return(e,t)=>e.senderInboxId===t.inboxId}function Pqe(){return e=>!!e.contentType?.sameAs(zo)}function Uqe(e){let t=Array.isArray(e)?e:[e];return r=>t.includes(r.senderInboxId)}function Mqe(e){return t=>{let r=$te(t);return!!(r&&r.startsWith(e))}}function Fqe(...e){return(t,r)=>{for(let n of e)if(!n(t,r))return!1;return!0}}function Lqe(...e){return(t,r)=>{for(let n of e)if(n(t,r))return!0;return!1}}function qqe(e){return(t,r)=>!e(t,r)}var zte={notFromSelf:Tqe(),fromSelf:Oqe(),textOnly:Pqe(),fromSender:Uqe,startsWith:Mqe,and:Fqe,or:Lqe,not:qqe};rp();Ke();function bO(){return Cr(bo.utils.randomPrivateKey())}rp();Ke();_s();_i();function Zte(e){if(typeof e=="string"){if(!dt(e,{strict:!1}))throw new Bt({address:e});return{address:e,type:"json-rpc"}}if(!dt(e.address,{strict:!1}))throw new Bt({address:e.address});return{address:e.address,nonceManager:e.nonceManager,sign:e.sign,signAuthorization:e.signAuthorization,signMessage:e.signMessage,signTransaction:e.signTransaction,signTypedData:e.signTypedData,source:"custom",type:"local"}}rp();vs();Kn();Ke();var QO=!1;async function Us({hash:e,privateKey:t,to:r="object"}){let{r:n,s:o,recovery:i}=bo.sign(e.slice(2),t.slice(2),{lowS:!0,extraEntropy:dr(QO,{strict:!1})?lr(QO):QO}),s={r:H(n,{size:32}),s:H(o,{size:32}),v:i?28n:27n,yParity:i};return r==="bytes"||r==="hex"?Ste({...s,to:r}):s}async function Xte(e){let{chainId:t,nonce:r,privateKey:n,to:o="object"}=e,i=e.contractAddress??e.address,s=await Us({hash:t_({address:i,chainId:t,nonce:r}),privateKey:n,to:o});return o==="object"?{address:i,chainId:t,nonce:r,...s}:s}async function jte({message:e,privateKey:t}){return await Us({hash:Lee(e),privateKey:t,to:"hex"})}_c();async function ere(e){let{privateKey:t,transaction:r,serializer:n=Iee}=e,o=r.type==="eip4844"?{...r,sidecars:!1}:r,i=await Us({hash:fr(await n(o)),privateKey:t});return await n(r,i)}async function tre(e){let{privateKey:t,...r}=e;return await Us({hash:Gee(r),privateKey:t,to:"hex"})}function SO(e,t={}){let{nonceManager:r}=t,n=Cr(bo.getPublicKey(e.slice(2),!1)),o=NS(n);return{...Zte({address:o,nonceManager:r,async sign({hash:s}){return Us({hash:s,privateKey:e,to:"hex"})},async signAuthorization(s){return Xte({...s,privateKey:e})},async signMessage({message:s}){return jte({message:s,privateKey:e})},async signTransaction(s,{serializer:a}={}){return ere({privateKey:e,transaction:s,serializer:a})},async signTypedData(s){return tre({...s,privateKey:e})}}),publicKey:n,source:"privateKey"}}var _O=Nee({id:11155111,name:"Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://11155111.rpc.thirdweb.com"]}},blockExplorers:{default:{name:"Etherscan",url:"https://sepolia.etherscan.io",apiUrl:"https://api-sepolia.etherscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:751532},ensUniversalResolver:{address:"0xeeeeeeee14d718c2b47d9923deab1335e144eeee",blockCreated:8928790}},testnet:!0});var rre=(e,t=_O)=>{let r=e??bO(),n=SO(r);return{key:r,account:n,wallet:CO({account:n,chain:t,transport:BO()})}},Gqe=e=>({identifier:e.account.address.toLowerCase(),identifierKind:0}),nre=e=>{let t=Gqe(e);return{type:"EOA",getIdentifier:()=>t,signMessage:async r=>{let n=await e.wallet.signMessage({account:e.account,message:r});return Qi(n)}}};var lv=class{#e;#t;#n;constructor(t,r,n){this.#t=t,this.#n=r,this.#e=n}async sendReaction(t,r="unicode"){let n={action:"added",reference:this.#t.id,referenceInboxId:this.#t.senderInboxId,schema:r,content:t};await this.#n.send(n,dh)}async sendText(t){await this.#n.send(t,zo)}async sendTextReply(t){let r={reference:this.#t.id,referenceInboxId:this.#t.senderInboxId,contentType:zo,content:t};await this.#n.send(r,Pm)}getOwnAddress(){return this.#e.accountIdentifier?.identifier}async getSenderAddress(){return(await this.#e.preferences.inboxStateFromInboxIds([this.#t.senderInboxId]))[0].identifiers[0].identifier}get message(){return this.#t}get conversation(){return this.#n}get client(){return this.#e}};var hE=class e extends ore.default{#e;#t=[];#n=!1;constructor({client:t}){super(),this.#e=t}static async create(t,r){if(!t)if(dr(process.env.XMTP_WALLET_KEY))t=nre(rre(process.env.XMTP_WALLET_KEY));else throw new Error('No signer detected. Provide a "signer" to "Agent.create()" or set the "XMTP_WALLET_KEY" environment variable to a private key in hexadecimal format. Read more: https://docs.xmtp.org/inboxes/core-messaging/create-a-signer');let n={...r};n.appVersion??="agent-sdk/alpha",process.env.XMTP_DB_ENCRYPTION_KEY&&(n.dbEncryptionKey=Vte(process.env.XMTP_DB_ENCRYPTION_KEY)),process.env.XMTP_ENV&&Object.keys(Ic).includes(process.env.XMTP_ENV)&&(n.env=process.env.XMTP_ENV),process.env.XMTP_FORCE_DEBUG&&(n.debugEventsEnabled=!0,n.loggingLevel="warn",n.structuredLogging=!0);let o=[...n.codecs??[],new dI,new pS,new qf],i=await Jf.create(t,{...n,codecs:o});return process.env.XMTP_FORCE_REVOKE_INSTALLATIONS&&await i.revokeAllOtherInstallations(),process.env.XMTP_FORCE_DEBUG&&await Wte(i),new e({client:i})}use(t){return this.#t.push(t),this}async start(){if(!this.#n)try{this.#n=!0,this.emit("start");let t=await this.#e.conversations.streamAllMessages();for await(let r of t){if(!this.#n)break;try{await this.#r(r)}catch(n){this.#o(n)}}}catch(t){this.#n=!1,this.#o(t)}}async#r(t){let r=await this.#e.conversations.getConversationById(t.conversationId);if(!r){this.#o(new Error(`Failed to process message ID "${t.id}" for conversation ID "${t.conversationId}" because the conversation could not be found.`));return}let n=new lv(t,r,this.#e),o=0,i=async()=>{if(o<this.#t.length){let s=this.#t[o++];await s(n,i)}else zte.notFromSelf(t,this.#e)&&this.emit("message",n)};await i()}get client(){return this.#e}stop(){this.#n=!1,this.emit("stop")}#o(t){let r=t instanceof Error?t:new Error(String(t));this.emit("error",r)}};var ire=require("node:child_process"),sre=require("node:util");var are=(0,sre.promisify)(ire.execFile),Yc=null;async function Jqe(){if(Yc)return Yc;let e=process.env.ONCHAINOS_BIN;if(e)return console.log(`[onchainos] using ONCHAINOS_BIN=${e}`),Yc=e,Yc;try{let t=process.env.SHELL||"/bin/bash",{stdout:r}=await are(t,["-ilc","which onchainos"]),n=r.trim();if(n)return console.log(`[onchainos] resolved binary via shell: ${n}`),Yc=n,Yc}catch(t){console.log("[onchainos] shell resolve failed, will fallback to bare 'onchainos':",t)}return console.log("[onchainos] could not resolve binary path, falling back to bare 'onchainos'"),Yc="onchainos",Yc}async function Xn(e){let t=await Jqe(),r=`${t} ${e.join(" ")}`;console.log(`[onchainos] exec: ${r}`);let n=Date.now();try{let o=await are(t,e);return console.log(`[onchainos] exec done: ${r} (${Date.now()-n}ms, stdout=${o.stdout.length}B, stderr=${o.stderr.length}B)`),o}catch(o){throw console.log(`[onchainos] exec error: ${r} (${Date.now()-n}ms) code=${o.code} signal=${o.signal} killed=${o.killed} message=${o.message}`),q.error(G.ONCHAINOS_CLI_ERROR,o instanceof Error?o:new Error(String(o?.message??o)),{args:e.join(" ").slice(0,1e3),exitCode:String(o?.code??""),signal:String(o?.signal??""),killed:String(o?.killed??""),stderr:String(o?.stderr??"").slice(0,500),stdout:String(o?.stdout??"").slice(0,500),message:String(o?.message??"").slice(0,500),durationMs:String(Date.now()-n)}),o}}function Yqe(e){return typeof e=="object"&&e!==null&&Array.isArray(e.agentList)}function ure(e){let t=[];for(let r of e.list)Yqe(r)?t.push(...r.agentList):t.push(r);return{list:t,page:e.page,pageSize:e.pageSize,total:e.total}}var dre={OK_FALSE:"ok_false",JSON_PARSE_FAILED:"json_parse_failed"};function Hc(e,t,r){return{command:t,reason:dre.OK_FALSE,...r,response:e.slice(0,500)}}function ki(e,t,r={}){try{return JSON.parse(e)}catch(n){let o=n instanceof Error?n:new Error(String(n));throw q.error(G.ONCHAINOS_CLI_ERROR,o,{command:t,reason:dre.JSON_PARSE_FAILED,...r,response:e.slice(0,500)}),o}}var Are=/session expired/i;function Vc(e){try{let t=JSON.parse(e);return t.ok===!1&&Are.test(String(t.error??""))}catch{return Are.test(e)}}var cre=0,Hqe=300*1e3;function Wc(e){let t=Date.now();if(t-cre<Hqe)return;cre=t,q.error(G.ONCHAINOS_SESSION_EXPIRED,new Error("onchainos session expired"),{command:e});let r=Wr.getInstance().tools.notifySessionExpired;if(!r){console.log("[onchainos] tools.notifySessionExpired not injected \u2014 skipping user notice");return}try{r(e)}catch(n){console.log("[onchainos] tools.notifySessionExpired threw:",n)}}function tg(e,t){Vc(e)&&Wc(t)}function Kc(e,t){let r=String(e?.stdout??"");r&&Vc(r)&&Wc(t)}var fv=50;async function Vqe(e){console.log(`[onchainos] executing: onchainos agent get --page ${e} --page-size ${fv}`);let t,r;try{({stdout:t,stderr:r}=await Xn(["agent","get","--page",String(e),"--page-size",String(fv)]))}catch(o){throw Kc(o,"list-agents"),o}r&&console.log(`[onchainos] stderr (page=${e}): ${r}`);let n=ki(t,"list-agents",{page:String(e),pageSize:String(fv)});if(!n.ok){tg(t,"list-agents");let o=new Error(`onchainos agent get failed: ${t}`);throw q.error(G.ONCHAINOS_CLI_ERROR,o,Hc(t,"list-agents",{page:String(e),pageSize:String(fv)})),o}return ure(n.data)}var mE=new Map;function Wqe(e){let t=e.toLowerCase();for(let r of mE.values())if(r.communicationAddress.toLowerCase()===t)return r}var xd="196";async function vO(e){let t=e.filter(n=>!mE.has(n));if(t.length>0){console.log(`[onchainos] executing: onchainos agent get --agent-ids ${t.join(",")}`);let n,o;try{({stdout:n,stderr:o}=await Xn(["agent","get","--agent-ids",t.join(",")]))}catch(s){throw Kc(s,"get-agents-by-ids"),s}o&&console.log(`[onchainos] stderr (get-agents-by-ids): ${o}`);let i=ki(n,"get-agents-by-ids",{agentIds:t.join(",")});if(!i.ok){tg(n,"get-agents-by-ids");let s=new Error(`onchainos agent get --agent-ids failed: ${n}`);throw q.error(G.ONCHAINOS_CLI_ERROR,s,Hc(n,"get-agents-by-ids",{agentIds:t.join(",")})),s}for(let s of ure(i.data).list)mE.set(s.agentId,s)}let r=[];for(let n of e){let o=mE.get(n);o&&r.push(o)}return r}async function lre(e){let t=Wqe(e);if(t)return t;console.log(`[onchainos] executing: onchainos agent get-by-address --communication-address ${e} --chain-index ${xd}`);let r,n;try{({stdout:r,stderr:n}=await Xn(["agent","get-by-address","--communication-address",e,"--chain-index",xd]))}catch(i){throw Kc(i,"get-agent-by-address"),i}n&&console.log(`[onchainos] stderr (get-agent-by-address): ${n}`);let o=ki(r,"get-agent-by-address",{communicationAddress:e,chainIndex:xd});if(!o.ok){tg(r,"get-agent-by-address");let i=new Error(`onchainos agent get-by-address failed: ${r}`);throw q.error(G.ONCHAINOS_CLI_ERROR,i,Hc(r,"get-agent-by-address",{communicationAddress:e,chainIndex:xd})),i}if(o.data)return mE.set(o.data.agentId,o.data),o.data}async function wO(){console.log("[onchainos] fetching all agents...");let e=[],t=1;for(;;){let n=await Vqe(t);if(e.push(...n.list),console.log(`[onchainos] page ${t}: got ${n.list.length}, total=${n.total}`),e.length>=n.total||n.list.length===0)break;t++}let r=e.filter(n=>n.status===1);for(let n of r)console.log(`[onchainos] agent: id=${n.agentId} name="${n.name}" comm=${n.communicationAddress} keyUuid=${n.keyUuid} status=${n.status}`);return console.log(`[onchainos] fetched ${e.length} agents total, ${r.length} active (status=1)`),r}async function fre(e){if(e.length===0){console.log("[onchainos] wakeup-notify: agentIds empty, skipping");return}let t=e.join(",");console.log(`[onchainos] sending wakeup-notify (agent-ids=${t})`);try{let{stderr:r}=await Xn(["agent","wakeup-notify","--agent-ids",t]);r&&console.log(`[onchainos] stderr (wakeup-notify): ${r}`),console.log(`[onchainos] wakeup-notify succeeded (agent-ids=${t})`)}catch(r){Kc(r,"wakeup-notify"),console.log(`[onchainos] wakeup-notify failed (agent-ids=${t}):`,r?.message??r)}}async function pre(e){console.log(`[onchainos] sending heartbeat (chain-index=${e})`);try{let{stderr:t}=await Xn(["agent","heartbeat","--chain-index",e]);t&&console.log(`[onchainos] stderr (heartbeat): ${t}`),console.log("[onchainos] heartbeat sent")}catch(t){throw Kc(t,"heartbeat"),t}}async function pv(e){console.log(`[onchainos] checking message-eligible: job=${e.jobId} direction=${e.direction} providerSecurityRate=${e.providerSecurityRate}`);let t,r;try{({stdout:t,stderr:r}=await Xn(["agent","message-eligible","--agent-id",e.agentId,"--client-agent-id",e.clientAgentId,"--provider-agent-id",e.providerAgentId,"--job-id",e.jobId,"--group-id",e.groupId,"--direction",e.direction,"--provider-security-rate",String(e.providerSecurityRate)]))}catch(o){return Kc(o,"message-eligible"),{eligible:!0}}r&&console.log(`[onchainos] stderr (message-eligible): ${r}`);let n=ki(t,"message-eligible",{onchainosAgentId:e.agentId,clientAgentId:e.clientAgentId,providerAgentId:e.providerAgentId,jobId:e.jobId,groupId:e.groupId,direction:e.direction,providerSecurityRate:String(e.providerSecurityRate)});return n.ok?(console.log(`[onchainos] message-eligible result: eligible=${n.data.eligible}`),n.data):(tg(t,"message-eligible"),console.warn(`[onchainos] message-eligible ok=false, letting message through: ${t.slice(0,200)}`),q.error(G.INBOUND_ELIGIBILITY_BYPASSED,new Error("message-eligible ok=false"),Hc(t,"message-eligible",{onchainosAgentId:e.agentId,agentId:e.agentId,clientAgentId:e.clientAgentId,providerAgentId:e.providerAgentId,jobId:e.jobId,groupId:e.groupId,direction:e.direction,providerSecurityRate:String(e.providerSecurityRate),reason:"ok=false"})),{eligible:!0})}async function gre(){console.log("[onchainos] fetching system-config");let e,t;try{({stdout:e,stderr:t}=await Xn(["agent","system-config"]))}catch(n){throw Kc(n,"system-config"),n}t&&console.log(`[onchainos] stderr (system-config): ${t}`);let r=ki(e,"system-config");if(!r.ok){tg(e,"system-config");let n=new Error("onchainos agent system-config failed");throw q.error(G.ONCHAINOS_CLI_ERROR,n,Hc(e,"system-config")),n}return console.log(`[onchainos] fetched system-config: ${Object.keys(r.data).length} keys`),r.data}async function hre(){console.log("[onchainos] fetching sensitive words");let e,t;try{({stdout:e,stderr:t}=await Xn(["agent","sensitive-words"]))}catch(i){throw Kc(i,"sensitive-words"),i}t&&console.log(`[onchainos] stderr (sensitive-words): ${t}`);let r=ki(e,"sensitive-words");if(!r.ok){tg(e,"sensitive-words");let i=new Error("onchainos agent sensitive-words failed");throw q.error(G.ONCHAINOS_CLI_ERROR,i,Hc(e,"sensitive-words")),i}let n=new Set;for(let i of r.data)for(let[s,a]of Object.entries(i))s!=="type"&&typeof a=="string"&&a&&n.add(a);let o=[...n];return console.log(`[onchainos] fetched ${r.data.length} sensitive word entries \u2192 ${o.length} unique words`),o}async function Kqe(e,t,r,n){console.log(`[onchainos-signer] executing: onchainos agent xmtp-sign --key-uuid ${t} --message <${n.length} chars>`);let o,i;try{({stdout:o,stderr:i}=await Xn(["agent","xmtp-sign","--key-uuid",t,"--message",n]))}catch(a){let A=String(a?.stdout??"");throw A&&Vc(A)&&Wc("xmtp-sign"),a}i&&console.log(`[onchainos-signer] stderr: ${i}`);let s=ki(o,"xmtp-sign",{onchainosAgentId:e,keyUuid:t,walletAddress:r,messageLength:String(n.length)});if(!s.ok){Vc(o)&&Wc("xmtp-sign");let a=new Error(`onchainos xmtp-sign failed: ${o}`);throw q.error(G.ONCHAINOS_CLI_ERROR,a,Hc(o,"xmtp-sign",{onchainosAgentId:e,keyUuid:t,walletAddress:r,messageLength:String(n.length)})),a}return console.log(`[onchainos-signer] sign success, signature=${s.data.signature.slice(0,20)}...`),Qi(s.data.signature)}function xO(e){let t=e.communicationAddress.toLowerCase(),r=e.keyUuid,n=e.agentId;return console.log(`[onchainos-signer] creating signer for ${t} (keyUuid=${r})`),{type:"EOA",getIdentifier:()=>({identifier:t,identifierKind:0}),signMessage:async o=>(console.log(`[onchainos-signer] signing message for ${t}`),await Kqe(n,r,t,o))}}function mre(){return async(e,t)=>{let r=e.client?.inboxId,n=e.message?.senderInboxId;r&&n&&String(n).toLowerCase()===String(r).toLowerCase()||await t()}}function Ere(e){let t=`[xmtp-sdk:${e.walletAddress??"?"}]`;return async(r,n)=>{let o=r.message,i=r.conversation,s=i.id,a=JSON.stringify(o),A={...Je(e),peerInboxId:o.senderInboxId,conversationId:s,messageId:o.id};if(i instanceof ur){let c=i.name??"unnamed",u="0",d="",l="0";try{let f=await i.members();u=String(f.length),d=` members=[${f.flatMap(h=>h.accountIdentifiers.map(m=>m.identifier)).join(", ")}]`}catch(f){console.log(`${t} [group] members fetch failed:`,f),u="fetch-failed",d=" members=[fetch failed]",l="1"}console.log(`${t} [group] conv=${s} name="${c}"${d} sender=${o.senderInboxId} content: ${a}`),q.info(G.MESSAGE_RECEIVED,{...A,chatType:"group",groupName:c,memberCount:u,membersFetchFailed:l})}else console.log(`${t} [dm] conv=${s} sender=${o.senderInboxId} content: ${a}`),q.info(G.MESSAGE_RECEIVED,{...A,chatType:"dm"});await n()}}var $qe=/^[a-zA-Z]{1,4}$/;function yre(e,t){if(t.length===0)return null;let r=e.toLowerCase();for(let n of t)if(!$qe.test(n)&&r.includes(n.toLowerCase()))return n;return null}function Ire(e){return e.length<=1?"*":e.length===2?`${e[0]}*`:e[0]+"*".repeat(e.length-2)+e[e.length-1]}async function rg(e,t,r=20){let n=new Array(e.length),o=0;async function i(){for(;o<e.length;){let a=o++;try{n[a]={status:"fulfilled",value:await t(e[a])}}catch(A){n[a]={status:"rejected",reason:A}}}}let s=Array.from({length:Math.min(r,e.length)},()=>i());return await Promise.all(s),n}var EE=`${(0,ng.homedir)()}/.openclaw/okx-a2a-data-db/last-sync.json`,NO=`${(0,ng.homedir)()}/.openclaw/okx-a2a-data-db/sensitive-words.json`,DO=`${(0,ng.homedir)()}/.openclaw/okx-a2a-data-db/system-config.json`,zqe=600*1e3;function Zqe(){try{if(!(0,Kr.existsSync)(NO))return null;let e=JSON.parse((0,Kr.readFileSync)(NO,"utf-8"));return Array.isArray(e)?e:null}catch(e){return console.log("[xmtp-sdk] failed to read sensitive-words.json cache:",e),null}}function Xqe(e){try{(0,Kr.writeFileSync)(NO,JSON.stringify(e))}catch(t){console.log("[xmtp-sdk] failed to write sensitive-words.json:",t)}}async function Cre(){let e=Zqe();try{let t=await hre();return console.log(`[xmtp-sdk] fetched ${t.length} sensitive words from API`),Xqe(t),t}catch(t){console.log("[xmtp-sdk] API fetch for sensitive words failed:",t)}return e?(console.log(`[xmtp-sdk] using ${e.length} cached sensitive words from disk`),e):(console.log("[xmtp-sdk] sensitive-words load failed: neither API nor local cache available"),null)}function jqe(){try{if(!(0,Kr.existsSync)(DO))return null;let e=JSON.parse((0,Kr.readFileSync)(DO,"utf-8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch(e){return console.log("[xmtp-sdk] failed to read system-config.json cache:",e),null}}function eGe(e){try{(0,Kr.writeFileSync)(DO,JSON.stringify(e))}catch(t){console.log("[xmtp-sdk] failed to write system-config.json:",t)}}async function RO(){let e=jqe();try{let t=await gre();return console.log(`[xmtp-sdk] fetched system-config from API: ${Object.keys(t).length} keys`),eGe(t),t}catch(t){console.log("[xmtp-sdk] API fetch for system-config failed:",t)}return e?(console.log(`[xmtp-sdk] using cached system-config from disk: ${Object.keys(e).length} keys`),e):(console.log("[xmtp-sdk] system-config load failed: neither API nor local cache available"),null)}function tGe(){let e=new Map;try{if(!(0,Kr.existsSync)(EE))return e;let r=JSON.parse((0,Kr.readFileSync)(EE,"utf-8"))?.syncByAddress;if(r&&typeof r=="object"&&!Array.isArray(r))for(let[n,o]of Object.entries(r))typeof o=="number"&&o>0&&e.set(n,o)}catch(t){console.log("[xmtp-sdk] failed to read last-sync.json cache:",t)}return e}function kO(e,t){try{let r={};if((0,Kr.existsSync)(EE))try{let n=JSON.parse((0,Kr.readFileSync)(EE,"utf-8"));n&&typeof n=="object"&&!Array.isArray(n)&&(r=n)}catch{}(!r.syncByAddress||typeof r.syncByAddress!="object")&&(r.syncByAddress={}),r.syncByAddress[e]=t,(0,Kr.writeFileSync)(EE,JSON.stringify(r,null,2))}catch(r){console.log(`[xmtp-sdk] failed to write last-sync.json (address=${e}):`,r)}}var TO={heartbeatInterval:600,extConfig:{tips:{"task-skill":"Read the okx-agent-task skill if you don't know the context"}}};function rGe(e){if(!e||typeof e!="object"||Array.isArray(e))return{...TO.extConfig.tips};let t={};for(let[r,n]of Object.entries(e))typeof n=="string"&&(t[r]=n);return Object.keys(t).length>0?t:{...TO.extConfig.tips}}function nGe(e){let t=e&&typeof e=="object"&&!Array.isArray(e)?e:{};return{tips:rGe(t.tips)}}function gv(e){let t=Array.isArray(e.accounts)?e.accounts.reduce((r,n)=>{if(!n||typeof n!="object"||Array.isArray(n))return r;let o=n,i=o.address,s=o.inboxId,a=o.type;return typeof s!="string"||!s||r.push({address:i,inboxId:s,type:a}),r},[]):[];return{heartbeatInterval:typeof e.heartbeatInterval=="number"?e.heartbeatInterval:TO.heartbeatInterval,accounts:t,sentryDsn:typeof e.sentryDsn=="string"?e.sentryDsn:"",extConfig:nGe(e.extConfig)}}function Bre(e){return typeof e=="string"?e:typeof e?.content=="string"?e.content:null}function oGe(e){let t=Bre(e);if(!t)return null;try{return JSON.parse(t)}catch{return null}}var Wr=class e{static instance=null;env=process.env.XMTP_ENV??"production";clients=new Map;allAgents=[];sensitiveWords=null;sensitiveWordsLastFailedAtMs=0;sensitiveWordsRetryInflight=null;systemConfig=gv({});_initialized=!1;_initFailures=[];_backupReady=Promise.resolve();syncByAddress=new Map;refreshAgentsInFlight;tools={};constructor(){}static getInstance(){return e.instance||(e.instance=new e),e.instance}async init(){console.log("[xmtp-sdk] init: loading config and initializing XMTP clients in parallel..."),this._initFailures=[];let[t,r,n]=await Promise.allSettled([Cre(),RO(),this.initXmtpInstall()]),o=this.tools.onAfterInit;if(this._backupReady=o?o().catch(s=>{console.log("[xmtp-sdk] tools.onAfterInit failed (will retry on first use):",s)}):Promise.resolve(),t.status==="fulfilled"&&t.value!==null)this.sensitiveWords=t.value;else{this.sensitiveWords=null;let s=t.status==="rejected"?t.reason:"loadSensitiveWords returned null (neither API nor local cache is available)";console.log("[xmtp-sdk] init: loadSensitiveWords failed; will lazy-retry during message handling:",s)}if(r.status==="fulfilled"&&r.value)this.systemConfig=gv(r.value);else{let s=r.status==="rejected"?r.reason instanceof Error?r.reason:new Error(String(r.reason)):new Error("loadSystemConfig returned null (neither API nor local cache is available)");this._initFailures.push({action:"loadSystemConfig",error:s}),console.log("[xmtp-sdk] init: loadSystemConfig failed:",s.message)}if(n.status==="fulfilled")console.log(`[xmtp-sdk] init: XMTP clients initialized, ${n.value.size} clients`);else{let s=n.reason instanceof Error?n.reason:new Error(String(n.reason));this._initFailures.push({action:"initXmtpInstall",error:s}),console.log("[xmtp-sdk] init: initXmtpInstall failed:",s.message)}this._initialized=this._initFailures.length===0;let i=n.status==="fulfilled"?n.value.size:0;console.log(`[xmtp-sdk] init done: initialized=${this._initialized}, clients=${i}, failures=${this._initFailures.length}`)}async retryFailedInit(){let t=[];for(let r of this._initFailures){console.log(`[xmtp-sdk] retryFailedInit: retrying ${r.action}...`);try{if(r.action==="loadSystemConfig"){let n=await RO();n?(this.systemConfig=gv(n),console.log("[xmtp-sdk] retryFailedInit: loadSystemConfig retry succeeded")):t.push({action:r.action,error:new Error("loadSystemConfig returned null (neither API nor local cache is available)")})}else r.action==="initXmtpInstall"&&(await this.initXmtpInstall(),console.log("[xmtp-sdk] retryFailedInit: initXmtpInstall retry succeeded"))}catch(n){let o=n instanceof Error?n:new Error(String(n));t.push({action:r.action,error:o}),console.log(`[xmtp-sdk] retryFailedInit: ${r.action} retry failed:`,o.message)}}return this._initFailures=t,t.length===0&&(this._initialized=!0),{ok:t.length===0,failures:t}}async initXmtpInstall(){console.log(`==============XMTP_ENV: ${this.env}==============`);let t=Date.now(),r=`${(0,ng.homedir)()}/.openclaw/okx-a2a-data-db`;try{(0,Kr.mkdirSync)(r,{recursive:!0})}catch(a){return console.log(`[xmtp-sdk] failed to create data directory: ${r}`,a),this.clients}this.syncByAddress=tGe(),console.log(`[xmtp-sdk] sync timestamps: ${this.syncByAddress.size} addresses on record`);let n=await wO();console.log(`[xmtp-sdk] fetched ${n.length} agents from onchainos`),this.allAgents=n,fre(n.map(a=>a.agentId)).catch(a=>{console.log("[xmtp-sdk] notifyAgentsWakeup unexpected error:",a)});let o=async a=>{let A=a.communicationAddress,c=xO(a),u=await hE.create(c,{dbPath:d=>`${r}/${d}-${this.env}.db3`,env:this.env});return{address:A,agent:u,agentInfo:a}},i=await rg(n,o),s=[];for(let a=0;a<i.length;a++){let A=i[a];if(A.status==="fulfilled"){let{address:c,agent:u,agentInfo:d}=A.value;this.clients.set(c,u),console.log(`[xmtp-sdk] identity initialized: ${c} (agentId=${d.agentId})`)}else s.push(n[a]),console.log(`[xmtp-sdk] identity init failed: ${n[a].communicationAddress} (agentId=${n[a].agentId})`,A.reason)}if(s.length>0){console.log(`[xmtp-sdk] ${s.length} client(s) failed to initialize, retrying in 1s...`),await new Promise(A=>setTimeout(A,1e3));let a=await rg(s,o);for(let A=0;A<a.length;A++){let c=a[A];if(c.status==="fulfilled"){let{address:u,agent:d,agentInfo:l}=c.value;this.clients.set(u,d),console.log(`[xmtp-sdk] retry succeeded: ${u} (agentId=${l.agentId})`)}else{let u=s[A];console.log(`[xmtp-sdk] retry still failed: ${u.communicationAddress} (agentId=${u.agentId})`,c.reason),q.error(G.XMTP_CONNECTION_FAILED,c.reason instanceof Error?c.reason:new Error(String(c.reason)),{walletAddress:u.communicationAddress,onchainosAgentId:u.agentId})}}}return console.log(`[xmtp-sdk] initialized ${this.clients.size}/${n.length} clients in total`),await this.startListening(),q.info(G.CHANNEL_READY,{onchainosAgentId:"*",clientCount:String(this.clients.size),agentCount:String(n.length),onchainosAgentIds:n.map(a=>a.agentId).join(","),walletAddresses:n.map(a=>a.communicationAddress).join(","),startupDurationMs:String(Date.now()-t)}),this.clients}async refreshAgents(){return this.refreshAgentsInFlight?(console.log("[xmtp-sdk] refresh: a refresh is already in flight, reusing the same promise"),this.refreshAgentsInFlight):(this.refreshAgentsInFlight=this.runRefreshAgents().finally(()=>{this.refreshAgentsInFlight=void 0}),this.refreshAgentsInFlight)}async runRefreshAgents(){let t=await wO();console.log(`[xmtp-sdk] refresh: fetched ${t.length} agents from onchainos`);let r=new Set(this.allAgents.map(s=>s.communicationAddress)),n=new Set(t.map(s=>s.communicationAddress)),o=t.filter(s=>!r.has(s.communicationAddress)),i=this.allAgents.filter(s=>!n.has(s.communicationAddress));this.allAgents=t;for(let s of i){let a=s.communicationAddress,A=this.clients.get(a);if(A){try{A.stop(),console.log(`[xmtp-sdk] refresh: stopped client: ${a} (agentId=${s.agentId})`)}catch(c){console.log(`[xmtp-sdk] refresh: failed to stop client: ${a}`,c),q.error(G.AGENT_REFRESH_FAILED,c instanceof Error?c:new Error(String(c)),{walletAddress:a,onchainosAgentId:s.agentId,phase:"stop-client"})}this.clients.delete(a)}}if(o.length>0){let s=`${(0,ng.homedir)()}/.openclaw/okx-a2a-data-db`;try{(0,Kr.mkdirSync)(s,{recursive:!0})}catch(u){return console.log(`[xmtp-sdk] refresh: failed to create data directory: ${s}`,u),q.error(G.AGENT_REFRESH_FAILED,u instanceof Error?u:new Error(String(u)),{onchainosAgentId:"*",phase:"mkdir",dbDir:s,addedCount:String(o.length)}),{added:[],removed:i.map(d=>`${d.agentId} (${d.communicationAddress})`)}}let a=async u=>{let d=u.communicationAddress,l=xO(u),f=await hE.create(l,{dbPath:p=>`${s}/${p}-${this.env}.db3`,env:this.env});return{address:d,agent:f,agentInfo:u}},A=await rg(o,a),c=[];for(let u=0;u<A.length;u++){let d=A[u];if(d.status==="fulfilled"){let{address:l,agentInfo:f}=d.value;this.clients.set(l,d.value.agent),console.log(`[xmtp-sdk] refresh: identity initialized: ${l} (agentId=${f.agentId})`)}else c.push(o[u]),console.log(`[xmtp-sdk] refresh: identity init failed: ${o[u].communicationAddress} (agentId=${o[u].agentId})`,d.reason)}if(c.length>0){console.log(`[xmtp-sdk] refresh: ${c.length} client(s) failed to initialize, retrying in 1s...`),await new Promise(d=>setTimeout(d,1e3));let u=await rg(c,a);for(let d=0;d<u.length;d++){let l=u[d];if(l.status==="fulfilled"){let{address:f,agentInfo:p}=l.value;this.clients.set(f,l.value.agent),console.log(`[xmtp-sdk] refresh: retry succeeded: ${f} (agentId=${p.agentId})`)}else{let f=c[d];console.log(`[xmtp-sdk] refresh: retry still failed: ${f.communicationAddress} (agentId=${f.agentId})`,l.reason),q.error(G.XMTP_CONNECTION_FAILED,l.reason instanceof Error?l.reason:new Error(String(l.reason)),{walletAddress:f.communicationAddress,onchainosAgentId:f.agentId})}}}await this.startListeningForAddresses(o.map(u=>u.communicationAddress));for(let u of o){let d=u.communicationAddress;this.syncByAddress.has(d)&&this.clients.has(d)&&(console.log(`[xmtp-sdk] refresh: ${d} has a prior sync timestamp, triggering offline replay`),this.replayOfflineMessagesForAddress(d).catch(l=>{console.log(`[xmtp-sdk] refresh: ${d} offline replay failed:`,l),q.error(G.OFFLINE_REPLAY_FAILED,l instanceof Error?l:new Error(String(l)),{walletAddress:d,stage:"refreshAgents/replay"})}))}}return console.log(`[xmtp-sdk] refresh done: +${o.length} -${i.length}, now ${this.clients.size} clients`),{added:o.map(s=>`${s.agentId} (${s.communicationAddress})`),removed:i.map(s=>`${s.agentId} (${s.communicationAddress})`)}}setTools(t){this.tools=t}get initialized(){return this._initialized}get initFailures(){return this._initFailures}getClients(){return this.clients}getClientByAddress(t){let r=this.clients.get(t);if(r)return r;let n=t.toLowerCase();for(let[o,i]of this.clients)if(o.toLowerCase()===n)return i}getAllAgents(){return this.allAgents}async checkSensitiveWord(t){let r=await this.ensureSensitiveWordsLoaded();return r===null?null:yre(t,r)}async ensureSensitiveWordsLoaded(){return this.sensitiveWords!==null?this.sensitiveWords:Date.now()-this.sensitiveWordsLastFailedAtMs<zqe?null:this.sensitiveWordsRetryInflight?this.sensitiveWordsRetryInflight:(this.sensitiveWordsRetryInflight=(async()=>{try{let r=await Cre();return r!==null?(this.sensitiveWords=r,console.log(`[xmtp-sdk] lazy-retry sensitive-words succeeded: ${r.length} entries`),r):(this.sensitiveWordsLastFailedAtMs=Date.now(),console.log("[xmtp-sdk] lazy-retry sensitive-words failed, entering cooldown"),null)}finally{this.sensitiveWordsRetryInflight=null}})(),this.sensitiveWordsRetryInflight)}getSystemConfig(){return this.systemConfig}systemConfigRefreshInflight=null;refreshSystemConfig(){return this.systemConfigRefreshInflight?this.systemConfigRefreshInflight:(this.systemConfigRefreshInflight=(async()=>{try{let t=await RO();t&&(this.systemConfig=gv(t))}finally{this.systemConfigRefreshInflight=null}})(),this.systemConfigRefreshInflight)}getSystemAccountInboxIds(){return this.systemConfig.accounts.filter(t=>t.type==="system").map(t=>t.inboxId)}getSecurityAccountInboxIds(){return this.systemConfig.accounts.filter(t=>t.type==="security").map(t=>t.inboxId)}getTrustedDmInboxIds(){return this.systemConfig.accounts.filter(t=>t.type==="system"||t.type==="security").map(t=>t.inboxId)}getAgentByAgentId(t){return this.allAgents.find(r=>r.agentId===t)}getAgentByAddress(t){let r=t.toLowerCase();return this.allAgents.find(n=>n.communicationAddress.toLowerCase()===r)}getAddressByAgentId(t){return this.getAgentByAgentId(t)?.communicationAddress}async allowGroup(t,r){let n=this.getClientByAddress(t);if(!n)return console.log(`[xmtp-sdk] allowGroup: no client found for address=${t}`),!1;try{let i=(await n.client.conversations.list()).find(s=>s instanceof ur&&s.id===r);return i?i.consentState===Ze.ConsentState.Allowed?(console.log(`[xmtp-sdk] allowGroup: groupId=${r} already Allowed, skipping`),!0):(i.updateConsentState(Ze.ConsentState.Allowed),console.log(`[xmtp-sdk] allowGroup: groupId=${r} marked as Allowed`),!0):(console.log(`[xmtp-sdk] allowGroup: groupId=${r} not found`),!1)}catch(o){return console.log(`[xmtp-sdk] allowGroup failed: groupId=${r}`,o),q.error(G.GROUP_CONSENT_UPDATE_FAILED,o instanceof Error?o:new Error(String(o)),{...Je({walletAddress:t,inboxId:this.getClientByAddress(t)?.client?.inboxId,onchainosAgentId:this.getAgentByAddress(t)?.agentId}),conversationId:r,action:"allow"}),!1}}async listUnknownGroups(t){let r=`[xmtp-sdk:listUnknownGroups:${t}]`,n=this.getClientByAddress(t);if(!n)return console.log(`${r} no client found, returning empty`),[];await n.client.conversations.syncAll([Ze.ConsentState.Unknown]);let o=await n.client.conversations.list({consentStates:[Ze.ConsentState.Unknown]});console.log(`${r} Unknown groups: ${o.length}`);let i=n.client.inboxId,s=this.getAgentByAddress(t)?.agentId??null,a=[];for(let A of o)if(A instanceof ur)try{await A.sync();let u=(await A.messages()).filter(f=>f.senderInboxId!==i&&(!f.kind||f.kind==="application"));if(u.length===0)continue;let d=null;for(let f of u){let p=oGe(f.content);if(p?.jobId){d=p;break}}if(!d)continue;let l=u.map(f=>{let p=Bre(f.content);return p?{content:p,sentAt:typeof f.sentAtNs=="bigint"?Number(f.sentAtNs/1000000n):Number(f.sentAt??0)}:null}).filter(f=>f!==null);a.push({groupId:A.id,myAgentId:s,myXmtpAddress:t,toXmtpAddress:d.fromXmtpAddress??u[0].senderInboxId,toAgentId:d.sender?.agentId??null,jobId:d.jobId,securityRate:typeof d.sender?.securityRate=="number"?d.sender.securityRate:0,messages:l})}catch(c){console.log(`${r} failed to read group ${A.id}:`,c)}return a.sort((A,c)=>c.securityRate-A.securityRate),a}async denyGroup(t,r){let n=this.getClientByAddress(t);if(!n)return console.log(`[xmtp-sdk] denyGroup: no client found for address=${t}`),!1;try{let i=(await n.client.conversations.list()).find(s=>s instanceof ur&&s.id===r);return i?(i.updateConsentState(Ze.ConsentState.Denied),console.log(`[xmtp-sdk] denyGroup: groupId=${r} marked as Denied`),!0):(console.log(`[xmtp-sdk] denyGroup: groupId=${r} not found`),!1)}catch(o){return console.log(`[xmtp-sdk] denyGroup failed: groupId=${r}`,o),q.error(G.GROUP_CONSENT_UPDATE_FAILED,o instanceof Error?o:new Error(String(o)),{...Je({walletAddress:t,inboxId:this.getClientByAddress(t)?.client?.inboxId,onchainosAgentId:this.getAgentByAddress(t)?.agentId}),conversationId:r,action:"deny"}),!1}}async startListening(){await this.startListeningForAddresses([...this.clients.keys()])}async startListeningForAddresses(t){let r=t.filter(n=>this.clients.has(n));await rg(r,async n=>{let o=this.clients.get(n),i=`[xmtp-sdk:${n}]`,s=this.getAgentByAddress(n),a={walletAddress:n,inboxId:o.client?.inboxId,onchainosAgentId:s?.agentId};try{await o.client.conversations.syncAll([Ze.ConsentState.Allowed,Ze.ConsentState.Unknown]),console.log(`${i} conversations synced (non-Denied)`)}catch(f){console.log(`${i} conversation sync failed, skipping this client:`,f),q.error(G.CONVERSATIONS_STREAM_FAILED,f instanceof Error?f:void 0,Je(a));return}o.use(mre()),o.use(Ere(a));let A=this.tools.createInboundMiddleware;A?o.use(A({myXmtpAddress:n,getTools:()=>this.tools,allowGroup:(f,p)=>this.allowGroup(f,p),onMessageProcessed:f=>{let p=Math.max(this.syncByAddress.get(n)??0,f+1);this.syncByAddress.set(n,p),kO(n,p)}})):console.log(`${i} tools.createInboundMiddleware not injected \u2014 inbound routing disabled`);let c=5,u=1e3,d=async(f=0)=>{try{await o.start()}catch(p){console.log(`${i} agent.start error (attempt=${f}):`,p),q.error(G.AGENT_START_FAILED,p instanceof Error?p:void 0,{...Je(a),attempt:String(f)}),l(f)}},l=f=>{if(f>=c){console.log(`${i} reached max retries (${c}), giving up reconnect`);return}let p=u*2**f;console.log(`${i} reconnecting in ${p}ms (attempt=${f+1})`),setTimeout(()=>{d(f+1)},p)};o.on("error",f=>{console.log(`${i} agent stream error:`,f),q.error(G.AGENT_STREAM_ERROR,f,Je(a)),l(0)}),d(),console.log(`${i} message listener started`)})}async replayOfflineMessagesForAddress(t){let r=this.clients.get(t);if(!r)return{replayed:0,skipped:0};let n=this.syncByAddress.get(t),o=`[xmtp-sdk:replay:${t}]`;if(n===void 0)return console.log(`${o} no sync timestamp, skipping offline replay (policy TBD)`),{replayed:0,skipped:0};let i=n*1e6;console.log(`${o} starting offline message replay, lastSync=${new Date(n).toISOString()}`);let s=r.client.inboxId,a={myXmtpAddress:t,getTools:()=>this.tools,allowGroup:(l,f)=>this.allowGroup(l,f)},A=this.tools.processOfflineMessage;if(!A)return console.log(`${o} tools.processOfflineMessage not injected \u2014 offline replay skipped`),{replayed:0,skipped:0};let c;try{await r.client.conversations.syncAll([Ze.ConsentState.Allowed,Ze.ConsentState.Unknown]),c=await r.client.conversations.list({consentStates:[Ze.ConsentState.Allowed,Ze.ConsentState.Unknown]}),console.log(`${o} ${c.length} conversation(s) to check (non-Denied)`)}catch(l){return console.log(`${o} conversation sync/list failed, skipping:`,l),q.error(G.OFFLINE_REPLAY_FAILED,l instanceof Error?l:void 0,{walletAddress:t,stage:"syncAll/list"}),{replayed:0,skipped:0}}let u=0,d=0;for(let l of c)try{await l.sync();let f=l instanceof vn?"DM":l instanceof ur?"Group":"Unknown",p=await l.messages({sentAfterNs:i});if(p.length===0)continue;let h=p.filter(m=>m.senderInboxId!==s&&(!m.kind||m.kind==="application")).sort((m,E)=>{let B=typeof m.sentAtNs=="bigint"?Number(m.sentAtNs):Number(m.sentAt??0),b=typeof E.sentAtNs=="bigint"?Number(E.sentAtNs):Number(E.sentAt??0);return B-b});if(h.length===0){console.log(`${o} conversation ${l.id}: all ${p.length} message(s) were sent by self, skipped`);let m=p.reduce((E,B)=>{let b=typeof B.sentAtNs=="bigint"?Number(B.sentAtNs/1000000n):Number(B.sentAt??0);return b>E?b:E},0);if(m>0){let E=Math.max(this.syncByAddress.get(t)??0,m+1);this.syncByAddress.set(t,E),kO(t,E)}continue}console.log(`${o} conversation ${l.id} (${f}): found ${h.length} offline message(s)`);for(let m of h){let E=typeof m.content=="string"?m.content:JSON.stringify(m.content),B=E.length>80?`${E.slice(0,80)}...`:E,b=typeof m.sentAtNs=="bigint"?Number(m.sentAtNs/1000000n):Number(m.sentAt??Date.now());try{let I=m.senderInboxId,Q="",x=!1,O=async()=>{if(x)return Q;try{Q=(await r.client.preferences.inboxStateFromInboxIds([I]))?.[0]?.identifiers?.[0]?.identifier??""}catch{Q=""}return x=!0,Q},P={message:{id:m.id,senderInboxId:I,content:m.content,sentAtNs:m.sentAtNs,sentAt:m.sentAt},conversation:l,getSenderAddress:O};await A(P,a,{skipNotify:!0})?(console.log(`${o} replayed: sender=${m.senderInboxId}, sentAt=${m.sentAt}, content=${B}`),u++):d++}catch(I){console.log(`${o} replay handling failed: msgId=${m.id}`,I),q.error(G.OFFLINE_REPLAY_MESSAGE_FAILED,I instanceof Error?I:void 0,{walletAddress:t,messageId:m.id,conversationId:l.id})}finally{let I=Math.max(this.syncByAddress.get(t)??0,b+1);this.syncByAddress.set(t,I),kO(t,I)}}}catch(f){console.log(`${o} failed to read messages from conversation ${l.id}:`,f),q.error(G.OFFLINE_REPLAY_FAILED,f instanceof Error?f:void 0,{walletAddress:t,conversationId:l.id})}return{replayed:u,skipped:d}}async replayOfflineMessages(){await this._backupReady,console.log(`[xmtp-sdk:replay] starting offline replay, ${this.clients.size} clients, ${this.syncByAddress.size} addresses have timestamps`);let t=0,r=0;for(let n of this.clients.keys()){let{replayed:o,skipped:i}=await this.replayOfflineMessagesForAddress(n);t+=o,r+=i}console.log(`[xmtp-sdk:replay] offline replay done: replayed ${t}, skipped ${r}`)}};var yE=require("openclaw/plugin-sdk/routing");var hv="okx-xmtp",OO="okx-a2a";function Ni(e){if(typeof e=="string")return`${hv}:${e}`;let t=new URLSearchParams({my:e.myXmtpAddress,to:e.toXmtpAddress,job:e.jobId,gid:e.xmtpGroupId});return`${hv}:${t.toString()}`}function oi(e){let t=`${hv}:`,r=e.indexOf(t);if(r===-1)return null;let n=new URLSearchParams(e.slice(r+t.length)),o=n.get("my"),i=n.get("to"),s=n.get("job"),a=n.get("gid");return!o||!i||!s||!a?null:{myXmtpAddress:o,toXmtpAddress:i,jobId:s,xmtpGroupId:a}}function $c(e){let t=typeof e=="string"?e:Ni(e);return(0,yE.buildAgentSessionKey)({agentId:"main",channel:OO,peer:{kind:"group",id:t}})}function mv(){return(0,yE.buildAgentMainSessionKey)({agentId:"main"})}function PO(){let r=to().config.loadConfig().agents?.list;if(r&&r.length>0){let n=r.find(o=>o.id==="main");return n?n.id:r[0].id}return"main"}function Rd(){return(0,yE.buildAgentSessionKey)({agentId:PO(),channel:OO,peer:{kind:"group",id:"backup"}})}function Ev(e){let t=to(),r=t.agent.session.resolveStorePath(void 0,{agentId:"main"}),n=t.agent.session.loadSessionStore(r,{skipCache:!0}),o=Object.keys(n);console.log(`[findExistingSession] storePath=${r}, keys=${o.length}, matching my=${e.myXmtpAddress} to=${e.toXmtpAddress} job=${e.jobId}`);let i=e.myXmtpAddress.toLowerCase(),s=e.toXmtpAddress.toLowerCase();for(let a of o){let A=oi(a);if(A&&A.myXmtpAddress.toLowerCase()===i&&A.toXmtpAddress.toLowerCase()===s&&A.jobId===e.jobId)return console.log(`[findExistingSession] hit existing session: ${a}`),{params:A,sessionKey:a}}return console.log("[findExistingSession] no matching session found"),null}function bre(e){let t=to(),r=t.agent.session.resolveStorePath(void 0,{agentId:"main"}),n=t.agent.session.loadSessionStore(r,{skipCache:!0}),o=e.myXmtpAddress.toLowerCase(),i=e.toXmtpAddress.toLowerCase();for(let s of Object.keys(n)){let a=oi(s);if(a&&a.xmtpGroupId===e.xmtpGroupId&&a.myXmtpAddress.toLowerCase()===o&&a.toXmtpAddress.toLowerCase()===i&&a.jobId===e.jobId)return{params:a,sessionKey:s}}return null}function yv(){let e=to(),t=e.agent.session.resolveStorePath(void 0,{agentId:"main"}),r=e.agent.session.loadSessionStore(t,{skipCache:!0}),n=new Map,o=new Map;for(let[i,s]of Object.entries(r)){if(i.includes(hv)||i.includes(OO))continue;let a=s,A=i.split(":"),c=a.deliveryContext?.channel??a.lastChannel??a.origin?.provider??A[2];if(!c)continue;let u=a.deliveryContext?.to??a.lastTo??A[4],d=a.updatedAt??0;u&&(!o.get(c)||d>(n.get(c)?.updatedAt??0))&&o.set(c,u);let l=n.get(c);(!l||d>l.updatedAt)&&n.set(c,{sessionKey:i,to:u,updatedAt:d})}for(let[i,s]of n)if(!s.to){let a=o.get(i);a&&(s.to=a)}return n}function Qre(e){let t=to(),r=t.agent.session.resolveStorePath(void 0,{agentId:"main"}),n=t.agent.session.loadSessionStore(r,{skipCache:!0}),o=e.myXmtpAddress?.toLowerCase(),i=e.toXmtpAddress?.toLowerCase(),s=[];for(let a of Object.keys(n)){let A=oi(a);A&&(i&&A.toXmtpAddress.toLowerCase()!==i||o&&A.myXmtpAddress.toLowerCase()!==o||e.jobId&&A.jobId!==e.jobId||s.push({params:A,sessionKey:a}))}return s}function Sre(e){let t=to(),r=t.agent.session.resolveStorePath(void 0,{agentId:"main"}),n=t.agent.session.loadSessionStore(r,{skipCache:!0}),o=e.myXmtpAddress.toLowerCase();for(let i of Object.keys(n)){let s=oi(i);if(s&&s.myXmtpAddress.toLowerCase()===o&&s.jobId===e.jobId)return{params:s,sessionKey:i}}return null}function rr(e){return e instanceof Error?e.message:String(e)}var IE="a2a-agent-chat";function ne(e){return{content:[{type:"text",text:e}],details:void 0}}var iGe={msgType:`Message type identifier, fixed to "${IE}"`,content:"Message body",contentType:'Content type, fixed to "text"',fromXmtpAddress:"Sender's XMTP address",toXmtpAddress:"Receiver's XMTP address",groupId:"XMTP group chat ID",jobId:"A2A job ID",sender:"Sender's agent identity, includes agentId / name / profileDescription / profilePicture / role / securityRate",receiverAgentId:"Receiver's onchainos agentId (null if unknown)",payload:"Optional extra data attached by the sender for the receiver; absent when the sender did not provide any"};function sGe(e){return!!e&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length>0}function Iv(e){let t=Wr.getInstance().getSystemConfig().extConfig.tips,r={msgType:IE,content:e.content,contentType:"text",fromXmtpAddress:e.myXmtpAddress,toXmtpAddress:e.toXmtpAddress,groupId:e.groupId,jobId:e.jobId,sender:e.senderAgent?{agentId:e.senderAgent.agentId,name:e.senderAgent.name,profileDescription:e.senderAgent.profileDescription,profilePicture:e.senderAgent.profilePicture,role:e.senderAgent.role,securityRate:e.senderAgent.securityRate}:null,receiverAgentId:e.receiverAgentId??null};return sGe(e.payload)&&(r.payload=e.payload),r.scheme=iGe,r.tips=t,JSON.stringify(r,null,2)}var Pre=require("node:crypto");var vre=require("openclaw/plugin-sdk/gateway-runtime"),Bv=require("node:crypto");var aGe=2e4,AGe=["operator.admin"];function _re(e){if(e){if(typeof e=="string")return e;if(typeof e=="object"&&e!==null&&"env"in e)return process.env[e.env]||void 0}}var zc=null,bv=null,MO=null,FO=null,Cv=!1;function UO(){bv=new Promise((e,t)=>{MO=e,FO=t})}function cGe(){if(zc)return{client:zc,ready:bv};let t=to().config.loadConfig().gateway,r=t?.port??18789;return UO(),zc=new vre.GatewayClient({url:`ws://127.0.0.1:${r}`,password:_re(t?.auth?.password),token:_re(t?.auth?.token),instanceId:(0,Bv.randomUUID)(),clientName:"gateway-client",clientDisplayName:"okx-a2a-plugin",mode:"backend",role:"operator",scopes:[...AGe],onHelloOk:()=>{console.log("[gateway] connected"),Cv=!0,MO?.()},onClose:(n,o)=>{console.log(`[gateway] closed (${n}): ${o||"no reason"}`),Cv&&(Cv=!1,UO())},onConnectError:n=>{let o=n;if(o?.retryable){console.log(`[gateway] waiting (${o?.details?.reason??"retryable"}), will auto-retry`);return}console.log("[gateway] connect error:",n),FO?.(n instanceof Error?n:new Error(String(n))),UO()}}),zc.start(),{client:zc,ready:bv}}function wre(){if(zc){try{zc.stop()}catch{}zc=null,bv=null,MO=null,FO=null,Cv=!1}}async function Ms(e){let t=e.timeoutMs??aGe,{client:r,ready:n}=cGe();return await n,await r.request(e.method,e.params,{timeoutMs:t})}async function og(e){return Ms({method:"sessions.create",params:e})}async function xre(e){return Ms({method:"sessions.delete",params:e})}async function Ga(e){try{return await Ms({method:"sessions.send",params:{...e,idempotencyKey:(0,Bv.randomUUID)()}})}catch(t){let r=t?.gatewayCode??t?.code,n=String(t?.message??"");if(r==="INVALID_REQUEST"&&n.includes("session not found"))return await og({key:e.key}),await Ms({method:"sessions.send",params:{...e,idempotencyKey:(0,Bv.randomUUID)()}});throw t}}async function Qv(e){try{return await Ms({method:"chat.inject",params:e})}catch(t){let r=t?.gatewayCode??t?.code,n=String(t?.message??"");if(r==="INVALID_REQUEST"&&n.includes("session not found"))return await og({key:e.sessionKey}),await Ms({method:"chat.inject",params:e});throw t}}var uGe={outbound:"\u{1F4E4} [Sent]",inbound:"\u{1F4E5} [Received]"},Rre="\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",kre=6,Nre=4,Dre=6,Tre=4,LO="...",Sv=8;function dGe(e){return e?e.length<=kre+Nre+1?e:`${e.slice(0,kre)}\u2026${e.slice(-Nre)}`:""}function lGe(e){return e.length<=Dre+Tre+LO.length?e:`${e.slice(0,Dre)}${LO}${e.slice(-Tre)}`}function Ore(e){return e.name?e.agentId?`${e.name}#${e.agentId}`:e.name:e.walletAddress?dGe(e.walletAddress):"unknown"}function fGe(e){let t=e.split(`
131
+ `)}`)};var kqe=e=>!!e.contentType?.sameAs(dh),Nqe=e=>!!e.contentType?.sameAs(Pm),Dqe=e=>Nqe(e)&&typeof e.content.content=="string",Kte=e=>!!e.contentType?.sameAs(zo);var $te=e=>{switch(!0){case kqe(e):case Dqe(e):return e.content.content;case Kte(e):return e.content}};function Tqe(){return(e,t)=>e.senderInboxId!==t.inboxId}function Oqe(){return(e,t)=>e.senderInboxId===t.inboxId}function Pqe(){return e=>!!e.contentType?.sameAs(zo)}function Uqe(e){let t=Array.isArray(e)?e:[e];return r=>t.includes(r.senderInboxId)}function Mqe(e){return t=>{let r=$te(t);return!!(r&&r.startsWith(e))}}function Fqe(...e){return(t,r)=>{for(let n of e)if(!n(t,r))return!1;return!0}}function Lqe(...e){return(t,r)=>{for(let n of e)if(n(t,r))return!0;return!1}}function qqe(e){return(t,r)=>!e(t,r)}var zte={notFromSelf:Tqe(),fromSelf:Oqe(),textOnly:Pqe(),fromSender:Uqe,startsWith:Mqe,and:Fqe,or:Lqe,not:qqe};rp();Ke();function bO(){return Cr(bo.utils.randomPrivateKey())}rp();Ke();_s();_i();function Zte(e){if(typeof e=="string"){if(!dt(e,{strict:!1}))throw new Bt({address:e});return{address:e,type:"json-rpc"}}if(!dt(e.address,{strict:!1}))throw new Bt({address:e.address});return{address:e.address,nonceManager:e.nonceManager,sign:e.sign,signAuthorization:e.signAuthorization,signMessage:e.signMessage,signTransaction:e.signTransaction,signTypedData:e.signTypedData,source:"custom",type:"local"}}rp();vs();Kn();Ke();var QO=!1;async function Us({hash:e,privateKey:t,to:r="object"}){let{r:n,s:o,recovery:i}=bo.sign(e.slice(2),t.slice(2),{lowS:!0,extraEntropy:dr(QO,{strict:!1})?lr(QO):QO}),s={r:H(n,{size:32}),s:H(o,{size:32}),v:i?28n:27n,yParity:i};return r==="bytes"||r==="hex"?Ste({...s,to:r}):s}async function Xte(e){let{chainId:t,nonce:r,privateKey:n,to:o="object"}=e,i=e.contractAddress??e.address,s=await Us({hash:t_({address:i,chainId:t,nonce:r}),privateKey:n,to:o});return o==="object"?{address:i,chainId:t,nonce:r,...s}:s}async function jte({message:e,privateKey:t}){return await Us({hash:Lee(e),privateKey:t,to:"hex"})}_c();async function ere(e){let{privateKey:t,transaction:r,serializer:n=Iee}=e,o=r.type==="eip4844"?{...r,sidecars:!1}:r,i=await Us({hash:fr(await n(o)),privateKey:t});return await n(r,i)}async function tre(e){let{privateKey:t,...r}=e;return await Us({hash:Gee(r),privateKey:t,to:"hex"})}function SO(e,t={}){let{nonceManager:r}=t,n=Cr(bo.getPublicKey(e.slice(2),!1)),o=NS(n);return{...Zte({address:o,nonceManager:r,async sign({hash:s}){return Us({hash:s,privateKey:e,to:"hex"})},async signAuthorization(s){return Xte({...s,privateKey:e})},async signMessage({message:s}){return jte({message:s,privateKey:e})},async signTransaction(s,{serializer:a}={}){return ere({privateKey:e,transaction:s,serializer:a})},async signTypedData(s){return tre({...s,privateKey:e})}}),publicKey:n,source:"privateKey"}}var _O=Nee({id:11155111,name:"Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://11155111.rpc.thirdweb.com"]}},blockExplorers:{default:{name:"Etherscan",url:"https://sepolia.etherscan.io",apiUrl:"https://api-sepolia.etherscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:751532},ensUniversalResolver:{address:"0xeeeeeeee14d718c2b47d9923deab1335e144eeee",blockCreated:8928790}},testnet:!0});var rre=(e,t=_O)=>{let r=e??bO(),n=SO(r);return{key:r,account:n,wallet:CO({account:n,chain:t,transport:BO()})}},Gqe=e=>({identifier:e.account.address.toLowerCase(),identifierKind:0}),nre=e=>{let t=Gqe(e);return{type:"EOA",getIdentifier:()=>t,signMessage:async r=>{let n=await e.wallet.signMessage({account:e.account,message:r});return Qi(n)}}};var lv=class{#e;#t;#n;constructor(t,r,n){this.#t=t,this.#n=r,this.#e=n}async sendReaction(t,r="unicode"){let n={action:"added",reference:this.#t.id,referenceInboxId:this.#t.senderInboxId,schema:r,content:t};await this.#n.send(n,dh)}async sendText(t){await this.#n.send(t,zo)}async sendTextReply(t){let r={reference:this.#t.id,referenceInboxId:this.#t.senderInboxId,contentType:zo,content:t};await this.#n.send(r,Pm)}getOwnAddress(){return this.#e.accountIdentifier?.identifier}async getSenderAddress(){return(await this.#e.preferences.inboxStateFromInboxIds([this.#t.senderInboxId]))[0].identifiers[0].identifier}get message(){return this.#t}get conversation(){return this.#n}get client(){return this.#e}};var hE=class e extends ore.default{#e;#t=[];#n=!1;constructor({client:t}){super(),this.#e=t}static async create(t,r){if(!t)if(dr(process.env.XMTP_WALLET_KEY))t=nre(rre(process.env.XMTP_WALLET_KEY));else throw new Error('No signer detected. Provide a "signer" to "Agent.create()" or set the "XMTP_WALLET_KEY" environment variable to a private key in hexadecimal format. Read more: https://docs.xmtp.org/inboxes/core-messaging/create-a-signer');let n={...r};n.appVersion??="agent-sdk/alpha",process.env.XMTP_DB_ENCRYPTION_KEY&&(n.dbEncryptionKey=Vte(process.env.XMTP_DB_ENCRYPTION_KEY)),process.env.XMTP_ENV&&Object.keys(Ic).includes(process.env.XMTP_ENV)&&(n.env=process.env.XMTP_ENV),process.env.XMTP_FORCE_DEBUG&&(n.debugEventsEnabled=!0,n.loggingLevel="warn",n.structuredLogging=!0);let o=[...n.codecs??[],new dI,new pS,new qf],i=await Jf.create(t,{...n,codecs:o});return process.env.XMTP_FORCE_REVOKE_INSTALLATIONS&&await i.revokeAllOtherInstallations(),process.env.XMTP_FORCE_DEBUG&&await Wte(i),new e({client:i})}use(t){return this.#t.push(t),this}async start(){if(!this.#n)try{this.#n=!0,this.emit("start");let t=await this.#e.conversations.streamAllMessages();for await(let r of t){if(!this.#n)break;try{await this.#r(r)}catch(n){this.#o(n)}}}catch(t){this.#n=!1,this.#o(t)}}async#r(t){let r=await this.#e.conversations.getConversationById(t.conversationId);if(!r){this.#o(new Error(`Failed to process message ID "${t.id}" for conversation ID "${t.conversationId}" because the conversation could not be found.`));return}let n=new lv(t,r,this.#e),o=0,i=async()=>{if(o<this.#t.length){let s=this.#t[o++];await s(n,i)}else zte.notFromSelf(t,this.#e)&&this.emit("message",n)};await i()}get client(){return this.#e}stop(){this.#n=!1,this.emit("stop")}#o(t){let r=t instanceof Error?t:new Error(String(t));this.emit("error",r)}};var ire=require("node:child_process"),sre=require("node:util");var are=(0,sre.promisify)(ire.execFile),Yc=null;async function Jqe(){if(Yc)return Yc;let e=process.env.ONCHAINOS_BIN;if(e)return console.log(`[onchainos] using ONCHAINOS_BIN=${e}`),Yc=e,Yc;try{let t=process.env.SHELL||"/bin/bash",{stdout:r}=await are(t,["-ilc","which onchainos"]),n=r.trim();if(n)return console.log(`[onchainos] resolved binary via shell: ${n}`),Yc=n,Yc}catch(t){console.log("[onchainos] shell resolve failed, will fallback to bare 'onchainos':",t)}return console.log("[onchainos] could not resolve binary path, falling back to bare 'onchainos'"),Yc="onchainos",Yc}async function Xn(e){let t=await Jqe(),r=`${t} ${e.join(" ")}`;console.log(`[onchainos] exec: ${r}`);let n=Date.now();try{let o=await are(t,e);return console.log(`[onchainos] exec done: ${r} (${Date.now()-n}ms, stdout=${o.stdout.length}B, stderr=${o.stderr.length}B)`),o}catch(o){throw console.log(`[onchainos] exec error: ${r} (${Date.now()-n}ms) code=${o.code} signal=${o.signal} killed=${o.killed} message=${o.message}`),q.error(G.ONCHAINOS_CLI_ERROR,o instanceof Error?o:new Error(String(o?.message??o)),{args:e.join(" ").slice(0,1e3),exitCode:String(o?.code??""),signal:String(o?.signal??""),killed:String(o?.killed??""),stderr:String(o?.stderr??"").slice(0,500),stdout:String(o?.stdout??"").slice(0,500),message:String(o?.message??"").slice(0,500),durationMs:String(Date.now()-n)}),o}}function Yqe(e){return typeof e=="object"&&e!==null&&Array.isArray(e.agentList)}function ure(e){let t=[];for(let r of e.list)Yqe(r)?t.push(...r.agentList):t.push(r);return{list:t,page:e.page,pageSize:e.pageSize,total:e.total}}var dre={OK_FALSE:"ok_false",JSON_PARSE_FAILED:"json_parse_failed"};function Hc(e,t,r){return{command:t,reason:dre.OK_FALSE,...r,response:e.slice(0,500)}}function ki(e,t,r={}){try{return JSON.parse(e)}catch(n){let o=n instanceof Error?n:new Error(String(n));throw q.error(G.ONCHAINOS_CLI_ERROR,o,{command:t,reason:dre.JSON_PARSE_FAILED,...r,response:e.slice(0,500)}),o}}var Are=/session expired/i;function Vc(e){try{let t=JSON.parse(e);return t.ok===!1&&Are.test(String(t.error??""))}catch{return Are.test(e)}}var cre=0,Hqe=300*1e3;function Wc(e){let t=Date.now();if(t-cre<Hqe)return;cre=t,q.error(G.ONCHAINOS_SESSION_EXPIRED,new Error("onchainos session expired"),{command:e});let r=Wr.getInstance().tools.notifySessionExpired;if(!r){console.log("[onchainos] tools.notifySessionExpired not injected \u2014 skipping user notice");return}try{r(e)}catch(n){console.log("[onchainos] tools.notifySessionExpired threw:",n)}}function tg(e,t){Vc(e)&&Wc(t)}function Kc(e,t){let r=String(e?.stdout??"");r&&Vc(r)&&Wc(t)}var fv=50;async function Vqe(e){console.log(`[onchainos] executing: onchainos agent get --page ${e} --page-size ${fv}`);let t,r;try{({stdout:t,stderr:r}=await Xn(["agent","get","--page",String(e),"--page-size",String(fv)]))}catch(o){throw Kc(o,"list-agents"),o}r&&console.log(`[onchainos] stderr (page=${e}): ${r}`);let n=ki(t,"list-agents",{page:String(e),pageSize:String(fv)});if(!n.ok){tg(t,"list-agents");let o=new Error(`onchainos agent get failed: ${t}`);throw q.error(G.ONCHAINOS_CLI_ERROR,o,Hc(t,"list-agents",{page:String(e),pageSize:String(fv)})),o}return ure(n.data)}var mE=new Map;function Wqe(e){let t=e.toLowerCase();for(let r of mE.values())if(r.communicationAddress.toLowerCase()===t)return r}var xd="196";async function vO(e){let t=e.filter(n=>!mE.has(n));if(t.length>0){console.log(`[onchainos] executing: onchainos agent get --agent-ids ${t.join(",")}`);let n,o;try{({stdout:n,stderr:o}=await Xn(["agent","get","--agent-ids",t.join(",")]))}catch(s){throw Kc(s,"get-agents-by-ids"),s}o&&console.log(`[onchainos] stderr (get-agents-by-ids): ${o}`);let i=ki(n,"get-agents-by-ids",{agentIds:t.join(",")});if(!i.ok){tg(n,"get-agents-by-ids");let s=new Error(`onchainos agent get --agent-ids failed: ${n}`);throw q.error(G.ONCHAINOS_CLI_ERROR,s,Hc(n,"get-agents-by-ids",{agentIds:t.join(",")})),s}for(let s of ure(i.data).list)mE.set(s.agentId,s)}let r=[];for(let n of e){let o=mE.get(n);o&&r.push(o)}return r}async function lre(e){let t=Wqe(e);if(t)return t;console.log(`[onchainos] executing: onchainos agent get-by-address --communication-address ${e} --chain-index ${xd}`);let r,n;try{({stdout:r,stderr:n}=await Xn(["agent","get-by-address","--communication-address",e,"--chain-index",xd]))}catch(i){throw Kc(i,"get-agent-by-address"),i}n&&console.log(`[onchainos] stderr (get-agent-by-address): ${n}`);let o=ki(r,"get-agent-by-address",{communicationAddress:e,chainIndex:xd});if(!o.ok){tg(r,"get-agent-by-address");let i=new Error(`onchainos agent get-by-address failed: ${r}`);throw q.error(G.ONCHAINOS_CLI_ERROR,i,Hc(r,"get-agent-by-address",{communicationAddress:e,chainIndex:xd})),i}if(o.data)return mE.set(o.data.agentId,o.data),o.data}async function wO(){console.log("[onchainos] fetching all agents...");let e=[],t=1;for(;;){let n=await Vqe(t);if(e.push(...n.list),console.log(`[onchainos] page ${t}: got ${n.list.length}, total=${n.total}`),e.length>=n.total||n.list.length===0)break;t++}let r=e.filter(n=>n.status===1);for(let n of r)console.log(`[onchainos] agent: id=${n.agentId} name="${n.name}" comm=${n.communicationAddress} keyUuid=${n.keyUuid} status=${n.status}`);return console.log(`[onchainos] fetched ${e.length} agents total, ${r.length} active (status=1)`),r}async function fre(e){if(e.length===0){console.log("[onchainos] wakeup-notify: agentIds empty, skipping");return}let t=e.join(",");console.log(`[onchainos] sending wakeup-notify (agent-ids=${t})`);try{let{stderr:r}=await Xn(["agent","wakeup-notify","--agent-ids",t]);r&&console.log(`[onchainos] stderr (wakeup-notify): ${r}`),console.log(`[onchainos] wakeup-notify succeeded (agent-ids=${t})`)}catch(r){Kc(r,"wakeup-notify"),console.log(`[onchainos] wakeup-notify failed (agent-ids=${t}):`,r?.message??r)}}async function pre(e){console.log(`[onchainos] sending heartbeat (chain-index=${e})`);try{let{stderr:t}=await Xn(["agent","heartbeat","--chain-index",e]);t&&console.log(`[onchainos] stderr (heartbeat): ${t}`),console.log("[onchainos] heartbeat sent")}catch(t){throw Kc(t,"heartbeat"),t}}async function pv(e){console.log(`[onchainos] checking message-eligible: job=${e.jobId} direction=${e.direction} providerSecurityRate=${e.providerSecurityRate}`);let t,r;try{({stdout:t,stderr:r}=await Xn(["agent","message-eligible","--agent-id",e.agentId,"--client-agent-id",e.clientAgentId,"--provider-agent-id",e.providerAgentId,"--job-id",e.jobId,"--group-id",e.groupId,"--direction",e.direction,"--provider-security-rate",String(e.providerSecurityRate)]))}catch(o){return Kc(o,"message-eligible"),{eligible:!0}}r&&console.log(`[onchainos] stderr (message-eligible): ${r}`);let n=ki(t,"message-eligible",{onchainosAgentId:e.agentId,clientAgentId:e.clientAgentId,providerAgentId:e.providerAgentId,jobId:e.jobId,groupId:e.groupId,direction:e.direction,providerSecurityRate:String(e.providerSecurityRate)});return n.ok?(console.log(`[onchainos] message-eligible result: eligible=${n.data.eligible}`),n.data):(tg(t,"message-eligible"),console.warn(`[onchainos] message-eligible ok=false, letting message through: ${t.slice(0,200)}`),q.error(G.INBOUND_ELIGIBILITY_BYPASSED,new Error("message-eligible ok=false"),Hc(t,"message-eligible",{onchainosAgentId:e.agentId,agentId:e.agentId,clientAgentId:e.clientAgentId,providerAgentId:e.providerAgentId,jobId:e.jobId,groupId:e.groupId,direction:e.direction,providerSecurityRate:String(e.providerSecurityRate),reason:"ok=false"})),{eligible:!0})}async function gre(){console.log("[onchainos] fetching system-config");let e,t;try{({stdout:e,stderr:t}=await Xn(["agent","system-config"]))}catch(n){throw Kc(n,"system-config"),n}t&&console.log(`[onchainos] stderr (system-config): ${t}`);let r=ki(e,"system-config");if(!r.ok){tg(e,"system-config");let n=new Error("onchainos agent system-config failed");throw q.error(G.ONCHAINOS_CLI_ERROR,n,Hc(e,"system-config")),n}return console.log(`[onchainos] fetched system-config: ${Object.keys(r.data).length} keys`),r.data}async function hre(){console.log("[onchainos] fetching sensitive words");let e,t;try{({stdout:e,stderr:t}=await Xn(["agent","sensitive-words"]))}catch(i){throw Kc(i,"sensitive-words"),i}t&&console.log(`[onchainos] stderr (sensitive-words): ${t}`);let r=ki(e,"sensitive-words");if(!r.ok){tg(e,"sensitive-words");let i=new Error("onchainos agent sensitive-words failed");throw q.error(G.ONCHAINOS_CLI_ERROR,i,Hc(e,"sensitive-words")),i}let n=new Set;for(let i of r.data)for(let[s,a]of Object.entries(i))s!=="type"&&typeof a=="string"&&a&&n.add(a);let o=[...n];return console.log(`[onchainos] fetched ${r.data.length} sensitive word entries \u2192 ${o.length} unique words`),o}async function Kqe(e,t,r,n){console.log(`[onchainos-signer] executing: onchainos agent xmtp-sign --key-uuid ${t} --message <${n.length} chars>`);let o,i;try{({stdout:o,stderr:i}=await Xn(["agent","xmtp-sign","--key-uuid",t,"--message",n]))}catch(a){let A=String(a?.stdout??"");throw A&&Vc(A)&&Wc("xmtp-sign"),a}i&&console.log(`[onchainos-signer] stderr: ${i}`);let s=ki(o,"xmtp-sign",{onchainosAgentId:e,keyUuid:t,walletAddress:r,messageLength:String(n.length)});if(!s.ok){Vc(o)&&Wc("xmtp-sign");let a=new Error(`onchainos xmtp-sign failed: ${o}`);throw q.error(G.ONCHAINOS_CLI_ERROR,a,Hc(o,"xmtp-sign",{onchainosAgentId:e,keyUuid:t,walletAddress:r,messageLength:String(n.length)})),a}return console.log(`[onchainos-signer] sign success, signature=${s.data.signature.slice(0,20)}...`),Qi(s.data.signature)}function xO(e){let t=e.communicationAddress.toLowerCase(),r=e.keyUuid,n=e.agentId;return console.log(`[onchainos-signer] creating signer for ${t} (keyUuid=${r})`),{type:"EOA",getIdentifier:()=>({identifier:t,identifierKind:0}),signMessage:async o=>(console.log(`[onchainos-signer] signing message for ${t}`),await Kqe(n,r,t,o))}}function mre(){return async(e,t)=>{let r=e.client?.inboxId,n=e.message?.senderInboxId;r&&n&&String(n).toLowerCase()===String(r).toLowerCase()||await t()}}function Ere(e){let t=`[xmtp-sdk:${e.walletAddress??"?"}]`;return async(r,n)=>{let o=r.message,i=r.conversation,s=i.id,a=JSON.stringify(o),A={...Je(e),peerInboxId:o.senderInboxId,conversationId:s,messageId:o.id};if(i instanceof ur){let c=i.name??"unnamed",u="0",d="",l="0";try{let f=await i.members();u=String(f.length),d=` members=[${f.flatMap(h=>h.accountIdentifiers.map(m=>m.identifier)).join(", ")}]`}catch(f){console.log(`${t} [group] members fetch failed:`,f),u="fetch-failed",d=" members=[fetch failed]",l="1"}console.log(`${t} [group] conv=${s} name="${c}"${d} sender=${o.senderInboxId} content: ${a}`),q.info(G.MESSAGE_RECEIVED,{...A,chatType:"group",groupName:c,memberCount:u,membersFetchFailed:l})}else console.log(`${t} [dm] conv=${s} sender=${o.senderInboxId} content: ${a}`),q.info(G.MESSAGE_RECEIVED,{...A,chatType:"dm"});await n()}}var $qe=/^[a-zA-Z]{1,4}$/;function yre(e,t){if(t.length===0)return null;let r=e.toLowerCase();for(let n of t)if(!$qe.test(n)&&r.includes(n.toLowerCase()))return n;return null}function Ire(e){return e.length<=1?"*":e.length===2?`${e[0]}*`:e[0]+"*".repeat(e.length-2)+e[e.length-1]}async function rg(e,t,r=20){let n=new Array(e.length),o=0;async function i(){for(;o<e.length;){let a=o++;try{n[a]={status:"fulfilled",value:await t(e[a])}}catch(A){n[a]={status:"rejected",reason:A}}}}let s=Array.from({length:Math.min(r,e.length)},()=>i());return await Promise.all(s),n}var EE=`${(0,ng.homedir)()}/.openclaw/okx-a2a-data-db/last-sync.json`,NO=`${(0,ng.homedir)()}/.openclaw/okx-a2a-data-db/sensitive-words.json`,DO=`${(0,ng.homedir)()}/.openclaw/okx-a2a-data-db/system-config.json`,zqe=600*1e3;function Zqe(){try{if(!(0,Kr.existsSync)(NO))return null;let e=JSON.parse((0,Kr.readFileSync)(NO,"utf-8"));return Array.isArray(e)?e:null}catch(e){return console.log("[xmtp-sdk] failed to read sensitive-words.json cache:",e),null}}function Xqe(e){try{(0,Kr.writeFileSync)(NO,JSON.stringify(e))}catch(t){console.log("[xmtp-sdk] failed to write sensitive-words.json:",t)}}async function Cre(){let e=Zqe();try{let t=await hre();return console.log(`[xmtp-sdk] fetched ${t.length} sensitive words from API`),Xqe(t),t}catch(t){console.log("[xmtp-sdk] API fetch for sensitive words failed:",t)}return e?(console.log(`[xmtp-sdk] using ${e.length} cached sensitive words from disk`),e):(console.log("[xmtp-sdk] sensitive-words load failed: neither API nor local cache available"),null)}function jqe(){try{if(!(0,Kr.existsSync)(DO))return null;let e=JSON.parse((0,Kr.readFileSync)(DO,"utf-8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:null}catch(e){return console.log("[xmtp-sdk] failed to read system-config.json cache:",e),null}}function eGe(e){try{(0,Kr.writeFileSync)(DO,JSON.stringify(e))}catch(t){console.log("[xmtp-sdk] failed to write system-config.json:",t)}}async function RO(){let e=jqe();try{let t=await gre();return console.log(`[xmtp-sdk] fetched system-config from API: ${Object.keys(t).length} keys`),eGe(t),t}catch(t){console.log("[xmtp-sdk] API fetch for system-config failed:",t)}return e?(console.log(`[xmtp-sdk] using cached system-config from disk: ${Object.keys(e).length} keys`),e):(console.log("[xmtp-sdk] system-config load failed: neither API nor local cache available"),null)}function tGe(){let e=new Map;try{if(!(0,Kr.existsSync)(EE))return e;let r=JSON.parse((0,Kr.readFileSync)(EE,"utf-8"))?.syncByAddress;if(r&&typeof r=="object"&&!Array.isArray(r))for(let[n,o]of Object.entries(r))typeof o=="number"&&o>0&&e.set(n,o)}catch(t){console.log("[xmtp-sdk] failed to read last-sync.json cache:",t)}return e}function kO(e,t){try{let r={};if((0,Kr.existsSync)(EE))try{let n=JSON.parse((0,Kr.readFileSync)(EE,"utf-8"));n&&typeof n=="object"&&!Array.isArray(n)&&(r=n)}catch{}(!r.syncByAddress||typeof r.syncByAddress!="object")&&(r.syncByAddress={}),r.syncByAddress[e]=t,(0,Kr.writeFileSync)(EE,JSON.stringify(r,null,2))}catch(r){console.log(`[xmtp-sdk] failed to write last-sync.json (address=${e}):`,r)}}var TO={heartbeatInterval:600,extConfig:{tips:{"task-skill":"Read the okx-agent-task skill if you don't know the context"}}};function rGe(e){if(!e||typeof e!="object"||Array.isArray(e))return{...TO.extConfig.tips};let t={};for(let[r,n]of Object.entries(e))typeof n=="string"&&(t[r]=n);return Object.keys(t).length>0?t:{...TO.extConfig.tips}}function nGe(e){let t=e&&typeof e=="object"&&!Array.isArray(e)?e:{};return{tips:rGe(t.tips)}}function gv(e){let t=Array.isArray(e.accounts)?e.accounts.reduce((r,n)=>{if(!n||typeof n!="object"||Array.isArray(n))return r;let o=n,i=o.address,s=o.inboxId,a=o.type;return typeof s!="string"||!s||r.push({address:i,inboxId:s,type:a}),r},[]):[];return{heartbeatInterval:typeof e.heartbeatInterval=="number"?e.heartbeatInterval:TO.heartbeatInterval,accounts:t,sentryDsn:typeof e.sentryDsn=="string"?e.sentryDsn:"",extConfig:nGe(e.extConfig)}}function Bre(e){return typeof e=="string"?e:typeof e?.content=="string"?e.content:null}function oGe(e){let t=Bre(e);if(!t)return null;try{return JSON.parse(t)}catch{return null}}var Wr=class e{static instance=null;env=process.env.XMTP_ENV??"production";clients=new Map;allAgents=[];sensitiveWords=null;sensitiveWordsLastFailedAtMs=0;sensitiveWordsRetryInflight=null;systemConfig=gv({});_initialized=!1;_initFailures=[];_backupReady=Promise.resolve();syncByAddress=new Map;refreshAgentsInFlight;tools={};constructor(){}static getInstance(){return e.instance||(e.instance=new e),e.instance}async init(){console.log("[xmtp-sdk] init: loading config and initializing XMTP clients in parallel..."),this._initFailures=[];let[t,r,n]=await Promise.allSettled([Cre(),RO(),this.initXmtpInstall()]),o=this.tools.onAfterInit;if(this._backupReady=o?o().catch(s=>{console.log("[xmtp-sdk] tools.onAfterInit failed (will retry on first use):",s)}):Promise.resolve(),t.status==="fulfilled"&&t.value!==null)this.sensitiveWords=t.value;else{this.sensitiveWords=null;let s=t.status==="rejected"?t.reason:"loadSensitiveWords returned null (neither API nor local cache is available)";console.log("[xmtp-sdk] init: loadSensitiveWords failed; will lazy-retry during message handling:",s)}if(r.status==="fulfilled"&&r.value)this.systemConfig=gv(r.value);else{let s=r.status==="rejected"?r.reason instanceof Error?r.reason:new Error(String(r.reason)):new Error("loadSystemConfig returned null (neither API nor local cache is available)");this._initFailures.push({action:"loadSystemConfig",error:s}),console.log("[xmtp-sdk] init: loadSystemConfig failed:",s.message)}if(n.status==="fulfilled")console.log(`[xmtp-sdk] init: XMTP clients initialized, ${n.value.size} clients`);else{let s=n.reason instanceof Error?n.reason:new Error(String(n.reason));this._initFailures.push({action:"initXmtpInstall",error:s}),console.log("[xmtp-sdk] init: initXmtpInstall failed:",s.message)}this._initialized=this._initFailures.length===0;let i=n.status==="fulfilled"?n.value.size:0;console.log(`[xmtp-sdk] init done: initialized=${this._initialized}, clients=${i}, failures=${this._initFailures.length}`)}async retryFailedInit(){let t=[];for(let r of this._initFailures){console.log(`[xmtp-sdk] retryFailedInit: retrying ${r.action}...`);try{if(r.action==="loadSystemConfig"){let n=await RO();n?(this.systemConfig=gv(n),console.log("[xmtp-sdk] retryFailedInit: loadSystemConfig retry succeeded")):t.push({action:r.action,error:new Error("loadSystemConfig returned null (neither API nor local cache is available)")})}else r.action==="initXmtpInstall"&&(await this.initXmtpInstall(),console.log("[xmtp-sdk] retryFailedInit: initXmtpInstall retry succeeded"))}catch(n){let o=n instanceof Error?n:new Error(String(n));t.push({action:r.action,error:o}),console.log(`[xmtp-sdk] retryFailedInit: ${r.action} retry failed:`,o.message)}}return this._initFailures=t,t.length===0&&(this._initialized=!0),{ok:t.length===0,failures:t}}async initXmtpInstall(){console.log(`==============XMTP_ENV: ${this.env}==============`);let t=Date.now(),r=`${(0,ng.homedir)()}/.openclaw/okx-a2a-data-db`;try{(0,Kr.mkdirSync)(r,{recursive:!0})}catch(a){return console.log(`[xmtp-sdk] failed to create data directory: ${r}`,a),this.clients}this.syncByAddress=tGe(),console.log(`[xmtp-sdk] sync timestamps: ${this.syncByAddress.size} addresses on record`);let n=await wO();console.log(`[xmtp-sdk] fetched ${n.length} agents from onchainos`),this.allAgents=n,fre(n.map(a=>a.agentId)).catch(a=>{console.log("[xmtp-sdk] notifyAgentsWakeup unexpected error:",a)});let o=async a=>{let A=a.communicationAddress,c=xO(a),u=await hE.create(c,{dbPath:d=>`${r}/${d}-${this.env}.db3`,env:this.env});return{address:A,agent:u,agentInfo:a}},i=await rg(n,o),s=[];for(let a=0;a<i.length;a++){let A=i[a];if(A.status==="fulfilled"){let{address:c,agent:u,agentInfo:d}=A.value;this.clients.set(c,u),console.log(`[xmtp-sdk] identity initialized: ${c} (agentId=${d.agentId})`)}else s.push(n[a]),console.log(`[xmtp-sdk] identity init failed: ${n[a].communicationAddress} (agentId=${n[a].agentId})`,A.reason)}if(s.length>0){console.log(`[xmtp-sdk] ${s.length} client(s) failed to initialize, retrying in 1s...`),await new Promise(A=>setTimeout(A,1e3));let a=await rg(s,o);for(let A=0;A<a.length;A++){let c=a[A];if(c.status==="fulfilled"){let{address:u,agent:d,agentInfo:l}=c.value;this.clients.set(u,d),console.log(`[xmtp-sdk] retry succeeded: ${u} (agentId=${l.agentId})`)}else{let u=s[A];console.log(`[xmtp-sdk] retry still failed: ${u.communicationAddress} (agentId=${u.agentId})`,c.reason),q.error(G.XMTP_CONNECTION_FAILED,c.reason instanceof Error?c.reason:new Error(String(c.reason)),{walletAddress:u.communicationAddress,onchainosAgentId:u.agentId})}}}return console.log(`[xmtp-sdk] initialized ${this.clients.size}/${n.length} clients in total`),await this.startListening(),q.info(G.CHANNEL_READY,{onchainosAgentId:"*",clientCount:String(this.clients.size),agentCount:String(n.length),onchainosAgentIds:n.map(a=>a.agentId).join(","),walletAddresses:n.map(a=>a.communicationAddress).join(","),startupDurationMs:String(Date.now()-t)}),this.clients}async refreshAgents(){return this.refreshAgentsInFlight?(console.log("[xmtp-sdk] refresh: a refresh is already in flight, reusing the same promise"),this.refreshAgentsInFlight):(this.refreshAgentsInFlight=this.runRefreshAgents().finally(()=>{this.refreshAgentsInFlight=void 0}),this.refreshAgentsInFlight)}async runRefreshAgents(){let t=await wO();console.log(`[xmtp-sdk] refresh: fetched ${t.length} agents from onchainos`);let r=new Set(this.allAgents.map(s=>s.communicationAddress)),n=new Set(t.map(s=>s.communicationAddress)),o=t.filter(s=>!r.has(s.communicationAddress)),i=this.allAgents.filter(s=>!n.has(s.communicationAddress));this.allAgents=t;for(let s of i){let a=s.communicationAddress,A=this.clients.get(a);if(A){try{A.stop(),console.log(`[xmtp-sdk] refresh: stopped client: ${a} (agentId=${s.agentId})`)}catch(c){console.log(`[xmtp-sdk] refresh: failed to stop client: ${a}`,c),q.error(G.AGENT_REFRESH_FAILED,c instanceof Error?c:new Error(String(c)),{walletAddress:a,onchainosAgentId:s.agentId,phase:"stop-client"})}this.clients.delete(a)}}if(o.length>0){let s=`${(0,ng.homedir)()}/.openclaw/okx-a2a-data-db`;try{(0,Kr.mkdirSync)(s,{recursive:!0})}catch(u){return console.log(`[xmtp-sdk] refresh: failed to create data directory: ${s}`,u),q.error(G.AGENT_REFRESH_FAILED,u instanceof Error?u:new Error(String(u)),{onchainosAgentId:"*",phase:"mkdir",dbDir:s,addedCount:String(o.length)}),{added:[],removed:i.map(d=>`${d.agentId} (${d.communicationAddress})`)}}let a=async u=>{let d=u.communicationAddress,l=xO(u),f=await hE.create(l,{dbPath:p=>`${s}/${p}-${this.env}.db3`,env:this.env});return{address:d,agent:f,agentInfo:u}},A=await rg(o,a),c=[];for(let u=0;u<A.length;u++){let d=A[u];if(d.status==="fulfilled"){let{address:l,agentInfo:f}=d.value;this.clients.set(l,d.value.agent),console.log(`[xmtp-sdk] refresh: identity initialized: ${l} (agentId=${f.agentId})`)}else c.push(o[u]),console.log(`[xmtp-sdk] refresh: identity init failed: ${o[u].communicationAddress} (agentId=${o[u].agentId})`,d.reason)}if(c.length>0){console.log(`[xmtp-sdk] refresh: ${c.length} client(s) failed to initialize, retrying in 1s...`),await new Promise(d=>setTimeout(d,1e3));let u=await rg(c,a);for(let d=0;d<u.length;d++){let l=u[d];if(l.status==="fulfilled"){let{address:f,agentInfo:p}=l.value;this.clients.set(f,l.value.agent),console.log(`[xmtp-sdk] refresh: retry succeeded: ${f} (agentId=${p.agentId})`)}else{let f=c[d];console.log(`[xmtp-sdk] refresh: retry still failed: ${f.communicationAddress} (agentId=${f.agentId})`,l.reason),q.error(G.XMTP_CONNECTION_FAILED,l.reason instanceof Error?l.reason:new Error(String(l.reason)),{walletAddress:f.communicationAddress,onchainosAgentId:f.agentId})}}}await this.startListeningForAddresses(o.map(u=>u.communicationAddress));for(let u of o){let d=u.communicationAddress;this.syncByAddress.has(d)&&this.clients.has(d)&&(console.log(`[xmtp-sdk] refresh: ${d} has a prior sync timestamp, triggering offline replay`),this.replayOfflineMessagesForAddress(d).catch(l=>{console.log(`[xmtp-sdk] refresh: ${d} offline replay failed:`,l),q.error(G.OFFLINE_REPLAY_FAILED,l instanceof Error?l:new Error(String(l)),{walletAddress:d,stage:"refreshAgents/replay"})}))}}return console.log(`[xmtp-sdk] refresh done: +${o.length} -${i.length}, now ${this.clients.size} clients`),{added:o.map(s=>`${s.agentId} (${s.communicationAddress})`),removed:i.map(s=>`${s.agentId} (${s.communicationAddress})`)}}setTools(t){this.tools=t}get initialized(){return this._initialized}get initFailures(){return this._initFailures}getClients(){return this.clients}getClientByAddress(t){let r=this.clients.get(t);if(r)return r;let n=t.toLowerCase();for(let[o,i]of this.clients)if(o.toLowerCase()===n)return i}getAllAgents(){return this.allAgents}async checkSensitiveWord(t){let r=await this.ensureSensitiveWordsLoaded();return r===null?null:yre(t,r)}async ensureSensitiveWordsLoaded(){return this.sensitiveWords!==null?this.sensitiveWords:Date.now()-this.sensitiveWordsLastFailedAtMs<zqe?null:this.sensitiveWordsRetryInflight?this.sensitiveWordsRetryInflight:(this.sensitiveWordsRetryInflight=(async()=>{try{let r=await Cre();return r!==null?(this.sensitiveWords=r,console.log(`[xmtp-sdk] lazy-retry sensitive-words succeeded: ${r.length} entries`),r):(this.sensitiveWordsLastFailedAtMs=Date.now(),console.log("[xmtp-sdk] lazy-retry sensitive-words failed, entering cooldown"),null)}finally{this.sensitiveWordsRetryInflight=null}})(),this.sensitiveWordsRetryInflight)}getSystemConfig(){return this.systemConfig}systemConfigRefreshInflight=null;refreshSystemConfig(){return this.systemConfigRefreshInflight?this.systemConfigRefreshInflight:(this.systemConfigRefreshInflight=(async()=>{try{let t=await RO();t&&(this.systemConfig=gv(t))}finally{this.systemConfigRefreshInflight=null}})(),this.systemConfigRefreshInflight)}getSystemAccountInboxIds(){return this.systemConfig.accounts.filter(t=>t.type==="system").map(t=>t.inboxId)}getSecurityAccountInboxIds(){return this.systemConfig.accounts.filter(t=>t.type==="security").map(t=>t.inboxId)}getTrustedDmInboxIds(){return this.systemConfig.accounts.filter(t=>t.type==="system"||t.type==="security").map(t=>t.inboxId)}getAgentByAgentId(t){return this.allAgents.find(r=>r.agentId===t)}getAgentByAddress(t){let r=t.toLowerCase();return this.allAgents.find(n=>n.communicationAddress.toLowerCase()===r)}getAddressByAgentId(t){return this.getAgentByAgentId(t)?.communicationAddress}async allowGroup(t,r){let n=this.getClientByAddress(t);if(!n)return console.log(`[xmtp-sdk] allowGroup: no client found for address=${t}`),!1;try{let i=(await n.client.conversations.list()).find(s=>s instanceof ur&&s.id===r);return i?i.consentState===Ze.ConsentState.Allowed?(console.log(`[xmtp-sdk] allowGroup: groupId=${r} already Allowed, skipping`),!0):(i.updateConsentState(Ze.ConsentState.Allowed),console.log(`[xmtp-sdk] allowGroup: groupId=${r} marked as Allowed`),!0):(console.log(`[xmtp-sdk] allowGroup: groupId=${r} not found`),!1)}catch(o){return console.log(`[xmtp-sdk] allowGroup failed: groupId=${r}`,o),q.error(G.GROUP_CONSENT_UPDATE_FAILED,o instanceof Error?o:new Error(String(o)),{...Je({walletAddress:t,inboxId:this.getClientByAddress(t)?.client?.inboxId,onchainosAgentId:this.getAgentByAddress(t)?.agentId}),conversationId:r,action:"allow"}),!1}}async listUnknownGroups(t){let r=`[xmtp-sdk:listUnknownGroups:${t}]`,n=this.getClientByAddress(t);if(!n)return console.log(`${r} no client found, returning empty`),[];await n.client.conversations.syncAll([Ze.ConsentState.Unknown]);let o=await n.client.conversations.list({consentStates:[Ze.ConsentState.Unknown]});console.log(`${r} Unknown groups: ${o.length}`);let i=n.client.inboxId,s=this.getAgentByAddress(t)?.agentId??null,a=[];for(let A of o)if(A instanceof ur)try{await A.sync();let u=(await A.messages()).filter(f=>f.senderInboxId!==i&&(!f.kind||f.kind==="application"));if(u.length===0)continue;let d=null;for(let f of u){let p=oGe(f.content);if(p?.jobId){d=p;break}}if(!d)continue;let l=u.map(f=>{let p=Bre(f.content);return p?{content:p,sentAt:typeof f.sentAtNs=="bigint"?Number(f.sentAtNs/1000000n):Number(f.sentAt??0)}:null}).filter(f=>f!==null);a.push({groupId:A.id,myAgentId:s,myXmtpAddress:t,toXmtpAddress:d.fromXmtpAddress??u[0].senderInboxId,toAgentId:d.sender?.agentId??null,jobId:d.jobId,securityRate:typeof d.sender?.securityRate=="number"?d.sender.securityRate:0,messages:l})}catch(c){console.log(`${r} failed to read group ${A.id}:`,c)}return a.sort((A,c)=>c.securityRate-A.securityRate),a}async denyGroup(t,r){let n=this.getClientByAddress(t);if(!n)return console.log(`[xmtp-sdk] denyGroup: no client found for address=${t}`),!1;try{let i=(await n.client.conversations.list()).find(s=>s instanceof ur&&s.id===r);return i?(i.updateConsentState(Ze.ConsentState.Denied),console.log(`[xmtp-sdk] denyGroup: groupId=${r} marked as Denied`),!0):(console.log(`[xmtp-sdk] denyGroup: groupId=${r} not found`),!1)}catch(o){return console.log(`[xmtp-sdk] denyGroup failed: groupId=${r}`,o),q.error(G.GROUP_CONSENT_UPDATE_FAILED,o instanceof Error?o:new Error(String(o)),{...Je({walletAddress:t,inboxId:this.getClientByAddress(t)?.client?.inboxId,onchainosAgentId:this.getAgentByAddress(t)?.agentId}),conversationId:r,action:"deny"}),!1}}async startListening(){await this.startListeningForAddresses([...this.clients.keys()])}async startListeningForAddresses(t){let r=t.filter(n=>this.clients.has(n));await rg(r,async n=>{let o=this.clients.get(n),i=`[xmtp-sdk:${n}]`,s=this.getAgentByAddress(n),a={walletAddress:n,inboxId:o.client?.inboxId,onchainosAgentId:s?.agentId};try{await o.client.conversations.syncAll([Ze.ConsentState.Allowed,Ze.ConsentState.Unknown]),console.log(`${i} conversations synced (non-Denied)`)}catch(f){console.log(`${i} conversation sync failed, skipping this client:`,f),q.error(G.CONVERSATIONS_STREAM_FAILED,f instanceof Error?f:void 0,Je(a));return}o.use(mre()),o.use(Ere(a));let A=this.tools.createInboundMiddleware;A?o.use(A({myXmtpAddress:n,getTools:()=>this.tools,allowGroup:(f,p)=>this.allowGroup(f,p),onMessageProcessed:f=>{let p=Math.max(this.syncByAddress.get(n)??0,f+1);this.syncByAddress.set(n,p),kO(n,p)}})):console.log(`${i} tools.createInboundMiddleware not injected \u2014 inbound routing disabled`);let c=5,u=1e3,d=async(f=0)=>{try{await o.start()}catch(p){console.log(`${i} agent.start error (attempt=${f}):`,p),q.error(G.AGENT_START_FAILED,p instanceof Error?p:void 0,{...Je(a),attempt:String(f)}),l(f)}},l=f=>{if(f>=c){console.log(`${i} reached max retries (${c}), giving up reconnect`);return}let p=u*2**f;console.log(`${i} reconnecting in ${p}ms (attempt=${f+1})`),setTimeout(()=>{d(f+1)},p)};o.on("error",f=>{console.log(`${i} agent stream error:`,f),q.error(G.AGENT_STREAM_ERROR,f,Je(a)),l(0)}),d(),console.log(`${i} message listener started`)})}async replayOfflineMessagesForAddress(t){let r=this.clients.get(t);if(!r)return{replayed:0,skipped:0};let n=this.syncByAddress.get(t),o=`[xmtp-sdk:replay:${t}]`;if(n===void 0)return console.log(`${o} no sync timestamp, skipping offline replay (policy TBD)`),{replayed:0,skipped:0};let i=n*1e6;console.log(`${o} starting offline message replay, lastSync=${new Date(n).toISOString()}`);let s=r.client.inboxId,a={myXmtpAddress:t,getTools:()=>this.tools,allowGroup:(l,f)=>this.allowGroup(l,f)},A=this.tools.processOfflineMessage;if(!A)return console.log(`${o} tools.processOfflineMessage not injected \u2014 offline replay skipped`),{replayed:0,skipped:0};let c;try{await r.client.conversations.syncAll([Ze.ConsentState.Allowed,Ze.ConsentState.Unknown]),c=await r.client.conversations.list({consentStates:[Ze.ConsentState.Allowed,Ze.ConsentState.Unknown]}),console.log(`${o} ${c.length} conversation(s) to check (non-Denied)`)}catch(l){return console.log(`${o} conversation sync/list failed, skipping:`,l),q.error(G.OFFLINE_REPLAY_FAILED,l instanceof Error?l:void 0,{walletAddress:t,stage:"syncAll/list"}),{replayed:0,skipped:0}}let u=0,d=0;for(let l of c)try{await l.sync();let f=l instanceof vn?"DM":l instanceof ur?"Group":"Unknown",p=await l.messages({sentAfterNs:i});if(p.length===0)continue;let h=p.filter(m=>m.senderInboxId!==s&&(!m.kind||m.kind==="application")).sort((m,E)=>{let B=typeof m.sentAtNs=="bigint"?Number(m.sentAtNs):Number(m.sentAt??0),b=typeof E.sentAtNs=="bigint"?Number(E.sentAtNs):Number(E.sentAt??0);return B-b});if(h.length===0){console.log(`${o} conversation ${l.id}: all ${p.length} message(s) were sent by self, skipped`);let m=p.reduce((E,B)=>{let b=typeof B.sentAtNs=="bigint"?Number(B.sentAtNs/1000000n):Number(B.sentAt??0);return b>E?b:E},0);if(m>0){let E=Math.max(this.syncByAddress.get(t)??0,m+1);this.syncByAddress.set(t,E),kO(t,E)}continue}console.log(`${o} conversation ${l.id} (${f}): found ${h.length} offline message(s)`);for(let m of h){let E=typeof m.content=="string"?m.content:JSON.stringify(m.content),B=E.length>80?`${E.slice(0,80)}...`:E,b=typeof m.sentAtNs=="bigint"?Number(m.sentAtNs/1000000n):Number(m.sentAt??Date.now());try{let I=m.senderInboxId,Q="",x=!1,O=async()=>{if(x)return Q;try{Q=(await r.client.preferences.inboxStateFromInboxIds([I]))?.[0]?.identifiers?.[0]?.identifier??""}catch{Q=""}return x=!0,Q},P={message:{id:m.id,senderInboxId:I,content:m.content,sentAtNs:m.sentAtNs,sentAt:m.sentAt},conversation:l,getSenderAddress:O};await A(P,a,{skipNotify:!0})?(console.log(`${o} replayed: sender=${m.senderInboxId}, sentAt=${m.sentAt}, content=${B}`),u++):d++}catch(I){console.log(`${o} replay handling failed: msgId=${m.id}`,I),q.error(G.OFFLINE_REPLAY_MESSAGE_FAILED,I instanceof Error?I:void 0,{walletAddress:t,messageId:m.id,conversationId:l.id})}finally{let I=Math.max(this.syncByAddress.get(t)??0,b+1);this.syncByAddress.set(t,I),kO(t,I)}}}catch(f){console.log(`${o} failed to read messages from conversation ${l.id}:`,f),q.error(G.OFFLINE_REPLAY_FAILED,f instanceof Error?f:void 0,{walletAddress:t,conversationId:l.id})}return{replayed:u,skipped:d}}async replayOfflineMessages(){await this._backupReady,console.log(`[xmtp-sdk:replay] starting offline replay, ${this.clients.size} clients, ${this.syncByAddress.size} addresses have timestamps`);let t=0,r=0;for(let n of this.clients.keys()){let{replayed:o,skipped:i}=await this.replayOfflineMessagesForAddress(n);t+=o,r+=i}console.log(`[xmtp-sdk:replay] offline replay done: replayed ${t}, skipped ${r}`)}};var yE=require("openclaw/plugin-sdk/routing");var hv="okx-xmtp",OO="okx-a2a";function Ni(e){if(typeof e=="string")return`${hv}:${e}`;let t=new URLSearchParams({my:e.myXmtpAddress,to:e.toXmtpAddress,job:e.jobId,gid:e.xmtpGroupId});return`${hv}:${t.toString()}`}function oi(e){let t=`${hv}:`,r=e.indexOf(t);if(r===-1)return null;let n=new URLSearchParams(e.slice(r+t.length)),o=n.get("my"),i=n.get("to"),s=n.get("job"),a=n.get("gid");return!o||!i||!s||!a?null:{myXmtpAddress:o,toXmtpAddress:i,jobId:s,xmtpGroupId:a}}function $c(e){let t=typeof e=="string"?e:Ni(e);return(0,yE.buildAgentSessionKey)({agentId:"main",channel:OO,peer:{kind:"group",id:t}})}function mv(){return(0,yE.buildAgentMainSessionKey)({agentId:"main"})}function PO(){let r=to().config.loadConfig().agents?.list;if(r&&r.length>0){let n=r.find(o=>o.id==="main");return n?n.id:r[0].id}return"main"}function Rd(){return(0,yE.buildAgentSessionKey)({agentId:PO(),channel:OO,peer:{kind:"group",id:"backup"}})}function Ev(e){let t=to(),r=t.agent.session.resolveStorePath(void 0,{agentId:"main"}),n=t.agent.session.loadSessionStore(r,{skipCache:!0}),o=Object.keys(n);console.log(`[findExistingSession] storePath=${r}, keys=${o.length}, matching my=${e.myXmtpAddress} to=${e.toXmtpAddress} job=${e.jobId}`);let i=e.myXmtpAddress.toLowerCase(),s=e.toXmtpAddress.toLowerCase();for(let a of o){let A=oi(a);if(A&&A.myXmtpAddress.toLowerCase()===i&&A.toXmtpAddress.toLowerCase()===s&&A.jobId===e.jobId)return console.log(`[findExistingSession] hit existing session: ${a}`),{params:A,sessionKey:a}}return console.log("[findExistingSession] no matching session found"),null}function bre(e){let t=to(),r=t.agent.session.resolveStorePath(void 0,{agentId:"main"}),n=t.agent.session.loadSessionStore(r,{skipCache:!0}),o=e.myXmtpAddress.toLowerCase(),i=e.toXmtpAddress.toLowerCase();for(let s of Object.keys(n)){let a=oi(s);if(a&&a.xmtpGroupId===e.xmtpGroupId&&a.myXmtpAddress.toLowerCase()===o&&a.toXmtpAddress.toLowerCase()===i&&a.jobId===e.jobId)return{params:a,sessionKey:s}}return null}function yv(){let e=to(),t=e.agent.session.resolveStorePath(void 0,{agentId:"main"}),r=e.agent.session.loadSessionStore(t,{skipCache:!0}),n=new Map,o=new Map;for(let[i,s]of Object.entries(r)){if(i.includes(hv)||i.includes(OO))continue;let a=s;if(a.spawnedBy||a.subagentRole)continue;let A=i.split(":"),c=a.deliveryContext?.channel??a.lastChannel??a.origin?.provider;if(!c)continue;let u=a.deliveryContext?.to??a.lastTo??A[4],d=a.updatedAt??0;u&&(!o.get(c)||d>(n.get(c)?.updatedAt??0))&&o.set(c,u);let l=n.get(c);(!l||d>l.updatedAt)&&n.set(c,{sessionKey:i,to:u,updatedAt:d})}for(let[i,s]of n)if(!s.to){let a=o.get(i);a&&(s.to=a)}return n}function Qre(e){let t=to(),r=t.agent.session.resolveStorePath(void 0,{agentId:"main"}),n=t.agent.session.loadSessionStore(r,{skipCache:!0}),o=e.myXmtpAddress?.toLowerCase(),i=e.toXmtpAddress?.toLowerCase(),s=[];for(let a of Object.keys(n)){let A=oi(a);A&&(i&&A.toXmtpAddress.toLowerCase()!==i||o&&A.myXmtpAddress.toLowerCase()!==o||e.jobId&&A.jobId!==e.jobId||s.push({params:A,sessionKey:a}))}return s}function Sre(e){let t=to(),r=t.agent.session.resolveStorePath(void 0,{agentId:"main"}),n=t.agent.session.loadSessionStore(r,{skipCache:!0}),o=e.myXmtpAddress.toLowerCase();for(let i of Object.keys(n)){let s=oi(i);if(s&&s.myXmtpAddress.toLowerCase()===o&&s.jobId===e.jobId)return{params:s,sessionKey:i}}return null}function rr(e){return e instanceof Error?e.message:String(e)}var IE="a2a-agent-chat";function ne(e){return{content:[{type:"text",text:e}],details:void 0}}var iGe={msgType:`Message type identifier, fixed to "${IE}"`,content:"Message body",contentType:'Content type, fixed to "text"',fromXmtpAddress:"Sender's XMTP address",toXmtpAddress:"Receiver's XMTP address",groupId:"XMTP group chat ID",jobId:"A2A job ID",sender:"Sender's agent identity, includes agentId / name / profileDescription / profilePicture / role / securityRate",receiverAgentId:"Receiver's onchainos agentId (null if unknown)",payload:"Optional extra data attached by the sender for the receiver; absent when the sender did not provide any"};function sGe(e){return!!e&&typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length>0}function Iv(e){let t=Wr.getInstance().getSystemConfig().extConfig.tips,r={msgType:IE,content:e.content,contentType:"text",fromXmtpAddress:e.myXmtpAddress,toXmtpAddress:e.toXmtpAddress,groupId:e.groupId,jobId:e.jobId,sender:e.senderAgent?{agentId:e.senderAgent.agentId,name:e.senderAgent.name,profileDescription:e.senderAgent.profileDescription,profilePicture:e.senderAgent.profilePicture,role:e.senderAgent.role,securityRate:e.senderAgent.securityRate}:null,receiverAgentId:e.receiverAgentId??null};return sGe(e.payload)&&(r.payload=e.payload),r.scheme=iGe,r.tips=t,JSON.stringify(r,null,2)}var Pre=require("node:crypto");var vre=require("openclaw/plugin-sdk/gateway-runtime"),Bv=require("node:crypto");var aGe=2e4,AGe=["operator.admin"];function _re(e){if(e){if(typeof e=="string")return e;if(typeof e=="object"&&e!==null&&"env"in e)return process.env[e.env]||void 0}}var zc=null,bv=null,MO=null,FO=null,Cv=!1;function UO(){bv=new Promise((e,t)=>{MO=e,FO=t})}function cGe(){if(zc)return{client:zc,ready:bv};let t=to().config.loadConfig().gateway,r=t?.port??18789;return UO(),zc=new vre.GatewayClient({url:`ws://127.0.0.1:${r}`,password:_re(t?.auth?.password),token:_re(t?.auth?.token),instanceId:(0,Bv.randomUUID)(),clientName:"gateway-client",clientDisplayName:"okx-a2a-plugin",mode:"backend",role:"operator",scopes:[...AGe],onHelloOk:()=>{console.log("[gateway] connected"),Cv=!0,MO?.()},onClose:(n,o)=>{console.log(`[gateway] closed (${n}): ${o||"no reason"}`),Cv&&(Cv=!1,UO())},onConnectError:n=>{let o=n;if(o?.retryable){console.log(`[gateway] waiting (${o?.details?.reason??"retryable"}), will auto-retry`);return}console.log("[gateway] connect error:",n),FO?.(n instanceof Error?n:new Error(String(n))),UO()}}),zc.start(),{client:zc,ready:bv}}function wre(){if(zc){try{zc.stop()}catch{}zc=null,bv=null,MO=null,FO=null,Cv=!1}}async function Ms(e){let t=e.timeoutMs??aGe,{client:r,ready:n}=cGe();return await n,await r.request(e.method,e.params,{timeoutMs:t})}async function og(e){return Ms({method:"sessions.create",params:e})}async function xre(e){return Ms({method:"sessions.delete",params:e})}async function Ga(e){try{return await Ms({method:"sessions.send",params:{...e,idempotencyKey:(0,Bv.randomUUID)()}})}catch(t){let r=t?.gatewayCode??t?.code,n=String(t?.message??"");if(r==="INVALID_REQUEST"&&n.includes("session not found"))return await og({key:e.key}),await Ms({method:"sessions.send",params:{...e,idempotencyKey:(0,Bv.randomUUID)()}});throw t}}async function Qv(e){try{return await Ms({method:"chat.inject",params:e})}catch(t){let r=t?.gatewayCode??t?.code,n=String(t?.message??"");if(r==="INVALID_REQUEST"&&n.includes("session not found"))return await og({key:e.sessionKey}),await Ms({method:"chat.inject",params:e});throw t}}var uGe={outbound:"\u{1F4E4} [Sent]",inbound:"\u{1F4E5} [Received]"},Rre="\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",kre=6,Nre=4,Dre=6,Tre=4,LO="...",Sv=8;function dGe(e){return e?e.length<=kre+Nre+1?e:`${e.slice(0,kre)}\u2026${e.slice(-Nre)}`:""}function lGe(e){return e.length<=Dre+Tre+LO.length?e:`${e.slice(0,Dre)}${LO}${e.slice(-Tre)}`}function Ore(e){return e.name?e.agentId?`${e.name}#${e.agentId}`:e.name:e.walletAddress?dGe(e.walletAddress):"unknown"}function fGe(e){let t=e.split(`
132
132
  `);if(t.length<=Sv)return e;let r=t.slice(0,Sv);return r[Sv-1]=`${r[Sv-1]}${LO}`,r.join(`
133
133
  `)}function pGe(e){let t=Ore(e.sender),r=Ore(e.receiver),n=e.direction==="outbound"?`${t} (you) \u2192 ${r}`:`${t} \u2192 ${r} (you)`;return[`${uGe[e.direction]} ${n}`,`Job: ${lGe(e.jobId)}`,Rre,`\u300C${fGe(e.content)}\u300D`,Rre].join(`
134
134
  `)}function _v(e){let t=pGe(e),r="[notifyAgentMessageToUser]";CE(t).then(n=>{console.log(`${r} direction=${e.direction} senderAgentId=${e.sender.agentId??""} senderName=${e.sender.name??""} senderWalletAddress=${e.sender.walletAddress??""} receiverAgentId=${e.receiver.agentId??""} receiverName=${e.receiver.name??""} receiverWalletAddress=${e.receiver.walletAddress??""} jobId=${e.jobId} delivered=${n.dispatched.join(",")} failed=${n.failed.join(",")}`)},n=>{console.log(`${r} error direction=${e.direction} senderAgentId=${e.sender.agentId??""} receiverAgentId=${e.receiver.agentId??""} jobId=${e.jobId} err=${n instanceof Error?n.message:String(n)}`)})}var qO=new Set(["heartbeat","cron","webhook","voice"]),GO=new Set(["webchat","tui"]);async function CE(e){let t=yv();if(t.size===0)return console.log("[dispatchToUser] no deliverable user session found"),{dispatched:[],failed:[]};let r=[],n=[];for(let[o,i]of t)if(!qO.has(o))try{i.to&&!GO.has(o)?await Ms({method:"send",params:{to:i.to,message:e,channel:o,sessionKey:i.sessionKey,idempotencyKey:(0,Pre.randomUUID)()}}):await Qv({sessionKey:i.sessionKey,message:e}),r.push(o),console.log(`[dispatchToUser] delivered to ${o}${i.to?` \u2192 ${i.to}`:" (inject)"}`)}catch(s){n.push(o),console.log(`[dispatchToUser] delivery to ${o} failed:`,s),q.error(G.USER_DISPATCH_FAILED,s instanceof Error?s:new Error(String(s)),{source:"dispatchToUser",channel:o,sessionKey:i.sessionKey,hasTo:i.to?"1":"0"})}return{dispatched:r,failed:n}}async function JO(e,t,r){let n=e.get(t),o=(async()=>{if(n)try{await n}catch{}return r()})();e.set(t,o);try{return await o}finally{e.get(t)===o&&e.delete(t)}}var Fs=require("node:crypto"),Di=require("node:fs"),kd=require("node:path"),Ure=require("node:os");var Mre=Ls(Tm()),mGe="XMTP service is still initializing, please try again shortly.";async function Qo(e){if(e.initialized)return null;if(e.initFailures.length===0)return ne(mGe);let t=await e.retryFailedInit();if(t.ok)return null;let r=t.failures.map(n=>`- ${n.action}: ${n.error.message}`).join(`
@@ -2,7 +2,7 @@
2
2
  "id": "okx-a2a",
3
3
  "name": "OKX A2A",
4
4
  "description": "E2E encrypted wallet-to-agent communication via A2A protocol",
5
- "version": "0.0.0-beta.4",
5
+ "version": "0.0.0-beta.5",
6
6
  "activation": {
7
7
  "onStartup": true
8
8
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@okxweb3/a2a-openclaw",
3
- "version": "0.0.0-beta.4",
3
+ "version": "0.0.0-beta.5",
4
4
  "description": "OpenClaw plugin for E2E encrypted wallet-to-agent communication via XMTP",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -22,9 +22,6 @@
22
22
  "e2e-encryption"
23
23
  ],
24
24
  "license": "SEE LICENSE IN LICENSE",
25
- "peerDependencies": {
26
- "openclaw": ">=2026.4.0"
27
- },
28
25
  "dependencies": {
29
26
  "@xmtp/node-bindings": "1.6.8"
30
27
  },