@okxweb3/a2a-openclaw 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  var __importMetaUrl=require('url').pathToFileURL(__filename).href;
2
- "use strict";var Ft=Object.create;var de=Object.defineProperty;var qt=Object.getOwnPropertyDescriptor;var Bt=Object.getOwnPropertyNames;var Ht=Object.getPrototypeOf,Wt=Object.prototype.hasOwnProperty;var E=(e,n)=>()=>(e&&(n=e(e=0)),n);var ce=(e,n)=>{for(var t in n)de(e,t,{get:n[t],enumerable:!0})},On=(e,n,t,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of Bt(n))!Wt.call(e,r)&&r!==t&&de(e,r,{get:()=>n[r],enumerable:!(s=qt(n,r))||s.enumerable});return e};var Xt=(e,n,t)=>(t=e!=null?Ft(Ht(e)):{},On(n||!e||!e.__esModule?de(t,"default",{value:e,enumerable:!0}):t,e)),Yt=e=>On(de({},"__esModule",{value:!0}),e);function Vt(e=new Date){return e.toLocaleString(void 0,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3,hour12:!1})}function bn(e){return[`[${Vt()}]`,...e]}function u(...e){console.error(...bn(e))}function kn(...e){console.warn(...bn(e))}var I=E(()=>{"use strict"});function Kn(e){be=e}function R(){if(!be)throw new Error("[xmtp] PluginRuntime not initialized \u2014 ensure setXmtpRuntime is called in register()");return be}var be,q=E(()=>{"use strict";be=null});var a,ke=E(()=>{"use strict";a={GATEWAY_STARTED:"Gateway started",GATEWAY_STOPPED:"Gateway stopped",BOOTSTRAP_APPLIED:"Bootstrap applied",CHANNEL_READY:"Channel ready",CONVERSATION_STARTED:"Conversation started",EVALUATE_CONVERSATION_STARTED:"Evaluate conversation started",CONVERSATION_DELETED:"Conversation deleted",PENDING_CONVERSATION_DENIED:"Pending conversation denied",AGENTS_REFRESHED:"Agents refreshed",USER_DISPATCHED:"User dispatched",SESSION_DISPATCHED:"Session dispatched",SYNC_TICK_COMPLETED:"Sync tick completed",INBOUND_HANDLER_ENTERED:"Inbound handler entered",MESSAGE_RECEIVED:"Message received",MESSAGE_SENT:"Message sent",INBOUND_BUYER_PENDING:"Inbound buyer: no session, group still Unknown (pending)",INBOUND_BUYER_SESSION_AUTO_RECOVERED:"Inbound buyer: session missing for Allowed group, auto-recovered",INBOUND_BLOCKED_SENSITIVE:"Inbound blocked: sensitive word; reply sent",INBOUND_BLOCKED_ADDRESS_MISMATCH:"Inbound blocked: address mismatch",INBOUND_BLOCKED_INELIGIBLE:"Inbound blocked: message-eligible check failed",INBOUND_DROP_EMPTY_CONTENT:"Inbound drop: empty content",INBOUND_DROP_MISSING_JOBID:"Inbound drop: missing jobId",INBOUND_DROP_UNSUPPORTED_MSGTYPE:"Inbound drop: unsupported msgType",INBOUND_DROP_DM_NON_SYSTEM:"Inbound drop: DM sender not in system whitelist",INBOUND_DROP_DM_INVALID_PAYLOAD:"Inbound drop: DM payload invalid",INBOUND_DROP_DM_UNKNOWN_AGENT:"Inbound drop: DM target agent not local",DM_FALLBACK_TO_BACKUP:"DM fallback to backup session",DM_WHITELIST_FAIL_OPEN:"DM whitelist fail-open (empty system accounts)",FILE_UPLOADED:"File uploaded",FILE_DOWNLOADED:"File downloaded",PENDING_LIST_QUERIED:"Pending list queried",AGENT_LIST_QUERIED:"Agent list queried",SESSION_KEY_DERIVED:"Session key derived",CONVERSATION_HISTORY_QUERIED:"Conversation history queried",SESSIONS_QUERIED:"Sessions queried",GROUP_CONSENT_CHANGED:"Group consent changed",SESSION_CREATED:"Session created",SESSION_DELETED:"Session deleted",SESSION_AUTO_RECOVERED:"Session auto-recovered",INBOUND_DELIVERED:"Inbound delivered to session",DM_DELIVERED:"DM delivered to session",OUTBOUND_ELIGIBILITY_CHECKED:"Outbound eligibility checked",AGENT_CLIENT_CREATED:"Agent client created",AGENT_CLIENT_REMOVED:"Agent client removed",ADDRESS_SYNC_COMPLETED:"Address sync completed",AGENT_REFRESH_SESSION_EXPIRED:"Agent refresh aborted: onchainos session expired, local clients taken offline",OFFLINE_REPLAY_MESSAGE_REPLAYED:"Offline replay message replayed",AGENTS_WAKEUP_NOTIFIED:"Agents wakeup notified",CONFIG_SENSITIVE_WORDS_REFRESHED:"Sensitive words config refreshed",CONFIG_SYSTEM_REFRESHED:"System config refreshed",GATEWAY_DISCONNECTED:"Gateway disconnected",GATEWAY_REQUEST:"Gateway request",GATEWAY_DELIVERY_BUFFERED:"Gateway delivery buffered",DAEMON_LIFECYCLE_SKIPPED:"Daemon lifecycle skipped",DAEMON_LIFECYCLE_REQUESTED:"Daemon lifecycle requested",PROMPT_USER_CHECKPOINT:"Prompt user checkpoint",USER_WATCH_STARTED:"User watch started",USER_WATCH_EVENT_DELIVERED:"User watch event delivered",INBOUND_DM_RAW:"Inbound DM raw",INBOUND_GROUP_RAW:"Inbound group raw",SYSTEM_NOTIFICATION_RECEIVED:"System notification received",SYSTEM_NOTIFICATION_ROUTED:"System notification routed",HERMES_SESSION_ROUTE_BINDING:"Hermes session route binding",XMTP_CONNECTION_FAILED:"XMTP connection failed",CONVERSATIONS_STREAM_FAILED:"conversations.stream failed",AGENT_START_FAILED:"agent.start failed",AGENT_STREAM_ERROR:"agent stream error",BOOTSTRAP_FAILED:"Bootstrap failed",ONCHAINOS_SESSION_EXPIRED:"Onchainos session expired",ONCHAINOS_CLI_ERROR:"Onchainos CLI error",HEARTBEAT_FAILED:"Heartbeat failed",HEARTBEAT_SKIPPED:"Heartbeat skipped",HEARTBEAT_GATEWAY_CHECK_FAILED:"Heartbeat gateway check failed",MESSAGE_PARSE_FAILED:"Message parse failed",MESSAGE_HANDLER_ERROR:"Message handler error",OFFLINE_REPLAY_FAILED:"Offline replay failed",INBOUND_ROUTING_FAILED:"Inbound routing failed",CONVERSATION_NOT_FOUND:"Conversation not found for send",XMTP_SEND_FAILED:"XMTP send failed",AGENT_REFRESH_FAILED:"Agent refresh failed",GROUP_CONSENT_UPDATE_FAILED:"Group consent update failed",TOOL_EXECUTE_FAILED:"Tool execute failed",AGENT_RESOLUTION_FAILED:"Agent resolution failed",USER_DISPATCH_FAILED:"User dispatch failed",INBOUND_ELIGIBILITY_BYPASSED:"Inbound eligibility bypassed",INBOUND_ADDRESS_CHECK_FAILED:"Inbound address check failed",INBOUND_ADDRESS_CHECK_BYPASSED:"Inbound address check bypassed",INBOUND_SENSITIVE_CHECK_FAILED:"Inbound sensitive check failed",FILE_UPLOAD_FAILED:"File upload failed",FILE_DOWNLOAD_FAILED:"File download failed",OFFLINE_REPLAY_MESSAGE_FAILED:"Offline replay message failed",PENDING_NOTIFICATION_FAILED:"Pending notification failed",GATEWAY_CONNECT_FAILED:"Gateway connect failed",GATEWAY_REQUEST_FAILED:"Gateway request failed",PROMPT_USER_FAILED:"Prompt user failed",DAEMON_COMMAND_FAILED:"Daemon command failed",DAEMON_COMMAND_TIMEOUT:"Daemon command timeout",DAEMON_COMMAND_STALE:"Daemon command stale",DAEMON_LIFECYCLE_FAILED:"Daemon lifecycle failed",DAEMON_TICK_FAILED:"Daemon tick failed",DIRECT_CLI_FAILED:"Direct CLI failed",AI_RUN_FAILED:"AI run failed",AI_RUN_TIMEOUT:"AI run timeout",AI_RUN_TOOL_FAILED:"AI run tool failed",IPC_FAILED:"IPC failed",NOTIFY_AGENTS_WAKEUP_FAILED:"Notify agents wakeup failed",OUTBOUND_AGENT_LOOKUP_FAILED:"Outbound agent lookup failed",OUTBOUND_ELIGIBILITY_CHECK_FAILED:"Outbound eligibility check failed",OUTBOUND_ELIGIBILITY_BYPASSED:"Outbound eligibility bypassed",OUTBOUND_BLOCKED_INELIGIBLE:"Outbound blocked: message-eligible check failed",CACHE_LOAD_FAILED:"Cache load failed",CACHE_WRITE_FAILED:"Cache write failed",CONFIG_LOAD_FAILED:"Config load failed",SENTRY_INIT_SKIPPED:"Sentry init skipped",AGENT_DB_DIR_CREATE_FAILED:"Agent DB dir create failed"}});var y,xn,Cn,vn,zt,Jt,Qt,Zt,es,ue,Pn,Ke,g,Ln,Un,D=E(()=>{"use strict";I();y=Xt(require("@sentry/node")),xn=require("node:crypto");ke();ke();Cn=(0,xn.randomUUID)(),vn=new Set(["args","apikey","argv","auth","authorization","authtoken","bearer","body","cache","command","content","credential","credentials","cwd","data","error","failures","filename","file_name","filepath","file_path","headers","input","logpath","message","output","password","params","path","payload","privatekey","prompt","raw","rawevent","rawtext","request","response","accesstoken","refreshtoken","digest","nonce","salt","secret","token","stderr","stdout","title","tooloutput"]),zt=["accesstoken","apikey","authorization","authtoken","content","credential","filepath","logpath","outputpath","password","payload","privatekey","prompt","rawevent","rawtext","refreshtoken","requestbody","responsebody","secret","stderr","stdout","token","tooloutput"],Jt=new Set(["onchainosagentlistresultjson","onchainosagentlistdiagnostictext"]),Qt=new Set(["agentPlatform","cacheName","checkpoint","code","communicationClass","component","eventName","exitCode","kind","method","onchainosAgentId","operation","phase","platform","provider","reason","role","source","stage","status","subcommand","taskId","type"]),Zt=["eventName","cacheName","checkpoint","component","method","operation","phase","reason","code","provider","type","kind","status","subcommand"],es=new Set([a.GATEWAY_STARTED,a.GATEWAY_STOPPED,a.GATEWAY_DISCONNECTED,a.GATEWAY_REQUEST,a.GATEWAY_DELIVERY_BUFFERED,a.DAEMON_LIFECYCLE_SKIPPED,a.DAEMON_LIFECYCLE_REQUESTED,a.PROMPT_USER_CHECKPOINT,a.USER_WATCH_STARTED,a.USER_WATCH_EVENT_DELIVERED,a.CHANNEL_READY,a.CONVERSATION_STARTED,a.EVALUATE_CONVERSATION_STARTED,a.CONVERSATION_DELETED,a.USER_DISPATCHED,a.SESSION_DISPATCHED,a.SESSION_CREATED,a.SESSION_DELETED,a.SESSION_AUTO_RECOVERED,a.INBOUND_DELIVERED,a.INBOUND_DM_RAW,a.INBOUND_GROUP_RAW,a.SYSTEM_NOTIFICATION_RECEIVED,a.SYSTEM_NOTIFICATION_ROUTED,a.HERMES_SESSION_ROUTE_BINDING,a.INBOUND_BLOCKED_ADDRESS_MISMATCH,a.INBOUND_BLOCKED_INELIGIBLE,a.INBOUND_BLOCKED_SENSITIVE,a.INBOUND_DROP_DM_INVALID_PAYLOAD,a.INBOUND_DROP_DM_NON_SYSTEM,a.INBOUND_DROP_DM_UNKNOWN_AGENT,a.INBOUND_DROP_EMPTY_CONTENT,a.INBOUND_DROP_MISSING_JOBID,a.INBOUND_DROP_UNSUPPORTED_MSGTYPE,a.DM_DELIVERED,a.DM_FALLBACK_TO_BACKUP,a.DM_WHITELIST_FAIL_OPEN,a.INBOUND_BUYER_PENDING,a.INBOUND_BUYER_SESSION_AUTO_RECOVERED,a.MESSAGE_SENT,a.AGENT_CLIENT_CREATED,a.AGENT_CLIENT_REMOVED,a.ADDRESS_SYNC_COMPLETED,a.AGENTS_REFRESHED,a.AGENTS_WAKEUP_NOTIFIED,a.AGENT_LIST_QUERIED,a.BOOTSTRAP_APPLIED,a.CONFIG_SENSITIVE_WORDS_REFRESHED,a.CONFIG_SYSTEM_REFRESHED,a.CONVERSATION_HISTORY_QUERIED,a.FILE_DOWNLOADED,a.FILE_UPLOADED,a.GROUP_CONSENT_CHANGED,a.INBOUND_HANDLER_ENTERED,a.MESSAGE_RECEIVED,a.OFFLINE_REPLAY_MESSAGE_REPLAYED,a.AGENT_REFRESH_SESSION_EXPIRED,a.OUTBOUND_ELIGIBILITY_CHECKED,a.OUTBOUND_BLOCKED_INELIGIBLE,a.PENDING_CONVERSATION_DENIED,a.PENDING_LIST_QUERIED,a.SESSION_KEY_DERIVED,a.SESSIONS_QUERIED,a.SYNC_TICK_COMPLETED]),ue=256,Pn=128,Ke=class e{static instance;initialized=!1;buffer=[];constructor(){}static getInstance(){return e.instance||(e.instance=new e),e.instance}init(n){if(this.initialized){kn("[logger] Already initialized, skipping.");return}try{y.init({dsn:n.dsn,release:n.release,environment:n.environment,maxBreadcrumbs:0,beforeBreadcrumb:()=>null,isInner:!1}),y.setTags({projectName:n.projectName,agentPlatform:n.agentPlatform})}catch{return}this.initialized=!0,this.flush()}info(n,t){let s=e.sanitizeExtra({flowId:Cn,...t??{}});if(es.has(n)){if(!this.initialized){this.buffer.push({level:"info",message:n,extra:s});return}try{y.withScope(r=>{e.applyDiagnostics(r,n,s),y.captureEvent({level:"info",message:n,extra:{...s,eventName:n}})})}catch{}}}error(n,t,s){let r=e.sanitizeExtra({flowId:Cn,...s??{}});if(!this.initialized){this.buffer.push({level:"error",message:n,error:t,extra:r});return}try{y.withScope(o=>{o.setLevel("error"),e.applyDiagnostics(o,n,r),y.captureException(e.createSentryEvent(n),{extra:t?{...r,eventName:n,errorName:t.name,errorMessageLength:String(t.message.length)}:r})})}catch{}}async shutdown(){try{await y.close(5e3)}catch{await y.flush(5e3)}}flush(){for(;this.buffer.length>0;){let n=this.buffer.shift();n.level==="info"?this.info(n.message,n.extra):this.error(n.message,n.error,n.extra)}}static sanitizeExtra(n){return Object.fromEntries(Object.entries(n).filter(([,t])=>t!==void 0).filter(([t])=>!e.isBlockedExtraKey(t)).map(([t,s])=>[t,e.safeValueForKey(t,s)]))}static isBlockedExtraKey(n){let t=n.toLowerCase(),s=e.normalizeSensitiveKey(n);return vn.has(t)||vn.has(s)?!0:e.isSafeMetricKey(s)?!1:zt.some(r=>s.includes(r))}static isSafeMetricKey(n){return/(bytes|count|length|ms|size)$/.test(n)}static safeValueForKey(n,t){return typeof t=="string"&&Jt.has(e.normalizeSensitiveKey(n))?t:e.safeValue(t)}static normalizeSensitiveKey(n){return n.toLowerCase().replace(/[^a-z0-9]/g,"")}static safeValue(n){if(typeof n=="string")return n.length<=ue?n:`${n.slice(0,ue)}...`;if(n==null||typeof n=="number"||typeof n=="boolean")return n;if(typeof n=="bigint")return n.toString();if(n instanceof Error)return{name:n.name,messageLength:n.message.length};if(Array.isArray(n))return n.slice(0,20).map(s=>e.safeValue(s));if(typeof n=="object")return Object.fromEntries(Object.entries(n).slice(0,50).filter(([,s])=>s!==void 0).filter(([s])=>!e.isBlockedExtraKey(s)).map(([s,r])=>[s,e.safeValueForKey(s,r)]));let t=String(n);return t.length<=ue?t:`${t.slice(0,ue)}...`}static tagValue(n){let t=String(n);return t.length<=Pn?t:`${t.slice(0,Pn)}...`}static normalizeTagKey(n){return n.replace(/[^A-Za-z0-9_.:-]+/g,"_").slice(0,32)||"unknown"}static applyDiagnostics(n,t,s){let r={eventName:t,...s};for(let[i,d]of Object.entries(r))Qt.has(i)&&n.setTag(e.normalizeTagKey(i),e.tagValue(d));let o=["a2a",t];for(let i of Zt){let d=r[i];d&&o.push(`${i}:${e.tagValue(d)}`)}n.setFingerprint(o)}static toPascalCase(n){return n.split(/[\s:]+/).filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}static createSentryEvent(n){let t=new Error(n);return t.name=e.toPascalCase(n),t.stack=`${t.name}: ${n}`,t}},g=Ke.getInstance(),Ln=e=>g.init(e),Un=()=>g.shutdown()});function Ce(){return v||(process.env.OKX_AGENT_TASK_HOME?(v=le(process.env.OKX_AGENT_TASK_HOME),v):(v=le((0,ge.join)(ss(),".okx-agent-task")),v))}function le(e){return ts(e)}function ts(e){(0,fe.mkdirSync)(e,{recursive:!0,mode:Mn});try{(0,fe.chmodSync)(e,Mn)}catch(n){let t=n.code;if(t!=="EPERM"&&t!=="EACCES")throw n}return e}function ss(){try{let e=(0,Gn.homedir)();if(e)return e}catch(e){}return(0,ge.resolve)(process.cwd())}var Gn,ge,fe,v,Mn,jn=E(()=>{"use strict";Gn=require("node:os"),ge=require("node:path"),fe=require("node:fs"),v=null,Mn=448});function rs(e=Ce()){return(0,Fn.join)(e,"openclaw-gateway.json")}function qn(e,n=Ce()){let t=le(n),s=rs(t),r=`${s}.${process.pid}.tmp`,o={version:1,url:e.url,...e.password?{password:e.password}:{},...e.token?{token:e.token}:{},updatedAt:new Date().toISOString(),source:"openclaw-plugin"};(0,N.writeFileSync)(r,`${JSON.stringify(o,null,2)}
3
- `,{encoding:"utf8",mode:384});try{(0,N.chmodSync)(r,384)}catch{}(0,N.renameSync)(r,s);try{(0,N.chmodSync)(s,384)}catch{}return s}var N,Fn,Bn=E(()=>{"use strict";N=require("node:fs"),Fn=require("node:path");jn()});function X(e){return e.includes(H)||e.includes(`:${W}:`)}function pe(e){if(!(!e||e==="direct"||e==="@direct"))return e.startsWith("telegram:")||e.startsWith("@")?e:`telegram:${e}`}function B(e){if(typeof e=="number"&&Number.isFinite(e))return String(Math.trunc(e));if(typeof e=="string")return e.trim()||void 0}function Hn(e){if(e.length!==0)return e[0]==="topic"?B(e[1]):e[0]==="thread"?e.length>=3?B(e.slice(2).join(":")):B(e[1]):B(e[0])}function ve(e,n){return!e||!n||!e.startsWith("telegram:")||/:topic:\d+$/.test(e)?e:`${e}:topic:${n}`}function os(e,n){let t=e.split(":");if(n==="telegram"){let s=t.indexOf("telegram"),r=s>=0?t.slice(s+1):t.slice(3),o=r.findIndex(d=>d==="direct"||d==="dm");if(o>=0){let d=o>0?r[o-1]:void 0,c=r[o+1]==="telegram"&&r[o+2]?`telegram:${r[o+2]}`:r[o+1],l=Hn(r.slice(o+2));return{to:ve(pe(c),l),accountId:d,threadId:l}}let i=r.indexOf("group");if(i>=0){let d=i>0?r[i-1]:void 0,c=r[i+1]==="telegram"&&r[i+2]?`telegram:${r[i+2]}`:r[i+1],l=Hn(r.slice(i+2));return{to:ve(pe(c),l),accountId:d,threadId:l}}if(r[0]==="telegram"&&r[1])return{to:`telegram:${r[1]}`,accountId:void 0};if(r[1]==="telegram"&&r[2])return{to:`telegram:${r[2]}`,accountId:r[0]};if(r.length>=2)return{to:pe(r[1]),accountId:r[0]};if(r.length===1)return{to:pe(r[0]),accountId:void 0}}return{to:t[4],accountId:void 0}}function Wn(e,n){return typeof e!="string"||e==="direct"||e==="@direct"?n:e}function Xn(e){return is[e]??e}function as(e){if(e==="agent:main")return"main";let n=e.split(":");return n.length<4||n[0]!=="agent"||!n[1]||!n[2]||X(e)||n[2]==="backup"?null:n[2]}function Pe(e,n){let t=n??{},s=t.deliveryContext?.channel??t.lastChannel??t.origin?.provider??as(e);if(!s)return null;let r=Xn(s),o=os(e,r),i=Wn(t.deliveryContext?.to,o.to)??Wn(t.lastTo,o.to)??o.to,d=t.deliveryContext?.accountId??o.accountId,c=B(t.deliveryContext?.threadId??t.origin?.threadId??t.lastThreadId??o.threadId);return{channel:r,target:{sessionKey:e,to:r==="telegram"?ve(i,c):i,accountId:d,threadId:c,updatedAt:t.lastInteractionAt??t.updatedAt??Date.now()}}}function Yn(e){let n=new Map,t=new Map;for(let[s,r]of Object.entries(e)){if(X(s))continue;let o=r;if(o.spawnedBy||o.subagentRole)continue;let i=Pe(s,r);if(!i)continue;let{channel:d,target:c}=i,{to:l,updatedAt:f}=c;l&&(!t.get(d)||f>(n.get(d)?.updatedAt??0))&&t.set(d,l);let p=n.get(d);(!p||f>p.updatedAt)&&n.set(d,c)}for(let[s,r]of n)if(!r.to){let o=t.get(s);o&&(r.to=o)}for(let[s,r]of n)u(`[findLatestUserSessions] channel=${s} winner=${r.sessionKey} to=${r.to??"(none)"} accountId=${r.accountId??"(none)"} interactedAt=${r.updatedAt}`);return n}var H,W,is,Vn=E(()=>{"use strict";I();H="okx-xmtp",W="okx-a2a";is={dashboard:"webchat"}});function Jn(e){if(X(e))return null;let n=R(),t=n.agent.session.resolveStorePath(void 0,{agentId:"main"}),s=n.agent.session.loadSessionStore(t,{skipCache:!0});return Pe(e,s[e])}function zn(e){return e.toLowerCase().startsWith("0x")}function ds(e){if(typeof e=="string")return`${H}:${e}`;let n="myAgentId"in e&&"toAgentId"in e?new URLSearchParams({my:e.myAgentId,to:e.toAgentId,job:e.jobId}):new URLSearchParams({my:e.myXmtpAddress,to:e.toXmtpAddress,job:e.jobId});return`${H}:${n.toString()}`}function xe(e){let n=`${H}:`,t=e.indexOf(n);if(t===-1)return null;let s=new URLSearchParams(e.slice(t+n.length)),r=s.get("myAgentId")||s.get("myagentid"),o=s.get("toAgentId")||s.get("toagentid"),i=s.get("my"),d=s.get("to"),c=s.get("job"),l=s.get("gid");return r&&o&&c?{format:"agent",myAgentId:r,toAgentId:o,jobId:c,xmtpGroupId:l??""}:!i||!d||!c?null:!zn(i)&&(d==="_"||!zn(d))?{format:"agent",myAgentId:i,toAgentId:d,jobId:c,xmtpGroupId:l??""}:{format:"address",myXmtpAddress:i,toXmtpAddress:d,jobId:c,xmtpGroupId:l??""}}function Y(e){if(!e)return"";let n=xe(e);return n?.jobId?n.jobId:/(?:^|:)backup:([^:&]+)/.exec(e)?.[1]??""}function z(e){let n=e.taskId?.trim()||Y(e.scopeKey)||Y(e.sessionKey);return n?{taskId:n}:{}}function cs(e){let n=typeof e=="string"?e:ds(e);return(0,V.buildAgentSessionKey)({agentId:"main",channel:W,peer:{kind:"group",id:n}})}function Qn(){let t=R().config.loadConfig().agents?.list;if(t&&t.length>0){let s=t.find(r=>r.id==="main");return s?s.id:t[0].id}return"main"}function Zn(){return(0,V.buildAgentSessionKey)({agentId:Qn(),channel:W,peer:{kind:"group",id:"backup"}})}function us(e){return(0,V.buildAgentSessionKey)({agentId:Qn(),channel:W,peer:{kind:"group",id:`backup:${e}`}})}function b(){let e=R(),n=e.agent.session.resolveStorePath(void 0,{agentId:"main"}),t=e.agent.session.loadSessionStore(n,{skipCache:!0});return Yn(t)}function et(e){let n=new Set,t=[...e.sessionKey?[e.sessionKey]:[],...Array.isArray(e.sessionKeys)?e.sessionKeys:[]].filter(r=>r.trim()),s=[];e.jobId&&s.push({jobId:e.jobId,myAgentId:e.myAgentId,toAgentId:e.toAgentId,myXmtpAddress:e.myXmtpAddress,toXmtpAddress:e.toXmtpAddress});for(let r of t){if(r.startsWith("agent:")){n.add(r);continue}let o=ps(r);if(o){n.add(us(o));continue}let i=nt(r);if(i){s.push(i);continue}let d=xe(r);if(d){s.push(fs(d));continue}n.add(cs(r))}for(let r of ls())for(let o of s)if(gs(r,o)){n.add(r);break}return[...n].sort()}function ls(){let e=R(),n=e.agent.session.resolveStorePath(void 0,{agentId:"main"}),t=e.agent.session.loadSessionStore(n,{skipCache:!0});return Object.keys(t).filter(X)}function gs(e,n){let t=xe(e);if(t)return ys(t,n);let s=nt(e);return s?!(n.jobId&&s.jobId!==n.jobId||n.myAgentId&&s.myAgentId!==n.myAgentId||n.toAgentId&&s.toAgentId!==n.toAgentId||n.myXmtpAddress&&!n.myAgentId||n.toXmtpAddress&&!n.toAgentId):!n.jobId||n.myAgentId||n.toAgentId||n.myXmtpAddress||n.toXmtpAddress?!1:Y(e)===n.jobId}function fs(e){return"myAgentId"in e?{myAgentId:e.myAgentId,toAgentId:e.toAgentId,jobId:e.jobId}:{myXmtpAddress:e.myXmtpAddress,toXmtpAddress:e.toXmtpAddress,jobId:e.jobId}}function nt(e){let n=e.split(":"),t=n.indexOf("job");return t<0||n[t+2]!=="my"||n[t+4]!=="to"||!n[t+1]||!n[t+3]||!n[t+5]?null:{jobId:ye(n[t+1]),myAgentId:ye(n[t+3]),toAgentId:ye(n[t+5])}}function ps(e){return e.startsWith("backup:")?ye(e.slice(7)):null}function ys(e,n){return n.jobId&&e.jobId!==n.jobId?!1:"myAgentId"in e?!(n.myAgentId&&e.myAgentId!==n.myAgentId||n.toAgentId&&e.toAgentId!==n.toAgentId||n.myXmtpAddress&&!n.myAgentId||n.toXmtpAddress&&!n.toAgentId):!(n.myXmtpAddress&&e.myXmtpAddress.toLowerCase()!==n.myXmtpAddress.toLowerCase()||n.toXmtpAddress&&e.toXmtpAddress.toLowerCase()!==n.toXmtpAddress.toLowerCase()||n.myAgentId&&!n.myXmtpAddress||n.toAgentId&&!n.toXmtpAddress)}function ye(e){try{return decodeURIComponent(e)}catch{return e}}var V,P=E(()=>{"use strict";I();V=require("openclaw/plugin-sdk/routing");q();Vn()});var ct={};ce(ct,{callChatInject:()=>Q,callGateway:()=>_,callSessionsCreate:()=>J,callSessionsDelete:()=>Be,callSessionsSend:()=>He,formatPairingErrorHint:()=>Ie,onGatewayEvent:()=>Ge,resolveGatewayRuntimeConfig:()=>je,stopGatewayClient:()=>qe,syncGatewayConfigForNodeDaemon:()=>Fe});function Le(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}}function Ss(e){return e&&(typeof e=="string"?{type:"string",configured:!0}:typeof e=="object"&&e!==null&&"env"in e?{type:"env",env:String(e.env),configured:!!Le(e)}:{type:typeof e,configured:!0})}function Ue(e){if(!e||typeof e!="object")return e??null;if(Array.isArray(e))return e.map(t=>Ue(t));let n={};for(let[t,s]of Object.entries(e)){if(/password|token|secret/i.test(t)){n[t]=Ss(s);continue}n[t]=Ue(s)}return n}function _s(e){try{return JSON.stringify(e)}catch{return"[unserializable]"}}function As(e){let n=e.params;if(!n||typeof n!="object"||Array.isArray(n))return z({taskId:e.taskId});let t=n;return z({taskId:e.taskId,sessionKey:typeof t.sessionKey=="string"?t.sessionKey:typeof t.key=="string"?t.key:""})}function dt(e){let n={};for(let[t,s]of Object.entries(e))s!=null&&(n[t]=String(s));return n}function S(e,n={}){let t=dt({phase:e,...n});u(`[gateway] ${e}: ${JSON.stringify(t)}`),g.info(e.startsWith("request_")?a.GATEWAY_REQUEST:a.GATEWAY_STARTED,{component:"openclaw_gateway",...t})}function L(e,n,t={},s=a.GATEWAY_CONNECT_FAILED){let r=dt({phase:e,component:"openclaw_gateway",...t});u(`[gateway] ${e}:`,n),g.error(s,n instanceof Error?n:new Error(String(n)),r)}function hs(e){for(let n of $e)try{n(e)}catch(t){u("[gateway] event handler failed:",t)}}function Ge(e){return $e.add(e),()=>{$e.delete(e)}}function st(){S("ready_gate_reset",{hasSharedClient:!!T,hasConnected:h}),x=new Promise((e,n)=>{me=e,Ee=n})}function rt(e,n,t){if(T!==e){S(`${n}_skip_clear_noncurrent`,t);return}try{e.stop?.()}catch(s){L(`${n}_stop_failed`,s,t)}T=null,h=!1,x=null,me=null,Ee=null,S(`${n}_cleared_client`,t)}function Ts(){if(T)return S("reuse_client",{hasConnected:h,hasReadyPromise:!!x}),{client:T,ready:x};let e=je(),{url:n,password:t,token:s}=e,r=(0,Me.randomUUID)(),o=++Is;st(),S("init_client",{clientSeq:o,instanceId:r,url:n,hasGatewayConfig:!!e.rawGatewayConfig,gatewayConfig:_s(Ue(e.rawGatewayConfig)),passwordConfigured:!!t,tokenConfigured:!!s,scopes:tt.join(",")});let i=new at.GatewayClient({url:n,password:t,token:s,instanceId:r,clientName:"gateway-client",clientDisplayName:"okx-a2a-plugin",mode:"backend",role:"operator",scopes:[...tt],onHelloOk:()=>{S("hello_ok",{clientSeq:o,instanceId:r,url:n}),h=!0,me?.()},onEvent:hs,onClose:(d,c)=>{if(u(`[gateway] closed (${d}): ${c||"no reason"}`),g.info(a.GATEWAY_DISCONNECTED,{clientSeq:String(o),instanceId:r,url:n,code:String(d),reason:c||"no-reason",hadConnected:String(h)}),h){h=!1,st();return}rt(i,"close_before_connect",{clientSeq:o,instanceId:r,url:n,code:d,reason:c||"no-reason"})},onConnectError:d=>{let c=d;if(c?.retryable){L("connect_error_retryable",d,{clientSeq:o,instanceId:r,url:n,retryable:"true",reason:c?.details?.reason??"retryable",code:c?.gatewayCode??c?.details?.code});return}L("connect_error",d,{clientSeq:o,instanceId:r,url:n,retryable:"false",code:c?.gatewayCode??c?.details?.code}),Ee?.(d instanceof Error?d:new Error(String(d))),rt(i,"connect_error",{clientSeq:o,instanceId:r,url:n,code:c?.gatewayCode??c?.details?.code,reason:c?.details?.reason})}});return T=i,S("start_client",{clientSeq:o,instanceId:r,url:n}),i.start(),{client:i,ready:x}}function je(){let n=R().config.loadConfig().gateway;return{url:`ws://127.0.0.1:${ot(process.env.OPENCLAW_GATEWAY_PORT)??ot(n?.port)??Es}`,password:Le(n?.auth?.password),token:Le(n?.auth?.token),rawGatewayConfig:n}}function ot(e){if(typeof e=="number"&&Number.isFinite(e)){let s=Math.trunc(e);return s>0&&s<=65535?s:null}if(typeof e!="string")return null;let n=e.trim();if(!/^\d+$/.test(n))return null;let t=Number.parseInt(n,10);return t>0&&t<=65535?t:null}function Fe(){let e=je();try{let n=qn({url:e.url,password:e.password,token:e.token});return S("synced_node_gateway_config",{path:n,url:e.url,passwordConfigured:!!e.password,tokenConfigured:!!e.token}),n}catch(n){return L("sync_node_gateway_config_failed",n,{url:e.url,passwordConfigured:!!e.password,tokenConfigured:!!e.token},a.GATEWAY_CONNECT_FAILED),null}}function qe(){if(T){try{T.stop()}catch{}T=null,x=null,me=null,Ee=null,h=!1}}function Ie(e){let n=e,t=n?.gatewayCode??n?.details?.code;if(!t)return null;let s=n?.details??{},r=[`code=${t}`];s.reason&&r.push(`reason=${s.reason}`),s.authReason&&r.push(`authReason=${s.authReason}`),Array.isArray(s.requestedScopes)&&s.requestedScopes.length&&r.push(`requestedScopes=${s.requestedScopes.join(",")}`),s.deviceId&&r.push(`deviceId=${s.deviceId}`),s.requestId&&r.push(`requestId=${s.requestId}`);let o=` (${r.join(", ")})`;switch(t){case"NOT_PAIRED":case"PAIRING_REQUIRED":return`Device pairing approval pending${o}. On the openclaw host run \`openclaw devices approve --latest\` to review and approve the pending request, then retry.`;case"AUTH_SCOPE_MISMATCH":return`Existing device token lacks the required scope${o}. On the openclaw host run \`openclaw devices list\` to find the operator deviceId, then \`openclaw devices rotate --device <id> --role operator --scope operator.admin\` to reissue a token with operator.admin, and restart openclaw.`;case"AUTH_TOKEN_MISSING":case"AUTH_TOKEN_MISMATCH":case"AUTH_DEVICE_TOKEN_MISMATCH":return`Gateway device token is missing or stale${o}. On the openclaw host run \`openclaw devices list\`, then \`openclaw devices remove <deviceId>\`, then restart openclaw to re-pair.`;default:return null}}async function _(e){let n=e.timeoutMs??ms,t=Date.now(),s=As(e);S("request_start",{method:e.method,timeoutMs:n,hasSharedClient:!!T,hasConnected:h,...s});let{client:r,ready:o}=Ts();try{await o}catch(d){let c=Date.now()-t;throw L("request_ready_failed",d,{method:e.method,durationMs:c,timeoutMs:n,...s,code:d?.gatewayCode??d?.code??d?.details?.code,reason:"gateway_ready_failed",communicationClass:"openclaw_gateway_connect"},a.GATEWAY_REQUEST_FAILED),d}let i=Date.now()-t;S("request_ready",{method:e.method,readyWaitMs:i,timeoutMs:n,hasConnected:h,...s});try{let d=await r.request(e.method,e.params,{timeoutMs:n});return S("request_done",{method:e.method,durationMs:Date.now()-t,timeoutMs:n,...s}),d}catch(d){let c=Date.now()-t,l=/timeout|timed out/i.test(String(d?.message??d??""));L("request_error",d,{method:e.method,durationMs:c,timeoutMs:n,readyWaitMs:i,...s,isTimeout:l,code:d?.gatewayCode??d?.code??d?.details?.code,reason:l?"gateway_request_timeout":"gateway_request_error",communicationClass:"openclaw_gateway_rpc"},a.GATEWAY_REQUEST_FAILED);let f=Ie(d);if(f){let p=d?.message??String(d);try{d.message=`${p}
4
- ${f}`}catch{}}throw d}}async function J(e){return _({method:"sessions.create",params:e})}async function Be(e){return _({method:"sessions.delete",params:e})}async function He(e){let n=e.idempotencyKey??(0,Me.randomUUID)(),t={key:e.key,message:e.message,idempotencyKey:n};try{let s=await _({method:"sessions.send",params:t});return{runId:it(s),raw:s}}catch(s){let r=s?.gatewayCode??s?.code,o=String(s?.message??"");if(r==="INVALID_REQUEST"&&o.includes("session not found")){await J({key:e.key}),g.info(a.SESSION_AUTO_RECOVERED,{sessionKey:e.key,trigger:"sessions.send"});let i=await _({method:"sessions.send",params:t});return{runId:it(i),raw:i}}throw s}}function it(e){if(!e||typeof e!="object")return;let n=e.runId;return typeof n=="string"&&n.trim()?n:void 0}async function Q(e){try{return await _({method:"chat.inject",params:e})}catch(n){let t=n?.gatewayCode??n?.code,s=String(n?.message??"");if(t==="INVALID_REQUEST"&&s.includes("session not found"))return await J({key:e.sessionKey}),g.info(a.SESSION_AUTO_RECOVERED,{sessionKey:e.sessionKey,trigger:"chat.inject"}),await _({method:"chat.inject",params:e});throw n}}var at,Me,ms,Es,tt,Is,T,x,me,Ee,h,$e,U=E(()=>{"use strict";I();at=require("openclaw/plugin-sdk/gateway-runtime"),Me=require("node:crypto");q();D();Bn();P();ms=2e4,Es=18789,tt=["operator.admin"],Is=0;T=null,x=null,me=null,Ee=null,h=!1,$e=new Set});function ft(e){if(e.toolName!=="exec")return null;let n=e.sessionKey?.trim(),t=new Set;for(let o of e.routeSessionKeys??[]){let i=o?.trim();i&&t.add(i)}if(n&&t.add(n),t.size===0)return null;Xe(n);let s=e.params??{},r=Us(s.env)?s.env:{};return{...s,env:{...r,[Ns]:"openclaw",[Ds]:"openclaw-gateway",[Os]:"1",[ws]:n??[...t][0],[Rs]:JSON.stringify([...t])}}}function pt(e){let n=e.runId?.trim(),t=e.sessionKey?.trim();if(!t||!te(t))return!1;Ye();let s=xs([t,...e.routeSessionKeys??[]]);return Cs(t,s),n&&ne.set(n,{sessionKeys:s,updatedAt:Date.now()}),!0}function yt(e){let n=typeof e=="string"?e.trim():e?.runId?.trim(),t=typeof e=="string"?null:e?.sessionKey?.trim();n&&ne.delete(n),t&&te(t)&&vs(t)}function Se(e){let n=new Set,t=e.sessionKey?.trim();t&&te(t)&&n.add(t);let s=e.runId?.trim();if(s){Ye(e.now??Date.now());let r=ne.get(s);for(let o of r?.sessionKeys??[])n.add(o)}else if(!t||!te(t))for(let r of Ps(e.now??Date.now()))n.add(r);return[...n]}function Xe(e){let n=e?.trim();!n||!Ks(n)||(Z={sessionKey:n,updatedAt:Date.now()})}function mt(e=Date.now()){return Z?e-Z.updatedAt>bs?(Z=null,null):Z.sessionKey:null}function Ks(e){return e.startsWith("job:")||e.startsWith("backup:")||/(?:^|[?&:])job=([^:&]+)/.test(e)}function te(e){if(e==="agent:main")return!0;let n=e.split(":");if(n.length<4||n[0]!=="agent"||!n[1])return!1;let t=n[2];return!!(t&&t!=="okx-a2a"&&!ks.has(t))}function Ye(e=Date.now()){for(let[n,t]of ne)e-t.updatedAt>lt&&ne.delete(n);for(let[n,t]of w)e-t.updatedAt>lt&&w.delete(n)}function Cs(e,n){let t=w.get(e);w.set(e,{count:(t?.count??0)+1,updatedAt:Date.now(),routeSessionKeys:n}),We()}function vs(e){let n=w.get(e);if(n){if(n.count<=1){w.delete(e),We();return}w.set(e,{count:n.count-1,updatedAt:Date.now(),routeSessionKeys:n.routeSessionKeys}),We()}}function Ps(e=Date.now()){Ye(e);let n=[...w.keys()];return n.length!==1?[]:w.get(n[0])?.routeSessionKeys??[]}function xs(e){let n=new Set;for(let t of e){let s=t?.trim();s&&te(s)&&n.add(s)}return[...n]}function We(){try{let e=Ls();(0,$.mkdirSync)((0,ee.dirname)(e),{recursive:!0,mode:448});let t={version:1,updatedAt:Date.now(),origins:[...w.entries()].map(([r,o])=>({sessionKey:r,count:o.count,updatedAt:o.updatedAt,routeSessionKeys:o.routeSessionKeys}))},s=`${e}.${process.pid}.tmp`;(0,$.writeFileSync)(s,`${JSON.stringify(t)}
5
- `,{encoding:"utf8",mode:384}),(0,$.renameSync)(s,e)}catch(e){console.log(`[okx-a2a:hook] failed to persist gateway route origins: ${e instanceof Error?e.message:String(e)}`)}}function Ls(e=process.env){let n=e.OKX_AGENT_TASK_HOME?.trim()||(0,ee.join)((0,gt.homedir)(),".okx-agent-task");return(0,ee.join)(n,"run","gateway-route-origins.json")}function Us(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var $,gt,ee,ws,Rs,Ns,Ds,Os,bs,lt,ks,Z,ne,w,Ve=E(()=>{"use strict";$=require("node:fs"),gt=require("node:os"),ee=require("node:path"),ws="OKX_A2A_CURRENT_GATEWAY_SESSION_KEY",Rs="OKX_A2A_CURRENT_GATEWAY_SESSION_KEYS",Ns="OKX_A2A_GATEWAY_PROVIDER",Ds="OKX_A2A_RUNTIME_CONTEXT",Os="OKX_A2A_IN_GATEWAY",bs=12e4,lt=30*6e4,ks=new Set(["heartbeat","cron","webhook","voice"]),Z=null,ne=new Map,w=new Map});function Ms(e=process.env){return e.OKX_AGENT_TASK_HOME?.trim()||(0,Je.join)((0,It.homedir)(),".okx-agent-task")}function Gs(e=process.env){return e.OKX_A2A_SESSION_STORE_DB_PATH?.trim()||(0,Je.join)(Ms(e),"sqlite","session-store.sqlite")}function _e(e){let n=A(e.jobId)??Y(e.sessionKey);return n?js(Fs(n,e.dbPath??Gs())):[]}function js(e){let n=new Set,t=[];for(let s of e){let r=ze(A(s.gatewaySessionKey)??A(s.sessionKey)??""),o=Hs(r);!r||!o||n.has(o)||(n.add(o),t.push(r))}return t}function Fs(e,n){if(!(0,Et.existsSync)(n))return[];let{DatabaseSync:t}=qs(),s=new t(n,{readOnly:!0});try{if(s.exec("PRAGMA busy_timeout=5000"),!s.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='job_provider_bindings'").get())return[];let o=s.prepare("SELECT provider, gateway_routes_json FROM job_provider_bindings WHERE job_id = ?").get(e);return o?.provider!=="openclaw"||typeof o.gateway_routes_json!="string"?[]:Bs(o.gateway_routes_json)}catch(r){return console.log(`[okx-a2a:stored-routes] failed to resolve job route jobId=${e}: ${r instanceof Error?r.message:String(r)}`),[]}finally{s.close()}}function qs(){let e=process.emitWarning;process.emitWarning=((n,...t)=>{if(!((typeof n=="string"?n:n.message).includes("SQLite is an experimental feature")&&t.some(r=>r==="ExperimentalWarning")))return e.call(process,n,...t)});try{return require("node:sqlite")}finally{process.emitWarning=e}}function Bs(e){try{let n=JSON.parse(e);if(!Array.isArray(n))return[];let t=[];for(let s of n){if(!Xs(s))continue;let r=A(typeof s.platform=="string"?s.platform:null),o=ze(A(typeof s.sessionKey=="string"?s.sessionKey:null)??"");if(!r||!o)continue;let i=ze(A(typeof s.gatewaySessionKey=="string"?s.gatewaySessionKey:null)??""),d=A(typeof s.chatId=="string"?s.chatId:null),c=A(typeof s.threadId=="string"?s.threadId:null),l=A(typeof s.updatedAt=="string"?s.updatedAt:null);t.push({platform:r,sessionKey:o,...i?{gatewaySessionKey:i}:{},...d?{chatId:d}:{},...c?{threadId:c}:{},...l?{updatedAt:l}:{}})}return t}catch{return[]}}function Hs(e){let n=A(e);if(!n)return null;if(n==="agent:main")return"main";if(n.startsWith("backup:"))return null;let t=n.split(":");if(t.length<4||t[0]!=="agent"||!t[1])return null;let s=t[2];return!s||s==="okx-a2a"||s==="backup"||$s.has(s)?null:s}function ze(e){let n=A(e);if(!n)return"";let t=n.split(":");if(t.length<4||t[0]!=="agent")return n;let s=t[2],r=t[3];if(s!=="telegram")return n;if((r==="direct"||r==="dm")&&t[4]){let o=Ws(t.slice(5));return o?`agent:${t[1]}:telegram:direct:${t[4]}:topic:${o}`:`agent:${t[1]}:telegram:direct:${t[4]}`}if(r==="group"&&t[4]){let o=t[5]==="topic"?t[6]:t[5];return o?`agent:${t[1]}:telegram:group:${t[4]}:topic:${o}`:`agent:${t[1]}:telegram:group:${t[4]}`}return n}function Ws(e){if(e.length!==0)return e[0]==="topic"?e[1]||void 0:e[0]==="thread"?e.length>=3?e.slice(2).join(":")||void 0:e[1]||void 0:e[0]||void 0}function Xs(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function A(e){let n=e?.trim();return n||null}var Et,It,Je,$s,Qe=E(()=>{"use strict";Et=require("node:fs"),It=require("node:os"),Je=require("node:path");P();$s=new Set(["heartbeat","cron","webhook","voice"])});function nn(e){let n=k(e.jobId)??Qs([e.content,...e.contents??[]]);if(!n)return console.log("[okx-a2a:stored-routes] skipped delivered route bind reason=missing_job_id"),[];let t=e.sessionKeys.map(i=>Vs(i)).filter(i=>!!i);if(t.length===0)return[];let s=e.dbPath??er(),{DatabaseSync:r}=nr(),o=new r(s);try{o.exec("PRAGMA busy_timeout=5000"),o.exec(`
2
+ "use strict";var Ft=Object.create;var de=Object.defineProperty;var qt=Object.getOwnPropertyDescriptor;var Bt=Object.getOwnPropertyNames;var Ht=Object.getPrototypeOf,Wt=Object.prototype.hasOwnProperty;var E=(e,n)=>()=>(e&&(n=e(e=0)),n);var ce=(e,n)=>{for(var t in n)de(e,t,{get:n[t],enumerable:!0})},On=(e,n,t,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of Bt(n))!Wt.call(e,r)&&r!==t&&de(e,r,{get:()=>n[r],enumerable:!(s=qt(n,r))||s.enumerable});return e};var Yt=(e,n,t)=>(t=e!=null?Ft(Ht(e)):{},On(n||!e||!e.__esModule?de(t,"default",{value:e,enumerable:!0}):t,e)),Xt=e=>On(de({},"__esModule",{value:!0}),e);function Vt(e=new Date){return e.toLocaleString(void 0,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3,hour12:!1})}function bn(e){return[`[${Vt()}]`,...e]}function u(...e){console.error(...bn(e))}function kn(...e){console.warn(...bn(e))}var I=E(()=>{"use strict"});function Kn(e){be=e}function R(){if(!be)throw new Error("[xmtp] PluginRuntime not initialized \u2014 ensure setXmtpRuntime is called in register()");return be}var be,q=E(()=>{"use strict";be=null});var a,ke=E(()=>{"use strict";a={GATEWAY_STARTED:"Gateway started",GATEWAY_STOPPED:"Gateway stopped",BOOTSTRAP_APPLIED:"Bootstrap applied",CHANNEL_READY:"Channel ready",CONVERSATION_STARTED:"Conversation started",EVALUATE_CONVERSATION_STARTED:"Evaluate conversation started",CONVERSATION_DELETED:"Conversation deleted",PENDING_CONVERSATION_DENIED:"Pending conversation denied",AGENTS_REFRESHED:"Agents refreshed",USER_DISPATCHED:"User dispatched",SESSION_DISPATCHED:"Session dispatched",SYNC_TICK_COMPLETED:"Sync tick completed",INBOUND_HANDLER_ENTERED:"Inbound handler entered",MESSAGE_RECEIVED:"Message received",MESSAGE_SENT:"Message sent",INBOUND_BUYER_PENDING:"Inbound buyer: no session, group still Unknown (pending)",INBOUND_BUYER_SESSION_AUTO_RECOVERED:"Inbound buyer: session missing for Allowed group, auto-recovered",INBOUND_BLOCKED_SENSITIVE:"Inbound blocked: sensitive word; reply sent",INBOUND_BLOCKED_ADDRESS_MISMATCH:"Inbound blocked: address mismatch",INBOUND_BLOCKED_INELIGIBLE:"Inbound blocked: message-eligible check failed",INBOUND_DROP_EMPTY_CONTENT:"Inbound drop: empty content",INBOUND_DROP_MISSING_JOBID:"Inbound drop: missing jobId",INBOUND_DROP_UNSUPPORTED_MSGTYPE:"Inbound drop: unsupported msgType",INBOUND_DROP_DM_NON_SYSTEM:"Inbound drop: DM sender not in system whitelist",INBOUND_DROP_DM_INVALID_PAYLOAD:"Inbound drop: DM payload invalid",INBOUND_DROP_DM_UNKNOWN_AGENT:"Inbound drop: DM target agent not local",DM_FALLBACK_TO_BACKUP:"DM fallback to backup session",DM_WHITELIST_FAIL_OPEN:"DM whitelist fail-open (empty system accounts)",FILE_UPLOADED:"File uploaded",FILE_DOWNLOADED:"File downloaded",PENDING_LIST_QUERIED:"Pending list queried",AGENT_LIST_QUERIED:"Agent list queried",SESSION_KEY_DERIVED:"Session key derived",CONVERSATION_HISTORY_QUERIED:"Conversation history queried",SESSIONS_QUERIED:"Sessions queried",GROUP_CONSENT_CHANGED:"Group consent changed",SESSION_CREATED:"Session created",SESSION_DELETED:"Session deleted",SESSION_AUTO_RECOVERED:"Session auto-recovered",INBOUND_DELIVERED:"Inbound delivered to session",DM_DELIVERED:"DM delivered to session",OUTBOUND_ELIGIBILITY_CHECKED:"Outbound eligibility checked",AGENT_CLIENT_CREATED:"Agent client created",AGENT_CLIENT_REMOVED:"Agent client removed",ADDRESS_SYNC_COMPLETED:"Address sync completed",AGENT_REFRESH_SESSION_EXPIRED:"Agent refresh aborted: onchainos session expired, local clients taken offline",OFFLINE_REPLAY_MESSAGE_REPLAYED:"Offline replay message replayed",AGENTS_WAKEUP_NOTIFIED:"Agents wakeup notified",CONFIG_SENSITIVE_WORDS_REFRESHED:"Sensitive words config refreshed",CONFIG_SYSTEM_REFRESHED:"System config refreshed",GATEWAY_DISCONNECTED:"Gateway disconnected",GATEWAY_REQUEST:"Gateway request",GATEWAY_DELIVERY_BUFFERED:"Gateway delivery buffered",DAEMON_LIFECYCLE_SKIPPED:"Daemon lifecycle skipped",DAEMON_LIFECYCLE_REQUESTED:"Daemon lifecycle requested",PROMPT_USER_CHECKPOINT:"Prompt user checkpoint",USER_WATCH_STARTED:"User watch started",USER_WATCH_EVENT_DELIVERED:"User watch event delivered",INBOUND_DM_RAW:"Inbound DM raw",INBOUND_GROUP_RAW:"Inbound group raw",SYSTEM_NOTIFICATION_RECEIVED:"System notification received",SYSTEM_NOTIFICATION_ROUTED:"System notification routed",HERMES_SESSION_ROUTE_BINDING:"Hermes session route binding",DOCTOR_REPORT:"Doctor report",XMTP_CONNECTION_FAILED:"XMTP connection failed",CONVERSATIONS_STREAM_FAILED:"conversations.stream failed",AGENT_START_FAILED:"agent.start failed",AGENT_STREAM_ERROR:"agent stream error",BOOTSTRAP_FAILED:"Bootstrap failed",ONCHAINOS_SESSION_EXPIRED:"Onchainos session expired",ONCHAINOS_CLI_ERROR:"Onchainos CLI error",HEARTBEAT_FAILED:"Heartbeat failed",HEARTBEAT_SKIPPED:"Heartbeat skipped",HEARTBEAT_GATEWAY_CHECK_FAILED:"Heartbeat gateway check failed",MESSAGE_PARSE_FAILED:"Message parse failed",MESSAGE_HANDLER_ERROR:"Message handler error",OFFLINE_REPLAY_FAILED:"Offline replay failed",INBOUND_ROUTING_FAILED:"Inbound routing failed",CONVERSATION_NOT_FOUND:"Conversation not found for send",XMTP_SEND_FAILED:"XMTP send failed",AGENT_REFRESH_FAILED:"Agent refresh failed",GROUP_CONSENT_UPDATE_FAILED:"Group consent update failed",TOOL_EXECUTE_FAILED:"Tool execute failed",AGENT_RESOLUTION_FAILED:"Agent resolution failed",USER_DISPATCH_FAILED:"User dispatch failed",INBOUND_ELIGIBILITY_BYPASSED:"Inbound eligibility bypassed",INBOUND_ADDRESS_CHECK_FAILED:"Inbound address check failed",INBOUND_ADDRESS_CHECK_BYPASSED:"Inbound address check bypassed",INBOUND_SENSITIVE_CHECK_FAILED:"Inbound sensitive check failed",FILE_UPLOAD_FAILED:"File upload failed",FILE_DOWNLOAD_FAILED:"File download failed",OFFLINE_REPLAY_MESSAGE_FAILED:"Offline replay message failed",PENDING_NOTIFICATION_FAILED:"Pending notification failed",GATEWAY_CONNECT_FAILED:"Gateway connect failed",GATEWAY_REQUEST_FAILED:"Gateway request failed",PROMPT_USER_FAILED:"Prompt user failed",DAEMON_COMMAND_FAILED:"Daemon command failed",DAEMON_COMMAND_TIMEOUT:"Daemon command timeout",DAEMON_COMMAND_STALE:"Daemon command stale",DAEMON_LIFECYCLE_FAILED:"Daemon lifecycle failed",DAEMON_TICK_FAILED:"Daemon tick failed",DIRECT_CLI_FAILED:"Direct CLI failed",DOCTOR_NOT_READY:"Doctor not ready",DOCTOR_CRASHED:"Doctor crashed",AI_RUN_FAILED:"AI run failed",AI_RUN_TIMEOUT:"AI run timeout",AI_RUN_TOOL_FAILED:"AI run tool failed",IPC_FAILED:"IPC failed",NOTIFY_AGENTS_WAKEUP_FAILED:"Notify agents wakeup failed",OUTBOUND_AGENT_LOOKUP_FAILED:"Outbound agent lookup failed",OUTBOUND_ELIGIBILITY_CHECK_FAILED:"Outbound eligibility check failed",OUTBOUND_ELIGIBILITY_BYPASSED:"Outbound eligibility bypassed",OUTBOUND_BLOCKED_INELIGIBLE:"Outbound blocked: message-eligible check failed",CACHE_LOAD_FAILED:"Cache load failed",CACHE_WRITE_FAILED:"Cache write failed",CONFIG_LOAD_FAILED:"Config load failed",SENTRY_INIT_SKIPPED:"Sentry init skipped",AGENT_DB_DIR_CREATE_FAILED:"Agent DB dir create failed"}});var y,xn,Cn,vn,zt,Jt,Qt,Zt,es,ue,Pn,Ke,g,Ln,Un,N=E(()=>{"use strict";I();y=Yt(require("@sentry/node")),xn=require("node:crypto");ke();ke();Cn=(0,xn.randomUUID)(),vn=new Set(["args","apikey","argv","auth","authorization","authtoken","bearer","body","cache","command","content","credential","credentials","cwd","data","error","failures","filename","file_name","filepath","file_path","headers","input","logpath","message","output","password","params","path","payload","privatekey","prompt","raw","rawevent","rawtext","request","response","accesstoken","refreshtoken","digest","nonce","salt","secret","token","stderr","stdout","title","tooloutput"]),zt=["accesstoken","apikey","authorization","authtoken","content","credential","filepath","logpath","outputpath","password","payload","privatekey","prompt","rawevent","rawtext","refreshtoken","requestbody","responsebody","secret","stderr","stdout","token","tooloutput"],Jt=new Set(["onchainosagentlistresultjson","onchainosagentlistdiagnostictext"]),Qt=new Set(["agentPlatform","cacheName","checkpoint","code","communicationClass","component","eventName","exitCode","kind","method","onchainosAgentId","operation","phase","platform","provider","reason","role","source","stage","status","subcommand","taskId","type"]),Zt=["eventName","cacheName","checkpoint","component","method","operation","phase","reason","code","provider","type","kind","status","subcommand"],es=new Set([a.GATEWAY_STARTED,a.GATEWAY_STOPPED,a.GATEWAY_DISCONNECTED,a.GATEWAY_REQUEST,a.GATEWAY_DELIVERY_BUFFERED,a.DAEMON_LIFECYCLE_SKIPPED,a.DAEMON_LIFECYCLE_REQUESTED,a.PROMPT_USER_CHECKPOINT,a.USER_WATCH_STARTED,a.USER_WATCH_EVENT_DELIVERED,a.CHANNEL_READY,a.CONVERSATION_STARTED,a.EVALUATE_CONVERSATION_STARTED,a.CONVERSATION_DELETED,a.USER_DISPATCHED,a.SESSION_DISPATCHED,a.SESSION_CREATED,a.SESSION_DELETED,a.SESSION_AUTO_RECOVERED,a.INBOUND_DELIVERED,a.INBOUND_DM_RAW,a.INBOUND_GROUP_RAW,a.SYSTEM_NOTIFICATION_RECEIVED,a.SYSTEM_NOTIFICATION_ROUTED,a.HERMES_SESSION_ROUTE_BINDING,a.INBOUND_BLOCKED_ADDRESS_MISMATCH,a.INBOUND_BLOCKED_INELIGIBLE,a.INBOUND_BLOCKED_SENSITIVE,a.INBOUND_DROP_DM_INVALID_PAYLOAD,a.INBOUND_DROP_DM_NON_SYSTEM,a.INBOUND_DROP_DM_UNKNOWN_AGENT,a.INBOUND_DROP_EMPTY_CONTENT,a.INBOUND_DROP_MISSING_JOBID,a.INBOUND_DROP_UNSUPPORTED_MSGTYPE,a.DM_DELIVERED,a.DM_FALLBACK_TO_BACKUP,a.DM_WHITELIST_FAIL_OPEN,a.INBOUND_BUYER_PENDING,a.INBOUND_BUYER_SESSION_AUTO_RECOVERED,a.MESSAGE_SENT,a.AGENT_CLIENT_CREATED,a.AGENT_CLIENT_REMOVED,a.ADDRESS_SYNC_COMPLETED,a.AGENTS_REFRESHED,a.AGENTS_WAKEUP_NOTIFIED,a.AGENT_LIST_QUERIED,a.BOOTSTRAP_APPLIED,a.CONFIG_SENSITIVE_WORDS_REFRESHED,a.CONFIG_SYSTEM_REFRESHED,a.CONVERSATION_HISTORY_QUERIED,a.FILE_DOWNLOADED,a.FILE_UPLOADED,a.GROUP_CONSENT_CHANGED,a.INBOUND_HANDLER_ENTERED,a.MESSAGE_RECEIVED,a.OFFLINE_REPLAY_MESSAGE_REPLAYED,a.AGENT_REFRESH_SESSION_EXPIRED,a.OUTBOUND_ELIGIBILITY_CHECKED,a.OUTBOUND_BLOCKED_INELIGIBLE,a.PENDING_CONVERSATION_DENIED,a.PENDING_LIST_QUERIED,a.SESSION_KEY_DERIVED,a.SESSIONS_QUERIED,a.SYNC_TICK_COMPLETED]),ue=256,Pn=128,Ke=class e{static instance;initialized=!1;buffer=[];constructor(){}static getInstance(){return e.instance||(e.instance=new e),e.instance}init(n){if(this.initialized){kn("[logger] Already initialized, skipping.");return}try{y.init({dsn:n.dsn,release:n.release,environment:n.environment,maxBreadcrumbs:0,beforeBreadcrumb:()=>null,isInner:!1}),y.setTags({projectName:n.projectName,agentPlatform:n.agentPlatform})}catch{return}this.initialized=!0,this.flush()}info(n,t){let s=e.sanitizeExtra({flowId:Cn,...t??{}});if(es.has(n)){if(!this.initialized){this.buffer.push({level:"info",message:n,extra:s});return}try{y.withScope(r=>{e.applyDiagnostics(r,n,s),y.captureEvent({level:"info",message:n,extra:{...s,eventName:n}})})}catch{}}}error(n,t,s){let r=e.sanitizeExtra({flowId:Cn,...s??{}});if(!this.initialized){this.buffer.push({level:"error",message:n,error:t,extra:r});return}try{y.withScope(o=>{o.setLevel("error"),e.applyDiagnostics(o,n,r),y.captureException(e.createSentryEvent(n),{extra:t?{...r,eventName:n,errorName:t.name,errorMessageLength:String(t.message.length)}:r})})}catch{}}async shutdown(){try{await y.close(5e3)}catch{await y.flush(5e3)}}flush(){for(;this.buffer.length>0;){let n=this.buffer.shift();n.level==="info"?this.info(n.message,n.extra):this.error(n.message,n.error,n.extra)}}static sanitizeExtra(n){return Object.fromEntries(Object.entries(n).filter(([,t])=>t!==void 0).filter(([t])=>!e.isBlockedExtraKey(t)).map(([t,s])=>[t,e.safeValueForKey(t,s)]))}static isBlockedExtraKey(n){let t=n.toLowerCase(),s=e.normalizeSensitiveKey(n);return vn.has(t)||vn.has(s)?!0:e.isSafeMetricKey(s)?!1:zt.some(r=>s.includes(r))}static isSafeMetricKey(n){return/(bytes|count|length|ms|size)$/.test(n)}static safeValueForKey(n,t){return typeof t=="string"&&Jt.has(e.normalizeSensitiveKey(n))?t:e.safeValue(t)}static normalizeSensitiveKey(n){return n.toLowerCase().replace(/[^a-z0-9]/g,"")}static safeValue(n){if(typeof n=="string")return n.length<=ue?n:`${n.slice(0,ue)}...`;if(n==null||typeof n=="number"||typeof n=="boolean")return n;if(typeof n=="bigint")return n.toString();if(n instanceof Error)return{name:n.name,messageLength:n.message.length};if(Array.isArray(n))return n.slice(0,20).map(s=>e.safeValue(s));if(typeof n=="object")return Object.fromEntries(Object.entries(n).slice(0,50).filter(([,s])=>s!==void 0).filter(([s])=>!e.isBlockedExtraKey(s)).map(([s,r])=>[s,e.safeValueForKey(s,r)]));let t=String(n);return t.length<=ue?t:`${t.slice(0,ue)}...`}static tagValue(n){let t=String(n);return t.length<=Pn?t:`${t.slice(0,Pn)}...`}static normalizeTagKey(n){return n.replace(/[^A-Za-z0-9_.:-]+/g,"_").slice(0,32)||"unknown"}static applyDiagnostics(n,t,s){let r={eventName:t,...s};for(let[i,d]of Object.entries(r))Qt.has(i)&&n.setTag(e.normalizeTagKey(i),e.tagValue(d));let o=["a2a",t];for(let i of Zt){let d=r[i];d&&o.push(`${i}:${e.tagValue(d)}`)}n.setFingerprint(o)}static toPascalCase(n){return n.split(/[\s:]+/).filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}static createSentryEvent(n){let t=new Error(n);return t.name=e.toPascalCase(n),t.stack=`${t.name}: ${n}`,t}},g=Ke.getInstance(),Ln=e=>g.init(e),Un=()=>g.shutdown()});function Ce(){return v||(process.env.OKX_AGENT_TASK_HOME?(v=le(process.env.OKX_AGENT_TASK_HOME),v):(v=le((0,ge.join)(ss(),".okx-agent-task")),v))}function le(e){return ts(e)}function ts(e){(0,fe.mkdirSync)(e,{recursive:!0,mode:Mn});try{(0,fe.chmodSync)(e,Mn)}catch(n){let t=n.code;if(t!=="EPERM"&&t!=="EACCES")throw n}return e}function ss(){try{let e=(0,Gn.homedir)();if(e)return e}catch(e){}return(0,ge.resolve)(process.cwd())}var Gn,ge,fe,v,Mn,jn=E(()=>{"use strict";Gn=require("node:os"),ge=require("node:path"),fe=require("node:fs"),v=null,Mn=448});function rs(e=Ce()){return(0,Fn.join)(e,"openclaw-gateway.json")}function qn(e,n=Ce()){let t=le(n),s=rs(t),r=`${s}.${process.pid}.tmp`,o={version:1,url:e.url,...e.password?{password:e.password}:{},...e.token?{token:e.token}:{},updatedAt:new Date().toISOString(),source:"openclaw-plugin"};(0,D.writeFileSync)(r,`${JSON.stringify(o,null,2)}
3
+ `,{encoding:"utf8",mode:384});try{(0,D.chmodSync)(r,384)}catch{}(0,D.renameSync)(r,s);try{(0,D.chmodSync)(s,384)}catch{}return s}var D,Fn,Bn=E(()=>{"use strict";D=require("node:fs"),Fn=require("node:path");jn()});function Y(e){return e.includes(H)||e.includes(`:${W}:`)}function pe(e){if(!(!e||e==="direct"||e==="@direct"))return e.startsWith("telegram:")||e.startsWith("@")?e:`telegram:${e}`}function B(e){if(typeof e=="number"&&Number.isFinite(e))return String(Math.trunc(e));if(typeof e=="string")return e.trim()||void 0}function Hn(e){if(e.length!==0)return e[0]==="topic"?B(e[1]):e[0]==="thread"?e.length>=3?B(e.slice(2).join(":")):B(e[1]):B(e[0])}function ve(e,n){return!e||!n||!e.startsWith("telegram:")||/:topic:\d+$/.test(e)?e:`${e}:topic:${n}`}function os(e,n){let t=e.split(":");if(n==="telegram"){let s=t.indexOf("telegram"),r=s>=0?t.slice(s+1):t.slice(3),o=r.findIndex(d=>d==="direct"||d==="dm");if(o>=0){let d=o>0?r[o-1]:void 0,c=r[o+1]==="telegram"&&r[o+2]?`telegram:${r[o+2]}`:r[o+1],l=Hn(r.slice(o+2));return{to:ve(pe(c),l),accountId:d,threadId:l}}let i=r.indexOf("group");if(i>=0){let d=i>0?r[i-1]:void 0,c=r[i+1]==="telegram"&&r[i+2]?`telegram:${r[i+2]}`:r[i+1],l=Hn(r.slice(i+2));return{to:ve(pe(c),l),accountId:d,threadId:l}}if(r[0]==="telegram"&&r[1])return{to:`telegram:${r[1]}`,accountId:void 0};if(r[1]==="telegram"&&r[2])return{to:`telegram:${r[2]}`,accountId:r[0]};if(r.length>=2)return{to:pe(r[1]),accountId:r[0]};if(r.length===1)return{to:pe(r[0]),accountId:void 0}}return{to:t[4],accountId:void 0}}function Wn(e,n){return typeof e!="string"||e==="direct"||e==="@direct"?n:e}function Yn(e){return is[e]??e}function as(e){if(e==="agent:main")return"main";let n=e.split(":");return n.length<4||n[0]!=="agent"||!n[1]||!n[2]||Y(e)||n[2]==="backup"?null:n[2]}function Pe(e,n){let t=n??{},s=t.deliveryContext?.channel??t.lastChannel??t.origin?.provider??as(e);if(!s)return null;let r=Yn(s),o=os(e,r),i=Wn(t.deliveryContext?.to,o.to)??Wn(t.lastTo,o.to)??o.to,d=t.deliveryContext?.accountId??o.accountId,c=B(t.deliveryContext?.threadId??t.origin?.threadId??t.lastThreadId??o.threadId);return{channel:r,target:{sessionKey:e,to:r==="telegram"?ve(i,c):i,accountId:d,threadId:c,updatedAt:t.lastInteractionAt??t.updatedAt??Date.now()}}}function Xn(e){let n=new Map,t=new Map;for(let[s,r]of Object.entries(e)){if(Y(s))continue;let o=r;if(o.spawnedBy||o.subagentRole)continue;let i=Pe(s,r);if(!i)continue;let{channel:d,target:c}=i,{to:l,updatedAt:f}=c;l&&(!t.get(d)||f>(n.get(d)?.updatedAt??0))&&t.set(d,l);let p=n.get(d);(!p||f>p.updatedAt)&&n.set(d,c)}for(let[s,r]of n)if(!r.to){let o=t.get(s);o&&(r.to=o)}for(let[s,r]of n)u(`[findLatestUserSessions] channel=${s} winner=${r.sessionKey} to=${r.to??"(none)"} accountId=${r.accountId??"(none)"} interactedAt=${r.updatedAt}`);return n}var H,W,is,Vn=E(()=>{"use strict";I();H="okx-xmtp",W="okx-a2a";is={dashboard:"webchat"}});function Jn(e){if(Y(e))return null;let n=R(),t=n.agent.session.resolveStorePath(void 0,{agentId:"main"}),s=n.agent.session.loadSessionStore(t,{skipCache:!0});return Pe(e,s[e])}function zn(e){return e.toLowerCase().startsWith("0x")}function ds(e){if(typeof e=="string")return`${H}:${e}`;let n="myAgentId"in e&&"toAgentId"in e?new URLSearchParams({my:e.myAgentId,to:e.toAgentId,job:e.jobId}):new URLSearchParams({my:e.myXmtpAddress,to:e.toXmtpAddress,job:e.jobId});return`${H}:${n.toString()}`}function xe(e){let n=`${H}:`,t=e.indexOf(n);if(t===-1)return null;let s=new URLSearchParams(e.slice(t+n.length)),r=s.get("myAgentId")||s.get("myagentid"),o=s.get("toAgentId")||s.get("toagentid"),i=s.get("my"),d=s.get("to"),c=s.get("job"),l=s.get("gid");return r&&o&&c?{format:"agent",myAgentId:r,toAgentId:o,jobId:c,xmtpGroupId:l??""}:!i||!d||!c?null:!zn(i)&&(d==="_"||!zn(d))?{format:"agent",myAgentId:i,toAgentId:d,jobId:c,xmtpGroupId:l??""}:{format:"address",myXmtpAddress:i,toXmtpAddress:d,jobId:c,xmtpGroupId:l??""}}function X(e){if(!e)return"";let n=xe(e);return n?.jobId?n.jobId:/(?:^|:)backup:([^:&]+)/.exec(e)?.[1]??""}function z(e){let n=e.taskId?.trim()||X(e.scopeKey)||X(e.sessionKey);return n?{taskId:n}:{}}function cs(e){let n=typeof e=="string"?e:ds(e);return(0,V.buildAgentSessionKey)({agentId:"main",channel:W,peer:{kind:"group",id:n}})}function Qn(){let t=R().config.loadConfig().agents?.list;if(t&&t.length>0){let s=t.find(r=>r.id==="main");return s?s.id:t[0].id}return"main"}function Zn(){return(0,V.buildAgentSessionKey)({agentId:Qn(),channel:W,peer:{kind:"group",id:"backup"}})}function us(e){return(0,V.buildAgentSessionKey)({agentId:Qn(),channel:W,peer:{kind:"group",id:`backup:${e}`}})}function b(){let e=R(),n=e.agent.session.resolveStorePath(void 0,{agentId:"main"}),t=e.agent.session.loadSessionStore(n,{skipCache:!0});return Xn(t)}function et(e){let n=new Set,t=[...e.sessionKey?[e.sessionKey]:[],...Array.isArray(e.sessionKeys)?e.sessionKeys:[]].filter(r=>r.trim()),s=[];e.jobId&&s.push({jobId:e.jobId,myAgentId:e.myAgentId,toAgentId:e.toAgentId,myXmtpAddress:e.myXmtpAddress,toXmtpAddress:e.toXmtpAddress});for(let r of t){if(r.startsWith("agent:")){n.add(r);continue}let o=ps(r);if(o){n.add(us(o));continue}let i=nt(r);if(i){s.push(i);continue}let d=xe(r);if(d){s.push(fs(d));continue}n.add(cs(r))}for(let r of ls())for(let o of s)if(gs(r,o)){n.add(r);break}return[...n].sort()}function ls(){let e=R(),n=e.agent.session.resolveStorePath(void 0,{agentId:"main"}),t=e.agent.session.loadSessionStore(n,{skipCache:!0});return Object.keys(t).filter(Y)}function gs(e,n){let t=xe(e);if(t)return ys(t,n);let s=nt(e);return s?!(n.jobId&&s.jobId!==n.jobId||n.myAgentId&&s.myAgentId!==n.myAgentId||n.toAgentId&&s.toAgentId!==n.toAgentId||n.myXmtpAddress&&!n.myAgentId||n.toXmtpAddress&&!n.toAgentId):!n.jobId||n.myAgentId||n.toAgentId||n.myXmtpAddress||n.toXmtpAddress?!1:X(e)===n.jobId}function fs(e){return"myAgentId"in e?{myAgentId:e.myAgentId,toAgentId:e.toAgentId,jobId:e.jobId}:{myXmtpAddress:e.myXmtpAddress,toXmtpAddress:e.toXmtpAddress,jobId:e.jobId}}function nt(e){let n=e.split(":"),t=n.indexOf("job");return t<0||n[t+2]!=="my"||n[t+4]!=="to"||!n[t+1]||!n[t+3]||!n[t+5]?null:{jobId:ye(n[t+1]),myAgentId:ye(n[t+3]),toAgentId:ye(n[t+5])}}function ps(e){return e.startsWith("backup:")?ye(e.slice(7)):null}function ys(e,n){return n.jobId&&e.jobId!==n.jobId?!1:"myAgentId"in e?!(n.myAgentId&&e.myAgentId!==n.myAgentId||n.toAgentId&&e.toAgentId!==n.toAgentId||n.myXmtpAddress&&!n.myAgentId||n.toXmtpAddress&&!n.toAgentId):!(n.myXmtpAddress&&e.myXmtpAddress.toLowerCase()!==n.myXmtpAddress.toLowerCase()||n.toXmtpAddress&&e.toXmtpAddress.toLowerCase()!==n.toXmtpAddress.toLowerCase()||n.myAgentId&&!n.myXmtpAddress||n.toAgentId&&!n.toXmtpAddress)}function ye(e){try{return decodeURIComponent(e)}catch{return e}}var V,P=E(()=>{"use strict";I();V=require("openclaw/plugin-sdk/routing");q();Vn()});var ct={};ce(ct,{callChatInject:()=>Q,callGateway:()=>S,callSessionsCreate:()=>J,callSessionsDelete:()=>Be,callSessionsSend:()=>He,formatPairingErrorHint:()=>Ie,onGatewayEvent:()=>Ge,resolveGatewayRuntimeConfig:()=>je,stopGatewayClient:()=>qe,syncGatewayConfigForNodeDaemon:()=>Fe});function Le(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}}function _s(e){return e&&(typeof e=="string"?{type:"string",configured:!0}:typeof e=="object"&&e!==null&&"env"in e?{type:"env",env:String(e.env),configured:!!Le(e)}:{type:typeof e,configured:!0})}function Ue(e){if(!e||typeof e!="object")return e??null;if(Array.isArray(e))return e.map(t=>Ue(t));let n={};for(let[t,s]of Object.entries(e)){if(/password|token|secret/i.test(t)){n[t]=_s(s);continue}n[t]=Ue(s)}return n}function Ss(e){try{return JSON.stringify(e)}catch{return"[unserializable]"}}function As(e){let n=e.params;if(!n||typeof n!="object"||Array.isArray(n))return z({taskId:e.taskId});let t=n;return z({taskId:e.taskId,sessionKey:typeof t.sessionKey=="string"?t.sessionKey:typeof t.key=="string"?t.key:""})}function dt(e){let n={};for(let[t,s]of Object.entries(e))s!=null&&(n[t]=String(s));return n}function _(e,n={}){let t=dt({phase:e,...n});u(`[gateway] ${e}: ${JSON.stringify(t)}`),g.info(e.startsWith("request_")?a.GATEWAY_REQUEST:a.GATEWAY_STARTED,{component:"openclaw_gateway",...t})}function L(e,n,t={},s=a.GATEWAY_CONNECT_FAILED){let r=dt({phase:e,component:"openclaw_gateway",...t});u(`[gateway] ${e}:`,n),g.error(s,n instanceof Error?n:new Error(String(n)),r)}function hs(e){for(let n of $e)try{n(e)}catch(t){u("[gateway] event handler failed:",t)}}function Ge(e){return $e.add(e),()=>{$e.delete(e)}}function st(){_("ready_gate_reset",{hasSharedClient:!!T,hasConnected:h}),x=new Promise((e,n)=>{me=e,Ee=n})}function rt(e,n,t){if(T!==e){_(`${n}_skip_clear_noncurrent`,t);return}try{e.stop?.()}catch(s){L(`${n}_stop_failed`,s,t)}T=null,h=!1,x=null,me=null,Ee=null,_(`${n}_cleared_client`,t)}function Ts(){if(T)return _("reuse_client",{hasConnected:h,hasReadyPromise:!!x}),{client:T,ready:x};let e=je(),{url:n,password:t,token:s}=e,r=(0,Me.randomUUID)(),o=++Is;st(),_("init_client",{clientSeq:o,instanceId:r,url:n,hasGatewayConfig:!!e.rawGatewayConfig,gatewayConfig:Ss(Ue(e.rawGatewayConfig)),passwordConfigured:!!t,tokenConfigured:!!s,scopes:tt.join(",")});let i=new at.GatewayClient({url:n,password:t,token:s,instanceId:r,clientName:"gateway-client",clientDisplayName:"okx-a2a-plugin",mode:"backend",role:"operator",scopes:[...tt],onHelloOk:()=>{_("hello_ok",{clientSeq:o,instanceId:r,url:n}),h=!0,me?.()},onEvent:hs,onClose:(d,c)=>{if(u(`[gateway] closed (${d}): ${c||"no reason"}`),g.info(a.GATEWAY_DISCONNECTED,{clientSeq:String(o),instanceId:r,url:n,code:String(d),reason:c||"no-reason",hadConnected:String(h)}),h){h=!1,st();return}rt(i,"close_before_connect",{clientSeq:o,instanceId:r,url:n,code:d,reason:c||"no-reason"})},onConnectError:d=>{let c=d;if(c?.retryable){L("connect_error_retryable",d,{clientSeq:o,instanceId:r,url:n,retryable:"true",reason:c?.details?.reason??"retryable",code:c?.gatewayCode??c?.details?.code});return}L("connect_error",d,{clientSeq:o,instanceId:r,url:n,retryable:"false",code:c?.gatewayCode??c?.details?.code}),Ee?.(d instanceof Error?d:new Error(String(d))),rt(i,"connect_error",{clientSeq:o,instanceId:r,url:n,code:c?.gatewayCode??c?.details?.code,reason:c?.details?.reason})}});return T=i,_("start_client",{clientSeq:o,instanceId:r,url:n}),i.start(),{client:i,ready:x}}function je(){let n=R().config.loadConfig().gateway;return{url:`ws://127.0.0.1:${ot(process.env.OPENCLAW_GATEWAY_PORT)??ot(n?.port)??Es}`,password:Le(n?.auth?.password),token:Le(n?.auth?.token),rawGatewayConfig:n}}function ot(e){if(typeof e=="number"&&Number.isFinite(e)){let s=Math.trunc(e);return s>0&&s<=65535?s:null}if(typeof e!="string")return null;let n=e.trim();if(!/^\d+$/.test(n))return null;let t=Number.parseInt(n,10);return t>0&&t<=65535?t:null}function Fe(){let e=je();try{let n=qn({url:e.url,password:e.password,token:e.token});return _("synced_node_gateway_config",{path:n,url:e.url,passwordConfigured:!!e.password,tokenConfigured:!!e.token}),n}catch(n){return L("sync_node_gateway_config_failed",n,{url:e.url,passwordConfigured:!!e.password,tokenConfigured:!!e.token},a.GATEWAY_CONNECT_FAILED),null}}function qe(){if(T){try{T.stop()}catch{}T=null,x=null,me=null,Ee=null,h=!1}}function Ie(e){let n=e,t=n?.gatewayCode??n?.details?.code;if(!t)return null;let s=n?.details??{},r=[`code=${t}`];s.reason&&r.push(`reason=${s.reason}`),s.authReason&&r.push(`authReason=${s.authReason}`),Array.isArray(s.requestedScopes)&&s.requestedScopes.length&&r.push(`requestedScopes=${s.requestedScopes.join(",")}`),s.deviceId&&r.push(`deviceId=${s.deviceId}`),s.requestId&&r.push(`requestId=${s.requestId}`);let o=` (${r.join(", ")})`;switch(t){case"NOT_PAIRED":case"PAIRING_REQUIRED":return`Device pairing approval pending${o}. On the openclaw host run \`openclaw devices approve --latest\` to review and approve the pending request, then retry.`;case"AUTH_SCOPE_MISMATCH":return`Existing device token lacks the required scope${o}. On the openclaw host run \`openclaw devices list\` to find the operator deviceId, then \`openclaw devices rotate --device <id> --role operator --scope operator.admin\` to reissue a token with operator.admin, and restart openclaw.`;case"AUTH_TOKEN_MISSING":case"AUTH_TOKEN_MISMATCH":case"AUTH_DEVICE_TOKEN_MISMATCH":return`Gateway device token is missing or stale${o}. On the openclaw host run \`openclaw devices list\`, then \`openclaw devices remove <deviceId>\`, then restart openclaw to re-pair.`;default:return null}}async function S(e){let n=e.timeoutMs??ms,t=Date.now(),s=As(e);_("request_start",{method:e.method,timeoutMs:n,hasSharedClient:!!T,hasConnected:h,...s});let{client:r,ready:o}=Ts();try{await o}catch(d){let c=Date.now()-t;throw L("request_ready_failed",d,{method:e.method,durationMs:c,timeoutMs:n,...s,code:d?.gatewayCode??d?.code??d?.details?.code,reason:"gateway_ready_failed",communicationClass:"openclaw_gateway_connect"},a.GATEWAY_REQUEST_FAILED),d}let i=Date.now()-t;_("request_ready",{method:e.method,readyWaitMs:i,timeoutMs:n,hasConnected:h,...s});try{let d=await r.request(e.method,e.params,{timeoutMs:n});return _("request_done",{method:e.method,durationMs:Date.now()-t,timeoutMs:n,...s}),d}catch(d){let c=Date.now()-t,l=/timeout|timed out/i.test(String(d?.message??d??""));L("request_error",d,{method:e.method,durationMs:c,timeoutMs:n,readyWaitMs:i,...s,isTimeout:l,code:d?.gatewayCode??d?.code??d?.details?.code,reason:l?"gateway_request_timeout":"gateway_request_error",communicationClass:"openclaw_gateway_rpc"},a.GATEWAY_REQUEST_FAILED);let f=Ie(d);if(f){let p=d?.message??String(d);try{d.message=`${p}
4
+ ${f}`}catch{}}throw d}}async function J(e){return S({method:"sessions.create",params:e})}async function Be(e){return S({method:"sessions.delete",params:e})}async function He(e){let n=e.idempotencyKey??(0,Me.randomUUID)(),t={key:e.key,message:e.message,idempotencyKey:n};try{let s=await S({method:"sessions.send",params:t});return{runId:it(s),raw:s}}catch(s){let r=s?.gatewayCode??s?.code,o=String(s?.message??"");if(r==="INVALID_REQUEST"&&o.includes("session not found")){await J({key:e.key}),g.info(a.SESSION_AUTO_RECOVERED,{sessionKey:e.key,trigger:"sessions.send"});let i=await S({method:"sessions.send",params:t});return{runId:it(i),raw:i}}throw s}}function it(e){if(!e||typeof e!="object")return;let n=e.runId;return typeof n=="string"&&n.trim()?n:void 0}async function Q(e){try{return await S({method:"chat.inject",params:e})}catch(n){let t=n?.gatewayCode??n?.code,s=String(n?.message??"");if(t==="INVALID_REQUEST"&&s.includes("session not found"))return await J({key:e.sessionKey}),g.info(a.SESSION_AUTO_RECOVERED,{sessionKey:e.sessionKey,trigger:"chat.inject"}),await S({method:"chat.inject",params:e});throw n}}var at,Me,ms,Es,tt,Is,T,x,me,Ee,h,$e,U=E(()=>{"use strict";I();at=require("openclaw/plugin-sdk/gateway-runtime"),Me=require("node:crypto");q();N();Bn();P();ms=2e4,Es=18789,tt=["operator.admin"],Is=0;T=null,x=null,me=null,Ee=null,h=!1,$e=new Set});function ft(e){if(e.toolName!=="exec")return null;let n=e.sessionKey?.trim(),t=new Set;for(let o of e.routeSessionKeys??[]){let i=o?.trim();i&&t.add(i)}if(n&&t.add(n),t.size===0)return null;Ye(n);let s=e.params??{},r=Us(s.env)?s.env:{};return{...s,env:{...r,[Ds]:"openclaw",[Ns]:"openclaw-gateway",[Os]:"1",[ws]:n??[...t][0],[Rs]:JSON.stringify([...t])}}}function pt(e){let n=e.runId?.trim(),t=e.sessionKey?.trim();if(!t||!te(t))return!1;Xe();let s=xs([t,...e.routeSessionKeys??[]]);return Cs(t,s),n&&ne.set(n,{sessionKeys:s,updatedAt:Date.now()}),!0}function yt(e){let n=typeof e=="string"?e.trim():e?.runId?.trim(),t=typeof e=="string"?null:e?.sessionKey?.trim();n&&ne.delete(n),t&&te(t)&&vs(t)}function _e(e){let n=new Set,t=e.sessionKey?.trim();t&&te(t)&&n.add(t);let s=e.runId?.trim();if(s){Xe(e.now??Date.now());let r=ne.get(s);for(let o of r?.sessionKeys??[])n.add(o)}else if(!t||!te(t))for(let r of Ps(e.now??Date.now()))n.add(r);return[...n]}function Ye(e){let n=e?.trim();!n||!Ks(n)||(Z={sessionKey:n,updatedAt:Date.now()})}function mt(e=Date.now()){return Z?e-Z.updatedAt>bs?(Z=null,null):Z.sessionKey:null}function Ks(e){return e.startsWith("job:")||e.startsWith("backup:")||/(?:^|[?&:])job=([^:&]+)/.test(e)}function te(e){if(e==="agent:main")return!0;let n=e.split(":");if(n.length<4||n[0]!=="agent"||!n[1])return!1;let t=n[2];return!!(t&&t!=="okx-a2a"&&!ks.has(t))}function Xe(e=Date.now()){for(let[n,t]of ne)e-t.updatedAt>lt&&ne.delete(n);for(let[n,t]of w)e-t.updatedAt>lt&&w.delete(n)}function Cs(e,n){let t=w.get(e);w.set(e,{count:(t?.count??0)+1,updatedAt:Date.now(),routeSessionKeys:n}),We()}function vs(e){let n=w.get(e);if(n){if(n.count<=1){w.delete(e),We();return}w.set(e,{count:n.count-1,updatedAt:Date.now(),routeSessionKeys:n.routeSessionKeys}),We()}}function Ps(e=Date.now()){Xe(e);let n=[...w.keys()];return n.length!==1?[]:w.get(n[0])?.routeSessionKeys??[]}function xs(e){let n=new Set;for(let t of e){let s=t?.trim();s&&te(s)&&n.add(s)}return[...n]}function We(){try{let e=Ls();(0,$.mkdirSync)((0,ee.dirname)(e),{recursive:!0,mode:448});let t={version:1,updatedAt:Date.now(),origins:[...w.entries()].map(([r,o])=>({sessionKey:r,count:o.count,updatedAt:o.updatedAt,routeSessionKeys:o.routeSessionKeys}))},s=`${e}.${process.pid}.tmp`;(0,$.writeFileSync)(s,`${JSON.stringify(t)}
5
+ `,{encoding:"utf8",mode:384}),(0,$.renameSync)(s,e)}catch(e){console.log(`[okx-a2a:hook] failed to persist gateway route origins: ${e instanceof Error?e.message:String(e)}`)}}function Ls(e=process.env){let n=e.OKX_AGENT_TASK_HOME?.trim()||(0,ee.join)((0,gt.homedir)(),".okx-agent-task");return(0,ee.join)(n,"run","gateway-route-origins.json")}function Us(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var $,gt,ee,ws,Rs,Ds,Ns,Os,bs,lt,ks,Z,ne,w,Ve=E(()=>{"use strict";$=require("node:fs"),gt=require("node:os"),ee=require("node:path"),ws="OKX_A2A_CURRENT_GATEWAY_SESSION_KEY",Rs="OKX_A2A_CURRENT_GATEWAY_SESSION_KEYS",Ds="OKX_A2A_GATEWAY_PROVIDER",Ns="OKX_A2A_RUNTIME_CONTEXT",Os="OKX_A2A_IN_GATEWAY",bs=12e4,lt=30*6e4,ks=new Set(["heartbeat","cron","webhook","voice"]),Z=null,ne=new Map,w=new Map});function Ms(e=process.env){return e.OKX_AGENT_TASK_HOME?.trim()||(0,Je.join)((0,It.homedir)(),".okx-agent-task")}function Gs(e=process.env){return e.OKX_A2A_SESSION_STORE_DB_PATH?.trim()||(0,Je.join)(Ms(e),"sqlite","session-store.sqlite")}function Se(e){let n=A(e.jobId)??X(e.sessionKey);return n?js(Fs(n,e.dbPath??Gs())):[]}function js(e){let n=new Set,t=[];for(let s of e){let r=ze(A(s.gatewaySessionKey)??A(s.sessionKey)??""),o=Hs(r);!r||!o||n.has(o)||(n.add(o),t.push(r))}return t}function Fs(e,n){if(!(0,Et.existsSync)(n))return[];let{DatabaseSync:t}=qs(),s=new t(n,{readOnly:!0});try{if(s.exec("PRAGMA busy_timeout=5000"),!s.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='job_provider_bindings'").get())return[];let o=s.prepare("SELECT provider, gateway_routes_json FROM job_provider_bindings WHERE job_id = ?").get(e);return o?.provider!=="openclaw"||typeof o.gateway_routes_json!="string"?[]:Bs(o.gateway_routes_json)}catch(r){return console.log(`[okx-a2a:stored-routes] failed to resolve job route jobId=${e}: ${r instanceof Error?r.message:String(r)}`),[]}finally{s.close()}}function qs(){let e=process.emitWarning;process.emitWarning=((n,...t)=>{if(!((typeof n=="string"?n:n.message).includes("SQLite is an experimental feature")&&t.some(r=>r==="ExperimentalWarning")))return e.call(process,n,...t)});try{return require("node:sqlite")}finally{process.emitWarning=e}}function Bs(e){try{let n=JSON.parse(e);if(!Array.isArray(n))return[];let t=[];for(let s of n){if(!Ys(s))continue;let r=A(typeof s.platform=="string"?s.platform:null),o=ze(A(typeof s.sessionKey=="string"?s.sessionKey:null)??"");if(!r||!o)continue;let i=ze(A(typeof s.gatewaySessionKey=="string"?s.gatewaySessionKey:null)??""),d=A(typeof s.chatId=="string"?s.chatId:null),c=A(typeof s.threadId=="string"?s.threadId:null),l=A(typeof s.updatedAt=="string"?s.updatedAt:null);t.push({platform:r,sessionKey:o,...i?{gatewaySessionKey:i}:{},...d?{chatId:d}:{},...c?{threadId:c}:{},...l?{updatedAt:l}:{}})}return t}catch{return[]}}function Hs(e){let n=A(e);if(!n)return null;if(n==="agent:main")return"main";if(n.startsWith("backup:"))return null;let t=n.split(":");if(t.length<4||t[0]!=="agent"||!t[1])return null;let s=t[2];return!s||s==="okx-a2a"||s==="backup"||$s.has(s)?null:s}function ze(e){let n=A(e);if(!n)return"";let t=n.split(":");if(t.length<4||t[0]!=="agent")return n;let s=t[2],r=t[3];if(s!=="telegram")return n;if((r==="direct"||r==="dm")&&t[4]){let o=Ws(t.slice(5));return o?`agent:${t[1]}:telegram:direct:${t[4]}:topic:${o}`:`agent:${t[1]}:telegram:direct:${t[4]}`}if(r==="group"&&t[4]){let o=t[5]==="topic"?t[6]:t[5];return o?`agent:${t[1]}:telegram:group:${t[4]}:topic:${o}`:`agent:${t[1]}:telegram:group:${t[4]}`}return n}function Ws(e){if(e.length!==0)return e[0]==="topic"?e[1]||void 0:e[0]==="thread"?e.length>=3?e.slice(2).join(":")||void 0:e[1]||void 0:e[0]||void 0}function Ys(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function A(e){let n=e?.trim();return n||null}var Et,It,Je,$s,Qe=E(()=>{"use strict";Et=require("node:fs"),It=require("node:os"),Je=require("node:path");P();$s=new Set(["heartbeat","cron","webhook","voice"])});function nn(e){let n=k(e.jobId)??Qs([e.content,...e.contents??[]]);if(!n)return console.log("[okx-a2a:stored-routes] skipped delivered route bind reason=missing_job_id"),[];let t=e.sessionKeys.map(i=>Vs(i)).filter(i=>!!i);if(t.length===0)return[];let s=e.dbPath??er(),{DatabaseSync:r}=nr(),o=new r(s);try{o.exec("PRAGMA busy_timeout=5000"),o.exec(`
6
6
  CREATE TABLE IF NOT EXISTS job_provider_bindings (
7
7
  job_id TEXT PRIMARY KEY,
8
8
  provider TEXT NOT NULL CHECK (provider IN ('codex', 'claude', 'hermes', 'openclaw')),
@@ -10,20 +10,20 @@ ${f}`}catch{}}throw d}}async function J(e){return _({method:"sessions.create",pa
10
10
  created_at TEXT NOT NULL,
11
11
  updated_at TEXT NOT NULL
12
12
  )
13
- `);let i=new Date().toISOString();o.prepare("INSERT OR IGNORE INTO job_provider_bindings(job_id, provider, created_at, updated_at) VALUES (?, 'openclaw', ?, ?)").run(n,i,i);let d=o.prepare("SELECT provider, gateway_routes_json FROM job_provider_bindings WHERE job_id = ?").get(n);if(d?.provider!=="openclaw")return[];let c=zs(d.gateway_routes_json),l=new Set(c.map(p=>p.platform)),f=[];for(let p of t)l.has(p.platform)||(c.push(p),l.add(p.platform),f.push(p.gatewaySessionKey));return f.length===0?[]:(o.prepare("UPDATE job_provider_bindings SET gateway_routes_json = ?, updated_at = ? WHERE job_id = ? AND provider = 'openclaw'").run(JSON.stringify(c),i,n),console.log(`[okx-a2a:stored-routes] bound delivered route jobId=${n} sessionKeys=${f.join(",")}`),f)}catch(i){return console.log(`[okx-a2a:stored-routes] failed to bind delivered route jobId=${n}: ${i instanceof Error?i.message:String(i)}`),[]}finally{o.close()}}function Vs(e){let n=_t(k(e)??"");if(!n)return null;let t=At(n);if(!t)return null;let s=Js(n);return{platform:t,sessionKey:n,gatewaySessionKey:n,...s.chatId?{chatId:s.chatId}:{},...s.threadId?{threadId:s.threadId}:{},updatedAt:new Date().toISOString()}}function zs(e){if(typeof e!="string"||!e.trim())return[];try{let n=JSON.parse(e);if(!Array.isArray(n))return[];let t=[];for(let s of n){if(!tr(s))continue;let r=_t(k(typeof s.gatewaySessionKey=="string"?s.gatewaySessionKey:null)??k(typeof s.sessionKey=="string"?s.sessionKey:null)??""),o=At(r);!r||!o||t.push({platform:o,sessionKey:r,gatewaySessionKey:r,...typeof s.chatId=="string"&&s.chatId.trim()?{chatId:s.chatId.trim()}:{},...typeof s.threadId=="string"&&s.threadId.trim()?{threadId:s.threadId.trim()}:{},...typeof s.updatedAt=="string"&&s.updatedAt.trim()?{updatedAt:s.updatedAt.trim()}:{updatedAt:new Date().toISOString()}})}return t}catch{return[]}}function Js(e){let n=e.split(":");if(n.length<4||n[0]!=="agent")return{};let t=n[2],s=n[3];if(t==="discord"&&s==="thread")return{...n[4]?{chatId:n[4]}:{},...n[5]?{threadId:n[5]}:{}};if(t==="discord"&&(s==="channel"||s==="dm"))return n[4]?{chatId:n[4]}:{};if(t==="telegram"&&s==="direct"){let r=Ze(n.slice(5));return{...n[4]?{chatId:n[4]}:{},...r?{threadId:r}:{}}}if(t==="telegram"&&s==="dm"){let r=Ze(n.slice(5));return{...n[4]?{chatId:n[4]}:{},...r?{threadId:r}:{}}}if(t==="telegram"&&s==="group"){let r=n[5]==="topic"?n[6]:n[5];return{...n[4]?{chatId:n[4]}:{},...r?{threadId:r}:{}}}return{}}function _t(e){let n=k(e);if(!n)return"";let t=n.split(":");if(t.length<4||t[0]!=="agent")return n;let s=t[2],r=t[3];if(s!=="telegram")return n;if((r==="direct"||r==="dm")&&t[4]){let o=Ze(t.slice(5));return o?`agent:${t[1]}:telegram:direct:${t[4]}:topic:${o}`:`agent:${t[1]}:telegram:direct:${t[4]}`}if(r==="group"&&t[4]){let o=t[5]==="topic"?t[6]:t[5];return o?`agent:${t[1]}:telegram:group:${t[4]}:topic:${o}`:`agent:${t[1]}:telegram:group:${t[4]}`}return n}function Ze(e){if(e.length!==0)return e[0]==="topic"?e[1]||void 0:e[0]==="thread"?e.length>=3?e.slice(2).join(":")||void 0:e[1]||void 0:e[0]||void 0}function Qs(e){for(let n of e){let t=k(n);if(!t)continue;let s=/\b0x[a-fA-F0-9]{64}\b/.exec(t);if(s?.[0])return s[0]}return null}function At(e){let n=k(e);if(!n)return null;if(n==="agent:main")return"main";if(n.startsWith("backup:"))return null;let t=n.split(":");if(t.length<4||t[0]!=="agent"||!t[1])return null;let s=t[2];return!s||s==="okx-a2a"||s==="backup"||Ys.has(s)?null:s}function Zs(e=process.env){return e.OKX_AGENT_TASK_HOME?.trim()||(0,en.join)((0,St.homedir)(),".okx-agent-task")}function er(e=process.env){return e.OKX_A2A_SESSION_STORE_DB_PATH?.trim()||(0,en.join)(Zs(e),"sqlite","session-store.sqlite")}function nr(){let e=process.emitWarning;process.emitWarning=((n,...t)=>{if(!((typeof n=="string"?n:n.message).includes("SQLite is an experimental feature")&&t.some(r=>r==="ExperimentalWarning")))return e.call(process,n,...t)});try{return require("node:sqlite")}finally{process.emitWarning=e}}function tr(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function k(e){let n=e?.trim();return n||null}var St,en,Ys,ht=E(()=>{"use strict";St=require("node:os"),en=require("node:path"),Ys=new Set(["heartbeat","cron","webhook","voice"])});var he={};ce(he,{isPromptUserSessionRunning:()=>sr,markPromptUserSessionEnded:()=>on,markPromptUserSessionRunning:()=>rn,queuePromptUserAction:()=>rr});function K(e){let n=Tt.get(e);return n||(n={running:!1,processing:!1,queue:[]},Tt.set(e,n)),n}function tn(e,n,t){e.fallbackTimer&&(clearTimeout(e.fallbackTimer),e.fallbackTimer=void 0,n&&u(`[xmtp_prompt_user:queue] fallback cleared sessionKey=${n}${t?` reason=${t}`:""}`))}function sn(e,n){tn(n,e,"reschedule");let t=n.queue[0];if(!t||n.processing)return;let s=Math.max(0,t.deadlineAt-Date.now());u(`[xmtp_prompt_user:queue] fallback scheduled sessionKey=${e} channel=${t.channel} delayMs=${s} queued=${n.queue.length}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"fallback_scheduled",sessionKey:e,channel:t.channel,taskId:t.taskId,delayMs:s,queued:n.queue.length})),n.fallbackTimer=setTimeout(()=>{let r=K(e);r.fallbackTimer=void 0,u(`[xmtp_prompt_user:queue] fallback fired sessionKey=${e} queued=${r.queue.length}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"fallback_fired",sessionKey:e,taskId:r.queue[0]?.taskId,queued:r.queue.length,reason:"fallback_timeout"})),re(e,"fallback_timeout")},s)}async function re(e,n){let t=K(e);if(t.processing)return;let s=t.queue.shift();if(!s){tn(t,e,"empty_queue"),u(`[xmtp_prompt_user:queue] dispatch skipped empty sessionKey=${e} reason=${n}`);return}tn(t,e,n),t.processing=!0;try{u(`[xmtp_prompt_user:queue] dispatch sessionKey=${e} channel=${s.channel} reason=${n} remaining=${t.queue.length}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"dispatch_started",sessionKey:e,channel:s.channel,taskId:s.taskId,reason:n,queued:t.queue.length}));let r=await an({...s,onRunStarted:o=>{let i=Ae.get(o);if(i){u(`[xmtp_prompt_user:queue] run already completed sessionKey=${e} channel=${s.channel} runId=${o} state=${i.state} completedAt=${i.completedAt}`),Ae.delete(o);return}se.set(o,{sessionKey:e,channel:s.channel,taskId:s.taskId,startedAt:Date.now()}),u(`[xmtp_prompt_user:queue] run pending sessionKey=${e} channel=${s.channel} runId=${o}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"run_pending",sessionKey:e,channel:s.channel,taskId:s.taskId,runId:o}))}});t.running=!r.runId||se.has(r.runId),u(`[xmtp_prompt_user:queue] dispatch completed sessionKey=${e} channel=${s.channel} reason=${n} running=${t.running?1:0} runId=${r.runId??"(none)"}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"dispatch_completed",sessionKey:e,channel:s.channel,taskId:s.taskId,reason:n,running:t.running?1:0,runId:r.runId,queued:t.queue.length}))}catch(r){u(`[xmtp_prompt_user:queue] dispatch failed sessionKey=${e} channel=${s.channel} reason=${n}:`,r),g.error(a.PROMPT_USER_FAILED,r instanceof Error?r:new Error(String(r)),O({checkpoint:"dispatch_failed",sessionKey:e,channel:s.channel,taskId:s.taskId,reason:n,queued:t.queue.length}))}finally{t.processing=!1}if(t.queue.length===0){u(`[xmtp_prompt_user:queue] queue drained sessionKey=${e}`);return}if(t.running){u(`[xmtp_prompt_user:queue] queue waiting sessionKey=${e} queued=${t.queue.length} running=1`),sn(e,t);return}u(`[xmtp_prompt_user:queue] queue continues sessionKey=${e} queued=${t.queue.length} running=0`),re(e,"session_idle")}function sr(e){return K(e).running}async function rr(e){let n=e.target.sessionKey,t=K(n);return t.queue.push({...e,deadlineAt:Date.now()+Rt}),t.running||t.processing||t.queue.length>1?(t.queue.length===1&&sn(n,t),u(`[xmtp_prompt_user:queue] queued sessionKey=${n} channel=${e.channel} size=${t.queue.length}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"queued",sessionKey:n,channel:e.channel,taskId:e.taskId,queued:t.queue.length,running:t.running?1:0,processing:t.processing?1:0})),{status:"queued",size:t.queue.length}):(await re(n,"session_idle"),{status:"dispatched",size:t.queue.length})}function rn(e){let n=K(e);n.running=!0;let t=n.queue[0];t&&(t.deadlineAt=Date.now()+Rt,u(`[xmtp_prompt_user:queue] fallback reset sessionKey=${e} channel=${t.channel} queued=${n.queue.length}`),sn(e,n)),u(`[xmtp_prompt_user:queue] agent_start sessionKey=${e} queued=${n.queue.length}`)}function on(e){let n=K(e),t=or(e);if(t.length>0){u(`[xmtp_prompt_user:queue] agent_end sessionKey=${e} queued=${n.queue.length} pendingRunIds=${t.join(",")} waiting=run_final`);return}n.running=!1,u(`[xmtp_prompt_user:queue] agent_end sessionKey=${e} queued=${n.queue.length}`),n.queue.length>0&&re(e,"agent_end")}function or(e){let n=[];for(let[t,s]of se)s.sessionKey===e&&n.push(t);return n}function wt(e,n,t){Ae.set(e,{state:n,sessionKey:t,completedAt:Date.now()}),setTimeout(()=>{Ae.delete(e)},60*1e3)}function ir(e,n,t,s,r){let o=K(e);o.running=!1,u(`[xmtp_prompt_user:queue] run completed sessionKey=${e} runId=${n} state=${t} durationMs=${s} queued=${o.queue.length}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"run_completed",sessionKey:e,taskId:r,runId:n,status:t,durationMs:s,queued:o.queue.length})),o.queue.length>0&&re(e,`run_${t}`)}function O(e){return Object.entries({component:"openclaw_prompt_user_queue",operation:"xmtp_prompt_user",checkpoint:e.checkpoint,sessionKey:e.sessionKey,channel:e.channel??"",taskId:e.taskId??"",runId:e.runId??"",reason:e.reason??"",status:e.status??"",queued:e.queued??"",delayMs:e.delayMs??"",durationMs:e.durationMs??"",running:e.running??"",processing:e.processing??""}).filter(([,t])=>t!=="").reduce((t,[s,r])=>(t[s]=String(r),t),{})}var Rt,Tt,se,Ae,oe=E(()=>{"use strict";I();ie();U();D();Rt=300*1e3,Tt=new Map,se=new Map,Ae=new Map;Ge(e=>{let n=e;if(n.event!=="chat"||!n.payload||typeof n.payload!="object")return;let t=n.payload,s=typeof t.runId=="string"?t.runId:"";if(!s)return;let r=typeof t.state=="string"?t.state:"",o=se.get(s);if(!o){(r==="final"||r==="error")&&wt(s,r,String(t.sessionKey??""));return}u(`[xmtp_prompt_user:queue] observed chat event runId=${s} state=${r||"(none)"} sessionKey=${String(t.sessionKey??"")}`),!(r!=="final"&&r!=="error")&&(se.delete(s),wt(s,r,String(t.sessionKey??"")),ir(o.sessionKey,s,r,Date.now()-o.startedAt,o.taskId))})});var An={};ce(An,{AgentMessageDirection:()=>Kt,INJECT_ONLY_CHANNELS:()=>De,NON_DELIVERY_CHANNELS:()=>G,buildAgentMessageNotice:()=>Ct,buildSystemMessageNotice:()=>vt,dispatchPromptToUserSession:()=>an,dispatchToUser:()=>gn,dispatchUserToLatestSessions:()=>fn,dispatchUserToRoutedSessions:()=>yn,dispatchUserToSession:()=>mn,notifyAgentMessageToUser:()=>lr,notifySystemMessageToUser:()=>fr,promptUserToLatestSessions:()=>En,promptUserToRoutedSessions:()=>In,promptUserToSession:()=>Sn,sendLlmToLatestUserSessions:()=>_n});function dr(e){return e?e.length<=Nt+Dt+1?e:`${e.slice(0,Nt)}\u2026${e.slice(-Dt)}`:""}function cr(e){return e.length<=Ot+bt+dn.length?e:`${e.slice(0,Ot)}${dn}${e.slice(-bt)}`}function kt(e){return e.name?e.agentId?`${e.name}#${e.agentId}`:e.name:e.walletAddress?dr(e.walletAddress):"unknown"}function ur(e){let n=e.split(`
13
+ `);let i=new Date().toISOString();o.prepare("INSERT OR IGNORE INTO job_provider_bindings(job_id, provider, created_at, updated_at) VALUES (?, 'openclaw', ?, ?)").run(n,i,i);let d=o.prepare("SELECT provider, gateway_routes_json FROM job_provider_bindings WHERE job_id = ?").get(n);if(d?.provider!=="openclaw")return[];let c=zs(d.gateway_routes_json),l=new Set(c.map(p=>p.platform)),f=[];for(let p of t)l.has(p.platform)||(c.push(p),l.add(p.platform),f.push(p.gatewaySessionKey));return f.length===0?[]:(o.prepare("UPDATE job_provider_bindings SET gateway_routes_json = ?, updated_at = ? WHERE job_id = ? AND provider = 'openclaw'").run(JSON.stringify(c),i,n),console.log(`[okx-a2a:stored-routes] bound delivered route jobId=${n} sessionKeys=${f.join(",")}`),f)}catch(i){return console.log(`[okx-a2a:stored-routes] failed to bind delivered route jobId=${n}: ${i instanceof Error?i.message:String(i)}`),[]}finally{o.close()}}function Vs(e){let n=St(k(e)??"");if(!n)return null;let t=At(n);if(!t)return null;let s=Js(n);return{platform:t,sessionKey:n,gatewaySessionKey:n,...s.chatId?{chatId:s.chatId}:{},...s.threadId?{threadId:s.threadId}:{},updatedAt:new Date().toISOString()}}function zs(e){if(typeof e!="string"||!e.trim())return[];try{let n=JSON.parse(e);if(!Array.isArray(n))return[];let t=[];for(let s of n){if(!tr(s))continue;let r=St(k(typeof s.gatewaySessionKey=="string"?s.gatewaySessionKey:null)??k(typeof s.sessionKey=="string"?s.sessionKey:null)??""),o=At(r);!r||!o||t.push({platform:o,sessionKey:r,gatewaySessionKey:r,...typeof s.chatId=="string"&&s.chatId.trim()?{chatId:s.chatId.trim()}:{},...typeof s.threadId=="string"&&s.threadId.trim()?{threadId:s.threadId.trim()}:{},...typeof s.updatedAt=="string"&&s.updatedAt.trim()?{updatedAt:s.updatedAt.trim()}:{updatedAt:new Date().toISOString()}})}return t}catch{return[]}}function Js(e){let n=e.split(":");if(n.length<4||n[0]!=="agent")return{};let t=n[2],s=n[3];if(t==="discord"&&s==="thread")return{...n[4]?{chatId:n[4]}:{},...n[5]?{threadId:n[5]}:{}};if(t==="discord"&&(s==="channel"||s==="dm"))return n[4]?{chatId:n[4]}:{};if(t==="telegram"&&s==="direct"){let r=Ze(n.slice(5));return{...n[4]?{chatId:n[4]}:{},...r?{threadId:r}:{}}}if(t==="telegram"&&s==="dm"){let r=Ze(n.slice(5));return{...n[4]?{chatId:n[4]}:{},...r?{threadId:r}:{}}}if(t==="telegram"&&s==="group"){let r=n[5]==="topic"?n[6]:n[5];return{...n[4]?{chatId:n[4]}:{},...r?{threadId:r}:{}}}return{}}function St(e){let n=k(e);if(!n)return"";let t=n.split(":");if(t.length<4||t[0]!=="agent")return n;let s=t[2],r=t[3];if(s!=="telegram")return n;if((r==="direct"||r==="dm")&&t[4]){let o=Ze(t.slice(5));return o?`agent:${t[1]}:telegram:direct:${t[4]}:topic:${o}`:`agent:${t[1]}:telegram:direct:${t[4]}`}if(r==="group"&&t[4]){let o=t[5]==="topic"?t[6]:t[5];return o?`agent:${t[1]}:telegram:group:${t[4]}:topic:${o}`:`agent:${t[1]}:telegram:group:${t[4]}`}return n}function Ze(e){if(e.length!==0)return e[0]==="topic"?e[1]||void 0:e[0]==="thread"?e.length>=3?e.slice(2).join(":")||void 0:e[1]||void 0:e[0]||void 0}function Qs(e){for(let n of e){let t=k(n);if(!t)continue;let s=/\b0x[a-fA-F0-9]{64}\b/.exec(t);if(s?.[0])return s[0]}return null}function At(e){let n=k(e);if(!n)return null;if(n==="agent:main")return"main";if(n.startsWith("backup:"))return null;let t=n.split(":");if(t.length<4||t[0]!=="agent"||!t[1])return null;let s=t[2];return!s||s==="okx-a2a"||s==="backup"||Xs.has(s)?null:s}function Zs(e=process.env){return e.OKX_AGENT_TASK_HOME?.trim()||(0,en.join)((0,_t.homedir)(),".okx-agent-task")}function er(e=process.env){return e.OKX_A2A_SESSION_STORE_DB_PATH?.trim()||(0,en.join)(Zs(e),"sqlite","session-store.sqlite")}function nr(){let e=process.emitWarning;process.emitWarning=((n,...t)=>{if(!((typeof n=="string"?n:n.message).includes("SQLite is an experimental feature")&&t.some(r=>r==="ExperimentalWarning")))return e.call(process,n,...t)});try{return require("node:sqlite")}finally{process.emitWarning=e}}function tr(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function k(e){let n=e?.trim();return n||null}var _t,en,Xs,ht=E(()=>{"use strict";_t=require("node:os"),en=require("node:path"),Xs=new Set(["heartbeat","cron","webhook","voice"])});var he={};ce(he,{isPromptUserSessionRunning:()=>sr,markPromptUserSessionEnded:()=>on,markPromptUserSessionRunning:()=>rn,queuePromptUserAction:()=>rr});function K(e){let n=Tt.get(e);return n||(n={running:!1,processing:!1,queue:[]},Tt.set(e,n)),n}function tn(e,n,t){e.fallbackTimer&&(clearTimeout(e.fallbackTimer),e.fallbackTimer=void 0,n&&u(`[xmtp_prompt_user:queue] fallback cleared sessionKey=${n}${t?` reason=${t}`:""}`))}function sn(e,n){tn(n,e,"reschedule");let t=n.queue[0];if(!t||n.processing)return;let s=Math.max(0,t.deadlineAt-Date.now());u(`[xmtp_prompt_user:queue] fallback scheduled sessionKey=${e} channel=${t.channel} delayMs=${s} queued=${n.queue.length}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"fallback_scheduled",sessionKey:e,channel:t.channel,taskId:t.taskId,delayMs:s,queued:n.queue.length})),n.fallbackTimer=setTimeout(()=>{let r=K(e);r.fallbackTimer=void 0,u(`[xmtp_prompt_user:queue] fallback fired sessionKey=${e} queued=${r.queue.length}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"fallback_fired",sessionKey:e,taskId:r.queue[0]?.taskId,queued:r.queue.length,reason:"fallback_timeout"})),re(e,"fallback_timeout")},s)}async function re(e,n){let t=K(e);if(t.processing)return;let s=t.queue.shift();if(!s){tn(t,e,"empty_queue"),u(`[xmtp_prompt_user:queue] dispatch skipped empty sessionKey=${e} reason=${n}`);return}tn(t,e,n),t.processing=!0;try{u(`[xmtp_prompt_user:queue] dispatch sessionKey=${e} channel=${s.channel} reason=${n} remaining=${t.queue.length}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"dispatch_started",sessionKey:e,channel:s.channel,taskId:s.taskId,reason:n,queued:t.queue.length}));let r=await an({...s,onRunStarted:o=>{let i=Ae.get(o);if(i){u(`[xmtp_prompt_user:queue] run already completed sessionKey=${e} channel=${s.channel} runId=${o} state=${i.state} completedAt=${i.completedAt}`),Ae.delete(o);return}se.set(o,{sessionKey:e,channel:s.channel,taskId:s.taskId,startedAt:Date.now()}),u(`[xmtp_prompt_user:queue] run pending sessionKey=${e} channel=${s.channel} runId=${o}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"run_pending",sessionKey:e,channel:s.channel,taskId:s.taskId,runId:o}))}});t.running=!r.runId||se.has(r.runId),u(`[xmtp_prompt_user:queue] dispatch completed sessionKey=${e} channel=${s.channel} reason=${n} running=${t.running?1:0} runId=${r.runId??"(none)"}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"dispatch_completed",sessionKey:e,channel:s.channel,taskId:s.taskId,reason:n,running:t.running?1:0,runId:r.runId,queued:t.queue.length}))}catch(r){u(`[xmtp_prompt_user:queue] dispatch failed sessionKey=${e} channel=${s.channel} reason=${n}:`,r),g.error(a.PROMPT_USER_FAILED,r instanceof Error?r:new Error(String(r)),O({checkpoint:"dispatch_failed",sessionKey:e,channel:s.channel,taskId:s.taskId,reason:n,queued:t.queue.length}))}finally{t.processing=!1}if(t.queue.length===0){u(`[xmtp_prompt_user:queue] queue drained sessionKey=${e}`);return}if(t.running){u(`[xmtp_prompt_user:queue] queue waiting sessionKey=${e} queued=${t.queue.length} running=1`),sn(e,t);return}u(`[xmtp_prompt_user:queue] queue continues sessionKey=${e} queued=${t.queue.length} running=0`),re(e,"session_idle")}function sr(e){return K(e).running}async function rr(e){let n=e.target.sessionKey,t=K(n);return t.queue.push({...e,deadlineAt:Date.now()+Rt}),t.running||t.processing||t.queue.length>1?(t.queue.length===1&&sn(n,t),u(`[xmtp_prompt_user:queue] queued sessionKey=${n} channel=${e.channel} size=${t.queue.length}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"queued",sessionKey:n,channel:e.channel,taskId:e.taskId,queued:t.queue.length,running:t.running?1:0,processing:t.processing?1:0})),{status:"queued",size:t.queue.length}):(await re(n,"session_idle"),{status:"dispatched",size:t.queue.length})}function rn(e){let n=K(e);n.running=!0;let t=n.queue[0];t&&(t.deadlineAt=Date.now()+Rt,u(`[xmtp_prompt_user:queue] fallback reset sessionKey=${e} channel=${t.channel} queued=${n.queue.length}`),sn(e,n)),u(`[xmtp_prompt_user:queue] agent_start sessionKey=${e} queued=${n.queue.length}`)}function on(e){let n=K(e),t=or(e);if(t.length>0){u(`[xmtp_prompt_user:queue] agent_end sessionKey=${e} queued=${n.queue.length} pendingRunIds=${t.join(",")} waiting=run_final`);return}n.running=!1,u(`[xmtp_prompt_user:queue] agent_end sessionKey=${e} queued=${n.queue.length}`),n.queue.length>0&&re(e,"agent_end")}function or(e){let n=[];for(let[t,s]of se)s.sessionKey===e&&n.push(t);return n}function wt(e,n,t){Ae.set(e,{state:n,sessionKey:t,completedAt:Date.now()}),setTimeout(()=>{Ae.delete(e)},60*1e3)}function ir(e,n,t,s,r){let o=K(e);o.running=!1,u(`[xmtp_prompt_user:queue] run completed sessionKey=${e} runId=${n} state=${t} durationMs=${s} queued=${o.queue.length}`),g.info(a.PROMPT_USER_CHECKPOINT,O({checkpoint:"run_completed",sessionKey:e,taskId:r,runId:n,status:t,durationMs:s,queued:o.queue.length})),o.queue.length>0&&re(e,`run_${t}`)}function O(e){return Object.entries({component:"openclaw_prompt_user_queue",operation:"xmtp_prompt_user",checkpoint:e.checkpoint,sessionKey:e.sessionKey,channel:e.channel??"",taskId:e.taskId??"",runId:e.runId??"",reason:e.reason??"",status:e.status??"",queued:e.queued??"",delayMs:e.delayMs??"",durationMs:e.durationMs??"",running:e.running??"",processing:e.processing??""}).filter(([,t])=>t!=="").reduce((t,[s,r])=>(t[s]=String(r),t),{})}var Rt,Tt,se,Ae,oe=E(()=>{"use strict";I();ie();U();N();Rt=300*1e3,Tt=new Map,se=new Map,Ae=new Map;Ge(e=>{let n=e;if(n.event!=="chat"||!n.payload||typeof n.payload!="object")return;let t=n.payload,s=typeof t.runId=="string"?t.runId:"";if(!s)return;let r=typeof t.state=="string"?t.state:"",o=se.get(s);if(!o){(r==="final"||r==="error")&&wt(s,r,String(t.sessionKey??""));return}u(`[xmtp_prompt_user:queue] observed chat event runId=${s} state=${r||"(none)"} sessionKey=${String(t.sessionKey??"")}`),!(r!=="final"&&r!=="error")&&(se.delete(s),wt(s,r,String(t.sessionKey??"")),ir(o.sessionKey,s,r,Date.now()-o.startedAt,o.taskId))})});var An={};ce(An,{AgentMessageDirection:()=>Kt,INJECT_ONLY_CHANNELS:()=>Ne,NON_DELIVERY_CHANNELS:()=>G,buildAgentMessageNotice:()=>Ct,buildSystemMessageNotice:()=>vt,dispatchPromptToUserSession:()=>an,dispatchToUser:()=>gn,dispatchUserToLatestSessions:()=>fn,dispatchUserToRoutedSessions:()=>yn,dispatchUserToSession:()=>mn,notifyAgentMessageToUser:()=>lr,notifySystemMessageToUser:()=>fr,promptUserToLatestSessions:()=>En,promptUserToRoutedSessions:()=>In,promptUserToSession:()=>_n,sendLlmToLatestUserSessions:()=>Sn});function dr(e){return e?e.length<=Dt+Nt+1?e:`${e.slice(0,Dt)}\u2026${e.slice(-Nt)}`:""}function cr(e){return e.length<=Ot+bt+dn.length?e:`${e.slice(0,Ot)}${dn}${e.slice(-bt)}`}function kt(e){return e.name?e.agentId?`${e.name}#${e.agentId}`:e.name:e.walletAddress?dr(e.walletAddress):"unknown"}function ur(e){let n=e.split(`
14
14
  `);if(n.length<=Te)return e;let t=n.slice(0,Te);return t[Te-1]=`${t[Te-1]}${dn}`,t.join(`
15
- `)}function Ct(e){let n=kt(e.sender),t=kt(e.receiver),s=e.direction==="outbound"?`${n} (you) \u2192 ${t}`:`${n} \u2192 ${t} (you)`;return[`${ar[e.direction]} ${s}`,`Job: ${cr(e.jobId)}`,Ne,`\u300C${ur(e.content)}\u300D`,Ne].join(`
16
- `)}function lr(e){let n=Ct(e),t="[notifyAgentMessageToUser]";gn(n,{jobId:e.jobId}).then(s=>{u(`${t} 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=${s.dispatched.join(",")} failed=${s.failed.join(",")}`)},s=>{u(`${t} error direction=${e.direction} senderAgentId=${e.sender.agentId??""} receiverAgentId=${e.receiver.agentId??""} jobId=${e.jobId} err=${s instanceof Error?s.message:String(s)}`),g.error(a.USER_DISPATCH_FAILED,s instanceof Error?s:new Error(String(s)),{source:"notifyAgentMessageToUser",direction:e.direction,jobId:e.jobId,senderAgentId:e.sender.agentId??"",receiverAgentId:e.receiver.agentId??""})})}function gr(e){try{return JSON.stringify(e,null,2)??String(e)}catch{return JSON.stringify(e,(n,t)=>typeof t=="bigint"?t.toString():t instanceof Uint8Array?Buffer.from(t).toString("hex"):t,2)??String(e)}}function vt(e){return["System Message",Ne,"```json",gr(e),"```",Ne].join(`
17
- `)}function fr(e){let n=vt(e),t="[notifySystemMessageToUser]";gn(n).then(s=>{u(`${t} delivered=${s.dispatched.join(",")} failed=${s.failed.join(",")}`)},s=>{u(`${t} error err=${s instanceof Error?s.message:String(s)}`),g.error(a.USER_DISPATCH_FAILED,s instanceof Error?s:new Error(String(s)),{source:"notifySystemMessageToUser"})})}function cn(e){let n=e.base?.trim();if(!n)return(0,M.randomUUID)();let t=(0,M.createHash)("sha256").update(n).update("\0").update(e.purpose).update("\0").update(e.channel).update("\0").update(e.sessionKey).digest("hex");return`okx-a2a:${e.purpose}:${t}`}function un(e){let n=Jn(e);return!n||G.has(n.channel)?null:n}function ln(e,n){let t=n.threadId?.trim();t&&(e.threadId=t)}async function Pt(e){let n=e.label?`[${e.label}] ${e.content}`:e.content;if(e.target.to&&!De.has(e.channel)){let t={to:e.target.to,message:n,channel:e.channel,sessionKey:e.target.sessionKey,idempotencyKey:cn({base:e.idempotencyKey,purpose:"dispatch-user",channel:e.channel,sessionKey:e.target.sessionKey})};e.target.accountId&&(t.accountId=e.target.accountId),ln(t,e.target),await _({method:"send",params:t});return}await Q({sessionKey:e.target.sessionKey,message:e.content,label:e.label})}async function an(e){let{channel:n,target:t,llmContent:s,userContent:r}=e,o=await He({key:t.sessionKey,message:s,idempotencyKey:cn({base:e.idempotencyKey,purpose:"prompt-llm",channel:n,sessionKey:t.sessionKey})});if(o.runId?e.onRunStarted?.(o.runId):u(`[xmtp_prompt_user:queue] sessions.send returned without runId sessionKey=${t.sessionKey} channel=${n}`),t.to&&!De.has(n)){let i={to:t.to,message:r,channel:n,sessionKey:t.sessionKey,idempotencyKey:cn({base:e.idempotencyKey,purpose:"prompt-user",channel:n,sessionKey:t.sessionKey})};return t.accountId&&(i.accountId=t.accountId),ln(i,t),await _({method:"send",params:i}),{runId:o.runId}}return await Q({sessionKey:t.sessionKey,message:r}),{runId:o.runId}}async function gn(e,n){let s=Oe({jobId:n?.jobId,currentSessionKey:n?.currentSessionKey})?.targets??b();if(s.size===0)return u("[dispatchToUser] no deliverable user session found"),{dispatched:[],failed:[]};let r=[],o=[],i=n?.label,d=i?`[${i}] ${e}`:e;for(let[c,l]of s)if(!G.has(c))try{if(l.to&&!De.has(c)){let f={to:l.to,message:d,channel:c,sessionKey:l.sessionKey,idempotencyKey:(0,M.randomUUID)()};l.accountId&&(f.accountId=l.accountId),ln(f,l),await _({method:"send",params:f})}else await Q({sessionKey:l.sessionKey,message:e,label:i});r.push(c),u(`[dispatchToUser] delivered to ${c}${l.to?` \u2192 ${l.to}`:" (inject)"} sessionKey=${l.sessionKey} accountId=${l.accountId??"(none)"}`)}catch(f){o.push(c),u(`[dispatchToUser] delivery to ${c} failed:`,f),g.error(a.USER_DISPATCH_FAILED,f instanceof Error?f:new Error(String(f)),{source:"dispatchToUser",channel:c,sessionKey:l.sessionKey,hasTo:l.to?"1":"0"})}return{dispatched:r,failed:o}}async function fn(e){let n=Oe({jobId:e.jobId,currentSessionKey:e.currentSessionKey});if(n)return console.log(`[okx-a2a:gateway-method] dispatch_user stored routes jobId=${e.jobId??"(none)"} currentSessionKey=${e.currentSessionKey??"(none)"} routeCount=${n.targets.size} failed=${n.failed.length}`),we(n.targets,e,n.failed);let t=xt({jobId:e.jobId,currentSessionKey:e.currentSessionKey,contents:[e.content]});if(t)return console.log(`[okx-a2a:gateway-method] dispatch_user rebound remembered route jobId=${e.jobId??"(none)"} routeCount=${t.targets.size} failed=${t.failed.length}`),we(t.targets,e,t.failed);let s=await we(b(),e);return Lt(e.jobId,s.dispatched,[e.content]),s}function pn(e){let n=new Map,t=[];for(let s of e){let r=un(s);if(!r){t.push({channel:"",sessionKey:s,error:"invalid user gateway session"});continue}n.set(r.channel,r.target)}return{targets:n,failed:t}}function Oe(e){let n=e.currentSessionKey?.trim()||mt(),t=_e({jobId:e.jobId,sessionKey:n});return t.length>0?pn(t):null}async function we(e,n,t=[]){if(e.size===0)return u("[okx-a2a:gateway-method] dispatch_user no deliverable user session found"),{ok:!1,dispatched:[],failed:t};let s=[],r=[...t];for(let[o,i]of e)if(!G.has(o))try{await Pt({channel:o,target:i,content:n.content,label:n.label,idempotencyKey:n.idempotencyKey}),s.push({channel:o,sessionKey:i.sessionKey}),u(`[okx-a2a:gateway-method] dispatch_user delivered channel=${o} sessionKey=${i.sessionKey}`)}catch(d){let c=d instanceof Error?d.message:String(d);r.push({channel:o,sessionKey:i.sessionKey,error:c}),u(`[okx-a2a:gateway-method] dispatch_user failed channel=${o} sessionKey=${i.sessionKey}: ${c}`),g.error(a.USER_DISPATCH_FAILED,d instanceof Error?d:new Error(String(d)),{source:"okx-a2a.dispatch_user",channel:o,sessionKey:i.sessionKey,hasTo:i.to?"1":"0"})}return{ok:s.length>0&&r.length===0,dispatched:s,failed:r}}async function yn(e){let{targets:n,failed:t}=pn(e.sessionKeys);return we(n,{content:e.content,label:e.label,idempotencyKey:e.idempotencyKey},t)}async function mn(e){let n=un(e.sessionKey);if(!n)return{ok:!1,dispatched:[],failed:[{channel:"",sessionKey:e.sessionKey,error:"invalid user gateway session"}]};try{return await Pt({channel:n.channel,target:n.target,content:e.content,label:e.label,idempotencyKey:e.idempotencyKey}),console.log(`[okx-a2a:gateway-method] dispatch_user delivered routed channel=${n.channel} sessionKey=${e.sessionKey}`),{ok:!0,dispatched:[{channel:n.channel,sessionKey:e.sessionKey}],failed:[]}}catch(t){let s=t instanceof Error?t.message:String(t);return g.error(a.USER_DISPATCH_FAILED,t instanceof Error?t:new Error(String(t)),{source:"okx-a2a.dispatch_user",channel:n.channel,sessionKey:e.sessionKey,hasTo:n.target.to?"1":"0"}),{ok:!1,dispatched:[],failed:[{channel:n.channel,sessionKey:e.sessionKey,error:s}]}}}async function En(e){let{queuePromptUserAction:n}=await Promise.resolve().then(()=>(oe(),he)),t=Oe({jobId:e.jobId,currentSessionKey:e.currentSessionKey});if(t)return console.log(`[okx-a2a:gateway-method] prompt_user stored routes jobId=${e.jobId??"(none)"} currentSessionKey=${e.currentSessionKey??"(none)"} routeCount=${t.targets.size} failed=${t.failed.length}`),Re(t.targets,e,t.failed,n);let s=xt({jobId:e.jobId,currentSessionKey:e.currentSessionKey,contents:[e.userContent,e.llmContent]});if(s)return console.log(`[okx-a2a:gateway-method] prompt_user rebound remembered route jobId=${e.jobId??"(none)"} routeCount=${s.targets.size} failed=${s.failed.length}`),Re(s.targets,e,s.failed,n);let r=await Re(b(),e,[],n);return Lt(e.jobId,r.dispatched,[e.userContent,e.llmContent]),r}function xt(e){let n=Se({sessionKey:e.currentSessionKey});return n.length===0||nn({jobId:e.jobId,contents:e.contents,sessionKeys:n}).length===0?null:Oe({jobId:e.jobId,currentSessionKey:e.currentSessionKey})}function Lt(e,n,t){let s=n.map(r=>r.sessionKey).filter(Boolean);s.length!==0&&nn({jobId:e,contents:t,sessionKeys:s})}async function Re(e,n,t=[],s){if(e.size===0)return u("[okx-a2a:gateway-method] prompt_user no deliverable user session found"),{ok:!1,dispatched:[],failed:t};let r=[],o=[...t];for(let[i,d]of e)if(!G.has(i))try{let c=await s({channel:i,target:d,llmContent:n.llmContent,userContent:n.userContent,idempotencyKey:n.idempotencyKey});r.push({channel:i,sessionKey:d.sessionKey,status:c.status,size:c.size}),u(`[okx-a2a:gateway-method] prompt_user ${c.status} channel=${i} sessionKey=${d.sessionKey} size=${c.size}`)}catch(c){let l=c instanceof Error?c.message:String(c);o.push({channel:i,sessionKey:d.sessionKey,error:l}),u(`[okx-a2a:gateway-method] prompt_user failed channel=${i} sessionKey=${d.sessionKey}: ${l}`),g.error(a.PROMPT_USER_FAILED,c instanceof Error?c:new Error(String(c)),{source:"okx-a2a.prompt_user",channel:i,sessionKey:d.sessionKey})}return{ok:r.length>0&&o.length===0,dispatched:r,failed:o}}async function In(e){let{queuePromptUserAction:n}=await Promise.resolve().then(()=>(oe(),he)),{targets:t,failed:s}=pn(e.sessionKeys);return Re(t,{llmContent:e.llmContent,userContent:e.userContent,idempotencyKey:e.idempotencyKey},s,n)}async function Sn(e){let{queuePromptUserAction:n}=await Promise.resolve().then(()=>(oe(),he)),t=un(e.sessionKey);if(!t)return{ok:!1,dispatched:[],failed:[{channel:"",sessionKey:e.sessionKey,error:"invalid user gateway session"}]};try{let s=await n({channel:t.channel,target:t.target,llmContent:e.llmContent,userContent:e.userContent,idempotencyKey:e.idempotencyKey});return console.log(`[okx-a2a:gateway-method] prompt_user ${s.status} routed channel=${t.channel} sessionKey=${e.sessionKey} size=${s.size}`),{ok:!0,dispatched:[{channel:t.channel,sessionKey:e.sessionKey,status:s.status,size:s.size}],failed:[]}}catch(s){let r=s instanceof Error?s.message:String(s);return g.error(a.PROMPT_USER_FAILED,s instanceof Error?s:new Error(String(s)),{source:"okx-a2a.prompt_user",channel:t.channel,sessionKey:e.sessionKey}),{ok:!1,dispatched:[],failed:[{channel:t.channel,sessionKey:e.sessionKey,error:r}]}}}async function _n(e,n){let t=b();if(t.size===0)return u("[sendLlmToLatestUserSessions] no latest user session found"),{dispatched:[],failed:[]};let s=[],r=[];for(let[o,i]of t)if(!G.has(o))try{await R().subagent.run({sessionKey:i.sessionKey,message:e,deliver:!0,idempotencyKey:(0,M.randomUUID)()}),s.push(o),u(`[sendLlmToLatestUserSessions] sent to ${o} sessionKey=${i.sessionKey}`)}catch(d){r.push(o),u(`[sendLlmToLatestUserSessions] send to ${o} failed:`,d),g.error(a.USER_DISPATCH_FAILED,d instanceof Error?d:new Error(String(d)),{source:n?.source??"sendLlmToLatestUserSessions",channel:o,sessionKey:i.sessionKey})}return{dispatched:s,failed:r}}var M,Kt,ar,Ne,Nt,Dt,Ot,bt,dn,Te,G,De,ie=E(()=>{"use strict";I();M=require("node:crypto");U();P();Ve();Qe();ht();D();q();Kt=(t=>(t.OUTBOUND="outbound",t.INBOUND="inbound",t))(Kt||{}),ar={outbound:"\u{1F4E4} [Sent]",inbound:"\u{1F4E5} [Received]"},Ne="\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",Nt=6,Dt=4,Ot=6,bt=4,dn="...",Te=8;G=new Set(["heartbeat","cron","webhook","voice"]),De=new Set(["webchat","tui"])});var Cr={};ce(Cr,{default:()=>Kr});module.exports=Yt(Cr);I();q();I();D();var ns="main",$n={id:"okx-a2a",meta:{id:"okx-a2a",label:"OKX A2A",selectionLabel:"OKX A2A",docsPath:"channels/okx-a2a",blurb:"E2E encrypted communication (wallet-to-agent)",order:101},capabilities:{chatTypes:["group"],media:!1,reply:!0},reload:{configPrefixes:["channels.okx-a2a"]},config:{resolveAccount:async()=>({}),listAccountIds:()=>[ns]},outbound:{deliveryMode:"direct"},gateway:{startAccount:async e=>{e.setStatus({accountId:e.accountId,connected:!0,lastConnectedAt:Date.now(),lastEventAt:Date.now()}),u(`[okx-a2a:${e.accountId}] startAccount activated`),await new Promise(n=>{e.abortSignal.addEventListener("abort",()=>n(),{once:!0})}),u(`[okx-a2a:${e.accountId}] received abort signal, cleaning up...`)},stopAccount:async()=>{u("[okx-a2a] stopAccount"),await Un()}}};I();U();P();D();var ut=async e=>{let n=et(e),t=[];for(let s of n)await Be({key:s,...e.deleteTranscript!==void 0?{deleteTranscript:e.deleteTranscript}:{}}),t.push(s),u(`[okx-a2a] session deleted: ${s}`),g.info(a.SESSION_DELETED,{sessionKey:s,...z({sessionKey:s})});return{ok:!0,deleted:t.length,deletedSessionKeys:t,matched:n.length}};U();P();ie();oe();Ve();Qe();I();var $t=require("node:os"),hn=require("node:path"),Mt=require("node:fs");D();var pr=15e3,yr=50,mr=1;function Er(e=process.env){return e.OKX_AGENT_TASK_HOME?.trim()||(0,hn.join)((0,$t.homedir)(),".okx-agent-task")}function Ir(e=process.env){return e.OKX_A2A_OUTBOX_DB_PATH?.trim()||(0,hn.join)(Er(e),"sqlite","session-store.sqlite")}function Sr(){let e=process.emitWarning;process.emitWarning=((n,...t)=>{if(!((typeof n=="string"?n:n.message).includes("SQLite is an experimental feature")&&t.some(r=>r==="ExperimentalWarning")))return e.call(process,n,...t)});try{return require("node:sqlite")}finally{process.emitWarning=e}}function Ut(e,n){let t=Array.isArray(n.dispatched)?n.dispatched.length:0,s=Array.isArray(n.failed)?n.failed.length:0,r=`${e} delivered=${t} failed=${s}`;return{delivered:t>0,message:r,partial:t>0&&s>0}}async function _r(e){let n=e.message_id??void 0;if(e.kind==="dispatch_user_latest"){let{dispatchUserToLatestSessions:r}=await Promise.resolve().then(()=>(ie(),An)),o=await r({content:e.content,jobId:e.job_id,idempotencyKey:n});return Ut(e.kind,o)}if(e.kind==="prompt_user_latest"){if(!e.llm_content)throw new Error("prompt_user_latest missing llm_content");let{promptUserToLatestSessions:r}=await Promise.resolve().then(()=>(ie(),An)),o=await r({userContent:e.content,llmContent:e.llm_content,jobId:e.job_id,idempotencyKey:n});return Ut(e.kind,o)}let{callChatInject:t,callSessionsSend:s}=await Promise.resolve().then(()=>(U(),ct));return e.kind==="chat_inject"?(e.llm_content&&await s({key:e.session_key,message:e.llm_content,idempotencyKey:n}),await t({sessionKey:e.session_key,message:e.content}),{delivered:!0}):(await s({key:e.session_key,message:e.content,idempotencyKey:n}),{delivered:!0})}async function Ar(e={}){let n=e.dbPath??Ir();if(!(0,Mt.existsSync)(n))return{delivered:0,failed:0,abandoned:0,skipped:!0};let{DatabaseSync:t}=Sr(),s=new t(n);try{if(s.exec("PRAGMA busy_timeout=5000"),s.exec("PRAGMA journal_mode=WAL"),!s.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='pending_gateway_deliveries'").get())return{delivered:0,failed:0,abandoned:0,skipped:!0};let o=s.prepare(`
15
+ `)}function Ct(e){let n=kt(e.sender),t=kt(e.receiver),s=e.direction==="outbound"?`${n} (you) \u2192 ${t}`:`${n} \u2192 ${t} (you)`;return[`${ar[e.direction]} ${s}`,`Job: ${cr(e.jobId)}`,De,`\u300C${ur(e.content)}\u300D`,De].join(`
16
+ `)}function lr(e){let n=Ct(e),t="[notifyAgentMessageToUser]";gn(n,{jobId:e.jobId}).then(s=>{u(`${t} 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=${s.dispatched.join(",")} failed=${s.failed.join(",")}`)},s=>{u(`${t} error direction=${e.direction} senderAgentId=${e.sender.agentId??""} receiverAgentId=${e.receiver.agentId??""} jobId=${e.jobId} err=${s instanceof Error?s.message:String(s)}`),g.error(a.USER_DISPATCH_FAILED,s instanceof Error?s:new Error(String(s)),{source:"notifyAgentMessageToUser",direction:e.direction,jobId:e.jobId,senderAgentId:e.sender.agentId??"",receiverAgentId:e.receiver.agentId??""})})}function gr(e){try{return JSON.stringify(e,null,2)??String(e)}catch{return JSON.stringify(e,(n,t)=>typeof t=="bigint"?t.toString():t instanceof Uint8Array?Buffer.from(t).toString("hex"):t,2)??String(e)}}function vt(e){return["System Message",De,"```json",gr(e),"```",De].join(`
17
+ `)}function fr(e){let n=vt(e),t="[notifySystemMessageToUser]";gn(n).then(s=>{u(`${t} delivered=${s.dispatched.join(",")} failed=${s.failed.join(",")}`)},s=>{u(`${t} error err=${s instanceof Error?s.message:String(s)}`),g.error(a.USER_DISPATCH_FAILED,s instanceof Error?s:new Error(String(s)),{source:"notifySystemMessageToUser"})})}function cn(e){let n=e.base?.trim();if(!n)return(0,M.randomUUID)();let t=(0,M.createHash)("sha256").update(n).update("\0").update(e.purpose).update("\0").update(e.channel).update("\0").update(e.sessionKey).digest("hex");return`okx-a2a:${e.purpose}:${t}`}function un(e){let n=Jn(e);return!n||G.has(n.channel)?null:n}function ln(e,n){let t=n.threadId?.trim();t&&(e.threadId=t)}async function Pt(e){let n=e.label?`[${e.label}] ${e.content}`:e.content;if(e.target.to&&!Ne.has(e.channel)){let t={to:e.target.to,message:n,channel:e.channel,sessionKey:e.target.sessionKey,idempotencyKey:cn({base:e.idempotencyKey,purpose:"dispatch-user",channel:e.channel,sessionKey:e.target.sessionKey})};e.target.accountId&&(t.accountId=e.target.accountId),ln(t,e.target),await S({method:"send",params:t});return}await Q({sessionKey:e.target.sessionKey,message:e.content,label:e.label})}async function an(e){let{channel:n,target:t,llmContent:s,userContent:r}=e,o=await He({key:t.sessionKey,message:s,idempotencyKey:cn({base:e.idempotencyKey,purpose:"prompt-llm",channel:n,sessionKey:t.sessionKey})});if(o.runId?e.onRunStarted?.(o.runId):u(`[xmtp_prompt_user:queue] sessions.send returned without runId sessionKey=${t.sessionKey} channel=${n}`),t.to&&!Ne.has(n)){let i={to:t.to,message:r,channel:n,sessionKey:t.sessionKey,idempotencyKey:cn({base:e.idempotencyKey,purpose:"prompt-user",channel:n,sessionKey:t.sessionKey})};return t.accountId&&(i.accountId=t.accountId),ln(i,t),await S({method:"send",params:i}),{runId:o.runId}}return await Q({sessionKey:t.sessionKey,message:r}),{runId:o.runId}}async function gn(e,n){let s=Oe({jobId:n?.jobId,currentSessionKey:n?.currentSessionKey})?.targets??b();if(s.size===0)return u("[dispatchToUser] no deliverable user session found"),{dispatched:[],failed:[]};let r=[],o=[],i=n?.label,d=i?`[${i}] ${e}`:e;for(let[c,l]of s)if(!G.has(c))try{if(l.to&&!Ne.has(c)){let f={to:l.to,message:d,channel:c,sessionKey:l.sessionKey,idempotencyKey:(0,M.randomUUID)()};l.accountId&&(f.accountId=l.accountId),ln(f,l),await S({method:"send",params:f})}else await Q({sessionKey:l.sessionKey,message:e,label:i});r.push(c),u(`[dispatchToUser] delivered to ${c}${l.to?` \u2192 ${l.to}`:" (inject)"} sessionKey=${l.sessionKey} accountId=${l.accountId??"(none)"}`)}catch(f){o.push(c),u(`[dispatchToUser] delivery to ${c} failed:`,f),g.error(a.USER_DISPATCH_FAILED,f instanceof Error?f:new Error(String(f)),{source:"dispatchToUser",channel:c,sessionKey:l.sessionKey,hasTo:l.to?"1":"0"})}return{dispatched:r,failed:o}}async function fn(e){let n=Oe({jobId:e.jobId,currentSessionKey:e.currentSessionKey});if(n)return console.log(`[okx-a2a:gateway-method] dispatch_user stored routes jobId=${e.jobId??"(none)"} currentSessionKey=${e.currentSessionKey??"(none)"} routeCount=${n.targets.size} failed=${n.failed.length}`),we(n.targets,e,n.failed);let t=xt({jobId:e.jobId,currentSessionKey:e.currentSessionKey,contents:[e.content]});if(t)return console.log(`[okx-a2a:gateway-method] dispatch_user rebound remembered route jobId=${e.jobId??"(none)"} routeCount=${t.targets.size} failed=${t.failed.length}`),we(t.targets,e,t.failed);let s=await we(b(),e);return Lt(e.jobId,s.dispatched,[e.content]),s}function pn(e){let n=new Map,t=[];for(let s of e){let r=un(s);if(!r){t.push({channel:"",sessionKey:s,error:"invalid user gateway session"});continue}n.set(r.channel,r.target)}return{targets:n,failed:t}}function Oe(e){let n=e.currentSessionKey?.trim()||mt(),t=Se({jobId:e.jobId,sessionKey:n});return t.length>0?pn(t):null}async function we(e,n,t=[]){if(e.size===0)return u("[okx-a2a:gateway-method] dispatch_user no deliverable user session found"),{ok:!1,dispatched:[],failed:t};let s=[],r=[...t];for(let[o,i]of e)if(!G.has(o))try{await Pt({channel:o,target:i,content:n.content,label:n.label,idempotencyKey:n.idempotencyKey}),s.push({channel:o,sessionKey:i.sessionKey}),u(`[okx-a2a:gateway-method] dispatch_user delivered channel=${o} sessionKey=${i.sessionKey}`)}catch(d){let c=d instanceof Error?d.message:String(d);r.push({channel:o,sessionKey:i.sessionKey,error:c}),u(`[okx-a2a:gateway-method] dispatch_user failed channel=${o} sessionKey=${i.sessionKey}: ${c}`),g.error(a.USER_DISPATCH_FAILED,d instanceof Error?d:new Error(String(d)),{source:"okx-a2a.dispatch_user",channel:o,sessionKey:i.sessionKey,hasTo:i.to?"1":"0"})}return{ok:s.length>0&&r.length===0,dispatched:s,failed:r}}async function yn(e){let{targets:n,failed:t}=pn(e.sessionKeys);return we(n,{content:e.content,label:e.label,idempotencyKey:e.idempotencyKey},t)}async function mn(e){let n=un(e.sessionKey);if(!n)return{ok:!1,dispatched:[],failed:[{channel:"",sessionKey:e.sessionKey,error:"invalid user gateway session"}]};try{return await Pt({channel:n.channel,target:n.target,content:e.content,label:e.label,idempotencyKey:e.idempotencyKey}),console.log(`[okx-a2a:gateway-method] dispatch_user delivered routed channel=${n.channel} sessionKey=${e.sessionKey}`),{ok:!0,dispatched:[{channel:n.channel,sessionKey:e.sessionKey}],failed:[]}}catch(t){let s=t instanceof Error?t.message:String(t);return g.error(a.USER_DISPATCH_FAILED,t instanceof Error?t:new Error(String(t)),{source:"okx-a2a.dispatch_user",channel:n.channel,sessionKey:e.sessionKey,hasTo:n.target.to?"1":"0"}),{ok:!1,dispatched:[],failed:[{channel:n.channel,sessionKey:e.sessionKey,error:s}]}}}async function En(e){let{queuePromptUserAction:n}=await Promise.resolve().then(()=>(oe(),he)),t=Oe({jobId:e.jobId,currentSessionKey:e.currentSessionKey});if(t)return console.log(`[okx-a2a:gateway-method] prompt_user stored routes jobId=${e.jobId??"(none)"} currentSessionKey=${e.currentSessionKey??"(none)"} routeCount=${t.targets.size} failed=${t.failed.length}`),Re(t.targets,e,t.failed,n);let s=xt({jobId:e.jobId,currentSessionKey:e.currentSessionKey,contents:[e.userContent,e.llmContent]});if(s)return console.log(`[okx-a2a:gateway-method] prompt_user rebound remembered route jobId=${e.jobId??"(none)"} routeCount=${s.targets.size} failed=${s.failed.length}`),Re(s.targets,e,s.failed,n);let r=await Re(b(),e,[],n);return Lt(e.jobId,r.dispatched,[e.userContent,e.llmContent]),r}function xt(e){let n=_e({sessionKey:e.currentSessionKey});return n.length===0||nn({jobId:e.jobId,contents:e.contents,sessionKeys:n}).length===0?null:Oe({jobId:e.jobId,currentSessionKey:e.currentSessionKey})}function Lt(e,n,t){let s=n.map(r=>r.sessionKey).filter(Boolean);s.length!==0&&nn({jobId:e,contents:t,sessionKeys:s})}async function Re(e,n,t=[],s){if(e.size===0)return u("[okx-a2a:gateway-method] prompt_user no deliverable user session found"),{ok:!1,dispatched:[],failed:t};let r=[],o=[...t];for(let[i,d]of e)if(!G.has(i))try{let c=await s({channel:i,target:d,llmContent:n.llmContent,userContent:n.userContent,idempotencyKey:n.idempotencyKey});r.push({channel:i,sessionKey:d.sessionKey,status:c.status,size:c.size}),u(`[okx-a2a:gateway-method] prompt_user ${c.status} channel=${i} sessionKey=${d.sessionKey} size=${c.size}`)}catch(c){let l=c instanceof Error?c.message:String(c);o.push({channel:i,sessionKey:d.sessionKey,error:l}),u(`[okx-a2a:gateway-method] prompt_user failed channel=${i} sessionKey=${d.sessionKey}: ${l}`),g.error(a.PROMPT_USER_FAILED,c instanceof Error?c:new Error(String(c)),{source:"okx-a2a.prompt_user",channel:i,sessionKey:d.sessionKey})}return{ok:r.length>0&&o.length===0,dispatched:r,failed:o}}async function In(e){let{queuePromptUserAction:n}=await Promise.resolve().then(()=>(oe(),he)),{targets:t,failed:s}=pn(e.sessionKeys);return Re(t,{llmContent:e.llmContent,userContent:e.userContent,idempotencyKey:e.idempotencyKey},s,n)}async function _n(e){let{queuePromptUserAction:n}=await Promise.resolve().then(()=>(oe(),he)),t=un(e.sessionKey);if(!t)return{ok:!1,dispatched:[],failed:[{channel:"",sessionKey:e.sessionKey,error:"invalid user gateway session"}]};try{let s=await n({channel:t.channel,target:t.target,llmContent:e.llmContent,userContent:e.userContent,idempotencyKey:e.idempotencyKey});return console.log(`[okx-a2a:gateway-method] prompt_user ${s.status} routed channel=${t.channel} sessionKey=${e.sessionKey} size=${s.size}`),{ok:!0,dispatched:[{channel:t.channel,sessionKey:e.sessionKey,status:s.status,size:s.size}],failed:[]}}catch(s){let r=s instanceof Error?s.message:String(s);return g.error(a.PROMPT_USER_FAILED,s instanceof Error?s:new Error(String(s)),{source:"okx-a2a.prompt_user",channel:t.channel,sessionKey:e.sessionKey}),{ok:!1,dispatched:[],failed:[{channel:t.channel,sessionKey:e.sessionKey,error:r}]}}}async function Sn(e,n){let t=b();if(t.size===0)return u("[sendLlmToLatestUserSessions] no latest user session found"),{dispatched:[],failed:[]};let s=[],r=[];for(let[o,i]of t)if(!G.has(o))try{await R().subagent.run({sessionKey:i.sessionKey,message:e,deliver:!0,idempotencyKey:(0,M.randomUUID)()}),s.push(o),u(`[sendLlmToLatestUserSessions] sent to ${o} sessionKey=${i.sessionKey}`)}catch(d){r.push(o),u(`[sendLlmToLatestUserSessions] send to ${o} failed:`,d),g.error(a.USER_DISPATCH_FAILED,d instanceof Error?d:new Error(String(d)),{source:n?.source??"sendLlmToLatestUserSessions",channel:o,sessionKey:i.sessionKey})}return{dispatched:s,failed:r}}var M,Kt,ar,De,Dt,Nt,Ot,bt,dn,Te,G,Ne,ie=E(()=>{"use strict";I();M=require("node:crypto");U();P();Ve();Qe();ht();N();q();Kt=(t=>(t.OUTBOUND="outbound",t.INBOUND="inbound",t))(Kt||{}),ar={outbound:"\u{1F4E4} [Sent]",inbound:"\u{1F4E5} [Received]"},De="\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",Dt=6,Nt=4,Ot=6,bt=4,dn="...",Te=8;G=new Set(["heartbeat","cron","webhook","voice"]),Ne=new Set(["webchat","tui"])});var Cr={};ce(Cr,{default:()=>Kr});module.exports=Xt(Cr);I();q();I();N();var ns="main",$n={id:"okx-a2a",meta:{id:"okx-a2a",label:"OKX A2A",selectionLabel:"OKX A2A",docsPath:"channels/okx-a2a",blurb:"E2E encrypted communication (wallet-to-agent)",order:101},capabilities:{chatTypes:["group"],media:!1,reply:!0},reload:{configPrefixes:["channels.okx-a2a"]},config:{resolveAccount:async()=>({}),listAccountIds:()=>[ns]},outbound:{deliveryMode:"direct"},gateway:{startAccount:async e=>{e.setStatus({accountId:e.accountId,connected:!0,lastConnectedAt:Date.now(),lastEventAt:Date.now()}),u(`[okx-a2a:${e.accountId}] startAccount activated`),await new Promise(n=>{e.abortSignal.addEventListener("abort",()=>n(),{once:!0})}),u(`[okx-a2a:${e.accountId}] received abort signal, cleaning up...`)},stopAccount:async()=>{u("[okx-a2a] stopAccount"),await Un()}}};I();U();P();N();var ut=async e=>{let n=et(e),t=[];for(let s of n)await Be({key:s,...e.deleteTranscript!==void 0?{deleteTranscript:e.deleteTranscript}:{}}),t.push(s),u(`[okx-a2a] session deleted: ${s}`),g.info(a.SESSION_DELETED,{sessionKey:s,...z({sessionKey:s})});return{ok:!0,deleted:t.length,deletedSessionKeys:t,matched:n.length}};U();P();ie();oe();Ve();Qe();I();var $t=require("node:os"),hn=require("node:path"),Mt=require("node:fs");N();var pr=15e3,yr=50,mr=1;function Er(e=process.env){return e.OKX_AGENT_TASK_HOME?.trim()||(0,hn.join)((0,$t.homedir)(),".okx-agent-task")}function Ir(e=process.env){return e.OKX_A2A_OUTBOX_DB_PATH?.trim()||(0,hn.join)(Er(e),"sqlite","session-store.sqlite")}function _r(){let e=process.emitWarning;process.emitWarning=((n,...t)=>{if(!((typeof n=="string"?n:n.message).includes("SQLite is an experimental feature")&&t.some(r=>r==="ExperimentalWarning")))return e.call(process,n,...t)});try{return require("node:sqlite")}finally{process.emitWarning=e}}function Ut(e,n){let t=Array.isArray(n.dispatched)?n.dispatched.length:0,s=Array.isArray(n.failed)?n.failed.length:0,r=`${e} delivered=${t} failed=${s}`;return{delivered:t>0,message:r,partial:t>0&&s>0}}async function Sr(e){let n=e.message_id??void 0;if(e.kind==="dispatch_user_latest"){let{dispatchUserToLatestSessions:r}=await Promise.resolve().then(()=>(ie(),An)),o=await r({content:e.content,jobId:e.job_id,idempotencyKey:n});return Ut(e.kind,o)}if(e.kind==="prompt_user_latest"){if(!e.llm_content)throw new Error("prompt_user_latest missing llm_content");let{promptUserToLatestSessions:r}=await Promise.resolve().then(()=>(ie(),An)),o=await r({userContent:e.content,llmContent:e.llm_content,jobId:e.job_id,idempotencyKey:n});return Ut(e.kind,o)}let{callChatInject:t,callSessionsSend:s}=await Promise.resolve().then(()=>(U(),ct));return e.kind==="chat_inject"?(e.llm_content&&await s({key:e.session_key,message:e.llm_content,idempotencyKey:n}),await t({sessionKey:e.session_key,message:e.content}),{delivered:!0}):(await s({key:e.session_key,message:e.content,idempotencyKey:n}),{delivered:!0})}async function Ar(e={}){let n=e.dbPath??Ir();if(!(0,Mt.existsSync)(n))return{delivered:0,failed:0,abandoned:0,skipped:!0};let{DatabaseSync:t}=_r(),s=new t(n);try{if(s.exec("PRAGMA busy_timeout=5000"),s.exec("PRAGMA journal_mode=WAL"),!s.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='pending_gateway_deliveries'").get())return{delivered:0,failed:0,abandoned:0,skipped:!0};let o=s.prepare(`
18
18
  SELECT id, kind, provider, session_key, job_id, content, llm_content, message_id, attempts
19
19
  FROM pending_gateway_deliveries
20
20
  WHERE provider = 'openclaw'
21
21
  ORDER BY created_at ASC, id ASC
22
22
  LIMIT ?
23
- `).all(e.limit??yr),i=0,d=0,c=0,l=e.deliver??_r;for(let f of o)try{let p=await l(f);if(!p.delivered)throw new Error(p.message??`${f.kind} did not deliver to any user session`);s.prepare("DELETE FROM pending_gateway_deliveries WHERE id = ?").run(f.id),i+=1,p.partial&&u(`[okx-a2a:outbox-drain] delivery partially delivered id=${f.id} kind=${f.kind}: ${p.message??""}`)}catch(p){d+=1;let ae=p instanceof Error?p.message:String(p),Dn=f.attempts+1;f.attempts>=mr?(s.prepare("DELETE FROM pending_gateway_deliveries WHERE id = ?").run(f.id),c+=1,u(`[okx-a2a:outbox-drain] delivery abandoned id=${f.id} kind=${f.kind} attempts=${Dn}: ${ae}`)):(s.prepare(`
23
+ `).all(e.limit??yr),i=0,d=0,c=0,l=e.deliver??Sr;for(let f of o)try{let p=await l(f);if(!p.delivered)throw new Error(p.message??`${f.kind} did not deliver to any user session`);s.prepare("DELETE FROM pending_gateway_deliveries WHERE id = ?").run(f.id),i+=1,p.partial&&u(`[okx-a2a:outbox-drain] delivery partially delivered id=${f.id} kind=${f.kind}: ${p.message??""}`)}catch(p){d+=1;let ae=p instanceof Error?p.message:String(p),Nn=f.attempts+1;f.attempts>=mr?(s.prepare("DELETE FROM pending_gateway_deliveries WHERE id = ?").run(f.id),c+=1,u(`[okx-a2a:outbox-drain] delivery abandoned id=${f.id} kind=${f.kind} attempts=${Nn}: ${ae}`)):(s.prepare(`
24
24
  UPDATE pending_gateway_deliveries
25
25
  SET attempts = attempts + 1, last_error = ?, last_attempt_at = ?
26
26
  WHERE id = ?
27
- `).run(ae,new Date().toISOString(),f.id),u(`[okx-a2a:outbox-drain] delivery failed id=${f.id} kind=${f.kind} attempts=${Dn}: ${ae}`))}return(i>0||d>0)&&g.info(a.SESSION_DISPATCHED,{onchainosAgentId:"*",source:"gateway_outbox_drain",deliveredCount:String(i),failedCount:String(d),abandonedCount:String(c),batchSize:String(o.length)}),{delivered:i,failed:d,abandoned:c,skipped:!1}}finally{s.close()}}function Gt(e={}){let n=e.intervalMs??pr,t=!1,s=async()=>{if(!t){t=!0;try{await Ar({...e.dbPath!==void 0?{dbPath:e.dbPath}:{},...e.limit!==void 0?{limit:e.limit}:{}})}catch(o){u("[okx-a2a:outbox-drain] tick failed:",o)}finally{t=!1}}},r=setInterval(()=>{s()},n);return r.unref?.(),s(),()=>{clearInterval(r)}}D();var hr=process.env.SENTRY_ENV==="dev"?"dev":"prod",jt={projectName:"okx/openclaw-okx-a2a-extension",release:"0.1.6",environment:hr};var j,F,Tr="https://e20ff987c945887733de9ec6cca87aba@sentry.coinall.ltd/apmfe/70295";function wr(e){let n=e?.details?.requestId;return typeof n=="string"&&n.trim()?`openclaw devices approve ${n}`:"openclaw devices approve --latest"}function Rr(e){let n=e?.details??{},t=Ie(e);return["OKX A2A plugin needs OpenClaw gateway `operator.admin` scope before it can create sessions, inject chat messages, and route XMTP conversations.","","Ask the user whether they approve granting this scope to the OKX A2A plugin.","","If the user approves, ask them to run this command on the OpenClaw host:","","```bash",wr(e),"```","",`requestId: ${n.requestId??""}`,`deviceId: ${n.deviceId??""}`,`requestedScopes: ${Array.isArray(n.requestedScopes)?n.requestedScopes.join(","):""}`,`approvedScopes: ${Array.isArray(n.approvedScopes)?n.approvedScopes.join(","):""}`,t?`hint: ${t}`:""].filter(Boolean).join(`
28
- `)}function Nr(){J({key:Zn()}).then(()=>{u("[okx-a2a:service] gateway client admin precheck succeeded"),g.info(a.GATEWAY_STARTED,{source:"gateway_preconnect",outcome:"ok"})},e=>{u("[okx-a2a:service] gateway client admin precheck failed:",e),g.error(a.GATEWAY_CONNECT_FAILED,e instanceof Error?e:new Error(String(e)),{source:"gateway_preconnect",code:String(e?.gatewayCode??e?.details?.code??""),reason:String(e?.details?.reason??""),requestId:String(e?.details?.requestId??"")}),_n(Rr(e),{source:"gateway_preconnect"}).then(({dispatched:n,failed:t})=>{g.info(a.USER_DISPATCHED,{source:"gateway_preconnect",outcome:t.length===0?"all_ok":"partial",dispatchedChannels:n.join(","),failedChannels:t.join(","),dispatchedCount:String(n.length),failedCount:String(t.length)})},n=>{g.error(a.USER_DISPATCH_FAILED,n instanceof Error?n:new Error(String(n)),{source:"gateway_preconnect"})})})}function Dr(){let e=process.env.OKX_A2A_SENTRY_DSN?.trim()||process.env.SENTRY_DSN?.trim()||Tr;Ln({dsn:e,...jt,agentPlatform:"openclaw"})}function Tn(e,n){let t=[e?.sessionKey,e?.context?.sessionKey,e?.ctx?.sessionKey,e?.hookContext?.sessionKey,n?.sessionKey];for(let s of t)if(typeof s=="string"&&s.trim())return s;return null}function wn(e,n){let t=[e?.runId,e?.agentRunId,e?.context?.runId,e?.context?.agentRunId,e?.ctx?.runId,e?.ctx?.agentRunId,e?.hookContext?.runId,e?.hookContext?.agentRunId,n?.runId,n?.agentRunId];for(let s of t)if(typeof s=="string"&&s.trim())return s;return null}function Or(e){let n=br(e),t=new Set([e]);for(let[s,r]of b())s&&s!==n&&r.sessionKey&&t.add(r.sessionKey);return[...t]}function br(e){let n=e.split(":");return n.length>=4&&n[0]==="agent"?n[2]??null:null}function Rn(e,n){let t=e[n];if(typeof t!="string"||!t.trim())throw new Error(`Missing required param ${n}`);return t}function m(e,n){let t=e[n];return typeof t=="string"&&t.trim()?t:void 0}function Nn(e,n){let t=e[n];if(!Array.isArray(t))return;let s=t.filter(r=>typeof r=="string"&&r.trim().length>0).map(r=>r.trim());return s.length>0?s:void 0}function kr(e,n){let t=e[n];return typeof t=="boolean"?t:void 0}var C={id:"okx-a2a",name:"OKX A2A Plugin",version:"0.1.6",register(e){Kn(e.runtime),e.registerChannel({plugin:$n}),e.registerGatewayMethod("okx-a2a.health",async({respond:n})=>{n(!0,{ok:!0,provider:"openclaw",pluginId:C.id,pluginVersion:C.version,startedAt:F??null})},{scope:"operator.admin"}),e.registerGatewayMethod("okx-a2a.dispatch_user",async({params:n,respond:t})=>{try{let s=Rn(n,"content"),r=m(n,"label"),o=m(n,"sessionKey"),i=Nn(n,"sessionKeys"),d=m(n,"jobId"),c=m(n,"currentSessionKey"),l=m(n,"idempotencyKey");t(!0,i?await yn({sessionKeys:i,content:s,label:r,idempotencyKey:l}):o?await mn({sessionKey:o,content:s,label:r,idempotencyKey:l}):await fn({content:s,label:r,jobId:d,currentSessionKey:c,idempotencyKey:l}))}catch(s){t(!1,void 0,{code:"INVALID_REQUEST",message:s instanceof Error?s.message:String(s)})}},{scope:"operator.admin"}),e.registerGatewayMethod("okx-a2a.prompt_user",async({params:n,respond:t})=>{try{let s=Rn(n,"userContent"),r=Rn(n,"llmContent"),o=m(n,"sessionKey"),i=Nn(n,"sessionKeys"),d=m(n,"jobId"),c=m(n,"currentSessionKey"),l=m(n,"idempotencyKey");t(!0,i?await In({sessionKeys:i,userContent:s,llmContent:r,idempotencyKey:l}):o?await Sn({sessionKey:o,userContent:s,llmContent:r,idempotencyKey:l}):await En({userContent:s,llmContent:r,jobId:d,currentSessionKey:c,idempotencyKey:l}))}catch(s){t(!1,void 0,{code:"INVALID_REQUEST",message:s instanceof Error?s.message:String(s)})}},{scope:"operator.admin"}),e.registerGatewayMethod("okx-a2a.delete_sessions",async({params:n,respond:t})=>{try{let s=m(n,"sessionKey"),r=Nn(n,"sessionKeys"),o=m(n,"jobId");if(!s&&!r&&!o)throw new Error("Missing required selector: sessionKey, sessionKeys, or jobId");let i=m(n,"myAgentId"),d=m(n,"toAgentId"),c=m(n,"myXmtpAddress"),l=m(n,"toXmtpAddress"),f=kr(n,"deleteTranscript");t(!0,await ut({...s?{sessionKey:s}:{},...r?{sessionKeys:r}:{},...o?{jobId:o}:{},...i?{myAgentId:i}:{},...d?{toAgentId:d}:{},...c?{myXmtpAddress:c}:{},...l?{toXmtpAddress:l}:{},...f!==void 0?{deleteTranscript:f}:{}}))}catch(s){t(!1,void 0,{code:"INVALID_REQUEST",message:s instanceof Error?s.message:String(s)})}},{scope:"operator.admin"}),e.registerHook("agent:bootstrap",async n=>{let t=n.context,s=t.bootstrapFiles;if(Array.isArray(s))try{let r=s.map(i=>`${i.name}(${i.missing?"missing":`${i.content?.length??0}b`})`).join(", ");u(`[okx-a2a:hook] agent:bootstrap agentId=${t.agentId??"?"} files=[${r}]`);let o=s.reduce((i,d)=>i+(d.content?.length??0),0);g.info(a.BOOTSTRAP_APPLIED,{openclawAgentId:t.agentId??"",promptSize:String(o),fileCount:String(s.length),missingCount:String(s.filter(i=>i.missing).length)})}catch(r){g.error(a.BOOTSTRAP_FAILED,r instanceof Error?r:void 0,{openclawAgentId:t.agentId??""})}},{name:"okx-a2a-agent-bootstrap"}),e.on("before_agent_run",async(n,t)=>{let s=Tn(n,t),r=wn(n,t);if(!s){u("[xmtp_prompt_user:queue] before_agent_run ignored: missing sessionKey");return}let o=Or(s);pt({runId:r,sessionKey:s,routeSessionKeys:o})&&console.log(`[okx-a2a:hook] remembered gateway route origin runId=${r} sessionKey=${s} routeSessionKeys=${o.join(",")}`),rn(s)}),e.on("before_tool_call",async(n,t)=>{let s=Tn(n,t),r=wn(n,t);Xe(s);let o=[...new Set([..._e({sessionKey:s}),...Se({runId:r,sessionKey:s})])],i=ft({toolName:n?.toolName,params:n?.params,sessionKey:s,routeSessionKeys:o});if(i)return console.log(`[okx-a2a:hook] injected gateway session env tool=${n?.toolName??"?"} sessionKey=${s} routeSessionKeys=${o.join(",")}`),{params:i}},{priority:50}),e.on("agent_end",async(n,t)=>{let s=Tn(n,t),r=wn(n,t);if(yt({runId:r,sessionKey:s}),!s){u("[xmtp_prompt_user:queue] agent_end ignored: missing sessionKey");return}on(s)}),e.registerService({id:"okx-a2a:core",start:async()=>{u("[okx-a2a:service] okx-a2a:core starting (multi-identity mode); initializing communication identities..."),F=Date.now(),Dr(),g.info(a.GATEWAY_STARTED,{onchainosAgentId:"*",pid:String(process.pid),pluginId:C.id,pluginVersion:C.version,nodeVersion:process.version,startedAt:String(F)}),Fe(),Nr(),j&&j(),j=Gt(),u("[okx-a2a:service] OpenClaw lightweight gateway initialized; node daemon owns XMTP receive/send/agent sync.")},stop:async()=>{j&&(j(),j=void 0),qe(),u("[okx-a2a:service] okx-a2a:core stopped");let n=Date.now();g.info(a.GATEWAY_STOPPED,{onchainosAgentId:"*",pid:String(process.pid),pluginId:C.id,pluginVersion:C.version,stoppedAt:String(n),uptimeMs:F?String(n-F):"unknown"}),F=void 0}})}},Kr=C;
27
+ `).run(ae,new Date().toISOString(),f.id),u(`[okx-a2a:outbox-drain] delivery failed id=${f.id} kind=${f.kind} attempts=${Nn}: ${ae}`))}return(i>0||d>0)&&g.info(a.SESSION_DISPATCHED,{onchainosAgentId:"*",source:"gateway_outbox_drain",deliveredCount:String(i),failedCount:String(d),abandonedCount:String(c),batchSize:String(o.length)}),{delivered:i,failed:d,abandoned:c,skipped:!1}}finally{s.close()}}function Gt(e={}){let n=e.intervalMs??pr,t=!1,s=async()=>{if(!t){t=!0;try{await Ar({...e.dbPath!==void 0?{dbPath:e.dbPath}:{},...e.limit!==void 0?{limit:e.limit}:{}})}catch(o){u("[okx-a2a:outbox-drain] tick failed:",o)}finally{t=!1}}},r=setInterval(()=>{s()},n);return r.unref?.(),s(),()=>{clearInterval(r)}}N();var hr=process.env.SENTRY_ENV==="dev"?"dev":"prod",jt={projectName:"okx/openclaw-okx-a2a-extension",release:"0.1.7",environment:hr};var j,F,Tr="https://e20ff987c945887733de9ec6cca87aba@sentry.coinall.ltd/apmfe/70295";function wr(e){let n=e?.details?.requestId;return typeof n=="string"&&n.trim()?`openclaw devices approve ${n}`:"openclaw devices approve --latest"}function Rr(e){let n=e?.details??{},t=Ie(e);return["OKX A2A plugin needs OpenClaw gateway `operator.admin` scope before it can create sessions, inject chat messages, and route XMTP conversations.","","Ask the user whether they approve granting this scope to the OKX A2A plugin.","","If the user approves, ask them to run this command on the OpenClaw host:","","```bash",wr(e),"```","",`requestId: ${n.requestId??""}`,`deviceId: ${n.deviceId??""}`,`requestedScopes: ${Array.isArray(n.requestedScopes)?n.requestedScopes.join(","):""}`,`approvedScopes: ${Array.isArray(n.approvedScopes)?n.approvedScopes.join(","):""}`,t?`hint: ${t}`:""].filter(Boolean).join(`
28
+ `)}function Dr(){J({key:Zn()}).then(()=>{u("[okx-a2a:service] gateway client admin precheck succeeded"),g.info(a.GATEWAY_STARTED,{source:"gateway_preconnect",outcome:"ok"})},e=>{u("[okx-a2a:service] gateway client admin precheck failed:",e),g.error(a.GATEWAY_CONNECT_FAILED,e instanceof Error?e:new Error(String(e)),{source:"gateway_preconnect",code:String(e?.gatewayCode??e?.details?.code??""),reason:String(e?.details?.reason??""),requestId:String(e?.details?.requestId??"")}),Sn(Rr(e),{source:"gateway_preconnect"}).then(({dispatched:n,failed:t})=>{g.info(a.USER_DISPATCHED,{source:"gateway_preconnect",outcome:t.length===0?"all_ok":"partial",dispatchedChannels:n.join(","),failedChannels:t.join(","),dispatchedCount:String(n.length),failedCount:String(t.length)})},n=>{g.error(a.USER_DISPATCH_FAILED,n instanceof Error?n:new Error(String(n)),{source:"gateway_preconnect"})})})}function Nr(){let e=process.env.OKX_A2A_SENTRY_DSN?.trim()||process.env.SENTRY_DSN?.trim()||Tr;Ln({dsn:e,...jt,agentPlatform:"openclaw"})}function Tn(e,n){let t=[e?.sessionKey,e?.context?.sessionKey,e?.ctx?.sessionKey,e?.hookContext?.sessionKey,n?.sessionKey];for(let s of t)if(typeof s=="string"&&s.trim())return s;return null}function wn(e,n){let t=[e?.runId,e?.agentRunId,e?.context?.runId,e?.context?.agentRunId,e?.ctx?.runId,e?.ctx?.agentRunId,e?.hookContext?.runId,e?.hookContext?.agentRunId,n?.runId,n?.agentRunId];for(let s of t)if(typeof s=="string"&&s.trim())return s;return null}function Or(e){let n=br(e),t=new Set([e]);for(let[s,r]of b())s&&s!==n&&r.sessionKey&&t.add(r.sessionKey);return[...t]}function br(e){let n=e.split(":");return n.length>=4&&n[0]==="agent"?n[2]??null:null}function Rn(e,n){let t=e[n];if(typeof t!="string"||!t.trim())throw new Error(`Missing required param ${n}`);return t}function m(e,n){let t=e[n];return typeof t=="string"&&t.trim()?t:void 0}function Dn(e,n){let t=e[n];if(!Array.isArray(t))return;let s=t.filter(r=>typeof r=="string"&&r.trim().length>0).map(r=>r.trim());return s.length>0?s:void 0}function kr(e,n){let t=e[n];return typeof t=="boolean"?t:void 0}var C={id:"okx-a2a",name:"OKX A2A Plugin",version:"0.1.7",register(e){Kn(e.runtime),e.registerChannel({plugin:$n}),e.registerGatewayMethod("okx-a2a.health",async({respond:n})=>{n(!0,{ok:!0,provider:"openclaw",pluginId:C.id,pluginVersion:C.version,startedAt:F??null})},{scope:"operator.admin"}),e.registerGatewayMethod("okx-a2a.dispatch_user",async({params:n,respond:t})=>{try{let s=Rn(n,"content"),r=m(n,"label"),o=m(n,"sessionKey"),i=Dn(n,"sessionKeys"),d=m(n,"jobId"),c=m(n,"currentSessionKey"),l=m(n,"idempotencyKey");t(!0,i?await yn({sessionKeys:i,content:s,label:r,idempotencyKey:l}):o?await mn({sessionKey:o,content:s,label:r,idempotencyKey:l}):await fn({content:s,label:r,jobId:d,currentSessionKey:c,idempotencyKey:l}))}catch(s){t(!1,void 0,{code:"INVALID_REQUEST",message:s instanceof Error?s.message:String(s)})}},{scope:"operator.admin"}),e.registerGatewayMethod("okx-a2a.prompt_user",async({params:n,respond:t})=>{try{let s=Rn(n,"userContent"),r=Rn(n,"llmContent"),o=m(n,"sessionKey"),i=Dn(n,"sessionKeys"),d=m(n,"jobId"),c=m(n,"currentSessionKey"),l=m(n,"idempotencyKey");t(!0,i?await In({sessionKeys:i,userContent:s,llmContent:r,idempotencyKey:l}):o?await _n({sessionKey:o,userContent:s,llmContent:r,idempotencyKey:l}):await En({userContent:s,llmContent:r,jobId:d,currentSessionKey:c,idempotencyKey:l}))}catch(s){t(!1,void 0,{code:"INVALID_REQUEST",message:s instanceof Error?s.message:String(s)})}},{scope:"operator.admin"}),e.registerGatewayMethod("okx-a2a.delete_sessions",async({params:n,respond:t})=>{try{let s=m(n,"sessionKey"),r=Dn(n,"sessionKeys"),o=m(n,"jobId");if(!s&&!r&&!o)throw new Error("Missing required selector: sessionKey, sessionKeys, or jobId");let i=m(n,"myAgentId"),d=m(n,"toAgentId"),c=m(n,"myXmtpAddress"),l=m(n,"toXmtpAddress"),f=kr(n,"deleteTranscript");t(!0,await ut({...s?{sessionKey:s}:{},...r?{sessionKeys:r}:{},...o?{jobId:o}:{},...i?{myAgentId:i}:{},...d?{toAgentId:d}:{},...c?{myXmtpAddress:c}:{},...l?{toXmtpAddress:l}:{},...f!==void 0?{deleteTranscript:f}:{}}))}catch(s){t(!1,void 0,{code:"INVALID_REQUEST",message:s instanceof Error?s.message:String(s)})}},{scope:"operator.admin"}),e.registerHook("agent:bootstrap",async n=>{let t=n.context,s=t.bootstrapFiles;if(Array.isArray(s))try{let r=s.map(i=>`${i.name}(${i.missing?"missing":`${i.content?.length??0}b`})`).join(", ");u(`[okx-a2a:hook] agent:bootstrap agentId=${t.agentId??"?"} files=[${r}]`);let o=s.reduce((i,d)=>i+(d.content?.length??0),0);g.info(a.BOOTSTRAP_APPLIED,{openclawAgentId:t.agentId??"",promptSize:String(o),fileCount:String(s.length),missingCount:String(s.filter(i=>i.missing).length)})}catch(r){g.error(a.BOOTSTRAP_FAILED,r instanceof Error?r:void 0,{openclawAgentId:t.agentId??""})}},{name:"okx-a2a-agent-bootstrap"}),e.on("before_agent_run",async(n,t)=>{let s=Tn(n,t),r=wn(n,t);if(!s){u("[xmtp_prompt_user:queue] before_agent_run ignored: missing sessionKey");return}let o=Or(s);pt({runId:r,sessionKey:s,routeSessionKeys:o})&&console.log(`[okx-a2a:hook] remembered gateway route origin runId=${r} sessionKey=${s} routeSessionKeys=${o.join(",")}`),rn(s)}),e.on("before_tool_call",async(n,t)=>{let s=Tn(n,t),r=wn(n,t);Ye(s);let o=[...new Set([...Se({sessionKey:s}),..._e({runId:r,sessionKey:s})])],i=ft({toolName:n?.toolName,params:n?.params,sessionKey:s,routeSessionKeys:o});if(i)return console.log(`[okx-a2a:hook] injected gateway session env tool=${n?.toolName??"?"} sessionKey=${s} routeSessionKeys=${o.join(",")}`),{params:i}},{priority:50}),e.on("agent_end",async(n,t)=>{let s=Tn(n,t),r=wn(n,t);if(yt({runId:r,sessionKey:s}),!s){u("[xmtp_prompt_user:queue] agent_end ignored: missing sessionKey");return}on(s)}),e.registerService({id:"okx-a2a:core",start:async()=>{u("[okx-a2a:service] okx-a2a:core starting (multi-identity mode); initializing communication identities..."),F=Date.now(),Nr(),g.info(a.GATEWAY_STARTED,{onchainosAgentId:"*",pid:String(process.pid),pluginId:C.id,pluginVersion:C.version,nodeVersion:process.version,startedAt:String(F)}),Fe(),Dr(),j&&j(),j=Gt(),u("[okx-a2a:service] OpenClaw lightweight gateway initialized; node daemon owns XMTP receive/send/agent sync.")},stop:async()=>{j&&(j(),j=void 0),qe(),u("[okx-a2a:service] okx-a2a:core stopped");let n=Date.now();g.info(a.GATEWAY_STOPPED,{onchainosAgentId:"*",pid:String(process.pid),pluginId:C.id,pluginVersion:C.version,stoppedAt:String(n),uptimeMs:F?String(n-F):"unknown"}),F=void 0}})}},Kr=C;
29
29
  if(module.exports&&module.exports.__esModule&&module.exports.default){module.exports=module.exports.default;}
@@ -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.1.6",
5
+ "version": "0.1.7",
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.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "OpenClaw plugin for E2E encrypted agent-to-agent communication via XMTP",
5
5
  "main": "dist/index.js",
6
6
  "files": [