@elizaos/core 2.0.0-alpha.74 → 2.0.0-alpha.76

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.
@@ -3469,7 +3469,7 @@ $2`),f}let d=y(g.post??""),r=z.data?.providers,J=(r&&r.RECENT_MESSAGES)?.data?.r
3469
3469
  …redacted…
3470
3470
  ${q[q.length-1]}`}function sw$($,q){if($.includes("PRIVATE KEY-----"))return aw$($);let K=q.filter((O)=>typeof O==="string"&&O.length>0),P=K[K.length-1]??$,_=tw$(P);if(P===$)return _;return $.replace(P,_)}function ew$($,q){let K=$;for(let P of q)K=K.replace(P,(..._)=>sw$(_[0],_.slice(1,_.length-2)));return K}function $T$($,q){if(!$)return $;let K=q??{mode:"tools"};if(Fw$(K.mode)==="off")return $;let P=Qw$(K.patterns);if(!P.length)return $;return ew$($,P)}function qT$($){return $.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function KT$($,q){if(!$||!q)return $;let K=$,P=Object.entries(q).filter(([,_])=>typeof _==="string"&&_.length>=8).sort(([,_],[,O])=>O.length-_.length);for(let[_,O]of P){let Y=qT$(O),j=new RegExp(Y,"g");K=K.replace(j,`[REDACTED:${_}]`)}return K}function MW($,q={}){if(!$)return $;let K=$;if(q.secrets)K=KT$(K,q.secrets);if(q.applyPatterns!==!1)K=$T$(K);return K}mK();c6();class SW{stack=[];run($,q){this.stack.push($);try{return q()}finally{this.stack.pop()}}active(){return this.stack.length>0?this.stack[this.stack.length-1]:void 0}}var W2=null,XM=!1;function fU(){return typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.node<"u"}async function _T$(){if(fU())try{let{AsyncLocalStorage:$}=await import("node:async_hooks");return{storage:new $,run(q,K){return this.storage.run(q,K)},active(){return this.storage.getStore()}}}catch{return new SW}return new SW}function vM(){if(!W2){if(W2=new SW,fU()&&!XM)XM=!0,_T$().then(($)=>{W2=$}).catch(()=>{})}return W2}function OF$($){W2=$,XM=!0}function YF$(){return vM()}function NW($,q){return vM().run($,q)}function AM(){return vM().active()}class CW{stack=[];run($,q){this.stack.push($);try{return q()}finally{this.stack.pop()}}active(){return this.stack.length>0?this.stack[this.stack.length-1]:void 0}}var H2=null,GM=!1;function kU(){return typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.node<"u"}async function PT$(){if(kU())try{let{AsyncLocalStorage:$}=await import("node:async_hooks");return{storage:new $,run(q,K){return this.storage.run(q,K)},active(){return this.storage.getStore()}}}catch{return new CW}return new CW}function fM(){if(!H2){if(H2=new CW,kU()&&!GM)GM=!0,PT$().then(($)=>{H2=$}).catch(()=>{})}return H2}function JF$($){H2=$,GM=!0}function WF$(){return fM()}function VU($,q){return fM().run($,q)}function EW(){return fM().active()}NY();NP();G6();class VM extends Error{code;details;constructor($,q,K){super(q);this.name="StreamError",this.code=$,this.details=K}static isStreamError($){return $ instanceof VM}}var z2=10,OT$=102400,kM=1048576,YT$=/<actions>([\s\S]*?)<\/actions>/;function jT$($,q,K,P,_=z2){let O=$,Y=P;if(!Y){let W=O.indexOf(q);if(W!==-1)Y=!0,O=O.slice(W+q.length);else return{content:"",closed:!1,buffer:O,insideTag:!1}}let j=O.indexOf(K);if(j!==-1){let W=O.slice(0,j),z=O.slice(j+K.length);return{content:W,closed:!0,buffer:z,insideTag:!1}}if(O.length>_){let W=O.slice(0,-_),z=O.slice(-_);return{content:W,closed:!1,buffer:z,insideTag:!0}}return{content:"",closed:!1,buffer:O,insideTag:!0}}function RW($){if($.length>kM)throw new VM("CHUNK_TOO_LARGE",`Chunk size ${$.length} exceeds maximum allowed ${kM}`,{chunkSize:$.length,maxAllowed:kM})}function MU($,q=OT$,K=1024){if($.length>q)return $.slice(-K);return $}class F7{static STREAM_TAGS=["text"];static OPEN_TEXT_TAG="<text>";static CLOSE_TEXT_TAG="</text>";buffer="";insideTag=!1;currentTag=null;finished=!1;responseStrategy="pending";get done(){return this.finished}reset(){this.buffer="",this.insideTag=!1,this.currentTag=null,this.finished=!1,this.responseStrategy="pending"}push($){if(RW($),this.buffer+=$,this.responseStrategy==="pending")this.detectResponseStrategy();if(!this.insideTag){let P=F7.STREAM_TAGS[0],_=F7.OPEN_TEXT_TAG,O=F7.CLOSE_TEXT_TAG,Y=this.buffer.indexOf(_);if(Y!==-1)if(!this.shouldStreamTag(P)){let j=this.buffer.indexOf(O);if(j!==-1)this.buffer=this.buffer.slice(j+O.length)}else this.insideTag=!0,this.currentTag=P,this.buffer=this.buffer.slice(Y+_.length)}if(!this.insideTag)return this.buffer=MU(this.buffer),"";let q=`</${this.currentTag}>`,K=this.buffer.indexOf(q);if(K!==-1){let P=this.buffer.slice(0,K);return this.buffer=this.buffer.slice(K+q.length),this.insideTag=!1,this.currentTag=null,this.finished=!0,P}if(this.buffer.length>z2){let P=this.buffer.slice(0,-z2);return this.buffer=this.buffer.slice(-z2),P}return""}detectResponseStrategy(){let $=this.buffer.match(YT$);if($){let q=this.parseActions($[1]);this.responseStrategy=this.isDirectReply(q)?"direct":"delegated"}}parseActions($){return $.split(",").map((q)=>q.trim().toUpperCase()).filter(Boolean)}isDirectReply($){return $.length===1&&$[0]==="REPLY"}shouldStreamTag($){return $==="text"&&this.responseStrategy==="direct"}}class MM{buffer="";decided=!1;contentType=null;insideTextTag=!1;finished=!1;get done(){return this.finished}reset(){this.buffer="",this.decided=!1,this.contentType=null,this.insideTextTag=!1,this.finished=!1}push($){if(RW($),this.buffer+=$,!this.decided){let q=this.detectContentType();if(q)this.contentType=q,this.decided=!0;else return""}switch(this.contentType){case"json":return"";case"text":return this.handlePlainText();case"xml":return this.handleXml();default:return""}}detectContentType(){let $=this.buffer.trimStart();if($.length===0)return null;let q=$[0];if(q==="{"||q==="[")return"json";if(q==="<")return"xml";return"text"}handlePlainText(){let $=this.buffer;return this.buffer="",$}handleXml(){let $=jT$(this.buffer,"<text>","</text>",this.insideTextTag,z2);if(this.buffer=$.buffer,this.insideTextTag=$.insideTag,$.closed)this.finished=!0;if(!this.insideTextTag&&!$.closed)this.buffer=MU(this.buffer,1024,1024);return $.content}}class SM{_done=!1;get done(){return this._done}push($){return RW($),$}flush(){return""}reset(){this._done=!1}markComplete(){this._done=!0}}class NM{config;buffer="";fieldContents=new Map;validatedFields=new Set;emittedContent=new Map;fieldStates=new Map;state="streaming";constructor($){this.config=$;for(let q of $.streamFields)this.fieldStates.set(q,"pending")}get done(){return this.state==="complete"||this.state==="failed"}push($){if(this.config.abortSignal?.aborted){if(this.state!=="complete"&&this.state!=="failed")this.state="failed",this.emitEvent({eventType:"error",error:"Cancelled by user",timestamp:Date.now()});return""}if(this.state!=="streaming")return"";if(RW($),this.buffer+=$,this.extractFieldContents(),this.config.level<=1)this.checkPerFieldEmission();return""}flush(){if(this.state==="failed")return"";if(this.config.level>=2)for(let $ of this.config.streamFields){let q=this.fieldContents.get($)||"";if(q)this.emitFieldContent($,q)}return this.state="complete",this.emitEvent({eventType:"complete",timestamp:Date.now()}),""}reset(){this.buffer="",this.fieldContents.clear(),this.validatedFields.clear(),this.emittedContent.clear();for(let $ of this.config.streamFields)this.fieldStates.set($,"pending");this.state="streaming"}signalRetry($){if(this.state="retrying",!this.config.hasRichConsumer)this.config.onChunk(`
3471
3471
  -- that's not right, let me start again:
3472
- `);return this.emitEvent({eventType:"retry_start",retryCount:$,timestamp:Date.now()}),{validatedFields:Array.from(this.validatedFields)}}signalError($){this.state="failed",this.emitEvent({eventType:"error",error:$,timestamp:Date.now()})}getValidatedFields(){let $=new Map;for(let q of this.validatedFields){let K=this.fieldContents.get(q);if(K)$.set(q,K)}return $}diagnose(){let $=[],q=[],K=[];for(let P of this.config.schema)switch(this.fieldStates.get(P.field)){case"pending":$.push(P.field);break;case"invalid":q.push(P.field);break;case"partial":K.push(P.field);break}return{missingFields:$,invalidFields:q,incompleteFields:K}}getState(){return this.state}extractFieldContents(){let $=this.config.schema.map((q)=>`<${q.field}>`);for(let q of this.config.schema){let K=q.field,P=`<${K}>`,_=`</${K}>`,O=this.buffer.indexOf(P);if(O===-1)continue;let Y=O+P.length,j=this.buffer.indexOf(_,Y);if(j!==-1){let W=this.buffer.substring(Y,j);this.fieldContents.set(K,W),this.fieldStates.set(K,"complete")}else if(this.fieldStates.get(K)!=="complete"){this.fieldStates.set(K,"partial");let W=this.buffer.length;for(let X of $){if(X===P)continue;let Z=this.buffer.indexOf(X,Y);if(Z!==-1&&Z<W)W=Z}let z=this.buffer.substring(Y,W);this.fieldContents.set(K,z)}}}checkPerFieldEmission(){for(let $ of this.config.streamFields){let q=this.fieldStates.get($);if(q==="invalid")continue;let K=this.fieldContents.get($);if(!K)continue;let P=this.config.expectedCodes.get($);if(P){let _=this.checkValidationCode($,"start",P),O=this.checkValidationCode($,"end",P);if(q==="complete")if(_&&O)this.validatedFields.add($),this.emitFieldContent($,K),this.emitEvent({eventType:"field_validated",field:$,timestamp:Date.now()});else if(_&&!O)this.fieldStates.set($,"invalid"),this.emitEvent({eventType:"error",field:$,error:`End validation code mismatch for ${$}`,timestamp:Date.now()});else this.fieldStates.set($,"invalid"),this.emitEvent({eventType:"error",field:$,error:`Validation codes mismatch for ${$}`,timestamp:Date.now()})}else if(this.config.level===0)this.emitFieldContent($,K);else if(q==="complete")this.emitFieldContent($,K)}}checkValidationCode($,q,K){let P=`code_${$}_${q}`,_=`<${P}>`,O=`</${P}>`,Y=this.buffer.indexOf(_);if(Y===-1)return!1;let j=Y+_.length,W=this.buffer.indexOf(O,j);if(W===-1)return!1;return this.buffer.substring(j,W).trim()===K}emitFieldContent($,q){let K=this.emittedContent.get($)||"";if(q.length<K.length){if(this.emittedContent.set($,q),q)this.config.onChunk(q,$),this.emitEvent({eventType:"chunk",field:$,chunk:q,timestamp:Date.now()});return}let P=q.substring(K.length);if(P)this.config.onChunk(P,$),this.emitEvent({eventType:"chunk",field:$,chunk:P,timestamp:Date.now()}),this.emittedContent.set($,q)}emitEvent($){if(this.config.onEvent)this.config.onEvent($)}}function JT$($){let q="";return{getStreamedText:()=>{let K=$.flush?.()??"";if(K)q+=K;return q},isComplete:()=>$.done,reset:()=>{$.reset?.(),q=""},appendText:(K)=>{q+=K}}}function SU($,q,K){let P=JT$($);return{onStreamChunk:async(_,O)=>{if($.done)return;let Y=$.push(_);if(Y)P.appendText(Y),await q(Y,O)},messageId:K,reset:P.reset,getStreamedText:P.getStreamedText,isComplete:P.isComplete}}G8();qO();c6();y6();var{default:Z2}=(()=>({}));class CM extends Q6{static serviceType=y8.VOICE_CACHE;capabilityDescription="Caches voice synthesis results to reduce latency and cost";cacheDir;constructor(){super();this.cacheDir=$O.join(process.cwd(),"cache","voice")}async initialize($){if(!Z2.existsSync(this.cacheDir))Z2.mkdirSync(this.cacheDir,{recursive:!0})}async stop(){}getCached($){let q=$O.join(this.cacheDir,`${$}.wav`);if(Z2.existsSync(q))try{return Z2.readFileSync(q)}catch(K){return ZA.error({error:K,filePath:q},"Error reading from voice cache"),null}return null}setCached($,q){let K=$O.join(this.cacheDir,`${$}.wav`);try{Z2.writeFileSync(K,q)}catch(P){ZA.error({error:P,filePath:K},"Error writing to voice cache")}}generateKey($,q,K){let P=XO.createHash("sha256");return P.update($),P.update(q),P.update(K),P.digest("hex")}shouldCache($){return $.split(/\s+/).length<=20}}function WT$($){return $.replace(/\{\{\{|\{\{/g,(q)=>`\\${q}`)}var i7=new Map;function HT$($){return!!($?.actions&&$.actions.length===1&&typeof $.actions[0]==="string"&&$.actions[0].toUpperCase()==="REPLY")}class EM{async handleMessage($,q,K,P){let _=typeof q.metadata==="object"&&q.metadata!==null&&"trajectoryStepId"in q.metadata?q.metadata.trajectoryStepId:void 0;return await VU(typeof _==="string"&&_.trim()!==""?{trajectoryStepId:_.trim()}:void 0,async()=>{let O=$.getSetting("SHOULD_RESPOND_MODEL"),Y=P?.shouldRespondModel??(O==="large"?"large":"small"),j={maxRetries:P?.maxRetries??3,timeoutDuration:P?.timeoutDuration??3600000,useMultiStep:P?.useMultiStep??x7(String($.getSetting("USE_MULTI_STEP")??"")),maxMultiStepIterations:P?.maxMultiStepIterations??parseInt(String($.getSetting("MAX_MULTISTEP_ITERATIONS")??"6"),10),onStreamChunk:P?.onStreamChunk,shouldRespondModel:Y},W,z=Tq(w6());try{$.logger.info({src:"service:message",agentId:$.agentId,entityId:q.entityId,roomId:q.roomId},"Message received");let X=i7.get($.agentId);if(!X)X=new Map,i7.set($.agentId,X);let Z=X.get(q.roomId);if(Z)O$.debug({src:"service:message",roomId:q.roomId,previousResponseId:Z,responseId:z},"Updating response ID");X.set(q.roomId,z);let G=$.startRun(q.roomId);if(!G)return $.logger.error("Failed to start run tracking"),{didRespond:!1,responseContent:null,responseMessages:[],state:{values:{},data:{},text:""},mode:"none"};let k=Date.now();await $.emitEvent("RUN_STARTED",{runtime:$,source:"messageHandler",runId:G,messageId:q.id,roomId:q.roomId,entityId:q.entityId,startTime:k,status:"started"});let S=new Promise((g,y)=>{W=setTimeout(async()=>{await $.emitEvent("RUN_TIMEOUT",{runtime:$,source:"messageHandler",runId:G,messageId:q.id,roomId:q.roomId,entityId:q.entityId,startTime:k,status:"timeout",endTime:Date.now(),duration:Date.now()-k,error:"Run exceeded timeout"}),y(Error("Run exceeded timeout"))},j.timeoutDuration)}),C,E=!1,R="",I=new CM;if(await I.initialize($),j.onStreamChunk){let g=new F7,y=j.onStreamChunk,d="";C={onStreamChunk:async(U,r)=>{if(g.done)return;let c=g.push(U);if(c){if(d+=c,!E&&Y0(d)){let{first:F}=dJ(d);if(R=F,F.length>5)E=!0,(async()=>{try{let J=$.character.settings?.voice,w=J?.model||"en_US-male-medium",v=J?.url||J?.voiceId||"default",T=I.generateKey(F,v,w),A=I.getCached(T);if(!A){let M={text:F,voice:v,model:w},N=await $.useModel(S$.TEXT_TO_SPEECH,M);if(N instanceof ArrayBuffer||Object.prototype.toString.call(N)==="[object ArrayBuffer]")A=Buffer.from(N);else if(Buffer.isBuffer(N))A=N;else if(N instanceof Uint8Array)A=Buffer.from(N);if(A)I.setCached(T,A)}if(A&&K){let M=A.toString("base64");await K({text:"",attachments:[{id:w6(),url:`data:audio/wav;base64,${M}`,title:"Voice Response",source:"voice-cache",description:"Voice response for first sentence",text:F,contentType:A8.AUDIO}],source:"voice"})}}catch(J){$.logger.error({error:J},"Error generating voice for first sentence")}})()}await y(c,r)}},messageId:z}}let b=NW(C,()=>this.processMessage($,q,K,z,G,k,j)),L=await Promise.race([b,S]);if(clearTimeout(W),E&&L.responseContent?.text){let y=L.responseContent.text.replace(R,"").trim();if(y.length>0)(async()=>{try{let d=$.character.settings?.voice,U=d?.model||"en_US-male-medium",r=d?.url||d?.voiceId||"default",c=I.generateKey(y,r,U),F=I.getCached(c);if(!F){let J={text:y,voice:r,model:U},w=await $.useModel(S$.TEXT_TO_SPEECH,J);if(w instanceof ArrayBuffer||Object.prototype.toString.call(w)==="[object ArrayBuffer]")F=Buffer.from(w);else if(Buffer.isBuffer(w))F=w;else if(w instanceof Uint8Array)F=Buffer.from(w);if(F)I.setCached(c,F)}if(F&&K){let J=F.toString("base64");await K({text:"",attachments:[{id:w6(),url:`data:audio/wav;base64,${J}`,title:"Voice Response",source:"voice-cache",description:"Voice response for remaining text",text:y,contentType:A8.AUDIO}],source:"voice"})}}catch(d){$.logger.error({error:d},"Error generating voice for remaining text")}})()}return L}finally{clearTimeout(W);let X=i7.get($.agentId);if(X){if(X.delete(q.roomId),X.size===0)i7.delete($.agentId)}}})}async processMessage($,q,K,P,_,O,Y){let j=i7.get($.agentId);if(!j)throw Error("Agent responses map not found");let W=q.content?.metadata&&typeof q.content.metadata==="object"&&q.content.metadata.isAutonomous===!0;if(q.entityId===$.agentId&&!W)return $.logger.debug({src:"service:message",agentId:$.agentId},"Skipping message from self"),await this.emitRunEnded($,_,q,O,"self"),{didRespond:!1,responseContent:null,responseMessages:[],state:{values:{},data:{},text:""},mode:"none"};$.logger.debug({src:"service:message",messagePreview:nm(q.content.text||"",50)},"Processing message"),$.logger.debug({src:"service:message"},"Saving message to memory");let z;if(q.id){let N=await $.getMemoryById(q.id);if(N)$.logger.debug({src:"service:message"},"Memory already exists, skipping creation"),z=N;else{let f=await $.createMemory(q,"messages");z={...q,id:f}}await $.queueEmbeddingGeneration(z,"high")}else{let N=await $.createMemory(q,"messages");q.id=N,z={...q,id:N},await $.queueEmbeddingGeneration(z,"normal")}let X=await $.getParticipantUserState(q.roomId,$.agentId);if(x7(String($.getSetting("BASIC_CAPABILITIES_DEFLLMOFF")||""))&&X===null)return $.logger.debug({src:"service:message"},"LLM is off by default"),await this.emitRunEnded($,_,q,O,"off"),{didRespond:!1,responseContent:null,responseMessages:[],state:{values:{},data:{},text:""},mode:"none"};let G=$.character.name??"agent";if(X==="MUTED"&&q.content.text&&!q.content.text.toLowerCase().includes(G.toLowerCase()))return $.logger.debug({src:"service:message",roomId:q.roomId},"Ignoring muted room"),await this.emitRunEnded($,_,q,O,"muted"),{didRespond:!1,responseContent:null,responseMessages:[],state:{values:{},data:{},text:""},mode:"none"};let k=await $.composeState(q,["ANXIETY","ENTITIES","CHARACTER","RECENT_MESSAGES","ACTIONS"],!0,!1),S=q.content.mentionContext,C=await $.getRoom(q.roomId);if(q.content.attachments&&q.content.attachments.length>0){if(q.content.attachments=await this.processAttachments($,q.content.attachments),q.id)await $.updateMemory({id:q.id,content:q.content})}let E=!0,R=typeof q.content.metadata==="object"&&q.content.metadata!==null?q.content.metadata:null,I=R?.isAutonomous===!0,b=typeof R?.autonomyMode==="string"?R.autonomyMode:null;if(I)$.logger.debug({src:"service:message",autonomyMode:b},"Autonomy message bypassing shouldRespond checks"),E=!0;else{let N=$.isCheckShouldRespondEnabled(),f=this.shouldRespond($,q,C??void 0,S);if($.logger.debug({src:"service:message",responseDecision:f,checkShouldRespondEnabled:N},"Response decision"),!N)$.logger.debug({src:"service:message"},"checkShouldRespond disabled, always responding (ChatGPT mode)"),E=!0;else if(f.skipEvaluation)$.logger.debug({src:"service:message",agentName:$.character.name??"Agent",reason:f.reason},"Skipping LLM evaluation"),E=f.shouldRespond;else{let H=d6({state:k,template:$.character.templates?.shouldRespondTemplate||a0}),V=Y.shouldRespondModel==="large"?S$.TEXT_LARGE:S$.TEXT_SMALL;$.logger.debug({src:"service:message",agentName:$.character.name??"Agent",reason:f.reason,model:Y.shouldRespondModel},"Using LLM evaluation");let h=await $.dynamicPromptExecFromState({state:k,params:{prompt:$.character.templates?.shouldRespondTemplate||a0},schema:[{field:"name",description:"The name of the agent responding",validateField:!1,streamField:!1},{field:"reasoning",description:"Your reasoning for this decision",validateField:!1,streamField:!1},{field:"action",description:"RESPOND | IGNORE | STOP",validateField:!1,streamField:!1}],options:{contextCheckLevel:0,modelSize:Y.shouldRespondModel==="large"?"large":"small",preferredEncapsulation:"xml"}});$.logger.debug({src:"service:message",responseObject:h},"Parsed evaluation result");let D=["IGNORE","NONE"],x=h?.action;E=typeof x==="string"&&!D.includes(x.toUpperCase())}}let L=null,g=[],y="none";if(E){let N=Y.useMultiStep?await this.runMultiStepCore($,q,k,K,Y,P):await this.runSingleShotCore($,q,k,Y,P);if(L=N.responseContent,g=N.responseMessages,k=N.state,y=N.mode,j.get(q.roomId)!==P)return $.logger.info({src:"service:message",agentId:$.agentId,roomId:q.roomId},"Response discarded - newer message being processed"),{didRespond:!1,responseContent:null,responseMessages:[],state:k,mode:"none"};if(L&&q.id)L.inReplyTo=S8($,q.id);if(L?.providers&&L.providers.length>0)k=await $.composeState(q,L.providers,!1,!1);if(g.length>0)for(let H of g){if(L)H.content=L;$.logger.debug({src:"service:message",memoryId:H.id},"Saving response to memory"),await $.createMemory(H,"messages"),await $.emitEvent("MESSAGE_SENT",{runtime:$,message:H,source:q.content.source??"messageHandler"})}if(L){if(y==="simple"){if(L.providers&&L.providers.length>0)$.logger.debug({src:"service:message",providers:L.providers},"Simple response used providers");if(K){if(L.text)L.text=$.redactSecrets(L.text);await K(L)}}else if(y==="actions")await $.processActions(q,g,k,async(H)=>{if($.logger.debug({src:"service:message",content:H},"Action callback"),L)L.actionCallbacks=H;if(K)return K(H);return[]},{onStreamChunk:Y.onStreamChunk})}}else{$.logger.debug({src:"service:message"},"Agent decided not to respond");let N=j.get(q.roomId),f=x7(String($.getSetting("BASIC_CAPABILITIES_KEEP_RESP")||""));if(N!==P&&!f)return $.logger.info({src:"service:message",agentId:$.agentId,roomId:q.roomId},"Ignore response discarded - newer message being processed"),await this.emitRunEnded($,_,q,O,"replaced"),{didRespond:!1,responseContent:null,responseMessages:[],state:k,mode:"none"};if(!q.id)return $.logger.error({src:"service:message",agentId:$.agentId},"Message ID is missing, cannot create ignore response"),await this.emitRunEnded($,_,q,O,"noMessageId"),{didRespond:!1,responseContent:null,responseMessages:[],state:k,mode:"none"};let H={thought:"Agent decided not to respond to this message.",actions:["IGNORE"],simple:!0,inReplyTo:S8($,q.id)};if(K)await K(H);let V={id:Tq(w6()),entityId:$.agentId,agentId:$.agentId,content:H,roomId:q.roomId,createdAt:Date.now()};await $.createMemory(V,"messages"),$.logger.debug({src:"service:message",memoryId:V.id},"Saved ignore response to memory")}if(j.delete(q.roomId),j.size===0)i7.delete($.agentId);await $.evaluate(q,k,E,async(N)=>{if($.logger.debug({src:"service:message",content:N},"Evaluate callback"),L)L.evalCallbacks=N;if(K){if(N.text)N.text=$.redactSecrets(N.text);return K(N)}return[]},g);let d="noname";if(q.metadata&&"entityName"in q.metadata&&typeof q.metadata.entityName==="string")d=q.metadata.entityName;let U=q.content&&q.content.channelType===A6.DM,r=d;if(!U){let N=await $.getRoomsByIds([q.roomId]);if(N?.length){let f=N[0];if(f.name)r=f.name;if(f.worldId){let H=await $.getWorld(f.worldId);if(H)r=`${H.name}-${r}`}}}let c=new Date,v=k.data?.providers?.ACTIONS?.data,A=(v&&"actionsData"in v?v.actionsData:void 0)?.map((N)=>N.name)??[],M={at:c.toString(),timestamp:Math.floor(c.getTime()/1000),messageId:q.id,userEntityId:q.entityId,input:q.content.text,thought:L?.thought,simple:L?.simple,availableActions:A,actions:L?.actions,providers:L?.providers,irt:L?.inReplyTo,output:L?.text,entityName:d,source:q.content.source,channelType:q.content.channelType,roomName:r};return await $.emitEvent("RUN_ENDED",{runtime:$,source:"messageHandler",runId:_,messageId:q.id,roomId:q.roomId,entityId:q.entityId,startTime:O,status:"completed",endTime:Date.now(),duration:Date.now()-O}),{didRespond:E,responseContent:L,responseMessages:g,state:k,mode:y}}shouldRespond($,q,K,P){if(!K)return{shouldRespond:!1,skipEvaluation:!0,reason:"no room context"};function _(S){if(!S||typeof S!=="string")return[];return S.trim().replace(/^\[|\]$/g,"").split(",").map((E)=>E.trim()).filter(Boolean)}let O=[A6.DM,A6.VOICE_DM,A6.SELF,A6.API],Y=["client_chat"],j=_($.getSetting("ALWAYS_RESPOND_CHANNELS")||$.getSetting("SHOULD_RESPOND_BYPASS_TYPES")),W=_($.getSetting("ALWAYS_RESPOND_SOURCES")||$.getSetting("SHOULD_RESPOND_BYPASS_SOURCES")),z=new Set([...O.map((S)=>S.toString()),...j].map((S)=>S.trim().toLowerCase())),X=[...Y,...W].map((S)=>S.trim().toLowerCase()),Z=K.type?.toString().toLowerCase(),G=q.content.source?.toLowerCase()||"";if(z.has(Z))return{shouldRespond:!0,skipEvaluation:!0,reason:`private channel: ${Z}`};if(X.some((S)=>G.includes(S)))return{shouldRespond:!0,skipEvaluation:!0,reason:`whitelisted source: ${G}`};if(!!(P?.isMention||P?.isReply))return{shouldRespond:!0,skipEvaluation:!0,reason:`platform ${P?.isMention?"mention":"reply"}`};return{shouldRespond:!1,skipEvaluation:!1,reason:"needs LLM evaluation"}}async processAttachments($,q){if(!q||q.length===0)return[];return $.logger.debug({src:"service:message",count:q.length},"Processing attachments"),await Promise.all(q.map(async(P)=>{let _={...P},O=/^(http|https):\/\//.test(P.url),Y=O?P.url:mJ(P.url);if(P.contentType===A8.IMAGE&&!P.description){let j=$.getSetting("DISABLE_IMAGE_DESCRIPTION");if(j===!0||j==="true")return _;$.logger.debug({src:"service:message",imageUrl:P.url},"Generating image description");let W=Y,z=$.fetch??globalThis.fetch;if(!O){let Z=await z(Y);if(!Z.ok)throw Error(`Failed to fetch image: ${Z.statusText}`);let G=await Z.arrayBuffer(),k=Buffer.from(G);W=`data:${Z.headers.get("content-type")||"application/octet-stream"};base64,${k.toString("base64")}`}let X=await $.useModel(S$.IMAGE_DESCRIPTION,{prompt:s0,imageUrl:W});if(typeof X==="string"){let Z=l6(X);if(Z&&(Z.description||Z.text))_.description=(typeof Z.description==="string"?Z.description:"")||"",_.title=(typeof Z.title==="string"?Z.title:"Image")||"Image",_.text=(typeof Z.text==="string"?Z.text:"")||(typeof Z.description==="string"?Z.description:"")||"",$.logger.debug({src:"service:message",descriptionPreview:_.description?.substring(0,100)},"Generated image description");else{let G=X,k=G.match(/<title>([^<]+)<\/title>/),S=G.match(/<description>([^<]+)<\/description>/),C=G.match(/<text>([^<]+)<\/text>/);if(k||S||C)_.title=k?.[1]||"Image",_.description=S?.[1]||"",_.text=C?.[1]||S?.[1]||"",$.logger.debug({src:"service:message",descriptionPreview:_.description?.substring(0,100)},"Used fallback XML parsing for description");else $.logger.warn({src:"service:message"},"Failed to parse XML response for image description")}}else if(X&&typeof X==="object"&&"description"in X){let Z=X;_.description=Z.description,_.title=Z.title||"Image",_.text=Z.description,$.logger.debug({src:"service:message",descriptionPreview:_.description?.substring(0,100)},"Generated image description")}else $.logger.warn({src:"service:message"},"Unexpected response format for image description")}else if(P.contentType===A8.DOCUMENT&&!P.text){let W=await($.fetch??globalThis.fetch)(Y);if(!W.ok)throw Error(`Failed to fetch document: ${W.statusText}`);let z=W.headers.get("content-type")||"";if(z.startsWith("text/plain")){$.logger.debug({src:"service:message",documentUrl:P.url},"Processing plain text document");let Z=await W.text();_.text=Z,_.title=_.title||"Text File",$.logger.debug({src:"service:message",textPreview:_.text?.substring(0,100)},"Extracted text content")}else $.logger.warn({src:"service:message",contentType:z},"Skipping non-plain-text document")}else if(P.contentType===A8.AUDIO&&!P.text){$.logger.debug({src:"service:message",audioUrl:P.url},"Transcribing audio attachment");try{let j=Y,W=$.fetch??globalThis.fetch;if(!O){let X=await W(Y);if(!X.ok)throw Error(`Failed to fetch audio: ${X.statusText}`);let Z=await X.arrayBuffer();j=Buffer.from(Z)}let z=await $.useModel(S$.TRANSCRIPTION,j);if(typeof z==="string"&&z.trim())_.text=z.trim(),_.title=_.title||"Audio",_.description=`Transcript: ${z.trim()}`,$.logger.debug({src:"service:message",transcriptPreview:_.text?.substring(0,100)},"Transcribed audio attachment")}catch(j){$.logger.warn({src:"service:message",err:j},"Audio transcription failed, continuing without transcript")}}else if(P.contentType===A8.VIDEO&&!P.text){$.logger.debug({src:"service:message",videoUrl:P.url},"Transcribing video attachment");try{let j=Y,W=$.fetch??globalThis.fetch;if(!O){let X=await W(Y);if(!X.ok)throw Error(`Failed to fetch video: ${X.statusText}`);let Z=await X.arrayBuffer();j=Buffer.from(Z)}let z=await $.useModel(S$.TRANSCRIPTION,j);if(typeof z==="string"&&z.trim())_.text=z.trim(),_.title=_.title||"Video",_.description=`Transcript: ${z.trim()}`,$.logger.debug({src:"service:message",transcriptPreview:_.text?.substring(0,100)},"Transcribed video attachment")}catch(j){$.logger.warn({src:"service:message",err:j},"Video transcription failed, continuing without transcript")}}return _}))}async runSingleShotCore($,q,K,P,_){if(K=await $.composeState(q,["ACTIONS"],!1,!1),!K.values||!K.values.actionNames)$.logger.warn({src:"service:message"},"actionNames data missing from state");let O=null,Y=P.onStreamChunk?new SM:void 0,j=Y&&P.onStreamChunk?SU(Y,P.onStreamChunk,_):void 0,W=$.character.templates?.messageHandlerTemplate||wW,z=await $.dynamicPromptExecFromState({state:K,params:{prompt:W},schema:[{field:"thought",description:"Your internal reasoning about the message and what to do",required:!0,validateField:!1,streamField:!1},{field:"actions",description:"List of actions to take (comma-separated)",required:!0,validateField:!1,streamField:!1},{field:"text",description:"The text response to send to the user",streamField:!0},{field:"simple",description:"Whether this is a simple response (true/false)",validateField:!1,streamField:!1}],options:{modelSize:"large",preferredEncapsulation:"xml",requiredFields:["thought","actions"],maxRetries:P.maxRetries,onStreamChunk:j?.onStreamChunk}});if($.logger.debug({src:"service:message",parsedXml:z},"Parsed Response Content"),z){Y?.markComplete();let I=(()=>{if(Array.isArray(z.actions))return z.actions;if(typeof z.actions==="string")return z.actions.split(",").map((L)=>String(L).trim()).filter((L)=>L.length>0);return[]})(),b=!$.isActionPlanningEnabled()&&I.length>1?[I[0]]:I;O={...z,thought:String(z.thought||""),actions:b.length>0?b:["IGNORE"],providers:[],text:String(z.text||""),simple:z.simple===!0||z.simple==="true"}}else{let I=j?.getStreamedText?.()||"",b=j?.isComplete?.()??!1;if(b&&I)$.logger.info({src:"service:message",streamedTextLength:I.length,streamedTextPreview:I.substring(0,100)},"Text extraction complete - using streamed text"),O={thought:"Response generated via streaming",actions:["REPLY"],providers:[],text:I,simple:!0};else if(I&&!b){$.logger.debug({src:"service:message",streamedTextLength:I.length,streamedTextPreview:I.substring(0,100)},"Text cut mid-stream - attempting continuation"),j?.reset?.();let L=WT$(I),g=`${W}
3472
+ `);return this.emitEvent({eventType:"retry_start",retryCount:$,timestamp:Date.now()}),{validatedFields:Array.from(this.validatedFields)}}signalError($){this.state="failed",this.emitEvent({eventType:"error",error:$,timestamp:Date.now()})}getValidatedFields(){let $=new Map;for(let q of this.validatedFields){let K=this.fieldContents.get(q);if(K)$.set(q,K)}return $}diagnose(){let $=[],q=[],K=[];for(let P of this.config.schema)switch(this.fieldStates.get(P.field)){case"pending":$.push(P.field);break;case"invalid":q.push(P.field);break;case"partial":K.push(P.field);break}return{missingFields:$,invalidFields:q,incompleteFields:K}}getState(){return this.state}extractFieldContents(){let $=this.config.schema.map((q)=>`<${q.field}>`);for(let q of this.config.schema){let K=q.field,P=`<${K}>`,_=`</${K}>`,O=this.buffer.indexOf(P);if(O===-1)continue;let Y=O+P.length,j=this.buffer.indexOf(_,Y);if(j!==-1){let W=this.buffer.substring(Y,j);this.fieldContents.set(K,W),this.fieldStates.set(K,"complete")}else if(this.fieldStates.get(K)!=="complete"){this.fieldStates.set(K,"partial");let W=this.buffer.length;for(let X of $){if(X===P)continue;let Z=this.buffer.indexOf(X,Y);if(Z!==-1&&Z<W)W=Z}let z=this.buffer.substring(Y,W);this.fieldContents.set(K,z)}}}checkPerFieldEmission(){for(let $ of this.config.streamFields){let q=this.fieldStates.get($);if(q==="invalid")continue;let K=this.fieldContents.get($);if(!K)continue;let P=this.config.expectedCodes.get($);if(P){let _=this.checkValidationCode($,"start",P),O=this.checkValidationCode($,"end",P);if(q==="complete")if(_&&O)this.validatedFields.add($),this.emitFieldContent($,K),this.emitEvent({eventType:"field_validated",field:$,timestamp:Date.now()});else if(_&&!O)this.fieldStates.set($,"invalid"),this.emitEvent({eventType:"error",field:$,error:`End validation code mismatch for ${$}`,timestamp:Date.now()});else this.fieldStates.set($,"invalid"),this.emitEvent({eventType:"error",field:$,error:`Validation codes mismatch for ${$}`,timestamp:Date.now()})}else if(this.config.level===0)this.emitFieldContent($,K);else if(q==="complete")this.emitFieldContent($,K)}}checkValidationCode($,q,K){let P=`code_${$}_${q}`,_=`<${P}>`,O=`</${P}>`,Y=this.buffer.indexOf(_);if(Y===-1)return!1;let j=Y+_.length,W=this.buffer.indexOf(O,j);if(W===-1)return!1;return this.buffer.substring(j,W).trim()===K}emitFieldContent($,q){let K=this.emittedContent.get($)||"";if(q.length<K.length){if(this.emittedContent.set($,q),q)this.config.onChunk(q,$),this.emitEvent({eventType:"chunk",field:$,chunk:q,timestamp:Date.now()});return}let P=q.substring(K.length);if(P)this.config.onChunk(P,$),this.emitEvent({eventType:"chunk",field:$,chunk:P,timestamp:Date.now()}),this.emittedContent.set($,q)}emitEvent($){if(this.config.onEvent)this.config.onEvent($)}}function JT$($){let q="";return{getStreamedText:()=>{let K=$.flush?.()??"";if(K)q+=K;return q},isComplete:()=>$.done,reset:()=>{$.reset?.(),q=""},appendText:(K)=>{q+=K}}}function SU($,q,K){let P=JT$($);return{onStreamChunk:async(_,O)=>{if($.done)return;let Y=$.push(_);if(Y)P.appendText(Y),await q(Y,O)},messageId:K,reset:P.reset,getStreamedText:P.getStreamedText,isComplete:P.isComplete}}G8();qO();c6();y6();var{default:Z2}=(()=>({}));class CM extends Q6{static serviceType=y8.VOICE_CACHE;capabilityDescription="Caches voice synthesis results to reduce latency and cost";cacheDir;constructor(){super();this.cacheDir=$O.join(process.cwd(),"cache","voice")}async initialize($){if(!Z2.existsSync(this.cacheDir))Z2.mkdirSync(this.cacheDir,{recursive:!0})}async stop(){}getCached($){let q=$O.join(this.cacheDir,`${$}.wav`);if(Z2.existsSync(q))try{return Z2.readFileSync(q)}catch(K){return ZA.error({error:K,filePath:q},"Error reading from voice cache"),null}return null}setCached($,q){let K=$O.join(this.cacheDir,`${$}.wav`);try{Z2.writeFileSync(K,q)}catch(P){ZA.error({error:P,filePath:K},"Error writing to voice cache")}}generateKey($,q,K){let P=XO.createHash("sha256");return P.update($),P.update(q),P.update(K),P.digest("hex")}shouldCache($){return $.split(/\s+/).length<=20}}function WT$($){return $.replace(/\{\{\{|\{\{/g,(q)=>`\\${q}`)}var i7=new Map;function HT$($){return!!($?.actions&&$.actions.length===1&&typeof $.actions[0]==="string"&&$.actions[0].toUpperCase()==="REPLY")}class EM{async handleMessage($,q,K,P){let _=typeof q.metadata==="object"&&q.metadata!==null&&"trajectoryStepId"in q.metadata?q.metadata.trajectoryStepId:void 0;return await VU(typeof _==="string"&&_.trim()!==""?{trajectoryStepId:_.trim()}:void 0,async()=>{let O=$.getSetting("SHOULD_RESPOND_MODEL"),Y=P?.shouldRespondModel??(O==="large"?"large":"small"),j={maxRetries:P?.maxRetries??3,timeoutDuration:P?.timeoutDuration??3600000,useMultiStep:P?.useMultiStep??x7(String($.getSetting("USE_MULTI_STEP")??"")),maxMultiStepIterations:P?.maxMultiStepIterations??parseInt(String($.getSetting("MAX_MULTISTEP_ITERATIONS")??"6"),10),onStreamChunk:P?.onStreamChunk,shouldRespondModel:Y},W,z=Tq(w6());try{$.logger.info({src:"service:message",agentId:$.agentId,entityId:q.entityId,roomId:q.roomId},"Message received");let X=i7.get($.agentId);if(!X)X=new Map,i7.set($.agentId,X);let Z=X.get(q.roomId);if(Z)O$.debug({src:"service:message",roomId:q.roomId,previousResponseId:Z,responseId:z},"Updating response ID");X.set(q.roomId,z);let G=$.startRun(q.roomId);if(!G)return $.logger.error("Failed to start run tracking"),{didRespond:!1,responseContent:null,responseMessages:[],state:{values:{},data:{},text:""},mode:"none"};let k=Date.now();await $.emitEvent("RUN_STARTED",{runtime:$,source:"messageHandler",runId:G,messageId:q.id,roomId:q.roomId,entityId:q.entityId,startTime:k,status:"started"});let S=new Promise((g,y)=>{W=setTimeout(async()=>{await $.emitEvent("RUN_TIMEOUT",{runtime:$,source:"messageHandler",runId:G,messageId:q.id,roomId:q.roomId,entityId:q.entityId,startTime:k,status:"timeout",endTime:Date.now(),duration:Date.now()-k,error:"Run exceeded timeout"}),y(Error("Run exceeded timeout"))},j.timeoutDuration)}),C,E=!1,R="",I=new CM;if(await I.initialize($),j.onStreamChunk){let g=new F7,y=j.onStreamChunk,d="";C={onStreamChunk:async(U,r)=>{if(g.done)return;let c=g.push(U);if(c){if(d+=c,!E&&Y0(d)){let{first:F}=dJ(d);if(R=F,F.length>5)E=!0,(async()=>{try{let J=$.character.settings?.voice,w=J?.model||"en_US-male-medium",v=J?.url||J?.voiceId||"nova",T=I.generateKey(F,v,w),A=I.getCached(T);if(!A){let M={text:F,voice:v,model:w},N=await $.useModel(S$.TEXT_TO_SPEECH,M);if(N instanceof ArrayBuffer||Object.prototype.toString.call(N)==="[object ArrayBuffer]")A=Buffer.from(N);else if(Buffer.isBuffer(N))A=N;else if(N instanceof Uint8Array)A=Buffer.from(N);if(A)I.setCached(T,A)}if(A&&K){let M=A.toString("base64");await K({text:"",attachments:[{id:w6(),url:`data:audio/wav;base64,${M}`,title:"Voice Response",source:"voice-cache",description:"Voice response for first sentence",text:F,contentType:A8.AUDIO}],source:"voice"})}}catch(J){$.logger.error({error:J},"Error generating voice for first sentence")}})()}await y(c,r)}},messageId:z}}let b=NW(C,()=>this.processMessage($,q,K,z,G,k,j)),L=await Promise.race([b,S]);if(clearTimeout(W),E&&L.responseContent?.text){let y=L.responseContent.text.replace(R,"").trim();if(y.length>0)(async()=>{try{let d=$.character.settings?.voice,U=d?.model||"en_US-male-medium",r=d?.url||d?.voiceId||"nova",c=I.generateKey(y,r,U),F=I.getCached(c);if(!F){let J={text:y,voice:r,model:U},w=await $.useModel(S$.TEXT_TO_SPEECH,J);if(w instanceof ArrayBuffer||Object.prototype.toString.call(w)==="[object ArrayBuffer]")F=Buffer.from(w);else if(Buffer.isBuffer(w))F=w;else if(w instanceof Uint8Array)F=Buffer.from(w);if(F)I.setCached(c,F)}if(F&&K){let J=F.toString("base64");await K({text:"",attachments:[{id:w6(),url:`data:audio/wav;base64,${J}`,title:"Voice Response",source:"voice-cache",description:"Voice response for remaining text",text:y,contentType:A8.AUDIO}],source:"voice"})}}catch(d){$.logger.error({error:d},"Error generating voice for remaining text")}})()}return L}finally{clearTimeout(W);let X=i7.get($.agentId);if(X){if(X.delete(q.roomId),X.size===0)i7.delete($.agentId)}}})}async processMessage($,q,K,P,_,O,Y){let j=i7.get($.agentId);if(!j)throw Error("Agent responses map not found");let W=q.content?.metadata&&typeof q.content.metadata==="object"&&q.content.metadata.isAutonomous===!0;if(q.entityId===$.agentId&&!W)return $.logger.debug({src:"service:message",agentId:$.agentId},"Skipping message from self"),await this.emitRunEnded($,_,q,O,"self"),{didRespond:!1,responseContent:null,responseMessages:[],state:{values:{},data:{},text:""},mode:"none"};$.logger.debug({src:"service:message",messagePreview:nm(q.content.text||"",50)},"Processing message"),$.logger.debug({src:"service:message"},"Saving message to memory");let z;if(q.id){let N=await $.getMemoryById(q.id);if(N)$.logger.debug({src:"service:message"},"Memory already exists, skipping creation"),z=N;else{let f=await $.createMemory(q,"messages");z={...q,id:f}}await $.queueEmbeddingGeneration(z,"high")}else{let N=await $.createMemory(q,"messages");q.id=N,z={...q,id:N},await $.queueEmbeddingGeneration(z,"normal")}let X=await $.getParticipantUserState(q.roomId,$.agentId);if(x7(String($.getSetting("BASIC_CAPABILITIES_DEFLLMOFF")||""))&&X===null)return $.logger.debug({src:"service:message"},"LLM is off by default"),await this.emitRunEnded($,_,q,O,"off"),{didRespond:!1,responseContent:null,responseMessages:[],state:{values:{},data:{},text:""},mode:"none"};let G=$.character.name??"agent";if(X==="MUTED"&&q.content.text&&!q.content.text.toLowerCase().includes(G.toLowerCase()))return $.logger.debug({src:"service:message",roomId:q.roomId},"Ignoring muted room"),await this.emitRunEnded($,_,q,O,"muted"),{didRespond:!1,responseContent:null,responseMessages:[],state:{values:{},data:{},text:""},mode:"none"};let k=await $.composeState(q,["ANXIETY","ENTITIES","CHARACTER","RECENT_MESSAGES","ACTIONS"],!0,!1),S=q.content.mentionContext,C=await $.getRoom(q.roomId);if(q.content.attachments&&q.content.attachments.length>0){if(q.content.attachments=await this.processAttachments($,q.content.attachments),q.id)await $.updateMemory({id:q.id,content:q.content})}let E=!0,R=typeof q.content.metadata==="object"&&q.content.metadata!==null?q.content.metadata:null,I=R?.isAutonomous===!0,b=typeof R?.autonomyMode==="string"?R.autonomyMode:null;if(I)$.logger.debug({src:"service:message",autonomyMode:b},"Autonomy message bypassing shouldRespond checks"),E=!0;else{let N=$.isCheckShouldRespondEnabled(),f=this.shouldRespond($,q,C??void 0,S);if($.logger.debug({src:"service:message",responseDecision:f,checkShouldRespondEnabled:N},"Response decision"),!N)$.logger.debug({src:"service:message"},"checkShouldRespond disabled, always responding (ChatGPT mode)"),E=!0;else if(f.skipEvaluation)$.logger.debug({src:"service:message",agentName:$.character.name??"Agent",reason:f.reason},"Skipping LLM evaluation"),E=f.shouldRespond;else{let H=d6({state:k,template:$.character.templates?.shouldRespondTemplate||a0}),V=Y.shouldRespondModel==="large"?S$.TEXT_LARGE:S$.TEXT_SMALL;$.logger.debug({src:"service:message",agentName:$.character.name??"Agent",reason:f.reason,model:Y.shouldRespondModel},"Using LLM evaluation");let h=await $.dynamicPromptExecFromState({state:k,params:{prompt:$.character.templates?.shouldRespondTemplate||a0},schema:[{field:"name",description:"The name of the agent responding",validateField:!1,streamField:!1},{field:"reasoning",description:"Your reasoning for this decision",validateField:!1,streamField:!1},{field:"action",description:"RESPOND | IGNORE | STOP",validateField:!1,streamField:!1}],options:{contextCheckLevel:0,modelSize:Y.shouldRespondModel==="large"?"large":"small",preferredEncapsulation:"xml"}});$.logger.debug({src:"service:message",responseObject:h},"Parsed evaluation result");let D=["IGNORE","NONE"],x=h?.action;E=typeof x==="string"&&!D.includes(x.toUpperCase())}}let L=null,g=[],y="none";if(E){let N=Y.useMultiStep?await this.runMultiStepCore($,q,k,K,Y,P):await this.runSingleShotCore($,q,k,Y,P);if(L=N.responseContent,g=N.responseMessages,k=N.state,y=N.mode,j.get(q.roomId)!==P)return $.logger.info({src:"service:message",agentId:$.agentId,roomId:q.roomId},"Response discarded - newer message being processed"),{didRespond:!1,responseContent:null,responseMessages:[],state:k,mode:"none"};if(L&&q.id)L.inReplyTo=S8($,q.id);if(L?.providers&&L.providers.length>0)k=await $.composeState(q,L.providers,!1,!1);if(g.length>0)for(let H of g){if(L)H.content=L;$.logger.debug({src:"service:message",memoryId:H.id},"Saving response to memory"),await $.createMemory(H,"messages"),await $.emitEvent("MESSAGE_SENT",{runtime:$,message:H,source:q.content.source??"messageHandler"})}if(L){if(y==="simple"){if(L.providers&&L.providers.length>0)$.logger.debug({src:"service:message",providers:L.providers},"Simple response used providers");if(K){if(L.text)L.text=$.redactSecrets(L.text);await K(L)}}else if(y==="actions")await $.processActions(q,g,k,async(H)=>{if($.logger.debug({src:"service:message",content:H},"Action callback"),L)L.actionCallbacks=H;if(K)return K(H);return[]},{onStreamChunk:Y.onStreamChunk})}}else{$.logger.debug({src:"service:message"},"Agent decided not to respond");let N=j.get(q.roomId),f=x7(String($.getSetting("BASIC_CAPABILITIES_KEEP_RESP")||""));if(N!==P&&!f)return $.logger.info({src:"service:message",agentId:$.agentId,roomId:q.roomId},"Ignore response discarded - newer message being processed"),await this.emitRunEnded($,_,q,O,"replaced"),{didRespond:!1,responseContent:null,responseMessages:[],state:k,mode:"none"};if(!q.id)return $.logger.error({src:"service:message",agentId:$.agentId},"Message ID is missing, cannot create ignore response"),await this.emitRunEnded($,_,q,O,"noMessageId"),{didRespond:!1,responseContent:null,responseMessages:[],state:k,mode:"none"};let H={thought:"Agent decided not to respond to this message.",actions:["IGNORE"],simple:!0,inReplyTo:S8($,q.id)};if(K)await K(H);let V={id:Tq(w6()),entityId:$.agentId,agentId:$.agentId,content:H,roomId:q.roomId,createdAt:Date.now()};await $.createMemory(V,"messages"),$.logger.debug({src:"service:message",memoryId:V.id},"Saved ignore response to memory")}if(j.delete(q.roomId),j.size===0)i7.delete($.agentId);await $.evaluate(q,k,E,async(N)=>{if($.logger.debug({src:"service:message",content:N},"Evaluate callback"),L)L.evalCallbacks=N;if(K){if(N.text)N.text=$.redactSecrets(N.text);return K(N)}return[]},g);let d="noname";if(q.metadata&&"entityName"in q.metadata&&typeof q.metadata.entityName==="string")d=q.metadata.entityName;let U=q.content&&q.content.channelType===A6.DM,r=d;if(!U){let N=await $.getRoomsByIds([q.roomId]);if(N?.length){let f=N[0];if(f.name)r=f.name;if(f.worldId){let H=await $.getWorld(f.worldId);if(H)r=`${H.name}-${r}`}}}let c=new Date,v=k.data?.providers?.ACTIONS?.data,A=(v&&"actionsData"in v?v.actionsData:void 0)?.map((N)=>N.name)??[],M={at:c.toString(),timestamp:Math.floor(c.getTime()/1000),messageId:q.id,userEntityId:q.entityId,input:q.content.text,thought:L?.thought,simple:L?.simple,availableActions:A,actions:L?.actions,providers:L?.providers,irt:L?.inReplyTo,output:L?.text,entityName:d,source:q.content.source,channelType:q.content.channelType,roomName:r};return await $.emitEvent("RUN_ENDED",{runtime:$,source:"messageHandler",runId:_,messageId:q.id,roomId:q.roomId,entityId:q.entityId,startTime:O,status:"completed",endTime:Date.now(),duration:Date.now()-O}),{didRespond:E,responseContent:L,responseMessages:g,state:k,mode:y}}shouldRespond($,q,K,P){if(!K)return{shouldRespond:!1,skipEvaluation:!0,reason:"no room context"};function _(S){if(!S||typeof S!=="string")return[];return S.trim().replace(/^\[|\]$/g,"").split(",").map((E)=>E.trim()).filter(Boolean)}let O=[A6.DM,A6.VOICE_DM,A6.SELF,A6.API],Y=["client_chat"],j=_($.getSetting("ALWAYS_RESPOND_CHANNELS")||$.getSetting("SHOULD_RESPOND_BYPASS_TYPES")),W=_($.getSetting("ALWAYS_RESPOND_SOURCES")||$.getSetting("SHOULD_RESPOND_BYPASS_SOURCES")),z=new Set([...O.map((S)=>S.toString()),...j].map((S)=>S.trim().toLowerCase())),X=[...Y,...W].map((S)=>S.trim().toLowerCase()),Z=K.type?.toString().toLowerCase(),G=q.content.source?.toLowerCase()||"";if(z.has(Z))return{shouldRespond:!0,skipEvaluation:!0,reason:`private channel: ${Z}`};if(X.some((S)=>G.includes(S)))return{shouldRespond:!0,skipEvaluation:!0,reason:`whitelisted source: ${G}`};if(!!(P?.isMention||P?.isReply))return{shouldRespond:!0,skipEvaluation:!0,reason:`platform ${P?.isMention?"mention":"reply"}`};return{shouldRespond:!1,skipEvaluation:!1,reason:"needs LLM evaluation"}}async processAttachments($,q){if(!q||q.length===0)return[];return $.logger.debug({src:"service:message",count:q.length},"Processing attachments"),await Promise.all(q.map(async(P)=>{let _={...P},O=/^(http|https):\/\//.test(P.url),Y=O?P.url:mJ(P.url);if(P.contentType===A8.IMAGE&&!P.description){let j=$.getSetting("DISABLE_IMAGE_DESCRIPTION");if(j===!0||j==="true")return _;$.logger.debug({src:"service:message",imageUrl:P.url},"Generating image description");let W=Y,z=$.fetch??globalThis.fetch;if(!O){let Z=await z(Y);if(!Z.ok)throw Error(`Failed to fetch image: ${Z.statusText}`);let G=await Z.arrayBuffer(),k=Buffer.from(G);W=`data:${Z.headers.get("content-type")||"application/octet-stream"};base64,${k.toString("base64")}`}let X=await $.useModel(S$.IMAGE_DESCRIPTION,{prompt:s0,imageUrl:W});if(typeof X==="string"){let Z=l6(X);if(Z&&(Z.description||Z.text))_.description=(typeof Z.description==="string"?Z.description:"")||"",_.title=(typeof Z.title==="string"?Z.title:"Image")||"Image",_.text=(typeof Z.text==="string"?Z.text:"")||(typeof Z.description==="string"?Z.description:"")||"",$.logger.debug({src:"service:message",descriptionPreview:_.description?.substring(0,100)},"Generated image description");else{let G=X,k=G.match(/<title>([^<]+)<\/title>/),S=G.match(/<description>([^<]+)<\/description>/),C=G.match(/<text>([^<]+)<\/text>/);if(k||S||C)_.title=k?.[1]||"Image",_.description=S?.[1]||"",_.text=C?.[1]||S?.[1]||"",$.logger.debug({src:"service:message",descriptionPreview:_.description?.substring(0,100)},"Used fallback XML parsing for description");else $.logger.warn({src:"service:message"},"Failed to parse XML response for image description")}}else if(X&&typeof X==="object"&&"description"in X){let Z=X;_.description=Z.description,_.title=Z.title||"Image",_.text=Z.description,$.logger.debug({src:"service:message",descriptionPreview:_.description?.substring(0,100)},"Generated image description")}else $.logger.warn({src:"service:message"},"Unexpected response format for image description")}else if(P.contentType===A8.DOCUMENT&&!P.text){let W=await($.fetch??globalThis.fetch)(Y);if(!W.ok)throw Error(`Failed to fetch document: ${W.statusText}`);let z=W.headers.get("content-type")||"";if(z.startsWith("text/plain")){$.logger.debug({src:"service:message",documentUrl:P.url},"Processing plain text document");let Z=await W.text();_.text=Z,_.title=_.title||"Text File",$.logger.debug({src:"service:message",textPreview:_.text?.substring(0,100)},"Extracted text content")}else $.logger.warn({src:"service:message",contentType:z},"Skipping non-plain-text document")}else if(P.contentType===A8.AUDIO&&!P.text){$.logger.debug({src:"service:message",audioUrl:P.url},"Transcribing audio attachment");try{let j=Y,W=$.fetch??globalThis.fetch;if(!O){let X=await W(Y);if(!X.ok)throw Error(`Failed to fetch audio: ${X.statusText}`);let Z=await X.arrayBuffer();j=Buffer.from(Z)}let z=await $.useModel(S$.TRANSCRIPTION,j);if(typeof z==="string"&&z.trim())_.text=z.trim(),_.title=_.title||"Audio",_.description=`Transcript: ${z.trim()}`,$.logger.debug({src:"service:message",transcriptPreview:_.text?.substring(0,100)},"Transcribed audio attachment")}catch(j){$.logger.warn({src:"service:message",err:j},"Audio transcription failed, continuing without transcript")}}else if(P.contentType===A8.VIDEO&&!P.text){$.logger.debug({src:"service:message",videoUrl:P.url},"Transcribing video attachment");try{let j=Y,W=$.fetch??globalThis.fetch;if(!O){let X=await W(Y);if(!X.ok)throw Error(`Failed to fetch video: ${X.statusText}`);let Z=await X.arrayBuffer();j=Buffer.from(Z)}let z=await $.useModel(S$.TRANSCRIPTION,j);if(typeof z==="string"&&z.trim())_.text=z.trim(),_.title=_.title||"Video",_.description=`Transcript: ${z.trim()}`,$.logger.debug({src:"service:message",transcriptPreview:_.text?.substring(0,100)},"Transcribed video attachment")}catch(j){$.logger.warn({src:"service:message",err:j},"Video transcription failed, continuing without transcript")}}return _}))}async runSingleShotCore($,q,K,P,_){if(K=await $.composeState(q,["ACTIONS"],!1,!1),!K.values||!K.values.actionNames)$.logger.warn({src:"service:message"},"actionNames data missing from state");let O=null,Y=P.onStreamChunk?new SM:void 0,j=Y&&P.onStreamChunk?SU(Y,P.onStreamChunk,_):void 0,W=$.character.templates?.messageHandlerTemplate||wW,z=await $.dynamicPromptExecFromState({state:K,params:{prompt:W},schema:[{field:"thought",description:"Your internal reasoning about the message and what to do",required:!0,validateField:!1,streamField:!1},{field:"actions",description:"List of actions to take (comma-separated)",required:!0,validateField:!1,streamField:!1},{field:"text",description:"The text response to send to the user",streamField:!0},{field:"simple",description:"Whether this is a simple response (true/false)",validateField:!1,streamField:!1}],options:{modelSize:"large",preferredEncapsulation:"xml",requiredFields:["thought","actions"],maxRetries:P.maxRetries,onStreamChunk:j?.onStreamChunk}});if($.logger.debug({src:"service:message",parsedXml:z},"Parsed Response Content"),z){Y?.markComplete();let I=(()=>{if(Array.isArray(z.actions))return z.actions;if(typeof z.actions==="string")return z.actions.split(",").map((L)=>String(L).trim()).filter((L)=>L.length>0);return[]})(),b=!$.isActionPlanningEnabled()&&I.length>1?[I[0]]:I;O={...z,thought:String(z.thought||""),actions:b.length>0?b:["IGNORE"],providers:[],text:String(z.text||""),simple:z.simple===!0||z.simple==="true"}}else{let I=j?.getStreamedText?.()||"",b=j?.isComplete?.()??!1;if(b&&I)$.logger.info({src:"service:message",streamedTextLength:I.length,streamedTextPreview:I.substring(0,100)},"Text extraction complete - using streamed text"),O={thought:"Response generated via streaming",actions:["REPLY"],providers:[],text:I,simple:!0};else if(I&&!b){$.logger.debug({src:"service:message",streamedTextLength:I.length,streamedTextPreview:I.substring(0,100)},"Text cut mid-stream - attempting continuation"),j?.reset?.();let L=WT$(I),g=`${W}
3473
3473
 
3474
3474
  [CONTINUATION REQUIRED]
3475
3475
  Your previous response was cut off. The user already received this text:
@@ -3478,7 +3478,7 @@ Your previous response was cut off. The user already received this text:
3478
3478
  Continue EXACTLY from where you left off. Do NOT repeat what was already said.
3479
3479
  Output ONLY the continuation, starting immediately after the last character above.`,y=await $.dynamicPromptExecFromState({state:K,params:{prompt:g},schema:[{field:"text",description:"Continuation of response",required:!0,streamField:!0}],options:{modelSize:"large",preferredEncapsulation:"xml",contextCheckLevel:0,onStreamChunk:j?.onStreamChunk}}),d=String(y?.text||""),U=I+d;O={thought:"Response completed via continuation",actions:["REPLY"],providers:[],text:U,simple:!0}}else $.logger.warn({src:"service:message"},"dynamicPromptExecFromState returned null")}if(!O)return{responseContent:null,responseMessages:[],state:K,mode:"none"};let X=new Map,Z=new Map;for(let I of $.actions){let b=I.name.trim().toUpperCase();if(b)Z.set(b,I)}for(let I of O.actions??[]){let b=typeof I==="string"?I.trim().toUpperCase():"";if(!b)continue;let g=Z.get(b)?.parameters?.filter((y)=>y.required).map((y)=>y.name)??[];if(g.length>0)X.set(b,g)}let G=typeof O.params==="string"?O.params:"",k=k2(G),S=()=>{for(let[I,b]of X){let L=k.get(I);if(!L)return!0;for(let g of b)if(!(g in L))return!0}return!1};if(X.size>0&&S()){let I=Array.from(X.entries()).map(([y,d])=>`- ${y}: ${d.join(", ")}`).join(`
3480
3480
  `),b=[W,"","# Parameter Repair","You selected actions that require parameters but did not include a complete <params> block.","Return ONLY a <params>...</params> XML block that satisfies ALL required parameters.","","Required parameters by action:",I,"","Do not include <response>, <thought>, <actions>, <providers>, <text>, or any other content."].join(`
3481
- `),L=await $.useModel(S$.TEXT_LARGE,{prompt:b}),g=L.indexOf("<params>");if(g!==-1){let y=L.indexOf("</params>",g+8);if(y!==-1){let d=L.slice(g+8,y).trim();if(d)O.params=d}}}if(K.values.benchmark_has_context===!0){if(!O.actions||O.actions.length===0)O.actions=["REPLY"];if(!O.providers||O.providers.length===0)O.providers=["CONTEXT_BENCH"];if(O.actions.some((I)=>I.toUpperCase()==="REPLY"))O.text=""}if(O.actions&&O.actions.length>1){let I=(L)=>typeof L==="string"&&L.toUpperCase()==="IGNORE";if(O.actions.some(I))if(!O.text||O.text.trim()==="")O.actions=["IGNORE"];else{let L=O.actions.filter((g)=>!I(g));O.actions=L.length?L:["REPLY"]}}let E=HT$(O);O.simple=E,O.responseId=_;let R=[{id:_,entityId:$.agentId,agentId:$.agentId,content:O,roomId:q.roomId,createdAt:Date.now()}];return{responseContent:O,responseMessages:R,state:K,mode:E&&O.text?"simple":"actions"}}async runMultiStepCore($,q,K,P,_,O){let Y=[],j=K,W=0;while(W<_.maxMultiStepIterations){W++,$.logger.debug({src:"service:message",iteration:W,maxIterations:_.maxMultiStepIterations},"Starting multi-step iteration"),j=await $.composeState(q,["RECENT_MESSAGES","ACTION_STATE","PROVIDERS"],!1,!1),j.data.actionResults=Y;let k=await $.dynamicPromptExecFromState({state:j,params:{prompt:$.character.templates?.multiStepDecisionTemplate||eB},schema:[{field:"thought",description:"Your reasoning for the selected providers and/or action, and how this step contributes to resolving the user's request",validateField:!1,streamField:!1},{field:"providers",description:"Comma-separated list of providers to call to gather necessary data",validateField:!1,streamField:!1},{field:"action",description:"Name of the action to execute after providers return (can be empty if no action is needed)",validateField:!1,streamField:!1},{field:"params",description:"Optional XML parameters for the selected action. Use nested XML tags only when the action needs input.",validateField:!1,streamField:!1},{field:"isFinish",description:"true if the task is fully resolved and no further steps are needed, false otherwise",validateField:!1,streamField:!1}],options:{modelSize:"large",preferredEncapsulation:"xml"}});if(!k){$.logger.warn({src:"service:message",iteration:W},"Failed to parse multi-step result"),Y.push({data:{actionName:"parse_error"},success:!1,error:"Failed to parse step result"});break}let S=typeof k.thought==="string"?k.thought:void 0,C=[];if(Array.isArray(k.providers))C=k.providers;else if(typeof k.providers==="string")C=k.providers.split(",").map((J)=>J.trim()).filter((J)=>J.length>0);let E=typeof k.action==="string"?k.action:void 0,R=k.isFinish;if(R==="true"||R===!0){if($.logger.info({src:"service:message",agentId:$.agentId,iteration:W},"Multi-step task completed"),P)await P({text:"",thought:typeof S==="string"?S:""});break}let I=Array.isArray(C)?C:[];if((!I||I.length===0)&&!E){$.logger.warn({src:"service:message",iteration:W},"No providers or action specified, forcing completion");break}let b=parseInt(String($.getSetting("PROVIDERS_TOTAL_TIMEOUT_MS")||"1000"),10),L=new Set,g=new Map($.providers.map((J)=>[J.name,J])),y=[];for(let J of I){if(typeof J!=="string")continue;y.push((async(w)=>{let v=g.get(w);if(!v)return $.logger.warn({src:"service:message",providerName:w},"Provider not found"),L.add(w),{providerName:w,success:!1,error:`Provider not found: ${w}`};try{let T=await v.get($,q,K);if(L.add(w),!T)return $.logger.warn({src:"service:message",providerName:w},"Provider returned no result"),{providerName:w,success:!1,error:"Provider returned no result"};let A=!!T.text;return{providerName:w,success:A,text:A?T.text:void 0,error:A?void 0:"Provider returned no result"}}catch(T){L.add(w);let A=T instanceof Error?T.message:String(T);return $.logger.error({src:"service:message",providerName:w,error:A},"Provider execution failed"),{providerName:w,success:!1,error:A}}})(J))}let d,U=new Promise((J)=>{d=setTimeout(()=>J("timeout"),b)}),r=Promise.allSettled(y),c=await Promise.race([r,U]);if(d!==void 0)clearTimeout(d);if(c==="timeout"){let w=I.filter((v)=>typeof v==="string").filter((v)=>!L.has(v));if($.logger.error({src:"service:message",timeoutMs:b,pendingProviders:w,completedProviders:Array.from(L)},`Providers took too long (>${b}ms) - slow providers: ${w.join(", ")}`),P)await P({text:"Providers took too long to respond. Please optimize your providers or use caching.",actions:[],thought:"Provider timeout - pipeline aborted"});return{responseContent:null,responseMessages:[],state:K,mode:"none"}}let F=c;for(let J of F)if(J.status==="fulfilled"){let{providerName:w,success:v,text:T,error:A}=J.value;if(Y.push({data:{actionName:w},success:v,text:T,error:A}),P)await P({text:`\uD83D\uDD0E Provider executed: ${w}`,actions:[w],thought:typeof S==="string"?S:""})}else $.logger.error({src:"service:message",error:J.reason||"Unknown provider failure"},"Unexpected provider promise rejection");if(E){let J={text:`\uD83D\uDD0E Executing action: ${E}`,actions:[E],thought:S||""};if(k&&typeof k.params==="string")J.params=k.params;await $.processActions(q,[{id:w6(),entityId:$.agentId,roomId:q.roomId,createdAt:Date.now(),content:J}],K,async()=>{return[]});let T=$.stateCache.get(`${q.id}_action_results`)?.values?.actionResults,A=Array.isArray(T)?T:[],M=A.length>0?A[0]:null,N=M?.success??!1;Y.push({data:{actionName:typeof E==="string"?E:"unknown"},success:N,text:M&&"text"in M&&typeof M.text==="string"?M.text:void 0,values:M&&"values"in M&&typeof M.values==="object"&&M.values!==null?M.values:void 0,error:N?void 0:M&&("text"in M)&&typeof M.text==="string"?M.text:void 0})}}if(W>=_.maxMultiStepIterations)$.logger.warn({src:"service:message",maxIterations:_.maxMultiStepIterations},"Reached maximum iterations, forcing completion");j=await $.composeState(q,["RECENT_MESSAGES","ACTION_STATE"],!1,!1);let z=await $.dynamicPromptExecFromState({state:j,params:{prompt:$.character.templates?.multiStepSummaryTemplate||$n},schema:[{field:"thought",description:"Your internal reasoning about the summary",validateField:!1,streamField:!1},{field:"text",description:"The final summary message to send to the user",required:!0,streamField:!0}],options:{modelSize:"large",preferredEncapsulation:"xml",requiredFields:["text"],onStreamChunk:_.onStreamChunk}}),X=null,Z=z?.text;if(typeof Z==="string"&&Z)X={actions:["MULTI_STEP_SUMMARY"],text:Z,thought:(typeof z?.thought==="string"?z.thought:"Final user-facing message after task completion.")||"Final user-facing message after task completion.",simple:!0,responseId:O};let G=X?[{id:O,entityId:$.agentId,agentId:$.agentId,content:X,roomId:q.roomId,createdAt:Date.now()}]:[];return{responseContent:X,responseMessages:G,state:j,mode:X?"simple":"none"}}async emitRunEnded($,q,K,P,_){await $.emitEvent("RUN_ENDED",{runtime:$,source:"messageHandler",runId:q,messageId:K.id,roomId:K.roomId,entityId:K.entityId,startTime:P,status:_,endTime:Date.now(),duration:Date.now()-P})}async deleteMessage($,q){if(!q.id){$.logger.error({src:"service:message",agentId:$.agentId},"Cannot delete memory: message ID is missing");return}$.logger.info({src:"service:message",agentId:$.agentId,messageId:q.id,roomId:q.roomId},"Deleting memory"),await $.deleteMemory(q.id),$.logger.debug({src:"service:message",messageId:q.id},"Successfully deleted memory")}async clearChannel($,q,K){$.logger.info({src:"service:message",agentId:$.agentId,channelId:K,roomId:q},"Clearing message memories from channel");let P=await $.getMemoriesByRoomIds({tableName:"messages",roomIds:[q]});$.logger.debug({src:"service:message",channelId:K,count:P.length},"Found message memories to delete");let _=0;for(let O of P)if(O.id)try{await $.deleteMemory(O.id),_++}catch(Y){$.logger.warn({src:"service:message",error:Y,memoryId:O.id},"Failed to delete message memory")}$.logger.info({src:"service:message",agentId:$.agentId,channelId:K,deletedCount:_,totalCount:P.length},"Cleared message memories from channel")}}y6();G6();nP();var zT$=new Set([Array,Date,RegExp,Map,Set,WeakMap,WeakSet,Error,Promise,ArrayBuffer,DataView,Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array]);function X_($){if($===null||typeof $!=="object")return!1;let q=Object.getPrototypeOf($);if(q===null)return!0;if(q.constructor===Object)return!0;if(zT$.has(q.constructor))return!1;if(typeof Buffer<"u"&&Buffer.isBuffer($))return!1;return!1}var fT$={};class kT${permits;waiting=[];constructor($){this.permits=$}async acquire(){if(this.permits>0)return this.permits-=1,Promise.resolve();return new Promise(($)=>{this.waiting.push($)})}release(){this.permits+=1;let $=this.waiting.shift();if($&&this.permits>0)this.permits-=1,$()}}function VT$($){return typeof $==="object"&&$!==null&&"textStream"in $&&"text"in $&&"usage"in $&&"finishReason"in $}class t8{#$=100;agentId;character;adapter;static#q=0;actions=[];evaluators=[];providers=[];plugins=[];events={};stateCache=new Map;fetch=fetch;services=new Map;serviceTypes=new Map;models=new Map;routes=[];taskWorkers=new Map;sendHandlers=new Map;eventHandlers=new Map;allAvailablePlugins=new Map;characterPlugins=[];capabilityOptions={};actionPlanningOption;llmModeOption;checkShouldRespondOption;isAnonymousCharacter=!1;logger;enableAutonomy;settings;servicePromiseHandlers=new Map;servicePromises=new Map;startingServices=new Map;serviceRegistrationStatus=new Map;initPromise;initResolver;currentRunId;currentRoomId;currentActionContext;maxWorkingMemoryEntries=50;messageService=null;companionUrl;stopped=!1;constructor($){let q;if($.character)q=$.character,this.isAnonymousCharacter=!1;else t8.#q++,q={name:`Agent-${t8.#q}`,bio:["An anonymous agent"],templates:{},messageExamples:[],postExamples:[],topics:[],adjectives:[],knowledge:[],plugins:[],secrets:{}},this.isAnonymousCharacter=!0;if(this.capabilityOptions={disableBasic:$.disableBasicCapabilities,enableExtended:$.enableExtendedCapabilities,advancedCapabilities:$.advancedCapabilities,skipCharacterProvider:this.isAnonymousCharacter,enableAutonomy:$.enableAutonomy},this.agentId=q.id??$.agentId??V6(q.name??w6()),this.character=q,this.initPromise=new Promise((P)=>{this.initResolver=P}),this.logger=MO({namespace:q.name,level:$.logLevel??"error"}),$.conversationLength!==void 0)this.#$=$.conversationLength;else if($.settings?.CONVERSATION_LENGTH)this.#$=parseInt(String($.settings.CONVERSATION_LENGTH),10)||100;else this.#$=PA("CONVERSATION_LENGTH",100);if($.adapter)this.registerDatabaseAdapter($.adapter);this.companionUrl=$.companionUrl,this.fetch=$.fetch??this.fetch,this.settings=$.settings??fT$;let K=this.character.settings?.ENABLE_AUTONOMY===!0||this.character.settings?.ENABLE_AUTONOMY==="true";if(this.enableAutonomy=$.enableAutonomy??K,this.plugins=[],this.characterPlugins=$.plugins??[],this.actionPlanningOption=$.actionPlanning,this.llmModeOption=$.llmMode,this.checkShouldRespondOption=$.checkShouldRespond,$.allAvailablePlugins){for(let P of $.allAvailablePlugins)if(P.name)this.allAvailablePlugins.set(P.name,P)}if(this.logger.debug({src:"agent",agentId:this.agentId,agentName:this.character.name},"Initialized"),this.currentRunId=void 0,$.settings?.MAX_WORKING_MEMORY_ENTRIES)this.maxWorkingMemoryEntries=parseInt(String($.settings.MAX_WORKING_MEMORY_ENTRIES),10)||50;else this.maxWorkingMemoryEntries=PA("MAX_WORKING_MEMORY_ENTRIES",50)}createRunId(){return w6()}startRun($){return this.currentRunId=this.createRunId(),this.currentRoomId=$,this.currentRunId}endRun(){this.currentRunId=void 0,this.currentRoomId=void 0}getCurrentRunId(){if(!this.currentRunId)this.currentRunId=this.createRunId();return this.currentRunId}async registerPlugin($){if(!$.name)throw this.logger.error({src:"agent",agentId:this.agentId,error:"Plugin or plugin name is undefined"},"Plugin registration failed"),Error("registerPlugin: Plugin or plugin name is undefined");if(this.plugins.find((P)=>P.name===$.name)){this.logger.warn({src:"agent",agentId:this.agentId,plugin:$.name},"Plugin already registered, skipping");return}let K=$;if($.name==="basic-capabilities"){let P=this.character.settings,_=this.capabilityOptions.disableBasic??(P?.DISABLE_BASIC_CAPABILITIES===!0||P?.DISABLE_BASIC_CAPABILITIES==="true"),O=this.capabilityOptions.enableExtended??this.capabilityOptions.advancedCapabilities??(P?.ENABLE_EXTENDED_CAPABILITIES===!0||P?.ENABLE_EXTENDED_CAPABILITIES==="true"||P?.ADVANCED_CAPABILITIES===!0||P?.ADVANCED_CAPABILITIES==="true"),Y=this.capabilityOptions.skipCharacterProvider??!1,j=this.capabilityOptions.enableAutonomy??(P?.ENABLE_AUTONOMY===!0||P?.ENABLE_AUTONOMY==="true");if(_||O||Y||j){let z=ZM({disableBasic:_,enableExtended:O,skipCharacterProvider:Y,enableAutonomy:j});K={...z,events:$.events??z.events}}}if(this.plugins.push(K),this.logger.debug({src:"agent",agentId:this.agentId,plugin:K.name},"Plugin added"),K.init){let P={};if(K.config){for(let[_,O]of Object.entries(K.config))if(O!==null&&O!==void 0)P[_]=String(O)}await K.init(P,this),this.logger.debug({src:"agent",agentId:this.agentId,plugin:K.name},"Plugin initialized")}if(K.adapter)this.logger.debug({src:"agent",agentId:this.agentId,plugin:K.name},"Plugin declares adapter factory (handled pre-construction)");if(K.actions)for(let P of K.actions)this.registerAction(P);if(K.evaluators)for(let P of K.evaluators)this.registerEvaluator(P);if(K.providers)for(let P of K.providers)this.registerProvider(P);if(K.models)for(let[P,_]of Object.entries(K.models))this.registerModel(P,_,K.name,K.priority);if(K.routes)for(let P of K.routes){let _=P.path.startsWith("/")?P.path:`/${P.path}`;this.routes.push({...P,path:`/${K.name}${_}`})}if(K.events)for(let[P,_]of Object.entries(K.events))for(let O of _)this.registerEvent(P,O);if(K.services)for(let P of K.services){let _=P.serviceType;if(this.logger.debug({src:"agent",agentId:this.agentId,plugin:K.name,serviceType:_},"Registering service"),!this.servicePromises.has(_))this._createServiceResolver(_);if(this.serviceRegistrationStatus.set(_,"pending"),!this.serviceTypes.has(_))this.serviceTypes.set(_,[]);let O=this.serviceTypes.get(_);if(O)O.push(P)}if(K.adapter){this.logger.debug({src:"agent",agentId:this.agentId,plugin:K.name},"Registering database adapter");let P=this.getBasicCapabilitiesSettings(),_=await Promise.resolve(K.adapter(this.agentId,P));this.registerDatabaseAdapter(_)}}getAllServices(){return this.services}async stop(){if(this.stopped){this.logger.debug({src:"agent",agentId:this.agentId},"Runtime already stopped");return}this.stopped=!0,this.logger.debug({src:"agent",agentId:this.agentId},"Stopping runtime");let $=Array.from(this.startingServices.values());if($.length>0)this.logger.debug({src:"agent",agentId:this.agentId,count:$.length},"Waiting for in-flight service starts before stopping"),await Promise.all($);for(let[K,P]of this.services){this.logger.debug({src:"agent",agentId:this.agentId,serviceType:K},"Stopping service");for(let _ of P){let O=_;if(typeof O.stop==="function")await O.stop();else this.logger.warn({src:"agent",agentId:this.agentId,serviceType:K},"Service instance is missing stop(); skipping")}}let q=Error("Runtime stopped");for(let[K,P]of this.servicePromiseHandlers){P.reject(q);let _=this.servicePromises.get(K);if(_)_.catch(()=>{})}this.eventHandlers.clear(),this.events={},this.stateCache.clear(),this.servicePromises.clear(),this.servicePromiseHandlers.clear(),this.startingServices.clear()}async initialize($){let q=[],K=ZM(this.capabilityOptions);if(q.push(this.registerPlugin(K)),this.character.advancedPlanning===!0){let{createAdvancedPlanningPlugin:Z}=await Promise.resolve().then(() => (gU(),xU));q.push(this.registerPlugin(Z()))}if(this.character.advancedMemory===!0){let{createAdvancedMemoryPlugin:Z}=await Promise.resolve().then(() => (aU(),tU));q.push(this.registerPlugin(Z()))}for(let Z of this.characterPlugins)if(Z)q.push(this.registerPlugin(Z));await Promise.all(q);let P=$?.allowNoDatabase===!0||String(this.getSetting("ALLOW_NO_DATABASE")??"").toLowerCase()==="true"||String(process.env.ALLOW_NO_DATABASE??"").toLowerCase()==="true";if(!this.adapter)if(P)this.logger.warn({src:"agent",agentId:this.agentId},"Database adapter not initialized; using in-memory adapter (ALLOW_NO_DATABASE)"),this.registerDatabaseAdapter(new yX);else throw this.logger.error({src:"agent",agentId:this.agentId},"Database adapter not initialized"),Error("Database adapter not initialized. The SQL plugin (@elizaos/plugin-sql) is required for agent initialization. Please ensure it is included in your character configuration.");if(!await this.adapter.isReady())await this.adapter.initialize();if(this.messageService=new EM,$?.skipMigrations??!1)this.logger.debug({src:"agent",agentId:this.agentId},"Skipping plugin migrations");else this.logger.debug({src:"agent",agentId:this.agentId},"Running plugin migrations"),await this.runPluginMigrations(),this.logger.debug({src:"agent",agentId:this.agentId},"Plugin migrations completed");let O=await this.ensureAgentExists({...this.character,id:this.agentId});if(!O){let Z=`Agent ${this.agentId} does not exist in database after ensureAgentExists call`;throw Error(Z)}if(O.settings){this.character.settings={...O.settings,...this.character.settings};let Z=O.secrets&&typeof O.secrets==="object"?O.secrets:{},G=O.settings.secrets&&typeof O.settings.secrets==="object"?O.settings.secrets:{},k=this.character.settings.secrets&&typeof this.character.settings.secrets==="object"?this.character.settings.secrets:{},S=this.character.secrets&&typeof this.character.secrets==="object"?this.character.secrets:{},C={...Z,...G,...S,...k};if(Object.keys(C).length>0){let E={};for(let[R,I]of Object.entries(C))if(I!==null&&I!==void 0)E[R]=String(I);if(Object.keys(E).length>0)this.character.secrets=E,this.character.settings.secrets=E}}let Y=(await this.adapter.getEntitiesByIds([this.agentId]))[0]??null;if(!Y){if(!O.id)throw Error(`Agent ${this.agentId} has no ID`);if(!await this.createEntity({id:this.agentId,names:[this.character.name??"Agent"],metadata:{},agentId:O.id})){let G=`Failed to create entity for agent ${this.agentId}`;throw Error(G)}if(Y=(await this.adapter.getEntitiesByIds([this.agentId]))[0]??null,!Y)throw Error(`Agent entity not found for ${this.agentId}`);this.logger.debug({src:"agent",agentId:this.agentId},"Agent entity created")}if(!await this.getRoom(this.agentId))await this.adapter.createRooms([{id:this.agentId,name:this.character.name,source:"elizaos",type:A6.SELF,channelId:this.agentId,messageServerId:this.agentId,worldId:this.agentId}]);let[W]=await this.adapter.getParticipantsForRooms([this.agentId]);if(!(W?.entityIds??[]).includes(this.agentId)){if(!(await this.adapter.createRoomParticipants([this.agentId],this.agentId)).length)throw Error(`Failed to add agent ${this.agentId} as participant to its own room`);this.logger.debug({src:"agent",agentId:this.agentId},"Agent linked to room")}if(!this.getModel(S$.TEXT_EMBEDDING))this.logger.warn({src:"agent",agentId:this.agentId},"No TEXT_EMBEDDING model registered, skipping embedding setup");else await this.ensureEmbeddingDimension();if(this.initResolver)this.initResolver(),this.initResolver=void 0}getBasicCapabilitiesSettings(){let $={};for(let[_,O]of Object.entries(process.env))if(O!==void 0&&O!==null&&_)$[_]=String(O);let q=this.character.settings&&typeof this.character.settings==="object"?this.character.settings:{};for(let[_,O]of Object.entries(q)){if(O===void 0||O===null)continue;if(_==="secrets"&&typeof O==="object")continue;$[_]=typeof O==="string"?O:String(O)}let K=this.character.settings?.secrets&&typeof this.character.settings.secrets==="object"?this.character.settings.secrets:{};for(let[_,O]of Object.entries(K))if(O!==void 0&&O!==null)$[_]=String(O);let P=this.character.secrets&&typeof this.character.secrets==="object"?this.character.secrets:{};for(let[_,O]of Object.entries(P))if(O!==void 0&&O!==null)$[_]=String(O);return $}registerDatabaseAdapter($){if(this.adapter)this.logger.warn({src:"agent",agentId:this.agentId},"Database adapter already registered, ignoring");else{let q=$;if(typeof q.getAgentsByIds!=="function"&&typeof q.getAgent==="function")q.getAgentsByIds=async(K)=>{return(await Promise.all(K.map((_)=>q.getAgent(_)))).filter(Boolean)};if(typeof q.createAgents!=="function"&&typeof q.createAgent==="function")q.createAgents=async(K)=>{let P=[];for(let _ of K)if(await q.createAgent(_)&&_.id)P.push(_.id);return P};if(typeof q.updateAgents!=="function"&&typeof q.updateAgent==="function")q.updateAgents=async(K)=>{for(let{agentId:P,agent:_}of K)await q.updateAgent(P,_);return!0};if(typeof q.deleteAgents!=="function"&&typeof q.deleteAgent==="function")q.deleteAgents=async(K)=>{for(let P of K)await q.deleteAgent(P);return!0};if(typeof q.upsertAgents!=="function")q.upsertAgents=async(K)=>{for(let P of K){if(!P.id)continue;if(typeof q.getAgent==="function"?await q.getAgent(P.id):null){if(typeof q.updateAgent==="function")await q.updateAgent(P.id,P)}else if(typeof q.createAgent==="function")await q.createAgent(P)}};this.adapter=$,this.logger.debug({src:"agent",agentId:this.agentId},"Database adapter registered")}}async runPluginMigrations(){if(!this.adapter){this.logger.warn({src:"agent",agentId:this.agentId},"Database adapter not found, skipping plugin migrations");return}if(typeof this.adapter.runPluginMigrations!=="function"){this.logger.warn({src:"agent",agentId:this.agentId},"Database adapter does not support plugin migrations");return}let $=this.plugins.filter((P)=>P.schema).map((P)=>{let _=P.schema||{},O={};for(let[Y,j]of Object.entries(_))if(typeof j==="string"||typeof j==="number"||typeof j==="boolean"||j===null||typeof j==="object"&&j!==null)O[Y]=j;return{name:P.name,schema:O}});if($.length===0){this.logger.debug({src:"agent",agentId:this.agentId},"No plugins with schemas, skipping migrations");return}this.logger.debug({src:"agent",agentId:this.agentId,count:$.length},"Found plugins with schemas");let q=!1,K=process.env.ELIZA_ALLOW_DESTRUCTIVE_MIGRATIONS==="true";await this.adapter.runPluginMigrations($,{verbose:!q,force:K,dryRun:!1}),this.logger.debug({src:"agent",agentId:this.agentId},"Plugin migrations completed")}async getConnection(){if(!this.adapter)throw Error("Database adapter not registered");return this.adapter.getConnection()}setSetting($,q,K=!1){if(K){if(!this.character.secrets)this.character.secrets={};if(q!==null&&q!==void 0)this.character.secrets[$]=String(q)}else{if(!this.character.settings)this.character.settings={};if(q!==null&&q!==void 0)this.character.settings[$]=q}}getSetting($){let q=this.character.settings,K=this.character.secrets,P=q&&typeof q==="object"&&"extra"in q&&typeof q.extra==="object"&&q.extra!==null?q.extra:void 0,_=typeof q==="object"&&q!==null&&"secrets"in q&&typeof q.secrets==="object"&&q.secrets!==null?q.secrets:void 0,O=K?.[$]??q?.[$]??P?.[$]??_?.[$]??this.settings[$];if(O===void 0||O===null)return null;if(typeof O==="number")return O;if(typeof O==="boolean")return O;if(typeof O==="string"){let Y=q2(O,WK());if(Y==="true")return!0;if(Y==="false")return!1;return Y}return null}getConversationLength(){return this.#$}isActionPlanningEnabled(){if(this.actionPlanningOption!==void 0)return this.actionPlanningOption;let $=this.getSetting("ACTION_PLANNING");if($!==null){if(typeof $==="boolean")return $;if(typeof $==="string")return $.toLowerCase()==="true"}return!0}getLLMMode(){if(this.llmModeOption!==void 0)return this.llmModeOption;let $=this.getSetting("LLM_MODE");if($!==null&&typeof $==="string"){let q=$.toUpperCase();if(q==="SMALL"||q==="LARGE"||q==="DEFAULT")return q}return"DEFAULT"}isCheckShouldRespondEnabled(){if(this.checkShouldRespondOption!==void 0)return this.checkShouldRespondOption;let $=this.getSetting("CHECK_SHOULD_RESPOND");if($!==null){if(typeof $==="boolean")return $;if(typeof $==="string")return $.toLowerCase()!=="false"}return!0}getMessagingAdapter(){if(this.adapter&&typeof this.adapter.createMessageServer==="function"&&typeof this.adapter.createChannel==="function"&&typeof this.adapter.createMessage==="function")return this.adapter;return null}registerProvider($){this.providers.push($),this.logger.debug({src:"agent",agentId:this.agentId,provider:$.name},"Provider registered")}registerAction($){let q=vq($);if(this.actions.find((K)=>K.name===q.name))this.logger.warn({src:"agent",agentId:this.agentId,action:q.name},"Action already registered, skipping");else this.actions.push(q),this.logger.debug({src:"agent",agentId:this.agentId,action:q.name},"Action registered")}getAllActions(){return[...this.actions]}async getFilteredActions($){let q=await this._ensureServiceStarted("tool_policy");if(!q||!$)return[...this.actions];return q.filterActions(this.actions,$)}async isActionAllowed($,q){let K=await this._ensureServiceStarted("tool_policy");if(!K)return{allowed:!0,reason:"No policy service available"};let P=K.isToolAllowed($,q);return{allowed:P.allowed,reason:P.reason}}registerEvaluator($){this.evaluators.push(Cn($))}updateActionPlan($,q){return{...$,...q}}updateActionStep($,q,K){if(!$.steps||q<0||q>=$.steps.length)return this.logger.warn({src:"agent",agentId:this.agentId,index:q,stepsCount:$.steps?.length||0},"Invalid step index"),$;return{...$,steps:$.steps.map((P,_)=>_===q?{...P,...K}:P)}}async processActions($,q,K,P,_){let O=this.isActionPlanningEnabled(),Y=[],j=q;if(O){for(let C of q)if(C.content?.actions&&C.content.actions.length>0)Y.push(...C.content.actions)}else for(let C of q)if(C.content?.actions&&C.content.actions.length>0){Y=[C.content.actions[0]],j=[{...C,content:{...C.content,actions:[C.content.actions[0]]}}],this.logger.debug({src:"agent",agentId:this.agentId,selectedAction:C.content.actions[0],skippedActions:C.content.actions.slice(1)},"Action planning disabled, limiting to first action");break}let W=Y.length>1&&O,z=this.getCurrentRunId(),X=this.createRunId(),Z,k=q[0]?.content?.thought||`Executing ${Y.length} actions: ${Y.join(", ")}`;if(W)Z={runId:X,totalSteps:Y.length,currentStep:0,steps:Y.map((C)=>({action:C,status:"pending"})),thought:k,startTime:Date.now()};let S=0;for(let C of j){let g=function(U){return U.toLowerCase().replace(/_/g,"")};if(!C.content||!C.content.actions||C.content.actions.length===0){this.logger.warn({src:"agent",agentId:this.agentId},"No action found in response");continue}let E=C.content.actions,R=C.content&&typeof C.content.params==="string"?C.content.params:void 0,I=k2(R),b=[],L=K,y=this.actions.map((U)=>{let r=g(U.name),c=U.similes?U.similes.map((F)=>g(F)):[];return{action:U,normalizedName:r,normalizedSimiles:c}}),d=new Map;for(let U of y)if(!d.has(U.normalizedName))d.set(U.normalizedName,U.action);this.logger.trace({src:"agent",agentId:this.agentId,actions:this.actions.map((U)=>g(U.name))},"Available actions");for(let U of E){if(Z)Z=this.updateActionPlan(Z,{currentStep:S+1});if(L=await this.composeState($,["RECENT_MESSAGES","ACTION_STATE"]),Z&&L.data)L.data.actionPlan=Z,L.data.actionResults=b;this.logger.debug({src:"agent",agentId:this.agentId,action:U},"Processing action");let r=g(U),c=d.get(r);if(!c){for(let u of y)if(u.normalizedName.includes(r)||r.includes(u.normalizedName)){c=u.action;break}}if(!c)for(let u of y){if(u.normalizedSimiles.find((Z$)=>Z$===r)){c=u.action,this.logger.debug({src:"agent",agentId:this.agentId,action:c.name,match:"simile"},"Action resolved via simile");break}if(u.normalizedSimiles.find((Z$)=>Z$.includes(r)||r.includes(Z$))){c=u.action,this.logger.debug({src:"agent",agentId:this.agentId,action:c.name,match:"fuzzy"},"Action resolved via fuzzy match");break}}if(!c){let u=`Action not found: ${U}`;if(this.logger.error({src:"agent",agentId:this.agentId,action:U},"Action not found"),Z?.steps?.[S])Z=this.updateActionStep(Z,S,{status:"failed",error:u});let l={id:w6(),entityId:$.entityId,roomId:$.roomId,worldId:$.worldId,content:{thought:u,source:"auto",type:"action_result",actionName:U,actionStatus:"failed",runId:X}};await this.createMemory(l,"messages"),S++;continue}if(!c.handler){if(this.logger.error({src:"agent",agentId:this.agentId,action:c.name},"Action has no handler"),Z?.steps?.[S])Z=this.updateActionStep(Z,S,{status:"failed",error:"No handler"});S++;continue}this.logger.debug({src:"agent",agentId:this.agentId,action:c.name},"Executing action");let F={};if(c.parameters&&c.parameters.length>0){let u=U.trim().toUpperCase(),l=c.name.trim().toUpperCase(),e=I.get(u)??I.get(l),Z$=QM(c,e);if(!Z$.valid)this.logger.warn({src:"agent",agentId:this.agentId,action:c.name,errors:Z$.errors},"Action parameter validation incomplete; continuing to handler"),F.parameterErrors=Z$.errors;if(Z$.params)F.parameters=Z$.params}let J=w6(),w=w6();this.currentActionContext={actionName:c.name,actionId:J,prompts:[]};let v={previousResults:b,getPreviousResult:(u)=>{return b.find((l)=>l.data&&l.data.actionName===u)}};if(F.actionContext=v,Z)F.actionPlan={totalSteps:Z.totalSteps,currentStep:Z.currentStep,steps:Z.steps,thought:Z.thought};if(_?.onStreamChunk)F.onStreamChunk=_.onStreamChunk;await this.emitEvent("ACTION_STARTED",{messageId:J,roomId:$.roomId,world:$.worldId,content:{text:`Executing action: ${c.name}`,actions:[c.name],actionStatus:"executing",actionId:J,runId:X,type:"agent_action",thought:k,source:$.content?.source}});let T=[],A=async(u)=>{return u.responseId=w,T.push(u),[]},M;if(_?.onStreamChunk){let u=null,l=_.onStreamChunk;M={messageId:w,onStreamChunk:async(e,Z$)=>{if(!u)u=new MM;let K$=u.push(e);if(K$&&l)await l(K$,Z$)},onStreamEnd:()=>{u=null}}}let N=await NW(M,()=>c.handler(this,$,L,F,A,q)),f=N===void 0||N===null||typeof N==="boolean",H;if(!f){if(typeof N==="object"&&N!==null&&(("values"in N)||("data"in N)||("text"in N)))H={...N,success:"success"in N?N.success:!0};else{let u=typeof N==="string"?N:typeof N==="number"?N:typeof N==="boolean"?N:N===null?null:JSON.stringify(N);H={success:!0,data:{actionName:c.name,result:u}}}if(b.push(H),H.values&&L){let l=L.data?.actionResults,e=Array.isArray(l)?l:[];L={...L,values:{...L.values,...H.values},data:{...L.data||{},actionResults:[...e,H],actionPlan:Z}}}if(L?.data){if(!L.data.workingMemory)L.data.workingMemory={};let l=`action_${H.data?.actionName||c.name}_${w6()}`,e={actionName:c.name,result:H,timestamp:Date.now()},Z$=L.data.workingMemory;Z$[l]=e;let K$=Object.entries(Z$);if(K$.length>this.maxWorkingMemoryEntries){let t=K$.length-this.maxWorkingMemoryEntries;while(t>0){let q$=null,$$=Number.POSITIVE_INFINITY;for(let[j$,a$]of Object.entries(Z$)){let B=a$?.timestamp??0;if(B<$$)$$=B,q$=j$}if(!q$)break;delete Z$[q$],t--}}}if(Z?.steps?.[S])Z=this.updateActionStep(Z,S,{status:"completed",result:H})}let h=H?.success!==!1?"completed":"failed";if(await this.emitEvent("ACTION_COMPLETED",{messageId:J,roomId:$.roomId,world:$.worldId,content:{text:H?.text||"",actions:[c.name],actionStatus:h,actionId:J,type:"agent_action",thought:k,actionResult:H,source:$.content?.source}}),P)for(let u of T){if(u.text)u.text=this.redactSecrets(u.text);await P(u)}let D={id:J,entityId:this.agentId,roomId:$.roomId,worldId:$.worldId,content:{text:H?.text||`Executed action: ${c.name}`,source:"action"}};await this.createMemory(D,"messages"),this.logger.debug({src:"agent",agentId:this.agentId,action:c.name},"Action completed");let x=H?{success:H.success,text:H.text,error:H.error}:void 0;await this.adapter.createLogs([{entityId:$.entityId,roomId:$.roomId,type:"action",body:{action:c.name,actionId:J,message:$.content.text,messageId:$.id,result:x,isVoidReturn:f,prompts:this.currentActionContext?.prompts||[],promptCount:this.currentActionContext?.prompts?.length||0,runId:X,parentRunId:z,...Z&&{planStep:`${Z.currentStep}/${Z.totalSteps}`,planThought:Z.thought}}}]),this.currentActionContext=void 0,S++}if($.id)this.stateCache.set(`${$.id}_action_results`,{values:{actionResults:b},data:{actionResults:b,actionPlan:Z},text:JSON.stringify(b)})}}getActionResults($){let q=this.stateCache?.get(`${$}_action_results`);return q?.data&&q.data.actionResults||[]}async evaluate($,q,K,P,_){let O=this.evaluators.map(async(j)=>{if(!j.handler)return null;if(!K&&!j.alwaysRun)return null;if(await j.validate(this,$,q))return j;return null}),Y=(await Promise.all(O)).filter(Boolean);if(Y.length===0)return[];return q=await this.composeState($,["RECENT_MESSAGES","EVALUATORS"]),await Promise.all(Y.map(async(j)=>{if(j.handler)await j.handler(this,$,q,{},P,_),this.adapter.createLogs([{entityId:$.entityId,roomId:$.roomId,type:"evaluator",body:{evaluator:j.name,messageId:$.id,message:$.content.text,runId:this.getCurrentRunId()}}])})),Y}async ensureConnections($,q,K,P){if(!$){this.logger.error({src:"agent",agentId:this.agentId},"ensureConnections called without entities");return}if(!q||q.length===0){this.logger.error({src:"agent",agentId:this.agentId},"ensureConnections called without rooms");return}await this.ensureWorldExists({...P,agentId:this.agentId});let _=q[0],O=(L,g)=>L.reduce((y,d,U)=>{if(U%g===0)y.push([]);return y[y.length-1].push(d),y},[]),Y=q.map((L)=>L.id),W=(await this.getRoomsByIds(Y))?.map((L)=>L.id),z=Y.filter((L)=>!W?.includes(L)),X={worldId:P.id,messageServerId:P.messageServerId,source:K,agentId:this.agentId};if(z.length){this.logger.debug({src:"agent",agentId:this.agentId,count:z.length},"Creating rooms");let L=q.filter((g)=>z.includes(g.id)).map((g)=>({...g,...X,type:g.type||A6.GROUP}));await this.createRooms(L)}let Z=$.map((L)=>L.id).filter((L)=>L!==void 0),k=(await this.adapter.getEntitiesByIds(Z))?.map((L)=>L.id).filter((L)=>L!==void 0)||[],S=$.filter((L)=>L.id!==void 0&&!k.includes(L.id)),C={roomId:_.id,channelId:_.channelId,type:_.type},E={worldId:P.id,messageServerId:P.messageServerId};if(S.length){this.logger.debug({src:"agent",agentId:this.agentId,count:S.length},"Creating entities");let L={...C,...E,source:K,agentId:this.agentId},g=S.map((d)=>({...d,...L,metadata:d.metadata||{}})),y=O(g,5000);for(let d of y)await this.createEntities(d)}await this.ensureParticipantInRoom(this.agentId,_.id);let I=(await this.getParticipantsForRoom(_.id)).filter((L)=>L!==void 0),b=Z.filter((L)=>!I.includes(L));if(b.length){this.logger.debug({src:"agent",agentId:this.agentId,count:b.length,channelId:_.id},"Adding missing participants");let L=O(b,5000);for(let g of L)await this.createRoomParticipants(g,_.id)}this.logger.success({src:"agent",agentId:this.agentId,worldId:P.id},"World connected")}async ensureConnection($){await AU(this.adapter,{agentId:this.agentId,worldId:$.worldId,messageServerId:$.messageServerId,...$,source:$.source??"default"}),this.logger.debug({src:"agent",agentId:this.agentId,entityId:$.entityId,channelId:$.roomId},"Entity connected")}async ensureParticipantInRoom($,q){let K=(await this.adapter.getEntitiesByIds([$]))[0]??null;if(!K&&$!==this.agentId)this.logger.warn({src:"agent",agentId:this.agentId,entityId:$},"Entity not accessible, attempting to add as participant");else if(!K&&$===this.agentId)throw Error(`Agent entity ${$} not found, cannot add as participant.`);else if(!K)throw Error(`User entity ${$} not found, cannot add as participant.`);if(!((await this.adapter.getParticipantsForRooms([q]))[0]?.entityIds??[]).includes($)){if(!await this.adapter.createRoomParticipants([$],q))throw Error(`Failed to add participant ${$} to room ${q}`);if($===this.agentId)this.logger.debug({src:"agent",agentId:this.agentId,channelId:q},"Agent linked to room");else this.logger.debug({src:"agent",agentId:this.agentId,entityId:$,channelId:q},"User linked to room")}}async getParticipantsForEntity($){return await this.adapter.getParticipantsForEntities([$])}async getParticipantsForEntities($){return await this.adapter.getParticipantsForEntities($)}async getParticipantsForRoom($){return(await this.adapter.getParticipantsForRooms([$]))[0]?.entityIds??[]}async getParticipantsForRooms($){return await this.adapter.getParticipantsForRooms($)}async isRoomParticipant($,q){return(await this.adapter.areRoomParticipants([{roomId:$,entityId:q}]))[0]??!1}async areRoomParticipants($){return await this.adapter.areRoomParticipants($)}async addParticipant($,q){return(await this.adapter.createRoomParticipants([$],q)).length>0}async createRoomParticipants($,q){return await this.adapter.createRoomParticipants($,q)}async ensureWorldExists({id:$,name:q,messageServerId:K,metadata:P}){let _=(await this.adapter.getWorldsByIds([$]))[0]??null;await this.adapter.upsertWorlds([{id:$,name:q,agentId:this.agentId,messageServerId:K,metadata:P}]),this.logger.debug({src:"agent",agentId:this.agentId,worldId:$,messageServerId:K},_?"World updated":"World created")}async ensureRoomExists({id:$,name:q,source:K,type:P,channelId:_,messageServerId:O,worldId:Y,metadata:j}){if(!Y)throw Error("worldId is required");let W=await this.getRoom($);await this.adapter.upsertRooms([{id:$,name:q,agentId:this.agentId,source:K,type:P,channelId:_,messageServerId:O,worldId:Y,metadata:j}]),this.logger.debug({src:"agent",agentId:this.agentId,channelId:$},W?"Room updated":"Room created")}async composeState($,q=null,K=!1,P=!1){let _=typeof $.metadata==="object"&&$.metadata!==null&&"trajectoryStepId"in $.metadata?$.metadata.trajectoryStepId:void 0,O=typeof _==="string"&&_.trim()!==""?_:EW()?.trajectoryStepId;if(O)P=!0;let Y=K?q:null,j={values:{},data:{},text:""},W=P||!$.id?j:await this.stateCache.get($.id)||j,z=new Set;if(Y&&Y.length>0)for(let b of Y)z.add(b);else for(let b of this.providers.filter((L)=>!L.private&&!L.dynamic))z.add(b.name);if(!Y&&q&&q.length>0)for(let b of q)z.add(b);let X=[];for(let b of this.providers)if(z.has(b.name))X.push(b);X.sort((b,L)=>(b.position||0)-(L.position||0));let Z=await this._ensureServiceStarted("trajectory_logger"),G=await Promise.all(X.map(async(b)=>{let L=Date.now(),g=await b.get(this,$,W),y=Date.now()-L;if(y>100)this.logger.debug({src:"agent",agentId:this.agentId,provider:b.name,duration:y},"Slow provider");return{...g,providerName:b.name}}));if(O&&Z){let b=typeof $.content?.text==="string"?$.content.text:"";for(let L of G)try{let g=typeof L.text==="string"?L.text.length:0;Z.logProviderAccess({stepId:O,providerName:L.providerName,data:{textLength:g},purpose:"compose_state",query:{message:b.slice(0,2000)}})}catch{}}let k={...W.data&&W.data.providers||{}};for(let b of G){let L=b.text?this.redactSecrets(b.text):b.text;k[b.providerName]={...b,text:L,values:b.values&&typeof b.values==="object"?Object.fromEntries(Object.entries(b.values).filter(([,g])=>g!==void 0)):void 0}}let S=[];for(let b of X){let L=k[b.name];if(L?.text&&typeof L.text==="string"&&L.text.trim()!=="")S.push(L.text)}let C=S.join(`
3481
+ `),L=await $.useModel(S$.TEXT_LARGE,{prompt:b}),g=L.indexOf("<params>");if(g!==-1){let y=L.indexOf("</params>",g+8);if(y!==-1){let d=L.slice(g+8,y).trim();if(d)O.params=d}}}if(K.values.benchmark_has_context===!0){if(!O.actions||O.actions.length===0)O.actions=["REPLY"];if(!O.providers||O.providers.length===0)O.providers=["CONTEXT_BENCH"];if(O.actions.some((I)=>I.toUpperCase()==="REPLY"))O.text=""}if(O.actions&&O.actions.length>1){let I=(L)=>typeof L==="string"&&L.toUpperCase()==="IGNORE";if(O.actions.some(I))if(!O.text||O.text.trim()==="")O.actions=["IGNORE"];else{let L=O.actions.filter((g)=>!I(g));O.actions=L.length?L:["REPLY"]}}let E=HT$(O);O.simple=E,O.responseId=_;let R=[{id:_,entityId:$.agentId,agentId:$.agentId,content:O,roomId:q.roomId,createdAt:Date.now()}];return{responseContent:O,responseMessages:R,state:K,mode:E&&O.text?"simple":"actions"}}async runMultiStepCore($,q,K,P,_,O){let Y=[],j=K,W=0;while(W<_.maxMultiStepIterations){W++,$.logger.debug({src:"service:message",iteration:W,maxIterations:_.maxMultiStepIterations},"Starting multi-step iteration"),j=await $.composeState(q,["RECENT_MESSAGES","ACTION_STATE","PROVIDERS"],!1,!1),j.data.actionResults=Y;let k=await $.dynamicPromptExecFromState({state:j,params:{prompt:$.character.templates?.multiStepDecisionTemplate||eB},schema:[{field:"thought",description:"Your reasoning for the selected providers and/or action, and how this step contributes to resolving the user's request",validateField:!1,streamField:!1},{field:"providers",description:"Comma-separated list of providers to call to gather necessary data",validateField:!1,streamField:!1},{field:"action",description:"Name of the action to execute after providers return (can be empty if no action is needed)",validateField:!1,streamField:!1},{field:"params",description:"Optional XML parameters for the selected action. Use nested XML tags only when the action needs input.",validateField:!1,streamField:!1},{field:"isFinish",description:"true if the task is fully resolved and no further steps are needed, false otherwise",validateField:!1,streamField:!1}],options:{modelSize:"large",preferredEncapsulation:"xml"}});if(!k){$.logger.warn({src:"service:message",iteration:W},"Failed to parse multi-step result"),Y.push({data:{actionName:"parse_error"},success:!1,error:"Failed to parse step result"});break}let S=typeof k.thought==="string"?k.thought:void 0,C=[];if(Array.isArray(k.providers))C=k.providers;else if(typeof k.providers==="string")C=k.providers.split(",").map((J)=>J.trim()).filter((J)=>J.length>0);let E=typeof k.action==="string"?k.action:void 0,R=k.isFinish;if(R==="true"||R===!0){if($.logger.info({src:"service:message",agentId:$.agentId,iteration:W},"Multi-step task completed"),P)await P({text:"",thought:typeof S==="string"?S:""});break}let I=Array.isArray(C)?C:[];if((!I||I.length===0)&&!E){$.logger.warn({src:"service:message",iteration:W},"No providers or action specified, forcing completion");break}let b=parseInt(String($.getSetting("PROVIDERS_TOTAL_TIMEOUT_MS")||"1000"),10),L=new Set,g=new Map($.providers.map((J)=>[J.name,J])),y=[];for(let J of I){if(typeof J!=="string")continue;y.push((async(w)=>{let v=g.get(w);if(!v)return $.logger.warn({src:"service:message",providerName:w},"Provider not found"),L.add(w),{providerName:w,success:!1,error:`Provider not found: ${w}`};try{let T=await v.get($,q,K);if(L.add(w),!T)return $.logger.warn({src:"service:message",providerName:w},"Provider returned no result"),{providerName:w,success:!1,error:"Provider returned no result"};let A=!!T.text;return{providerName:w,success:A,text:A?T.text:void 0,error:A?void 0:"Provider returned no result"}}catch(T){L.add(w);let A=T instanceof Error?T.message:String(T);return $.logger.error({src:"service:message",providerName:w,error:A},"Provider execution failed"),{providerName:w,success:!1,error:A}}})(J))}let d,U=new Promise((J)=>{d=setTimeout(()=>J("timeout"),b)}),r=Promise.allSettled(y),c=await Promise.race([r,U]);if(d!==void 0)clearTimeout(d);if(c==="timeout"){let w=I.filter((v)=>typeof v==="string").filter((v)=>!L.has(v));if($.logger.error({src:"service:message",timeoutMs:b,pendingProviders:w,completedProviders:Array.from(L)},`Providers took too long (>${b}ms) - slow providers: ${w.join(", ")}`),P)await P({text:"Providers took too long to respond. Please optimize your providers or use caching.",actions:[],thought:"Provider timeout - pipeline aborted"});return{responseContent:null,responseMessages:[],state:K,mode:"none"}}let F=c;for(let J of F)if(J.status==="fulfilled"){let{providerName:w,success:v,text:T,error:A}=J.value;if(Y.push({data:{actionName:w},success:v,text:T,error:A}),P)await P({text:`\uD83D\uDD0E Provider executed: ${w}`,actions:[w],thought:typeof S==="string"?S:""})}else $.logger.error({src:"service:message",error:J.reason||"Unknown provider failure"},"Unexpected provider promise rejection");if(E){let J={text:`\uD83D\uDD0E Executing action: ${E}`,actions:[E],thought:S||""};if(k&&typeof k.params==="string")J.params=k.params;await $.processActions(q,[{id:w6(),entityId:$.agentId,roomId:q.roomId,createdAt:Date.now(),content:J}],K,async()=>{return[]});let T=$.stateCache.get(`${q.id}_action_results`)?.values?.actionResults,A=Array.isArray(T)?T:[],M=A.length>0?A[0]:null,N=M?.success??!1;Y.push({data:{actionName:typeof E==="string"?E:"unknown"},success:N,text:M&&"text"in M&&typeof M.text==="string"?M.text:void 0,values:M&&"values"in M&&typeof M.values==="object"&&M.values!==null?M.values:void 0,error:N?void 0:M&&("text"in M)&&typeof M.text==="string"?M.text:void 0})}}if(W>=_.maxMultiStepIterations)$.logger.warn({src:"service:message",maxIterations:_.maxMultiStepIterations},"Reached maximum iterations, forcing completion");j=await $.composeState(q,["RECENT_MESSAGES","ACTION_STATE"],!1,!1);let z=await $.dynamicPromptExecFromState({state:j,params:{prompt:$.character.templates?.multiStepSummaryTemplate||$n},schema:[{field:"thought",description:"Your internal reasoning about the summary",validateField:!1,streamField:!1},{field:"text",description:"The final summary message to send to the user",required:!0,streamField:!0}],options:{modelSize:"large",preferredEncapsulation:"xml",requiredFields:["text"],onStreamChunk:_.onStreamChunk}}),X=null,Z=z?.text;if(typeof Z==="string"&&Z)X={actions:["MULTI_STEP_SUMMARY"],text:Z,thought:(typeof z?.thought==="string"?z.thought:"Final user-facing message after task completion.")||"Final user-facing message after task completion.",simple:!0,responseId:O};let G=X?[{id:O,entityId:$.agentId,agentId:$.agentId,content:X,roomId:q.roomId,createdAt:Date.now()}]:[];return{responseContent:X,responseMessages:G,state:j,mode:X?"simple":"none"}}async emitRunEnded($,q,K,P,_){await $.emitEvent("RUN_ENDED",{runtime:$,source:"messageHandler",runId:q,messageId:K.id,roomId:K.roomId,entityId:K.entityId,startTime:P,status:_,endTime:Date.now(),duration:Date.now()-P})}async deleteMessage($,q){if(!q.id){$.logger.error({src:"service:message",agentId:$.agentId},"Cannot delete memory: message ID is missing");return}$.logger.info({src:"service:message",agentId:$.agentId,messageId:q.id,roomId:q.roomId},"Deleting memory"),await $.deleteMemory(q.id),$.logger.debug({src:"service:message",messageId:q.id},"Successfully deleted memory")}async clearChannel($,q,K){$.logger.info({src:"service:message",agentId:$.agentId,channelId:K,roomId:q},"Clearing message memories from channel");let P=await $.getMemoriesByRoomIds({tableName:"messages",roomIds:[q]});$.logger.debug({src:"service:message",channelId:K,count:P.length},"Found message memories to delete");let _=0;for(let O of P)if(O.id)try{await $.deleteMemory(O.id),_++}catch(Y){$.logger.warn({src:"service:message",error:Y,memoryId:O.id},"Failed to delete message memory")}$.logger.info({src:"service:message",agentId:$.agentId,channelId:K,deletedCount:_,totalCount:P.length},"Cleared message memories from channel")}}y6();G6();nP();var zT$=new Set([Array,Date,RegExp,Map,Set,WeakMap,WeakSet,Error,Promise,ArrayBuffer,DataView,Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array]);function X_($){if($===null||typeof $!=="object")return!1;let q=Object.getPrototypeOf($);if(q===null)return!0;if(q.constructor===Object)return!0;if(zT$.has(q.constructor))return!1;if(typeof Buffer<"u"&&Buffer.isBuffer($))return!1;return!1}var fT$={};class kT${permits;waiting=[];constructor($){this.permits=$}async acquire(){if(this.permits>0)return this.permits-=1,Promise.resolve();return new Promise(($)=>{this.waiting.push($)})}release(){this.permits+=1;let $=this.waiting.shift();if($&&this.permits>0)this.permits-=1,$()}}function VT$($){return typeof $==="object"&&$!==null&&"textStream"in $&&"text"in $&&"usage"in $&&"finishReason"in $}class t8{#$=100;agentId;character;adapter;static#q=0;actions=[];evaluators=[];providers=[];plugins=[];events={};stateCache=new Map;fetch=fetch;services=new Map;serviceTypes=new Map;models=new Map;routes=[];taskWorkers=new Map;sendHandlers=new Map;eventHandlers=new Map;allAvailablePlugins=new Map;characterPlugins=[];capabilityOptions={};actionPlanningOption;llmModeOption;checkShouldRespondOption;isAnonymousCharacter=!1;logger;enableAutonomy;settings;servicePromiseHandlers=new Map;servicePromises=new Map;startingServices=new Map;serviceRegistrationStatus=new Map;initPromise;initResolver;currentRunId;currentRoomId;currentActionContext;maxWorkingMemoryEntries=50;messageService=null;companionUrl;stopped=!1;constructor($){let q;if($.character)q=$.character,this.isAnonymousCharacter=!1;else t8.#q++,q={name:`Agent-${t8.#q}`,bio:["An anonymous agent"],templates:{},messageExamples:[],postExamples:[],topics:[],adjectives:[],knowledge:[],plugins:[],secrets:{}},this.isAnonymousCharacter=!0;if(this.capabilityOptions={disableBasic:$.disableBasicCapabilities,enableExtended:$.enableExtendedCapabilities,advancedCapabilities:$.advancedCapabilities,skipCharacterProvider:this.isAnonymousCharacter,enableAutonomy:$.enableAutonomy},this.agentId=q.id??$.agentId??V6(q.name??w6()),this.character=q,this.initPromise=new Promise((P)=>{this.initResolver=P}),this.logger=MO({namespace:q.name,level:$.logLevel??"error"}),$.conversationLength!==void 0)this.#$=$.conversationLength;else if($.settings?.CONVERSATION_LENGTH)this.#$=parseInt(String($.settings.CONVERSATION_LENGTH),10)||100;else this.#$=PA("CONVERSATION_LENGTH",100);if($.adapter)this.registerDatabaseAdapter($.adapter);this.companionUrl=$.companionUrl,this.fetch=$.fetch??this.fetch,this.settings=$.settings??fT$;let K=this.character.settings?.ENABLE_AUTONOMY===!0||this.character.settings?.ENABLE_AUTONOMY==="true";if(this.enableAutonomy=$.enableAutonomy??K,this.plugins=[],this.characterPlugins=$.plugins??[],this.actionPlanningOption=$.actionPlanning,this.llmModeOption=$.llmMode,this.checkShouldRespondOption=$.checkShouldRespond,$.allAvailablePlugins){for(let P of $.allAvailablePlugins)if(P.name)this.allAvailablePlugins.set(P.name,P)}if(this.logger.debug({src:"agent",agentId:this.agentId,agentName:this.character.name},"Initialized"),this.currentRunId=void 0,$.settings?.MAX_WORKING_MEMORY_ENTRIES)this.maxWorkingMemoryEntries=parseInt(String($.settings.MAX_WORKING_MEMORY_ENTRIES),10)||50;else this.maxWorkingMemoryEntries=PA("MAX_WORKING_MEMORY_ENTRIES",50)}createRunId(){return w6()}startRun($){return this.currentRunId=this.createRunId(),this.currentRoomId=$,this.currentRunId}endRun(){this.currentRunId=void 0,this.currentRoomId=void 0}getCurrentRunId(){if(!this.currentRunId)this.currentRunId=this.createRunId();return this.currentRunId}async registerPlugin($){if(!$.name)throw this.logger.error({src:"agent",agentId:this.agentId,error:"Plugin or plugin name is undefined"},"Plugin registration failed"),Error("registerPlugin: Plugin or plugin name is undefined");if(this.plugins.find((P)=>P.name===$.name)){this.logger.warn({src:"agent",agentId:this.agentId,plugin:$.name},"Plugin already registered, skipping");return}let K=$;if($.name==="basic-capabilities"){let P=this.character.settings,_=this.capabilityOptions.disableBasic??(P?.DISABLE_BASIC_CAPABILITIES===!0||P?.DISABLE_BASIC_CAPABILITIES==="true"),O=this.capabilityOptions.enableExtended??this.capabilityOptions.advancedCapabilities??(P?.ENABLE_EXTENDED_CAPABILITIES===!0||P?.ENABLE_EXTENDED_CAPABILITIES==="true"||P?.ADVANCED_CAPABILITIES===!0||P?.ADVANCED_CAPABILITIES==="true"),Y=this.capabilityOptions.skipCharacterProvider??!1,j=this.capabilityOptions.enableAutonomy??(P?.ENABLE_AUTONOMY===!0||P?.ENABLE_AUTONOMY==="true");if(_||O||Y||j){let z=ZM({disableBasic:_,enableExtended:O,skipCharacterProvider:Y,enableAutonomy:j});K={...z,events:$.events??z.events}}}if(this.plugins.push(K),this.logger.debug({src:"agent",agentId:this.agentId,plugin:K.name},"Plugin added"),K.init){let P={};if(K.config){for(let[_,O]of Object.entries(K.config))if(O!==null&&O!==void 0)P[_]=String(O)}await K.init(P,this),this.logger.debug({src:"agent",agentId:this.agentId,plugin:K.name},"Plugin initialized")}if(K.adapter)this.logger.debug({src:"agent",agentId:this.agentId,plugin:K.name},"Plugin declares adapter factory (handled pre-construction)");if(K.actions)for(let P of K.actions)this.registerAction(P);if(K.evaluators)for(let P of K.evaluators)this.registerEvaluator(P);if(K.providers)for(let P of K.providers)this.registerProvider(P);if(K.models)for(let[P,_]of Object.entries(K.models))this.registerModel(P,_,K.name,K.priority);if(K.routes)for(let P of K.routes){let _=P.path.startsWith("/")?P.path:`/${P.path}`;this.routes.push({...P,path:`/${K.name}${_}`})}if(K.events)for(let[P,_]of Object.entries(K.events))for(let O of _)this.registerEvent(P,O);if(K.services)for(let P of K.services){let _=P.serviceType;if(this.logger.debug({src:"agent",agentId:this.agentId,plugin:K.name,serviceType:_},"Registering service"),!this.servicePromises.has(_))this._createServiceResolver(_);if(this.serviceRegistrationStatus.set(_,"pending"),!this.serviceTypes.has(_))this.serviceTypes.set(_,[]);let O=this.serviceTypes.get(_);if(O)O.push(P)}if(K.adapter){this.logger.debug({src:"agent",agentId:this.agentId,plugin:K.name},"Registering database adapter");let P=this.getBasicCapabilitiesSettings(),_=await Promise.resolve(K.adapter(this.agentId,P));this.registerDatabaseAdapter(_)}}getAllServices(){return this.services}async stop(){if(this.stopped){this.logger.debug({src:"agent",agentId:this.agentId},"Runtime already stopped");return}this.stopped=!0,this.logger.debug({src:"agent",agentId:this.agentId},"Stopping runtime");let $=Array.from(this.startingServices.values());if($.length>0)this.logger.debug({src:"agent",agentId:this.agentId,count:$.length},"Waiting for in-flight service starts before stopping"),await Promise.all($);for(let[K,P]of this.services){this.logger.debug({src:"agent",agentId:this.agentId,serviceType:K},"Stopping service");for(let _ of P){let O=_;if(typeof O.stop==="function")await O.stop();else this.logger.warn({src:"agent",agentId:this.agentId,serviceType:K},"Service instance is missing stop(); skipping")}}let q=Error("Runtime stopped");for(let[K,P]of this.servicePromiseHandlers){P.reject(q);let _=this.servicePromises.get(K);if(_)_.catch(()=>{})}this.eventHandlers.clear(),this.events={},this.stateCache.clear(),this.servicePromises.clear(),this.servicePromiseHandlers.clear(),this.startingServices.clear()}async initialize($){let q=[],K=ZM(this.capabilityOptions);if(q.push(this.registerPlugin(K)),this.character.advancedPlanning===!0){let{createAdvancedPlanningPlugin:Z}=await Promise.resolve().then(() => (gU(),xU));q.push(this.registerPlugin(Z()))}if(this.character.advancedMemory===!0){let{createAdvancedMemoryPlugin:Z}=await Promise.resolve().then(() => (aU(),tU));q.push(this.registerPlugin(Z()))}for(let Z of this.characterPlugins)if(Z)q.push(this.registerPlugin(Z));await Promise.all(q);let P=$?.allowNoDatabase===!0||String(this.getSetting("ALLOW_NO_DATABASE")??"").toLowerCase()==="true"||String(process.env.ALLOW_NO_DATABASE??"").toLowerCase()==="true";if(!this.adapter)if(P)this.logger.warn({src:"agent",agentId:this.agentId},"Database adapter not initialized; using in-memory adapter (ALLOW_NO_DATABASE)"),this.registerDatabaseAdapter(new yX);else throw this.logger.error({src:"agent",agentId:this.agentId},"Database adapter not initialized"),Error("Database adapter not initialized. The SQL plugin (@elizaos/plugin-sql) is required for agent initialization. Please ensure it is included in your character configuration.");if(!await this.adapter.isReady())await this.adapter.initialize();if(this.messageService=new EM,$?.skipMigrations??!1)this.logger.debug({src:"agent",agentId:this.agentId},"Skipping plugin migrations");else this.logger.debug({src:"agent",agentId:this.agentId},"Running plugin migrations"),await this.runPluginMigrations(),this.logger.debug({src:"agent",agentId:this.agentId},"Plugin migrations completed");let O=await this.ensureAgentExists({...this.character,id:this.agentId});if(!O){let Z=`Agent ${this.agentId} does not exist in database after ensureAgentExists call`;throw Error(Z)}if(O.settings){this.character.settings={...O.settings,...this.character.settings};let Z=O.secrets&&typeof O.secrets==="object"?O.secrets:{},G=O.settings.secrets&&typeof O.settings.secrets==="object"?O.settings.secrets:{},k=this.character.settings.secrets&&typeof this.character.settings.secrets==="object"?this.character.settings.secrets:{},S=this.character.secrets&&typeof this.character.secrets==="object"?this.character.secrets:{},C={...Z,...G,...S,...k};if(Object.keys(C).length>0){let E={};for(let[R,I]of Object.entries(C))if(I!==null&&I!==void 0)E[R]=String(I);if(Object.keys(E).length>0)this.character.secrets=E,this.character.settings.secrets=E}}let Y=(await this.adapter.getEntitiesByIds([this.agentId]))[0]??null;if(!Y){if(!O.id)throw Error(`Agent ${this.agentId} has no ID`);if(!await this.createEntity({id:this.agentId,names:[this.character.name??"Agent"],metadata:{},agentId:O.id})){let G=`Failed to create entity for agent ${this.agentId}`;throw Error(G)}if(Y=(await this.adapter.getEntitiesByIds([this.agentId]))[0]??null,!Y)throw Error(`Agent entity not found for ${this.agentId}`);this.logger.debug({src:"agent",agentId:this.agentId},"Agent entity created")}if(!await this.getRoom(this.agentId))await this.adapter.createRooms([{id:this.agentId,name:this.character.name,source:"elizaos",type:A6.SELF,channelId:this.agentId,messageServerId:this.agentId,worldId:this.agentId}]);let[W]=await this.adapter.getParticipantsForRooms([this.agentId]);if(!(W?.entityIds??[]).includes(this.agentId)){if(!(await this.adapter.createRoomParticipants([this.agentId],this.agentId)).length)throw Error(`Failed to add agent ${this.agentId} as participant to its own room`);this.logger.debug({src:"agent",agentId:this.agentId},"Agent linked to room")}if(!this.getModel(S$.TEXT_EMBEDDING))this.logger.warn({src:"agent",agentId:this.agentId},"No TEXT_EMBEDDING model registered, skipping embedding setup");else await this.ensureEmbeddingDimension();if(this.initResolver)this.initResolver(),this.initResolver=void 0}getBasicCapabilitiesSettings(){let $={};for(let[_,O]of Object.entries(process.env))if(O!==void 0&&O!==null&&_)$[_]=String(O);let q=this.character.settings&&typeof this.character.settings==="object"?this.character.settings:{};for(let[_,O]of Object.entries(q)){if(O===void 0||O===null)continue;if(_==="secrets"&&typeof O==="object")continue;$[_]=typeof O==="string"?O:String(O)}let K=this.character.settings?.secrets&&typeof this.character.settings.secrets==="object"?this.character.settings.secrets:{};for(let[_,O]of Object.entries(K))if(O!==void 0&&O!==null)$[_]=String(O);let P=this.character.secrets&&typeof this.character.secrets==="object"?this.character.secrets:{};for(let[_,O]of Object.entries(P))if(O!==void 0&&O!==null)$[_]=String(O);return $}registerDatabaseAdapter($){if(this.adapter)this.logger.warn({src:"agent",agentId:this.agentId},"Database adapter already registered, ignoring");else this.adapter=$,this.logger.debug({src:"agent",agentId:this.agentId},"Database adapter registered")}async runPluginMigrations(){if(!this.adapter){this.logger.warn({src:"agent",agentId:this.agentId},"Database adapter not found, skipping plugin migrations");return}if(typeof this.adapter.runPluginMigrations!=="function"){this.logger.warn({src:"agent",agentId:this.agentId},"Database adapter does not support plugin migrations");return}let $=this.plugins.filter((P)=>P.schema).map((P)=>{let _=P.schema||{},O={};for(let[Y,j]of Object.entries(_))if(typeof j==="string"||typeof j==="number"||typeof j==="boolean"||j===null||typeof j==="object"&&j!==null)O[Y]=j;return{name:P.name,schema:O}});if($.length===0){this.logger.debug({src:"agent",agentId:this.agentId},"No plugins with schemas, skipping migrations");return}this.logger.debug({src:"agent",agentId:this.agentId,count:$.length},"Found plugins with schemas");let q=!1,K=process.env.ELIZA_ALLOW_DESTRUCTIVE_MIGRATIONS==="true";await this.adapter.runPluginMigrations($,{verbose:!q,force:K,dryRun:!1}),this.logger.debug({src:"agent",agentId:this.agentId},"Plugin migrations completed")}async getConnection(){if(!this.adapter)throw Error("Database adapter not registered");return this.adapter.getConnection()}setSetting($,q,K=!1){if(K){if(!this.character.secrets)this.character.secrets={};if(q!==null&&q!==void 0)this.character.secrets[$]=String(q)}else{if(!this.character.settings)this.character.settings={};if(q!==null&&q!==void 0)this.character.settings[$]=q}}getSetting($){let q=this.character.settings,K=this.character.secrets,P=q&&typeof q==="object"&&"extra"in q&&typeof q.extra==="object"&&q.extra!==null?q.extra:void 0,_=typeof q==="object"&&q!==null&&"secrets"in q&&typeof q.secrets==="object"&&q.secrets!==null?q.secrets:void 0,O=K?.[$]??q?.[$]??P?.[$]??_?.[$]??this.settings[$];if(O===void 0||O===null)return null;if(typeof O==="number")return O;if(typeof O==="boolean")return O;if(typeof O==="string"){let Y=q2(O,WK());if(Y==="true")return!0;if(Y==="false")return!1;return Y}return null}getConversationLength(){return this.#$}isActionPlanningEnabled(){if(this.actionPlanningOption!==void 0)return this.actionPlanningOption;let $=this.getSetting("ACTION_PLANNING");if($!==null){if(typeof $==="boolean")return $;if(typeof $==="string")return $.toLowerCase()==="true"}return!0}getLLMMode(){if(this.llmModeOption!==void 0)return this.llmModeOption;let $=this.getSetting("LLM_MODE");if($!==null&&typeof $==="string"){let q=$.toUpperCase();if(q==="SMALL"||q==="LARGE"||q==="DEFAULT")return q}return"DEFAULT"}isCheckShouldRespondEnabled(){if(this.checkShouldRespondOption!==void 0)return this.checkShouldRespondOption;let $=this.getSetting("CHECK_SHOULD_RESPOND");if($!==null){if(typeof $==="boolean")return $;if(typeof $==="string")return $.toLowerCase()!=="false"}return!0}getMessagingAdapter(){if(this.adapter&&typeof this.adapter.createMessageServer==="function"&&typeof this.adapter.createChannel==="function"&&typeof this.adapter.createMessage==="function")return this.adapter;return null}registerProvider($){this.providers.push($),this.logger.debug({src:"agent",agentId:this.agentId,provider:$.name},"Provider registered")}registerAction($){let q=vq($);if(this.actions.find((K)=>K.name===q.name))this.logger.warn({src:"agent",agentId:this.agentId,action:q.name},"Action already registered, skipping");else this.actions.push(q),this.logger.debug({src:"agent",agentId:this.agentId,action:q.name},"Action registered")}getAllActions(){return[...this.actions]}async getFilteredActions($){let q=await this._ensureServiceStarted("tool_policy");if(!q||!$)return[...this.actions];return q.filterActions(this.actions,$)}async isActionAllowed($,q){let K=await this._ensureServiceStarted("tool_policy");if(!K)return{allowed:!0,reason:"No policy service available"};let P=K.isToolAllowed($,q);return{allowed:P.allowed,reason:P.reason}}registerEvaluator($){this.evaluators.push(Cn($))}updateActionPlan($,q){return{...$,...q}}updateActionStep($,q,K){if(!$.steps||q<0||q>=$.steps.length)return this.logger.warn({src:"agent",agentId:this.agentId,index:q,stepsCount:$.steps?.length||0},"Invalid step index"),$;return{...$,steps:$.steps.map((P,_)=>_===q?{...P,...K}:P)}}async processActions($,q,K,P,_){let O=this.isActionPlanningEnabled(),Y=[],j=q;if(O){for(let C of q)if(C.content?.actions&&C.content.actions.length>0)Y.push(...C.content.actions)}else for(let C of q)if(C.content?.actions&&C.content.actions.length>0){Y=[C.content.actions[0]],j=[{...C,content:{...C.content,actions:[C.content.actions[0]]}}],this.logger.debug({src:"agent",agentId:this.agentId,selectedAction:C.content.actions[0],skippedActions:C.content.actions.slice(1)},"Action planning disabled, limiting to first action");break}let W=Y.length>1&&O,z=this.getCurrentRunId(),X=this.createRunId(),Z,k=q[0]?.content?.thought||`Executing ${Y.length} actions: ${Y.join(", ")}`;if(W)Z={runId:X,totalSteps:Y.length,currentStep:0,steps:Y.map((C)=>({action:C,status:"pending"})),thought:k,startTime:Date.now()};let S=0;for(let C of j){let g=function(U){return U.toLowerCase().replace(/_/g,"")};if(!C.content||!C.content.actions||C.content.actions.length===0){this.logger.warn({src:"agent",agentId:this.agentId},"No action found in response");continue}let E=C.content.actions,R=C.content&&typeof C.content.params==="string"?C.content.params:void 0,I=k2(R),b=[],L=K,y=this.actions.map((U)=>{let r=g(U.name),c=U.similes?U.similes.map((F)=>g(F)):[];return{action:U,normalizedName:r,normalizedSimiles:c}}),d=new Map;for(let U of y)if(!d.has(U.normalizedName))d.set(U.normalizedName,U.action);this.logger.trace({src:"agent",agentId:this.agentId,actions:this.actions.map((U)=>g(U.name))},"Available actions");for(let U of E){if(Z)Z=this.updateActionPlan(Z,{currentStep:S+1});if(L=await this.composeState($,["RECENT_MESSAGES","ACTION_STATE"]),Z&&L.data)L.data.actionPlan=Z,L.data.actionResults=b;this.logger.debug({src:"agent",agentId:this.agentId,action:U},"Processing action");let r=g(U),c=d.get(r);if(!c){for(let u of y)if(u.normalizedName.includes(r)||r.includes(u.normalizedName)){c=u.action;break}}if(!c)for(let u of y){if(u.normalizedSimiles.find((Z$)=>Z$===r)){c=u.action,this.logger.debug({src:"agent",agentId:this.agentId,action:c.name,match:"simile"},"Action resolved via simile");break}if(u.normalizedSimiles.find((Z$)=>Z$.includes(r)||r.includes(Z$))){c=u.action,this.logger.debug({src:"agent",agentId:this.agentId,action:c.name,match:"fuzzy"},"Action resolved via fuzzy match");break}}if(!c){let u=`Action not found: ${U}`;if(this.logger.error({src:"agent",agentId:this.agentId,action:U},"Action not found"),Z?.steps?.[S])Z=this.updateActionStep(Z,S,{status:"failed",error:u});let l={id:w6(),entityId:$.entityId,roomId:$.roomId,worldId:$.worldId,content:{thought:u,source:"auto",type:"action_result",actionName:U,actionStatus:"failed",runId:X}};await this.createMemory(l,"messages"),S++;continue}if(!c.handler){if(this.logger.error({src:"agent",agentId:this.agentId,action:c.name},"Action has no handler"),Z?.steps?.[S])Z=this.updateActionStep(Z,S,{status:"failed",error:"No handler"});S++;continue}this.logger.debug({src:"agent",agentId:this.agentId,action:c.name},"Executing action");let F={};if(c.parameters&&c.parameters.length>0){let u=U.trim().toUpperCase(),l=c.name.trim().toUpperCase(),e=I.get(u)??I.get(l),Z$=QM(c,e);if(!Z$.valid)this.logger.warn({src:"agent",agentId:this.agentId,action:c.name,errors:Z$.errors},"Action parameter validation incomplete; continuing to handler"),F.parameterErrors=Z$.errors;if(Z$.params)F.parameters=Z$.params}let J=w6(),w=w6();this.currentActionContext={actionName:c.name,actionId:J,prompts:[]};let v={previousResults:b,getPreviousResult:(u)=>{return b.find((l)=>l.data&&l.data.actionName===u)}};if(F.actionContext=v,Z)F.actionPlan={totalSteps:Z.totalSteps,currentStep:Z.currentStep,steps:Z.steps,thought:Z.thought};if(_?.onStreamChunk)F.onStreamChunk=_.onStreamChunk;await this.emitEvent("ACTION_STARTED",{messageId:J,roomId:$.roomId,world:$.worldId,content:{text:`Executing action: ${c.name}`,actions:[c.name],actionStatus:"executing",actionId:J,runId:X,type:"agent_action",thought:k,source:$.content?.source}});let T=[],A=async(u)=>{return u.responseId=w,T.push(u),[]},M;if(_?.onStreamChunk){let u=null,l=_.onStreamChunk;M={messageId:w,onStreamChunk:async(e,Z$)=>{if(!u)u=new MM;let K$=u.push(e);if(K$&&l)await l(K$,Z$)},onStreamEnd:()=>{u=null}}}let N=await NW(M,()=>c.handler(this,$,L,F,A,q)),f=N===void 0||N===null||typeof N==="boolean",H;if(!f){if(typeof N==="object"&&N!==null&&(("values"in N)||("data"in N)||("text"in N)))H={...N,success:"success"in N?N.success:!0};else{let u=typeof N==="string"?N:typeof N==="number"?N:typeof N==="boolean"?N:N===null?null:JSON.stringify(N);H={success:!0,data:{actionName:c.name,result:u}}}if(b.push(H),H.values&&L){let l=L.data?.actionResults,e=Array.isArray(l)?l:[];L={...L,values:{...L.values,...H.values},data:{...L.data||{},actionResults:[...e,H],actionPlan:Z}}}if(L?.data){if(!L.data.workingMemory)L.data.workingMemory={};let l=`action_${H.data?.actionName||c.name}_${w6()}`,e={actionName:c.name,result:H,timestamp:Date.now()},Z$=L.data.workingMemory;Z$[l]=e;let K$=Object.entries(Z$);if(K$.length>this.maxWorkingMemoryEntries){let t=K$.length-this.maxWorkingMemoryEntries;while(t>0){let q$=null,$$=Number.POSITIVE_INFINITY;for(let[j$,a$]of Object.entries(Z$)){let B=a$?.timestamp??0;if(B<$$)$$=B,q$=j$}if(!q$)break;delete Z$[q$],t--}}}if(Z?.steps?.[S])Z=this.updateActionStep(Z,S,{status:"completed",result:H})}let h=H?.success!==!1?"completed":"failed";if(await this.emitEvent("ACTION_COMPLETED",{messageId:J,roomId:$.roomId,world:$.worldId,content:{text:H?.text||"",actions:[c.name],actionStatus:h,actionId:J,type:"agent_action",thought:k,actionResult:H,source:$.content?.source}}),P)for(let u of T){if(u.text)u.text=this.redactSecrets(u.text);await P(u)}let D={id:J,entityId:this.agentId,roomId:$.roomId,worldId:$.worldId,content:{text:H?.text||`Executed action: ${c.name}`,source:"action"}};await this.createMemory(D,"messages"),this.logger.debug({src:"agent",agentId:this.agentId,action:c.name},"Action completed");let x=H?{success:H.success,text:H.text,error:H.error}:void 0;await this.adapter.createLogs([{entityId:$.entityId,roomId:$.roomId,type:"action",body:{action:c.name,actionId:J,message:$.content.text,messageId:$.id,result:x,isVoidReturn:f,prompts:this.currentActionContext?.prompts||[],promptCount:this.currentActionContext?.prompts?.length||0,runId:X,parentRunId:z,...Z&&{planStep:`${Z.currentStep}/${Z.totalSteps}`,planThought:Z.thought}}}]),this.currentActionContext=void 0,S++}if($.id)this.stateCache.set(`${$.id}_action_results`,{values:{actionResults:b},data:{actionResults:b,actionPlan:Z},text:JSON.stringify(b)})}}getActionResults($){let q=this.stateCache?.get(`${$}_action_results`);return q?.data&&q.data.actionResults||[]}async evaluate($,q,K,P,_){let O=this.evaluators.map(async(j)=>{if(!j.handler)return null;if(!K&&!j.alwaysRun)return null;if(await j.validate(this,$,q))return j;return null}),Y=(await Promise.all(O)).filter(Boolean);if(Y.length===0)return[];return q=await this.composeState($,["RECENT_MESSAGES","EVALUATORS"]),await Promise.all(Y.map(async(j)=>{if(j.handler)await j.handler(this,$,q,{},P,_),this.adapter.createLogs([{entityId:$.entityId,roomId:$.roomId,type:"evaluator",body:{evaluator:j.name,messageId:$.id,message:$.content.text,runId:this.getCurrentRunId()}}])})),Y}async ensureConnections($,q,K,P){if(!$){this.logger.error({src:"agent",agentId:this.agentId},"ensureConnections called without entities");return}if(!q||q.length===0){this.logger.error({src:"agent",agentId:this.agentId},"ensureConnections called without rooms");return}await this.ensureWorldExists({...P,agentId:this.agentId});let _=q[0],O=(L,g)=>L.reduce((y,d,U)=>{if(U%g===0)y.push([]);return y[y.length-1].push(d),y},[]),Y=q.map((L)=>L.id),W=(await this.getRoomsByIds(Y))?.map((L)=>L.id),z=Y.filter((L)=>!W?.includes(L)),X={worldId:P.id,messageServerId:P.messageServerId,source:K,agentId:this.agentId};if(z.length){this.logger.debug({src:"agent",agentId:this.agentId,count:z.length},"Creating rooms");let L=q.filter((g)=>z.includes(g.id)).map((g)=>({...g,...X,type:g.type||A6.GROUP}));await this.createRooms(L)}let Z=$.map((L)=>L.id).filter((L)=>L!==void 0),k=(await this.adapter.getEntitiesByIds(Z))?.map((L)=>L.id).filter((L)=>L!==void 0)||[],S=$.filter((L)=>L.id!==void 0&&!k.includes(L.id)),C={roomId:_.id,channelId:_.channelId,type:_.type},E={worldId:P.id,messageServerId:P.messageServerId};if(S.length){this.logger.debug({src:"agent",agentId:this.agentId,count:S.length},"Creating entities");let L={...C,...E,source:K,agentId:this.agentId},g=S.map((d)=>({...d,...L,metadata:d.metadata||{}})),y=O(g,5000);for(let d of y)await this.createEntities(d)}await this.ensureParticipantInRoom(this.agentId,_.id);let I=(await this.getParticipantsForRoom(_.id)).filter((L)=>L!==void 0),b=Z.filter((L)=>!I.includes(L));if(b.length){this.logger.debug({src:"agent",agentId:this.agentId,count:b.length,channelId:_.id},"Adding missing participants");let L=O(b,5000);for(let g of L)await this.createRoomParticipants(g,_.id)}this.logger.success({src:"agent",agentId:this.agentId,worldId:P.id},"World connected")}async ensureConnection($){await AU(this.adapter,{agentId:this.agentId,worldId:$.worldId,messageServerId:$.messageServerId,...$,source:$.source??"default"}),this.logger.debug({src:"agent",agentId:this.agentId,entityId:$.entityId,channelId:$.roomId},"Entity connected")}async ensureParticipantInRoom($,q){let K=(await this.adapter.getEntitiesByIds([$]))[0]??null;if(!K&&$!==this.agentId)this.logger.warn({src:"agent",agentId:this.agentId,entityId:$},"Entity not accessible, attempting to add as participant");else if(!K&&$===this.agentId)throw Error(`Agent entity ${$} not found, cannot add as participant.`);else if(!K)throw Error(`User entity ${$} not found, cannot add as participant.`);if(!((await this.adapter.getParticipantsForRooms([q]))[0]?.entityIds??[]).includes($)){if(!await this.adapter.createRoomParticipants([$],q))throw Error(`Failed to add participant ${$} to room ${q}`);if($===this.agentId)this.logger.debug({src:"agent",agentId:this.agentId,channelId:q},"Agent linked to room");else this.logger.debug({src:"agent",agentId:this.agentId,entityId:$,channelId:q},"User linked to room")}}async getParticipantsForEntity($){return await this.adapter.getParticipantsForEntities([$])}async getParticipantsForEntities($){return await this.adapter.getParticipantsForEntities($)}async getParticipantsForRoom($){return(await this.adapter.getParticipantsForRooms([$]))[0]?.entityIds??[]}async getParticipantsForRooms($){return await this.adapter.getParticipantsForRooms($)}async isRoomParticipant($,q){return(await this.adapter.areRoomParticipants([{roomId:$,entityId:q}]))[0]??!1}async areRoomParticipants($){return await this.adapter.areRoomParticipants($)}async addParticipant($,q){return(await this.adapter.createRoomParticipants([$],q)).length>0}async createRoomParticipants($,q){return await this.adapter.createRoomParticipants($,q)}async ensureWorldExists({id:$,name:q,messageServerId:K,metadata:P}){let _=(await this.adapter.getWorldsByIds([$]))[0]??null;await this.adapter.upsertWorlds([{id:$,name:q,agentId:this.agentId,messageServerId:K,metadata:P}]),this.logger.debug({src:"agent",agentId:this.agentId,worldId:$,messageServerId:K},_?"World updated":"World created")}async ensureRoomExists({id:$,name:q,source:K,type:P,channelId:_,messageServerId:O,worldId:Y,metadata:j}){if(!Y)throw Error("worldId is required");let W=await this.getRoom($);await this.adapter.upsertRooms([{id:$,name:q,agentId:this.agentId,source:K,type:P,channelId:_,messageServerId:O,worldId:Y,metadata:j}]),this.logger.debug({src:"agent",agentId:this.agentId,channelId:$},W?"Room updated":"Room created")}async composeState($,q=null,K=!1,P=!1){let _=typeof $.metadata==="object"&&$.metadata!==null&&"trajectoryStepId"in $.metadata?$.metadata.trajectoryStepId:void 0,O=typeof _==="string"&&_.trim()!==""?_:EW()?.trajectoryStepId;if(O)P=!0;let Y=K?q:null,j={values:{},data:{},text:""},W=P||!$.id?j:await this.stateCache.get($.id)||j,z=new Set;if(Y&&Y.length>0)for(let b of Y)z.add(b);else for(let b of this.providers.filter((L)=>!L.private&&!L.dynamic))z.add(b.name);if(!Y&&q&&q.length>0)for(let b of q)z.add(b);let X=[];for(let b of this.providers)if(z.has(b.name))X.push(b);X.sort((b,L)=>(b.position||0)-(L.position||0));let Z=await this._ensureServiceStarted("trajectory_logger"),G=await Promise.all(X.map(async(b)=>{let L=Date.now(),g=await b.get(this,$,W),y=Date.now()-L;if(y>100)this.logger.debug({src:"agent",agentId:this.agentId,provider:b.name,duration:y},"Slow provider");return{...g,providerName:b.name}}));if(O&&Z){let b=typeof $.content?.text==="string"?$.content.text:"";for(let L of G)try{let g=typeof L.text==="string"?L.text.length:0;Z.logProviderAccess({stepId:O,providerName:L.providerName,data:{textLength:g},purpose:"compose_state",query:{message:b.slice(0,2000)}})}catch{}}let k={...W.data&&W.data.providers||{}};for(let b of G){let L=b.text?this.redactSecrets(b.text):b.text;k[b.providerName]={...b,text:L,values:b.values&&typeof b.values==="object"?Object.fromEntries(Object.entries(b.values).filter(([,g])=>g!==void 0)):void 0}}let S=[];for(let b of X){let L=k[b.name];if(L?.text&&typeof L.text==="string"&&L.text.trim()!=="")S.push(L.text)}let C=S.join(`
3482
3482
  `),E=this.redactSecrets(C),R={...W.values||{}};for(let b of X){let L=k[b.name];if(L?.values&&typeof L.values==="object"&&L.values!==null)Object.assign(R,L.values)}for(let b in k)if(!X.some((L)=>L.name===b)){let L=k[b];if(L?.values&&typeof L.values==="object"&&L.values!==null)Object.assign(R,L.values)}let I={values:{...R,providers:E},data:{...W.data||{},providers:k},text:E};if($.id)this.stateCache.set($.id,I);return I}async _ensureServiceStarted($){if(this.stopped)return null;let q=$,K=this.services.get(q);if(K&&K.length>0)return K[0];let P=this.serviceTypes.get(q);if(!P||P.length===0)return null;let _=this.startingServices.get(q);if(!_)_=(async()=>{let O=null;for(let Y of P){let j=await this._runServiceStart(q,$,Y);if(j&&!O)O=j}return O})(),this.startingServices.set(q,_);try{return await _}finally{this.startingServices.delete(q)}}async _runServiceStart($,q,K){if(this.serviceRegistrationStatus.set($,"registering"),await this.initPromise,typeof K.start!=="function")return this.logger.error({src:"agent",agentId:this.agentId,serviceType:q},"Service class has no static start method"),this.serviceRegistrationStatus.set($,"failed"),null;try{let P=await K.start(this);if(!P)return this.serviceRegistrationStatus.set($,"failed"),null;if(!this.services.has($))this.services.set($,[]);let _=this.services.get($);if(_)_.push(P);let O=this.servicePromiseHandlers.get(q);if(O)O.resolve(P),this.servicePromiseHandlers.delete(q);if(K.registerSendHandlers)K.registerSendHandlers(this,P);return this.serviceRegistrationStatus.set($,"registered"),P}catch(P){this.logger.error({src:"agent",agentId:this.agentId,serviceType:q,error:P instanceof Error?P.message:String(P)},"Service start failed");let _=this.servicePromiseHandlers.get(q);if(_)_.reject(P instanceof Error?P:Error(String(P))),this.servicePromiseHandlers.delete(q),this.servicePromises.delete(q);return this.serviceRegistrationStatus.set($,"failed"),null}}getService($){let q=this.services.get($);if(q&&q.length>0)return q[0];return null}getTypedService($){return this.getService($)}getServicesByType($){let q=this.services.get($);if(!q||q.length===0)return this.logger.debug({src:"agent",agentId:this.agentId,serviceName:$},"No services found for type"),[];return q}getRegisteredServiceTypes(){return Array.from(this.serviceTypes.keys())}hasService($){let q=this.serviceTypes.get($);return q!==void 0&&q.length>0}getServiceRegistrationStatus($){return this.serviceRegistrationStatus.get($)||"unknown"}getServiceHealth(){let $={};for(let[q,K]of this.services)$[q]={status:this.getServiceRegistrationStatus(q),instances:K.length,hasPromise:this.servicePromises.has(q)};for(let[q,K]of this.serviceRegistrationStatus)if(!$[q])$[q]={status:K,instances:0,hasPromise:this.servicePromises.has(q)};return $}async registerService($){let q=$.serviceType,K=$.name||"Unknown";if(!q){this.logger.warn({src:"agent",agentId:this.agentId,serviceName:K},"Service missing serviceType property");return}if(this.logger.debug({src:"agent",agentId:this.agentId,serviceType:q},"Registering service (lazy; start() on first getService)"),this.serviceRegistrationStatus.set(q,"pending"),!this.servicePromises.has(q))this._createServiceResolver(q);if(!this.serviceTypes.has(q))this.serviceTypes.set(q,[]);let P=this.serviceTypes.get(q);if(!P)return;P.push($)}_createServiceResolver($){let q,K,P=new Promise((O,Y)=>{q=O,K=Y});if(P.catch(()=>{}),this.servicePromises.set($,P),!q)throw Error(`Failed to create resolver for service ${$}`);if(!K)throw Error(`Failed to create rejecter for service ${$}`);this.servicePromiseHandlers.set($,{resolve:q,reject:K});let _=this.servicePromises.get($);if(!_)throw Error(`Service promise for ${$} not found`);return _}getServiceLoadPromise($){return this._ensureServiceStarted($).then((q)=>{if(!q)throw Error(`Service ${$} not found or failed to start`);return q})}registerModel($,q,K,P){let _=typeof $==="string"?$:S$[$];if(!this.models.has(_))this.models.set(_,[]);let O=Date.now(),Y=this.models.get(_);if(Y)Y.push({handler:q,provider:K,priority:P||0,registrationOrder:O}),Y.sort((j,W)=>{if((W.priority||0)!==(j.priority||0))return(W.priority||0)-(j.priority||0);return(j.registrationOrder||0)-(W.registrationOrder||0)})}getModel($){let q=typeof $==="string"?$:S$[$],K=this.models.get(q);if(!K||!K.length)return;return this.logger.debug({src:"agent",agentId:this.agentId,model:q,provider:K[0].provider},"Using model"),K[0].handler}getModelSettings($){let q={},K=(G)=>{if($){let C=`${$}_${G}`,E=this.getSetting(C);if(E!==null&&E!==void 0){let R=Number(E);if(!Number.isNaN(R))return R}}let k=`DEFAULT_${G}`,S=this.getSetting(k);if(S!==null&&S!==void 0){let C=Number(S);if(!Number.isNaN(C))return C}return null},P=K("MAX_TOKENS"),_=K("TEMPERATURE"),O=K("TOP_P"),Y=K("TOP_K"),j=K("MIN_P"),W=K("SEED"),z=K("REPETITION_PENALTY"),X=K("FREQUENCY_PENALTY"),Z=K("PRESENCE_PENALTY");if(P!==null)q.maxTokens=P;if(_!==null)q.temperature=_;if(O!==null)q.topP=O;if(Y!==null)q.topK=Y;if(j!==null)q.minP=j;if(W!==null)q.seed=W;if(z!==null)q.repetitionPenalty=z;if(X!==null)q.frequencyPenalty=X;if(Z!==null)q.presencePenalty=Z;return Object.keys(q).length>0?q:null}logModelCall($,q,K,P,_,O,Y){if(q!==S$.TEXT_EMBEDDING&&P){if(this.currentActionContext)this.currentActionContext.prompts.push({modelType:q,prompt:P,timestamp:Date.now()})}let j=Array.isArray(Y)&&Y.every((W)=>typeof W==="number")?"[array]":typeof Y==="string"?Y:void 0;this.adapter.createLogs([{entityId:this.agentId,roomId:this.currentRoomId??this.agentId,body:{modelType:$,modelKey:q,prompt:P??void 0,systemPrompt:this.character.system??void 0,runId:this.getCurrentRunId(),timestamp:Date.now(),executionTime:_,provider:O||this.models.get(q)?.[0]?.provider||"unknown",actionContext:this.currentActionContext?{actionName:this.currentActionContext.actionName,actionId:this.currentActionContext.actionId}:void 0,response:j},type:`useModel:${q}`}])}async useModel($,q,K){let P=typeof $==="string"?$:S$[$],_=this.getLLMMode();if(_!=="DEFAULT"){if([S$.TEXT_SMALL,S$.TEXT_LARGE,S$.TEXT_REASONING_SMALL,S$.TEXT_REASONING_LARGE,S$.TEXT_COMPLETION].includes(P)){let c=_==="SMALL"?S$.TEXT_SMALL:S$.TEXT_LARGE;if(P!==c)this.logger.debug({src:"agent",agentId:this.agentId,originalModel:P,overrideModel:c,llmMode:_},"LLM mode override applied"),P=c}}let O=q&&typeof q==="object"&&!Array.isArray(q)?q:null,Y=(O&&"prompt"in O&&typeof O.prompt==="string"?O.prompt:null)||(O&&"input"in O&&typeof O.input==="string"?O.input:null)||(O&&"messages"in O&&Array.isArray(O.messages)?JSON.stringify(O.messages):null)||(typeof q==="string"?q:null),j=this.getModel(P),W=this.models.get(P),z=K&&W?.find((r)=>r.provider===K),X=z?z.handler:j;if(!X){let r=`No handler found for delegate type: ${P}`;throw Error(r)}if(![S$.TRANSCRIPTION,S$.IMAGE,S$.AUDIO,S$.VIDEO].includes(P))this.logger.trace({src:"agent",agentId:this.agentId,model:P,params:q},"Model input");else{let r="unknown size";if(Buffer.isBuffer(q))r=`${q.length} bytes`;else if(typeof Blob<"u"&&q instanceof Blob)r=`${q.size} bytes`;else if(typeof q==="object"&&q!==null){if("audio"in q&&Buffer.isBuffer(q.audio))r=`${q.audio.length} bytes`;else if("audio"in q&&typeof Blob<"u"&&q.audio instanceof Blob)r=`${q.audio.size} bytes`}this.logger.trace({src:"agent",agentId:this.agentId,model:P,size:r},"Model input (binary)")}let G,k=X_(q)?{...q}:q;if(q===null||q===void 0||typeof q!=="object"||Array.isArray(q)||C8.isBuffer(q))G=k;else{let r=this.getModelSettings(P);if(r)G={...r,...k};else G=k;if((P===S$.TEXT_SMALL||P===S$.TEXT_LARGE||P===S$.TEXT_REASONING_SMALL||P===S$.TEXT_REASONING_LARGE||P===S$.TEXT_COMPLETION)&&X_(G)&&this.character.name){let F=G;if(F.user===void 0)F.user=this.character.name}}let S=typeof performance<"u"&&typeof performance.now==="function"?performance.now():Date.now(),C=AM(),E=X_(G)?G:void 0,R=E?.onStreamChunk,I=C?.onStreamChunk,b=C?.messageId,L=C?.abortSignal,g=E?.stream,y=g===!1?!1:!!(R||I||g);if(X_(G)&&E)E.stream=y,delete E.onStreamChunk;let d=await X(this,G);if(y&&(R||I)&&VT$(d)){let r="";for await(let w of d.textStream){if(L?.aborted)break;if(r+=w,R)await R(w,b);if(I)await I(w,b)}let F=AM()?.onStreamEnd;if(F)F();let J=(typeof performance<"u"&&typeof performance.now==="function"?performance.now():Date.now())-S;if(this.logger.trace({src:"agent",agentId:this.agentId,model:P,duration:Number(J.toFixed(2)),streaming:!0},"Model output (stream with callback complete)"),this.logModelCall($,P,q,Y,J,K,r),!this.initResolver)try{let w=EW()?.trajectoryStepId,v=await this._ensureServiceStarted("trajectory_logger");if(w&&v){let T=X_(G)?G.temperature:void 0,A=X_(G)?G.maxTokens:void 0;v.logLlmCall({stepId:w,model:String(P),systemPrompt:typeof this.character.system==="string"?this.character.system:"",userPrompt:Y??"",response:r,temperature:typeof T==="number"?T:0,maxTokens:typeof A==="number"?A:0,purpose:"action",actionType:"runtime.useModel",latencyMs:Math.max(0,Math.round(J))})}}catch{}return r}let U=(typeof performance<"u"&&typeof performance.now==="function"?performance.now():Date.now())-S;if(this.logger.trace({src:"agent",agentId:this.agentId,model:P,duration:Number(U.toFixed(2))},"Model output"),this.logModelCall($,P,q,Y,U,K,d),!this.initResolver)try{let r=EW()?.trajectoryStepId,c=await this._ensureServiceStarted("trajectory_logger");if(r&&c){let F=X_(G)?G.temperature:void 0,J=X_(G)?G.maxTokens:void 0;c.logLlmCall({stepId:r,model:String(P),systemPrompt:typeof this.character.system==="string"?this.character.system:"",userPrompt:Y??"",response:typeof d==="string"?d:JSON.stringify(d),temperature:typeof F==="number"?F:0,maxTokens:typeof J==="number"?J:0,purpose:"action",actionType:"runtime.useModel",latencyMs:Math.max(0,Math.round(U))})}}catch{}return d}async generateText($,q){if(!$||!$.trim())throw Error("Input cannot be empty");let K=q?.includeCharacter??!0,P=q?.modelType??S$.TEXT_LARGE,_=$;if(K&&this.character){let j=this.character,W=[],z=Array.isArray(j.bio)?j.bio.join(" "):j.bio;if(z)W.push(`# About ${j.name}
3483
3483
  ${z}`);if(j.system)W.push(j.system);let X=[...j.style?.all||[],...j.style?.chat||[]];if(X.length>0)W.push(`Style:
3484
3484
  ${X.map((Z)=>`- ${Z}`).join(`
@@ -3531,5 +3531,5 @@ Please complete: ${O6.missingFields.concat(O6.invalidFields,O6.incompleteFields)
3531
3531
  END
3532
3532
  `}}};var Jo={name:"central_messages",schema:"",columns:{id:{name:"id",type:"text",primaryKey:!0,notNull:!0},channel_id:{name:"channel_id",type:"text",notNull:!0},author_id:{name:"author_id",type:"text",notNull:!0},content:{name:"content",type:"text",notNull:!0},raw_message:{name:"raw_message",type:"jsonb"},in_reply_to_root_message_id:{name:"in_reply_to_root_message_id",type:"text"},source_type:{name:"source_type",type:"text"},source_id:{name:"source_id",type:"text"},metadata:{name:"metadata",type:"jsonb"},created_at:{name:"created_at",type:"timestamp",notNull:!0,default:"now()"},updated_at:{name:"updated_at",type:"timestamp",notNull:!0,default:"now()"}},indexes:{idx_messages_channel_created:{name:"idx_messages_channel_created",columns:[{expression:"channel_id",isExpression:!1},{expression:"created_at",isExpression:!1}],isUnique:!1},idx_messages_author:{name:"idx_messages_author",columns:[{expression:"author_id",isExpression:!1}],isUnique:!1}},foreignKeys:{fk_message_channel:{name:"fk_message_channel",tableFrom:"central_messages",tableTo:"channels",columnsFrom:["channel_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""},fk_message_reply:{name:"fk_message_reply",tableFrom:"central_messages",tableTo:"central_messages",columnsFrom:["in_reply_to_root_message_id"],columnsTo:["id"],onDelete:"set null",schemaTo:""}},compositePrimaryKeys:{},uniqueConstraints:{},checkConstraints:{}};var Wo={name:"message_servers",schema:"",columns:{id:{name:"id",type:"uuid",primaryKey:!0,notNull:!0},name:{name:"name",type:"text",notNull:!0},source_type:{name:"source_type",type:"text",notNull:!0},source_id:{name:"source_id",type:"text"},metadata:{name:"metadata",type:"jsonb"},created_at:{name:"created_at",type:"timestamp",notNull:!0,default:"now()"},updated_at:{name:"updated_at",type:"timestamp",notNull:!0,default:"now()"}},indexes:{idx_ms_source:{name:"idx_ms_source",columns:[{expression:"source_type",isExpression:!1},{expression:"source_id",isExpression:!1}],isUnique:!1}},foreignKeys:{},compositePrimaryKeys:{},uniqueConstraints:{},checkConstraints:{}};var Ho={name:"message_server_agents",schema:"",columns:{message_server_id:{name:"message_server_id",type:"uuid",notNull:!0},agent_id:{name:"agent_id",type:"uuid",notNull:!0}},indexes:{idx_msa_agent:{name:"idx_msa_agent",columns:[{expression:"agent_id",isExpression:!1}],isUnique:!1}},foreignKeys:{fk_message_server_agent_server:{name:"fk_message_server_agent_server",tableFrom:"message_server_agents",tableTo:"message_servers",columnsFrom:["message_server_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""},fk_message_server_agent_agent:{name:"fk_message_server_agent_agent",tableFrom:"message_server_agents",tableTo:"agents",columnsFrom:["agent_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""}},compositePrimaryKeys:{message_server_agents_pk:{name:"message_server_agents_pk",columns:["message_server_id","agent_id"]}},uniqueConstraints:{},checkConstraints:{}};var zo={name:"pairing_allowlist",schema:"",columns:{id:{name:"id",type:"uuid",primaryKey:!0,notNull:!0,default:"defaultRandom()"},channel:{name:"channel",type:"text",notNull:!0},sender_id:{name:"sender_id",type:"text",notNull:!0},created_at:{name:"created_at",type:"timestamp",notNull:!0,default:"now()"},metadata:{name:"metadata",type:"jsonb",default:"{}"},agent_id:{name:"agent_id",type:"uuid",notNull:!0}},indexes:{pairing_allowlist_channel_agent_idx:{name:"pairing_allowlist_channel_agent_idx",columns:[{expression:"channel",isExpression:!1},{expression:"agent_id",isExpression:!1}],isUnique:!1},pairing_allowlist_sender_channel_agent_idx:{name:"pairing_allowlist_sender_channel_agent_idx",columns:[{expression:"sender_id",isExpression:!1},{expression:"channel",isExpression:!1},{expression:"agent_id",isExpression:!1}],isUnique:!0}},foreignKeys:{fk_pairing_allowlist_agent:{name:"fk_pairing_allowlist_agent",tableFrom:"pairing_allowlist",tableTo:"agents",columnsFrom:["agent_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""}},compositePrimaryKeys:{},uniqueConstraints:{},checkConstraints:{}};var Zo={name:"pairing_requests",schema:"",columns:{id:{name:"id",type:"uuid",primaryKey:!0,notNull:!0,default:"defaultRandom()"},channel:{name:"channel",type:"text",notNull:!0},sender_id:{name:"sender_id",type:"text",notNull:!0},code:{name:"code",type:"text",notNull:!0},created_at:{name:"created_at",type:"timestamp",notNull:!0,default:"now()"},last_seen_at:{name:"last_seen_at",type:"timestamp",notNull:!0,default:"now()"},metadata:{name:"metadata",type:"jsonb",default:"{}"},agent_id:{name:"agent_id",type:"uuid",notNull:!0}},indexes:{pairing_requests_channel_agent_idx:{name:"pairing_requests_channel_agent_idx",columns:[{expression:"channel",isExpression:!1},{expression:"agent_id",isExpression:!1}],isUnique:!1},pairing_requests_code_channel_agent_idx:{name:"pairing_requests_code_channel_agent_idx",columns:[{expression:"code",isExpression:!1},{expression:"channel",isExpression:!1},{expression:"agent_id",isExpression:!1}],isUnique:!0},pairing_requests_sender_channel_agent_idx:{name:"pairing_requests_sender_channel_agent_idx",columns:[{expression:"sender_id",isExpression:!1},{expression:"channel",isExpression:!1},{expression:"agent_id",isExpression:!1}],isUnique:!0}},foreignKeys:{fk_pairing_request_agent:{name:"fk_pairing_request_agent",tableFrom:"pairing_requests",tableTo:"agents",columnsFrom:["agent_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""}},compositePrimaryKeys:{},uniqueConstraints:{},checkConstraints:{}};var wo={name:"participants",schema:"",columns:{id:{name:"id",type:"uuid",primaryKey:!0,notNull:!0,default:"gen_random_uuid()"},created_at:{name:"created_at",type:"timestamp",notNull:!0,default:"now()"},entity_id:{name:"entity_id",type:"uuid"},room_id:{name:"room_id",type:"uuid"},agent_id:{name:"agent_id",type:"uuid"},room_state:{name:"room_state",type:"text"}},indexes:{idx_participants_user:{name:"idx_participants_user",columns:[{expression:"entity_id",isExpression:!1}],isUnique:!1},idx_participants_room:{name:"idx_participants_room",columns:[{expression:"room_id",isExpression:!1}],isUnique:!1},idx_participants_entity_room:{name:"idx_participants_entity_room",columns:[{expression:"entity_id",isExpression:!1},{expression:"room_id",isExpression:!1}],isUnique:!0},idx_participants_agent:{name:"idx_participants_agent",columns:[{expression:"agent_id",isExpression:!1}],isUnique:!1}},foreignKeys:{fk_room:{name:"fk_room",tableFrom:"participants",tableTo:"rooms",columnsFrom:["room_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""},fk_user:{name:"fk_user",tableFrom:"participants",tableTo:"entities",columnsFrom:["entity_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""}},compositePrimaryKeys:{},uniqueConstraints:{},checkConstraints:{}};var To={name:"relationships",schema:"",columns:{id:{name:"id",type:"uuid",primaryKey:!0,notNull:!0,default:"gen_random_uuid()"},created_at:{name:"created_at",type:"timestamp",notNull:!0,default:"now()"},source_entity_id:{name:"source_entity_id",type:"uuid",notNull:!0},target_entity_id:{name:"target_entity_id",type:"uuid",notNull:!0},agent_id:{name:"agent_id",type:"uuid",notNull:!0},tags:{name:"tags",type:"text[]"},metadata:{name:"metadata",type:"jsonb"}},indexes:{idx_relationships_users:{name:"idx_relationships_users",columns:[{expression:"source_entity_id",isExpression:!1},{expression:"target_entity_id",isExpression:!1}],isUnique:!1},idx_relationships_target:{name:"idx_relationships_target",columns:[{expression:"target_entity_id",isExpression:!1}],isUnique:!1}},foreignKeys:{fk_user_a:{name:"fk_user_a",tableFrom:"relationships",tableTo:"entities",columnsFrom:["source_entity_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""},fk_user_b:{name:"fk_user_b",tableFrom:"relationships",tableTo:"entities",columnsFrom:["target_entity_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""},fk_relationship_agent:{name:"fk_relationship_agent",tableFrom:"relationships",tableTo:"agents",columnsFrom:["agent_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""}},compositePrimaryKeys:{},uniqueConstraints:{unique_relationship:{name:"unique_relationship",columns:["source_entity_id","target_entity_id","agent_id"]}},checkConstraints:{}};var Xo={name:"rooms",schema:"",columns:{id:{name:"id",type:"uuid",primaryKey:!0,notNull:!0,default:"gen_random_uuid()"},agent_id:{name:"agent_id",type:"uuid"},source:{name:"source",type:"text",notNull:!0},type:{name:"type",type:"text",notNull:!0},message_server_id:{name:"message_server_id",type:"uuid"},world_id:{name:"world_id",type:"uuid"},name:{name:"name",type:"text"},metadata:{name:"metadata",type:"jsonb"},channel_id:{name:"channel_id",type:"text"},created_at:{name:"created_at",type:"timestamp",notNull:!0,default:"now()"}},indexes:{idx_rooms_agent:{name:"idx_rooms_agent",columns:[{expression:"agent_id",isExpression:!1}],isUnique:!1},idx_rooms_world:{name:"idx_rooms_world",columns:[{expression:"world_id",isExpression:!1}],isUnique:!1}},foreignKeys:{fk_room_agent:{name:"fk_room_agent",tableFrom:"rooms",tableTo:"agents",columnsFrom:["agent_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""}},compositePrimaryKeys:{},uniqueConstraints:{},checkConstraints:{}};var vo={name:"servers",schema:"",columns:{id:{name:"id",type:"uuid",primaryKey:!0,notNull:!0},created_at:{name:"created_at",type:"timestamp",notNull:!0,default:"now()"},updated_at:{name:"updated_at",type:"timestamp",notNull:!0,default:"now()"}},indexes:{},foreignKeys:{},compositePrimaryKeys:{},uniqueConstraints:{},checkConstraints:{}};var Ao={name:"tasks",schema:"",columns:{id:{name:"id",type:"uuid",primaryKey:!0,notNull:!0,default:"defaultRandom()"},name:{name:"name",type:"text",notNull:!0},description:{name:"description",type:"text"},room_id:{name:"room_id",type:"uuid"},world_id:{name:"world_id",type:"uuid"},entity_id:{name:"entity_id",type:"uuid"},agent_id:{name:"agent_id",type:"uuid",notNull:!0},tags:{name:"tags",type:"text[]",default:"[]"},metadata:{name:"metadata",type:"jsonb",default:"{}"},created_at:{name:"created_at",type:"timestamp",default:"now()"},updated_at:{name:"updated_at",type:"timestamp",default:"now()"}},indexes:{idx_tasks_agent:{name:"idx_tasks_agent",columns:[{expression:"agent_id",isExpression:!1}],isUnique:!1},idx_tasks_agent_name:{name:"idx_tasks_agent_name",columns:[{expression:"agent_id",isExpression:!1},{expression:"name",isExpression:!1}],isUnique:!1}},foreignKeys:{fk_task_agent:{name:"fk_task_agent",tableFrom:"tasks",tableTo:"agents",columnsFrom:["agent_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""}},compositePrimaryKeys:{},uniqueConstraints:{},checkConstraints:{}};var Go={name:"worlds",schema:"",columns:{id:{name:"id",type:"uuid",primaryKey:!0,notNull:!0,default:"gen_random_uuid()"},agent_id:{name:"agent_id",type:"uuid",notNull:!0},name:{name:"name",type:"text",notNull:!0},metadata:{name:"metadata",type:"jsonb"},message_server_id:{name:"message_server_id",type:"uuid"},created_at:{name:"created_at",type:"timestamp",notNull:!0,default:"now()"}},indexes:{idx_worlds_agent:{name:"idx_worlds_agent",columns:[{expression:"agent_id",isExpression:!1}],isUnique:!1}},foreignKeys:{fk_world_agent:{name:"fk_world_agent",tableFrom:"worlds",tableTo:"agents",columnsFrom:["agent_id"],columnsTo:["id"],onDelete:"cascade",schemaTo:""}},compositePrimaryKeys:{},uniqueConstraints:{},checkConstraints:{}};function MT$($,q){return{agent:$(eU,q),cache:$($o,q),channel:$(qo,q),channelParticipant:$(Ko,q),component:$(_o,q),embedding:$(Po,q),entity:$(Oo,q),log:$(Yo,q),memory:$(jo,q),message:$(Jo,q),messageServer:$(Wo,q),messageServerAgent:$(Ho,q),pairingAllowlist:$(zo,q),pairingRequest:$(Zo,q),participant:$(wo,q),relationship:$(To,q),room:$(Xo,q),server:$(vo,q),task:$(Ao,q),world:$(Go,q)}}y6();class fo{serviceType;startFn;stopFn;description;constructor($){this.serviceType=$,this.description=""}withDescription($){return this.description=$,this}withStart($){return this.startFn=$,this}withStop($){return this.stopFn=$,this}build(){let $=this.serviceType,q=this.description,K=this.startFn,P=this.stopFn,_=class extends Q6{capabilityDescription=q;async stop(){if(P)await P()}};return Object.defineProperty(_,"serviceType",{value:$,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(_,"start",{value:async(Y)=>{if(!K)throw Error(`Start function not defined for service ${$}`);return K(Y)},writable:!1,enumerable:!0,configurable:!1}),_}}function ST$($){return new fo($)}function QQ$($){return ST$($.serviceType).withDescription($.description).withStart($.start).withStop($.stop||(()=>Promise.resolve())).build()}y6();G6();nP();var sQ$=!0,eQ$=!1,$t$={check:async()=>({status:"not-applicable",environment:"browser"}),isHealthy:()=>!0};export{V5$ as validateUuid,DA$ as validateCharacterConfig,U9 as validateCharacter,QM as validateActionParams,rC as uuidSchema,uU$ as updateWorldSettings,Lm$ as updateSummarizationTemplate,Zm$ as updateSettingsTemplate,Dm$ as updateRoleTemplate,wm$ as updateEntityTemplate,Jn as updateContactTemplate,a_ as unsaltWorldSettings,rZ$ as unsaltSettingValue,nm as truncateToCompleteSentence,ub$ as trimTokens,UB as toJson,Fn as toHex,Im$ as targetExtractionTemplate,yi as styleSchema,jc$ as stripPluginOnlyAllowlist,V6 as stringToUuid,yb$ as splitChunks,tp$ as snakeToCamel,cZ$ as slice,rm$ as shouldUnmuteTemplate,Zn as shouldUnmuteRoomTemplate,Um$ as shouldUnfollowTemplate,Hn as shouldUnfollowRoomTemplate,a0 as shouldRespondTemplate,om$ as shouldMuteTemplate,zn as shouldMuteRoomTemplate,nm$ as shouldFollowTemplate,Wn as shouldFollowRoomTemplate,Kd$ as settingsSuccessTemplate,pi as settingsSchema,_d$ as settingsFailureTemplate,Pd$ as settingsErrorTemplate,Od$ as settingsCompletionTemplate,JF$ as setTrajectoryContextManager,OF$ as setStreamingContextManager,mf$ as setEnv,$t$ as serverHealth,ci as secretsSchema,Yn as searchContactsTemplate,Pn as scheduleFollowUpTemplate,rV as saltWorldSettings,oZ$ as saltSettingValue,pb$ as safeReplacer,VU as runWithTrajectoryContext,NW as runWithStreamingContext,_c$ as resolveToolProfilePolicy,qn as replyTemplate,Pk$ as removeLogListener,jn as removeContactTemplate,zm$ as reflectionTemplate,wn as reflectionEvaluatorTemplate,Hk$ as recentLogs,lZ$ as randomBytes,rB as proto,cb$ as prewarmUuidCache,sB as postCreationTemplate,l6 as parseKeyValueXml,Bm as parseJSONObjectFromText,IA$ as parseCharacter,x7 as parseBooleanFromText,SA$ as parseAndValidateCharacter,k2 as parseActionParams,_n as optionExtractionTemplate,ZW as normalizeToolName,QB as normalizeToolList,gb$ as normalizeJsonString,xX as normalizeCharacterInput,$n as multiStepSummaryTemplate,eB as multiStepDecisionTemplate,yU$ as migrateEncryptedStringValue,wW as messageHandlerTemplate,FC as messageExampleSchema,xi as messageExampleGroupSchema,xm$ as messageClassifierTemplate,Jc$ as mergeToolPolicies,KF$ as mergeHybridResults,hA$ as mergeCharacterDefaults,Ei as mediaSchema,tb$ as mapLegacyEvents,D5$ as mapLegacyEvent,bm$ as longTermExtractionTemplate,O$ as logger,jk$ as logResponse,Yk$ as logPrompt,Wk$ as logChatOut,Jk$ as logChatIn,Uf$ as loadEnvFile,bi as knowledgeItemSchema,Di as knowledgeDirectorySchema,NA$ as isValidCharacter,Wc$ as isToolAllowedByPolicy,_x$ as isStreamableModelType,Wx$ as isStepCompleted,HT$ as isSimpleReplyResponse,eQ$ as isNode,Km$ as isMessageMetadata,qm$ as isFragmentMetadata,Ym$ as isFragmentMemory,$m$ as isDocumentMetadata,Om$ as isDocumentMemory,_m$ as isDescriptionMetadata,Pm$ as isCustomMetadata,gZ$ as isBuffer,sQ$ as isBrowser,cU$ as initializeOnboarding,hm$ as initialSummarizationTemplate,Bf$ as initBrowserEnvironment,Kn as imageGenerationTemplate,s0 as imageDescriptionTemplate,Y0 as hasFirstSentence,df$ as hasEnv,pU$ as getWorldSettings,fn as getUserServerRole,sp$ as getTypedService,WF$ as getTrajectoryContextManager,EW as getTrajectoryContext,YF$ as getStreamingContextManager,AM as getStreamingContext,am as getStepIndex,WK as getSalt,Jx$ as getPreviousStep,Tx$ as getPairingIdLabel,PA as getNumberEnv,jx$ as getNextStep,jm$ as getMemoryText,mJ as getLocalServerUrl,D_ as getEnvironment,nK as getEnv,n7 as getEntityDetails,mb$ as getContentTypeFromMimeType,lf$ as getBooleanEnv,xZ$ as fromString,oB as fromJson,bZ$ as fromHex,uZ$ as fromBytes,lm as formatTimestamp,j0 as formatPosts,J0 as formatMessages,aB as formatEntities,FM as formatActions,uo as formatActionParameters,rM as formatActionNames,pY as findWorldsForOwner,Be as findEnvFile,F_ as findEntityByName,dJ as extractFirstSentence,t0 as expandToolGroups,Yc$ as expandPolicyWithPluginGroups,iB as expandPluginGroups,mZ$ as equals,$d$ as entityResolutionTemplate,mU$ as encryptedCharacter,oV as encryptStringValue,FZ$ as encryptObjectValues,ZA as elizaLogger,lI as detectEnvironment,QQ$ as defineService,dU$ as decryptedCharacter,q2 as decryptStringValue,q2 as decryptSecret,iZ$ as decryptObjectValues,Ok$ as customLevels,nf$ as currentRuntime,S8 as createUniqueUuid,nZ$ as createSettingFromConfig,ep$ as createServiceError,ST$ as createService,ec$ as createMessageMemory,MO as createLogger,RA$ as createCharacter,Ii as contentSchema,pZ$ as concat,d6 as composePromptFromState,jK as composePrompt,DT$ as composeActionExamples,hT$ as composeActionCallExamples,qd$ as componentTemplate,Pc$ as collectExplicitAllowlist,gU$ as clearSaltCache,Hm$ as chooseOptionTemplate,mi as characterSchema,Hx$ as calculateProgress,dZ$ as byteLength,Oc$ as buildPluginToolGroups,$F$ as buildFtsQuery,LA$ as buildCharacterPlugins,MT$ as buildBaseTables,rn as bufferToString,Wm$ as booleanFooter,qF$ as bm25RankToScore,vn as autonomyTaskFirstTemplate,An as autonomyTaskContinueTemplate,Tn as autonomyContinuousFirstTemplate,Xn as autonomyContinuousContinueTemplate,Tq as asUUID,yZ$ as alloc,_k$ as addLogListener,B6 as addHeader,On as addContactTemplate,$k$ as __loggerTestHooks,nb$ as VECTOR_DIMS,tm$ as UPDATE_SUMMARIZATION_TEMPLATE,Cm$ as UPDATE_SETTINGS_TEMPLATE,im$ as UPDATE_ROLE_TEMPLATE,Em$ as UPDATE_ENTITY_TEMPLATE,cm$ as UPDATE_CONTACT_TEMPLATE,XW as TrajectoryLoggerService,wM as Tokenizer,zc$ as TRIGGER_SCHEMA_VERSION,Lz$ as TOOL_PROFILES,Dz$ as TOOL_NAME_ALIASES,hz$ as TOOL_GROUPS,Fm$ as TARGET_EXTRACTION_TEMPLATE,y8 as ServiceType,fo as ServiceBuilder,Q6 as Service,kT$ as Semaphore,h5$ as SOCKET_MESSAGE_TYPE,Bm$ as SHOULD_UNMUTE_ROOM_TEMPLATE,dm$ as SHOULD_UNFOLLOW_ROOM_TEMPLATE,Tm$ as SHOULD_RESPOND_TEMPLATE,lm$ as SHOULD_MUTE_ROOM_TEMPLATE,mm$ as SHOULD_FOLLOW_ROOM_TEMPLATE,Jd$ as SETTINGS_SUCCESS_TEMPLATE,Wd$ as SETTINGS_FAILURE_TEMPLATE,Hd$ as SETTINGS_ERROR_TEMPLATE,zd$ as SETTINGS_COMPLETION_TEMPLATE,um$ as SEARCH_CONTACTS_TEMPLATE,gm$ as SCHEDULE_FOLLOW_UP_TEMPLATE,ob$ as Role,Vm$ as REPLY_TEMPLATE,pm$ as REMOVE_CONTACT_TEMPLATE,Nm$ as REFLECTION_TEMPLATE,em$ as REFLECTION_EVALUATOR_TEMPLATE,R5$ as PlatformPrefix,vm$ as POST_CREATION_TEMPLATE,b5$ as PAIRING_ID_LABELS,wx$ as PAIRING_CODE_ALPHABET,P8 as OnboardingStep,Rm$ as OPTION_EXTRACTION_TEMPLATE,CY as ONBOARDING_STEP_ORDER,Ox$ as ONBOARDING_STEP_LABELS,Yx$ as ONBOARDING_STEP_DESCRIPTIONS,S$ as ModelType,T8 as MemoryType,km$ as MULTI_STEP_SUMMARY_TEMPLATE,fm$ as MULTI_STEP_DECISION_TEMPLATE,Kx$ as MODEL_SETTINGS,eb$ as MESSAGE_STREAM_EVENT,Xm$ as MESSAGE_HANDLER_TEMPLATE,sm$ as MESSAGE_CLASSIFIER_TEMPLATE,Lb$ as MAX_EMBEDDING_TOKENS,bb$ as MAX_EMBEDDING_CHARS,am$ as LONG_TERM_EXTRACTION_TEMPLATE,qx$ as LLMMode,I5$ as LEGACY_EVENT_MAP,yX as InMemoryDatabaseAdapter,Cz$ as IWebSearchService,fz$ as IWalletService,Mz$ as IVideoService,Vz$ as ITranscriptionService,Gz$ as ITokenDataService,Iz$ as IPostService,Nz$ as IPdfService,Qm$ as INITIAL_SUMMARIZATION_TEMPLATE,Rz$ as IMessagingService,Sm$ as IMAGE_GENERATION_TEMPLATE,Gm$ as IMAGE_DESCRIPTION_TEMPLATE,kz$ as ILpService,Ez$ as IEmailService,Sz$ as IBrowserService,SY as EventType,nI as Environment,Yd$ as ENTITY_RESOLUTION_TEMPLATE,EM as DefaultMessageService,gX as DatabaseAdapter,LX as DEFAULT_UUID,Zx$ as DEFAULT_PAIRING_CONFIG,xb$ as DEFAULT_MAX_PROMPT_TOKENS,pm as DEFAULT_MAX_EMBEDDING_TOKENS,f5$ as DEFAULT_MAX_EMBEDDING_CHARS,hb$ as DEFAULT_MAX_CONVERSATION_TOKENS,Qb$ as DEFAULT_HOOK_PRIORITY,A8 as ContentType,A6 as ChannelType,jd$ as COMPONENT_TEMPLATE,Mm$ as CHOOSE_OPTION_TEMPLATE,C8 as BufferUtils,x5$ as BatcherDisposedError,Am$ as BOOLEAN_FOOTER,TM as BM25,E5$ as AgentStatus,t8 as AgentRuntime,Td$ as AUTONOMY_TASK_FIRST_TEMPLATE,Xd$ as AUTONOMY_TASK_CONTINUE_TEMPLATE,Zd$ as AUTONOMY_CONTINUOUS_FIRST_TEMPLATE,wd$ as AUTONOMY_CONTINUOUS_CONTINUE_TEMPLATE,ym$ as ADD_CONTACT_TEMPLATE};
3533
3533
 
3534
- //# debugId=65CF9FEB5AEED8F064756E2164756E21
3534
+ //# debugId=A2EB0434CC35E8BC64756E2164756E21
3535
3535
  //# sourceMappingURL=index.browser.js.map