@botmobile/botmobile-openclaw 0.0.8 → 0.0.10

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,20 +1,20 @@
1
- import{createRequire as h5}from"node:module";var S5=Object.create;var{getPrototypeOf:j5,defineProperty:T0,getOwnPropertyNames:C5}=Object;var k5=Object.prototype.hasOwnProperty;var A5=(Z,$,Q)=>{Q=Z!=null?S5(j5(Z)):{};let X=$||!Z||!Z.__esModule?T0(Q,"default",{value:Z,enumerable:!0}):Q;for(let Y of C5(Z))if(!k5.call(X,Y))T0(X,Y,{get:()=>Z[Y],enumerable:!0});return X};var x5=(Z,$)=>{for(var Q in $)T0(Z,Q,{get:$[Q],enumerable:!0,configurable:!0,set:(X)=>$[Q]=()=>X})};var KZ=(Z,$)=>()=>(Z&&($=Z(Z=0)),$);var T5=h5(import.meta.url);function A3(Z){b0=Z}function J0(){if(!b0)throw Error("BotMobile runtime not initialized");return b0}var b0=null;import f5 from"node:fs";import f0 from"node:os";import oZ from"node:path";function TZ(Z){if(typeof Z!=="string")return;let $=Z.trim();return $.length>0?$:void 0}function nZ(Z){return(TZ(Z)??"main").toLowerCase()}function I0(Z){let $=Z.agents?.list;if(!Array.isArray($))return[];return $.filter((Q)=>!!Q&&typeof Q==="object")}function y5(Z){let $=I0(Z);if($.length===0)return"main";let Q=$.find((X)=>X.default===!0);return nZ((Q??$[0])?.id)}function h3(Z){if(Z.startsWith("~"))return oZ.resolve(Z.replace(/^~/,f0.homedir()));return oZ.resolve(Z)}function u5(Z,$){let Q=nZ($),Y=I0(Z).find((J)=>nZ(J.id)===Q),H=TZ(Y?.workspace);if(H)return h3(H);let V=y5(Z);if(Q===V){let J=TZ(Z.agents?.defaults?.workspace);if(J)return h3(J);return oZ.join(f0.homedir(),".openclaw","workspace")}return oZ.join(f0.homedir(),".openclaw",`workspace-${Q}`)}function T3(Z,$){let Q=Z.split(/\r?\n/);for(let X=0;X<Q.length;X++){let H=Q[X].replace(/\*\*/g,"").trim().match(new RegExp(`^(?:[-*]\\s*)?${$}\\s*:\\s*(.*?)\\s*$`,"i"));if(!H)continue;let V=H[1]?.trim();if(!V&&X+1<Q.length)V=Q[X+1].replace(/\*\*/g,"").trim();if(!V)continue;let J=V.replace(/^["'`]|["'`]$/g,"").trim();if(!J)continue;return J}return}function v5(Z){let $=Date.now(),Q=x3.get(Z);if(Q&&$-Q.loadedAt<I5)return{name:Q.name,emoji:Q.emoji};let X=oZ.join(Z,"IDENTITY.md"),Y,H;try{let V=f5.readFileSync(X,"utf8");Y=T3(V,"name"),H=T3(V,"emoji")}catch{Y=void 0,H=void 0}return x3.set(Z,{loadedAt:$,name:Y,emoji:H}),{name:Y,emoji:H}}function bZ(Z,$){let Q=nZ($),Y=I0(Z).find((O)=>nZ(O.id)===Q),H=TZ(Y?.identity?.emoji),V=TZ(Y?.identity?.name),J=u5(Z,Q),q=v5(J);if(V)return{name:V,emoji:H??q.emoji,source:"identity-config",emojiSource:H?"identity-config":q.emoji?"identity-file":void 0};let K=q.name;if(K)return{name:K,emoji:H??q.emoji,source:"identity-file",emojiSource:H?"identity-config":q.emoji?"identity-file":void 0};let B=TZ(Y?.name);if(B)return{name:B,emoji:H??q.emoji,source:"config-name",emojiSource:H?"identity-config":q.emoji?"identity-file":void 0};return{name:Q||"Assistant",emoji:H??q.emoji,source:"agent-id",emojiSource:H?"identity-config":q.emoji?"identity-file":void 0}}var x3,I5=30000;var q0=KZ(()=>{x3=new Map});function R(Z){let $=Z.trim();if(!$)return Z;if(m5.test($))return $.toUpperCase();return $}var m5;var K0=KZ(()=>{m5=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i});import I3 from"node:fs";import aZ from"node:path";import b3 from"node:os";import{randomUUID as O0}from"node:crypto";import tZ from"ws";function u3(Z){let $=Z.cron?.store;if(typeof $==="string"&&$.trim()){let Q=$.trim();if(Q.startsWith("~"))return aZ.resolve(Q.replace("~",b3.homedir()));return aZ.resolve(Q)}return aZ.join(b3.homedir(),".openclaw","cron","jobs.json")}function c5(Z,$){return aZ.join(aZ.dirname(Z),"runs",`${$}.jsonl`)}function y0(Z){let $=Z.gateway?.port;if(typeof $==="number"&&Number.isFinite($)&&$>0)return $;return g5}function u0(Z){let $=Z.gateway?.auth?.token;return typeof $==="string"&&$.trim()?$.trim():void 0}function v0(Z){return typeof Z==="object"&&Z!==null}function l5(Z){if(!v0(Z))return!1;return Z.type==="res"&&typeof Z.id==="string"&&typeof Z.ok==="boolean"}function f3(Z){if(!v0(Z))return!1;return Z.type==="event"&&typeof Z.event==="string"}function d5(Z){if(!v0(Z))return null;let{jobId:$,action:Q}=Z;if(typeof $!=="string"||!$.trim())return null;if(Q!=="added"&&Q!=="updated"&&Q!=="removed"&&Q!=="started"&&Q!=="finished")return null;let X={jobId:$,action:Q};if(typeof Z.runAtMs==="number"&&Number.isFinite(Z.runAtMs))X.runAtMs=Z.runAtMs;if(typeof Z.durationMs==="number"&&Number.isFinite(Z.durationMs))X.durationMs=Z.durationMs;if(Z.status==="ok"||Z.status==="error"||Z.status==="skipped")X.status=Z.status;if(typeof Z.error==="string")X.error=Z.error;if(typeof Z.summary==="string")X.summary=Z.summary;if(typeof Z.sessionId==="string")X.sessionId=Z.sessionId;if(typeof Z.sessionKey==="string")X.sessionKey=Z.sessionKey;if(typeof Z.nextRunAtMs==="number"&&Number.isFinite(Z.nextRunAtMs))X.nextRunAtMs=Z.nextRunAtMs;return X}class v3{cfg;tag;ws=null;reconnectTimer=null;reconnectDelayMs=1000;connectRequestId=null;stopped=!1;connected=!1;pending=new Map;cronListeners=new Set;constructor(Z,$){this.cfg=Z;this.tag=$}start(){this.stopped=!1,this.ensureConnected()}stop(){if(this.stopped=!0,this.connected=!1,this.connectRequestId=null,this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;let Z=this.ws;if(this.ws=null,Z)try{Z.close()}catch{}this.failPending("gateway bridge stopped")}isConnected(){return this.connected&&this.ws!==null&&this.ws.readyState===tZ.OPEN}listenerCount(){return this.cronListeners.size}addCronListener(Z){return this.cronListeners.add(Z),this.start(),()=>{this.cronListeners.delete(Z)}}async request(Z,$){let Q=this.ws;if(!this.isConnected()||!Q)return{ok:!1,error:"gateway bridge not connected"};let X=O0(),H=JSON.stringify({type:"req",id:X,method:Z,params:$});return await new Promise((V)=>{let J=setTimeout(()=>{this.pending.delete(X),V({ok:!1,error:`gateway ${Z} timeout after ${B0}ms`})},B0);this.pending.set(X,{resolve:V,timeout:J});try{Q.send(H)}catch(q){this.pending.delete(X),clearTimeout(J),V({ok:!1,error:`gateway WS send failed: ${String(q)}`})}})}ensureConnected(){if(this.stopped)return;if(this.ws&&this.ws.readyState===tZ.OPEN)return;if(this.ws&&this.ws.readyState===tZ.CONNECTING)return;if(this.reconnectTimer)return;let Z=y0(this.cfg),$=u0(this.cfg),Q=`ws://127.0.0.1:${Z}`,X=new tZ(Q,{maxPayload:4194304});this.ws=X,this.connected=!1;let Y=!1,H=()=>{if(Y)return;Y=!0,this.connectRequestId=O0();let V={minProtocol:3,maxProtocol:3,client:{id:"gateway-client",version:"dev",platform:process.platform,mode:"backend"},caps:[],role:"operator",scopes:["operator.admin"]};if($)V.auth={token:$};try{X.send(JSON.stringify({type:"req",id:this.connectRequestId,method:"connect",params:V}))}catch(J){console.error(`${this.tag} bridge connect send failed: ${String(J)}`)}};X.on("open",()=>{H()}),X.on("message",(V)=>{try{let J=JSON.parse(String(V));if(l5(J)){if(J.id===this.connectRequestId){if(!J.ok){this.connected=!1,console.error(`${this.tag} bridge connect failed: ${J.error?.message??"unknown"}`);try{X.close()}catch{}return}this.connected=!0,this.reconnectDelayMs=1000;return}let q=this.pending.get(J.id);if(q)if(this.pending.delete(J.id),clearTimeout(q.timeout),J.ok)q.resolve({ok:!0,payload:J.payload});else q.resolve({ok:!1,error:J.error?.message??"unknown error"});return}if(f3(J)&&J.event==="cron"){let q=d5(J.payload);if(!q)return;for(let K of this.cronListeners)try{K(q)}catch(B){console.error(`${this.tag} cron listener failed: ${String(B)}`)}return}if(f3(J)&&J.event==="connect.challenge"){if(!Y)H()}}catch{}}),X.on("error",(V)=>{console.error(`${this.tag} bridge WS error: ${String(V)}`)}),X.on("close",()=>{if(this.ws===X)this.ws=null;this.connected=!1,this.connectRequestId=null,this.failPending("gateway connection closed"),this.scheduleReconnect()})}scheduleReconnect(){if(this.stopped)return;if(this.reconnectTimer)return;if(this.cronListeners.size===0)return;let Z=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,p5),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.ensureConnected()},Z)}failPending(Z){for(let[$,Q]of this.pending)this.pending.delete($),clearTimeout(Q.timeout),Q.resolve({ok:!1,error:Z})}}function m3(Z){return`${y0(Z)}|${u0(Z)??""}`}function i5(Z){let $=m3(Z);if(t&&L0===$)return t;if(t)t.stop();return t=new v3(Z,y3),L0=$,t}function g3(Z,$){let X=i5(Z).addCronListener($);return()=>{if(X(),t&&t.listenerCount()===0)t.stop(),t=null,L0=null}}async function m0(Z,$,Q){let X=m3(Z);if(t&&L0===X&&t.isConnected()){let Y=await t.request($,Q);if(Y.ok||Y.error!=="gateway bridge not connected")return Y}return await r5(Z,$,Q)}async function r5(Z,$,Q){let X=y0(Z),Y=u0(Z),H=`ws://127.0.0.1:${X}`;return new Promise((V)=>{let J=!1,q=(N)=>{if(J)return;J=!0,clearTimeout(K);try{B.close()}catch{}V(N)},K=setTimeout(()=>{q({ok:!1,error:`gateway RPC timeout after ${B0}ms`})},B0),B=new tZ(H,{maxPayload:4194304}),O=null,L=null,D=!1,U=null,z=(N)=>{if(D)return;if(D=!0,U)clearTimeout(U),U=null;O=O0();let _={minProtocol:3,maxProtocol:3,client:{id:"gateway-client",version:"dev",platform:process.platform,mode:"backend"},caps:[],role:"operator",scopes:["operator.admin"]};if(Y)_.auth={token:Y};B.send(JSON.stringify({type:"req",id:O,method:"connect",params:_}))};B.on("open",()=>{U=setTimeout(()=>z(),750)}),B.on("message",(N)=>{try{let _=JSON.parse(String(N));if(_.type==="event"){if(_.event==="connect.challenge"){let T=_.payload?.nonce;z(typeof T==="string"?T:void 0)}return}if(_.type==="res"&&_.id===O){if(!_.ok){q({ok:!1,error:`gateway connect failed: ${_.error?.message??"unknown"}`});return}L=O0(),B.send(JSON.stringify({type:"req",id:L,method:$,params:Q}));return}if(_.type==="res"&&_.id===L){if(_.ok)q({ok:!0,payload:_.payload});else q({ok:!1,error:_.error?.message??"unknown error"});return}}catch{}}),B.on("error",(N)=>{q({ok:!1,error:`gateway WS error: ${String(N)}`})}),B.on("close",()=>{q({ok:!1,error:"gateway WS closed unexpectedly"})})})}function g0(Z){let $=u3(Z);try{let Q=I3.readFileSync($,"utf-8");return JSON.parse(Q)?.jobs??[]}catch(Q){return console.error(`${y3} failed to read cron store at ${$}: ${String(Q)}`),[]}}function p3(Z,$,Q=20){let X=u3(Z),Y=c5(X,$);try{let H=I3.readFileSync(Y,"utf-8");if(!H.trim())return[];let V=H.split(`
2
- `),J=[];for(let q=V.length-1;q>=0&&J.length<Q;q--){let K=V[q]?.trim();if(!K)continue;try{let B=JSON.parse(K);if(B?.action==="finished"&&typeof B.ts==="number")J.push({ts:B.ts,jobId:B.jobId??$,action:B.action,status:B.status,error:B.error,summary:B.summary,durationMs:B.durationMs})}catch{}}return J}catch{return[]}}async function c3(Z,$){let Q=await m0(Z,"cron.run",{id:$,mode:"force"});if(!Q.ok)return{ok:!1,error:Q.error};return{ok:!0}}async function l3(Z,$,Q){let X=await m0(Z,"cron.update",{id:$,patch:{enabled:Q}});if(!X.ok)return{ok:!1,error:X.error};return{ok:!0}}async function d3(Z,$){let Q=await m0(Z,"cron.add",$);if(!Q.ok)return{ok:!1,error:Q.error};return{ok:!0}}var y3="[botmobile:cron]",g5=18789,B0=15000,p5=30000,t=null,L0=null;var i3=()=>{};function h(Z){for(let $ of o5)try{$(Z)}catch{}}function M(){return Date.now()}function I(Z,$=M()){if(typeof Z==="number"&&Number.isFinite(Z)&&Z>0)return Math.floor(Z);return Math.floor($)}function r3(Z){if(!Z)return;let $=Z.trim();if(!$)return;if($.startsWith("conversation:"))return;if($.toLowerCase()==="conversation")return;return R($)}function l0(Z){if(!Z)return;let $=Z.trim().toLowerCase();return $.length>0?$:void 0}function U0(Z){let $=Z.trim();if(!$.toLowerCase().startsWith("cron:"))return;return l0($.slice(5))}function n5(Z,$){if(Z?.trim().toLowerCase()==="cron")return"cron";return U0($)?"cron":void 0}function PZ(Z){if(!Z)return;let $=Z.trim();return $.length>0?$:void 0}function p0(Z){return Z.id.startsWith("conversation:")&&Z.messageOrder.length===0}function t3(Z){let $=I(Z,M());return OZ=Math.max(OZ+1,$),OZ}function WZ(Z){let $=++EZ;return t3(Z),$}function d0(Z){if(!Z)return;return{...Z,skills:Z.skills?[...Z.skills]:void 0,skillDetails:Z.skillDetails?Z.skillDetails.map(($)=>({...$})):void 0,toolsAllow:Z.toolsAllow?[...Z.toolsAllow]:void 0,toolsDeny:Z.toolsDeny?[...Z.toolsDeny]:void 0}}function t5(Z){return{...Z,details:d0(Z.details),usage:{...Z.usage}}}function a5(Z){return{...Z,schedule:Z.schedule?{...Z.schedule}:void 0}}function i0(Z){return{...Z}}function e5(Z){return{...Z}}function Z6(Z){return{id:`conversation:${Z}`,name:n3}}function c0(Z){let $=typeof Z.id==="string"?Z.id.trim().toLowerCase():"",Q=typeof Z.name==="string"?Z.name.trim().toLowerCase():"";if(!$)return!0;if($==="conversation"||$.startsWith("conversation:"))return!0;if(!Q)return!0;return Q===n3.toLowerCase()||Q==="conversation"}function a3(Z){return{isAgentActive:!1,isComposing:!1,lastUpdated:Z}}function $6(Z,$){let Q=r.get(Z);if(!Q)return null;r.delete(Z),Q.id=$;for(let X of Q.messages.values())X.conversationId=$;r.set($,Q);for(let[X,Y]of YZ)if(Y===Z)YZ.set(X,$);return Q}function Q6(Z){for(let $ of r.keys())if(R($)===Z)return $;return null}function a(Z,$){let Q=R(Z),X=r.get(Q);if(X)return X;let Y=Q6(Q);if(Y&&Y!==Q){let q=$6(Y,Q);if(q)return q}let H=I($,M()),V=U0(Q),J={id:Q,kind:V?"cron":void 0,cronJobId:V,cronName:void 0,cronAgentId:void 0,cronAgentName:void 0,cronAgentEmoji:void 0,agent:Z6(Q),createdAt:H,updatedAt:H,revision:0,lastMessageRevision:0,activity:a3(H),messages:new Map,messageOrder:[]};return J.revision=WZ(H),r.set(Q,J),J}function BZ(Z,$){let Q=I($,M());Z.updatedAt=Math.max(Z.updatedAt,Q)}function HZ(Z,$,Q){let X=WZ($);if(Z.revision=Math.max(Z.revision,X),Q?.messageChanged)Z.lastMessageRevision=Math.max(Z.lastMessageRevision,X);return X}function X6(Z){for(let $ of Z.messages.values())if($.isStreaming)return!0;return!1}function XZ(Z,$,Q){let X=I(Q,M()),Y=Z.activity,H=Y.activeAgentId,V=Object.prototype.hasOwnProperty.call($,"activeAgentId"),J=Object.prototype.hasOwnProperty.call($,"activeTool"),q={isAgentActive:$.isAgentActive??Y.isAgentActive,isComposing:$.isComposing??Y.isComposing,activeAgentId:V?$.activeAgentId:Y.activeAgentId,activeTool:J?$.activeTool:Y.activeTool,lastUpdated:Math.max(Y.lastUpdated,X)};if(!q.isAgentActive&&!q.isComposing)q.activeAgentId=void 0,q.activeTool=void 0;else if(!q.isAgentActive)q.activeTool=void 0;if(!(q.isAgentActive!==Y.isAgentActive||q.isComposing!==Y.isComposing||q.activeAgentId!==Y.activeAgentId||q.activeTool!==Y.activeTool)){if(q.lastUpdated>Y.lastUpdated)Y.lastUpdated=q.lastUpdated;if(q.isAgentActive&&q.activeAgentId)YZ.set(q.activeAgentId,Z.id);return!1}if(Z.activity=q,H&&YZ.get(H)===Z.id&&q.activeAgentId!==H)YZ.delete(H);if(q.isAgentActive&&q.activeAgentId)YZ.set(q.activeAgentId,Z.id);return BZ(Z,X),HZ(Z,X),!0}function eZ(Z,$,Q){let X=I($,M()),Y=Q?R(Q):void 0,H=!1,V=YZ.get(Z);if(V&&V!==Y){let J=r.get(V);if(J)H=XZ(J,{isAgentActive:!1,isComposing:!1,activeAgentId:void 0,activeTool:void 0},X)||H}for(let[J,q]of r){if(J===V)continue;if(J===Y)continue;if(q.activity.activeAgentId!==Z)continue;H=XZ(q,{isAgentActive:!1,isComposing:!1,activeAgentId:void 0,activeTool:void 0},X)||H}if(Y)YZ.set(Z,Y);else YZ.delete(Z);return H}function Y6(Z){while(Z.messageOrder.length>s5){let $=Z.messageOrder.shift();if(!$)break;Z.messages.delete($)}}function fZ(Z,$,Q){let X=I($.timestamp,M()),Y=Z.messages.get($.id);if(!Y){let V=HZ(Z,X,{messageChanged:!0});Z.messages.set($.id,i0({...$,timestamp:X,revision:V})),Z.messageOrder.push($.id),Y6(Z),BZ(Z,X);return}if(Q==="append")Y.content+=$.content,Y.timestamp=X,Y.isStreaming=$.isStreaming??Y.isStreaming;else Y.content=$.content,Y.role=$.role,Y.timestamp=X,Y.isStreaming=$.isStreaming;let H=HZ(Z,Y.timestamp,{messageChanged:!0});Y.revision=H,BZ(Z,Y.timestamp)}function H6(Z){let $=[];for(let Q of Z.messageOrder){let X=Z.messages.get(Q);if(!X)continue;$.push(i0(X))}return $.sort((Q,X)=>{if(Q.timestamp===X.timestamp)return Q.id.localeCompare(X.id);return Q.timestamp-X.timestamp}),$}function D0(Z,$){let Q=$?.sinceTimestampMs,X=typeof $?.lastMessageRevision==="number"&&Number.isFinite($.lastMessageRevision)?Math.max(0,Math.floor($.lastMessageRevision)):0,Y=H6(Z).filter((H)=>{if(X>0){let V=typeof H.revision==="number"&&Number.isFinite(H.revision)?Math.max(0,Math.floor(H.revision)):0;if(V>X)return!0;if(V>0)return!1}if(!Q||!Number.isFinite(Q)||Q<=0)return!0;return H.timestamp>Q});return{id:Z.id,kind:Z.kind,cronJobId:Z.cronJobId,cronName:Z.cronName,cronAgentId:Z.cronAgentId,cronAgentName:Z.cronAgentName,cronAgentEmoji:Z.cronAgentEmoji,agent:{...Z.agent},createdAt:Z.createdAt,updatedAt:Z.updatedAt,revision:Z.revision,lastMessageRevision:Z.lastMessageRevision,activity:e5(Z.activity),messages:Y}}function e3(Z){let $=Number.isFinite(Z.sessionTokensIn)?Z.sessionTokensIn:0,Q=Number.isFinite(Z.sessionTokensOut)?Z.sessionTokensOut:0,X=I(Z.lastActivityAt,M()),Y=Z.status==="working";return{id:Z.agentId,name:Z.name||Z.agentId,emoji:Z.emoji,color:Z.color,details:d0(Z.details),queue:Y?1:0,lastUpdated:X,usage:{mode:"tokens",value:Math.max(0,$+Q)},isRunning:Y,currentTask:Z.activeTool}}function Z4(Z,$){let Q=I($??Z.lastRunAt??Z.nextRunAt,M());return{id:Z.id,name:Z.name,enabled:Z.enabled,isRunning:Z.isRunning,lastUpdated:Q,agentId:Z.agentId,agentName:Z.agentName,agentEmoji:Z.agentEmoji,schedule:Z.schedule?{...Z.schedule}:void 0,nextRunAt:Z.nextRunAt,lastRunAt:Z.lastRunAt,lastRunStatus:Z.lastRunStatus,lastRunSummary:Z.lastRunSummary}}function Z0(Z){if(jZ.size>0)return[...jZ.values()].map(t5);if(!Z||Z.length===0)return[];return Z.map(($)=>e3($))}function $0(Z){if(GZ.size>0)return[...GZ.values()].map(a5);if(!Z||Z.length===0)return[];return Z.map(($)=>Z4($))}function s3(Z){let $=[...r.values()].filter((Y)=>!p0(Y)).sort((Y,H)=>H.updatedAt-Y.updatedAt).map((Y)=>D0(Y)),Q=Z0(Z?.fallbackAgents),X=$0(Z?.fallbackCronJobs);return{timestamp:OZ,stateBornAt:_Z,globalRevision:EZ,conversations:$,agents:Q,cronJobs:X}}function $4(){r.clear(),jZ.clear(),GZ.clear(),YZ.clear(),_Z=M(),OZ=_Z,EZ=0}function Q4(Z){let $=0;for(let Q of Z){let X=R(Q.id),Y=U0(X),H=n5(Q.kind,X),V=l0(Q.cronJobId)??Y,J=PZ(Q.cronName),q=PZ(Q.cronAgentId),K=PZ(Q.cronAgentName),B=PZ(Q.cronAgentEmoji),O=new Map,L=[],D=0;for(let _ of Q.messages){let T=I(_.timestamp,M()),A=WZ(T);O.set(_.id,i0({..._,conversationId:X,timestamp:T,revision:A})),L.push(_.id),$=Math.max($,T),D=A}let U=I(Q.createdAt,M()),z=I(Q.updatedAt,U),N=D>0?D:WZ(z);r.set(X,{id:X,kind:H,cronJobId:V,cronName:J,cronAgentId:q,cronAgentName:K,cronAgentEmoji:B,agent:{...Q.agent},createdAt:U,updatedAt:z,revision:N,lastMessageRevision:D,activity:a3(z),messages:O,messageOrder:L}),$=Math.max($,z)}if($>0)t3($)}function F0(Z,$,Q){let X=R(Z),Y=I(Q,M()),H=a(X,Y);H.agent={id:$.id||H.agent.id,name:$.name||H.agent.name,emoji:$.emoji??H.agent.emoji},BZ(H,Y),HZ(H,Y),h("conversations")}function r0(Z,$){let Q=R(Z.conversationId),X=I($,M()),Y=a(Q,X),H=U0(Q),V=l0(Z.cronJobId)??H,J=Y.kind??(V?"cron":void 0),q=PZ(Z.cronName)??Y.cronName,K=PZ(Z.cronAgentId)??Y.cronAgentId,B=PZ(Z.cronAgentName)??Y.cronAgentName,O=PZ(Z.cronAgentEmoji)??Y.cronAgentEmoji,L={...Y.agent};if(Y.kind==="cron"||J==="cron"){if(q&&c0(Y.agent))L.name=q;if(O&&!L.emoji)L.emoji=O}if(!(Y.kind!==J||Y.cronJobId!==V||Y.cronName!==q||Y.cronAgentId!==K||Y.cronAgentName!==B||Y.cronAgentEmoji!==O||Y.agent.id!==L.id||Y.agent.name!==L.name||Y.agent.emoji!==L.emoji))return;Y.kind=J,Y.cronJobId=V,Y.cronName=q,Y.cronAgentId=K,Y.cronAgentName=B,Y.cronAgentEmoji=O,Y.agent=L,BZ(Y,X),HZ(Y,X),h("conversations")}function X4(Z){if(Z.from!=="user")return;let $=R(Z.conversationId),Q=I(Z.timestamp,M()),X=a($,Q);fZ(X,{id:Z.id,conversationId:$,role:"user",content:Z.body,timestamp:Q,isStreaming:!1},"replace"),h("conversations")}function Y4(Z){switch(Z.type){case"conversation_list":{for(let $ of Z.conversations){let Q=R($.id),X=I($.lastActivity,M()),Y=a(Q,$.createdAt);Y.createdAt=Math.min(Y.createdAt,I($.createdAt,Y.createdAt)),Y.updatedAt=Math.max(Y.updatedAt,X);let H=$.name.trim();if(H.length>0)Y.agent={id:Y.agent.id,name:H,emoji:Y.agent.emoji};HZ(Y,X)}h("conversations");return}case"message":{let $=R(Z.conversationId),Q=I(Z.timestamp,M()),X=a($,Q);if(fZ(X,{id:Z.id,conversationId:$,role:Z.from==="user"?"user":"bot",content:Z.body,timestamp:Q,isStreaming:!1},"replace"),Z.from==="bot")XZ(X,{isComposing:!1,activeTool:void 0},Q);h("conversations");return}case"stream_start":{let $=R(Z.conversationId),Q=M(),X=a($,Q),Y=X.agent.id.startsWith("conversation:")?void 0:X.agent.id;XZ(X,{isAgentActive:!0,isComposing:!0,activeAgentId:Y},Q);let H=X.messages.get(Z.messageId);if(H)H.isStreaming=!0,H.timestamp=Q,H.role="bot",H.revision=HZ(X,Q,{messageChanged:!0}),BZ(X,Q);else fZ(X,{id:Z.messageId,conversationId:$,role:"bot",content:"",timestamp:Q,isStreaming:!0},"replace");h("conversations");return}case"stream_token":{let $=R(Z.conversationId),Q=M(),X=a($,Q),Y=X.agent.id.startsWith("conversation:")?void 0:X.agent.id;XZ(X,{isAgentActive:!0,isComposing:!0,activeAgentId:Y},Q),fZ(X,{id:Z.messageId,conversationId:$,role:"bot",content:Z.token,timestamp:Q,isStreaming:!0},"append"),h("conversations");return}case"stream_end":{let $=R(Z.conversationId),Q=M(),X=a($,Q);XZ(X,{isAgentActive:!1,isComposing:!1,activeTool:void 0},Q);let Y=X.messages.get(Z.messageId);if(Y){if(Z.body.trim().length>0)Y.content=Z.body;Y.isStreaming=!1,Y.timestamp=Q,Y.revision=HZ(X,Q,{messageChanged:!0}),BZ(X,Q)}else fZ(X,{id:Z.messageId,conversationId:$,role:"bot",content:Z.body,timestamp:Q,isStreaming:!1},"replace");h("conversations");return}case"composing":{if(Z.from!=="bot")return;let $=R(Z.conversationId),Q=M(),X=a($,Q),Y=X.agent.id.startsWith("conversation:")?void 0:X.agent.id;XZ(X,{isAgentActive:!0,isComposing:!0,activeAgentId:Y},Q),h("conversations");return}case"tool_status":{let $=R(Z.conversationId),Q=M(),X=a($,Q);if(Z.status==="running"){let Y=X.agent.id.startsWith("conversation:")?void 0:X.agent.id;XZ(X,{isAgentActive:!0,isComposing:!1,activeAgentId:Y,activeTool:Z.tool},Q)}else XZ(X,{isAgentActive:X6(X),isComposing:!1,activeTool:void 0},Q);h("conversations");return}case"agent_list":{let $=!1,Q=new Set;jZ.clear();for(let Y of Z.agents){Q.add(Y.agentId),jZ.set(Y.agentId,e3(Y));let H=I(Y.lastActivityAt,M()),V=r3(Y.activeConversationId);if(Y.status==="working"&&V){$=eZ(Y.agentId,H,V)||$;let J=a(V,H);J.agent={id:Y.agentId||J.agent.id,name:Y.name||J.agent.name,emoji:Y.emoji??J.agent.emoji},$=XZ(J,{isAgentActive:!0,isComposing:J.activity.isComposing,activeAgentId:Y.agentId,activeTool:Y.activeTool},H)||$}else $=eZ(Y.agentId,H)||$}let X=M();for(let Y of Array.from(YZ.keys())){if(Q.has(Y))continue;$=eZ(Y,X)||$}if(WZ(M()),h("agents"),$)h("conversations");return}case"agent_status":{let $=M(),Q=jZ.get(Z.agentId)??{id:Z.agentId,name:Z.agentId,queue:0,lastUpdated:$,usage:{mode:"tokens",value:0},isRunning:Z.status==="working"},X={...Q,color:Z.color??Q.color,details:Z.details?d0(Z.details):Q.details,queue:Z.status==="working"?1:0,lastUpdated:I(Z.lastActivityAt,$),usage:{mode:"tokens",value:typeof Z.sessionTokensIn==="number"||typeof Z.sessionTokensOut==="number"?Math.max(0,(Z.sessionTokensIn??0)+(Z.sessionTokensOut??0)):Q.usage.value},isRunning:Z.status==="working",currentTask:Z.activeTool};jZ.set(Z.agentId,X);let Y=!1,H=Z.status==="working"?r3(Z.activeConversationId):void 0;if(H){Y=eZ(Z.agentId,X.lastUpdated,H)||Y;let V=a(H,X.lastUpdated);V.agent={id:Z.agentId||V.agent.id,name:X.name||V.agent.name,emoji:X.emoji??V.agent.emoji},Y=XZ(V,{isAgentActive:!0,isComposing:V.activity.isComposing,activeAgentId:Z.agentId,activeTool:Z.activeTool},X.lastUpdated)||Y}else Y=eZ(Z.agentId,X.lastUpdated)||Y;if(WZ(X.lastUpdated),h("agents"),Y)h("conversations");return}case"cron_list":{GZ.clear();let $=M();for(let Q of Z.jobs)GZ.set(Q.id,Z4(Q,$));WZ($),h("cronJobs");return}case"cron_run_started":{let $=M(),Q=GZ.get(Z.jobId)??{id:Z.jobId,name:Z.jobId,enabled:!0,isRunning:!1,lastUpdated:$};GZ.set(Z.jobId,{...Q,isRunning:!0,lastUpdated:$}),WZ($),h("cronJobs");return}case"cron_run_finished":{let $=M(),Q=GZ.get(Z.jobId)??{id:Z.jobId,name:Z.jobId,enabled:!0,isRunning:!1,lastUpdated:$};GZ.set(Z.jobId,{...Q,isRunning:!1,lastRunAt:$,lastRunStatus:Z.status,lastRunSummary:Z.summary,lastUpdated:$}),WZ($),h("cronJobs");return}default:return}}function o3(Z){return Z.startsWith("t:")}function H4(Z){let $=R(Z.conversationId),{role:Q,content:X,timestamp:Y,stableId:H}=Z,V=I(Y,M()),J=a($,V),q=o3(H),K=!1;if(Z.agent){let L=c0(J.agent),D=c0(Z.agent),U=typeof Z.agent.id==="string"&&Z.agent.id.trim().length>0&&Z.agent.id===J.agent.id;if(L||U||!D&&!J.agent.emoji&&!!Z.agent.emoji){let z={id:Z.agent.id||J.agent.id,name:Z.agent.name||J.agent.name,emoji:Z.agent.emoji??J.agent.emoji};if(K=z.id!==J.agent.id||z.name!==J.agent.name||z.emoji!==J.agent.emoji,K)J.agent=z,BZ(J,V),HZ(J,V)}}if(J.messages.has(H)){if(K)h("conversations");return!1}let B=J.messageOrder,O=Math.max(0,B.length-J6);for(let L=B.length-1;L>=O;L--){let D=J.messages.get(B[L]);if(!D)continue;if(D.role!==Q)continue;let U=D.content===X||X.startsWith(D.content)||D.content.startsWith(X);if(Q==="bot"&&q&&!o3(D.id)&&V<=D.timestamp&&U){if(!D.isStreaming&&X.length>D.content.length)D.content=X,D.timestamp=Math.max(D.timestamp,V),D.revision=HZ(J,D.timestamp,{messageChanged:!0}),BZ(J,D.timestamp),h("conversations");else if(K)h("conversations");return!1}if(Math.abs(D.timestamp-V)>V6)continue;if(U){if(!D.isStreaming&&X.length>D.content.length)D.content=X,D.timestamp=V,D.revision=HZ(J,V,{messageChanged:!0}),BZ(J,V),h("conversations");else if(K)h("conversations");return!1}}return fZ(J,{id:H,conversationId:$,role:Q,content:X,timestamp:V,isStreaming:!1},"replace"),h("conversations"),!0}function s0(Z){let $=R(Z),Q=r.get($);if(!Q)return null;return D0(Q)}function q6(Z){let $=new Map;if(!Array.isArray(Z))return $;for(let Q of Z){if(!Q||typeof Q.id!=="string"||Q.id.length===0)continue;let X=R(Q.id),Y=typeof Q.conversationRevision==="number"&&Number.isFinite(Q.conversationRevision)?Math.max(0,Math.floor(Q.conversationRevision)):0,H=typeof Q.lastMessageRevision==="number"&&Number.isFinite(Q.lastMessageRevision)?Math.max(0,Math.floor(Q.lastMessageRevision)):0,V=typeof Q.lastMessageTs==="number"&&Number.isFinite(Q.lastMessageTs)?Math.max(0,Math.floor(Q.lastMessageTs)):0;$.set(X,{conversationRevision:Y,lastMessageRevision:H,lastMessageTs:V})}return $}function o0(Z){let $=I(Z.stateBornAt,0),Q=typeof Z.globalRevision==="number"&&Number.isFinite(Z.globalRevision)?Math.max(0,Math.floor(Z.globalRevision)):0,X=q6(Z.conversations);if(Q>0||$>0||X.size>0){if($>0&&$!==_Z)return{mode:"snapshot",state:s3(Z)};if(Q>=EZ)return{mode:"delta",state:{timestamp:OZ,stateBornAt:_Z,globalRevision:EZ,conversations:[],agents:Z0(Z.fallbackAgents),cronJobs:$0(Z.fallbackCronJobs)}};let K=[...r.values()].filter((B)=>!p0(B)).sort((B,O)=>O.updatedAt-B.updatedAt).map((B)=>{let O=X.get(B.id),L=O?.conversationRevision??0,D=O?.lastMessageRevision??0,U=O?.lastMessageTs??0;if(L>0||D>0){if(B.revision<=L&&B.lastMessageRevision<=D&&B.updatedAt<=U)return null}else if(U>0&&B.updatedAt<=U)return null;return D0(B,{lastMessageRevision:D,sinceTimestampMs:U>0?U:void 0})}).filter((B)=>B!==null);return{mode:"delta",state:{timestamp:OZ,stateBornAt:_Z,globalRevision:EZ,conversations:K,agents:Z0(Z.fallbackAgents),cronJobs:$0(Z.fallbackCronJobs)}}}let H=I(Z.sinceTimestampMs,0);if(!H||H<_Z)return{mode:"snapshot",state:s3(Z)};if(H>=OZ)return{mode:"delta",state:{timestamp:OZ,stateBornAt:_Z,globalRevision:EZ,conversations:[],agents:Z0(Z.fallbackAgents),cronJobs:$0(Z.fallbackCronJobs)}};let V=[...r.values()].filter((K)=>!p0(K)).filter((K)=>K.updatedAt>H).sort((K,B)=>B.updatedAt-K.updatedAt).map((K)=>{let O=X.get(K.id)?.lastMessageRevision??0;return D0(K,{sinceTimestampMs:H,lastMessageRevision:O})}),J=Z0(Z.fallbackAgents),q=$0(Z.fallbackCronJobs);return{mode:"delta",state:{timestamp:OZ,stateBornAt:_Z,globalRevision:EZ,conversations:V,agents:J,cronJobs:q}}}var n3="Assistant",s5=1500,r,jZ,GZ,YZ,_Z,OZ,EZ=0,o5,V6=2000,J6=20;var Q0=KZ(()=>{K0();r=new Map,jZ=new Map,GZ=new Map,YZ=new Map,_Z=Date.now(),OZ=Date.now(),o5=new Set});import ZZ from"node:fs";import q4 from"node:os";import IZ from"node:path";function s(Z){if(typeof Z!=="string")return null;let $=Z.trim();return $.length>0?$:null}function P6(Z){if(typeof Z==="number"&&Number.isFinite(Z))return Math.max(0,Math.floor(Z));if(typeof Z==="string"){let $=Number(Z);if(Number.isFinite($))return Math.max(0,Math.floor($))}return 0}function G0(Z){let $=Z.trim().toLowerCase();return $==="botmobile:bot:default"||$.startsWith("botmobile:bot:")}function B4(Z){if(!Z)return!0;let $=Z.trim().toLowerCase();if(!$)return!0;return $==="conversation"||$.startsWith("conversation:")}function R6(Z){let $=Array.isArray(Z.bindings)?Z.bindings:[];for(let H of $){if(!H||typeof H!=="object")continue;let V=s(H.agentId);if(!V)continue;let J=H.match,q=s(J?.channel)?.toLowerCase(),K=s(J?.accountId)?.toLowerCase();if(q!=="botmobile")continue;if(K&&K!=="default")continue;return V}let Q=Array.isArray(Z.agents?.list)?Z.agents.list:[],X=Q.find((H)=>H?.default===!0);return s(X?.id)??s(Q[0]?.id)??"assistant"}function M6(Z){let $=Z.match(L6);if(!$)return null;let Q=R($[2]);if(G0(Q))return null;return{agentId:$[1],conversationId:Q}}function a0(Z){return Z.trim().toLowerCase()}function w6(Z){return`cron:${a0(Z)}`}function L4(Z){if(!Z.toLowerCase().startsWith("cron:"))return null;let $=Z.slice(5).trim();return $.length>0?a0($):null}function S6(Z){let $=Z.match(D6);if(!$)return null;let Q=$[1].trim(),X=a0($[2]);if(!Q||!X)return null;return{agentId:Q,jobId:X}}function j6(Z){let $=s(Z);if(!$)return null;let Q=$.replace(/^cron:\s*/i,"").trim();return Q.length>0?Q:null}function C6(Z,$){let Q=s(Z.sessionFile);if(Q)return Q;let X=s(Z.sessionId);if(!X)return null;let Y=IZ.join(q4.homedir(),".openclaw","agents",$,"sessions",`${X}.jsonl`);try{if(ZZ.existsSync(Y))return Y}catch{}return null}function D4(Z){return`Task ${Z.slice(0,8).toUpperCase()}`}function t0(Z,$,Q){if(Q?.resolveAgentDisplay)return Q.resolveAgentDisplay({cfg:Z,agentId:$});let X=bZ(Z,$);return{name:X.name,emoji:X.emoji}}function U4(Z,$){if(!Z||!$?.resolveCronSnapshot)return null;return $.resolveCronSnapshot(Z)??null}function k6(Z){if(O4.test(Z))return null;let $=Z.match(U6);if(!$)return null;let Q=$[1].trim();if(!Q)return null;if(B4(Q))return null;return Q}function A6(Z){let $=Z.match(O4);if(!$)return null;let Q=R($[1]);if(G0(Q))return null;return Q}function x6(Z){if(!Z||typeof Z!=="object")return null;let $=s(Z.provider)?.toLowerCase(),Q=s(Z.surface)?.toLowerCase(),X=s(Z.chatType)?.toLowerCase(),Y=s(Z.label),H=s(Z.from);if(!($==="botmobile"||Q==="botmobile"||H!==null&&J4.test(H)))return null;if(X&&X!=="direct")return null;if(Y){let J=R(Y);if(!G0(J))return J}if(H){let J=H.match(J4);if(J&&J[1].trim().length>0){let q=R(J[1]);if(!G0(q))return q}}return null}function h6(Z,$,Q){let X=P6($.updatedAt),Y=S6(Z);if(Y){let O=C6($,Y.agentId);if(!O)return null;return{conversationId:w6(Y.jobId),agentId:Y.agentId,sessionFile:O,updatedAt:X,kind:"cron",cronJobId:Y.jobId,cronLabel:j6($.label)??void 0}}let H=s($.sessionFile);if(!H)return null;let V=M6(Z);if(V)return{conversationId:V.conversationId,agentId:V.agentId,sessionFile:H,updatedAt:X};let J=x6($.origin);if(!J)return null;let K=A6(Z)??J,B=k6(Z)??Q;return{conversationId:K,agentId:B,sessionFile:H,updatedAt:X}}function e0(Z){let $=R6(Z),Q=IZ.join(q4.homedir(),".openclaw"),X=IZ.join(Q,"agents"),Y;try{Y=ZZ.readdirSync(X,{withFileTypes:!0}).filter((V)=>V.isDirectory()).map((V)=>V.name)}catch{return[]}let H=[];for(let V of Y){let J=IZ.join(X,V,"sessions","sessions.json"),q;try{q=JSON.parse(ZZ.readFileSync(J,"utf8"))}catch{continue}for(let[K,B]of Object.entries(q)){let O=h6(K,B,$);if(!O)continue;H.push(O)}}return H.sort((V,J)=>J.updatedAt-V.updatedAt),H}function T6(Z,$,Q){let X=[],Y=0;if(Q){let H=Z.indexOf(10);if(H===-1)return[];Y=H+1}for(let H=Y;H<Z.length;H++){if(Z[H]!==10)continue;let V=Z.subarray(Y,H),J=$+Y;if(Y=H+1,V.length===0)continue;let q=V.toString("utf8").trim();if(!q)continue;X.push({line:q,offset:J})}if(Y<Z.length){let V=Z.subarray(Y).toString("utf8").trim();if(V)X.push({line:V,offset:$+Y})}return X}function F4(Z){if(!Array.isArray(Z))return"";let $=[];for(let Q of Z)if(Q&&typeof Q==="object"&&Q.type==="text"&&typeof Q.text==="string")$.push(Q.text);return $.join(`
3
- `)}function G4(Z){try{return JSON.parse(Z)}catch{return null}}function _4(Z,$){if(typeof Z==="number"&&Number.isFinite(Z)&&Z>0)return Math.floor(Z);if(typeof Z==="string"&&Z.trim().length>0){let Q=Number(Z);if(Number.isFinite(Q)&&Q>0)return Math.floor(Q);let X=Date.parse(Z);if(Number.isFinite(X)&&X>0)return Math.floor(X)}if(typeof $==="number"&&Number.isFinite($)&&$>0)return Math.floor($);if(typeof $==="string"&&$.trim().length>0){let Q=Number($);if(Number.isFinite(Q)&&Q>0)return Math.floor(Q);let X=Date.parse($);if(Number.isFinite(X)&&X>0)return Math.floor(X)}return 0}function W4(Z){if(!N6.test(Z))return!1;let $=Z.match(E6);if(!$)return!1;let Q=$[1];return Q==="user"||Q==="assistant"}function b6(Z){let $=Z.trim();if(!_6.test($))return $;let Q=Array.from($.matchAll(G6));if(Q.length===0)return $;let X=Q[Q.length-1],Y=typeof X.index==="number"?X.index:0;return $.slice(Y).trim()}function z4(Z){let $=Z.match(z6),Q=$?$[1].trim():void 0,X=Z.replace(W6,"").trim();return{clean:b6(X).replace(F6,"").trim(),messageId:Q}}function f6(Z){let{sessionFile:$,limit:Q}=Z,X=R(Z.conversationId),Y=IZ.basename($),H=null;try{H=ZZ.openSync($,"r");let V=ZZ.fstatSync(H).size;if(V<=0)return[];let J=Math.min(K4,V);while(!0){let q=Math.max(0,V-J),K=V-q,B=Buffer.allocUnsafe(K);ZZ.readSync(H,B,0,K,q);let O=T6(B,q,q>0),L=[];for(let U=O.length-1;U>=0&&L.length<Q;U--){let z=O[U];if(!W4(z.line))continue;let N=G4(z.line);if(!N||N.type!=="message"||!N.message)continue;let _=N.message;if(_.role!=="user"&&_.role!=="assistant")continue;let T=F4(_.content);if(!T.trim())continue;let A=_.role==="user"?"user":"bot",p=_4(_.timestamp,N.timestamp),b,S;if(A==="user"){let{clean:c,messageId:j}=z4(T);b=c,S=j?`u:${j}`:`t:${Y}:${z.offset}`}else b=T,S=`t:${Y}:${z.offset}`;if(!b.trim())continue;L.push({id:S,conversationId:X,role:A,content:b,timestamp:p,isStreaming:!1})}let D=L.reverse();if(D.length>=Q||q===0)return D;if(J>=V4)return D;J=Math.min(V,J*2,V4)}}catch{return[]}finally{if(H!==null)try{ZZ.closeSync(H)}catch{}}}function N4(Z,$,Q,X,Y){let H=IZ.basename(Z),V=R($.conversationId),J,q;try{J=ZZ.openSync(Z,"r"),q=ZZ.fstatSync(J).size}catch{return{messages:[],cursor:X}}try{if(q<X.offset)X={offset:Math.max(0,q-K4)};if(q<=X.offset)return{messages:[],cursor:X};let K=X.offset,B=q-K,O=Buffer.alloc(B);ZZ.readSync(J,O,0,B,K);let L=0;if(K>0){let j=Buffer.alloc(1);try{if(ZZ.readSync(J,j,0,1,K-1),j[0]!==10){let E=O.indexOf(10);if(E===-1)return{messages:[],cursor:{offset:K}};L=E+1}}catch{}}let D=O.subarray(L),U=K+L,z=D.toString("utf8");if(!z)return{messages:[],cursor:{offset:q}};let N=z.endsWith(`
4
- `),_=z.split(`
5
- `);if(N)_.pop();else _.pop();let T=$.cronJobId??L4(V),A=U4(T,Y),p=$.kind==="cron"?{id:$.cronAgentId??$.agentId,name:$.cronLabel??A?.name??(T?D4(T):"Scheduled Task"),emoji:$.cronAgentEmoji??A?.agentEmoji??"\uD83D\uDD52"}:(()=>{let j=t0(Q,$.agentId,Y);return{id:$.agentId,name:j.name??$.agentId,emoji:j.emoji}})(),b=[],S=U;for(let j of _){let E=Buffer.byteLength(j,"utf8")+1;if(j.trim()){if(!W4(j)){S+=E;continue}let v=G4(j);if(v&&v.type==="message"&&v.message){let W=v.message;if(W.role==="user"||W.role==="assistant"){let m=F4(W.content);if(m.trim()){let x=W.role==="user"?"user":"bot",l=_4(W.timestamp,v.timestamp),n,QZ;if(x==="user"){let{clean:d,messageId:hZ}=z4(m);n=d,QZ=hZ?`u:${hZ}`:`t:${H}:${S}`}else n=m,QZ=`t:${H}:${S}`;if(n.trim())b.push({conversationId:V,agentId:$.agentId,agent:p,role:x,content:n,timestamp:l,stableId:QZ})}}}}S+=E}return{messages:b,cursor:{offset:N?q:S}}}finally{try{ZZ.closeSync(J)}catch{}}}function E4(Z,$){let Q=e0(Z),X=new Map;for(let V of Q){let J=X.get(V.conversationId)??[];J.push(V),X.set(V.conversationId,J)}let Y=[...X.entries()].map(([V,J])=>{let q=[...J].sort((O,L)=>L.updatedAt-O.updatedAt),K=[],B=new Set;for(let O of q){if(B.has(O.sessionFile))continue;B.add(O.sessionFile),K.push(O)}return{conversationId:V,mappings:K,updatedAt:K[0]?.updatedAt??0}}).sort((V,J)=>J.updatedAt-V.updatedAt),H=[];for(let V=0;V<Y.length;V++){let J=Y[V],q=V<O6,K=J.mappings.slice(0,B6),B=new Map;if(q)for(let W of K){let m=f6({sessionFile:W.sessionFile,conversationId:J.conversationId,limit:n0});for(let x of m){let l=B.get(x.id);if(!l||x.timestamp>=l.timestamp)B.set(x.id,x)}}let O=[...B.values()].sort((W,m)=>{if(W.timestamp===m.timestamp)return W.id.localeCompare(m.id);return W.timestamp-m.timestamp}),L=O.length>n0?O.slice(O.length-n0):O,D=L.map((W)=>W.timestamp).filter((W)=>W>0),U=J.mappings.map((W)=>W.updatedAt).filter((W)=>W>0),z=U.length>0?Math.min(...U):J.updatedAt,N=U.length>0?Math.max(...U):J.updatedAt,_=D.length>0?Math.min(...D):z,T=D.length>0?Math.max(N,...D):N,A=J.mappings.find((W)=>!B4(W.agentId))??J.mappings[0],p=A.cronJobId??L4(J.conversationId),b=U4(p,$),S=J.conversationId.toLowerCase().startsWith("cron:"),c=S?A.cronAgentId??b?.agentId??A.agentId:void 0,j=c?t0(Z,c,$):void 0,E=S?A.cronLabel??b?.name??(p?D4(p):"Scheduled Task"):void 0,v=S?{id:c??A.agentId,name:E??"Scheduled Task",emoji:A.cronAgentEmoji??b?.agentEmoji??"\uD83D\uDD52"}:(()=>{let W=t0(Z,A.agentId,$);return{id:A.agentId,name:W.name??A.agentId,emoji:W.emoji}})();H.push({id:J.conversationId,agent:v,createdAt:_,updatedAt:T,kind:S?"cron":void 0,cronJobId:S?p??void 0:void 0,cronName:S?E:void 0,cronAgentId:S?c:void 0,cronAgentName:S?b?.agentName??j?.name:void 0,cronAgentEmoji:S?A.cronAgentEmoji??b?.agentEmoji??j?.emoji:void 0,messages:L})}return console.log(`${K6} loaded ${H.length} conversations (${H.reduce((V,J)=>V+J.messages.length,0)} messages) [tail-read]`),H}var K6="[session-loader]",n0=100,O6=50,B6=3,K4=8388608,V4=134217728,L6,D6,U6,O4,J4,F6,G6,_6,W6,z6,N6,E6;var P4=KZ(()=>{q0();K0();L6=/^agent:([^:]+):botmobil[e]?:direct:(.+)$/i,D6=/^agent:([^:]+):cron:([^:]+)(?::run:([^:]+))?$/i,U6=/^agent:([^:]+):/i,O4=/^agent:conversation:([^:]+):main$/i,J4=/^botmobile:user:(.+)$/i,F6=/^\[(?:BotMobile|Botmobil[e]?) user:\S+ [^\]]+\]\s*/i,G6=/\[(?:BotMobile|Botmobil[e]?) user:\S+ [^\]]+\]\s*/gi,_6=/^\[Queued messages while agent was busy\]/i,W6=/\n\[message_id: [^\]]+\]\s*$/i,z6=/\[message_id:\s*([^\]]+)\]\s*$/i,N6=/"type"\s*:\s*"message"/,E6=/"role"\s*:\s*"([^"]+)"/});import{createRequire as I6}from"node:module";function X0(Z){return y6[Z]??`0x${Z.toString(16)}`}function v6(){let Z=u6.version;if(typeof Z==="string"){let $=Z.trim();if($.length>0)return $}return"dev"}function w4(Z){if(Z3)return Buffer.from(Z3(Z));return Buffer.from(JSON.stringify(Z),"utf8")}function S4(Z){let $;if($3)$=$3(Z);else{let V=Buffer.from(Z).toString("utf8");$=JSON.parse(V)}if(!$||typeof $!=="object")throw Error("Invalid wire envelope payload");let Q=$,X=typeof Q.type==="bigint"?Number(Q.type):Q.type,Y=typeof Q.seq==="bigint"?Number(Q.seq):Q.seq,H=typeof Q.ts==="bigint"?Number(Q.ts):Q.ts;if(typeof X!=="number")throw Error("Invalid wire envelope type");if(typeof Y!=="number")throw Error("Invalid wire envelope seq");if(typeof H!=="number")throw Error("Invalid wire envelope ts");return{type:X,seq:Y,ts:H,payload:Q.payload}}function RZ(Z){if(typeof Z==="number"&&Number.isFinite(Z))return Z;if(typeof Z==="bigint")return Number(Z);return null}function yZ(Z){if(typeof Z!=="string")return null;let $=Z.trim();return $.length>0?$:null}function m6(Z){if(!Array.isArray(Z))return;let $=[];for(let Q of Z){if(!Q||typeof Q!=="object")continue;let X=Q,Y=yZ(X.id);if(!Y)continue;let H=RZ(X.conversationRevision),V=RZ(X.lastMessageRevision),J=RZ(X.lastMessageTs);$.push({id:Y,conversationRevision:H!==null?Math.max(0,Math.floor(H)):void 0,lastMessageRevision:V!==null?Math.max(0,Math.floor(V)):void 0,lastMessageTs:J!==null?Math.max(0,Math.floor(J)):void 0})}return $.length>0?$:void 0}function g6(Z){if(!Array.isArray(Z))return[];let $=[];for(let Q of Z){if(!Q||typeof Q!=="object")continue;let X=Q,Y=yZ(X.transferId),H=yZ(X.fileName);if(!Y||!H)continue;$.push({transferId:Y,fileName:H,mimeType:yZ(X.mimeType)??"application/octet-stream",size:typeof X.size==="number"?X.size:0})}return $}function j4(Z){if(Z.type===F.stateSyncRequest){let X=Z.payload??{},Y=RZ(X.stateBornAt),H=RZ(X.globalRevision),V=m6(X.conversations),J=[],q=RZ(X.lastAgentTs);if(q!==null&&q>0)J.push(q);let K=RZ(X.lastCronTs);if(K!==null&&K>0)J.push(K);if(V){for(let O of V)if(typeof O.lastMessageTs==="number"&&Number.isFinite(O.lastMessageTs)&&O.lastMessageTs>0)J.push(O.lastMessageTs)}return{kind:"legacy",envelope:{type:"state_sync_request",sinceTimestampMs:J.length>0?Math.min(...J):void 0,stateBornAt:Y!==null&&Y>0?Math.max(0,Math.floor(Y)):void 0,globalRevision:H!==null&&H>=0?Math.max(0,Math.floor(H)):void 0,conversations:V}}}if(Z.type!==F.command)return{kind:"ignore",reason:`unsupported_type_${Z.type}`};let $=Z.payload??{};if(typeof $.id!=="string"||$.id.length===0||typeof $.action!=="string")return{kind:"ignore",reason:"invalid_command_payload"};let Q=$.data??{};switch($.action){case"send_message":{let X=typeof Q.conversationId==="string"?Q.conversationId:"",Y=typeof Q.content==="string"?Q.content:"",H=typeof Q.agentId==="string"&&Q.agentId.length>0?Q.agentId:void 0,V=typeof Q.messageId==="string"&&Q.messageId.length>0?Q.messageId:typeof Q.clientMessageId==="string"&&Q.clientMessageId.length>0?Q.clientMessageId:void 0;if(!X||!Y&&!Array.isArray(Q.attachments))return{kind:"ignore",reason:"invalid_send_message"};let J=g6(Q.attachments);return{kind:"command",commandId:$.id,envelope:{type:"message",id:V??crypto.randomUUID(),conversationId:X,from:"user",body:Y,timestamp:Date.now(),agentId:H,pendingAttachments:J.length>0?J:void 0}}}case"stop_generation":{let X=typeof Q.conversationId==="string"?Q.conversationId:"";if(!X)return{kind:"ignore",reason:"invalid_stop_generation"};return{kind:"command",commandId:$.id,envelope:{type:"stop_generation",conversationId:X}}}case"cron_run":{let X=typeof Q.cronJobId==="string"?Q.cronJobId:"";if(!X)return{kind:"ignore",reason:"invalid_cron_run"};return{kind:"command",commandId:$.id,envelope:{type:"cron_run",jobId:X}}}case"cron_toggle":{let X=typeof Q.cronJobId==="string"?Q.cronJobId:"",Y=Q.enabled===!0;if(!X)return{kind:"ignore",reason:"invalid_cron_toggle"};return{kind:"command",commandId:$.id,envelope:{type:"cron_toggle",jobId:X,enabled:Y}}}case"cron_create_from_prompt":{let X=typeof Q.agentId==="string"?Q.agentId.trim():"",Y=typeof Q.description==="string"?Q.description.trim():"",H=typeof Q.name==="string"?Q.name.trim():"",V=RZ(Q.everyMs),J=V!==null&&V>=60000&&V<=2592000000?Math.floor(V):void 0;if(!X||!Y)return{kind:"ignore",reason:"invalid_cron_create_from_prompt"};return{kind:"command",commandId:$.id,envelope:{type:"cron_create_from_prompt",agentId:X,description:Y,name:H.length>0?H:void 0,everyMs:J}}}case"client_state":{let X=Q.isForeground===!0,Y=yZ(Q.activeTab),H=Y==="screen"||Y==="agents"||Y==="tasks"||Y==="settings"?Y:void 0,V=yZ(Q.activeConversationId)??void 0;return{kind:"command",commandId:$.id,envelope:{type:"client_state",isForeground:X,activeTab:H,activeConversationId:V,updatedAt:Date.now()}}}case"new_conversation":case"full_sync":return{kind:"command",commandId:$.id,envelope:{type:"state_sync_request",sinceTimestampMs:void 0}};default:return{kind:"ignore",reason:`unknown_action_${$.action}`}}}var F,y6,R4,u6,M4,Z3=null,$3=null;var C4=KZ(()=>{Q0();F={stateSyncRequest:1,snapshotAgents:2,snapshotCron:3,snapshotConversations:4,conversationDelta:5,streamBatch:6,streamEnd:7,command:16,commandAck:17,agentStatus:18,heartbeat:32,syncBegin:48,syncEnd:49,fileChunk:64,fileChunkAck:65,fileComplete:66,error:255},y6=Object.fromEntries(Object.entries(F).map(([Z,$])=>[$,Z]));R4=I6(import.meta.url),u6=(()=>{try{return R4("../package.json")}catch{return{}}})();M4=v6();try{let Z=R4("msgpackr"),$=new Z.Packr({useRecords:!1});Z3=(Q)=>$.pack(Q),$3=(Q)=>Z.unpack(Q)}catch{}});import k4 from"node:fs";import Q3 from"node:path";import p6 from"node:os";class X3{transfers=new Map;completed=new Map;sendWire;constructor(Z){this.sendWire=Z}handleChunk(Z){let $=this.parseChunkPayload(Z);if(!$)return;let Q=this.transfers.get($.transferId);if(!Q)Q=this.createTransfer($),this.transfers.set($.transferId,Q),console.log(`${Y0} new transfer ${$.transferId} file=${$.fileName} size=${$.totalSize} chunks=${$.totalChunks}`);Q.lastActivityAt=Date.now(),this.resetTimer($.transferId,Q);let X=Buffer.isBuffer($.data)?$.data:Buffer.from($.data);if(Q.receivedChunks.set($.chunkIndex,X),this.sendWire(c6,{transferId:$.transferId,chunkIndex:$.chunkIndex}),Q.receivedChunks.size>=Q.totalChunks)this.finalizeTransfer($.transferId,Q)}getFilePath(Z){return this.completed.get(Z)?.filePath}getCompletedTransfer(Z){return this.completed.get(Z)}dispose(){for(let[,Z]of this.transfers)clearTimeout(Z.timer);this.transfers.clear()}parseChunkPayload(Z){if(!Z||typeof Z!=="object")return null;let $=Z,Q=typeof $.transferId==="string"?$.transferId.trim():"",X=typeof $.fileName==="string"?$.fileName.trim():"",Y=typeof $.mimeType==="string"?$.mimeType.trim():"application/octet-stream",H=typeof $.totalSize==="number"?$.totalSize:0,V=typeof $.chunkIndex==="number"?$.chunkIndex:typeof $.chunkIndex==="bigint"?Number($.chunkIndex):-1,J=typeof $.totalChunks==="number"?$.totalChunks:typeof $.totalChunks==="bigint"?Number($.totalChunks):0,q=$.data;if(!Q||!X||J<=0||V<0)return null;if(!Buffer.isBuffer(q)&&!(q instanceof Uint8Array))return null;return{transferId:Q,fileName:X,mimeType:Y,totalSize:H,chunkIndex:V,totalChunks:J,data:q}}createTransfer(Z){let $=setTimeout(()=>{this.timeoutTransfer(Z.transferId)},A4);return{fileName:Z.fileName,mimeType:Z.mimeType,totalSize:Z.totalSize,totalChunks:Z.totalChunks,receivedChunks:new Map,lastActivityAt:Date.now(),timer:$}}resetTimer(Z,$){clearTimeout($.timer),$.timer=setTimeout(()=>{this.timeoutTransfer(Z)},A4)}timeoutTransfer(Z){let $=this.transfers.get(Z);if(!$)return;console.warn(`${Y0} transfer ${Z} timed out (received ${$.receivedChunks.size}/${$.totalChunks} chunks)`),clearTimeout($.timer),this.transfers.delete(Z),this.sendWire(_0,{transferId:Z,success:!1,error:"Transfer timed out"})}finalizeTransfer(Z,$){clearTimeout($.timer),this.transfers.delete(Z);let Q=[];for(let V=0;V<$.totalChunks;V++){let J=$.receivedChunks.get(V);if(!J){console.error(`${Y0} transfer ${Z} missing chunk ${V}`),this.sendWire(_0,{transferId:Z,success:!1,error:`Missing chunk ${V}`});return}Q.push(J)}let X=Buffer.concat(Q),Y=Q3.basename($.fileName).replace(/[^\w.\-]/g,"_")||"file",H=Q3.join(x4,`${Z}-${Y}`);try{k4.mkdirSync(x4,{recursive:!0}),k4.writeFileSync(H,X)}catch(V){console.error(`${Y0} transfer ${Z} write failed: ${String(V)}`),this.sendWire(_0,{transferId:Z,success:!1,error:`Write failed: ${String(V)}`});return}this.completed.set(Z,{fileName:$.fileName,mimeType:$.mimeType,filePath:H,size:X.length}),console.log(`${Y0} transfer ${Z} complete: ${H} (${X.length} bytes)`),this.sendWire(_0,{transferId:Z,success:!0})}}var Y0="[botmobile:file-receiver]",A4=60000,x4,c6=65,_0=66;var h4=KZ(()=>{x4=Q3.join(p6.homedir(),".openclaw","uploads")});import uZ from"ws";function X7(Z){return new Promise(($)=>setTimeout($,Z))}async function Y7(){if(!Y3)Y3=import("node-datachannel");let Z=await Y3;if(!I4){I4=!0;try{Z.initLogger?.("Error")}catch{}}return Z}function w(Z){if(typeof Z!=="string")return null;let $=Z.trim();return $.length>0?$:null}function H7(Z){if(typeof Z==="string"){let X=Z.trim();if(!X)return null;return{candidate:X}}if(!Z||typeof Z!=="object")return null;let $=Z,Q=w($.candidate);if(!Q)return null;return{candidate:Q,sdpMid:w($.sdpMid)??void 0}}function V7(Z){if(!Z||typeof Z!=="object")return["stun:stun.cloudflare.com:3478"];let Q=Z,X=Array.isArray(Q.urls)?Q.urls.filter((J)=>typeof J==="string"&&J.trim().length>0):typeof Q.urls==="string"?Q.urls.split(",").map((J)=>J.trim()).filter((J)=>J.length>0):[],Y=w(Q.username),H=w(Q.credential);if(X.length===0||!Y||!H)return["stun:stun.cloudflare.com:3478"];let V=["stun:stun.cloudflare.com:3478"];for(let J of X){let q=J7(J);if(!q)continue;V.push({hostname:q.hostname,port:q.port,username:Y,password:H,relayType:q.relayType})}return V}function J7(Z){let $=Z.match(/^(turns?):([^:?]+):(\d+)/);if(!$)return null;let Q=$[1],X=$[2],Y=parseInt($[3],10),V=Z.match(/[?&]transport=(udp|tcp)/i)?.[1]?.toLowerCase()??"udp",J;if(Q==="turns")J="TurnTls";else if(V==="tcp")J="TurnTcp";else J="TurnUdp";return{hostname:X,port:Y,relayType:J}}function q7(Z){return{id:Z.id,conversationId:Z.conversationId,role:Z.from==="user"?"user":"bot",content:Z.body,timestamp:Z.timestamp,isStreaming:!1}}function K7(Z){if(!Z)return;return{...Z,skills:Z.skills?[...Z.skills]:void 0,skillDetails:Z.skillDetails?Z.skillDetails.map(($)=>({...$})):void 0,toolsAllow:Z.toolsAllow?[...Z.toolsAllow]:void 0,toolsDeny:Z.toolsDeny?[...Z.toolsDeny]:void 0}}function O7(Z){let $=Z.status==="working";return{id:Z.agentId,name:Z.name,emoji:Z.emoji,color:Z.color,details:K7(Z.details),queue:$?1:0,lastUpdated:Z.lastActivityAt??Date.now(),usage:{mode:"tokens",value:Math.max(0,(Z.sessionTokensIn??0)+(Z.sessionTokensOut??0))},isRunning:$,currentTask:Z.activeTool}}function B7(Z){return{id:Z.id,name:Z.name,enabled:Z.enabled,isRunning:Z.isRunning===!0,lastUpdated:Date.now(),agentId:Z.agentId,agentName:Z.agentName,agentEmoji:Z.agentEmoji,nextRunAt:Z.nextRunAt,lastRunAt:Z.lastRunAt,lastRunStatus:Z.lastRunStatus,lastRunSummary:Z.lastRunSummary}}function L7(Z){switch(Z.type){case"message":return[{type:F.conversationDelta,payload:{id:Z.conversationId,updatedAt:Z.timestamp,messages:[q7(Z)]}}];case"conversation_list":{let $=Date.now();return[{type:F.snapshotConversations,payload:{timestamp:$,conversations:Z.conversations.map((Q)=>{let X=s0(Q.id);return{id:Q.id,name:Q.name,agent:X?.agent,createdAt:Q.createdAt??X?.createdAt??$,updatedAt:Q.lastActivity??X?.updatedAt??$,revision:X?.revision,lastMessageRevision:X?.lastMessageRevision,activity:X?.activity}})}}]}case"agent_list":return[{type:F.snapshotAgents,payload:{timestamp:Date.now(),agents:Z.agents.map(O7)}}];case"agent_status":return[{type:F.agentStatus,payload:{id:Z.agentId,activeConversationId:Z.activeConversationId,isRunning:Z.status==="working",queue:Z.status==="working"?1:0,color:Z.color,details:Z.details,currentTask:Z.activeTool,lastUpdated:Z.lastActivityAt??Date.now(),usage:{mode:"tokens",value:Math.max(0,(Z.sessionTokensIn??0)+(Z.sessionTokensOut??0))},errorMessage:Z.errorMessage}}];case"cron_list":return[{type:F.snapshotCron,payload:{timestamp:Date.now(),cronJobs:Z.jobs.map(B7)}}];case"state_snapshot":case"state_delta":{let $=[],Q=crypto.randomUUID().slice(0,8),X=Z.state.conversations.length;$.push({type:F.syncBegin,payload:{syncId:Q,totalConversations:X,pluginVersion:M4,stateBornAt:Z.state.stateBornAt,globalRevision:Z.state.globalRevision}}),$.push({type:F.snapshotAgents,payload:{timestamp:Z.state.timestamp,stateBornAt:Z.state.stateBornAt,globalRevision:Z.state.globalRevision,agents:Z.state.agents}}),$.push({type:F.snapshotCron,payload:{timestamp:Z.state.timestamp,stateBornAt:Z.state.stateBornAt,globalRevision:Z.state.globalRevision,cronJobs:Z.state.cronJobs}}),$.push({type:F.snapshotConversations,payload:{timestamp:Z.state.timestamp,stateBornAt:Z.state.stateBornAt,globalRevision:Z.state.globalRevision,conversations:Z.state.conversations.map((Y)=>({id:Y.id,kind:Y.kind,cronJobId:Y.cronJobId,cronName:Y.cronName,cronAgentId:Y.cronAgentId,cronAgentName:Y.cronAgentName,cronAgentEmoji:Y.cronAgentEmoji,agent:Y.agent,createdAt:Y.createdAt,updatedAt:Y.updatedAt,revision:Y.revision,lastMessageRevision:Y.lastMessageRevision,activity:Y.activity}))}});for(let Y of Z.state.conversations)$.push({type:F.conversationDelta,payload:{id:Y.id,kind:Y.kind,cronJobId:Y.cronJobId,cronName:Y.cronName,cronAgentId:Y.cronAgentId,cronAgentName:Y.cronAgentName,cronAgentEmoji:Y.cronAgentEmoji,agent:Y.agent,createdAt:Y.createdAt,updatedAt:Y.updatedAt,revision:Y.revision,lastMessageRevision:Y.lastMessageRevision,activity:Y.activity,messages:Y.messages}});return $.push({type:F.syncEnd,payload:{syncId:Q,sentConversations:X,stateBornAt:Z.state.stateBornAt,globalRevision:Z.state.globalRevision}}),$}case"gateway_heartbeat":return[{type:F.heartbeat,payload:{kind:"gateway",timestamp:Z.timestamp,uptimeMs:Z.uptimeMs}}];case"error":return[{type:F.error,payload:{code:Z.code,message:Z.message,conversationId:Z.conversationId}}];case"ping":case"pong":default:return[]}}function y4(Z,$){if(Z===F.heartbeat)return"";if(!$||typeof $!=="object")return String($??"");let Q=$;switch(Z){case F.conversationDelta:{let X=Array.isArray(Q.messages)?Q.messages.length:0;return`conv=${w(Q.id)??"?"} msgs=${X}`}case F.snapshotAgents:return`agents=${Array.isArray(Q.agents)?Q.agents.length:0}`;case F.snapshotCron:return`jobs=${Array.isArray(Q.cronJobs)?Q.cronJobs.length:0}`;case F.snapshotConversations:return`conversations=${Array.isArray(Q.conversations)?Q.conversations.length:0}`;case F.streamBatch:return`conv=${w(Q.conversationId)??"?"} msg=${w(Q.messageId)?.slice(0,8)??"?"} +${(w(Q.tokens)??"").length}ch`;case F.streamEnd:return`conv=${w(Q.conversationId)??"?"} msg=${w(Q.messageId)?.slice(0,8)??"?"} len=${(w(Q.finalContent)??"").length}`;case F.command:return`action=${w(Q.action)??"?"} id=${w(Q.id)??"?"}`;case F.commandAck:return`id=${w(Q.commandId)??"?"} ok=${Q.ok}`;case F.agentStatus:return`agent=${w(Q.id)??"?"} running=${Q.isRunning}`;case F.syncBegin:return`syncId=${w(Q.syncId)??"?"} total=${Q.totalConversations}`;case F.syncEnd:return`syncId=${w(Q.syncId)??"?"} sent=${Q.sentConversations}`;case F.error:return`code=${w(Q.code)??"?"} msg=${w(Q.message)??"?"}`;case F.stateSyncRequest:return`globalRevision=${Q.globalRevision??"nil"} stateBornAt=${Q.stateBornAt??"nil"}`;default:return JSON.stringify($).slice(0,120)}}class H3{account;onLegacyEnvelope;onSignalingStatus;onDataChannelStatus;signalingWs=null;peerConnection=null;dataChannel=null;currentSessionId=null;currentOfferRequestId=null;outboundSeq=1;outboundQueue=[];outboundQueueBytes=0;streamTextByMessageId=new Map;pendingStreamBatches=new Map;dataChannelDisconnectedAt=null;awaitingStateSyncRequest=!1;heartbeatInterval=null;lastHeartbeatReceivedAt=0;lastHeartbeatRttMs=null;lastPushSentAt=0;clientIsForeground=null;clientStateUpdatedAt=0;pendingPushTimer=null;pendingPushRequest=null;resyncRequired=!1;pendingRemoteCandidates=[];remoteDescriptionApplied=!1;pendingSignalQueue=[];signalingHeartbeatInterval=null;lastSignalingPongAt=0;stopped=!1;answerGatherTimer=null;_fileReceiver=null;lastSnapshotSignatureByType=new Map;lastSnapshotSentAtByType=new Map;constructor(Z){this.account=Z.account,this.onLegacyEnvelope=Z.onLegacyEnvelope,this.onSignalingStatus=Z.onSignalingStatus,this.onDataChannelStatus=Z.onDataChannelStatus}get fileReceiver(){return this._fileReceiver}async run(Z){let $=T4;while(!Z.aborted&&!this.stopped){try{await this.connectSignalingOnce(Z),$=T4}catch(Q){console.error(`${G} signaling loop error: ${String(Q)}`)}if(Z.aborted||this.stopped)break;await X7($),$=Math.min($*2,l6)}this.cleanup()}stop(){this.stopped=!0,this.cleanup()}sendLegacyEnvelope(Z){if(Z.type==="stream_start"){this.handleLegacyStreamStart(Z);return}if(Z.type==="stream_token"){this.handleLegacyStreamToken(Z);return}if(Z.type==="stream_end"){this.handleLegacyStreamEnd(Z);return}let $=L7(Z);for(let Q of $)this.sendWire(Q.type,Q.payload)}async connectSignalingOnce(Z){let $=`${this.account.workerUrl.replace(/^http/,"ws")}/ws/signal`;await new Promise((Q,X)=>{let Y=!1,H=null,V=new uZ($,{headers:{authorization:`BotMobileSecret ${this.account.sharedSecret}`}});this.signalingWs=V;let J=(q)=>{if(Y)return;if(Y=!0,H)Z.removeEventListener("abort",H),H=null;q()};H=()=>{this.stopSignalingHeartbeat();try{V.close()}catch{}J(()=>Q())},Z.addEventListener("abort",H,{once:!0}),V.on("open",()=>{this.onSignalingStatus?.(!0),this.startSignalingHeartbeat(),this.flushPendingSignalQueue()}),V.on("message",(q)=>{let K=q.toString(),B;try{B=JSON.parse(K)}catch{console.warn(`${G} invalid signaling message`);return}this.handleSignalingMessage(B).catch((O)=>{console.error(`${G} signaling message handler failed: ${String(O)}`)})}),V.on("close",()=>{this.stopSignalingHeartbeat(),this.onSignalingStatus?.(!1),this.signalingWs=null,J(()=>Q())}),V.on("error",(q)=>{this.stopSignalingHeartbeat(),this.onSignalingStatus?.(!1),this.signalingWs=null,J(()=>X(q))})})}async handleSignalingMessage(Z){if(!Z||typeof Z!=="object")return;let $=Z;if($.type==="pong"){this.lastSignalingPongAt=Date.now();return}if($.type==="ping"){this.sendSignal({type:"pong",ts:Date.now()});return}if($.type==="offer"){await this.handleOffer(Z);return}if($.type==="ice"){this.handleRemoteIce(Z);return}if($.type==="error")console.warn(`${G} signaling error: ${JSON.stringify(Z)}`)}sendSignalingPing(){let Z=this.signalingWs;if(!Z||Z.readyState!==uZ.OPEN)return;try{Z.send(JSON.stringify({type:"ping",ts:Date.now()}))}catch($){console.warn(`${G} signaling ping send failed: ${String($)}`);try{Z.close()}catch{}}}startSignalingHeartbeat(){this.stopSignalingHeartbeat(),this.lastSignalingPongAt=Date.now(),this.sendSignalingPing(),this.signalingHeartbeatInterval=setInterval(()=>{let Z=this.signalingWs;if(!Z||Z.readyState!==uZ.OPEN)return;if(Date.now()-this.lastSignalingPongAt>a6){console.warn(`${G} signaling heartbeat stale; forcing reconnect`);try{Z.close()}catch{}return}this.sendSignalingPing()},t6)}stopSignalingHeartbeat(){if(this.signalingHeartbeatInterval)clearInterval(this.signalingHeartbeatInterval),this.signalingHeartbeatInterval=null;this.lastSignalingPongAt=0}async handleOffer(Z){let $=w(Z.requestId),Q=w(Z.sdp);if(!$||!Q){this.sendSignal({type:"error",requestId:Z.requestId,code:"INVALID_OFFER",message:"Offer payload is missing requestId or sdp"},{queueIfClosed:!0});return}if(this.answerGatherTimer)clearTimeout(this.answerGatherTimer),this.answerGatherTimer=null;if(this.peerConnection||this.dataChannel)console.log(`${G} closing stale peer connection before new offer`),this.closePeerConnection();this.currentOfferRequestId=$,this.currentSessionId=Z.sessionId??crypto.randomUUID().replace(/-/g,""),this.pendingRemoteCandidates=[],this.remoteDescriptionApplied=!1,this.awaitingStateSyncRequest=!0;let X;try{X=await this.ensurePeerConnection(Z.turnCredentials)}catch(Y){this.sendSignal({type:"error",requestId:$,code:"PEER_CREATE_FAILED",message:String(Y)},{queueIfClosed:!0});return}try{console.log(`${G} setRemoteDescription offer sdp_len=${Q.length} ice_candidates=${Array.isArray(Z.iceCandidates)?Z.iceCandidates.length:0}`);let H=(Q.split(`\r
1
+ import{createRequire as h5}from"node:module";var S5=Object.create;var{getPrototypeOf:j5,defineProperty:b0,getOwnPropertyNames:C5}=Object;var k5=Object.prototype.hasOwnProperty;var A5=(Z,$,Q)=>{Q=Z!=null?S5(j5(Z)):{};let X=$||!Z||!Z.__esModule?b0(Q,"default",{value:Z,enumerable:!0}):Q;for(let Y of C5(Z))if(!k5.call(X,Y))b0(X,Y,{get:()=>Z[Y],enumerable:!0});return X};var x5=(Z,$)=>{for(var Q in $)b0(Z,Q,{get:$[Q],enumerable:!0,configurable:!0,set:(X)=>$[Q]=()=>X})};var KZ=(Z,$)=>()=>(Z&&($=Z(Z=0)),$);var T5=h5(import.meta.url);function A3(Z){f0=Z}function J0(){if(!f0)throw Error("BotMobile runtime not initialized");return f0}var f0=null;import f5 from"node:fs";import I0 from"node:os";import oZ from"node:path";function TZ(Z){if(typeof Z!=="string")return;let $=Z.trim();return $.length>0?$:void 0}function nZ(Z){return(TZ(Z)??"main").toLowerCase()}function y0(Z){let $=Z.agents?.list;if(!Array.isArray($))return[];return $.filter((Q)=>!!Q&&typeof Q==="object")}function y5(Z){let $=y0(Z);if($.length===0)return"main";let Q=$.find((X)=>X.default===!0);return nZ((Q??$[0])?.id)}function h3(Z){if(Z.startsWith("~"))return oZ.resolve(Z.replace(/^~/,I0.homedir()));return oZ.resolve(Z)}function u5(Z,$){let Q=nZ($),Y=y0(Z).find((J)=>nZ(J.id)===Q),H=TZ(Y?.workspace);if(H)return h3(H);let V=y5(Z);if(Q===V){let J=TZ(Z.agents?.defaults?.workspace);if(J)return h3(J);return oZ.join(I0.homedir(),".openclaw","workspace")}return oZ.join(I0.homedir(),".openclaw",`workspace-${Q}`)}function T3(Z,$){let Q=Z.split(/\r?\n/);for(let X=0;X<Q.length;X++){let H=Q[X].replace(/\*\*/g,"").trim().match(new RegExp(`^(?:[-*]\\s*)?${$}\\s*:\\s*(.*?)\\s*$`,"i"));if(!H)continue;let V=H[1]?.trim();if(!V&&X+1<Q.length)V=Q[X+1].replace(/\*\*/g,"").trim();if(!V)continue;let J=V.replace(/^["'`]|["'`]$/g,"").trim();if(!J)continue;return J}return}function v5(Z){let $=Date.now(),Q=x3.get(Z);if(Q&&$-Q.loadedAt<I5)return{name:Q.name,emoji:Q.emoji};let X=oZ.join(Z,"IDENTITY.md"),Y,H;try{let V=f5.readFileSync(X,"utf8");Y=T3(V,"name"),H=T3(V,"emoji")}catch{Y=void 0,H=void 0}return x3.set(Z,{loadedAt:$,name:Y,emoji:H}),{name:Y,emoji:H}}function bZ(Z,$){let Q=nZ($),Y=y0(Z).find((O)=>nZ(O.id)===Q),H=TZ(Y?.identity?.emoji),V=TZ(Y?.identity?.name),J=u5(Z,Q),q=v5(J);if(V)return{name:V,emoji:H??q.emoji,source:"identity-config",emojiSource:H?"identity-config":q.emoji?"identity-file":void 0};let K=q.name;if(K)return{name:K,emoji:H??q.emoji,source:"identity-file",emojiSource:H?"identity-config":q.emoji?"identity-file":void 0};let B=TZ(Y?.name);if(B)return{name:B,emoji:H??q.emoji,source:"config-name",emojiSource:H?"identity-config":q.emoji?"identity-file":void 0};return{name:Q||"Assistant",emoji:H??q.emoji,source:"agent-id",emojiSource:H?"identity-config":q.emoji?"identity-file":void 0}}var x3,I5=30000;var q0=KZ(()=>{x3=new Map});function R(Z){let $=Z.trim();if(!$)return Z;if(m5.test($))return $.toUpperCase();return $}var m5;var K0=KZ(()=>{m5=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i});import I3 from"node:fs";import aZ from"node:path";import b3 from"node:os";import{randomUUID as O0}from"node:crypto";import tZ from"ws";function u3(Z){let $=Z.cron?.store;if(typeof $==="string"&&$.trim()){let Q=$.trim();if(Q.startsWith("~"))return aZ.resolve(Q.replace("~",b3.homedir()));return aZ.resolve(Q)}return aZ.join(b3.homedir(),".openclaw","cron","jobs.json")}function c5(Z,$){return aZ.join(aZ.dirname(Z),"runs",`${$}.jsonl`)}function u0(Z){let $=Z.gateway?.port;if(typeof $==="number"&&Number.isFinite($)&&$>0)return $;return g5}function v0(Z){let $=Z.gateway?.auth?.token;return typeof $==="string"&&$.trim()?$.trim():void 0}function m0(Z){return typeof Z==="object"&&Z!==null}function l5(Z){if(!m0(Z))return!1;return Z.type==="res"&&typeof Z.id==="string"&&typeof Z.ok==="boolean"}function f3(Z){if(!m0(Z))return!1;return Z.type==="event"&&typeof Z.event==="string"}function d5(Z){if(!m0(Z))return null;let{jobId:$,action:Q}=Z;if(typeof $!=="string"||!$.trim())return null;if(Q!=="added"&&Q!=="updated"&&Q!=="removed"&&Q!=="started"&&Q!=="finished")return null;let X={jobId:$,action:Q};if(typeof Z.runAtMs==="number"&&Number.isFinite(Z.runAtMs))X.runAtMs=Z.runAtMs;if(typeof Z.durationMs==="number"&&Number.isFinite(Z.durationMs))X.durationMs=Z.durationMs;if(Z.status==="ok"||Z.status==="error"||Z.status==="skipped")X.status=Z.status;if(typeof Z.error==="string")X.error=Z.error;if(typeof Z.summary==="string")X.summary=Z.summary;if(typeof Z.sessionId==="string")X.sessionId=Z.sessionId;if(typeof Z.sessionKey==="string")X.sessionKey=Z.sessionKey;if(typeof Z.nextRunAtMs==="number"&&Number.isFinite(Z.nextRunAtMs))X.nextRunAtMs=Z.nextRunAtMs;return X}class v3{cfg;tag;ws=null;reconnectTimer=null;reconnectDelayMs=1000;connectRequestId=null;stopped=!1;connected=!1;pending=new Map;cronListeners=new Set;constructor(Z,$){this.cfg=Z;this.tag=$}start(){this.stopped=!1,this.ensureConnected()}stop(){if(this.stopped=!0,this.connected=!1,this.connectRequestId=null,this.reconnectTimer)clearTimeout(this.reconnectTimer),this.reconnectTimer=null;let Z=this.ws;if(this.ws=null,Z)try{Z.close()}catch{}this.failPending("gateway bridge stopped")}isConnected(){return this.connected&&this.ws!==null&&this.ws.readyState===tZ.OPEN}listenerCount(){return this.cronListeners.size}addCronListener(Z){return this.cronListeners.add(Z),this.start(),()=>{this.cronListeners.delete(Z)}}async request(Z,$){let Q=this.ws;if(!this.isConnected()||!Q)return{ok:!1,error:"gateway bridge not connected"};let X=O0(),H=JSON.stringify({type:"req",id:X,method:Z,params:$});return await new Promise((V)=>{let J=setTimeout(()=>{this.pending.delete(X),V({ok:!1,error:`gateway ${Z} timeout after ${B0}ms`})},B0);this.pending.set(X,{resolve:V,timeout:J});try{Q.send(H)}catch(q){this.pending.delete(X),clearTimeout(J),V({ok:!1,error:`gateway WS send failed: ${String(q)}`})}})}ensureConnected(){if(this.stopped)return;if(this.ws&&this.ws.readyState===tZ.OPEN)return;if(this.ws&&this.ws.readyState===tZ.CONNECTING)return;if(this.reconnectTimer)return;let Z=u0(this.cfg),$=v0(this.cfg),Q=`ws://127.0.0.1:${Z}`,X=new tZ(Q,{maxPayload:4194304});this.ws=X,this.connected=!1;let Y=!1,H=()=>{if(Y)return;Y=!0,this.connectRequestId=O0();let V={minProtocol:3,maxProtocol:3,client:{id:"gateway-client",version:"dev",platform:process.platform,mode:"backend"},caps:[],role:"operator",scopes:["operator.admin"]};if($)V.auth={token:$};try{X.send(JSON.stringify({type:"req",id:this.connectRequestId,method:"connect",params:V}))}catch(J){console.error(`${this.tag} bridge connect send failed: ${String(J)}`)}};X.on("open",()=>{H()}),X.on("message",(V)=>{try{let J=JSON.parse(String(V));if(l5(J)){if(J.id===this.connectRequestId){if(!J.ok){this.connected=!1,console.error(`${this.tag} bridge connect failed: ${J.error?.message??"unknown"}`);try{X.close()}catch{}return}this.connected=!0,this.reconnectDelayMs=1000;return}let q=this.pending.get(J.id);if(q)if(this.pending.delete(J.id),clearTimeout(q.timeout),J.ok)q.resolve({ok:!0,payload:J.payload});else q.resolve({ok:!1,error:J.error?.message??"unknown error"});return}if(f3(J)&&J.event==="cron"){let q=d5(J.payload);if(!q)return;for(let K of this.cronListeners)try{K(q)}catch(B){console.error(`${this.tag} cron listener failed: ${String(B)}`)}return}if(f3(J)&&J.event==="connect.challenge"){if(!Y)H()}}catch{}}),X.on("error",(V)=>{console.error(`${this.tag} bridge WS error: ${String(V)}`)}),X.on("close",()=>{if(this.ws===X)this.ws=null;this.connected=!1,this.connectRequestId=null,this.failPending("gateway connection closed"),this.scheduleReconnect()})}scheduleReconnect(){if(this.stopped)return;if(this.reconnectTimer)return;if(this.cronListeners.size===0)return;let Z=this.reconnectDelayMs;this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,p5),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.ensureConnected()},Z)}failPending(Z){for(let[$,Q]of this.pending)this.pending.delete($),clearTimeout(Q.timeout),Q.resolve({ok:!1,error:Z})}}function m3(Z){return`${u0(Z)}|${v0(Z)??""}`}function i5(Z){let $=m3(Z);if(t&&L0===$)return t;if(t)t.stop();return t=new v3(Z,y3),L0=$,t}function g3(Z,$){let X=i5(Z).addCronListener($);return()=>{if(X(),t&&t.listenerCount()===0)t.stop(),t=null,L0=null}}async function g0(Z,$,Q){let X=m3(Z);if(t&&L0===X&&t.isConnected()){let Y=await t.request($,Q);if(Y.ok||Y.error!=="gateway bridge not connected")return Y}return await r5(Z,$,Q)}async function r5(Z,$,Q){let X=u0(Z),Y=v0(Z),H=`ws://127.0.0.1:${X}`;return new Promise((V)=>{let J=!1,q=(N)=>{if(J)return;J=!0,clearTimeout(K);try{B.close()}catch{}V(N)},K=setTimeout(()=>{q({ok:!1,error:`gateway RPC timeout after ${B0}ms`})},B0),B=new tZ(H,{maxPayload:4194304}),O=null,L=null,D=!1,U=null,z=(N)=>{if(D)return;if(D=!0,U)clearTimeout(U),U=null;O=O0();let G={minProtocol:3,maxProtocol:3,client:{id:"gateway-client",version:"dev",platform:process.platform,mode:"backend"},caps:[],role:"operator",scopes:["operator.admin"]};if(Y)G.auth={token:Y};B.send(JSON.stringify({type:"req",id:O,method:"connect",params:G}))};B.on("open",()=>{U=setTimeout(()=>z(),750)}),B.on("message",(N)=>{try{let G=JSON.parse(String(N));if(G.type==="event"){if(G.event==="connect.challenge"){let T=G.payload?.nonce;z(typeof T==="string"?T:void 0)}return}if(G.type==="res"&&G.id===O){if(!G.ok){q({ok:!1,error:`gateway connect failed: ${G.error?.message??"unknown"}`});return}L=O0(),B.send(JSON.stringify({type:"req",id:L,method:$,params:Q}));return}if(G.type==="res"&&G.id===L){if(G.ok)q({ok:!0,payload:G.payload});else q({ok:!1,error:G.error?.message??"unknown error"});return}}catch{}}),B.on("error",(N)=>{q({ok:!1,error:`gateway WS error: ${String(N)}`})}),B.on("close",()=>{q({ok:!1,error:"gateway WS closed unexpectedly"})})})}function p0(Z){let $=u3(Z);try{let Q=I3.readFileSync($,"utf-8");return JSON.parse(Q)?.jobs??[]}catch(Q){return console.error(`${y3} failed to read cron store at ${$}: ${String(Q)}`),[]}}function p3(Z,$,Q=20){let X=u3(Z),Y=c5(X,$);try{let H=I3.readFileSync(Y,"utf-8");if(!H.trim())return[];let V=H.split(`
2
+ `),J=[];for(let q=V.length-1;q>=0&&J.length<Q;q--){let K=V[q]?.trim();if(!K)continue;try{let B=JSON.parse(K);if(B?.action==="finished"&&typeof B.ts==="number")J.push({ts:B.ts,jobId:B.jobId??$,action:B.action,status:B.status,error:B.error,summary:B.summary,durationMs:B.durationMs})}catch{}}return J}catch{return[]}}async function c3(Z,$){let Q=await g0(Z,"cron.run",{id:$,mode:"force"});if(!Q.ok)return{ok:!1,error:Q.error};return{ok:!0}}async function l3(Z,$,Q){let X=await g0(Z,"cron.update",{id:$,patch:{enabled:Q}});if(!X.ok)return{ok:!1,error:X.error};return{ok:!0}}async function d3(Z,$){let Q=await g0(Z,"cron.add",$);if(!Q.ok)return{ok:!1,error:Q.error};return{ok:!0}}var y3="[botmobile:cron]",g5=18789,B0=15000,p5=30000,t=null,L0=null;var i3=()=>{};function h(Z){for(let $ of o5)try{$(Z)}catch{}}function M(){return Date.now()}function I(Z,$=M()){if(typeof Z==="number"&&Number.isFinite(Z)&&Z>0)return Math.floor(Z);return Math.floor($)}function r3(Z){if(!Z)return;let $=Z.trim();if(!$)return;if($.startsWith("conversation:"))return;if($.toLowerCase()==="conversation")return;return R($)}function d0(Z){if(!Z)return;let $=Z.trim().toLowerCase();return $.length>0?$:void 0}function U0(Z){let $=Z.trim();if(!$.toLowerCase().startsWith("cron:"))return;return d0($.slice(5))}function n5(Z,$){if(Z?.trim().toLowerCase()==="cron")return"cron";return U0($)?"cron":void 0}function PZ(Z){if(!Z)return;let $=Z.trim();return $.length>0?$:void 0}function c0(Z){return Z.id.startsWith("conversation:")&&Z.messageOrder.length===0}function t3(Z){let $=I(Z,M());return OZ=Math.max(OZ+1,$),OZ}function WZ(Z){let $=++EZ;return t3(Z),$}function i0(Z){if(!Z)return;return{...Z,skills:Z.skills?[...Z.skills]:void 0,skillDetails:Z.skillDetails?Z.skillDetails.map(($)=>({...$})):void 0,toolsAllow:Z.toolsAllow?[...Z.toolsAllow]:void 0,toolsDeny:Z.toolsDeny?[...Z.toolsDeny]:void 0}}function t5(Z){return{...Z,details:i0(Z.details),usage:{...Z.usage}}}function a5(Z){return{...Z,schedule:Z.schedule?{...Z.schedule}:void 0}}function r0(Z){return{...Z}}function e5(Z){return{...Z}}function Z6(Z){return{id:`conversation:${Z}`,name:n3}}function l0(Z){let $=typeof Z.id==="string"?Z.id.trim().toLowerCase():"",Q=typeof Z.name==="string"?Z.name.trim().toLowerCase():"";if(!$)return!0;if($==="conversation"||$.startsWith("conversation:"))return!0;if(!Q)return!0;return Q===n3.toLowerCase()||Q==="conversation"}function a3(Z){return{isAgentActive:!1,isComposing:!1,lastUpdated:Z}}function $6(Z,$){let Q=r.get(Z);if(!Q)return null;r.delete(Z),Q.id=$;for(let X of Q.messages.values())X.conversationId=$;r.set($,Q);for(let[X,Y]of YZ)if(Y===Z)YZ.set(X,$);return Q}function Q6(Z){for(let $ of r.keys())if(R($)===Z)return $;return null}function a(Z,$){let Q=R(Z),X=r.get(Q);if(X)return X;let Y=Q6(Q);if(Y&&Y!==Q){let q=$6(Y,Q);if(q)return q}let H=I($,M()),V=U0(Q),J={id:Q,kind:V?"cron":void 0,cronJobId:V,cronName:void 0,cronAgentId:void 0,cronAgentName:void 0,cronAgentEmoji:void 0,agent:Z6(Q),createdAt:H,updatedAt:H,revision:0,lastMessageRevision:0,activity:a3(H),messages:new Map,messageOrder:[]};return J.revision=WZ(H),r.set(Q,J),J}function BZ(Z,$){let Q=I($,M());Z.updatedAt=Math.max(Z.updatedAt,Q)}function HZ(Z,$,Q){let X=WZ($);if(Z.revision=Math.max(Z.revision,X),Q?.messageChanged)Z.lastMessageRevision=Math.max(Z.lastMessageRevision,X);return X}function X6(Z){for(let $ of Z.messages.values())if($.isStreaming)return!0;return!1}function XZ(Z,$,Q){let X=I(Q,M()),Y=Z.activity,H=Y.activeAgentId,V=Object.prototype.hasOwnProperty.call($,"activeAgentId"),J=Object.prototype.hasOwnProperty.call($,"activeTool"),q={isAgentActive:$.isAgentActive??Y.isAgentActive,isComposing:$.isComposing??Y.isComposing,activeAgentId:V?$.activeAgentId:Y.activeAgentId,activeTool:J?$.activeTool:Y.activeTool,lastUpdated:Math.max(Y.lastUpdated,X)};if(!q.isAgentActive&&!q.isComposing)q.activeAgentId=void 0,q.activeTool=void 0;else if(!q.isAgentActive)q.activeTool=void 0;if(!(q.isAgentActive!==Y.isAgentActive||q.isComposing!==Y.isComposing||q.activeAgentId!==Y.activeAgentId||q.activeTool!==Y.activeTool)){if(q.lastUpdated>Y.lastUpdated)Y.lastUpdated=q.lastUpdated;if(q.isAgentActive&&q.activeAgentId)YZ.set(q.activeAgentId,Z.id);return!1}if(Z.activity=q,H&&YZ.get(H)===Z.id&&q.activeAgentId!==H)YZ.delete(H);if(q.isAgentActive&&q.activeAgentId)YZ.set(q.activeAgentId,Z.id);return BZ(Z,X),HZ(Z,X),!0}function eZ(Z,$,Q){let X=I($,M()),Y=Q?R(Q):void 0,H=!1,V=YZ.get(Z);if(V&&V!==Y){let J=r.get(V);if(J)H=XZ(J,{isAgentActive:!1,isComposing:!1,activeAgentId:void 0,activeTool:void 0},X)||H}for(let[J,q]of r){if(J===V)continue;if(J===Y)continue;if(q.activity.activeAgentId!==Z)continue;H=XZ(q,{isAgentActive:!1,isComposing:!1,activeAgentId:void 0,activeTool:void 0},X)||H}if(Y)YZ.set(Z,Y);else YZ.delete(Z);return H}function Y6(Z){while(Z.messageOrder.length>s5){let $=Z.messageOrder.shift();if(!$)break;Z.messages.delete($)}}function fZ(Z,$,Q){let X=I($.timestamp,M()),Y=Z.messages.get($.id);if(!Y){let V=HZ(Z,X,{messageChanged:!0});Z.messages.set($.id,r0({...$,timestamp:X,revision:V})),Z.messageOrder.push($.id),Y6(Z),BZ(Z,X);return}if(Q==="append")Y.content+=$.content,Y.timestamp=X,Y.isStreaming=$.isStreaming??Y.isStreaming;else Y.content=$.content,Y.role=$.role,Y.timestamp=X,Y.isStreaming=$.isStreaming;let H=HZ(Z,Y.timestamp,{messageChanged:!0});Y.revision=H,BZ(Z,Y.timestamp)}function H6(Z){let $=[];for(let Q of Z.messageOrder){let X=Z.messages.get(Q);if(!X)continue;$.push(r0(X))}return $.sort((Q,X)=>{if(Q.timestamp===X.timestamp)return Q.id.localeCompare(X.id);return Q.timestamp-X.timestamp}),$}function D0(Z,$){let Q=$?.sinceTimestampMs,X=typeof $?.lastMessageRevision==="number"&&Number.isFinite($.lastMessageRevision)?Math.max(0,Math.floor($.lastMessageRevision)):0,Y=H6(Z).filter((H)=>{if(X>0){let V=typeof H.revision==="number"&&Number.isFinite(H.revision)?Math.max(0,Math.floor(H.revision)):0;if(V>X)return!0;if(V>0)return!1}if(!Q||!Number.isFinite(Q)||Q<=0)return!0;return H.timestamp>Q});return{id:Z.id,kind:Z.kind,cronJobId:Z.cronJobId,cronName:Z.cronName,cronAgentId:Z.cronAgentId,cronAgentName:Z.cronAgentName,cronAgentEmoji:Z.cronAgentEmoji,agent:{...Z.agent},createdAt:Z.createdAt,updatedAt:Z.updatedAt,revision:Z.revision,lastMessageRevision:Z.lastMessageRevision,activity:e5(Z.activity),messages:Y}}function e3(Z){let $=Number.isFinite(Z.sessionTokensIn)?Z.sessionTokensIn:0,Q=Number.isFinite(Z.sessionTokensOut)?Z.sessionTokensOut:0,X=I(Z.lastActivityAt,M()),Y=Z.status==="working";return{id:Z.agentId,name:Z.name||Z.agentId,emoji:Z.emoji,color:Z.color,details:i0(Z.details),queue:Y?1:0,lastUpdated:X,usage:{mode:"tokens",value:Math.max(0,$+Q)},isRunning:Y,currentTask:Z.activeTool}}function Z4(Z,$){let Q=I($??Z.lastRunAt??Z.nextRunAt,M());return{id:Z.id,name:Z.name,enabled:Z.enabled,isRunning:Z.isRunning,lastUpdated:Q,agentId:Z.agentId,agentName:Z.agentName,agentEmoji:Z.agentEmoji,schedule:Z.schedule?{...Z.schedule}:void 0,nextRunAt:Z.nextRunAt,lastRunAt:Z.lastRunAt,lastRunStatus:Z.lastRunStatus,lastRunSummary:Z.lastRunSummary}}function Z0(Z){if(jZ.size>0)return[...jZ.values()].map(t5);if(!Z||Z.length===0)return[];return Z.map(($)=>e3($))}function $0(Z){if(_Z.size>0)return[..._Z.values()].map(a5);if(!Z||Z.length===0)return[];return Z.map(($)=>Z4($))}function s3(Z){let $=[...r.values()].filter((Y)=>!c0(Y)).sort((Y,H)=>H.updatedAt-Y.updatedAt).map((Y)=>D0(Y)),Q=Z0(Z?.fallbackAgents),X=$0(Z?.fallbackCronJobs);return{timestamp:OZ,stateBornAt:GZ,globalRevision:EZ,conversations:$,agents:Q,cronJobs:X}}function $4(){r.clear(),jZ.clear(),_Z.clear(),YZ.clear(),GZ=M(),OZ=GZ,EZ=0}function Q4(Z){let $=0;for(let Q of Z){let X=R(Q.id),Y=U0(X),H=n5(Q.kind,X),V=d0(Q.cronJobId)??Y,J=PZ(Q.cronName),q=PZ(Q.cronAgentId),K=PZ(Q.cronAgentName),B=PZ(Q.cronAgentEmoji),O=new Map,L=[],D=0;for(let G of Q.messages){let T=I(G.timestamp,M()),A=WZ(T);O.set(G.id,r0({...G,conversationId:X,timestamp:T,revision:A})),L.push(G.id),$=Math.max($,T),D=A}let U=I(Q.createdAt,M()),z=I(Q.updatedAt,U),N=D>0?D:WZ(z);r.set(X,{id:X,kind:H,cronJobId:V,cronName:J,cronAgentId:q,cronAgentName:K,cronAgentEmoji:B,agent:{...Q.agent},createdAt:U,updatedAt:z,revision:N,lastMessageRevision:D,activity:a3(z),messages:O,messageOrder:L}),$=Math.max($,z)}if($>0)t3($)}function F0(Z,$,Q){let X=R(Z),Y=I(Q,M()),H=a(X,Y);H.agent={id:$.id||H.agent.id,name:$.name||H.agent.name,emoji:$.emoji??H.agent.emoji},BZ(H,Y),HZ(H,Y),h("conversations")}function s0(Z,$){let Q=R(Z.conversationId),X=I($,M()),Y=a(Q,X),H=U0(Q),V=d0(Z.cronJobId)??H,J=Y.kind??(V?"cron":void 0),q=PZ(Z.cronName)??Y.cronName,K=PZ(Z.cronAgentId)??Y.cronAgentId,B=PZ(Z.cronAgentName)??Y.cronAgentName,O=PZ(Z.cronAgentEmoji)??Y.cronAgentEmoji,L={...Y.agent};if(Y.kind==="cron"||J==="cron"){if(q&&l0(Y.agent))L.name=q;if(O&&!L.emoji)L.emoji=O}if(!(Y.kind!==J||Y.cronJobId!==V||Y.cronName!==q||Y.cronAgentId!==K||Y.cronAgentName!==B||Y.cronAgentEmoji!==O||Y.agent.id!==L.id||Y.agent.name!==L.name||Y.agent.emoji!==L.emoji))return;Y.kind=J,Y.cronJobId=V,Y.cronName=q,Y.cronAgentId=K,Y.cronAgentName=B,Y.cronAgentEmoji=O,Y.agent=L,BZ(Y,X),HZ(Y,X),h("conversations")}function X4(Z){if(Z.from!=="user")return;let $=R(Z.conversationId),Q=I(Z.timestamp,M()),X=a($,Q);fZ(X,{id:Z.id,conversationId:$,role:"user",content:Z.body,timestamp:Q,isStreaming:!1},"replace"),h("conversations")}function Y4(Z){switch(Z.type){case"conversation_list":{for(let $ of Z.conversations){let Q=R($.id),X=I($.lastActivity,M()),Y=a(Q,$.createdAt);Y.createdAt=Math.min(Y.createdAt,I($.createdAt,Y.createdAt)),Y.updatedAt=Math.max(Y.updatedAt,X);let H=$.name.trim();if(H.length>0)Y.agent={id:Y.agent.id,name:H,emoji:Y.agent.emoji};HZ(Y,X)}h("conversations");return}case"message":{let $=R(Z.conversationId),Q=I(Z.timestamp,M()),X=a($,Q);if(fZ(X,{id:Z.id,conversationId:$,role:Z.from==="user"?"user":"bot",content:Z.body,timestamp:Q,isStreaming:!1},"replace"),Z.from==="bot")XZ(X,{isComposing:!1,activeTool:void 0},Q);h("conversations");return}case"stream_start":{let $=R(Z.conversationId),Q=M(),X=a($,Q),Y=X.agent.id.startsWith("conversation:")?void 0:X.agent.id;XZ(X,{isAgentActive:!0,isComposing:!0,activeAgentId:Y},Q);let H=X.messages.get(Z.messageId);if(H)H.isStreaming=!0,H.timestamp=Q,H.role="bot",H.revision=HZ(X,Q,{messageChanged:!0}),BZ(X,Q);else fZ(X,{id:Z.messageId,conversationId:$,role:"bot",content:"",timestamp:Q,isStreaming:!0},"replace");h("conversations");return}case"stream_token":{let $=R(Z.conversationId),Q=M(),X=a($,Q),Y=X.agent.id.startsWith("conversation:")?void 0:X.agent.id;XZ(X,{isAgentActive:!0,isComposing:!0,activeAgentId:Y},Q),fZ(X,{id:Z.messageId,conversationId:$,role:"bot",content:Z.token,timestamp:Q,isStreaming:!0},"append"),h("conversations");return}case"stream_end":{let $=R(Z.conversationId),Q=M(),X=a($,Q);XZ(X,{isAgentActive:!1,isComposing:!1,activeTool:void 0},Q);let Y=X.messages.get(Z.messageId);if(Y){if(Z.body.trim().length>0)Y.content=Z.body;Y.isStreaming=!1,Y.timestamp=Q,Y.revision=HZ(X,Q,{messageChanged:!0}),BZ(X,Q)}else fZ(X,{id:Z.messageId,conversationId:$,role:"bot",content:Z.body,timestamp:Q,isStreaming:!1},"replace");h("conversations");return}case"composing":{if(Z.from!=="bot")return;let $=R(Z.conversationId),Q=M(),X=a($,Q),Y=X.agent.id.startsWith("conversation:")?void 0:X.agent.id;XZ(X,{isAgentActive:!0,isComposing:!0,activeAgentId:Y},Q),h("conversations");return}case"tool_status":{let $=R(Z.conversationId),Q=M(),X=a($,Q);if(Z.status==="running"){let Y=X.agent.id.startsWith("conversation:")?void 0:X.agent.id;XZ(X,{isAgentActive:!0,isComposing:!1,activeAgentId:Y,activeTool:Z.tool},Q)}else XZ(X,{isAgentActive:X6(X),isComposing:!1,activeTool:void 0},Q);h("conversations");return}case"agent_list":{let $=!1,Q=new Set;jZ.clear();for(let Y of Z.agents){Q.add(Y.agentId),jZ.set(Y.agentId,e3(Y));let H=I(Y.lastActivityAt,M()),V=r3(Y.activeConversationId);if(Y.status==="working"&&V){$=eZ(Y.agentId,H,V)||$;let J=a(V,H);J.agent={id:Y.agentId||J.agent.id,name:Y.name||J.agent.name,emoji:Y.emoji??J.agent.emoji},$=XZ(J,{isAgentActive:!0,isComposing:J.activity.isComposing,activeAgentId:Y.agentId,activeTool:Y.activeTool},H)||$}else $=eZ(Y.agentId,H)||$}let X=M();for(let Y of Array.from(YZ.keys())){if(Q.has(Y))continue;$=eZ(Y,X)||$}if(WZ(M()),h("agents"),$)h("conversations");return}case"agent_status":{let $=M(),Q=jZ.get(Z.agentId)??{id:Z.agentId,name:Z.agentId,queue:0,lastUpdated:$,usage:{mode:"tokens",value:0},isRunning:Z.status==="working"},X={...Q,color:Z.color??Q.color,details:Z.details?i0(Z.details):Q.details,queue:Z.status==="working"?1:0,lastUpdated:I(Z.lastActivityAt,$),usage:{mode:"tokens",value:typeof Z.sessionTokensIn==="number"||typeof Z.sessionTokensOut==="number"?Math.max(0,(Z.sessionTokensIn??0)+(Z.sessionTokensOut??0)):Q.usage.value},isRunning:Z.status==="working",currentTask:Z.activeTool};jZ.set(Z.agentId,X);let Y=!1,H=Z.status==="working"?r3(Z.activeConversationId):void 0;if(H){Y=eZ(Z.agentId,X.lastUpdated,H)||Y;let V=a(H,X.lastUpdated);V.agent={id:Z.agentId||V.agent.id,name:X.name||V.agent.name,emoji:X.emoji??V.agent.emoji},Y=XZ(V,{isAgentActive:!0,isComposing:V.activity.isComposing,activeAgentId:Z.agentId,activeTool:Z.activeTool},X.lastUpdated)||Y}else Y=eZ(Z.agentId,X.lastUpdated)||Y;if(WZ(X.lastUpdated),h("agents"),Y)h("conversations");return}case"cron_list":{_Z.clear();let $=M();for(let Q of Z.jobs)_Z.set(Q.id,Z4(Q,$));WZ($),h("cronJobs");return}case"cron_run_started":{let $=M(),Q=_Z.get(Z.jobId)??{id:Z.jobId,name:Z.jobId,enabled:!0,isRunning:!1,lastUpdated:$};_Z.set(Z.jobId,{...Q,isRunning:!0,lastUpdated:$}),WZ($),h("cronJobs");return}case"cron_run_finished":{let $=M(),Q=_Z.get(Z.jobId)??{id:Z.jobId,name:Z.jobId,enabled:!0,isRunning:!1,lastUpdated:$};_Z.set(Z.jobId,{...Q,isRunning:!1,lastRunAt:$,lastRunStatus:Z.status,lastRunSummary:Z.summary,lastUpdated:$}),WZ($),h("cronJobs");return}default:return}}function o3(Z){return Z.startsWith("t:")}function H4(Z){let $=R(Z.conversationId),{role:Q,content:X,timestamp:Y,stableId:H}=Z,V=I(Y,M()),J=a($,V),q=o3(H),K=!1;if(Z.agent){let L=l0(J.agent),D=l0(Z.agent),U=typeof Z.agent.id==="string"&&Z.agent.id.trim().length>0&&Z.agent.id===J.agent.id;if(L||U||!D&&!J.agent.emoji&&!!Z.agent.emoji){let z={id:Z.agent.id||J.agent.id,name:Z.agent.name||J.agent.name,emoji:Z.agent.emoji??J.agent.emoji};if(K=z.id!==J.agent.id||z.name!==J.agent.name||z.emoji!==J.agent.emoji,K)J.agent=z,BZ(J,V),HZ(J,V)}}if(J.messages.has(H)){if(K)h("conversations");return!1}let B=J.messageOrder,O=Math.max(0,B.length-J6);for(let L=B.length-1;L>=O;L--){let D=J.messages.get(B[L]);if(!D)continue;if(D.role!==Q)continue;let U=D.content===X||X.startsWith(D.content)||D.content.startsWith(X);if(Q==="bot"&&q&&!o3(D.id)&&V<=D.timestamp&&U){if(!D.isStreaming&&X.length>D.content.length)D.content=X,D.timestamp=Math.max(D.timestamp,V),D.revision=HZ(J,D.timestamp,{messageChanged:!0}),BZ(J,D.timestamp),h("conversations");else if(K)h("conversations");return!1}if(Math.abs(D.timestamp-V)>V6)continue;if(U){if(!D.isStreaming&&X.length>D.content.length)D.content=X,D.timestamp=V,D.revision=HZ(J,V,{messageChanged:!0}),BZ(J,V),h("conversations");else if(K)h("conversations");return!1}}return fZ(J,{id:H,conversationId:$,role:Q,content:X,timestamp:V,isStreaming:!1},"replace"),h("conversations"),!0}function o0(Z){let $=R(Z),Q=r.get($);if(!Q)return null;return D0(Q)}function q6(Z){let $=new Map;if(!Array.isArray(Z))return $;for(let Q of Z){if(!Q||typeof Q.id!=="string"||Q.id.length===0)continue;let X=R(Q.id),Y=typeof Q.conversationRevision==="number"&&Number.isFinite(Q.conversationRevision)?Math.max(0,Math.floor(Q.conversationRevision)):0,H=typeof Q.lastMessageRevision==="number"&&Number.isFinite(Q.lastMessageRevision)?Math.max(0,Math.floor(Q.lastMessageRevision)):0,V=typeof Q.lastMessageTs==="number"&&Number.isFinite(Q.lastMessageTs)?Math.max(0,Math.floor(Q.lastMessageTs)):0;$.set(X,{conversationRevision:Y,lastMessageRevision:H,lastMessageTs:V})}return $}function n0(Z){let $=I(Z.stateBornAt,0),Q=typeof Z.globalRevision==="number"&&Number.isFinite(Z.globalRevision)?Math.max(0,Math.floor(Z.globalRevision)):0,X=q6(Z.conversations);if(Q>0||$>0||X.size>0){if($>0&&$!==GZ)return{mode:"snapshot",state:s3(Z)};if(Q>=EZ)return{mode:"delta",state:{timestamp:OZ,stateBornAt:GZ,globalRevision:EZ,conversations:[],agents:Z0(Z.fallbackAgents),cronJobs:$0(Z.fallbackCronJobs)}};let K=[...r.values()].filter((B)=>!c0(B)).sort((B,O)=>O.updatedAt-B.updatedAt).map((B)=>{let O=X.get(B.id),L=O?.conversationRevision??0,D=O?.lastMessageRevision??0,U=O?.lastMessageTs??0;if(L>0||D>0){if(B.revision<=L&&B.lastMessageRevision<=D&&B.updatedAt<=U)return null}else if(U>0&&B.updatedAt<=U)return null;return D0(B,{lastMessageRevision:D,sinceTimestampMs:U>0?U:void 0})}).filter((B)=>B!==null);return{mode:"delta",state:{timestamp:OZ,stateBornAt:GZ,globalRevision:EZ,conversations:K,agents:Z0(Z.fallbackAgents),cronJobs:$0(Z.fallbackCronJobs)}}}let H=I(Z.sinceTimestampMs,0);if(!H||H<GZ)return{mode:"snapshot",state:s3(Z)};if(H>=OZ)return{mode:"delta",state:{timestamp:OZ,stateBornAt:GZ,globalRevision:EZ,conversations:[],agents:Z0(Z.fallbackAgents),cronJobs:$0(Z.fallbackCronJobs)}};let V=[...r.values()].filter((K)=>!c0(K)).filter((K)=>K.updatedAt>H).sort((K,B)=>B.updatedAt-K.updatedAt).map((K)=>{let O=X.get(K.id)?.lastMessageRevision??0;return D0(K,{sinceTimestampMs:H,lastMessageRevision:O})}),J=Z0(Z.fallbackAgents),q=$0(Z.fallbackCronJobs);return{mode:"delta",state:{timestamp:OZ,stateBornAt:GZ,globalRevision:EZ,conversations:V,agents:J,cronJobs:q}}}var n3="Assistant",s5=1500,r,jZ,_Z,YZ,GZ,OZ,EZ=0,o5,V6=2000,J6=20;var Q0=KZ(()=>{K0();r=new Map,jZ=new Map,_Z=new Map,YZ=new Map,GZ=Date.now(),OZ=Date.now(),o5=new Set});import ZZ from"node:fs";import q4 from"node:os";import IZ from"node:path";function s(Z){if(typeof Z!=="string")return null;let $=Z.trim();return $.length>0?$:null}function P6(Z){if(typeof Z==="number"&&Number.isFinite(Z))return Math.max(0,Math.floor(Z));if(typeof Z==="string"){let $=Number(Z);if(Number.isFinite($))return Math.max(0,Math.floor($))}return 0}function _0(Z){let $=Z.trim().toLowerCase();return $==="botmobile:bot:default"||$.startsWith("botmobile:bot:")}function B4(Z){if(!Z)return!0;let $=Z.trim().toLowerCase();if(!$)return!0;return $==="conversation"||$.startsWith("conversation:")}function R6(Z){let $=Array.isArray(Z.bindings)?Z.bindings:[];for(let H of $){if(!H||typeof H!=="object")continue;let V=s(H.agentId);if(!V)continue;let J=H.match,q=s(J?.channel)?.toLowerCase(),K=s(J?.accountId)?.toLowerCase();if(q!=="botmobile")continue;if(K&&K!=="default")continue;return V}let Q=Array.isArray(Z.agents?.list)?Z.agents.list:[],X=Q.find((H)=>H?.default===!0);return s(X?.id)??s(Q[0]?.id)??"assistant"}function M6(Z){let $=Z.match(L6);if(!$)return null;let Q=R($[2]);if(_0(Q))return null;return{agentId:$[1],conversationId:Q}}function e0(Z){return Z.trim().toLowerCase()}function w6(Z){return`cron:${e0(Z)}`}function L4(Z){if(!Z.toLowerCase().startsWith("cron:"))return null;let $=Z.slice(5).trim();return $.length>0?e0($):null}function S6(Z){let $=Z.match(D6);if(!$)return null;let Q=$[1].trim(),X=e0($[2]);if(!Q||!X)return null;return{agentId:Q,jobId:X}}function j6(Z){let $=s(Z);if(!$)return null;let Q=$.replace(/^cron:\s*/i,"").trim();return Q.length>0?Q:null}function C6(Z,$){let Q=s(Z.sessionFile);if(Q)return Q;let X=s(Z.sessionId);if(!X)return null;let Y=IZ.join(q4.homedir(),".openclaw","agents",$,"sessions",`${X}.jsonl`);try{if(ZZ.existsSync(Y))return Y}catch{}return null}function D4(Z){return`Task ${Z.slice(0,8).toUpperCase()}`}function a0(Z,$,Q){if(Q?.resolveAgentDisplay)return Q.resolveAgentDisplay({cfg:Z,agentId:$});let X=bZ(Z,$);return{name:X.name,emoji:X.emoji}}function U4(Z,$){if(!Z||!$?.resolveCronSnapshot)return null;return $.resolveCronSnapshot(Z)??null}function k6(Z){if(O4.test(Z))return null;let $=Z.match(U6);if(!$)return null;let Q=$[1].trim();if(!Q)return null;if(B4(Q))return null;return Q}function A6(Z){let $=Z.match(O4);if(!$)return null;let Q=R($[1]);if(_0(Q))return null;return Q}function x6(Z){if(!Z||typeof Z!=="object")return null;let $=s(Z.provider)?.toLowerCase(),Q=s(Z.surface)?.toLowerCase(),X=s(Z.chatType)?.toLowerCase(),Y=s(Z.label),H=s(Z.from);if(!($==="botmobile"||Q==="botmobile"||H!==null&&J4.test(H)))return null;if(X&&X!=="direct")return null;if(Y){let J=R(Y);if(!_0(J))return J}if(H){let J=H.match(J4);if(J&&J[1].trim().length>0){let q=R(J[1]);if(!_0(q))return q}}return null}function h6(Z,$,Q){let X=P6($.updatedAt),Y=S6(Z);if(Y){let O=C6($,Y.agentId);if(!O)return null;return{conversationId:w6(Y.jobId),agentId:Y.agentId,sessionFile:O,updatedAt:X,kind:"cron",cronJobId:Y.jobId,cronLabel:j6($.label)??void 0}}let H=s($.sessionFile);if(!H)return null;let V=M6(Z);if(V)return{conversationId:V.conversationId,agentId:V.agentId,sessionFile:H,updatedAt:X};let J=x6($.origin);if(!J)return null;let K=A6(Z)??J,B=k6(Z)??Q;return{conversationId:K,agentId:B,sessionFile:H,updatedAt:X}}function Z3(Z){let $=R6(Z),Q=IZ.join(q4.homedir(),".openclaw"),X=IZ.join(Q,"agents"),Y;try{Y=ZZ.readdirSync(X,{withFileTypes:!0}).filter((V)=>V.isDirectory()).map((V)=>V.name)}catch{return[]}let H=[];for(let V of Y){let J=IZ.join(X,V,"sessions","sessions.json"),q;try{q=JSON.parse(ZZ.readFileSync(J,"utf8"))}catch{continue}for(let[K,B]of Object.entries(q)){let O=h6(K,B,$);if(!O)continue;H.push(O)}}return H.sort((V,J)=>J.updatedAt-V.updatedAt),H}function T6(Z,$,Q){let X=[],Y=0;if(Q){let H=Z.indexOf(10);if(H===-1)return[];Y=H+1}for(let H=Y;H<Z.length;H++){if(Z[H]!==10)continue;let V=Z.subarray(Y,H),J=$+Y;if(Y=H+1,V.length===0)continue;let q=V.toString("utf8").trim();if(!q)continue;X.push({line:q,offset:J})}if(Y<Z.length){let V=Z.subarray(Y).toString("utf8").trim();if(V)X.push({line:V,offset:$+Y})}return X}function F4(Z){if(!Array.isArray(Z))return"";let $=[];for(let Q of Z)if(Q&&typeof Q==="object"&&Q.type==="text"&&typeof Q.text==="string")$.push(Q.text);return $.join(`
3
+ `)}function _4(Z){try{return JSON.parse(Z)}catch{return null}}function G4(Z,$){if(typeof Z==="number"&&Number.isFinite(Z)&&Z>0)return Math.floor(Z);if(typeof Z==="string"&&Z.trim().length>0){let Q=Number(Z);if(Number.isFinite(Q)&&Q>0)return Math.floor(Q);let X=Date.parse(Z);if(Number.isFinite(X)&&X>0)return Math.floor(X)}if(typeof $==="number"&&Number.isFinite($)&&$>0)return Math.floor($);if(typeof $==="string"&&$.trim().length>0){let Q=Number($);if(Number.isFinite(Q)&&Q>0)return Math.floor(Q);let X=Date.parse($);if(Number.isFinite(X)&&X>0)return Math.floor(X)}return 0}function W4(Z){if(!N6.test(Z))return!1;let $=Z.match(E6);if(!$)return!1;let Q=$[1];return Q==="user"||Q==="assistant"}function b6(Z){let $=Z.trim();if(!G6.test($))return $;let Q=Array.from($.matchAll(_6));if(Q.length===0)return $;let X=Q[Q.length-1],Y=typeof X.index==="number"?X.index:0;return $.slice(Y).trim()}function z4(Z){let $=Z.match(z6),Q=$?$[1].trim():void 0,X=Z.replace(W6,"").trim();return{clean:b6(X).replace(F6,"").trim(),messageId:Q}}function f6(Z){let{sessionFile:$,limit:Q}=Z,X=R(Z.conversationId),Y=IZ.basename($),H=null;try{H=ZZ.openSync($,"r");let V=ZZ.fstatSync(H).size;if(V<=0)return[];let J=Math.min(K4,V);while(!0){let q=Math.max(0,V-J),K=V-q,B=Buffer.allocUnsafe(K);ZZ.readSync(H,B,0,K,q);let O=T6(B,q,q>0),L=[];for(let U=O.length-1;U>=0&&L.length<Q;U--){let z=O[U];if(!W4(z.line))continue;let N=_4(z.line);if(!N||N.type!=="message"||!N.message)continue;let G=N.message;if(G.role!=="user"&&G.role!=="assistant")continue;let T=F4(G.content);if(!T.trim())continue;let A=G.role==="user"?"user":"bot",p=G4(G.timestamp,N.timestamp),b,S;if(A==="user"){let{clean:c,messageId:j}=z4(T);b=c,S=j?`u:${j}`:`t:${Y}:${z.offset}`}else b=T,S=`t:${Y}:${z.offset}`;if(!b.trim())continue;L.push({id:S,conversationId:X,role:A,content:b,timestamp:p,isStreaming:!1})}let D=L.reverse();if(D.length>=Q||q===0)return D;if(J>=V4)return D;J=Math.min(V,J*2,V4)}}catch{return[]}finally{if(H!==null)try{ZZ.closeSync(H)}catch{}}}function N4(Z,$,Q,X,Y){let H=IZ.basename(Z),V=R($.conversationId),J,q;try{J=ZZ.openSync(Z,"r"),q=ZZ.fstatSync(J).size}catch{return{messages:[],cursor:X}}try{if(q<X.offset)X={offset:Math.max(0,q-K4)};if(q<=X.offset)return{messages:[],cursor:X};let K=X.offset,B=q-K,O=Buffer.alloc(B);ZZ.readSync(J,O,0,B,K);let L=0;if(K>0){let j=Buffer.alloc(1);try{if(ZZ.readSync(J,j,0,1,K-1),j[0]!==10){let E=O.indexOf(10);if(E===-1)return{messages:[],cursor:{offset:K}};L=E+1}}catch{}}let D=O.subarray(L),U=K+L,z=D.toString("utf8");if(!z)return{messages:[],cursor:{offset:q}};let N=z.endsWith(`
4
+ `),G=z.split(`
5
+ `);if(N)G.pop();else G.pop();let T=$.cronJobId??L4(V),A=U4(T,Y),p=$.kind==="cron"?{id:$.cronAgentId??$.agentId,name:$.cronLabel??A?.name??(T?D4(T):"Scheduled Task"),emoji:$.cronAgentEmoji??A?.agentEmoji??"\uD83D\uDD52"}:(()=>{let j=a0(Q,$.agentId,Y);return{id:$.agentId,name:j.name??$.agentId,emoji:j.emoji}})(),b=[],S=U;for(let j of G){let E=Buffer.byteLength(j,"utf8")+1;if(j.trim()){if(!W4(j)){S+=E;continue}let v=_4(j);if(v&&v.type==="message"&&v.message){let W=v.message;if(W.role==="user"||W.role==="assistant"){let m=F4(W.content);if(m.trim()){let x=W.role==="user"?"user":"bot",l=G4(W.timestamp,v.timestamp),n,QZ;if(x==="user"){let{clean:d,messageId:hZ}=z4(m);n=d,QZ=hZ?`u:${hZ}`:`t:${H}:${S}`}else n=m,QZ=`t:${H}:${S}`;if(n.trim())b.push({conversationId:V,agentId:$.agentId,agent:p,role:x,content:n,timestamp:l,stableId:QZ})}}}}S+=E}return{messages:b,cursor:{offset:N?q:S}}}finally{try{ZZ.closeSync(J)}catch{}}}function E4(Z,$){let Q=Z3(Z),X=new Map;for(let V of Q){let J=X.get(V.conversationId)??[];J.push(V),X.set(V.conversationId,J)}let Y=[...X.entries()].map(([V,J])=>{let q=[...J].sort((O,L)=>L.updatedAt-O.updatedAt),K=[],B=new Set;for(let O of q){if(B.has(O.sessionFile))continue;B.add(O.sessionFile),K.push(O)}return{conversationId:V,mappings:K,updatedAt:K[0]?.updatedAt??0}}).sort((V,J)=>J.updatedAt-V.updatedAt),H=[];for(let V=0;V<Y.length;V++){let J=Y[V],q=V<O6,K=J.mappings.slice(0,B6),B=new Map;if(q)for(let W of K){let m=f6({sessionFile:W.sessionFile,conversationId:J.conversationId,limit:t0});for(let x of m){let l=B.get(x.id);if(!l||x.timestamp>=l.timestamp)B.set(x.id,x)}}let O=[...B.values()].sort((W,m)=>{if(W.timestamp===m.timestamp)return W.id.localeCompare(m.id);return W.timestamp-m.timestamp}),L=O.length>t0?O.slice(O.length-t0):O,D=L.map((W)=>W.timestamp).filter((W)=>W>0),U=J.mappings.map((W)=>W.updatedAt).filter((W)=>W>0),z=U.length>0?Math.min(...U):J.updatedAt,N=U.length>0?Math.max(...U):J.updatedAt,G=D.length>0?Math.min(...D):z,T=D.length>0?Math.max(N,...D):N,A=J.mappings.find((W)=>!B4(W.agentId))??J.mappings[0],p=A.cronJobId??L4(J.conversationId),b=U4(p,$),S=J.conversationId.toLowerCase().startsWith("cron:"),c=S?A.cronAgentId??b?.agentId??A.agentId:void 0,j=c?a0(Z,c,$):void 0,E=S?A.cronLabel??b?.name??(p?D4(p):"Scheduled Task"):void 0,v=S?{id:c??A.agentId,name:E??"Scheduled Task",emoji:A.cronAgentEmoji??b?.agentEmoji??"\uD83D\uDD52"}:(()=>{let W=a0(Z,A.agentId,$);return{id:A.agentId,name:W.name??A.agentId,emoji:W.emoji}})();H.push({id:J.conversationId,agent:v,createdAt:G,updatedAt:T,kind:S?"cron":void 0,cronJobId:S?p??void 0:void 0,cronName:S?E:void 0,cronAgentId:S?c:void 0,cronAgentName:S?b?.agentName??j?.name:void 0,cronAgentEmoji:S?A.cronAgentEmoji??b?.agentEmoji??j?.emoji:void 0,messages:L})}return console.log(`${K6} loaded ${H.length} conversations (${H.reduce((V,J)=>V+J.messages.length,0)} messages) [tail-read]`),H}var K6="[session-loader]",t0=100,O6=50,B6=3,K4=8388608,V4=134217728,L6,D6,U6,O4,J4,F6,_6,G6,W6,z6,N6,E6;var P4=KZ(()=>{q0();K0();L6=/^agent:([^:]+):botmobil[e]?:direct:(.+)$/i,D6=/^agent:([^:]+):cron:([^:]+)(?::run:([^:]+))?$/i,U6=/^agent:([^:]+):/i,O4=/^agent:conversation:([^:]+):main$/i,J4=/^botmobile:user:(.+)$/i,F6=/^\[(?:BotMobile|Botmobil[e]?) user:\S+ [^\]]+\]\s*/i,_6=/\[(?:BotMobile|Botmobil[e]?) user:\S+ [^\]]+\]\s*/gi,G6=/^\[Queued messages while agent was busy\]/i,W6=/\n\[message_id: [^\]]+\]\s*$/i,z6=/\[message_id:\s*([^\]]+)\]\s*$/i,N6=/"type"\s*:\s*"message"/,E6=/"role"\s*:\s*"([^"]+)"/});import{createRequire as I6}from"node:module";function X0(Z){return y6[Z]??`0x${Z.toString(16)}`}function v6(){let Z=u6.version;if(typeof Z==="string"){let $=Z.trim();if($.length>0)return $}return"dev"}function w4(Z){if($3)return Buffer.from($3(Z));return Buffer.from(JSON.stringify(Z),"utf8")}function S4(Z){let $;if(Q3)$=Q3(Z);else{let V=Buffer.from(Z).toString("utf8");$=JSON.parse(V)}if(!$||typeof $!=="object")throw Error("Invalid wire envelope payload");let Q=$,X=typeof Q.type==="bigint"?Number(Q.type):Q.type,Y=typeof Q.seq==="bigint"?Number(Q.seq):Q.seq,H=typeof Q.ts==="bigint"?Number(Q.ts):Q.ts;if(typeof X!=="number")throw Error("Invalid wire envelope type");if(typeof Y!=="number")throw Error("Invalid wire envelope seq");if(typeof H!=="number")throw Error("Invalid wire envelope ts");return{type:X,seq:Y,ts:H,payload:Q.payload}}function RZ(Z){if(typeof Z==="number"&&Number.isFinite(Z))return Z;if(typeof Z==="bigint")return Number(Z);return null}function yZ(Z){if(typeof Z!=="string")return null;let $=Z.trim();return $.length>0?$:null}function m6(Z){if(!Array.isArray(Z))return;let $=[];for(let Q of Z){if(!Q||typeof Q!=="object")continue;let X=Q,Y=yZ(X.id);if(!Y)continue;let H=RZ(X.conversationRevision),V=RZ(X.lastMessageRevision),J=RZ(X.lastMessageTs);$.push({id:Y,conversationRevision:H!==null?Math.max(0,Math.floor(H)):void 0,lastMessageRevision:V!==null?Math.max(0,Math.floor(V)):void 0,lastMessageTs:J!==null?Math.max(0,Math.floor(J)):void 0})}return $.length>0?$:void 0}function g6(Z){if(!Array.isArray(Z))return[];let $=[];for(let Q of Z){if(!Q||typeof Q!=="object")continue;let X=Q,Y=yZ(X.transferId),H=yZ(X.fileName);if(!Y||!H)continue;$.push({transferId:Y,fileName:H,mimeType:yZ(X.mimeType)??"application/octet-stream",size:typeof X.size==="number"?X.size:0})}return $}function j4(Z){if(Z.type===F.stateSyncRequest){let X=Z.payload??{},Y=RZ(X.stateBornAt),H=RZ(X.globalRevision),V=m6(X.conversations),J=[],q=RZ(X.lastAgentTs);if(q!==null&&q>0)J.push(q);let K=RZ(X.lastCronTs);if(K!==null&&K>0)J.push(K);if(V){for(let O of V)if(typeof O.lastMessageTs==="number"&&Number.isFinite(O.lastMessageTs)&&O.lastMessageTs>0)J.push(O.lastMessageTs)}return{kind:"legacy",envelope:{type:"state_sync_request",sinceTimestampMs:J.length>0?Math.min(...J):void 0,stateBornAt:Y!==null&&Y>0?Math.max(0,Math.floor(Y)):void 0,globalRevision:H!==null&&H>=0?Math.max(0,Math.floor(H)):void 0,conversations:V}}}if(Z.type!==F.command)return{kind:"ignore",reason:`unsupported_type_${Z.type}`};let $=Z.payload??{};if(typeof $.id!=="string"||$.id.length===0||typeof $.action!=="string")return{kind:"ignore",reason:"invalid_command_payload"};let Q=$.data??{};switch($.action){case"send_message":{let X=typeof Q.conversationId==="string"?Q.conversationId:"",Y=typeof Q.content==="string"?Q.content:"",H=typeof Q.agentId==="string"&&Q.agentId.length>0?Q.agentId:void 0,V=typeof Q.messageId==="string"&&Q.messageId.length>0?Q.messageId:typeof Q.clientMessageId==="string"&&Q.clientMessageId.length>0?Q.clientMessageId:void 0;if(!X||!Y&&!Array.isArray(Q.attachments))return{kind:"ignore",reason:"invalid_send_message"};let J=g6(Q.attachments);return{kind:"command",commandId:$.id,envelope:{type:"message",id:V??crypto.randomUUID(),conversationId:X,from:"user",body:Y,timestamp:Date.now(),agentId:H,pendingAttachments:J.length>0?J:void 0}}}case"stop_generation":{let X=typeof Q.conversationId==="string"?Q.conversationId:"";if(!X)return{kind:"ignore",reason:"invalid_stop_generation"};return{kind:"command",commandId:$.id,envelope:{type:"stop_generation",conversationId:X}}}case"cron_run":{let X=typeof Q.cronJobId==="string"?Q.cronJobId:"";if(!X)return{kind:"ignore",reason:"invalid_cron_run"};return{kind:"command",commandId:$.id,envelope:{type:"cron_run",jobId:X}}}case"cron_toggle":{let X=typeof Q.cronJobId==="string"?Q.cronJobId:"",Y=Q.enabled===!0;if(!X)return{kind:"ignore",reason:"invalid_cron_toggle"};return{kind:"command",commandId:$.id,envelope:{type:"cron_toggle",jobId:X,enabled:Y}}}case"cron_create_from_prompt":{let X=typeof Q.agentId==="string"?Q.agentId.trim():"",Y=typeof Q.description==="string"?Q.description.trim():"",H=typeof Q.name==="string"?Q.name.trim():"",V=RZ(Q.everyMs),J=V!==null&&V>=60000&&V<=2592000000?Math.floor(V):void 0;if(!X||!Y)return{kind:"ignore",reason:"invalid_cron_create_from_prompt"};return{kind:"command",commandId:$.id,envelope:{type:"cron_create_from_prompt",agentId:X,description:Y,name:H.length>0?H:void 0,everyMs:J}}}case"client_state":{let X=Q.isForeground===!0,Y=yZ(Q.activeTab),H=Y==="screen"||Y==="agents"||Y==="tasks"||Y==="settings"?Y:void 0,V=yZ(Q.activeConversationId)??void 0;return{kind:"command",commandId:$.id,envelope:{type:"client_state",isForeground:X,activeTab:H,activeConversationId:V,updatedAt:Date.now()}}}case"new_conversation":case"full_sync":return{kind:"command",commandId:$.id,envelope:{type:"state_sync_request",sinceTimestampMs:void 0}};default:return{kind:"ignore",reason:`unknown_action_${$.action}`}}}var F,y6,R4,u6,M4,$3=null,Q3=null;var C4=KZ(()=>{Q0();F={stateSyncRequest:1,snapshotAgents:2,snapshotCron:3,snapshotConversations:4,conversationDelta:5,streamBatch:6,streamEnd:7,command:16,commandAck:17,agentStatus:18,heartbeat:32,syncBegin:48,syncEnd:49,fileChunk:64,fileChunkAck:65,fileComplete:66,error:255},y6=Object.fromEntries(Object.entries(F).map(([Z,$])=>[$,Z]));R4=I6(import.meta.url),u6=(()=>{try{return R4("../package.json")}catch{return{}}})();M4=v6();try{let Z=R4("msgpackr"),$=new Z.Packr({useRecords:!1});$3=(Q)=>$.pack(Q),Q3=(Q)=>Z.unpack(Q)}catch{}});import k4 from"node:fs";import X3 from"node:path";import p6 from"node:os";class Y3{transfers=new Map;completed=new Map;sendWire;constructor(Z){this.sendWire=Z}handleChunk(Z){let $=this.parseChunkPayload(Z);if(!$)return;let Q=this.transfers.get($.transferId);if(!Q)Q=this.createTransfer($),this.transfers.set($.transferId,Q),console.log(`${Y0} new transfer ${$.transferId} file=${$.fileName} size=${$.totalSize} chunks=${$.totalChunks}`);Q.lastActivityAt=Date.now(),this.resetTimer($.transferId,Q);let X=Buffer.isBuffer($.data)?$.data:Buffer.from($.data);if(Q.receivedChunks.set($.chunkIndex,X),this.sendWire(c6,{transferId:$.transferId,chunkIndex:$.chunkIndex}),Q.receivedChunks.size>=Q.totalChunks)this.finalizeTransfer($.transferId,Q)}getFilePath(Z){return this.completed.get(Z)?.filePath}getCompletedTransfer(Z){return this.completed.get(Z)}dispose(){for(let[,Z]of this.transfers)clearTimeout(Z.timer);this.transfers.clear()}parseChunkPayload(Z){if(!Z||typeof Z!=="object")return null;let $=Z,Q=typeof $.transferId==="string"?$.transferId.trim():"",X=typeof $.fileName==="string"?$.fileName.trim():"",Y=typeof $.mimeType==="string"?$.mimeType.trim():"application/octet-stream",H=typeof $.totalSize==="number"?$.totalSize:0,V=typeof $.chunkIndex==="number"?$.chunkIndex:typeof $.chunkIndex==="bigint"?Number($.chunkIndex):-1,J=typeof $.totalChunks==="number"?$.totalChunks:typeof $.totalChunks==="bigint"?Number($.totalChunks):0,q=$.data;if(!Q||!X||J<=0||V<0)return null;if(!Buffer.isBuffer(q)&&!(q instanceof Uint8Array))return null;return{transferId:Q,fileName:X,mimeType:Y,totalSize:H,chunkIndex:V,totalChunks:J,data:q}}createTransfer(Z){let $=setTimeout(()=>{this.timeoutTransfer(Z.transferId)},A4);return{fileName:Z.fileName,mimeType:Z.mimeType,totalSize:Z.totalSize,totalChunks:Z.totalChunks,receivedChunks:new Map,lastActivityAt:Date.now(),timer:$}}resetTimer(Z,$){clearTimeout($.timer),$.timer=setTimeout(()=>{this.timeoutTransfer(Z)},A4)}timeoutTransfer(Z){let $=this.transfers.get(Z);if(!$)return;console.warn(`${Y0} transfer ${Z} timed out (received ${$.receivedChunks.size}/${$.totalChunks} chunks)`),clearTimeout($.timer),this.transfers.delete(Z),this.sendWire(G0,{transferId:Z,success:!1,error:"Transfer timed out"})}finalizeTransfer(Z,$){clearTimeout($.timer),this.transfers.delete(Z);let Q=[];for(let V=0;V<$.totalChunks;V++){let J=$.receivedChunks.get(V);if(!J){console.error(`${Y0} transfer ${Z} missing chunk ${V}`),this.sendWire(G0,{transferId:Z,success:!1,error:`Missing chunk ${V}`});return}Q.push(J)}let X=Buffer.concat(Q),Y=X3.basename($.fileName).replace(/[^\w.\-]/g,"_")||"file",H=X3.join(x4,`${Z}-${Y}`);try{k4.mkdirSync(x4,{recursive:!0}),k4.writeFileSync(H,X)}catch(V){console.error(`${Y0} transfer ${Z} write failed: ${String(V)}`),this.sendWire(G0,{transferId:Z,success:!1,error:`Write failed: ${String(V)}`});return}this.completed.set(Z,{fileName:$.fileName,mimeType:$.mimeType,filePath:H,size:X.length}),console.log(`${Y0} transfer ${Z} complete: ${H} (${X.length} bytes)`),this.sendWire(G0,{transferId:Z,success:!0})}}var Y0="[botmobile:file-receiver]",A4=60000,x4,c6=65,G0=66;var h4=KZ(()=>{x4=X3.join(p6.homedir(),".openclaw","uploads")});import uZ from"ws";function X7(Z){return new Promise(($)=>setTimeout($,Z))}async function Y7(){if(!W0)W0=import("node-datachannel");let Z;try{Z=await W0}catch($){W0=null;let Q=String($??"");if(Q.includes("node_datachannel.node")||Q.includes("Cannot find module '../../../build/Release/node_datachannel.node'"))throw Error("node-datachannel native binary is missing. Reinstall the plugin with npm scripts enabled (NPM_CONFIG_IGNORE_SCRIPTS=false).");throw $}if(!I4){I4=!0;try{Z.initLogger?.("Error")}catch{}}return Z}function w(Z){if(typeof Z!=="string")return null;let $=Z.trim();return $.length>0?$:null}function H7(Z){if(typeof Z==="string"){let X=Z.trim();if(!X)return null;return{candidate:X}}if(!Z||typeof Z!=="object")return null;let $=Z,Q=w($.candidate);if(!Q)return null;return{candidate:Q,sdpMid:w($.sdpMid)??void 0}}function V7(Z){if(!Z||typeof Z!=="object")return["stun:stun.cloudflare.com:3478"];let Q=Z,X=Array.isArray(Q.urls)?Q.urls.filter((J)=>typeof J==="string"&&J.trim().length>0):typeof Q.urls==="string"?Q.urls.split(",").map((J)=>J.trim()).filter((J)=>J.length>0):[],Y=w(Q.username),H=w(Q.credential);if(X.length===0||!Y||!H)return["stun:stun.cloudflare.com:3478"];let V=["stun:stun.cloudflare.com:3478"];for(let J of X){let q=J7(J);if(!q)continue;V.push({hostname:q.hostname,port:q.port,username:Y,password:H,relayType:q.relayType})}return V}function J7(Z){let $=Z.match(/^(turns?):([^:?]+):(\d+)/);if(!$)return null;let Q=$[1],X=$[2],Y=parseInt($[3],10),V=Z.match(/[?&]transport=(udp|tcp)/i)?.[1]?.toLowerCase()??"udp",J;if(Q==="turns")J="TurnTls";else if(V==="tcp")J="TurnTcp";else J="TurnUdp";return{hostname:X,port:Y,relayType:J}}function q7(Z){return{id:Z.id,conversationId:Z.conversationId,role:Z.from==="user"?"user":"bot",content:Z.body,timestamp:Z.timestamp,isStreaming:!1}}function K7(Z){if(!Z)return;return{...Z,skills:Z.skills?[...Z.skills]:void 0,skillDetails:Z.skillDetails?Z.skillDetails.map(($)=>({...$})):void 0,toolsAllow:Z.toolsAllow?[...Z.toolsAllow]:void 0,toolsDeny:Z.toolsDeny?[...Z.toolsDeny]:void 0}}function O7(Z){let $=Z.status==="working";return{id:Z.agentId,name:Z.name,emoji:Z.emoji,color:Z.color,details:K7(Z.details),queue:$?1:0,lastUpdated:Z.lastActivityAt??Date.now(),usage:{mode:"tokens",value:Math.max(0,(Z.sessionTokensIn??0)+(Z.sessionTokensOut??0))},isRunning:$,currentTask:Z.activeTool}}function B7(Z){return{id:Z.id,name:Z.name,enabled:Z.enabled,isRunning:Z.isRunning===!0,lastUpdated:Date.now(),agentId:Z.agentId,agentName:Z.agentName,agentEmoji:Z.agentEmoji,nextRunAt:Z.nextRunAt,lastRunAt:Z.lastRunAt,lastRunStatus:Z.lastRunStatus,lastRunSummary:Z.lastRunSummary}}function L7(Z){switch(Z.type){case"message":return[{type:F.conversationDelta,payload:{id:Z.conversationId,updatedAt:Z.timestamp,messages:[q7(Z)]}}];case"conversation_list":{let $=Date.now();return[{type:F.snapshotConversations,payload:{timestamp:$,conversations:Z.conversations.map((Q)=>{let X=o0(Q.id);return{id:Q.id,name:Q.name,agent:X?.agent,createdAt:Q.createdAt??X?.createdAt??$,updatedAt:Q.lastActivity??X?.updatedAt??$,revision:X?.revision,lastMessageRevision:X?.lastMessageRevision,activity:X?.activity}})}}]}case"agent_list":return[{type:F.snapshotAgents,payload:{timestamp:Date.now(),agents:Z.agents.map(O7)}}];case"agent_status":return[{type:F.agentStatus,payload:{id:Z.agentId,activeConversationId:Z.activeConversationId,isRunning:Z.status==="working",queue:Z.status==="working"?1:0,color:Z.color,details:Z.details,currentTask:Z.activeTool,lastUpdated:Z.lastActivityAt??Date.now(),usage:{mode:"tokens",value:Math.max(0,(Z.sessionTokensIn??0)+(Z.sessionTokensOut??0))},errorMessage:Z.errorMessage}}];case"cron_list":return[{type:F.snapshotCron,payload:{timestamp:Date.now(),cronJobs:Z.jobs.map(B7)}}];case"state_snapshot":case"state_delta":{let $=[],Q=crypto.randomUUID().slice(0,8),X=Z.state.conversations.length;$.push({type:F.syncBegin,payload:{syncId:Q,totalConversations:X,pluginVersion:M4,stateBornAt:Z.state.stateBornAt,globalRevision:Z.state.globalRevision}}),$.push({type:F.snapshotAgents,payload:{timestamp:Z.state.timestamp,stateBornAt:Z.state.stateBornAt,globalRevision:Z.state.globalRevision,agents:Z.state.agents}}),$.push({type:F.snapshotCron,payload:{timestamp:Z.state.timestamp,stateBornAt:Z.state.stateBornAt,globalRevision:Z.state.globalRevision,cronJobs:Z.state.cronJobs}}),$.push({type:F.snapshotConversations,payload:{timestamp:Z.state.timestamp,stateBornAt:Z.state.stateBornAt,globalRevision:Z.state.globalRevision,conversations:Z.state.conversations.map((Y)=>({id:Y.id,kind:Y.kind,cronJobId:Y.cronJobId,cronName:Y.cronName,cronAgentId:Y.cronAgentId,cronAgentName:Y.cronAgentName,cronAgentEmoji:Y.cronAgentEmoji,agent:Y.agent,createdAt:Y.createdAt,updatedAt:Y.updatedAt,revision:Y.revision,lastMessageRevision:Y.lastMessageRevision,activity:Y.activity}))}});for(let Y of Z.state.conversations)$.push({type:F.conversationDelta,payload:{id:Y.id,kind:Y.kind,cronJobId:Y.cronJobId,cronName:Y.cronName,cronAgentId:Y.cronAgentId,cronAgentName:Y.cronAgentName,cronAgentEmoji:Y.cronAgentEmoji,agent:Y.agent,createdAt:Y.createdAt,updatedAt:Y.updatedAt,revision:Y.revision,lastMessageRevision:Y.lastMessageRevision,activity:Y.activity,messages:Y.messages}});return $.push({type:F.syncEnd,payload:{syncId:Q,sentConversations:X,stateBornAt:Z.state.stateBornAt,globalRevision:Z.state.globalRevision}}),$}case"gateway_heartbeat":return[{type:F.heartbeat,payload:{kind:"gateway",timestamp:Z.timestamp,uptimeMs:Z.uptimeMs}}];case"error":return[{type:F.error,payload:{code:Z.code,message:Z.message,conversationId:Z.conversationId}}];case"ping":case"pong":default:return[]}}function y4(Z,$){if(Z===F.heartbeat)return"";if(!$||typeof $!=="object")return String($??"");let Q=$;switch(Z){case F.conversationDelta:{let X=Array.isArray(Q.messages)?Q.messages.length:0;return`conv=${w(Q.id)??"?"} msgs=${X}`}case F.snapshotAgents:return`agents=${Array.isArray(Q.agents)?Q.agents.length:0}`;case F.snapshotCron:return`jobs=${Array.isArray(Q.cronJobs)?Q.cronJobs.length:0}`;case F.snapshotConversations:return`conversations=${Array.isArray(Q.conversations)?Q.conversations.length:0}`;case F.streamBatch:return`conv=${w(Q.conversationId)??"?"} msg=${w(Q.messageId)?.slice(0,8)??"?"} +${(w(Q.tokens)??"").length}ch`;case F.streamEnd:return`conv=${w(Q.conversationId)??"?"} msg=${w(Q.messageId)?.slice(0,8)??"?"} len=${(w(Q.finalContent)??"").length}`;case F.command:return`action=${w(Q.action)??"?"} id=${w(Q.id)??"?"}`;case F.commandAck:return`id=${w(Q.commandId)??"?"} ok=${Q.ok}`;case F.agentStatus:return`agent=${w(Q.id)??"?"} running=${Q.isRunning}`;case F.syncBegin:return`syncId=${w(Q.syncId)??"?"} total=${Q.totalConversations}`;case F.syncEnd:return`syncId=${w(Q.syncId)??"?"} sent=${Q.sentConversations}`;case F.error:return`code=${w(Q.code)??"?"} msg=${w(Q.message)??"?"}`;case F.stateSyncRequest:return`globalRevision=${Q.globalRevision??"nil"} stateBornAt=${Q.stateBornAt??"nil"}`;default:return JSON.stringify($).slice(0,120)}}class H3{account;onLegacyEnvelope;onSignalingStatus;onDataChannelStatus;signalingWs=null;peerConnection=null;dataChannel=null;currentSessionId=null;currentOfferRequestId=null;outboundSeq=1;outboundQueue=[];outboundQueueBytes=0;streamTextByMessageId=new Map;pendingStreamBatches=new Map;dataChannelDisconnectedAt=null;awaitingStateSyncRequest=!1;heartbeatInterval=null;lastHeartbeatReceivedAt=0;lastHeartbeatRttMs=null;lastPushSentAt=0;clientIsForeground=null;clientStateUpdatedAt=0;pendingPushTimer=null;pendingPushRequest=null;resyncRequired=!1;pendingRemoteCandidates=[];remoteDescriptionApplied=!1;pendingSignalQueue=[];signalingHeartbeatInterval=null;lastSignalingPongAt=0;stopped=!1;answerGatherTimer=null;_fileReceiver=null;lastSnapshotSignatureByType=new Map;lastSnapshotSentAtByType=new Map;constructor(Z){this.account=Z.account,this.onLegacyEnvelope=Z.onLegacyEnvelope,this.onSignalingStatus=Z.onSignalingStatus,this.onDataChannelStatus=Z.onDataChannelStatus}get fileReceiver(){return this._fileReceiver}async run(Z){let $=T4;while(!Z.aborted&&!this.stopped){try{await this.connectSignalingOnce(Z),$=T4}catch(Q){console.error(`${_} signaling loop error: ${String(Q)}`)}if(Z.aborted||this.stopped)break;await X7($),$=Math.min($*2,l6)}this.cleanup()}stop(){this.stopped=!0,this.cleanup()}sendLegacyEnvelope(Z){if(Z.type==="stream_start"){this.handleLegacyStreamStart(Z);return}if(Z.type==="stream_token"){this.handleLegacyStreamToken(Z);return}if(Z.type==="stream_end"){this.handleLegacyStreamEnd(Z);return}let $=L7(Z);for(let Q of $)this.sendWire(Q.type,Q.payload)}async connectSignalingOnce(Z){let $=`${this.account.workerUrl.replace(/^http/,"ws")}/ws/signal`;await new Promise((Q,X)=>{let Y=!1,H=null,V=new uZ($,{headers:{authorization:`BotMobileSecret ${this.account.sharedSecret}`}});this.signalingWs=V;let J=(q)=>{if(Y)return;if(Y=!0,H)Z.removeEventListener("abort",H),H=null;q()};H=()=>{this.stopSignalingHeartbeat();try{V.close()}catch{}J(()=>Q())},Z.addEventListener("abort",H,{once:!0}),V.on("open",()=>{this.onSignalingStatus?.(!0),this.startSignalingHeartbeat(),this.flushPendingSignalQueue()}),V.on("message",(q)=>{let K=q.toString(),B;try{B=JSON.parse(K)}catch{console.warn(`${_} invalid signaling message`);return}this.handleSignalingMessage(B).catch((O)=>{console.error(`${_} signaling message handler failed: ${String(O)}`)})}),V.on("close",()=>{this.stopSignalingHeartbeat(),this.onSignalingStatus?.(!1),this.signalingWs=null,J(()=>Q())}),V.on("error",(q)=>{this.stopSignalingHeartbeat(),this.onSignalingStatus?.(!1),this.signalingWs=null,J(()=>X(q))})})}async handleSignalingMessage(Z){if(!Z||typeof Z!=="object")return;let $=Z;if($.type==="pong"){this.lastSignalingPongAt=Date.now();return}if($.type==="ping"){this.sendSignal({type:"pong",ts:Date.now()});return}if($.type==="offer"){await this.handleOffer(Z);return}if($.type==="ice"){this.handleRemoteIce(Z);return}if($.type==="error")console.warn(`${_} signaling error: ${JSON.stringify(Z)}`)}sendSignalingPing(){let Z=this.signalingWs;if(!Z||Z.readyState!==uZ.OPEN)return;try{Z.send(JSON.stringify({type:"ping",ts:Date.now()}))}catch($){console.warn(`${_} signaling ping send failed: ${String($)}`);try{Z.close()}catch{}}}startSignalingHeartbeat(){this.stopSignalingHeartbeat(),this.lastSignalingPongAt=Date.now(),this.sendSignalingPing(),this.signalingHeartbeatInterval=setInterval(()=>{let Z=this.signalingWs;if(!Z||Z.readyState!==uZ.OPEN)return;if(Date.now()-this.lastSignalingPongAt>a6){console.warn(`${_} signaling heartbeat stale; forcing reconnect`);try{Z.close()}catch{}return}this.sendSignalingPing()},t6)}stopSignalingHeartbeat(){if(this.signalingHeartbeatInterval)clearInterval(this.signalingHeartbeatInterval),this.signalingHeartbeatInterval=null;this.lastSignalingPongAt=0}async handleOffer(Z){let $=w(Z.requestId),Q=w(Z.sdp);if(!$||!Q){this.sendSignal({type:"error",requestId:Z.requestId,code:"INVALID_OFFER",message:"Offer payload is missing requestId or sdp"},{queueIfClosed:!0});return}if(this.answerGatherTimer)clearTimeout(this.answerGatherTimer),this.answerGatherTimer=null;if(this.peerConnection||this.dataChannel)console.log(`${_} closing stale peer connection before new offer`),this.closePeerConnection();this.currentOfferRequestId=$,this.currentSessionId=Z.sessionId??crypto.randomUUID().replace(/-/g,""),this.pendingRemoteCandidates=[],this.remoteDescriptionApplied=!1,this.awaitingStateSyncRequest=!0;let X;try{X=await this.ensurePeerConnection(Z.turnCredentials)}catch(Y){console.error(`${_} peer connection creation failed requestId=${$} error=${String(Y)}`),this.sendSignal({type:"error",requestId:$,code:"PEER_CREATE_FAILED",message:String(Y)},{queueIfClosed:!0});return}try{console.log(`${_} setRemoteDescription offer sdp_len=${Q.length} ice_candidates=${Array.isArray(Z.iceCandidates)?Z.iceCandidates.length:0}`);let H=(Q.split(`\r
6
6
  `).length>1?Q.split(`\r
7
7
  `):Q.split(`
8
- `)).filter((V)=>V.startsWith("a=ice-")||V.startsWith("a=fingerprint")||V.startsWith("a=setup")||V.startsWith("m="));if(console.log(`${G} SDP ice-relevant lines: ${H.join(" | ")}`),X.setRemoteDescription?.(Q,"offer"),this.remoteDescriptionApplied=!0,console.log(`${G} setRemoteDescription success`),Array.isArray(Z.iceCandidates))for(let V of Z.iceCandidates)this.enqueuePendingRemoteCandidate(V,this.currentSessionId??void 0);this.flushPendingRemoteCandidates(),X.setLocalDescription?.(),console.log(`${G} setLocalDescription (answer) triggered`)}catch(Y){console.error(`${G} offer processing failed: ${String(Y)}`),this.sendSignal({type:"error",requestId:$,code:"OFFER_PROCESS_FAILED",message:String(Y)},{queueIfClosed:!0})}}async ensurePeerConnection(Z){if(this.peerConnection)return this.peerConnection;let $=await Y7(),Q={iceServers:V7(Z)},X=new $.PeerConnection(`botmobile-${Date.now()}`,Q);this.peerConnection=X,this.dataChannelDisconnectedAt=Date.now(),this.awaitingStateSyncRequest=!0;let Y=[],H=null,V=this.currentOfferRequestId,J=this.currentSessionId,q=()=>{if(this.answerGatherTimer)clearTimeout(this.answerGatherTimer),this.answerGatherTimer=null;if(this.peerConnection!==X)return;if(!H)return;let K=H;H=null,console.log(`${G} sending answer with ${Y.length} bundled candidates`),this.sendSignal({type:"answer",requestId:V,sessionId:J,sdp:K,iceCandidates:Y.slice()},{queueIfClosed:!0})};return X.onLocalDescription?.((K,B)=>{if(this.peerConnection!==X)return;if(console.log(`${G} onLocalDescription type=${B} sdp_len=${K?.length??0} requestId=${V} wsOpen=${this.signalingWs?.readyState===uZ.OPEN}`),B!=="answer")return;H=K,this.answerGatherTimer=setTimeout(q,e6)}),X.onLocalCandidate?.((K,B)=>{if(this.peerConnection!==X)return;if(!K)return;if(H)Y.push({candidate:K,sdpMid:B});else this.sendSignal({type:"ice",sessionId:this.currentSessionId,candidate:{candidate:K,sdpMid:B}},{queueIfClosed:!0})}),X.onStateChange?.((K)=>{if(this.peerConnection!==X)return;if(K==="failed"||K==="closed"||K==="disconnected"){if(this.onDataChannelStatus?.(!1),this.dataChannelDisconnectedAt===null)this.dataChannelDisconnectedAt=Date.now();this.clientIsForeground=!1,this.clientStateUpdatedAt=Date.now()}}),X.onDataChannel?.((K)=>{if(this.peerConnection!==X)return;console.log(`${G} onDataChannel fired — received remote data channel`),this.attachDataChannel(K)}),X}attachDataChannel(Z){if(console.log(`${G} attachDataChannel called`),this.dataChannel&&this.dataChannel!==Z)try{this.dataChannel.close?.()}catch{}this.dataChannel=Z,Z.onOpen?.(()=>{if(this.dataChannel!==Z)return;console.log(`${G} dataChannel onOpen fired`),this.onDataChannelStatus?.(!0),this.dataChannelDisconnectedAt=null,this.clientIsForeground=!0,this.clientStateUpdatedAt=Date.now(),this.awaitingStateSyncRequest=!0,this.startHeartbeatLoop(),this.sendHeartbeat("ping")}),Z.onClosed?.(()=>{if(this.dataChannel!==Z)return;if(console.log(`${G} dataChannel onClosed fired`),this.dataChannel=null,this.onDataChannelStatus?.(!1),this.stopHeartbeatLoop(),this.dataChannelDisconnectedAt===null)this.dataChannelDisconnectedAt=Date.now();this.clientIsForeground=!1,this.clientStateUpdatedAt=Date.now()}),Z.onError?.(($)=>{if(this.dataChannel!==Z)return;console.error(`${G} datachannel error: ${String($)}`),this.dataChannel=null}),Z.onMessage?.(($)=>{if(this.dataChannel!==Z)return;let Q=$===null?"null":typeof $==="object"?$.constructor?.name??"object":typeof $,X=Buffer.isBuffer($)?$.length:$ instanceof ArrayBuffer?$.byteLength:ArrayBuffer.isView($)?$.byteLength:typeof $==="string"?$.length:-1;console.log(`${G} dataChannel onMessage: type=${Q} len=${X}`),this.handleDataChannelMessage($)})}handleDataChannelMessage(Z){let $;if(Buffer.isBuffer(Z))$=Z;else if(typeof Z==="string")$=Buffer.from(Z,"binary");else if(Z instanceof ArrayBuffer)$=Buffer.from(Z);else if(ArrayBuffer.isView(Z))$=Buffer.from(Z.buffer,Z.byteOffset,Z.byteLength);else return;let Q;try{Q=S4($);let Y=X0(Q.type);if(Q.type!==F.heartbeat)console.log(`${G} ◀ RECV ${Y} ${y4(Q.type,Q.payload)}`)}catch(Y){console.error(`${G} wire decode failed: ${String(Y)} hex=${$.subarray(0,32).toString("hex")}`),this.sendWire(F.error,{code:"INVALID_WIRE_ENVELOPE",message:String(Y)});return}if(this.lastHeartbeatReceivedAt=Date.now(),Q.type===F.heartbeat){this.handleHeartbeatPayload(Q.payload);return}if(Q.type===F.fileChunk){this.ensureFileReceiver().handleChunk(Q.payload);return}let X=j4(Q);if(X.kind==="ignore")return;if(X.kind==="command")this.sendWire(F.commandAck,{commandId:X.commandId,ok:!0});if(X.envelope.type==="client_state")this.clientIsForeground=X.envelope.isForeground===!0,this.clientStateUpdatedAt=Date.now(),console.log(`${G} client_state foreground=${this.clientIsForeground} tab=${X.envelope.activeTab??"unknown"} conv=${X.envelope.activeConversationId??"none"}`);if(this.onLegacyEnvelope(X.envelope),X.envelope.type==="state_sync_request")this.resyncRequired=!1,this.awaitingStateSyncRequest=!1,this.flushOutboundQueue()}handleRemoteIce(Z){if(!this.currentSessionId)return;let $=w(Z.sessionId);if($&&$!==this.currentSessionId)return;if(!this.peerConnection||!this.remoteDescriptionApplied){this.enqueuePendingRemoteCandidate(Z.candidate,$??void 0);return}this.addRemoteCandidate(Z.candidate)}enqueuePendingRemoteCandidate(Z,$){if(this.pendingRemoteCandidates.length>=128)this.pendingRemoteCandidates.shift();this.pendingRemoteCandidates.push({sessionId:$,candidate:Z})}addRemoteCandidate(Z){let $=H7(Z);if(!$)return;try{this.peerConnection?.addRemoteCandidate?.($.candidate,$.sdpMid)}catch(Q){console.warn(`${G} addRemoteCandidate failed: ${String(Q)}`)}}flushPendingRemoteCandidates(){if(!this.peerConnection||!this.currentSessionId||this.pendingRemoteCandidates.length===0)return;let Z=this.pendingRemoteCandidates;this.pendingRemoteCandidates=[];for(let $ of Z){if($.sessionId&&$.sessionId!==this.currentSessionId)continue;this.addRemoteCandidate($.candidate)}}enqueuePendingSignal(Z){if(this.pendingSignalQueue.length>=Z7)this.pendingSignalQueue.shift();this.pendingSignalQueue.push(Z)}flushPendingSignalQueue(){if(!this.signalingWs||this.signalingWs.readyState!==uZ.OPEN)return;if(this.pendingSignalQueue.length>0)console.log(`${G} flushing queued signaling messages count=${this.pendingSignalQueue.length}`);while(this.pendingSignalQueue.length>0){let Z=this.pendingSignalQueue[0];try{this.signalingWs.send(JSON.stringify(Z)),this.pendingSignalQueue.shift()}catch($){console.warn(`${G} signaling queued send failed: ${String($)}`);return}}}sendSignal(Z,$={}){if(!this.signalingWs||this.signalingWs.readyState!==uZ.OPEN){if($.queueIfClosed)this.enqueuePendingSignal(Z),console.warn(`${G} sendSignal queued type=${Z.type} readyState=${this.signalingWs?.readyState??"null"}`);else console.warn(`${G} sendSignal DROPPED type=${Z.type} readyState=${this.signalingWs?.readyState??"null"}`);return!1}try{return console.log(`${G} sendSignal type=${Z.type}`),this.signalingWs.send(JSON.stringify(Z)),!0}catch(Q){if($.queueIfClosed)this.enqueuePendingSignal(Z);return console.warn(`${G} signaling send failed: ${String(Q)}`),!1}}sendWire(Z,$){if(this.shouldDropSnapshot(Z,$))return;let Q=X0(Z);if(Z!==F.heartbeat)console.log(`${G} ▶ SEND ${Q} ${y4(Z,$)}`);let X={type:Z,seq:this.outboundSeq++,ts:Date.now(),payload:$},Y=w4(X),H=Z===F.heartbeat||Z===F.error;if(this.dataChannel!==null&&(!this.awaitingStateSyncRequest||H)&&this.trySendDataChannelBytes(Y)){this.maybeTriggerPush(Z,$);return}if(Z===F.heartbeat)return;if(this.resyncRequired&&Z!==F.error)return;this.enqueueOutbound({bytes:Y,type:Z,payload:$}),this.maybeTriggerPush(Z,$)}trySendDataChannelBytes(Z){let $=this.dataChannel;if(!$)return console.log(`${G} trySend: no dataChannel`),!1;try{if(typeof $.sendMessageBinary==="function")return $.sendMessageBinary(Z),console.log(`${G} trySend: sendMessageBinary ${Z.length}B ok`),!0;if(typeof $.sendMessage==="function")return $.sendMessage(Z),console.log(`${G} trySend: sendMessage ${Z.length}B ok`),!0;if(typeof $.send==="function")return $.send(Z),console.log(`${G} trySend: send ${Z.length}B ok`),!0}catch(Q){return console.error(`${G} trySend error: ${String(Q)}`),!1}return console.warn(`${G} trySend: no send method available on channel`),!1}enqueueOutbound(Z){let $=Z.bytes.byteLength;if($>b4){this.markResyncRequired("Outbound item exceeded queue byte limit; full sync required.");return}if(this.isSnapshotWireType(Z.type)){let X=this.outboundQueue.findIndex((Y)=>Y.type===Z.type);if(X>=0){let Y=this.outboundQueue[X];this.outboundQueue[X]=Z,this.outboundQueueBytes=Math.max(0,this.outboundQueueBytes-Y.bytes.byteLength+$);return}}let Q=!1;while(this.outboundQueue.length>=d6||this.outboundQueueBytes+$>b4){let X=this.outboundQueue.findIndex((J)=>!this.isSnapshotWireType(J.type)),Y=X>=0?X:0,V=this.outboundQueue.splice(Y,1)[0];if(!V)break;this.outboundQueueBytes=Math.max(0,this.outboundQueueBytes-V.bytes.byteLength),Q=!0}if(Q){this.markResyncRequired("Outbound queue overflowed; full sync required.");return}this.outboundQueue.push(Z),this.outboundQueueBytes+=$}markResyncRequired(Z){if(this.resyncRequired)return;this.resyncRequired=!0,this.awaitingStateSyncRequest=!0,this.outboundQueue=[],this.outboundQueueBytes=0,this.sendWire(F.error,{code:"RESYNC_REQUIRED",message:Z})}flushOutboundQueue(){if(!this.dataChannel)return;if(this.awaitingStateSyncRequest)return;while(this.outboundQueue.length>0){let Z=this.outboundQueue[0];if(!this.trySendDataChannelBytes(Z.bytes))return;this.outboundQueue.shift(),this.outboundQueueBytes=Math.max(0,this.outboundQueueBytes-Z.bytes.byteLength)}}isSnapshotWireType(Z){return Z===F.snapshotAgents||Z===F.snapshotCron||Z===F.snapshotConversations}snapshotSignature(Z,$){if(!this.isSnapshotWireType(Z)||!$||typeof $!=="object")return null;let Q=$;if(Z===F.snapshotAgents)return JSON.stringify({agents:this.normalizeSnapshotValue(Array.isArray(Q.agents)?Q.agents:[])});if(Z===F.snapshotCron)return JSON.stringify({cronJobs:this.normalizeCronJobsForSignature(Q.cronJobs)});if(Z===F.snapshotConversations)return JSON.stringify({conversations:this.normalizeSnapshotValue(Array.isArray(Q.conversations)?Q.conversations:[])});return null}normalizeSnapshotValue(Z){if(Array.isArray(Z))return Z.map((Y)=>this.normalizeSnapshotValue(Y));if(!Z||typeof Z!=="object")return Z;let $=Z,Q={},X=Object.keys($).sort();for(let Y of X){if(Y==="timestamp"||Y==="lastUpdated"||Y==="runningElapsedMs"||Y==="nextRunAt")continue;Q[Y]=this.normalizeSnapshotValue($[Y])}return Q}normalizeCronJobsForSignature(Z){if(!Array.isArray(Z))return[];let $=[];for(let Q of Z){if(!Q||typeof Q!=="object")continue;let X=Q;$.push({id:this.normalizeSnapshotValue(X.id),name:this.normalizeSnapshotValue(X.name),enabled:X.enabled===!0,isRunning:X.isRunning===!0,agentId:this.normalizeSnapshotValue(X.agentId),agentName:this.normalizeSnapshotValue(X.agentName),agentEmoji:this.normalizeSnapshotValue(X.agentEmoji),schedule:this.normalizeSnapshotValue(X.schedule),lastRunAt:this.normalizeSnapshotValue(X.lastRunAt),lastRunStatus:this.normalizeSnapshotValue(X.lastRunStatus),lastRunSummary:this.normalizeSnapshotValue(X.lastRunSummary)})}return $.sort((Q,X)=>String(Q.id??"").localeCompare(String(X.id??""))),$}shouldDropSnapshot(Z,$){let Q=this.snapshotSignature(Z,$);if(!Q)return!1;let X=Date.now(),Y=this.lastSnapshotSignatureByType.get(Z),H=this.lastSnapshotSentAtByType.get(Z)??0;if(Z===F.snapshotCron&&H>0&&X-H<Q7)return!0;if(Y===Q&&X-H<$7)return!0;return this.lastSnapshotSignatureByType.set(Z,Q),this.lastSnapshotSentAtByType.set(Z,X),!1}streamKey(Z,$){return`${Z}:${$}`}handleLegacyStreamStart(Z){let $=this.streamKey(Z.conversationId,Z.messageId);this.streamTextByMessageId.set($,"");let Q=this.pendingStreamBatches.get($);if(Q?.timer)clearTimeout(Q.timer);this.pendingStreamBatches.delete($)}handleLegacyStreamToken(Z){if(!Z.token)return;let $=this.streamKey(Z.conversationId,Z.messageId),Q=this.streamTextByMessageId.get($)??"";this.streamTextByMessageId.set($,Q+Z.token);let X=this.pendingStreamBatches.get($);if(X){X.tokens+=Z.token;return}let Y={conversationId:Z.conversationId,messageId:Z.messageId,offset:Q.length,tokens:Z.token,timer:null};Y.timer=setTimeout(()=>{this.flushStreamBatch($)},s6),this.pendingStreamBatches.set($,Y)}handleLegacyStreamEnd(Z){let $=this.streamKey(Z.conversationId,Z.messageId);this.flushStreamBatch($);let Q=this.streamTextByMessageId.get($)??"",X=Z.body&&Z.body.length>0?Z.body:Q;this.streamTextByMessageId.delete($),this.pendingStreamBatches.delete($),this.sendWire(F.streamEnd,{conversationId:Z.conversationId,messageId:Z.messageId,finalContent:X})}flushStreamBatch(Z){let $=this.pendingStreamBatches.get(Z);if(!$)return;if($.timer)clearTimeout($.timer),$.timer=null;if($.tokens.length>0)this.sendWire(F.streamBatch,{conversationId:$.conversationId,messageId:$.messageId,offset:$.offset,tokens:$.tokens});this.pendingStreamBatches.delete(Z)}flushAllStreamBatches(){for(let Z of Array.from(this.pendingStreamBatches.keys()))this.flushStreamBatch(Z)}sendHeartbeat(Z,$){console.log(`${G} sendHeartbeat kind=${Z}`),this.sendWire(F.heartbeat,{kind:Z,sentAt:$??Date.now()})}handleHeartbeatPayload(Z){let $=w(Z.kind),Q=Z.sentAt,X=typeof Q==="number"&&Number.isFinite(Q)?Q:typeof Q==="bigint"?Number(Q):Date.now();if($==="ping"){this.sendHeartbeat("pong",X);return}if($==="pong"){this.lastHeartbeatRttMs=Math.max(0,Date.now()-X);return}}startHeartbeatLoop(){this.stopHeartbeatLoop(),this.lastHeartbeatReceivedAt=Date.now(),this.heartbeatInterval=setInterval(()=>{if(!this.dataChannel)return;if(Date.now()-this.lastHeartbeatReceivedAt>n6){console.warn(`${G} heartbeat stale (rtt=${this.lastHeartbeatRttMs??-1}ms), closing peer`),this.closePeerConnection(),this.onDataChannelStatus?.(!1),this.dataChannelDisconnectedAt=Date.now(),this.clientIsForeground=!1,this.clientStateUpdatedAt=Date.now();return}this.sendHeartbeat("ping")},o6)}stopHeartbeatLoop(){if(this.heartbeatInterval)clearInterval(this.heartbeatInterval),this.heartbeatInterval=null}pushPriority(Z){if(Z===F.error)return 5;if(Z===F.streamEnd)return 4;if(Z===F.conversationDelta)return 3;if(Z===F.agentStatus)return 1;return 0}queuePushTrigger(Z,$){let Q=this.pushPriority(Z),X=this.pendingPushRequest;if(!X||Q>=X.priority)this.pendingPushRequest={type:Z,pushInfo:$,priority:Q};if(this.pendingPushTimer)return;this.pendingPushTimer=setTimeout(()=>{this.flushPendingPush()},r6)}async flushPendingPush(){this.pendingPushTimer=null;let Z=this.pendingPushRequest;if(this.pendingPushRequest=null,!Z)return;let $=Date.now(),Q=$-this.lastPushSentAt;if(Q<f4){this.pendingPushRequest=Z,this.pendingPushTimer=setTimeout(()=>{this.flushPendingPush()},f4-Q);return}this.lastPushSentAt=$;try{let X=await fetch(`${this.account.workerUrl}/api/push`,{method:"POST",headers:{"content-type":"application/json",authorization:`BotMobilePush ${this.account.pushSecret}`},body:JSON.stringify(Z.pushInfo)});if(!X.ok){let H=(await X.text().catch(()=>"")).trim();console.warn(`${G} push trigger failed status=${X.status}${H?` body=${H.slice(0,200)}`:""}`)}else console.log(`${G} push triggered type=${X0(Z.type)} foreground=${this.clientIsForeground??"unknown"} stateAgeMs=${$-this.clientStateUpdatedAt}`)}catch(X){console.warn(`${G} push trigger error=${String(X)}`)}}async maybeTriggerPush(Z,$){let Q=this.pushInfoForEvent(Z,$);if(!Q)return;if(!this.account.pushSecret||this.account.pushSecret.trim().length===0)return;let X=Date.now(),Y=this.dataChannelDisconnectedAt!==null?X-this.dataChannelDisconnectedAt:null,H=Y!==null&&Y>=i6;if(this.clientIsForeground!==!1&&!H){console.log(`${G} push skipped type=${X0(Z)} foreground=${this.clientIsForeground??"unknown"} disconnectedForMs=${Y??-1}`);return}this.queuePushTrigger(Z,Q)}normalizedPushAgentName(Z){if(typeof Z!=="string")return null;let $=Z.trim();if(!$)return null;if($.toLowerCase().startsWith("conversation:"))return null;return $}pushTitleForConversation(Z,$){let Q=this.normalizedPushAgentName($);if(Q)return Q;if(Z){let X=s0(Z),Y=this.normalizedPushAgentName(X?.agent?.name);if(Y)return Y}return"Assistant"}pushInfoForEvent(Z,$){if(Z===F.error){let Q=$;return{title:"BotMobile error",body:w(Q.message)??"An error occurred",data:{conversationId:w(Q.conversationId)??""}}}if(Z===F.agentStatus){let Q=$;if(Q.isRunning===!1)return{title:"Agent update",body:"An agent run finished while you were away.",data:{agentId:w(Q.id)??""}}}if(Z===F.conversationDelta){let Q=$,X=w(Q.id)??"",Y=Q.agent;if(Array.isArray(Q.messages)&&Q.messages.length>0){let H=Q.messages[Q.messages.length-1];if(H.role==="bot"){let V=w(H.content)??"",J=V.length>120?V.slice(0,120)+"…":V;return{title:this.pushTitleForConversation(X,Y?.name),body:J||"You have a new message.",data:{conversationId:X}}}}}if(Z===F.streamEnd){let Q=$,X=w(Q.conversationId)??"",Y=w(Q.finalContent)??"",H=Y.length>120?Y.slice(0,120)+"…":Y;return{title:this.pushTitleForConversation(X),body:H||"You have a new message.",data:{conversationId:X}}}return null}ensureFileReceiver(){if(!this._fileReceiver)this._fileReceiver=new X3((Z,$)=>{this.sendWire(Z,$)});return this._fileReceiver}closePeerConnection(){if(this.answerGatherTimer)clearTimeout(this.answerGatherTimer),this.answerGatherTimer=null;this.stopHeartbeatLoop(),this.flushAllStreamBatches();try{this.dataChannel?.close?.()}catch{}try{this.peerConnection?.close?.()}catch{}this.dataChannel=null,this.peerConnection=null,this.remoteDescriptionApplied=!1,this.currentSessionId=null,this.currentOfferRequestId=null,this.pendingRemoteCandidates=[],this.awaitingStateSyncRequest=!0,this.lastSnapshotSignatureByType.clear(),this.lastSnapshotSentAtByType.clear()}cleanup(){if(this.pendingPushTimer)clearTimeout(this.pendingPushTimer),this.pendingPushTimer=null;if(this.stopSignalingHeartbeat(),this.pendingPushRequest=null,this.closePeerConnection(),this.pendingSignalQueue=[],this.streamTextByMessageId.clear(),this.pendingStreamBatches.clear(),this.lastSnapshotSignatureByType.clear(),this.lastSnapshotSentAtByType.clear(),this._fileReceiver)this._fileReceiver.dispose(),this._fileReceiver=null;if(this.signalingWs){try{this.signalingWs.close()}catch{}this.signalingWs=null}this.onSignalingStatus?.(!1),this.onDataChannelStatus?.(!1)}}var G="[botmobile:webrtc]",l6=30000,T4=1000,d6=1000,b4=10485760,f4=1000,i6=5000,r6=600,s6=50,o6=15000,n6=45000,t6=15000,a6=45000,e6=500,Z7=256,$7=2000,Q7=1e4,Y3=null,I4=!1;var u4=KZ(()=>{C4();Q0();h4()});import V3 from"node:fs";import D7 from"node:os";import m4 from"node:path";function VZ(Z){if(typeof Z!=="string")return null;let $=Z.trim().toLowerCase();return $.length>0?$:null}function mZ(Z){if(typeof Z!=="string")return;let $=Z.trim();return $.length>0?$:void 0}function z0(Z){if(typeof Z!=="string")return;let $=Z.trim();return $.length>0?$:void 0}function gZ(Z){if(typeof Z==="number"&&Number.isFinite(Z)&&Z>0)return Math.floor(Z);return Date.now()}function F7(){try{V3.mkdirSync(v4,{recursive:!0})}catch(Z){console.warn(`${g4} failed creating state dir ${v4}: ${String(Z)}`)}}function G7(Z){i.version=J3,i.updatedAt=typeof Z.updatedAt==="number"&&Number.isFinite(Z.updatedAt)?Math.max(0,Math.floor(Z.updatedAt)):0,i.agents={};for(let[$,Q]of Object.entries(Z.agents??{})){let X=VZ($)??VZ(Q.id),Y=mZ(Q.name);if(!X||!Y)continue;i.agents[X]={id:X,name:Y,emoji:z0(Q.emoji),updatedAt:gZ(Q.updatedAt)}}i.cronJobs={};for(let[$,Q]of Object.entries(Z.cronJobs??{})){let X=VZ($)??VZ(Q.id);if(!X)continue;let Y=VZ(Q.agentId??void 0)??void 0;i.cronJobs[X]={id:X,name:mZ(Q.name),agentId:Y,agentName:mZ(Q.agentName),agentEmoji:z0(Q.agentEmoji),enabled:typeof Q.enabled==="boolean"?Q.enabled:void 0,updatedAt:gZ(Q.updatedAt),lastSeenAt:typeof Q.lastSeenAt==="number"&&Number.isFinite(Q.lastSeenAt)?Math.max(0,Math.floor(Q.lastSeenAt)):void 0,deletedAt:typeof Q.deletedAt==="number"&&Number.isFinite(Q.deletedAt)?Math.max(0,Math.floor(Q.deletedAt)):void 0}}}function _7(){p4=!0;try{let Z=V3.readFileSync(W0,"utf8"),$=JSON.parse(Z);if(!$||typeof $!=="object")return;if($.version!==J3)return;G7($)}catch{}}function kZ(){if(p4)return;_7()}function c4(){if(!CZ)return;if(vZ)return;vZ=setTimeout(()=>{vZ=null,l4()},U7)}function l4(){if(kZ(),!CZ)return;F7(),i.updatedAt=Date.now();try{let Z=JSON.stringify(i,null,2);V3.writeFileSync(W0,`${Z}
9
- `,"utf8"),CZ=!1}catch(Z){console.warn(`${g4} failed writing state ${W0}: ${String(Z)}`)}}function d4(){CZ=!0,c4()}function i4(){kZ()}function r4(){if(vZ)clearTimeout(vZ),vZ=null;l4()}function s4(Z){kZ();let $=VZ(Z.id),Q=mZ(Z.name);if(!$||!Q)return;let X=i.agents[$],Y={id:$,name:Q,emoji:z0(Z.emoji)??X?.emoji,updatedAt:gZ(Z.updatedAt)};if(!(!X||X.name!==Y.name||X.emoji!==Y.emoji||X.updatedAt!==Y.updatedAt))return;i.agents[$]=Y,d4()}function o4(Z){kZ();let $=VZ(Z);if(!$)return;return i.agents[$]}function N0(Z){kZ();let $=VZ(Z.id);if(!$)return;let Q=i.cronJobs[$],X={id:$,name:mZ(Z.name)??Q?.name,agentId:VZ(Z.agentId)??Q?.agentId,agentName:mZ(Z.agentName)??Q?.agentName,agentEmoji:z0(Z.agentEmoji)??Q?.agentEmoji,enabled:typeof Z.enabled==="boolean"?Z.enabled:Q?.enabled,updatedAt:gZ(Z.updatedAt),lastSeenAt:Z.lastSeenAt!==void 0?gZ(Z.lastSeenAt):Q?.lastSeenAt,deletedAt:Z.deletedAt!==void 0?gZ(Z.deletedAt):Q?.deletedAt};if(!(!Q||Q.name!==X.name||Q.agentId!==X.agentId||Q.agentName!==X.agentName||Q.agentEmoji!==X.agentEmoji||Q.enabled!==X.enabled||Q.updatedAt!==X.updatedAt||Q.lastSeenAt!==X.lastSeenAt||Q.deletedAt!==X.deletedAt))return;i.cronJobs[$]=X,d4()}function q3(Z){kZ();let $=VZ(Z);if(!$)return;return i.cronJobs[$]}function K3(Z){kZ();let $=Date.now(),Q=new Set;for(let X of Z){let Y=VZ(X);if(!Y)continue;Q.add(Y);let H=i.cronJobs[Y];if(!H)continue;if(H.lastSeenAt===$&&H.deletedAt===void 0)continue;H.lastSeenAt=$,H.deletedAt=void 0,H.updatedAt=Math.max(H.updatedAt,$),CZ=!0}for(let[X,Y]of Object.entries(i.cronJobs)){if(Q.has(X))continue;if(Y.deletedAt)continue;Y.deletedAt=$,Y.updatedAt=Math.max(Y.updatedAt,$),CZ=!0}if(CZ)c4()}var g4="[botmobile:cache]",J3=1,U7=1000,W0,v4,p4=!1,CZ=!1,vZ=null,i;var n4=KZ(()=>{W0=m4.join(D7.homedir(),".openclaw","botmobile","state.json"),v4=m4.dirname(W0),i={version:J3,updatedAt:0,agents:{},cronJobs:{}}});var G5={};x5(G5,{wsRelay:()=>k,monitorBotMobileProvider:()=>F5,handleToolHookEvent:()=>j0,handleAgentRunHookEnd:()=>C3,getFileWatcherCount:()=>U8,bindSessionToConversation:()=>M3});import W7 from"node:dns";import{watch as O3,statSync as w0,readFileSync as j3}from"node:fs";import UZ from"node:path";import iZ from"node:os";import{createReplyPrefixOptions as z7}from"openclaw/plugin-sdk";function k(Z,$){if($?.record!==!1)Y4(Z);if(LZ)LZ.sendLegacyEnvelope(Z);return!0}function x7(Z,$){return SZ(Z,$).name}function h7(Z,$){return SZ(Z,$).emoji}function SZ(Z,$){let Q=bZ(Z,$),X=o4($),Y=Q.name;if((Q.source==="agent-id"||!Y||Y===$)&&X?.name)Y=X.name;let H=Q.emoji??X?.emoji;return s4({id:$,name:Y,emoji:H,updatedAt:Date.now()}),{name:Y,emoji:H}}function H5(Z){return{resolveAgentDisplay:({agentId:$})=>SZ(Z,$),resolveCronSnapshot:($)=>{let Q=q3($);if(!Q)return;return{name:Q.name,agentId:Q.agentId,agentName:Q.agentName,agentEmoji:Q.agentEmoji}}}}function pZ(Z){if(!Array.isArray(Z))return;return Z.map((Q)=>typeof Q==="string"?Q.trim():"").filter((Q)=>Q.length>0)}function T7(Z){let $=new Set,Q=[];for(let X of Z){let Y=X.trim();if(!Y)continue;if($.has(Y))continue;$.add(Y),Q.push(Y)}return Q.length>0?Q:void 0}function b7(Z){if(!Z)return{};let $=Z.trim();if(!$)return{};let Q=$.indexOf("/");if(Q<0)return{model:$};let X=$.slice(0,Q).trim(),Y=$.slice(Q+1).trim();return{provider:X||void 0,model:Y||void 0}}function f7(Z){let $=Z?.trim().toLowerCase();if(!$)return;switch($){case"anthropic":return"ANTHROPIC_API_KEY";case"openai":return"OPENAI_API_KEY";case"gemini":case"google":return"GEMINI_API_KEY";case"openrouter":return"OPENROUTER_API_KEY";case"xai":return"XAI_API_KEY";case"groq":return"GROQ_API_KEY";case"perplexity":return"PERPLEXITY_API_KEY";case"deepseek":return"DEEPSEEK_API_KEY";case"mistral":return"MISTRAL_API_KEY";case"cohere":return"COHERE_API_KEY";default:return}}function y(Z){let $=Z.replace(/\s+/g," ").trim();if(!$)return"working";if($.length<=t4)return $;return`${$.slice(0,t4-3).trimEnd()}...`}function S0(Z){if(!Z)return;let $=Z.trim();return $.length>0?$:void 0}function P3(Z){if(!Z)return;let $=Z.trim();return $.length>0?$:void 0}function I7(Z){let $=Z.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[._-]+/g," ").replace(/\s+/g," ").trim().toLowerCase();if(!$)return"running tool";return y(`running ${$}`)}function o(Z){if(!Z)return;let $=Z.replace(/\s+/g," ").trim();if(!$)return;if($.length<=e4)return $;return`${$.slice(0,e4-1).trimEnd()}…`}function e(Z,$){if(!Z)return;for(let Q of $){let X=Z[Q];if(typeof X==="string"&&X.trim().length>0)return X.trim()}return}function y7(Z){if(!Z)return;let $=Z.trim().split(/\s+/)[0];if(!$)return;if($.startsWith("/")){let Q=$.split("/");return Q[Q.length-1]||$}return $}function u7(Z){if(!Z)return;try{let $=new URL(Z).hostname;return $?o($):void 0}catch{return o(Z)}}function v7(Z){let $=e(Z,["action","op","operation","method"]);return o($)}function $Z(Z,$){if(!$)return y(Z);return y(`${Z} (${$})`)}function m7(Z,$){let Q=Z.trim().toLowerCase(),X=v7($);if(Q==="web_search"){let Y=o(e($,["query","q","text"]));return $Z("searching the web",Y)}if(Q==="web_fetch"){let Y=u7(e($,["url"]));return $Z("fetching webpage",Y)}if(Q==="browser"){let Y=o(e($,["url","selector","query","text"]));if(X&&Y)return y(`browser ${X} (${Y})`);if(X)return y(`browser ${X}`);return $Z("using browser tool",Y)}if(Q==="memory_search"){let Y=o(e($,["query","q","text"]));return $Z("searching memory",Y)}if(Q==="memory_get"){let Y=o(e($,["id","key","name"]));return $Z("reading memory entry",Y)}if(Q==="sessions_history"){let Y=o(e($,["sessionId","sessionKey","id"]));return $Z("reading session history",Y)}if(Q==="sessions_list")return y("listing sessions");if(Q==="sessions_send"){let Y=o(e($,["sessionId","sessionKey","to","target"]));return $Z("sending cross-session message",Y)}if(Q==="sessions_spawn"){let Y=o(e($,["name","label","agentId"]));return $Z("starting helper session",Y)}if(Q==="cron"){if(X)return y(`updating scheduled task (${X})`);return y("updating scheduled task")}if(Q==="message"){if(X)return y(`preparing message action (${X})`);return y("preparing message")}if(Q==="gateway"){if(X)return y(`checking gateway (${X})`);return y("checking gateway")}if(Q==="canvas"){if(X)return y(`updating canvas (${X})`);return y("updating canvas")}if(Q==="nodes"){if(X)return y(`running node action (${X})`);return y("running node action")}if(Q==="image"){if(X)return y(`working with image (${X})`);return y("working with image")}if(Q==="tts")return y("generating audio");if(Q==="exec_command"){let Y=e($,["cmd","command"]),H=o(y7(Y));return $Z("running terminal command",H)}if(Q==="write_stdin")return y("continuing terminal command");if(Q==="search_query"){let Y=o(e($,["q","query"]));return $Z("searching",Y)}if(Q==="open"){let Y=o(e($,["ref_id","refId","url"]));return $Z("opening reference",Y)}if(Q==="click")return y("opening linked reference");if(Q==="find"){let Y=o(e($,["pattern","text"]));return $Z("finding text",Y)}if(Q==="apply_patch")return y("editing code");return I7(Z)}function V5(Z,$){return`${Z}::${$??"__unknown__"}`}function g7(Z=Date.now()){for(let[$,Q]of rZ)if(Z-Q.updatedAt>w7)rZ.delete($)}function p7(Z){let $=S0(Z);if(!$)return;let Q=rZ.get($);if(Q)return Q.updatedAt=Date.now(),Q.conversationId;let X=$.match(C7);if(X&&X[1]?.trim())return R(X[1]);let Y=$.match(k7);if(Y&&Y[1]?.trim())return R(Y[1]);let H=$.match(A7);if(H&&H[1]?.trim())return`cron:${H[1].trim().toLowerCase()}`;return}function R3(Z){let $,Q=-1,X=`${Z}::`;for(let[Y,H]of JZ){if(!Y.startsWith(X))continue;if(H.tools.length===0)continue;if(H.updatedAt>Q)Q=H.updatedAt,$=Y}if($)return DZ.set(Z,$),$;DZ.delete(Z);return}function c7(Z,$){if($){let X=V5(Z,$);if(JZ.delete(X),DZ.get(Z)===X)R3(Z);return}let Q=`${Z}::`;for(let X of Array.from(JZ.keys())){if(!X.startsWith(Q))continue;JZ.delete(X)}DZ.delete(Z)}function M3(Z){let $=S0(Z.sessionKey);if(!$)return;let Q=R(Z.conversationId);if(!Q)return;g7(),rZ.set($,{conversationId:Q,updatedAt:Date.now()})}function j0(Z){let $=P3(Z.agentId),Q=P3(Z.toolName);if(!$||!Q)return;let X=Date.now(),Y=S0(Z.sessionKey),H=V5($,Y),V=p7(Y),J=wZ.get($)?.status,q=JZ.get(H)??{agentId:$,sessionKey:Y,conversationId:V,tools:[],updatedAt:X};if(q.updatedAt=X,V)q.conversationId=V;if(Z.phase==="start"){let D=m7(Q,Z.toolParams);if(q.tools.push({name:Q,activity:D}),JZ.set(H,q),DZ.set($,H),J!=="working")xZ.add($);AZ($,"working",{activeConversationId:V,activeTool:D},Z.config),console.log(`${a4} before_tool_call agent=${$} tool=${Q} activity="${D}" session=${Y??"-"} conv=${V??"-"} depth=${q.tools.length}`);return}let K=!1;for(let D=q.tools.length-1;D>=0;D-=1){if(q.tools[D]?.name!==Q)continue;q.tools.splice(D,1),K=!0;break}if(!K&&q.tools.length>0)q.tools.pop();if(q.tools.length===0){if(JZ.delete(H),DZ.get($)===H)R3($)}else JZ.set(H,q),DZ.set($,H);let B=DZ.get($)??R3($),O=B?JZ.get(B):void 0,L=O?.tools[O.tools.length-1];if(L)AZ($,"working",{activeConversationId:O?.conversationId,activeTool:L.activity},Z.config);else if(xZ.has($))xZ.delete($),AZ($,"idle",{activeTool:void 0,activeConversationId:void 0},Z.config);else AZ($,"working",{activeTool:z3,activeConversationId:O?.conversationId},Z.config);console.log(`${a4} after_tool_call agent=${$} tool=${Q} session=${Y??"-"} conv=${V??"-"} depth=${q.tools.length} next="${L?.activity??z3}" error=${Z.error?"yes":"no"}`)}function C3(Z){let $=P3(Z.agentId);if(!$)return;let Q=S0(Z.sessionKey);if(c7($,Q),!xZ.has($))return;xZ.delete($),AZ($,"idle",{activeConversationId:void 0,activeTool:void 0,errorMessage:Z.success===!1?Z.error:void 0},Z.config)}function l7(Z){let $=["token","apiKey","key","accessToken","refreshToken","secret"];for(let Q of $){let X=Z[Q];if(typeof X==="string"&&X.trim().length>0)return!0}return!1}function d7(Z,$){let Q=$?.trim().toLowerCase();if(!Q)return!1;let X=UZ.join(iZ.homedir(),".openclaw","agents",Z,"agent","auth-profiles.json");try{let Y=w0(X),H=F3.get(Z);if(H&&H.mtimeMs===Y.mtimeMs&&H.size===Y.size)return H.hasCredentialByProvider[Q]===!0;let V=j3(X,"utf8"),q=JSON.parse(V)?.profiles,K={};if(q&&typeof q==="object")for(let B of Object.values(q)){if(!B||typeof B!=="object")continue;let O=B,L=g(O.provider)?.toLowerCase();if(!L)continue;if(l7(O))K[L]=!0;else if(K[L]!==!0)K[L]=!1}return F3.set(Z,{mtimeMs:Y.mtimeMs,size:Y.size,hasCredentialByProvider:K}),K[Q]===!0}catch{return F3.delete(Z),!1}}function i7(Z,$){let Q=f7(Z),X=d7($,Z);if(!Q&&!X)return{};return{envName:Q,present:X}}function J5(Z,$){let Q=Z.agents,X=Q&&typeof Q.defaults==="object"&&Q.defaults?Q.defaults:{},H=(Array.isArray(Q?.list)?Q.list:[]).find((d)=>typeof d?.id==="string"&&d.id===$)??{},V=typeof H.model==="string"?H.model:typeof H.model?.primary==="string"?H.model.primary:typeof X.model?.primary==="string"?X.model.primary:void 0,J=typeof V==="string"?V.trim():"",q=b7(J),K=typeof H.workspace==="string"?H.workspace:typeof X.workspace==="string"?X.workspace:void 0,B=typeof K==="string"&&K.trim().length>0?K.trim():void 0,O=L5($),L=pZ(H.skills)??pZ(X.skills)??O?.skills,D=pZ(H.tools?.allow)??pZ(X.tools?.allow),U=pZ(H.tools?.deny)??pZ(X.tools?.deny),z=typeof H.contextTokens==="number"?H.contextTokens:X.contextTokens,N=typeof z==="number"&&Number.isFinite(z)?Math.max(0,Math.floor(z)):O?.contextTokens,_=typeof H.timeoutSeconds==="number"?H.timeoutSeconds:X.timeoutSeconds,T=typeof _==="number"&&Number.isFinite(_)?Math.max(0,Math.floor(_)):void 0,A=typeof H.maxConcurrent==="number"?H.maxConcurrent:X.maxConcurrent,p=typeof A==="number"&&Number.isFinite(A)?Math.max(0,Math.floor(A)):void 0,b=typeof H.typingMode==="string"?H.typingMode:X.typingMode,S=typeof b==="string"&&b.trim().length>0?b.trim():void 0,c=q.provider??O?.modelProvider,j=q.model??O?.model,E=B??O?.promptWorkspace,v=typeof N==="number"&&typeof O?.totalTokens==="number"?Math.max(0,N-Math.max(0,Math.floor(O.totalTokens))):void 0,W=typeof N==="number"&&N>0&&typeof O?.totalTokens==="number"?Math.min(1,Math.max(0,O.totalTokens/N)):void 0,m=i7(c,$),x=e7($,O),l={model:j,provider:c,workspace:E,skills:L,skillDetails:O?.skillDetails,toolsAllow:D,toolsDeny:U,contextTokens:N,contextRemainingTokens:v,contextUsageRatio:W,timeoutSeconds:T,maxConcurrent:p,typingMode:S,sessionId:O?.sessionId,sessionUpdatedAt:O?.updatedAt,sessionInputTokens:O?.inputTokens,sessionOutputTokens:O?.outputTokens,sessionTotalTokens:O?.totalTokens,usageEventCount:x?.usageEventCount,usageInputTokens:x?.usageInputTokens,usageOutputTokens:x?.usageOutputTokens,usageCacheReadTokens:x?.usageCacheReadTokens,usageCacheWriteTokens:x?.usageCacheWriteTokens,usageTotalTokens:x?.usageTotalTokens,usageTotalCostUsd:x?.usageTotalCostUsd,usageUpdatedAt:x?.usageUpdatedAt,historySessionCount:O?.historySessionCount,historyInputTokens:O?.historyInputTokens,historyOutputTokens:O?.historyOutputTokens,historyTotalTokens:O?.historyTotalTokens,historyUpdatedAt:O?.historyUpdatedAt,promptSource:O?.promptSource,promptGeneratedAt:O?.promptGeneratedAt,providerKeyEnv:m.envName,providerKeyPresent:m.present},n=q5(l);return l.accountStatus=n.status,l.accountStatusReason=n.reason,Object.values(l).some((d)=>d!==void 0)?l:void 0}function q5(Z){if(Z.providerKeyPresent===!1)return{status:"missing_credentials",reason:Z.providerKeyEnv?`No provider credentials detected (${Z.providerKeyEnv} not set)`:"No provider credentials detected"};if(Z.providerKeyPresent===!0)return{status:"ready",reason:"Provider credentials detected"};return{status:"unknown",reason:Z.provider?"Provider configured":"Provider unknown"}}function K5(Z,$,Q){if(!Z&&$!=="error")return Z;let X={...Z??{}};if($==="error")X.accountStatus="error",X.accountStatusReason=g(Q)??X.accountStatusReason??"Agent runtime error";else{let H=q5(X);X.accountStatus=H.status,X.accountStatusReason=H.reason}return Object.values(X).some((H)=>H!==void 0)?X:void 0}function C(Z){if(typeof Z!=="number"||!Number.isFinite(Z))return;return Z}function r7(Z){return typeof Z==="boolean"?Z:void 0}function g(Z){if(typeof Z!=="string")return;let $=Z.trim();return $.length>0?$:void 0}function s7(Z){if(!Z||typeof Z!=="object")return;let $=Z,Q=g($.name);if(!Q)return;return{name:Q,description:g($.description),source:g($.source),filePath:g($.filePath),baseDir:g($.baseDir),disableModelInvocation:r7($.disableModelInvocation)}}function O5(){return{eventCount:0,inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalTokens:0,totalCostUsd:0,updatedAt:0}}function o7(Z){return{eventCount:Math.max(0,Math.floor(Z?.usageEventCount??0)),inputTokens:Math.max(0,Math.floor(Z?.usageInputTokens??0)),outputTokens:Math.max(0,Math.floor(Z?.usageOutputTokens??0)),cacheReadTokens:Math.max(0,Math.floor(Z?.usageCacheReadTokens??0)),cacheWriteTokens:Math.max(0,Math.floor(Z?.usageCacheWriteTokens??0)),totalTokens:Math.max(0,Math.floor(Z?.usageTotalTokens??0)),totalCostUsd:Math.max(0,C(Z?.usageTotalCostUsd)??0),updatedAt:Math.max(0,Math.floor(Z?.usageUpdatedAt??0))}}function B5(Z){if(Z.eventCount<=0)return;return{usageEventCount:Z.eventCount,usageInputTokens:Z.inputTokens,usageOutputTokens:Z.outputTokens,usageCacheReadTokens:Z.cacheReadTokens,usageCacheWriteTokens:Z.cacheWriteTokens,usageTotalTokens:Z.totalTokens,usageTotalCostUsd:Number(Z.totalCostUsd.toFixed(6)),usageUpdatedAt:Z.updatedAt>0?Z.updatedAt:void 0}}function w3(Z){if(typeof Z==="number"&&Number.isFinite(Z)&&Z>0){if(Z>=1000000000000)return Math.floor(Z);if(Z>=1e9)return Math.floor(Z*1000);return Math.floor(Z)}if(typeof Z==="string"&&Z.trim().length>0){let $=Number(Z);if(Number.isFinite($)&&$>0)return w3($);let Q=Date.parse(Z);if(Number.isFinite(Q)&&Q>0)return Math.floor(Q)}return 0}function n7(Z){if(!Z.includes('"usage"'))return;try{let $=JSON.parse(Z),Q=$.message;if(!Q||typeof Q!=="object")return;let X=Q.usage;if(!X||typeof X!=="object")return;let Y=X,H=Math.max(0,Math.floor(C(Y.input)??C(Y.inputTokens)??C(Y.input_tokens)??0)),V=Math.max(0,Math.floor(C(Y.output)??C(Y.outputTokens)??C(Y.output_tokens)??0)),J=Math.max(0,Math.floor(C(Y.cacheRead)??C(Y.cacheReadTokens)??C(Y.cache_read_tokens)??0)),q=Math.max(0,Math.floor(C(Y.cacheWrite)??C(Y.cacheWriteTokens)??C(Y.cache_write_tokens)??0)),K=H+V+J+q,B=Math.max(0,Math.floor(C(Y.totalTokens)??C(Y.total_tokens)??K)),O=Y.cost,L=O&&typeof O==="object"?O:void 0,D=Math.max(0,C(Y.totalCostUsd)??C(Y.total_cost_usd)??C(L?.total)??0),U=Math.max(w3(Q.timestamp),w3($.timestamp));return{eventCount:1,inputTokens:H,outputTokens:V,cacheReadTokens:J,cacheWriteTokens:q,totalTokens:B,totalCostUsd:D,updatedAt:U}}catch{return}}function t7(Z,$){if(UZ.isAbsolute($))return $;return UZ.join(iZ.homedir(),".openclaw","agents",Z,"sessions",$)}function a7(Z){try{let $=w0(Z),Q=U3.get(Z);if(Q&&Q.mtimeMs===$.mtimeMs&&Q.size===$.size)return Q.totals;let X=j3(Z,"utf8"),Y=O5(),H=X.split(/\r?\n/);for(let J of H){let q=J.trim();if(!q)continue;let K=n7(q);if(!K)continue;Y.eventCount+=K.eventCount,Y.inputTokens+=K.inputTokens,Y.outputTokens+=K.outputTokens,Y.cacheReadTokens+=K.cacheReadTokens,Y.cacheWriteTokens+=K.cacheWriteTokens,Y.totalTokens+=K.totalTokens,Y.totalCostUsd+=K.totalCostUsd,Y.updatedAt=Math.max(Y.updatedAt,K.updatedAt)}let V=B5(Y);return U3.set(Z,{mtimeMs:$.mtimeMs,size:$.size,totals:V}),V}catch{U3.delete(Z);return}}function e7(Z,$){let Q=Date.now(),X=D3.get(Z);if(X&&Q-X.refreshedAt<M7)return X.totals;let Y=$?.sessionFiles??[];if(Y.length===0){D3.set(Z,{refreshedAt:Q,totals:void 0});return}let H=O5(),V=new Set;for(let q of Y){let K=q.trim();if(!K||V.has(K))continue;V.add(K);let B=t7(Z,K),O=a7(B);if(!O)continue;let L=o7(O);H.eventCount+=L.eventCount,H.inputTokens+=L.inputTokens,H.outputTokens+=L.outputTokens,H.cacheReadTokens+=L.cacheReadTokens,H.cacheWriteTokens+=L.cacheWriteTokens,H.totalTokens+=L.totalTokens,H.totalCostUsd+=L.totalCostUsd,H.updatedAt=Math.max(H.updatedAt,L.updatedAt)}let J=B5(H);return D3.set(Z,{refreshedAt:Q,totals:J}),J}function L5(Z){let $=UZ.join(iZ.homedir(),".openclaw","agents",Z,"sessions","sessions.json");try{let Q=w0($),X=cZ.get(Z);if(X&&X.mtimeMs===Q.mtimeMs&&X.size===Q.size)return X.summary;let Y=j3($,"utf8"),H=JSON.parse(Y);if(!H||typeof H!=="object"){cZ.set(Z,{mtimeMs:Q.mtimeMs,size:Q.size,summary:void 0});return}let V,J,q=0,K=`agent:${Z}:`,B=0,O=0,L=0,D=0,U=0,z=new Set;for(let[E,v]of Object.entries(H)){if(!E.startsWith(K))continue;if(!v||typeof v!=="object")continue;let W=v,m=g(W.sessionFile);if(m)z.add(m);let x=C(W.updatedAt)??0;if(B+=1,U=Math.max(U,x),O+=Math.max(0,C(W.inputTokens)??0),L+=Math.max(0,C(W.outputTokens)??0),D+=Math.max(0,C(W.totalTokens)??0),!J||x>=q)V=E,J=W,q=x}if(!J){cZ.set(Z,{mtimeMs:Q.mtimeMs,size:Q.size,summary:void 0});return}let N=J.skillsSnapshot,T=(Array.isArray(N?.skills)?N?.skills:[]).map((E)=>{if(typeof E==="string")return g(E);if(!E||typeof E!=="object")return;return g(E.name)}).filter((E)=>typeof E==="string"),p=(Array.isArray(N?.resolvedSkills)?N.resolvedSkills:[]).map((E)=>s7(E)).filter((E)=>!!E),b=p.map((E)=>E.name),S=T7([...T,...b]),c=J.systemPromptReport,j={sessionKey:V,sessionId:g(J.sessionId),updatedAt:C(J.updatedAt),modelProvider:g(J.modelProvider),model:g(J.model),contextTokens:C(J.contextTokens),inputTokens:C(J.inputTokens),outputTokens:C(J.outputTokens),totalTokens:C(J.totalTokens),skillsCount:S?.length,skills:S,skillDetails:p.length>0?p:void 0,historySessionCount:B>0?B:void 0,historyInputTokens:O>0?O:void 0,historyOutputTokens:L>0?L:void 0,historyTotalTokens:D>0?D:void 0,historyUpdatedAt:U>0?U:void 0,promptSource:g(c?.source),promptGeneratedAt:C(c?.generatedAt),promptWorkspace:g(c?.workspaceDir),sessionFiles:z.size>0?Array.from(z):void 0};return cZ.set(Z,{mtimeMs:Q.mtimeMs,size:Q.size,summary:j}),j}catch{cZ.delete(Z);return}}function Z8(Z,$,Q){let X=SZ(Z,$),Y=L5($),H=Y?{...Y,sessionFileCount:Y.sessionFiles?.length,sessionFiles:void 0}:null,V={agentId:$,display:X,configDetails:Q??null,sessionSummary:H},J=JSON.stringify(V);if(E3.get($)===J)return;E3.set($,J),console.log(`${u} [agent-details] ${JSON.stringify(V,null,2)}`)}function $8(Z,$){if(!$)return Z;if(Z.startsWith($))return Z;return`${$} ${Z}`.trim()}function Q8(Z,$){let Q=g(Z);if(Q)return Q.slice(0,96);return(($.split(/\r?\n/,1)[0]?.trim()??"")||"Agent Task").slice(0,96)}function X8(Z){if(typeof Z!=="number"||!Number.isFinite(Z))return 3600000;return Math.max(60000,Math.min(2592000000,Math.floor(Z)))}function E0(Z){if(!Z)return;let $=Z.trim();if(!$)return;if($.startsWith("conversation:"))return;if($.toLowerCase()==="conversation")return;return R($)}function Y8(Z){let $=Z.agents?.list;if(!Array.isArray($))return new Set;let Q=new Set;for(let X of $){if(!X||typeof X!=="object")continue;let Y=typeof X.id==="string"?X.id.trim():"";if(!Y)continue;Q.add(Y)}return Q}function D5(Z,$){if(!$)return;let Q=$.trim();if(!Q)return;if(Q.startsWith("conversation:"))return;if(Q.toLowerCase()==="conversation")return;if(Q.includes(":"))return;let X=Y8(Z);if(X.size>0&&!X.has(Q))return;return Q}function $5(Z,$){let Q=Z.split(":");if(Q.length<2||Q[0]!=="agent")return Z;return Q[1]=$,Q.join(":")}function Q5(Z){let $=Z.trim();if(!$)return 0;return Math.max(1,Math.ceil($.length/4))}function H8(Z){if(Z==="error")return"error";if(Z==="skipped")return"skipped";return"ok"}function X5(Z,$){return`${Z}:${$??Date.now()}`}function V8(Z){let $=Z.agents?.list??[];if(!Array.isArray($))return[];let Q=new Set,X=Date.now(),Y=[];for(let H of $){let V=H?.id??"unknown";Q.add(V);let J=lZ.get(V),q=wZ.get(V),K=SZ(Z,V),B=J5(Z,V)??q?.details,O=q?.status??"idle",L={agentId:V,name:K.name,emoji:K.emoji??q?.emoji,color:q?.color,details:K5(B,O,q?.errorMessage),status:O,activeConversationId:E0(q?.activeConversationId),activeTool:q?.activeTool,activeElapsedMs:q?.activeElapsedMs,activeTokens:q?.activeTokens,sessionTokensIn:J?.in??q?.sessionTokensIn??0,sessionTokensOut:J?.out??q?.sessionTokensOut??0,lastActivityAt:q?.lastActivityAt??X,errorMessage:q?.errorMessage};wZ.set(V,L),Z8(Z,V,L.details),Y.push(L)}for(let H of Array.from(wZ.keys()))if(!Q.has(H))wZ.delete(H);return Y}function C0(Z){return V8(Z)}function AZ(Z,$,Q,X){let Y=!!Q&&Object.prototype.hasOwnProperty.call(Q,"activeConversationId"),H=!!Q&&Object.prototype.hasOwnProperty.call(Q,"activeTool"),V=!!Q&&Object.prototype.hasOwnProperty.call(Q,"activeTokens"),J=wZ.get(Z),q=lZ.get(Z),K=Date.now(),B=J?.name??(X?x7(X,Z):Z||"Assistant"),O=J?.emoji??(X?h7(X,Z):void 0),L=J?.details??(X?J5(X,Z):void 0),D=Q?.errorMessage??J?.errorMessage,U={agentId:Z,name:B,emoji:O,color:J?.color,details:K5(L,$,D),status:$,activeConversationId:Y?E0(Q?.activeConversationId):E0(J?.activeConversationId),activeTool:H?Q?.activeTool:J?.activeTool,activeElapsedMs:Q?.activeElapsedMs,activeTokens:V?Q?.activeTokens:J?.activeTokens,sessionTokensIn:q?.in??J?.sessionTokensIn??0,sessionTokensOut:q?.out??J?.sessionTokensOut??0,lastActivityAt:K,errorMessage:Q?.errorMessage};if($==="working"){if(!U.activeConversationId)U.activeConversationId=E0(J?.activeConversationId);if(!H&&!U.activeTool)U.activeTool=J?.activeTool;if(!V&&U.activeTokens===void 0)U.activeTokens=J?.activeTokens}else U.activeConversationId=void 0,U.activeTool=void 0,U.activeTokens=void 0;if($!=="error"&&Q?.errorMessage===void 0)U.errorMessage=void 0;wZ.set(Z,U),k({type:"agent_status",agentId:U.agentId,status:U.status,color:U.color,details:U.details,activeConversationId:U.activeConversationId,activeTool:U.activeTool,activeElapsedMs:U.activeElapsedMs,activeTokens:U.activeTokens,sessionTokensIn:U.sessionTokensIn,sessionTokensOut:U.sessionTokensOut,lastActivityAt:U.lastActivityAt,errorMessage:U.errorMessage})}function J8(Z){if(Z&&typeof Z==="object"){let $=Z;if($.kind==="at"&&typeof $.at==="string")return{kind:"at",at:$.at};if($.kind==="every"&&typeof $.everyMs==="number")return{kind:"every",everyMs:Math.max(1,Math.floor($.everyMs))};if($.kind==="cron"&&typeof $.expr==="string")return{kind:"cron",expr:$.expr,tz:typeof $.tz==="string"?$.tz:void 0}}return{kind:"every",everyMs:60000}}function U5(Z,$){return Z.map((Q)=>{let X=typeof Q.agentId==="string"&&Q.agentId.trim()?Q.agentId:void 0,Y=X?SZ($,X):void 0,H=Q.sessionTarget==="isolated"?"isolated":"main",V=Q.payload?.kind==="agentTurn"?"agentTurn":"systemEvent",J={id:Q.id,agentId:X,agentName:Y?.name,agentEmoji:Y?.emoji,name:Q.name??Q.id,enabled:Q.enabled!==!1,schedule:J8(Q.schedule),sessionTarget:H,payloadKind:V,lastRunAt:Q.state?.lastRunAtMs,lastRunStatus:Q.state?.lastStatus,lastRunDurationMs:Q.state?.lastDurationMs,lastRunSummary:void 0,nextRunAt:Q.state?.nextRunAtMs,isRunning:!!Q.state?.runningAtMs,runningElapsedMs:Q.state?.runningAtMs?Date.now()-Q.state.runningAtMs:void 0,runningTokens:void 0};return N0({id:J.id,name:J.name,agentId:J.agentId,agentName:J.agentName,agentEmoji:J.agentEmoji,enabled:J.enabled,updatedAt:Date.now(),lastSeenAt:Date.now(),deletedAt:void 0}),J})}function MZ(Z,$={}){let Q=Date.now(),X=$.includeDisabled??!0,Y=$.force===!0,H=g0(Z),V=X?H:H.filter((K)=>K.enabled!==!1),J=U5(V,Z),q=JSON.stringify(J.map((K)=>({id:K.id,agentId:K.agentId,name:K.name,enabled:K.enabled,schedule:K.schedule,sessionTarget:K.sessionTarget,payloadKind:K.payloadKind,lastRunAt:K.lastRunAt,lastRunStatus:K.lastRunStatus,isRunning:K.isRunning,runningTokens:K.runningTokens})));if(q===Z5){if(!Y)return;if(Q-L3<j7)return}if(!Y){if(Q-L3<S7)return}Z5=q,L3=Q,K3(J.map((K)=>K.id)),k({type:"cron_list",jobs:J})}function q8(Z){let $=g0(Z),Q=U5($,Z);return K3(Q.map((X)=>X.id)),{jobs:Q}}function Y5(Z,$){let Q=typeof $?.sinceTimestampMs==="number"&&Number.isFinite($.sinceTimestampMs)?$.sinceTimestampMs:void 0,X=typeof $?.stateBornAt==="number"&&Number.isFinite($.stateBornAt)?$.stateBornAt:void 0,Y=typeof $?.globalRevision==="number"&&Number.isFinite($.globalRevision)?$.globalRevision:void 0,H=o0({sinceTimestampMs:Q,stateBornAt:X,globalRevision:Y,conversations:$?.conversations,fallbackAgents:C0(Z),fallbackCronJobs:q8(Z).jobs});if(H.mode==="snapshot"){k({type:"state_snapshot",state:H.state},{record:!1});return}k({type:"state_delta",state:H.state,sinceTimestampMs:Q},{record:!1})}function K8(Z,$){if($.action==="started")k({type:"cron_run_started",jobId:$.jobId,runId:X5($.jobId,$.runAtMs)});else if($.action==="finished")k({type:"cron_run_finished",jobId:$.jobId,runId:X5($.jobId,$.runAtMs),status:H8($.status),durationMs:$.durationMs??0,summary:$.summary,error:$.error});MZ(Z,{includeDisabled:!0})}function O8(Z){if(H0)return;H0=g3(Z,($)=>{K8(Z,$)})}function B8(){if(H0)H0(),H0=null}async function L8(Z){let{envelope:$,accountId:Q,config:X,core:Y,logger:H}=Z,V=X,J=R($.conversationId);X4({...$,conversationId:J});let q=Y.channel.routing.resolveAgentRoute({cfg:V,channel:"botmobile",accountId:Q,peer:{kind:"dm",id:J}}),K=D5(V,$.agentId);if($.agentId&&!K)H.info(`${u} ignoring invalid agent override "${$.agentId}" for conv=${J}`);if(K&&K!==q.agentId)q={...q,agentId:K,sessionKey:$5(q.sessionKey,K),mainSessionKey:$5(q.mainSessionKey,K)};M3({sessionKey:q.sessionKey,conversationId:J}),M3({sessionKey:q.mainSessionKey,conversationId:J});let B=SZ(V,q.agentId);F0(J,{id:q.agentId,name:B.name,emoji:B.emoji},$.timestamp);let O=$8(B.name,B.emoji);if(N3.get(J)!==O)N3.set(J,O),k({type:"conversation_list",conversations:[{id:J,name:O,createdAt:$.timestamp,lastActivity:$.timestamp}]});let D=[];if($.pendingAttachments&&LZ?.fileReceiver)for(let P of $.pendingAttachments){let f=LZ.fileReceiver.getFilePath(P.transferId);if(f)D.push({fileName:P.fileName,mimeType:P.mimeType,filePath:f});else H.error(`${u} attachment ${P.transferId} (${P.fileName}) not found on disk`)}let U=$.body;if(D.length>0){let P=D.map((f)=>`[Attached: ${f.fileName} — file://${f.filePath}]`);U=U?`${U}
8
+ `)).filter((V)=>V.startsWith("a=ice-")||V.startsWith("a=fingerprint")||V.startsWith("a=setup")||V.startsWith("m="));if(console.log(`${_} SDP ice-relevant lines: ${H.join(" | ")}`),X.setRemoteDescription?.(Q,"offer"),this.remoteDescriptionApplied=!0,console.log(`${_} setRemoteDescription success`),Array.isArray(Z.iceCandidates))for(let V of Z.iceCandidates)this.enqueuePendingRemoteCandidate(V,this.currentSessionId??void 0);this.flushPendingRemoteCandidates(),X.setLocalDescription?.(),console.log(`${_} setLocalDescription (answer) triggered`)}catch(Y){console.error(`${_} offer processing failed: ${String(Y)}`),this.sendSignal({type:"error",requestId:$,code:"OFFER_PROCESS_FAILED",message:String(Y)},{queueIfClosed:!0})}}async ensurePeerConnection(Z){if(this.peerConnection)return this.peerConnection;let $=await Y7(),Q={iceServers:V7(Z)},X=new $.PeerConnection(`botmobile-${Date.now()}`,Q);this.peerConnection=X,this.dataChannelDisconnectedAt=Date.now(),this.awaitingStateSyncRequest=!0;let Y=[],H=null,V=this.currentOfferRequestId,J=this.currentSessionId,q=()=>{if(this.answerGatherTimer)clearTimeout(this.answerGatherTimer),this.answerGatherTimer=null;if(this.peerConnection!==X)return;if(!H)return;let K=H;H=null,console.log(`${_} sending answer with ${Y.length} bundled candidates`),this.sendSignal({type:"answer",requestId:V,sessionId:J,sdp:K,iceCandidates:Y.slice()},{queueIfClosed:!0})};return X.onLocalDescription?.((K,B)=>{if(this.peerConnection!==X)return;if(console.log(`${_} onLocalDescription type=${B} sdp_len=${K?.length??0} requestId=${V} wsOpen=${this.signalingWs?.readyState===uZ.OPEN}`),B!=="answer")return;H=K,this.answerGatherTimer=setTimeout(q,e6)}),X.onLocalCandidate?.((K,B)=>{if(this.peerConnection!==X)return;if(!K)return;if(H)Y.push({candidate:K,sdpMid:B});else this.sendSignal({type:"ice",sessionId:this.currentSessionId,candidate:{candidate:K,sdpMid:B}},{queueIfClosed:!0})}),X.onStateChange?.((K)=>{if(this.peerConnection!==X)return;if(K==="failed"||K==="closed"||K==="disconnected"){if(this.onDataChannelStatus?.(!1),this.dataChannelDisconnectedAt===null)this.dataChannelDisconnectedAt=Date.now();this.clientIsForeground=!1,this.clientStateUpdatedAt=Date.now()}}),X.onDataChannel?.((K)=>{if(this.peerConnection!==X)return;console.log(`${_} onDataChannel fired — received remote data channel`),this.attachDataChannel(K)}),X}attachDataChannel(Z){if(console.log(`${_} attachDataChannel called`),this.dataChannel&&this.dataChannel!==Z)try{this.dataChannel.close?.()}catch{}this.dataChannel=Z,Z.onOpen?.(()=>{if(this.dataChannel!==Z)return;console.log(`${_} dataChannel onOpen fired`),this.onDataChannelStatus?.(!0),this.dataChannelDisconnectedAt=null,this.clientIsForeground=!0,this.clientStateUpdatedAt=Date.now(),this.awaitingStateSyncRequest=!0,this.startHeartbeatLoop(),this.sendHeartbeat("ping")}),Z.onClosed?.(()=>{if(this.dataChannel!==Z)return;if(console.log(`${_} dataChannel onClosed fired`),this.dataChannel=null,this.onDataChannelStatus?.(!1),this.stopHeartbeatLoop(),this.dataChannelDisconnectedAt===null)this.dataChannelDisconnectedAt=Date.now();this.clientIsForeground=!1,this.clientStateUpdatedAt=Date.now()}),Z.onError?.(($)=>{if(this.dataChannel!==Z)return;console.error(`${_} datachannel error: ${String($)}`),this.dataChannel=null}),Z.onMessage?.(($)=>{if(this.dataChannel!==Z)return;let Q=$===null?"null":typeof $==="object"?$.constructor?.name??"object":typeof $,X=Buffer.isBuffer($)?$.length:$ instanceof ArrayBuffer?$.byteLength:ArrayBuffer.isView($)?$.byteLength:typeof $==="string"?$.length:-1;console.log(`${_} dataChannel onMessage: type=${Q} len=${X}`),this.handleDataChannelMessage($)})}handleDataChannelMessage(Z){let $;if(Buffer.isBuffer(Z))$=Z;else if(typeof Z==="string")$=Buffer.from(Z,"binary");else if(Z instanceof ArrayBuffer)$=Buffer.from(Z);else if(ArrayBuffer.isView(Z))$=Buffer.from(Z.buffer,Z.byteOffset,Z.byteLength);else return;let Q;try{Q=S4($);let Y=X0(Q.type);if(Q.type!==F.heartbeat)console.log(`${_} ◀ RECV ${Y} ${y4(Q.type,Q.payload)}`)}catch(Y){console.error(`${_} wire decode failed: ${String(Y)} hex=${$.subarray(0,32).toString("hex")}`),this.sendWire(F.error,{code:"INVALID_WIRE_ENVELOPE",message:String(Y)});return}if(this.lastHeartbeatReceivedAt=Date.now(),Q.type===F.heartbeat){this.handleHeartbeatPayload(Q.payload);return}if(Q.type===F.fileChunk){this.ensureFileReceiver().handleChunk(Q.payload);return}let X=j4(Q);if(X.kind==="ignore")return;if(X.kind==="command")this.sendWire(F.commandAck,{commandId:X.commandId,ok:!0});if(X.envelope.type==="client_state")this.clientIsForeground=X.envelope.isForeground===!0,this.clientStateUpdatedAt=Date.now(),console.log(`${_} client_state foreground=${this.clientIsForeground} tab=${X.envelope.activeTab??"unknown"} conv=${X.envelope.activeConversationId??"none"}`);if(this.onLegacyEnvelope(X.envelope),X.envelope.type==="state_sync_request")this.resyncRequired=!1,this.awaitingStateSyncRequest=!1,this.flushOutboundQueue()}handleRemoteIce(Z){if(!this.currentSessionId)return;let $=w(Z.sessionId);if($&&$!==this.currentSessionId)return;if(!this.peerConnection||!this.remoteDescriptionApplied){this.enqueuePendingRemoteCandidate(Z.candidate,$??void 0);return}this.addRemoteCandidate(Z.candidate)}enqueuePendingRemoteCandidate(Z,$){if(this.pendingRemoteCandidates.length>=128)this.pendingRemoteCandidates.shift();this.pendingRemoteCandidates.push({sessionId:$,candidate:Z})}addRemoteCandidate(Z){let $=H7(Z);if(!$)return;try{this.peerConnection?.addRemoteCandidate?.($.candidate,$.sdpMid)}catch(Q){console.warn(`${_} addRemoteCandidate failed: ${String(Q)}`)}}flushPendingRemoteCandidates(){if(!this.peerConnection||!this.currentSessionId||this.pendingRemoteCandidates.length===0)return;let Z=this.pendingRemoteCandidates;this.pendingRemoteCandidates=[];for(let $ of Z){if($.sessionId&&$.sessionId!==this.currentSessionId)continue;this.addRemoteCandidate($.candidate)}}enqueuePendingSignal(Z){if(this.pendingSignalQueue.length>=Z7)this.pendingSignalQueue.shift();this.pendingSignalQueue.push(Z)}flushPendingSignalQueue(){if(!this.signalingWs||this.signalingWs.readyState!==uZ.OPEN)return;if(this.pendingSignalQueue.length>0)console.log(`${_} flushing queued signaling messages count=${this.pendingSignalQueue.length}`);while(this.pendingSignalQueue.length>0){let Z=this.pendingSignalQueue[0];try{this.signalingWs.send(JSON.stringify(Z)),this.pendingSignalQueue.shift()}catch($){console.warn(`${_} signaling queued send failed: ${String($)}`);return}}}sendSignal(Z,$={}){let Q=String(Z.type??"unknown"),X=typeof Z.requestId==="string"?Z.requestId:void 0,Y=typeof Z.code==="string"?Z.code:void 0,H=typeof Z.message==="string"?Z.message:void 0,V=Q==="error"?` requestId=${X??"n/a"} code=${Y??"n/a"} message=${H??"n/a"}`:"";if(!this.signalingWs||this.signalingWs.readyState!==uZ.OPEN){if($.queueIfClosed)this.enqueuePendingSignal(Z),console.warn(`${_} sendSignal queued type=${Q}${V} readyState=${this.signalingWs?.readyState??"null"}`);else console.warn(`${_} sendSignal DROPPED type=${Q}${V} readyState=${this.signalingWs?.readyState??"null"}`);return!1}try{return console.log(`${_} sendSignal type=${Q}${V}`),this.signalingWs.send(JSON.stringify(Z)),!0}catch(J){if($.queueIfClosed)this.enqueuePendingSignal(Z);return console.warn(`${_} signaling send failed: ${String(J)}`),!1}}sendWire(Z,$){if(this.shouldDropSnapshot(Z,$))return;let Q=X0(Z);if(Z!==F.heartbeat)console.log(`${_} ▶ SEND ${Q} ${y4(Z,$)}`);let X={type:Z,seq:this.outboundSeq++,ts:Date.now(),payload:$},Y=w4(X),H=Z===F.heartbeat||Z===F.error;if(this.dataChannel!==null&&(!this.awaitingStateSyncRequest||H)&&this.trySendDataChannelBytes(Y)){this.maybeTriggerPush(Z,$);return}if(Z===F.heartbeat)return;if(this.resyncRequired&&Z!==F.error)return;this.enqueueOutbound({bytes:Y,type:Z,payload:$}),this.maybeTriggerPush(Z,$)}trySendDataChannelBytes(Z){let $=this.dataChannel;if(!$)return console.log(`${_} trySend: no dataChannel`),!1;try{if(typeof $.sendMessageBinary==="function")return $.sendMessageBinary(Z),console.log(`${_} trySend: sendMessageBinary ${Z.length}B ok`),!0;if(typeof $.sendMessage==="function")return $.sendMessage(Z),console.log(`${_} trySend: sendMessage ${Z.length}B ok`),!0;if(typeof $.send==="function")return $.send(Z),console.log(`${_} trySend: send ${Z.length}B ok`),!0}catch(Q){return console.error(`${_} trySend error: ${String(Q)}`),!1}return console.warn(`${_} trySend: no send method available on channel`),!1}enqueueOutbound(Z){let $=Z.bytes.byteLength;if($>b4){this.markResyncRequired("Outbound item exceeded queue byte limit; full sync required.");return}if(this.isSnapshotWireType(Z.type)){let X=this.outboundQueue.findIndex((Y)=>Y.type===Z.type);if(X>=0){let Y=this.outboundQueue[X];this.outboundQueue[X]=Z,this.outboundQueueBytes=Math.max(0,this.outboundQueueBytes-Y.bytes.byteLength+$);return}}let Q=!1;while(this.outboundQueue.length>=d6||this.outboundQueueBytes+$>b4){let X=this.outboundQueue.findIndex((J)=>!this.isSnapshotWireType(J.type)),Y=X>=0?X:0,V=this.outboundQueue.splice(Y,1)[0];if(!V)break;this.outboundQueueBytes=Math.max(0,this.outboundQueueBytes-V.bytes.byteLength),Q=!0}if(Q){this.markResyncRequired("Outbound queue overflowed; full sync required.");return}this.outboundQueue.push(Z),this.outboundQueueBytes+=$}markResyncRequired(Z){if(this.resyncRequired)return;this.resyncRequired=!0,this.awaitingStateSyncRequest=!0,this.outboundQueue=[],this.outboundQueueBytes=0,this.sendWire(F.error,{code:"RESYNC_REQUIRED",message:Z})}flushOutboundQueue(){if(!this.dataChannel)return;if(this.awaitingStateSyncRequest)return;while(this.outboundQueue.length>0){let Z=this.outboundQueue[0];if(!this.trySendDataChannelBytes(Z.bytes))return;this.outboundQueue.shift(),this.outboundQueueBytes=Math.max(0,this.outboundQueueBytes-Z.bytes.byteLength)}}isSnapshotWireType(Z){return Z===F.snapshotAgents||Z===F.snapshotCron||Z===F.snapshotConversations}snapshotSignature(Z,$){if(!this.isSnapshotWireType(Z)||!$||typeof $!=="object")return null;let Q=$;if(Z===F.snapshotAgents)return JSON.stringify({agents:this.normalizeSnapshotValue(Array.isArray(Q.agents)?Q.agents:[])});if(Z===F.snapshotCron)return JSON.stringify({cronJobs:this.normalizeCronJobsForSignature(Q.cronJobs)});if(Z===F.snapshotConversations)return JSON.stringify({conversations:this.normalizeSnapshotValue(Array.isArray(Q.conversations)?Q.conversations:[])});return null}normalizeSnapshotValue(Z){if(Array.isArray(Z))return Z.map((Y)=>this.normalizeSnapshotValue(Y));if(!Z||typeof Z!=="object")return Z;let $=Z,Q={},X=Object.keys($).sort();for(let Y of X){if(Y==="timestamp"||Y==="lastUpdated"||Y==="runningElapsedMs"||Y==="nextRunAt")continue;Q[Y]=this.normalizeSnapshotValue($[Y])}return Q}normalizeCronJobsForSignature(Z){if(!Array.isArray(Z))return[];let $=[];for(let Q of Z){if(!Q||typeof Q!=="object")continue;let X=Q;$.push({id:this.normalizeSnapshotValue(X.id),name:this.normalizeSnapshotValue(X.name),enabled:X.enabled===!0,isRunning:X.isRunning===!0,agentId:this.normalizeSnapshotValue(X.agentId),agentName:this.normalizeSnapshotValue(X.agentName),agentEmoji:this.normalizeSnapshotValue(X.agentEmoji),schedule:this.normalizeSnapshotValue(X.schedule),lastRunAt:this.normalizeSnapshotValue(X.lastRunAt),lastRunStatus:this.normalizeSnapshotValue(X.lastRunStatus),lastRunSummary:this.normalizeSnapshotValue(X.lastRunSummary)})}return $.sort((Q,X)=>String(Q.id??"").localeCompare(String(X.id??""))),$}shouldDropSnapshot(Z,$){let Q=this.snapshotSignature(Z,$);if(!Q)return!1;let X=Date.now(),Y=this.lastSnapshotSignatureByType.get(Z),H=this.lastSnapshotSentAtByType.get(Z)??0;if(Z===F.snapshotCron&&H>0&&X-H<Q7)return!0;if(Y===Q&&X-H<$7)return!0;return this.lastSnapshotSignatureByType.set(Z,Q),this.lastSnapshotSentAtByType.set(Z,X),!1}streamKey(Z,$){return`${Z}:${$}`}handleLegacyStreamStart(Z){let $=this.streamKey(Z.conversationId,Z.messageId);this.streamTextByMessageId.set($,"");let Q=this.pendingStreamBatches.get($);if(Q?.timer)clearTimeout(Q.timer);this.pendingStreamBatches.delete($)}handleLegacyStreamToken(Z){if(!Z.token)return;let $=this.streamKey(Z.conversationId,Z.messageId),Q=this.streamTextByMessageId.get($)??"";this.streamTextByMessageId.set($,Q+Z.token);let X=this.pendingStreamBatches.get($);if(X){X.tokens+=Z.token;return}let Y={conversationId:Z.conversationId,messageId:Z.messageId,offset:Q.length,tokens:Z.token,timer:null};Y.timer=setTimeout(()=>{this.flushStreamBatch($)},s6),this.pendingStreamBatches.set($,Y)}handleLegacyStreamEnd(Z){let $=this.streamKey(Z.conversationId,Z.messageId);this.flushStreamBatch($);let Q=this.streamTextByMessageId.get($)??"",X=Z.body&&Z.body.length>0?Z.body:Q;this.streamTextByMessageId.delete($),this.pendingStreamBatches.delete($),this.sendWire(F.streamEnd,{conversationId:Z.conversationId,messageId:Z.messageId,finalContent:X})}flushStreamBatch(Z){let $=this.pendingStreamBatches.get(Z);if(!$)return;if($.timer)clearTimeout($.timer),$.timer=null;if($.tokens.length>0)this.sendWire(F.streamBatch,{conversationId:$.conversationId,messageId:$.messageId,offset:$.offset,tokens:$.tokens});this.pendingStreamBatches.delete(Z)}flushAllStreamBatches(){for(let Z of Array.from(this.pendingStreamBatches.keys()))this.flushStreamBatch(Z)}sendHeartbeat(Z,$){console.log(`${_} sendHeartbeat kind=${Z}`),this.sendWire(F.heartbeat,{kind:Z,sentAt:$??Date.now()})}handleHeartbeatPayload(Z){let $=w(Z.kind),Q=Z.sentAt,X=typeof Q==="number"&&Number.isFinite(Q)?Q:typeof Q==="bigint"?Number(Q):Date.now();if($==="ping"){this.sendHeartbeat("pong",X);return}if($==="pong"){this.lastHeartbeatRttMs=Math.max(0,Date.now()-X);return}}startHeartbeatLoop(){this.stopHeartbeatLoop(),this.lastHeartbeatReceivedAt=Date.now(),this.heartbeatInterval=setInterval(()=>{if(!this.dataChannel)return;if(Date.now()-this.lastHeartbeatReceivedAt>n6){console.warn(`${_} heartbeat stale (rtt=${this.lastHeartbeatRttMs??-1}ms), closing peer`),this.closePeerConnection(),this.onDataChannelStatus?.(!1),this.dataChannelDisconnectedAt=Date.now(),this.clientIsForeground=!1,this.clientStateUpdatedAt=Date.now();return}this.sendHeartbeat("ping")},o6)}stopHeartbeatLoop(){if(this.heartbeatInterval)clearInterval(this.heartbeatInterval),this.heartbeatInterval=null}pushPriority(Z){if(Z===F.error)return 5;if(Z===F.streamEnd)return 4;if(Z===F.conversationDelta)return 3;if(Z===F.agentStatus)return 1;return 0}queuePushTrigger(Z,$){let Q=this.pushPriority(Z),X=this.pendingPushRequest;if(!X||Q>=X.priority)this.pendingPushRequest={type:Z,pushInfo:$,priority:Q};if(this.pendingPushTimer)return;this.pendingPushTimer=setTimeout(()=>{this.flushPendingPush()},r6)}async flushPendingPush(){this.pendingPushTimer=null;let Z=this.pendingPushRequest;if(this.pendingPushRequest=null,!Z)return;let $=Date.now(),Q=$-this.lastPushSentAt;if(Q<f4){this.pendingPushRequest=Z,this.pendingPushTimer=setTimeout(()=>{this.flushPendingPush()},f4-Q);return}this.lastPushSentAt=$;try{let X=await fetch(`${this.account.workerUrl}/api/push`,{method:"POST",headers:{"content-type":"application/json",authorization:`BotMobilePush ${this.account.pushSecret}`},body:JSON.stringify(Z.pushInfo)});if(!X.ok){let H=(await X.text().catch(()=>"")).trim();console.warn(`${_} push trigger failed status=${X.status}${H?` body=${H.slice(0,200)}`:""}`)}else console.log(`${_} push triggered type=${X0(Z.type)} foreground=${this.clientIsForeground??"unknown"} stateAgeMs=${$-this.clientStateUpdatedAt}`)}catch(X){console.warn(`${_} push trigger error=${String(X)}`)}}async maybeTriggerPush(Z,$){let Q=this.pushInfoForEvent(Z,$);if(!Q)return;if(!this.account.pushSecret||this.account.pushSecret.trim().length===0)return;let X=Date.now(),Y=this.dataChannelDisconnectedAt!==null?X-this.dataChannelDisconnectedAt:null,H=Y!==null&&Y>=i6;if(this.clientIsForeground!==!1&&!H){console.log(`${_} push skipped type=${X0(Z)} foreground=${this.clientIsForeground??"unknown"} disconnectedForMs=${Y??-1}`);return}this.queuePushTrigger(Z,Q)}normalizedPushAgentName(Z){if(typeof Z!=="string")return null;let $=Z.trim();if(!$)return null;if($.toLowerCase().startsWith("conversation:"))return null;return $}pushTitleForConversation(Z,$){let Q=this.normalizedPushAgentName($);if(Q)return Q;if(Z){let X=o0(Z),Y=this.normalizedPushAgentName(X?.agent?.name);if(Y)return Y}return"Assistant"}pushInfoForEvent(Z,$){if(Z===F.error){let Q=$;return{title:"BotMobile error",body:w(Q.message)??"An error occurred",data:{conversationId:w(Q.conversationId)??""}}}if(Z===F.agentStatus){let Q=$;if(Q.isRunning===!1)return{title:"Agent update",body:"An agent run finished while you were away.",data:{agentId:w(Q.id)??""}}}if(Z===F.conversationDelta){let Q=$,X=w(Q.id)??"",Y=Q.agent;if(Array.isArray(Q.messages)&&Q.messages.length>0){let H=Q.messages[Q.messages.length-1];if(H.role==="bot"){let V=w(H.content)??"",J=V.length>120?V.slice(0,120)+"…":V;return{title:this.pushTitleForConversation(X,Y?.name),body:J||"You have a new message.",data:{conversationId:X}}}}}if(Z===F.streamEnd){let Q=$,X=w(Q.conversationId)??"",Y=w(Q.finalContent)??"",H=Y.length>120?Y.slice(0,120)+"…":Y;return{title:this.pushTitleForConversation(X),body:H||"You have a new message.",data:{conversationId:X}}}return null}ensureFileReceiver(){if(!this._fileReceiver)this._fileReceiver=new Y3((Z,$)=>{this.sendWire(Z,$)});return this._fileReceiver}closePeerConnection(){if(this.answerGatherTimer)clearTimeout(this.answerGatherTimer),this.answerGatherTimer=null;this.stopHeartbeatLoop(),this.flushAllStreamBatches();try{this.dataChannel?.close?.()}catch{}try{this.peerConnection?.close?.()}catch{}this.dataChannel=null,this.peerConnection=null,this.remoteDescriptionApplied=!1,this.currentSessionId=null,this.currentOfferRequestId=null,this.pendingRemoteCandidates=[],this.awaitingStateSyncRequest=!0,this.lastSnapshotSignatureByType.clear(),this.lastSnapshotSentAtByType.clear()}cleanup(){if(this.pendingPushTimer)clearTimeout(this.pendingPushTimer),this.pendingPushTimer=null;if(this.stopSignalingHeartbeat(),this.pendingPushRequest=null,this.closePeerConnection(),this.pendingSignalQueue=[],this.streamTextByMessageId.clear(),this.pendingStreamBatches.clear(),this.lastSnapshotSignatureByType.clear(),this.lastSnapshotSentAtByType.clear(),this._fileReceiver)this._fileReceiver.dispose(),this._fileReceiver=null;if(this.signalingWs){try{this.signalingWs.close()}catch{}this.signalingWs=null}this.onSignalingStatus?.(!1),this.onDataChannelStatus?.(!1)}}var _="[botmobile:webrtc]",l6=30000,T4=1000,d6=1000,b4=10485760,f4=1000,i6=5000,r6=600,s6=50,o6=15000,n6=45000,t6=15000,a6=45000,e6=500,Z7=256,$7=2000,Q7=1e4,W0=null,I4=!1;var u4=KZ(()=>{C4();Q0();h4()});import V3 from"node:fs";import D7 from"node:os";import m4 from"node:path";function VZ(Z){if(typeof Z!=="string")return null;let $=Z.trim().toLowerCase();return $.length>0?$:null}function mZ(Z){if(typeof Z!=="string")return;let $=Z.trim();return $.length>0?$:void 0}function N0(Z){if(typeof Z!=="string")return;let $=Z.trim();return $.length>0?$:void 0}function gZ(Z){if(typeof Z==="number"&&Number.isFinite(Z)&&Z>0)return Math.floor(Z);return Date.now()}function F7(){try{V3.mkdirSync(v4,{recursive:!0})}catch(Z){console.warn(`${g4} failed creating state dir ${v4}: ${String(Z)}`)}}function _7(Z){i.version=J3,i.updatedAt=typeof Z.updatedAt==="number"&&Number.isFinite(Z.updatedAt)?Math.max(0,Math.floor(Z.updatedAt)):0,i.agents={};for(let[$,Q]of Object.entries(Z.agents??{})){let X=VZ($)??VZ(Q.id),Y=mZ(Q.name);if(!X||!Y)continue;i.agents[X]={id:X,name:Y,emoji:N0(Q.emoji),updatedAt:gZ(Q.updatedAt)}}i.cronJobs={};for(let[$,Q]of Object.entries(Z.cronJobs??{})){let X=VZ($)??VZ(Q.id);if(!X)continue;let Y=VZ(Q.agentId??void 0)??void 0;i.cronJobs[X]={id:X,name:mZ(Q.name),agentId:Y,agentName:mZ(Q.agentName),agentEmoji:N0(Q.agentEmoji),enabled:typeof Q.enabled==="boolean"?Q.enabled:void 0,updatedAt:gZ(Q.updatedAt),lastSeenAt:typeof Q.lastSeenAt==="number"&&Number.isFinite(Q.lastSeenAt)?Math.max(0,Math.floor(Q.lastSeenAt)):void 0,deletedAt:typeof Q.deletedAt==="number"&&Number.isFinite(Q.deletedAt)?Math.max(0,Math.floor(Q.deletedAt)):void 0}}}function G7(){p4=!0;try{let Z=V3.readFileSync(z0,"utf8"),$=JSON.parse(Z);if(!$||typeof $!=="object")return;if($.version!==J3)return;_7($)}catch{}}function kZ(){if(p4)return;G7()}function c4(){if(!CZ)return;if(vZ)return;vZ=setTimeout(()=>{vZ=null,l4()},U7)}function l4(){if(kZ(),!CZ)return;F7(),i.updatedAt=Date.now();try{let Z=JSON.stringify(i,null,2);V3.writeFileSync(z0,`${Z}
9
+ `,"utf8"),CZ=!1}catch(Z){console.warn(`${g4} failed writing state ${z0}: ${String(Z)}`)}}function d4(){CZ=!0,c4()}function i4(){kZ()}function r4(){if(vZ)clearTimeout(vZ),vZ=null;l4()}function s4(Z){kZ();let $=VZ(Z.id),Q=mZ(Z.name);if(!$||!Q)return;let X=i.agents[$],Y={id:$,name:Q,emoji:N0(Z.emoji)??X?.emoji,updatedAt:gZ(Z.updatedAt)};if(!(!X||X.name!==Y.name||X.emoji!==Y.emoji||X.updatedAt!==Y.updatedAt))return;i.agents[$]=Y,d4()}function o4(Z){kZ();let $=VZ(Z);if(!$)return;return i.agents[$]}function E0(Z){kZ();let $=VZ(Z.id);if(!$)return;let Q=i.cronJobs[$],X={id:$,name:mZ(Z.name)??Q?.name,agentId:VZ(Z.agentId)??Q?.agentId,agentName:mZ(Z.agentName)??Q?.agentName,agentEmoji:N0(Z.agentEmoji)??Q?.agentEmoji,enabled:typeof Z.enabled==="boolean"?Z.enabled:Q?.enabled,updatedAt:gZ(Z.updatedAt),lastSeenAt:Z.lastSeenAt!==void 0?gZ(Z.lastSeenAt):Q?.lastSeenAt,deletedAt:Z.deletedAt!==void 0?gZ(Z.deletedAt):Q?.deletedAt};if(!(!Q||Q.name!==X.name||Q.agentId!==X.agentId||Q.agentName!==X.agentName||Q.agentEmoji!==X.agentEmoji||Q.enabled!==X.enabled||Q.updatedAt!==X.updatedAt||Q.lastSeenAt!==X.lastSeenAt||Q.deletedAt!==X.deletedAt))return;i.cronJobs[$]=X,d4()}function q3(Z){kZ();let $=VZ(Z);if(!$)return;return i.cronJobs[$]}function K3(Z){kZ();let $=Date.now(),Q=new Set;for(let X of Z){let Y=VZ(X);if(!Y)continue;Q.add(Y);let H=i.cronJobs[Y];if(!H)continue;if(H.lastSeenAt===$&&H.deletedAt===void 0)continue;H.lastSeenAt=$,H.deletedAt=void 0,H.updatedAt=Math.max(H.updatedAt,$),CZ=!0}for(let[X,Y]of Object.entries(i.cronJobs)){if(Q.has(X))continue;if(Y.deletedAt)continue;Y.deletedAt=$,Y.updatedAt=Math.max(Y.updatedAt,$),CZ=!0}if(CZ)c4()}var g4="[botmobile:cache]",J3=1,U7=1000,z0,v4,p4=!1,CZ=!1,vZ=null,i;var n4=KZ(()=>{z0=m4.join(D7.homedir(),".openclaw","botmobile","state.json"),v4=m4.dirname(z0),i={version:J3,updatedAt:0,agents:{},cronJobs:{}}});var _5={};x5(_5,{wsRelay:()=>k,monitorBotMobileProvider:()=>F5,handleToolHookEvent:()=>C0,handleAgentRunHookEnd:()=>C3,getFileWatcherCount:()=>U8,bindSessionToConversation:()=>M3});import W7 from"node:dns";import{watch as O3,statSync as S0,readFileSync as j3}from"node:fs";import UZ from"node:path";import iZ from"node:os";import{createReplyPrefixOptions as z7}from"openclaw/plugin-sdk";function k(Z,$){if($?.record!==!1)Y4(Z);if(LZ)LZ.sendLegacyEnvelope(Z);return!0}function x7(Z,$){return SZ(Z,$).name}function h7(Z,$){return SZ(Z,$).emoji}function SZ(Z,$){let Q=bZ(Z,$),X=o4($),Y=Q.name;if((Q.source==="agent-id"||!Y||Y===$)&&X?.name)Y=X.name;let H=Q.emoji??X?.emoji;return s4({id:$,name:Y,emoji:H,updatedAt:Date.now()}),{name:Y,emoji:H}}function H5(Z){return{resolveAgentDisplay:({agentId:$})=>SZ(Z,$),resolveCronSnapshot:($)=>{let Q=q3($);if(!Q)return;return{name:Q.name,agentId:Q.agentId,agentName:Q.agentName,agentEmoji:Q.agentEmoji}}}}function pZ(Z){if(!Array.isArray(Z))return;return Z.map((Q)=>typeof Q==="string"?Q.trim():"").filter((Q)=>Q.length>0)}function T7(Z){let $=new Set,Q=[];for(let X of Z){let Y=X.trim();if(!Y)continue;if($.has(Y))continue;$.add(Y),Q.push(Y)}return Q.length>0?Q:void 0}function b7(Z){if(!Z)return{};let $=Z.trim();if(!$)return{};let Q=$.indexOf("/");if(Q<0)return{model:$};let X=$.slice(0,Q).trim(),Y=$.slice(Q+1).trim();return{provider:X||void 0,model:Y||void 0}}function f7(Z){let $=Z?.trim().toLowerCase();if(!$)return;switch($){case"anthropic":return"ANTHROPIC_API_KEY";case"openai":return"OPENAI_API_KEY";case"gemini":case"google":return"GEMINI_API_KEY";case"openrouter":return"OPENROUTER_API_KEY";case"xai":return"XAI_API_KEY";case"groq":return"GROQ_API_KEY";case"perplexity":return"PERPLEXITY_API_KEY";case"deepseek":return"DEEPSEEK_API_KEY";case"mistral":return"MISTRAL_API_KEY";case"cohere":return"COHERE_API_KEY";default:return}}function y(Z){let $=Z.replace(/\s+/g," ").trim();if(!$)return"working";if($.length<=t4)return $;return`${$.slice(0,t4-3).trimEnd()}...`}function j0(Z){if(!Z)return;let $=Z.trim();return $.length>0?$:void 0}function P3(Z){if(!Z)return;let $=Z.trim();return $.length>0?$:void 0}function I7(Z){let $=Z.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[._-]+/g," ").replace(/\s+/g," ").trim().toLowerCase();if(!$)return"running tool";return y(`running ${$}`)}function o(Z){if(!Z)return;let $=Z.replace(/\s+/g," ").trim();if(!$)return;if($.length<=e4)return $;return`${$.slice(0,e4-1).trimEnd()}…`}function e(Z,$){if(!Z)return;for(let Q of $){let X=Z[Q];if(typeof X==="string"&&X.trim().length>0)return X.trim()}return}function y7(Z){if(!Z)return;let $=Z.trim().split(/\s+/)[0];if(!$)return;if($.startsWith("/")){let Q=$.split("/");return Q[Q.length-1]||$}return $}function u7(Z){if(!Z)return;try{let $=new URL(Z).hostname;return $?o($):void 0}catch{return o(Z)}}function v7(Z){let $=e(Z,["action","op","operation","method"]);return o($)}function $Z(Z,$){if(!$)return y(Z);return y(`${Z} (${$})`)}function m7(Z,$){let Q=Z.trim().toLowerCase(),X=v7($);if(Q==="web_search"){let Y=o(e($,["query","q","text"]));return $Z("searching the web",Y)}if(Q==="web_fetch"){let Y=u7(e($,["url"]));return $Z("fetching webpage",Y)}if(Q==="browser"){let Y=o(e($,["url","selector","query","text"]));if(X&&Y)return y(`browser ${X} (${Y})`);if(X)return y(`browser ${X}`);return $Z("using browser tool",Y)}if(Q==="memory_search"){let Y=o(e($,["query","q","text"]));return $Z("searching memory",Y)}if(Q==="memory_get"){let Y=o(e($,["id","key","name"]));return $Z("reading memory entry",Y)}if(Q==="sessions_history"){let Y=o(e($,["sessionId","sessionKey","id"]));return $Z("reading session history",Y)}if(Q==="sessions_list")return y("listing sessions");if(Q==="sessions_send"){let Y=o(e($,["sessionId","sessionKey","to","target"]));return $Z("sending cross-session message",Y)}if(Q==="sessions_spawn"){let Y=o(e($,["name","label","agentId"]));return $Z("starting helper session",Y)}if(Q==="cron"){if(X)return y(`updating scheduled task (${X})`);return y("updating scheduled task")}if(Q==="message"){if(X)return y(`preparing message action (${X})`);return y("preparing message")}if(Q==="gateway"){if(X)return y(`checking gateway (${X})`);return y("checking gateway")}if(Q==="canvas"){if(X)return y(`updating canvas (${X})`);return y("updating canvas")}if(Q==="nodes"){if(X)return y(`running node action (${X})`);return y("running node action")}if(Q==="image"){if(X)return y(`working with image (${X})`);return y("working with image")}if(Q==="tts")return y("generating audio");if(Q==="exec_command"){let Y=e($,["cmd","command"]),H=o(y7(Y));return $Z("running terminal command",H)}if(Q==="write_stdin")return y("continuing terminal command");if(Q==="search_query"){let Y=o(e($,["q","query"]));return $Z("searching",Y)}if(Q==="open"){let Y=o(e($,["ref_id","refId","url"]));return $Z("opening reference",Y)}if(Q==="click")return y("opening linked reference");if(Q==="find"){let Y=o(e($,["pattern","text"]));return $Z("finding text",Y)}if(Q==="apply_patch")return y("editing code");return I7(Z)}function V5(Z,$){return`${Z}::${$??"__unknown__"}`}function g7(Z=Date.now()){for(let[$,Q]of rZ)if(Z-Q.updatedAt>w7)rZ.delete($)}function p7(Z){let $=j0(Z);if(!$)return;let Q=rZ.get($);if(Q)return Q.updatedAt=Date.now(),Q.conversationId;let X=$.match(C7);if(X&&X[1]?.trim())return R(X[1]);let Y=$.match(k7);if(Y&&Y[1]?.trim())return R(Y[1]);let H=$.match(A7);if(H&&H[1]?.trim())return`cron:${H[1].trim().toLowerCase()}`;return}function R3(Z){let $,Q=-1,X=`${Z}::`;for(let[Y,H]of JZ){if(!Y.startsWith(X))continue;if(H.tools.length===0)continue;if(H.updatedAt>Q)Q=H.updatedAt,$=Y}if($)return DZ.set(Z,$),$;DZ.delete(Z);return}function c7(Z,$){if($){let X=V5(Z,$);if(JZ.delete(X),DZ.get(Z)===X)R3(Z);return}let Q=`${Z}::`;for(let X of Array.from(JZ.keys())){if(!X.startsWith(Q))continue;JZ.delete(X)}DZ.delete(Z)}function M3(Z){let $=j0(Z.sessionKey);if(!$)return;let Q=R(Z.conversationId);if(!Q)return;g7(),rZ.set($,{conversationId:Q,updatedAt:Date.now()})}function C0(Z){let $=P3(Z.agentId),Q=P3(Z.toolName);if(!$||!Q)return;let X=Date.now(),Y=j0(Z.sessionKey),H=V5($,Y),V=p7(Y),J=wZ.get($)?.status,q=JZ.get(H)??{agentId:$,sessionKey:Y,conversationId:V,tools:[],updatedAt:X};if(q.updatedAt=X,V)q.conversationId=V;if(Z.phase==="start"){let D=m7(Q,Z.toolParams);if(q.tools.push({name:Q,activity:D}),JZ.set(H,q),DZ.set($,H),J!=="working")xZ.add($);AZ($,"working",{activeConversationId:V,activeTool:D},Z.config),console.log(`${a4} before_tool_call agent=${$} tool=${Q} activity="${D}" session=${Y??"-"} conv=${V??"-"} depth=${q.tools.length}`);return}let K=!1;for(let D=q.tools.length-1;D>=0;D-=1){if(q.tools[D]?.name!==Q)continue;q.tools.splice(D,1),K=!0;break}if(!K&&q.tools.length>0)q.tools.pop();if(q.tools.length===0){if(JZ.delete(H),DZ.get($)===H)R3($)}else JZ.set(H,q),DZ.set($,H);let B=DZ.get($)??R3($),O=B?JZ.get(B):void 0,L=O?.tools[O.tools.length-1];if(L)AZ($,"working",{activeConversationId:O?.conversationId,activeTool:L.activity},Z.config);else if(xZ.has($))xZ.delete($),AZ($,"idle",{activeTool:void 0,activeConversationId:void 0},Z.config);else AZ($,"working",{activeTool:z3,activeConversationId:O?.conversationId},Z.config);console.log(`${a4} after_tool_call agent=${$} tool=${Q} session=${Y??"-"} conv=${V??"-"} depth=${q.tools.length} next="${L?.activity??z3}" error=${Z.error?"yes":"no"}`)}function C3(Z){let $=P3(Z.agentId);if(!$)return;let Q=j0(Z.sessionKey);if(c7($,Q),!xZ.has($))return;xZ.delete($),AZ($,"idle",{activeConversationId:void 0,activeTool:void 0,errorMessage:Z.success===!1?Z.error:void 0},Z.config)}function l7(Z){let $=["token","apiKey","key","accessToken","refreshToken","secret"];for(let Q of $){let X=Z[Q];if(typeof X==="string"&&X.trim().length>0)return!0}return!1}function d7(Z,$){let Q=$?.trim().toLowerCase();if(!Q)return!1;let X=UZ.join(iZ.homedir(),".openclaw","agents",Z,"agent","auth-profiles.json");try{let Y=S0(X),H=F3.get(Z);if(H&&H.mtimeMs===Y.mtimeMs&&H.size===Y.size)return H.hasCredentialByProvider[Q]===!0;let V=j3(X,"utf8"),q=JSON.parse(V)?.profiles,K={};if(q&&typeof q==="object")for(let B of Object.values(q)){if(!B||typeof B!=="object")continue;let O=B,L=g(O.provider)?.toLowerCase();if(!L)continue;if(l7(O))K[L]=!0;else if(K[L]!==!0)K[L]=!1}return F3.set(Z,{mtimeMs:Y.mtimeMs,size:Y.size,hasCredentialByProvider:K}),K[Q]===!0}catch{return F3.delete(Z),!1}}function i7(Z,$){let Q=f7(Z),X=d7($,Z);if(!Q&&!X)return{};return{envName:Q,present:X}}function J5(Z,$){let Q=Z.agents,X=Q&&typeof Q.defaults==="object"&&Q.defaults?Q.defaults:{},H=(Array.isArray(Q?.list)?Q.list:[]).find((d)=>typeof d?.id==="string"&&d.id===$)??{},V=typeof H.model==="string"?H.model:typeof H.model?.primary==="string"?H.model.primary:typeof X.model?.primary==="string"?X.model.primary:void 0,J=typeof V==="string"?V.trim():"",q=b7(J),K=typeof H.workspace==="string"?H.workspace:typeof X.workspace==="string"?X.workspace:void 0,B=typeof K==="string"&&K.trim().length>0?K.trim():void 0,O=L5($),L=pZ(H.skills)??pZ(X.skills)??O?.skills,D=pZ(H.tools?.allow)??pZ(X.tools?.allow),U=pZ(H.tools?.deny)??pZ(X.tools?.deny),z=typeof H.contextTokens==="number"?H.contextTokens:X.contextTokens,N=typeof z==="number"&&Number.isFinite(z)?Math.max(0,Math.floor(z)):O?.contextTokens,G=typeof H.timeoutSeconds==="number"?H.timeoutSeconds:X.timeoutSeconds,T=typeof G==="number"&&Number.isFinite(G)?Math.max(0,Math.floor(G)):void 0,A=typeof H.maxConcurrent==="number"?H.maxConcurrent:X.maxConcurrent,p=typeof A==="number"&&Number.isFinite(A)?Math.max(0,Math.floor(A)):void 0,b=typeof H.typingMode==="string"?H.typingMode:X.typingMode,S=typeof b==="string"&&b.trim().length>0?b.trim():void 0,c=q.provider??O?.modelProvider,j=q.model??O?.model,E=B??O?.promptWorkspace,v=typeof N==="number"&&typeof O?.totalTokens==="number"?Math.max(0,N-Math.max(0,Math.floor(O.totalTokens))):void 0,W=typeof N==="number"&&N>0&&typeof O?.totalTokens==="number"?Math.min(1,Math.max(0,O.totalTokens/N)):void 0,m=i7(c,$),x=e7($,O),l={model:j,provider:c,workspace:E,skills:L,skillDetails:O?.skillDetails,toolsAllow:D,toolsDeny:U,contextTokens:N,contextRemainingTokens:v,contextUsageRatio:W,timeoutSeconds:T,maxConcurrent:p,typingMode:S,sessionId:O?.sessionId,sessionUpdatedAt:O?.updatedAt,sessionInputTokens:O?.inputTokens,sessionOutputTokens:O?.outputTokens,sessionTotalTokens:O?.totalTokens,usageEventCount:x?.usageEventCount,usageInputTokens:x?.usageInputTokens,usageOutputTokens:x?.usageOutputTokens,usageCacheReadTokens:x?.usageCacheReadTokens,usageCacheWriteTokens:x?.usageCacheWriteTokens,usageTotalTokens:x?.usageTotalTokens,usageTotalCostUsd:x?.usageTotalCostUsd,usageUpdatedAt:x?.usageUpdatedAt,historySessionCount:O?.historySessionCount,historyInputTokens:O?.historyInputTokens,historyOutputTokens:O?.historyOutputTokens,historyTotalTokens:O?.historyTotalTokens,historyUpdatedAt:O?.historyUpdatedAt,promptSource:O?.promptSource,promptGeneratedAt:O?.promptGeneratedAt,providerKeyEnv:m.envName,providerKeyPresent:m.present},n=q5(l);return l.accountStatus=n.status,l.accountStatusReason=n.reason,Object.values(l).some((d)=>d!==void 0)?l:void 0}function q5(Z){if(Z.providerKeyPresent===!1)return{status:"missing_credentials",reason:Z.providerKeyEnv?`No provider credentials detected (${Z.providerKeyEnv} not set)`:"No provider credentials detected"};if(Z.providerKeyPresent===!0)return{status:"ready",reason:"Provider credentials detected"};return{status:"unknown",reason:Z.provider?"Provider configured":"Provider unknown"}}function K5(Z,$,Q){if(!Z&&$!=="error")return Z;let X={...Z??{}};if($==="error")X.accountStatus="error",X.accountStatusReason=g(Q)??X.accountStatusReason??"Agent runtime error";else{let H=q5(X);X.accountStatus=H.status,X.accountStatusReason=H.reason}return Object.values(X).some((H)=>H!==void 0)?X:void 0}function C(Z){if(typeof Z!=="number"||!Number.isFinite(Z))return;return Z}function r7(Z){return typeof Z==="boolean"?Z:void 0}function g(Z){if(typeof Z!=="string")return;let $=Z.trim();return $.length>0?$:void 0}function s7(Z){if(!Z||typeof Z!=="object")return;let $=Z,Q=g($.name);if(!Q)return;return{name:Q,description:g($.description),source:g($.source),filePath:g($.filePath),baseDir:g($.baseDir),disableModelInvocation:r7($.disableModelInvocation)}}function O5(){return{eventCount:0,inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalTokens:0,totalCostUsd:0,updatedAt:0}}function o7(Z){return{eventCount:Math.max(0,Math.floor(Z?.usageEventCount??0)),inputTokens:Math.max(0,Math.floor(Z?.usageInputTokens??0)),outputTokens:Math.max(0,Math.floor(Z?.usageOutputTokens??0)),cacheReadTokens:Math.max(0,Math.floor(Z?.usageCacheReadTokens??0)),cacheWriteTokens:Math.max(0,Math.floor(Z?.usageCacheWriteTokens??0)),totalTokens:Math.max(0,Math.floor(Z?.usageTotalTokens??0)),totalCostUsd:Math.max(0,C(Z?.usageTotalCostUsd)??0),updatedAt:Math.max(0,Math.floor(Z?.usageUpdatedAt??0))}}function B5(Z){if(Z.eventCount<=0)return;return{usageEventCount:Z.eventCount,usageInputTokens:Z.inputTokens,usageOutputTokens:Z.outputTokens,usageCacheReadTokens:Z.cacheReadTokens,usageCacheWriteTokens:Z.cacheWriteTokens,usageTotalTokens:Z.totalTokens,usageTotalCostUsd:Number(Z.totalCostUsd.toFixed(6)),usageUpdatedAt:Z.updatedAt>0?Z.updatedAt:void 0}}function w3(Z){if(typeof Z==="number"&&Number.isFinite(Z)&&Z>0){if(Z>=1000000000000)return Math.floor(Z);if(Z>=1e9)return Math.floor(Z*1000);return Math.floor(Z)}if(typeof Z==="string"&&Z.trim().length>0){let $=Number(Z);if(Number.isFinite($)&&$>0)return w3($);let Q=Date.parse(Z);if(Number.isFinite(Q)&&Q>0)return Math.floor(Q)}return 0}function n7(Z){if(!Z.includes('"usage"'))return;try{let $=JSON.parse(Z),Q=$.message;if(!Q||typeof Q!=="object")return;let X=Q.usage;if(!X||typeof X!=="object")return;let Y=X,H=Math.max(0,Math.floor(C(Y.input)??C(Y.inputTokens)??C(Y.input_tokens)??0)),V=Math.max(0,Math.floor(C(Y.output)??C(Y.outputTokens)??C(Y.output_tokens)??0)),J=Math.max(0,Math.floor(C(Y.cacheRead)??C(Y.cacheReadTokens)??C(Y.cache_read_tokens)??0)),q=Math.max(0,Math.floor(C(Y.cacheWrite)??C(Y.cacheWriteTokens)??C(Y.cache_write_tokens)??0)),K=H+V+J+q,B=Math.max(0,Math.floor(C(Y.totalTokens)??C(Y.total_tokens)??K)),O=Y.cost,L=O&&typeof O==="object"?O:void 0,D=Math.max(0,C(Y.totalCostUsd)??C(Y.total_cost_usd)??C(L?.total)??0),U=Math.max(w3(Q.timestamp),w3($.timestamp));return{eventCount:1,inputTokens:H,outputTokens:V,cacheReadTokens:J,cacheWriteTokens:q,totalTokens:B,totalCostUsd:D,updatedAt:U}}catch{return}}function t7(Z,$){if(UZ.isAbsolute($))return $;return UZ.join(iZ.homedir(),".openclaw","agents",Z,"sessions",$)}function a7(Z){try{let $=S0(Z),Q=U3.get(Z);if(Q&&Q.mtimeMs===$.mtimeMs&&Q.size===$.size)return Q.totals;let X=j3(Z,"utf8"),Y=O5(),H=X.split(/\r?\n/);for(let J of H){let q=J.trim();if(!q)continue;let K=n7(q);if(!K)continue;Y.eventCount+=K.eventCount,Y.inputTokens+=K.inputTokens,Y.outputTokens+=K.outputTokens,Y.cacheReadTokens+=K.cacheReadTokens,Y.cacheWriteTokens+=K.cacheWriteTokens,Y.totalTokens+=K.totalTokens,Y.totalCostUsd+=K.totalCostUsd,Y.updatedAt=Math.max(Y.updatedAt,K.updatedAt)}let V=B5(Y);return U3.set(Z,{mtimeMs:$.mtimeMs,size:$.size,totals:V}),V}catch{U3.delete(Z);return}}function e7(Z,$){let Q=Date.now(),X=D3.get(Z);if(X&&Q-X.refreshedAt<M7)return X.totals;let Y=$?.sessionFiles??[];if(Y.length===0){D3.set(Z,{refreshedAt:Q,totals:void 0});return}let H=O5(),V=new Set;for(let q of Y){let K=q.trim();if(!K||V.has(K))continue;V.add(K);let B=t7(Z,K),O=a7(B);if(!O)continue;let L=o7(O);H.eventCount+=L.eventCount,H.inputTokens+=L.inputTokens,H.outputTokens+=L.outputTokens,H.cacheReadTokens+=L.cacheReadTokens,H.cacheWriteTokens+=L.cacheWriteTokens,H.totalTokens+=L.totalTokens,H.totalCostUsd+=L.totalCostUsd,H.updatedAt=Math.max(H.updatedAt,L.updatedAt)}let J=B5(H);return D3.set(Z,{refreshedAt:Q,totals:J}),J}function L5(Z){let $=UZ.join(iZ.homedir(),".openclaw","agents",Z,"sessions","sessions.json");try{let Q=S0($),X=cZ.get(Z);if(X&&X.mtimeMs===Q.mtimeMs&&X.size===Q.size)return X.summary;let Y=j3($,"utf8"),H=JSON.parse(Y);if(!H||typeof H!=="object"){cZ.set(Z,{mtimeMs:Q.mtimeMs,size:Q.size,summary:void 0});return}let V,J,q=0,K=`agent:${Z}:`,B=0,O=0,L=0,D=0,U=0,z=new Set;for(let[E,v]of Object.entries(H)){if(!E.startsWith(K))continue;if(!v||typeof v!=="object")continue;let W=v,m=g(W.sessionFile);if(m)z.add(m);let x=C(W.updatedAt)??0;if(B+=1,U=Math.max(U,x),O+=Math.max(0,C(W.inputTokens)??0),L+=Math.max(0,C(W.outputTokens)??0),D+=Math.max(0,C(W.totalTokens)??0),!J||x>=q)V=E,J=W,q=x}if(!J){cZ.set(Z,{mtimeMs:Q.mtimeMs,size:Q.size,summary:void 0});return}let N=J.skillsSnapshot,T=(Array.isArray(N?.skills)?N?.skills:[]).map((E)=>{if(typeof E==="string")return g(E);if(!E||typeof E!=="object")return;return g(E.name)}).filter((E)=>typeof E==="string"),p=(Array.isArray(N?.resolvedSkills)?N.resolvedSkills:[]).map((E)=>s7(E)).filter((E)=>!!E),b=p.map((E)=>E.name),S=T7([...T,...b]),c=J.systemPromptReport,j={sessionKey:V,sessionId:g(J.sessionId),updatedAt:C(J.updatedAt),modelProvider:g(J.modelProvider),model:g(J.model),contextTokens:C(J.contextTokens),inputTokens:C(J.inputTokens),outputTokens:C(J.outputTokens),totalTokens:C(J.totalTokens),skillsCount:S?.length,skills:S,skillDetails:p.length>0?p:void 0,historySessionCount:B>0?B:void 0,historyInputTokens:O>0?O:void 0,historyOutputTokens:L>0?L:void 0,historyTotalTokens:D>0?D:void 0,historyUpdatedAt:U>0?U:void 0,promptSource:g(c?.source),promptGeneratedAt:C(c?.generatedAt),promptWorkspace:g(c?.workspaceDir),sessionFiles:z.size>0?Array.from(z):void 0};return cZ.set(Z,{mtimeMs:Q.mtimeMs,size:Q.size,summary:j}),j}catch{cZ.delete(Z);return}}function Z8(Z,$,Q){let X=SZ(Z,$),Y=L5($),H=Y?{...Y,sessionFileCount:Y.sessionFiles?.length,sessionFiles:void 0}:null,V={agentId:$,display:X,configDetails:Q??null,sessionSummary:H},J=JSON.stringify(V);if(E3.get($)===J)return;E3.set($,J),console.log(`${u} [agent-details] ${JSON.stringify(V,null,2)}`)}function $8(Z,$){if(!$)return Z;if(Z.startsWith($))return Z;return`${$} ${Z}`.trim()}function Q8(Z,$){let Q=g(Z);if(Q)return Q.slice(0,96);return(($.split(/\r?\n/,1)[0]?.trim()??"")||"Agent Task").slice(0,96)}function X8(Z){if(typeof Z!=="number"||!Number.isFinite(Z))return 3600000;return Math.max(60000,Math.min(2592000000,Math.floor(Z)))}function P0(Z){if(!Z)return;let $=Z.trim();if(!$)return;if($.startsWith("conversation:"))return;if($.toLowerCase()==="conversation")return;return R($)}function Y8(Z){let $=Z.agents?.list;if(!Array.isArray($))return new Set;let Q=new Set;for(let X of $){if(!X||typeof X!=="object")continue;let Y=typeof X.id==="string"?X.id.trim():"";if(!Y)continue;Q.add(Y)}return Q}function D5(Z,$){if(!$)return;let Q=$.trim();if(!Q)return;if(Q.startsWith("conversation:"))return;if(Q.toLowerCase()==="conversation")return;if(Q.includes(":"))return;let X=Y8(Z);if(X.size>0&&!X.has(Q))return;return Q}function $5(Z,$){let Q=Z.split(":");if(Q.length<2||Q[0]!=="agent")return Z;return Q[1]=$,Q.join(":")}function Q5(Z){let $=Z.trim();if(!$)return 0;return Math.max(1,Math.ceil($.length/4))}function H8(Z){if(Z==="error")return"error";if(Z==="skipped")return"skipped";return"ok"}function X5(Z,$){return`${Z}:${$??Date.now()}`}function V8(Z){let $=Z.agents?.list??[];if(!Array.isArray($))return[];let Q=new Set,X=Date.now(),Y=[];for(let H of $){let V=H?.id??"unknown";Q.add(V);let J=lZ.get(V),q=wZ.get(V),K=SZ(Z,V),B=J5(Z,V)??q?.details,O=q?.status??"idle",L={agentId:V,name:K.name,emoji:K.emoji??q?.emoji,color:q?.color,details:K5(B,O,q?.errorMessage),status:O,activeConversationId:P0(q?.activeConversationId),activeTool:q?.activeTool,activeElapsedMs:q?.activeElapsedMs,activeTokens:q?.activeTokens,sessionTokensIn:J?.in??q?.sessionTokensIn??0,sessionTokensOut:J?.out??q?.sessionTokensOut??0,lastActivityAt:q?.lastActivityAt??X,errorMessage:q?.errorMessage};wZ.set(V,L),Z8(Z,V,L.details),Y.push(L)}for(let H of Array.from(wZ.keys()))if(!Q.has(H))wZ.delete(H);return Y}function k0(Z){return V8(Z)}function AZ(Z,$,Q,X){let Y=!!Q&&Object.prototype.hasOwnProperty.call(Q,"activeConversationId"),H=!!Q&&Object.prototype.hasOwnProperty.call(Q,"activeTool"),V=!!Q&&Object.prototype.hasOwnProperty.call(Q,"activeTokens"),J=wZ.get(Z),q=lZ.get(Z),K=Date.now(),B=J?.name??(X?x7(X,Z):Z||"Assistant"),O=J?.emoji??(X?h7(X,Z):void 0),L=J?.details??(X?J5(X,Z):void 0),D=Q?.errorMessage??J?.errorMessage,U={agentId:Z,name:B,emoji:O,color:J?.color,details:K5(L,$,D),status:$,activeConversationId:Y?P0(Q?.activeConversationId):P0(J?.activeConversationId),activeTool:H?Q?.activeTool:J?.activeTool,activeElapsedMs:Q?.activeElapsedMs,activeTokens:V?Q?.activeTokens:J?.activeTokens,sessionTokensIn:q?.in??J?.sessionTokensIn??0,sessionTokensOut:q?.out??J?.sessionTokensOut??0,lastActivityAt:K,errorMessage:Q?.errorMessage};if($==="working"){if(!U.activeConversationId)U.activeConversationId=P0(J?.activeConversationId);if(!H&&!U.activeTool)U.activeTool=J?.activeTool;if(!V&&U.activeTokens===void 0)U.activeTokens=J?.activeTokens}else U.activeConversationId=void 0,U.activeTool=void 0,U.activeTokens=void 0;if($!=="error"&&Q?.errorMessage===void 0)U.errorMessage=void 0;wZ.set(Z,U),k({type:"agent_status",agentId:U.agentId,status:U.status,color:U.color,details:U.details,activeConversationId:U.activeConversationId,activeTool:U.activeTool,activeElapsedMs:U.activeElapsedMs,activeTokens:U.activeTokens,sessionTokensIn:U.sessionTokensIn,sessionTokensOut:U.sessionTokensOut,lastActivityAt:U.lastActivityAt,errorMessage:U.errorMessage})}function J8(Z){if(Z&&typeof Z==="object"){let $=Z;if($.kind==="at"&&typeof $.at==="string")return{kind:"at",at:$.at};if($.kind==="every"&&typeof $.everyMs==="number")return{kind:"every",everyMs:Math.max(1,Math.floor($.everyMs))};if($.kind==="cron"&&typeof $.expr==="string")return{kind:"cron",expr:$.expr,tz:typeof $.tz==="string"?$.tz:void 0}}return{kind:"every",everyMs:60000}}function U5(Z,$){return Z.map((Q)=>{let X=typeof Q.agentId==="string"&&Q.agentId.trim()?Q.agentId:void 0,Y=X?SZ($,X):void 0,H=Q.sessionTarget==="isolated"?"isolated":"main",V=Q.payload?.kind==="agentTurn"?"agentTurn":"systemEvent",J={id:Q.id,agentId:X,agentName:Y?.name,agentEmoji:Y?.emoji,name:Q.name??Q.id,enabled:Q.enabled!==!1,schedule:J8(Q.schedule),sessionTarget:H,payloadKind:V,lastRunAt:Q.state?.lastRunAtMs,lastRunStatus:Q.state?.lastStatus,lastRunDurationMs:Q.state?.lastDurationMs,lastRunSummary:void 0,nextRunAt:Q.state?.nextRunAtMs,isRunning:!!Q.state?.runningAtMs,runningElapsedMs:Q.state?.runningAtMs?Date.now()-Q.state.runningAtMs:void 0,runningTokens:void 0};return E0({id:J.id,name:J.name,agentId:J.agentId,agentName:J.agentName,agentEmoji:J.agentEmoji,enabled:J.enabled,updatedAt:Date.now(),lastSeenAt:Date.now(),deletedAt:void 0}),J})}function MZ(Z,$={}){let Q=Date.now(),X=$.includeDisabled??!0,Y=$.force===!0,H=p0(Z),V=X?H:H.filter((K)=>K.enabled!==!1),J=U5(V,Z),q=JSON.stringify(J.map((K)=>({id:K.id,agentId:K.agentId,name:K.name,enabled:K.enabled,schedule:K.schedule,sessionTarget:K.sessionTarget,payloadKind:K.payloadKind,lastRunAt:K.lastRunAt,lastRunStatus:K.lastRunStatus,isRunning:K.isRunning,runningTokens:K.runningTokens})));if(q===Z5){if(!Y)return;if(Q-L3<j7)return}if(!Y){if(Q-L3<S7)return}Z5=q,L3=Q,K3(J.map((K)=>K.id)),k({type:"cron_list",jobs:J})}function q8(Z){let $=p0(Z),Q=U5($,Z);return K3(Q.map((X)=>X.id)),{jobs:Q}}function Y5(Z,$){let Q=typeof $?.sinceTimestampMs==="number"&&Number.isFinite($.sinceTimestampMs)?$.sinceTimestampMs:void 0,X=typeof $?.stateBornAt==="number"&&Number.isFinite($.stateBornAt)?$.stateBornAt:void 0,Y=typeof $?.globalRevision==="number"&&Number.isFinite($.globalRevision)?$.globalRevision:void 0,H=n0({sinceTimestampMs:Q,stateBornAt:X,globalRevision:Y,conversations:$?.conversations,fallbackAgents:k0(Z),fallbackCronJobs:q8(Z).jobs});if(H.mode==="snapshot"){k({type:"state_snapshot",state:H.state},{record:!1});return}k({type:"state_delta",state:H.state,sinceTimestampMs:Q},{record:!1})}function K8(Z,$){if($.action==="started")k({type:"cron_run_started",jobId:$.jobId,runId:X5($.jobId,$.runAtMs)});else if($.action==="finished")k({type:"cron_run_finished",jobId:$.jobId,runId:X5($.jobId,$.runAtMs),status:H8($.status),durationMs:$.durationMs??0,summary:$.summary,error:$.error});MZ(Z,{includeDisabled:!0})}function O8(Z){if(H0)return;H0=g3(Z,($)=>{K8(Z,$)})}function B8(){if(H0)H0(),H0=null}async function L8(Z){let{envelope:$,accountId:Q,config:X,core:Y,logger:H}=Z,V=X,J=R($.conversationId);X4({...$,conversationId:J});let q=Y.channel.routing.resolveAgentRoute({cfg:V,channel:"botmobile",accountId:Q,peer:{kind:"dm",id:J}}),K=D5(V,$.agentId);if($.agentId&&!K)H.info(`${u} ignoring invalid agent override "${$.agentId}" for conv=${J}`);if(K&&K!==q.agentId)q={...q,agentId:K,sessionKey:$5(q.sessionKey,K),mainSessionKey:$5(q.mainSessionKey,K)};M3({sessionKey:q.sessionKey,conversationId:J}),M3({sessionKey:q.mainSessionKey,conversationId:J});let B=SZ(V,q.agentId);F0(J,{id:q.agentId,name:B.name,emoji:B.emoji},$.timestamp);let O=$8(B.name,B.emoji);if(N3.get(J)!==O)N3.set(J,O),k({type:"conversation_list",conversations:[{id:J,name:O,createdAt:$.timestamp,lastActivity:$.timestamp}]});let D=[];if($.pendingAttachments&&LZ?.fileReceiver)for(let P of $.pendingAttachments){let f=LZ.fileReceiver.getFilePath(P.transferId);if(f)D.push({fileName:P.fileName,mimeType:P.mimeType,filePath:f});else H.error(`${u} attachment ${P.transferId} (${P.fileName}) not found on disk`)}let U=$.body;if(D.length>0){let P=D.map((f)=>`[Attached: ${f.fileName} — file://${f.filePath}]`);U=U?`${U}
10
10
  ${P.join(`
11
11
  `)}`:P.join(`
12
- `)}let z=Q5(U);if(z>0){let P=lZ.get(q.agentId)??{in:0,out:0};P.in+=z,lZ.set(q.agentId,P)}let N=Y.channel.reply.formatAgentEnvelope({channel:"BotMobile",from:`user:${$.from}`,timestamp:$.timestamp,envelope:Y.channel.reply.resolveEnvelopeFormatOptions(V),body:U}),_=Y.channel.reply.finalizeInboundContext({Body:N,RawBody:$.body,CommandBody:$.body,From:`botmobile:user:${J}`,To:"botmobile:bot:default",SessionKey:q.sessionKey,AccountId:q.accountId,ChatType:"direct",ConversationLabel:J,SenderName:"User",SenderId:J,Provider:"botmobile",Surface:"botmobile",MessageSid:$.id,OriginatingChannel:"botmobile",OriginatingTo:"botmobile:bot:default"}),T=Y.channel.session.resolveStorePath(V.session?.store,{agentId:q.agentId});await Y.channel.session.recordInboundSession({storePath:T,sessionKey:_.SessionKey??q.sessionKey,ctx:_,updateLastRoute:{sessionKey:q.mainSessionKey,channel:"botmobile",to:`botmobile:user:${J}`,accountId:q.accountId},onRecordError:(P)=>{H.error(`Failed updating session meta: ${String(P)}`)}});let{onModelSelected:A,...p}=z7({cfg:V,agentId:q.agentId,channel:"botmobile",accountId:Q}),b=new AbortController;M0.set(J,b);let S=(P,f)=>{k({type:"error",code:P,message:f,conversationId:J})};k({type:"composing",conversationId:J,from:"bot"});let c=Date.now();AZ(q.agentId,"working",{activeConversationId:J,activeTool:z3},V);let j=crypto.randomUUID(),E=!1,v="",W=0,m=0,x="unknown",l=0,n="",QZ="",d=null,hZ=!1,A0=null,x0=()=>{if(!QZ)return;if(l>=B3){QZ="";return}if(!E)k({type:"stream_start",conversationId:J,messageId:j}),E=!0;k({type:"stream_token",conversationId:J,messageId:j,token:QZ}),QZ="",l+=1},w5=()=>{if(d||l>=B3)return;d=setTimeout(()=>{d=null,x0()},E7)};try{await Y.channel.reply.dispatchReplyWithBufferedBlockDispatcher({ctx:_,cfg:V,dispatcherOptions:{...p,deliver:async(P)=>{let f=[];if(typeof P.text==="string"&&P.text.trim().length>0)f.push(P.text);if(typeof P.mediaUrl==="string"&&P.mediaUrl.trim().length>0)f.push(P.mediaUrl);if(Array.isArray(P.mediaUrls)){for(let h0 of P.mediaUrls)if(typeof h0==="string"&&h0.trim().length>0)f.push(h0)}let FZ=f.join(`
13
- `).trim();if(!FZ)return;n=FZ,k({type:"message",id:j,conversationId:J,from:"bot",body:FZ,timestamp:Date.now()}),hZ=!0}},replyOptions:{onModelSelected:A,onAgentRunStart:()=>{if(E)return;k({type:"stream_start",conversationId:J,messageId:j}),E=!0},onPartialReply:(P)=>{let f=P.text;if(!f)return;m+=1;let FZ="";if(f.startsWith(v)){if(FZ=f.slice(v.length),x==="unknown")x="cumulative"}else if(!v.startsWith(f)){if(FZ=f,x==="unknown")x="incremental"}if(v=f,!FZ)return;if(W+=FZ.length,l>=B3)return;if(QZ+=FZ,QZ.length>=N7){if(d)clearTimeout(d),d=null;x0()}else w5()}}})}catch(P){A0=P instanceof Error?P.message:String(P)}finally{if(d)clearTimeout(d),d=null;if(x0(),E)k({type:"stream_end",conversationId:J,messageId:j,body:n}),hZ=!0;let P=n?Q5(n):Math.max(0,Math.ceil(W/4));if(P>0){let f=lZ.get(q.agentId)??{in:0,out:0};f.out+=P,lZ.set(q.agentId,f)}AZ(q.agentId,"idle",{activeElapsedMs:Date.now()-c},V),console.log(`${u} [stream] conv=${J} msg=${j.slice(0,8)} callbacks=${m} mode=${x} streamedChars=${W} tokenEvents=${l} finalLen=${n.length}`),M0.delete(J)}if(A0){if(b.signal.aborted){S("GENERATION_STOPPED","Generation stopped.");return}S("REPLY_FAILED",A0.trim()||"Failed to generate a reply.");return}if(!hZ)S("NO_REPLY","No response generated. Please try again.")}async function D8(Z){let{envelope:$,accountId:Q,config:X,core:Y,logger:H}=Z,V=X;switch($.type){case"message":{if($.from!=="user")return;await L8({envelope:$,accountId:Q,config:X,core:Y,logger:H});return}case"stop_generation":{let J=R($.conversationId),q=M0.get(J);if(q)q.abort(),M0.delete(J);return}case"state_sync_request":{Y5(V,$);return}case"client_state":return;case"cron_list_request":{MZ(V,{includeDisabled:$.includeDisabled===!0,force:!0});return}case"cron_run":{let J=await c3(V,$.jobId);if(!J.ok)k({type:"error",code:"cron_run_failed",message:J.error??"unknown"});else MZ(V,{includeDisabled:!0});return}case"cron_toggle":{let J=await l3(V,$.jobId,$.enabled);if(!J.ok)k({type:"error",code:"cron_toggle_failed",message:J.error??"unknown"});else MZ(V,{includeDisabled:!0});return}case"cron_create_from_prompt":{let J=D5(V,$.agentId),q=g($.description);if(!J||!q){k({type:"error",code:"cron_create_invalid",message:"Agent and description are required to create a task."});return}let K=await d3(V,{name:Q8($.name,q),description:q,agentId:J,enabled:!0,schedule:{kind:"every",everyMs:X8($.everyMs)},sessionTarget:"isolated",wakeMode:"now",payload:{kind:"agentTurn",message:q}});if(!K.ok)k({type:"error",code:"cron_create_failed",message:K.error??"unknown"});else MZ(V,{includeDisabled:!0});return}case"cron_runs_request":{let J=p3(V,$.jobId,$.limit??20);k({type:"cron_runs",jobId:$.jobId,runs:J.filter((q)=>q.status).map((q)=>({ts:q.ts,status:q.status,durationMs:q.durationMs,summary:q.summary,error:q.error}))});return}case"subscribe":{let J=$.topics.includes("agents"),q=$.topics.includes("cron");if(J)k({type:"agent_list",agents:C0(V)});if(q)MZ(V,{includeDisabled:!0,force:!0});Y5(V);return}default:return}}function U8(){return dZ.length}function G3(Z,$){let Q=null;return()=>{if(Q)clearTimeout(Q);Q=setTimeout(()=>{Q=null,Z()},$),S3.push(Q)}}function _3(Z){let $=e0(Z).map((V)=>({...V})),Q=new Set($.map((V)=>V.sessionFile)),X=new Set($.slice(0,R7).map((V)=>V.sessionFile)),Y=zZ.size===0;for(let V of $)if(!zZ.has(V.sessionFile))try{let J=w0(V.sessionFile),K=!Y||X.has(V.sessionFile)?Math.max(0,J.size-P7):J.size;zZ.set(V.sessionFile,{offset:K})}catch{zZ.set(V.sessionFile,{offset:0})}for(let V of zZ.keys())if(!Q.has(V))zZ.delete(V);let H=Date.now();for(let V of $){if(V.kind!=="cron")continue;let J=V.cronJobId;if(!J)continue;let q=q3(J),K=SZ(Z,V.agentId),B=V.cronLabel??q?.name,O=V.cronAgentId??q?.agentId??V.agentId,L=V.cronAgentName??q?.agentName??K.name,D=V.cronAgentEmoji??q?.agentEmoji??K.emoji;V.cronLabel=B??V.cronLabel,V.cronAgentId=O,V.cronAgentName=L,V.cronAgentEmoji=D,N0({id:J,name:B,agentId:O,agentName:L,agentEmoji:D,updatedAt:Math.max(V.updatedAt||0,H)}),r0({conversationId:V.conversationId,cronJobId:J,cronName:B,cronAgentId:O,cronAgentName:L,cronAgentEmoji:D},V.updatedAt||H)}k3=$,console.log(`${u} [watcher] refreshed session mappings: ${$.length} transcripts tracked`)}function W3(Z){let $=0,Q=H5(Z);for(let X of k3){let Y=zZ.get(X.sessionFile)??{offset:0},H=N4(X.sessionFile,X,Z,Y,Q);if(zZ.set(X.sessionFile,H.cursor),X.kind==="cron"&&X.cronJobId)r0({conversationId:X.conversationId,cronJobId:X.cronJobId,cronName:X.cronLabel,cronAgentId:X.cronAgentId??X.agentId,cronAgentName:X.cronAgentName,cronAgentEmoji:X.cronAgentEmoji},X.updatedAt||Date.now());for(let V of H.messages)if(H4({conversationId:V.conversationId,agent:V.agent,role:V.role,content:V.content,timestamp:V.timestamp,stableId:V.stableId}))$++}if($>0)console.log(`${u} [tailer] ingested ${$} new transcript messages`)}function F8(Z){let $=UZ.join(iZ.homedir(),".openclaw"),Q=_8(Z);try{let H=O3(Q,G3(()=>{console.log(`${u} [watcher] cron jobs.json changed, reloading`),MZ(Z,{includeDisabled:!0})},500));dZ.push(H),console.log(`${u} [watcher] watching cron: ${Q}`)}catch(H){console.warn(`${u} [watcher] failed to watch cron store: ${String(H)}`)}let X=UZ.join($,"agents");try{let H=O3(X,{recursive:!0},G3(()=>{_3(Z),W3(Z)},1500));dZ.push(H),console.log(`${u} [watcher] watching sessions: ${X}`)}catch(H){console.warn(`${u} [watcher] failed to watch agents dir: ${String(H)}`)}_3(Z),W3(Z),P0=setInterval(()=>W3(Z),5000),R0=setInterval(()=>_3(Z),60000);let Y=UZ.join($,"openclaw.json");try{let H=O3(Y,G3(()=>{console.log(`${u} [watcher] config changed, re-resolving agents`),k({type:"agent_list",agents:C0(Z)})},1000));dZ.push(H),console.log(`${u} [watcher] watching config: ${Y}`)}catch(H){console.warn(`${u} [watcher] failed to watch config: ${String(H)}`)}}function G8(){if(P0)clearInterval(P0),P0=null;if(R0)clearInterval(R0),R0=null;for(let Z of S3)clearTimeout(Z);S3=[];for(let Z of dZ)try{Z.close()}catch{}dZ.length=0,zZ.clear(),k3=[]}function _8(Z){let $=Z.cron?.store;if(typeof $==="string"&&$.trim()){let Q=$.trim();if(Q.startsWith("~"))return UZ.resolve(Q.replace("~",iZ.homedir()));return UZ.resolve(Q)}return UZ.join(iZ.homedir(),".openclaw","cron","jobs.json")}async function F5(Z){let{account:$,accountId:Q,config:X,abortSignal:Y,runtime:H}=Z,V=X,J=J0(),q={info:(O)=>H.log(O),error:(O)=>H.error(O)};if(LZ)LZ.stop(),LZ=null;let K=null,B=null;i4(),$4();try{let O=E4(V,H5(V));if(O.length>0){for(let L of O){if(L.kind!=="cron"||!L.cronJobId)continue;N0({id:L.cronJobId,name:L.cronName,agentId:L.cronAgentId,agentName:L.cronAgentName,agentEmoji:L.cronAgentEmoji,updatedAt:L.updatedAt})}Q4(O)}}catch(O){console.error(`${u} failed to load historical conversations: ${String(O)}`)}try{N3.clear(),rZ.clear(),JZ.clear(),DZ.clear(),xZ.clear(),wZ.clear(),E3.clear(),cZ.clear(),O8(V),F8(V),K=new H3({account:$,onLegacyEnvelope:(O)=>{D8({envelope:O,accountId:Q,config:X,core:J,logger:q}).catch((L)=>{q.error(`${u} inbound envelope handling failed: ${String(L)}`)})},onSignalingStatus:(O)=>{q.info(`${u} signaling ${O?"connected":"disconnected"}`)},onDataChannelStatus:(O)=>{q.info(`${u} datachannel ${O?"connected":"disconnected"}`)}}),LZ=K,B=K.run(Y).catch((O)=>{q.error(`${u} transport run failed: ${String(O)}`)}),k({type:"agent_list",agents:C0(V)}),MZ(V,{includeDisabled:!0,force:!0}),await new Promise((O)=>{if(Y.aborted){O();return}Y.addEventListener("abort",()=>O(),{once:!0})})}finally{if(K){if(K.stop(),LZ===K)LZ=null}if(B)await B;G8(),B8(),rZ.clear(),JZ.clear(),DZ.clear(),xZ.clear(),r4()}}var u="[botmobile]",N7=120,B3,E7=350,P7=524288,R7=50,M7=15000,t4=72,w7=86400000,a4="[botmobile:hook]",z3="generating response",e4=48,S7=500,j7=3000,C7,k7,A7,LZ=null,H0=null,Z5=null,L3=0,M0,N3,lZ,wZ,E3,cZ,D3,U3,F3,rZ,JZ,DZ,xZ,dZ,S3,k3,zZ,P0=null,R0=null;var V0=KZ(()=>{q0();K0();i3();Q0();P4();u4();n4();W7.setDefaultResultOrder("ipv4first");B3=Number.MAX_SAFE_INTEGER,C7=/^agent:[^:]+:botmobil[e]?:direct:(.+)$/i,k7=/^agent:conversation:([^:]+):main$/i,A7=/^agent:[^:]+:cron:([^:]+)(?::run:[^:]+)?$/i,M0=new Map,N3=new Map,lZ=new Map,wZ=new Map,E3=new Map,cZ=new Map,D3=new Map,U3=new Map,F3=new Map,rZ=new Map,JZ=new Map,DZ=new Map,xZ=new Set;dZ=[],S3=[],k3=[],zZ=new Map});import{emptyPluginConfigSchema as P8}from"openclaw/plugin-sdk";V0();import W8 from"qrcode-terminal";import z8 from"ws";var sZ="https://botmobile.vantis.ai";var NZ="[botmobile]";function N8(Z,$){let Q=JSON.stringify({v:2,c:Z,w:$}),X=Buffer.from(Q).toString("base64url");W8.generate(`botmobile://${X}`,{small:!0},(Y)=>{console.log(`
12
+ `)}let z=Q5(U);if(z>0){let P=lZ.get(q.agentId)??{in:0,out:0};P.in+=z,lZ.set(q.agentId,P)}let N=Y.channel.reply.formatAgentEnvelope({channel:"BotMobile",from:`user:${$.from}`,timestamp:$.timestamp,envelope:Y.channel.reply.resolveEnvelopeFormatOptions(V),body:U}),G=Y.channel.reply.finalizeInboundContext({Body:N,RawBody:$.body,CommandBody:$.body,From:`botmobile:user:${J}`,To:"botmobile:bot:default",SessionKey:q.sessionKey,AccountId:q.accountId,ChatType:"direct",ConversationLabel:J,SenderName:"User",SenderId:J,Provider:"botmobile",Surface:"botmobile",MessageSid:$.id,OriginatingChannel:"botmobile",OriginatingTo:"botmobile:bot:default"}),T=Y.channel.session.resolveStorePath(V.session?.store,{agentId:q.agentId});await Y.channel.session.recordInboundSession({storePath:T,sessionKey:G.SessionKey??q.sessionKey,ctx:G,updateLastRoute:{sessionKey:q.mainSessionKey,channel:"botmobile",to:`botmobile:user:${J}`,accountId:q.accountId},onRecordError:(P)=>{H.error(`Failed updating session meta: ${String(P)}`)}});let{onModelSelected:A,...p}=z7({cfg:V,agentId:q.agentId,channel:"botmobile",accountId:Q}),b=new AbortController;w0.set(J,b);let S=(P,f)=>{k({type:"error",code:P,message:f,conversationId:J})};k({type:"composing",conversationId:J,from:"bot"});let c=Date.now();AZ(q.agentId,"working",{activeConversationId:J,activeTool:z3},V);let j=crypto.randomUUID(),E=!1,v="",W=0,m=0,x="unknown",l=0,n="",QZ="",d=null,hZ=!1,x0=null,h0=()=>{if(!QZ)return;if(l>=B3){QZ="";return}if(!E)k({type:"stream_start",conversationId:J,messageId:j}),E=!0;k({type:"stream_token",conversationId:J,messageId:j,token:QZ}),QZ="",l+=1},w5=()=>{if(d||l>=B3)return;d=setTimeout(()=>{d=null,h0()},E7)};try{await Y.channel.reply.dispatchReplyWithBufferedBlockDispatcher({ctx:G,cfg:V,dispatcherOptions:{...p,deliver:async(P)=>{let f=[];if(typeof P.text==="string"&&P.text.trim().length>0)f.push(P.text);if(typeof P.mediaUrl==="string"&&P.mediaUrl.trim().length>0)f.push(P.mediaUrl);if(Array.isArray(P.mediaUrls)){for(let T0 of P.mediaUrls)if(typeof T0==="string"&&T0.trim().length>0)f.push(T0)}let FZ=f.join(`
13
+ `).trim();if(!FZ)return;n=FZ,k({type:"message",id:j,conversationId:J,from:"bot",body:FZ,timestamp:Date.now()}),hZ=!0}},replyOptions:{onModelSelected:A,onAgentRunStart:()=>{if(E)return;k({type:"stream_start",conversationId:J,messageId:j}),E=!0},onPartialReply:(P)=>{let f=P.text;if(!f)return;m+=1;let FZ="";if(f.startsWith(v)){if(FZ=f.slice(v.length),x==="unknown")x="cumulative"}else if(!v.startsWith(f)){if(FZ=f,x==="unknown")x="incremental"}if(v=f,!FZ)return;if(W+=FZ.length,l>=B3)return;if(QZ+=FZ,QZ.length>=N7){if(d)clearTimeout(d),d=null;h0()}else w5()}}})}catch(P){x0=P instanceof Error?P.message:String(P)}finally{if(d)clearTimeout(d),d=null;if(h0(),E)k({type:"stream_end",conversationId:J,messageId:j,body:n}),hZ=!0;let P=n?Q5(n):Math.max(0,Math.ceil(W/4));if(P>0){let f=lZ.get(q.agentId)??{in:0,out:0};f.out+=P,lZ.set(q.agentId,f)}AZ(q.agentId,"idle",{activeElapsedMs:Date.now()-c},V),console.log(`${u} [stream] conv=${J} msg=${j.slice(0,8)} callbacks=${m} mode=${x} streamedChars=${W} tokenEvents=${l} finalLen=${n.length}`),w0.delete(J)}if(x0){if(b.signal.aborted){S("GENERATION_STOPPED","Generation stopped.");return}S("REPLY_FAILED",x0.trim()||"Failed to generate a reply.");return}if(!hZ)S("NO_REPLY","No response generated. Please try again.")}async function D8(Z){let{envelope:$,accountId:Q,config:X,core:Y,logger:H}=Z,V=X;switch($.type){case"message":{if($.from!=="user")return;await L8({envelope:$,accountId:Q,config:X,core:Y,logger:H});return}case"stop_generation":{let J=R($.conversationId),q=w0.get(J);if(q)q.abort(),w0.delete(J);return}case"state_sync_request":{Y5(V,$);return}case"client_state":return;case"cron_list_request":{MZ(V,{includeDisabled:$.includeDisabled===!0,force:!0});return}case"cron_run":{let J=await c3(V,$.jobId);if(!J.ok)k({type:"error",code:"cron_run_failed",message:J.error??"unknown"});else MZ(V,{includeDisabled:!0});return}case"cron_toggle":{let J=await l3(V,$.jobId,$.enabled);if(!J.ok)k({type:"error",code:"cron_toggle_failed",message:J.error??"unknown"});else MZ(V,{includeDisabled:!0});return}case"cron_create_from_prompt":{let J=D5(V,$.agentId),q=g($.description);if(!J||!q){k({type:"error",code:"cron_create_invalid",message:"Agent and description are required to create a task."});return}let K=await d3(V,{name:Q8($.name,q),description:q,agentId:J,enabled:!0,schedule:{kind:"every",everyMs:X8($.everyMs)},sessionTarget:"isolated",wakeMode:"now",payload:{kind:"agentTurn",message:q}});if(!K.ok)k({type:"error",code:"cron_create_failed",message:K.error??"unknown"});else MZ(V,{includeDisabled:!0});return}case"cron_runs_request":{let J=p3(V,$.jobId,$.limit??20);k({type:"cron_runs",jobId:$.jobId,runs:J.filter((q)=>q.status).map((q)=>({ts:q.ts,status:q.status,durationMs:q.durationMs,summary:q.summary,error:q.error}))});return}case"subscribe":{let J=$.topics.includes("agents"),q=$.topics.includes("cron");if(J)k({type:"agent_list",agents:k0(V)});if(q)MZ(V,{includeDisabled:!0,force:!0});Y5(V);return}default:return}}function U8(){return dZ.length}function _3(Z,$){let Q=null;return()=>{if(Q)clearTimeout(Q);Q=setTimeout(()=>{Q=null,Z()},$),S3.push(Q)}}function G3(Z){let $=Z3(Z).map((V)=>({...V})),Q=new Set($.map((V)=>V.sessionFile)),X=new Set($.slice(0,R7).map((V)=>V.sessionFile)),Y=zZ.size===0;for(let V of $)if(!zZ.has(V.sessionFile))try{let J=S0(V.sessionFile),K=!Y||X.has(V.sessionFile)?Math.max(0,J.size-P7):J.size;zZ.set(V.sessionFile,{offset:K})}catch{zZ.set(V.sessionFile,{offset:0})}for(let V of zZ.keys())if(!Q.has(V))zZ.delete(V);let H=Date.now();for(let V of $){if(V.kind!=="cron")continue;let J=V.cronJobId;if(!J)continue;let q=q3(J),K=SZ(Z,V.agentId),B=V.cronLabel??q?.name,O=V.cronAgentId??q?.agentId??V.agentId,L=V.cronAgentName??q?.agentName??K.name,D=V.cronAgentEmoji??q?.agentEmoji??K.emoji;V.cronLabel=B??V.cronLabel,V.cronAgentId=O,V.cronAgentName=L,V.cronAgentEmoji=D,E0({id:J,name:B,agentId:O,agentName:L,agentEmoji:D,updatedAt:Math.max(V.updatedAt||0,H)}),s0({conversationId:V.conversationId,cronJobId:J,cronName:B,cronAgentId:O,cronAgentName:L,cronAgentEmoji:D},V.updatedAt||H)}k3=$,console.log(`${u} [watcher] refreshed session mappings: ${$.length} transcripts tracked`)}function W3(Z){let $=0,Q=H5(Z);for(let X of k3){let Y=zZ.get(X.sessionFile)??{offset:0},H=N4(X.sessionFile,X,Z,Y,Q);if(zZ.set(X.sessionFile,H.cursor),X.kind==="cron"&&X.cronJobId)s0({conversationId:X.conversationId,cronJobId:X.cronJobId,cronName:X.cronLabel,cronAgentId:X.cronAgentId??X.agentId,cronAgentName:X.cronAgentName,cronAgentEmoji:X.cronAgentEmoji},X.updatedAt||Date.now());for(let V of H.messages)if(H4({conversationId:V.conversationId,agent:V.agent,role:V.role,content:V.content,timestamp:V.timestamp,stableId:V.stableId}))$++}if($>0)console.log(`${u} [tailer] ingested ${$} new transcript messages`)}function F8(Z){let $=UZ.join(iZ.homedir(),".openclaw"),Q=G8(Z);try{let H=O3(Q,_3(()=>{console.log(`${u} [watcher] cron jobs.json changed, reloading`),MZ(Z,{includeDisabled:!0})},500));dZ.push(H),console.log(`${u} [watcher] watching cron: ${Q}`)}catch(H){console.warn(`${u} [watcher] failed to watch cron store: ${String(H)}`)}let X=UZ.join($,"agents");try{let H=O3(X,{recursive:!0},_3(()=>{G3(Z),W3(Z)},1500));dZ.push(H),console.log(`${u} [watcher] watching sessions: ${X}`)}catch(H){console.warn(`${u} [watcher] failed to watch agents dir: ${String(H)}`)}G3(Z),W3(Z),R0=setInterval(()=>W3(Z),5000),M0=setInterval(()=>G3(Z),60000);let Y=UZ.join($,"openclaw.json");try{let H=O3(Y,_3(()=>{console.log(`${u} [watcher] config changed, re-resolving agents`),k({type:"agent_list",agents:k0(Z)})},1000));dZ.push(H),console.log(`${u} [watcher] watching config: ${Y}`)}catch(H){console.warn(`${u} [watcher] failed to watch config: ${String(H)}`)}}function _8(){if(R0)clearInterval(R0),R0=null;if(M0)clearInterval(M0),M0=null;for(let Z of S3)clearTimeout(Z);S3=[];for(let Z of dZ)try{Z.close()}catch{}dZ.length=0,zZ.clear(),k3=[]}function G8(Z){let $=Z.cron?.store;if(typeof $==="string"&&$.trim()){let Q=$.trim();if(Q.startsWith("~"))return UZ.resolve(Q.replace("~",iZ.homedir()));return UZ.resolve(Q)}return UZ.join(iZ.homedir(),".openclaw","cron","jobs.json")}async function F5(Z){let{account:$,accountId:Q,config:X,abortSignal:Y,runtime:H}=Z,V=X,J=J0(),q={info:(O)=>H.log(O),error:(O)=>H.error(O)};if(LZ)LZ.stop(),LZ=null;let K=null,B=null;i4(),$4();try{let O=E4(V,H5(V));if(O.length>0){for(let L of O){if(L.kind!=="cron"||!L.cronJobId)continue;E0({id:L.cronJobId,name:L.cronName,agentId:L.cronAgentId,agentName:L.cronAgentName,agentEmoji:L.cronAgentEmoji,updatedAt:L.updatedAt})}Q4(O)}}catch(O){console.error(`${u} failed to load historical conversations: ${String(O)}`)}try{N3.clear(),rZ.clear(),JZ.clear(),DZ.clear(),xZ.clear(),wZ.clear(),E3.clear(),cZ.clear(),O8(V),F8(V),K=new H3({account:$,onLegacyEnvelope:(O)=>{D8({envelope:O,accountId:Q,config:X,core:J,logger:q}).catch((L)=>{q.error(`${u} inbound envelope handling failed: ${String(L)}`)})},onSignalingStatus:(O)=>{q.info(`${u} signaling ${O?"connected":"disconnected"}`)},onDataChannelStatus:(O)=>{q.info(`${u} datachannel ${O?"connected":"disconnected"}`)}}),LZ=K,B=K.run(Y).catch((O)=>{q.error(`${u} transport run failed: ${String(O)}`)}),k({type:"agent_list",agents:k0(V)}),MZ(V,{includeDisabled:!0,force:!0}),await new Promise((O)=>{if(Y.aborted){O();return}Y.addEventListener("abort",()=>O(),{once:!0})})}finally{if(K){if(K.stop(),LZ===K)LZ=null}if(B)await B;_8(),B8(),rZ.clear(),JZ.clear(),DZ.clear(),xZ.clear(),r4()}}var u="[botmobile]",N7=120,B3,E7=350,P7=524288,R7=50,M7=15000,t4=72,w7=86400000,a4="[botmobile:hook]",z3="generating response",e4=48,S7=500,j7=3000,C7,k7,A7,LZ=null,H0=null,Z5=null,L3=0,w0,N3,lZ,wZ,E3,cZ,D3,U3,F3,rZ,JZ,DZ,xZ,dZ,S3,k3,zZ,R0=null,M0=null;var V0=KZ(()=>{q0();K0();i3();Q0();P4();u4();n4();W7.setDefaultResultOrder("ipv4first");B3=Number.MAX_SAFE_INTEGER,C7=/^agent:[^:]+:botmobil[e]?:direct:(.+)$/i,k7=/^agent:conversation:([^:]+):main$/i,A7=/^agent:[^:]+:cron:([^:]+)(?::run:[^:]+)?$/i,w0=new Map,N3=new Map,lZ=new Map,wZ=new Map,E3=new Map,cZ=new Map,D3=new Map,U3=new Map,F3=new Map,rZ=new Map,JZ=new Map,DZ=new Map,xZ=new Set;dZ=[],S3=[],k3=[],zZ=new Map});import{emptyPluginConfigSchema as P8}from"openclaw/plugin-sdk";V0();import W8 from"qrcode-terminal";import z8 from"ws";var sZ="https://botmobile.vantis.ai";var NZ="[botmobile]";function N8(Z,$){let Q=JSON.stringify({v:2,c:Z,w:$}),X=Buffer.from(Q).toString("base64url");W8.generate(`botmobile://${X}`,{small:!0},(Y)=>{console.log(`
14
14
  Scan this QR code with the BotMobile app:
15
15
  `),console.log(Y),console.log(`
16
16
  Or enter code manually: ${Z}
17
- `)})}async function _5(Z){let $=sZ;console.log(`${NZ} initiating pairing with worker=${$}`),console.log(`${NZ} instance=${Z}`);let Q=await fetch(`${$}/api/pair/init`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({ocInstanceId:Z})});if(!Q.ok){let V=await Q.text();throw console.error(`${NZ} pairing init failed: ${Q.status} ${V}`),Error(`Failed to initiate pairing: ${V}`)}let X=await Q.json(),Y=(X.pairingCode??X.pairingId??"").toUpperCase();if(!/^[A-Z0-9]{4}-[A-Z0-9]{4}$/.test(Y))throw Error("Pairing init response missing valid pairing code");console.log(`${NZ} code=${Y}`),console.log(`${NZ} pairing code registered, showing QR`),N8(Y,$);let H=`${$.replace(/^http/,"ws")}/ws/pair?code=${encodeURIComponent(Y)}`;return console.log(`${NZ} connecting to pairing WS...`),new Promise((V,J)=>{let K=new z8(H),B=setTimeout(()=>{K.close(),J(Error("Pairing timed out"))},600000);K.on("open",()=>{console.log(`${NZ} pairing WS connected, waiting for phone...`)}),K.on("message",(O)=>{let L=JSON.parse(O.toString());if(L.type==="paired"&&L.userId&&L.sharedSecret)clearTimeout(B),K.close(),console.log(`${NZ} ✓ pairing complete! userId=${L.userId}`),V({userId:L.userId,sharedSecret:L.sharedSecret,pushSecret:L.pushSecret})}),K.on("close",()=>{clearTimeout(B)}),K.on("error",(O)=>{clearTimeout(B),console.error(`${NZ} pairing WS error: ${O.message}`),J(Error(`Pairing WS error: ${O.message}`))})})}var k0="[botmobile]";function W5(Z){return Z.channels?.botmobile}function z5(Z,$){let Q=Z.channels??{},X={...Q.botmobile??{}};return delete X.workerUrl,{...Z,channels:{...Q,botmobile:{...X,...$}}}}var N5={channel:"botmobile",async getStatus(Z){let $=W5(Z.cfg),Q=!!$?.sharedSecret,X=$?.enabled!==!1,Y=[];if(Q){if(Y.push(`BotMobile: paired (user: ${$?.userId?.slice(0,8)??"?"}...)`),Y.push(` Worker: ${sZ}`),typeof $?.pushSecret==="string"&&$.pushSecret.length>0)Y.push(" Push auth: configured");else Y.push(" Push auth: missing");if(!X)Y.push(" (disabled)")}else Y.push("BotMobile: not configured");return{channel:"botmobile",configured:Q,statusLines:Y,selectionHint:Q?void 0:"Pair your phone via QR code"}},async configure(Z){if(W5(Z.cfg)?.sharedSecret){if(!await Z.prompter.confirm({message:"BotMobile is already paired. Re-pair with a new device?"}))return{cfg:Z.cfg,accountId:"default"}}console.log(`${k0} starting pairing flow...`),await Z.prompter.note(`Scan the QR code below with the BotMobile iOS app.
18
- Or enter the code manually in the app.`,"BotMobile Pairing");let Q=crypto.randomUUID(),X=await _5(Q);console.log(`${k0} pairing complete, saving config`);let Y=z5(Z.cfg,{enabled:!0,sharedSecret:X.sharedSecret,pushSecret:X.pushSecret??"",userId:X.userId}),V=Y.channels;return console.log(`${k0} updatedCfg.channels keys: ${V?Object.keys(V).join(", "):"MISSING"}`),console.log(`${k0} updatedCfg.channels.botmobile: ${V?.botmobile?"present":"MISSING"}`),await Z.prompter.note(`Paired successfully! User ID: ${X.userId.slice(0,8)}...
17
+ `)})}async function G5(Z){let $=sZ;console.log(`${NZ} initiating pairing with worker=${$}`),console.log(`${NZ} instance=${Z}`);let Q=await fetch(`${$}/api/pair/init`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({ocInstanceId:Z})});if(!Q.ok){let V=await Q.text();throw console.error(`${NZ} pairing init failed: ${Q.status} ${V}`),Error(`Failed to initiate pairing: ${V}`)}let X=await Q.json(),Y=(X.pairingCode??X.pairingId??"").toUpperCase();if(!/^[A-Z0-9]{4}-[A-Z0-9]{4}$/.test(Y))throw Error("Pairing init response missing valid pairing code");console.log(`${NZ} code=${Y}`),console.log(`${NZ} pairing code registered, showing QR`),N8(Y,$);let H=`${$.replace(/^http/,"ws")}/ws/pair?code=${encodeURIComponent(Y)}`;return console.log(`${NZ} connecting to pairing WS...`),new Promise((V,J)=>{let K=new z8(H),B=setTimeout(()=>{K.close(),J(Error("Pairing timed out"))},600000);K.on("open",()=>{console.log(`${NZ} pairing WS connected, waiting for phone...`)}),K.on("message",(O)=>{let L=JSON.parse(O.toString());if(L.type==="paired"&&L.userId&&L.sharedSecret)clearTimeout(B),K.close(),console.log(`${NZ} ✓ pairing complete! userId=${L.userId}`),V({userId:L.userId,sharedSecret:L.sharedSecret,pushSecret:L.pushSecret})}),K.on("close",()=>{clearTimeout(B)}),K.on("error",(O)=>{clearTimeout(B),console.error(`${NZ} pairing WS error: ${O.message}`),J(Error(`Pairing WS error: ${O.message}`))})})}var A0="[botmobile]";function W5(Z){return Z.channels?.botmobile}function z5(Z,$){let Q=Z.channels??{},X={...Q.botmobile??{}};return delete X.workerUrl,{...Z,channels:{...Q,botmobile:{...X,...$}}}}var N5={channel:"botmobile",async getStatus(Z){let $=W5(Z.cfg),Q=!!$?.sharedSecret,X=$?.enabled!==!1,Y=[];if(Q){if(Y.push(`BotMobile: paired (user: ${$?.userId?.slice(0,8)??"?"}...)`),Y.push(` Worker: ${sZ}`),typeof $?.pushSecret==="string"&&$.pushSecret.length>0)Y.push(" Push auth: configured");else Y.push(" Push auth: missing");if(!X)Y.push(" (disabled)")}else Y.push("BotMobile: not configured");return{channel:"botmobile",configured:Q,statusLines:Y,selectionHint:Q?void 0:"Pair your phone via QR code"}},async configure(Z){if(W5(Z.cfg)?.sharedSecret){if(!await Z.prompter.confirm({message:"BotMobile is already paired. Re-pair with a new device?"}))return{cfg:Z.cfg,accountId:"default"}}console.log(`${A0} starting pairing flow...`),await Z.prompter.note(`Scan the QR code below with the BotMobile iOS app.
18
+ Or enter the code manually in the app.`,"BotMobile Pairing");let Q=crypto.randomUUID(),X=await G5(Q);console.log(`${A0} pairing complete, saving config`);let Y=z5(Z.cfg,{enabled:!0,sharedSecret:X.sharedSecret,pushSecret:X.pushSecret??"",userId:X.userId}),V=Y.channels;return console.log(`${A0} updatedCfg.channels keys: ${V?Object.keys(V).join(", "):"MISSING"}`),console.log(`${A0} updatedCfg.channels.botmobile: ${V?.botmobile?"present":"MISSING"}`),await Z.prompter.note(`Paired successfully! User ID: ${X.userId.slice(0,8)}...
19
19
  The gateway will now connect to your phone.`,"BotMobile Connected"),{cfg:Y,accountId:"default"}},disable(Z){return z5(Z,{enabled:!1})}};q0();Q0();var qZ="[botmobile]",E5=new Map;function P5(Z){let $=Z.trim();if(!$)return Z;let Q=":user:",X=$.indexOf(Q);if(X>=0){let Y=$.slice(X+Q.length).trim();if(Y.length>0)return Y}return $}function E8(Z,$){if(!$)return Z;if(Z.startsWith($))return Z;return`${$} ${Z}`.trim()}function R5(Z){let{cfg:$,accountId:Q,conversationId:X}=Z,Y=null;try{Y=J0().channel.routing.resolveAgentRoute({cfg:$,channel:"botmobile",accountId:Q??"default",peer:{kind:"direct",id:X}})}catch(B){console.warn(`${qZ} outbound metadata route failed conv=${X}: ${String(B)}`);return}let H=Y.agentId;if(typeof H!=="string"||!H.trim())return;let V=bZ($,H);F0(X,{id:H,name:V.name,emoji:V.emoji});let J=E8(V.name,V.emoji);if(E5.get(X)===J)return;let K=Date.now();k({type:"conversation_list",conversations:[{id:X,name:J,createdAt:K,lastActivity:K}]}),E5.set(X,J),console.log(`${qZ} outbound conversation meta conv=${X} agent=${H} name="${J}" source=${V.source} emojiSource=${V.emojiSource??"none"}`)}var M5={id:"botmobile",meta:{id:"botmobile",label:"BotMobile",selectionLabel:"BotMobile (Mobile)",docsPath:"/channels/botmobile",blurb:"Mobile bridge for OpenClaw"},pairing:{idLabel:"botmobileUserId"},onboarding:N5,capabilities:{chatTypes:["direct"]},reload:{configPrefixes:["channels.botmobile"]},config:{listAccountIds:(Z)=>{let $=Z.channels?.botmobile,Q=!!$?.sharedSecret;return console.log(`${qZ} listAccountIds: botmobile=${!!$} sharedSecret=${Q}`),Q?["default"]:[]},resolveAccount:(Z,$)=>{let Q=Z.channels?.botmobile;return{sharedSecret:Q?.sharedSecret??"",pushSecret:Q?.pushSecret??"",userId:Q?.userId??"",workerUrl:sZ,enabled:Q?.enabled!==!1}},defaultAccountId:()=>"default",isConfigured:(Z,$)=>{return!!$.channels?.botmobile?.sharedSecret},isEnabled:(Z)=>Z?.enabled!==!1,describeAccount:(Z)=>({accountId:"default",enabled:Z?.enabled!==!1,configured:!!Z?.sharedSecret})},outbound:{deliveryMode:"hybrid",sendText:async({cfg:Z,accountId:$,to:Q,text:X})=>{let Y=P5(Q);R5({cfg:Z,accountId:$,conversationId:Y});let H={type:"message",id:crypto.randomUUID(),conversationId:Y,from:"bot",body:X,timestamp:Date.now()};if(Y!==Q)console.log(`${qZ} outbound sendText to=${Q} conv=${Y} (${X.length} chars)`);else console.log(`${qZ} outbound sendText to=${Q} (${X.length} chars)`);return k(H),{channel:"botmobile",messageId:H.id}},sendMedia:async({cfg:Z,accountId:$,to:Q,text:X,mediaUrl:Y})=>{let H=P5(Q);R5({cfg:Z,accountId:$,conversationId:H});let V=X?`${X}
20
- ${Y}`:Y,J={type:"message",id:crypto.randomUUID(),conversationId:H,from:"bot",body:V,timestamp:Date.now()};if(H!==Q)console.log(`${qZ} outbound sendMedia to=${Q} conv=${H} mediaUrl=${Y}`);else console.log(`${qZ} outbound sendMedia to=${Q} mediaUrl=${Y}`);return k(J),{channel:"botmobile",messageId:J.id}}},gateway:{startAccount:async(Z)=>{let{account:$,accountId:Q}=Z;console.log(`${qZ} gateway startAccount id=${Q} user=${$.userId}`),console.log(`${qZ} workerUrl=${$.workerUrl}`),console.log(`${qZ} configured=${!!$.sharedSecret} enabled=${$.enabled}`),Z.setStatus?.({accountId:Q,running:!0,lastStartAt:Date.now(),lastError:null});let{monitorBotMobileProvider:X}=await Promise.resolve().then(() => (V0(),G5));await X({account:$,accountId:Q,config:Z.cfg,runtime:Z.runtime,abortSignal:Z.abortSignal})},stopAccount:async(Z)=>{console.log(`${qZ} gateway stopAccount id=${Z.accountId}`),Z.setStatus?.({accountId:Z.accountId,running:!1,lastStopAt:Date.now()})}}};V0();V0();var R8={id:"botmobile-openclaw",name:"BotMobile",description:"Mobile bridge for OpenClaw",configSchema:P8(),register(Z){A3(Z.runtime),Z.registerChannel({plugin:M5}),Z.on("before_tool_call",($,Q)=>{j0({phase:"start",agentId:Q.agentId,sessionKey:Q.sessionKey,toolName:$.toolName,toolParams:$.params,config:Z.config})}),Z.on("after_tool_call",($,Q)=>{j0({phase:"end",agentId:Q.agentId,sessionKey:Q.sessionKey,toolName:$.toolName,toolParams:$.params,error:$.error,config:Z.config})}),Z.on("agent_end",($,Q)=>{C3({agentId:Q.agentId,sessionKey:Q.sessionKey,success:$.success,error:$.error,config:Z.config})})}},p9=R8;export{F5 as monitorBotMobileProvider,p9 as default};
20
+ ${Y}`:Y,J={type:"message",id:crypto.randomUUID(),conversationId:H,from:"bot",body:V,timestamp:Date.now()};if(H!==Q)console.log(`${qZ} outbound sendMedia to=${Q} conv=${H} mediaUrl=${Y}`);else console.log(`${qZ} outbound sendMedia to=${Q} mediaUrl=${Y}`);return k(J),{channel:"botmobile",messageId:J.id}}},gateway:{startAccount:async(Z)=>{let{account:$,accountId:Q}=Z;console.log(`${qZ} gateway startAccount id=${Q} user=${$.userId}`),console.log(`${qZ} workerUrl=${$.workerUrl}`),console.log(`${qZ} configured=${!!$.sharedSecret} enabled=${$.enabled}`),Z.setStatus?.({accountId:Q,running:!0,lastStartAt:Date.now(),lastError:null});let{monitorBotMobileProvider:X}=await Promise.resolve().then(() => (V0(),_5));await X({account:$,accountId:Q,config:Z.cfg,runtime:Z.runtime,abortSignal:Z.abortSignal})},stopAccount:async(Z)=>{console.log(`${qZ} gateway stopAccount id=${Z.accountId}`),Z.setStatus?.({accountId:Z.accountId,running:!1,lastStopAt:Date.now()})}}};V0();V0();var R8={id:"botmobile-openclaw",name:"BotMobile",description:"Mobile bridge for OpenClaw",configSchema:P8(),register(Z){A3(Z.runtime),Z.registerChannel({plugin:M5}),Z.on("before_tool_call",($,Q)=>{C0({phase:"start",agentId:Q.agentId,sessionKey:Q.sessionKey,toolName:$.toolName,toolParams:$.params,config:Z.config})}),Z.on("after_tool_call",($,Q)=>{C0({phase:"end",agentId:Q.agentId,sessionKey:Q.sessionKey,toolName:$.toolName,toolParams:$.params,error:$.error,config:Z.config})}),Z.on("agent_end",($,Q)=>{C3({agentId:Q.agentId,sessionKey:Q.sessionKey,success:$.success,error:$.error,config:Z.config})})}},p9=R8;export{F5 as monitorBotMobileProvider,p9 as default};
package/package.json CHANGED
@@ -1,13 +1,16 @@
1
1
  {
2
2
  "name": "@botmobile/botmobile-openclaw",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
4
4
  "description": "OpenClaw BotMobile mobile bridge plugin (private test build)",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist/",
8
- "openclaw.plugin.json"
8
+ "openclaw.plugin.json",
9
+ "scripts/postinstall.mjs"
9
10
  ],
10
- "scripts": {},
11
+ "scripts": {
12
+ "postinstall": "node scripts/postinstall.mjs"
13
+ },
11
14
  "dependencies": {
12
15
  "msgpackr": "^1.11.5",
13
16
  "node-datachannel": "^0.25.0",
@@ -0,0 +1,48 @@
1
+ import { execSync } from "node:child_process";
2
+ import { dirname, join } from "node:path";
3
+ import { existsSync } from "node:fs";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const ndcDir = join(__dirname, "..", "node_modules", "node-datachannel");
8
+
9
+ if (!existsSync(ndcDir)) {
10
+ console.error("[botmobile] node-datachannel not found at", ndcDir);
11
+ process.exit(1);
12
+ }
13
+
14
+ const binaryPath = join(ndcDir, "build", "Release", "node_datachannel.node");
15
+
16
+ if (existsSync(binaryPath)) {
17
+ // Binary exists, all good
18
+ process.exit(0);
19
+ }
20
+
21
+ console.log("[botmobile] node-datachannel native binary not found, running prebuild-install…");
22
+
23
+ // Try prebuild-install (downloads prebuilt binary from GitHub releases)
24
+ try {
25
+ execSync("npx prebuild-install -r napi --verbose", {
26
+ cwd: ndcDir,
27
+ stdio: "inherit",
28
+ timeout: 120_000,
29
+ });
30
+ } catch {
31
+ console.error(
32
+ "[botmobile] prebuild-install failed. The native binary for node-datachannel could not be downloaded."
33
+ );
34
+ console.error(
35
+ "[botmobile] To build from source, install build tools and run:"
36
+ );
37
+ console.error(` apt-get install -y build-essential cmake`);
38
+ console.error(` cd ${ndcDir} && npx cmake-js compile -r napi`);
39
+ process.exit(1);
40
+ }
41
+
42
+ // Verify the binary was actually created
43
+ if (!existsSync(binaryPath)) {
44
+ console.error("[botmobile] prebuild-install completed but binary still missing at:", binaryPath);
45
+ process.exit(1);
46
+ }
47
+
48
+ console.log("[botmobile] node-datachannel native binary installed successfully");