@elizaos/plugin-memory 1.0.7 → 1.1.1

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.
@@ -1,8 +1,8 @@
1
- var EB=Object.defineProperty;var NB=(A,Q)=>{for(var J in Q)EB(A,J,{get:Q[J],enumerable:!0,configurable:!0,set:(K)=>Q[J]=()=>K})};import{Service as vB,logger as O}from"@elizaos/core";import{eq as W,and as b,desc as S,sql as ZB,cosineDistance as xB,gte as hB}from"drizzle-orm";var s={};NB(s,{sessionSummaries:()=>E,memoryAccessLogs:()=>YB,longTermMemories:()=>j});import{sql as BB}from"drizzle-orm";import{pgTable as OB,text as g,integer as PB,jsonb as LB,real as AB,index as w,varchar as u,timestamp as i}from"drizzle-orm/pg-core";var j=OB("long_term_memories",{id:u("id",{length:36}).primaryKey(),agentId:u("agent_id",{length:36}).notNull(),entityId:u("entity_id",{length:36}).notNull(),category:g("category").notNull(),content:g("content").notNull(),metadata:LB("metadata"),embedding:AB("embedding").array(),confidence:AB("confidence").default(1),source:g("source"),createdAt:i("created_at").default(BB`now()`).notNull(),updatedAt:i("updated_at").default(BB`now()`).notNull(),lastAccessedAt:i("last_accessed_at"),accessCount:PB("access_count").default(0)},(A)=>({agentEntityIdx:w("long_term_memories_agent_entity_idx").on(A.agentId,A.entityId),categoryIdx:w("long_term_memories_category_idx").on(A.category),confidenceIdx:w("long_term_memories_confidence_idx").on(A.confidence),createdAtIdx:w("long_term_memories_created_at_idx").on(A.createdAt)}));import{sql as JB}from"drizzle-orm";import{pgTable as kB,text as RB,integer as KB,jsonb as QB,real as zB,index as n,varchar as y,timestamp as c}from"drizzle-orm/pg-core";var E=kB("session_summaries",{id:y("id",{length:36}).primaryKey(),agentId:y("agent_id",{length:36}).notNull(),roomId:y("room_id",{length:36}).notNull(),entityId:y("entity_id",{length:36}),summary:RB("summary").notNull(),messageCount:KB("message_count").notNull(),lastMessageOffset:KB("last_message_offset").notNull().default(0),startTime:c("start_time").notNull(),endTime:c("end_time").notNull(),topics:QB("topics"),metadata:QB("metadata"),embedding:zB("embedding").array(),createdAt:c("created_at").default(JB`now()`).notNull(),updatedAt:c("updated_at").default(JB`now()`).notNull()},(A)=>({agentRoomIdx:n("session_summaries_agent_room_idx").on(A.agentId,A.roomId),entityIdx:n("session_summaries_entity_idx").on(A.entityId),startTimeIdx:n("session_summaries_start_time_idx").on(A.startTime)}));import{sql as qB}from"drizzle-orm";import{pgTable as fB,text as bB,integer as DB,real as CB,index as a,varchar as l,timestamp as TB}from"drizzle-orm/pg-core";var YB=fB("memory_access_logs",{id:l("id",{length:36}).primaryKey(),agentId:l("agent_id",{length:36}).notNull(),memoryId:l("memory_id",{length:36}).notNull(),memoryType:bB("memory_type").notNull(),accessedAt:TB("accessed_at").default(qB`now()`).notNull(),roomId:l("room_id",{length:36}),relevanceScore:CB("relevance_score"),wasUseful:DB("was_useful")},(A)=>({memoryIdx:a("memory_access_logs_memory_idx").on(A.memoryId),agentIdx:a("memory_access_logs_agent_idx").on(A.agentId),accessedAtIdx:a("memory_access_logs_accessed_at_idx").on(A.accessedAt)}));class I extends vB{static serviceType="memory";sessionMessageCounts;memoryConfig;lastExtractionCheckpoints;capabilityDescription="Advanced memory management with short-term summarization and long-term persistent facts";constructor(A){super(A);this.sessionMessageCounts=new Map,this.lastExtractionCheckpoints=new Map,this.memoryConfig={shortTermSummarizationThreshold:16,shortTermRetainRecent:6,shortTermSummarizationInterval:10,longTermExtractionEnabled:!0,longTermVectorSearchEnabled:!1,longTermConfidenceThreshold:0.85,longTermExtractionThreshold:30,longTermExtractionInterval:10,summaryModelType:"TEXT_LARGE",summaryMaxTokens:2500,summaryMaxNewMessages:20}}static async start(A){let Q=new I(A);return await Q.initialize(A),Q}async stop(){O.info("MemoryService stopped")}async initialize(A){this.runtime=A;let Q=A.getSetting("MEMORY_SUMMARIZATION_THRESHOLD");if(Q)this.memoryConfig.shortTermSummarizationThreshold=parseInt(Q,10);let J=A.getSetting("MEMORY_RETAIN_RECENT");if(J)this.memoryConfig.shortTermRetainRecent=parseInt(J,10);let K=A.getSetting("MEMORY_SUMMARIZATION_INTERVAL");if(K)this.memoryConfig.shortTermSummarizationInterval=parseInt(K,10);let B=A.getSetting("MEMORY_MAX_NEW_MESSAGES");if(B)this.memoryConfig.summaryMaxNewMessages=parseInt(B,10);let Y=A.getSetting("MEMORY_LONG_TERM_ENABLED");if(Y==="false")this.memoryConfig.longTermExtractionEnabled=!1;else if(Y==="true")this.memoryConfig.longTermExtractionEnabled=!0;let Z=A.getSetting("MEMORY_CONFIDENCE_THRESHOLD");if(Z)this.memoryConfig.longTermConfidenceThreshold=parseFloat(Z);let $=A.getSetting("MEMORY_EXTRACTION_THRESHOLD");if($)this.memoryConfig.longTermExtractionThreshold=parseInt($,10);let G=A.getSetting("MEMORY_EXTRACTION_INTERVAL");if(G)this.memoryConfig.longTermExtractionInterval=parseInt(G,10);O.debug({summarizationThreshold:this.memoryConfig.shortTermSummarizationThreshold,summarizationInterval:this.memoryConfig.shortTermSummarizationInterval,maxNewMessages:this.memoryConfig.summaryMaxNewMessages,retainRecent:this.memoryConfig.shortTermRetainRecent,longTermEnabled:this.memoryConfig.longTermExtractionEnabled,extractionThreshold:this.memoryConfig.longTermExtractionThreshold,extractionInterval:this.memoryConfig.longTermExtractionInterval,confidenceThreshold:this.memoryConfig.longTermConfidenceThreshold},"MemoryService initialized")}getDb(){let A=this.runtime.db;if(!A)throw Error("Database not available");return A}getConfig(){return{...this.memoryConfig}}updateConfig(A){this.memoryConfig={...this.memoryConfig,...A}}incrementMessageCount(A){let J=(this.sessionMessageCounts.get(A)||0)+1;return this.sessionMessageCounts.set(A,J),J}resetMessageCount(A){this.sessionMessageCounts.set(A,0)}async shouldSummarize(A){return await this.runtime.countMemories(A,!1,"messages")>=this.memoryConfig.shortTermSummarizationThreshold}getExtractionKey(A,Q){return`memory:extraction:${A}:${Q}`}async getLastExtractionCheckpoint(A,Q){let J=this.getExtractionKey(A,Q),K=this.lastExtractionCheckpoints.get(J);if(K!==void 0)return K;try{let Y=await this.runtime.getCache(J)??0;return this.lastExtractionCheckpoints.set(J,Y),Y}catch(B){return O.warn({error:B},"Failed to get extraction checkpoint from cache"),0}}async setLastExtractionCheckpoint(A,Q,J){let K=this.getExtractionKey(A,Q);this.lastExtractionCheckpoints.set(K,J);try{await this.runtime.setCache(K,J),O.debug(`Set extraction checkpoint for ${A} in room ${Q} at message count ${J}`)}catch(B){O.error({error:B},"Failed to persist extraction checkpoint to cache")}}async shouldRunExtraction(A,Q,J){let K=this.memoryConfig.longTermExtractionThreshold,B=this.memoryConfig.longTermExtractionInterval;if(J<K)return O.debug({entityId:A,roomId:Q,currentMessageCount:J,threshold:K,shouldRun:!1},"Extraction check: below threshold"),!1;let Y=await this.getLastExtractionCheckpoint(A,Q),Z=Math.floor(J/B)*B,$=J>=K&&Z>Y;return O.debug({entityId:A,roomId:Q,currentMessageCount:J,threshold:K,interval:B,lastCheckpoint:Y,currentCheckpoint:Z,shouldRun:$},"Extraction check"),$}async storeLongTermMemory(A){let Q=this.getDb(),J=crypto.randomUUID(),K=new Date,B={id:J,createdAt:K,updatedAt:K,accessCount:0,...A};try{await Q.insert(j).values({id:B.id,agentId:B.agentId,entityId:B.entityId,category:B.category,content:B.content,metadata:B.metadata||{},embedding:B.embedding,confidence:B.confidence,source:B.source,accessCount:B.accessCount,createdAt:K,updatedAt:K,lastAccessedAt:B.lastAccessedAt})}catch(Y){throw O.error({error:Y},"Failed to store long-term memory"),Y}return O.info(`Stored long-term memory: ${B.category} for entity ${B.entityId}`),B}async getLongTermMemories(A,Q,J=10){let K=this.getDb(),B=[W(j.agentId,this.runtime.agentId),W(j.entityId,A)];if(Q)B.push(W(j.category,Q));return(await K.select().from(j).where(b(...B)).orderBy(S(j.confidence),S(j.updatedAt)).limit(J)).map((Z)=>({id:Z.id,agentId:Z.agentId,entityId:Z.entityId,category:Z.category,content:Z.content,metadata:Z.metadata,embedding:Z.embedding,confidence:Z.confidence,source:Z.source,createdAt:Z.createdAt,updatedAt:Z.updatedAt,lastAccessedAt:Z.lastAccessedAt,accessCount:Z.accessCount}))}async updateLongTermMemory(A,Q,J){let K=this.getDb(),B={updatedAt:new Date};if(J.content!==void 0)B.content=J.content;if(J.metadata!==void 0)B.metadata=J.metadata;if(J.confidence!==void 0)B.confidence=J.confidence;if(J.embedding!==void 0)B.embedding=J.embedding;if(J.lastAccessedAt!==void 0)B.lastAccessedAt=J.lastAccessedAt;if(J.accessCount!==void 0)B.accessCount=J.accessCount;await K.update(j).set(B).where(b(W(j.id,A),W(j.agentId,this.runtime.agentId),W(j.entityId,Q))),O.info(`Updated long-term memory: ${A} for entity ${Q}`)}async deleteLongTermMemory(A,Q){await this.getDb().delete(j).where(b(W(j.id,A),W(j.agentId,this.runtime.agentId),W(j.entityId,Q))),O.info(`Deleted long-term memory: ${A} for entity ${Q}`)}async getCurrentSessionSummary(A){let J=await this.getDb().select().from(E).where(b(W(E.agentId,this.runtime.agentId),W(E.roomId,A))).orderBy(S(E.updatedAt)).limit(1);if(J.length===0)return null;let K=J[0];return{id:K.id,agentId:K.agentId,roomId:K.roomId,entityId:K.entityId,summary:K.summary,messageCount:K.messageCount,lastMessageOffset:K.lastMessageOffset,startTime:K.startTime,endTime:K.endTime,topics:K.topics||[],metadata:K.metadata,embedding:K.embedding,createdAt:K.createdAt,updatedAt:K.updatedAt}}async storeSessionSummary(A){let Q=this.getDb(),J=crypto.randomUUID(),K=new Date,B={id:J,createdAt:K,updatedAt:K,...A};return await Q.insert(E).values({id:B.id,agentId:B.agentId,roomId:B.roomId,entityId:B.entityId||null,summary:B.summary,messageCount:B.messageCount,lastMessageOffset:B.lastMessageOffset,startTime:B.startTime,endTime:B.endTime,topics:B.topics||[],metadata:B.metadata||{},embedding:B.embedding,createdAt:K,updatedAt:K}),O.info(`Stored session summary for room ${B.roomId}`),B}async updateSessionSummary(A,Q,J){let K=this.getDb(),B={updatedAt:new Date};if(J.summary!==void 0)B.summary=J.summary;if(J.messageCount!==void 0)B.messageCount=J.messageCount;if(J.lastMessageOffset!==void 0)B.lastMessageOffset=J.lastMessageOffset;if(J.endTime!==void 0)B.endTime=J.endTime;if(J.topics!==void 0)B.topics=J.topics;if(J.metadata!==void 0)B.metadata=J.metadata;if(J.embedding!==void 0)B.embedding=J.embedding;await K.update(E).set(B).where(b(W(E.id,A),W(E.agentId,this.runtime.agentId),W(E.roomId,Q))),O.info(`Updated session summary: ${A} for room ${Q}`)}async getSessionSummaries(A,Q=5){return(await this.getDb().select().from(E).where(b(W(E.agentId,this.runtime.agentId),W(E.roomId,A))).orderBy(S(E.updatedAt)).limit(Q)).map((B)=>({id:B.id,agentId:B.agentId,roomId:B.roomId,entityId:B.entityId,summary:B.summary,messageCount:B.messageCount,lastMessageOffset:B.lastMessageOffset,startTime:B.startTime,endTime:B.endTime,topics:B.topics||[],metadata:B.metadata,embedding:B.embedding,createdAt:B.createdAt,updatedAt:B.updatedAt}))}async searchLongTermMemories(A,Q,J=5,K=0.7){if(!this.memoryConfig.longTermVectorSearchEnabled)return O.warn("Vector search is not enabled, falling back to recent memories"),this.getLongTermMemories(A,void 0,J);let B=this.getDb();try{let Y=Q.map((_)=>Number.isFinite(_)?Number(_.toFixed(6)):0),Z=ZB`1 - (${xB(j.embedding,Y)})`,$=[W(j.agentId,this.runtime.agentId),W(j.entityId,A),ZB`${j.embedding} IS NOT NULL`];if(K>0)$.push(hB(Z,K));return(await B.select({memory:j,similarity:Z}).from(j).where(b(...$)).orderBy(S(Z)).limit(J)).map((_)=>({id:_.memory.id,agentId:_.memory.agentId,entityId:_.memory.entityId,category:_.memory.category,content:_.memory.content,metadata:_.memory.metadata,embedding:_.memory.embedding,confidence:_.memory.confidence,source:_.memory.source,createdAt:_.memory.createdAt,updatedAt:_.memory.updatedAt,lastAccessedAt:_.memory.lastAccessedAt,accessCount:_.memory.accessCount,similarity:_.similarity}))}catch(Y){return O.warn({error:Y},"Vector search failed, falling back to recent memories"),this.getLongTermMemories(A,void 0,J)}}async getFormattedLongTermMemories(A){let Q=await this.getLongTermMemories(A,void 0,20);if(Q.length===0)return"";let J=new Map;for(let B of Q){if(!J.has(B.category))J.set(B.category,[]);J.get(B.category)?.push(B)}let K=[];for(let[B,Y]of J.entries()){let Z=B.split("_").map((G)=>G.charAt(0).toUpperCase()+G.slice(1)).join(" "),$=Y.map((G)=>`- ${G.content}`).join(`
1
+ var EB=Object.defineProperty;var NB=(B,Q)=>{for(var J in Q)EB(B,J,{get:Q[J],enumerable:!0,configurable:!0,set:(K)=>Q[J]=()=>K})};import{Service as vB,logger as O}from"@elizaos/core";import{eq as W,and as D,desc as S,sql as ZB,cosineDistance as xB,gte as hB}from"drizzle-orm";var s={};NB(s,{sessionSummaries:()=>E,memoryAccessLogs:()=>YB,longTermMemories:()=>X});import{sql as BB}from"drizzle-orm";import{pgTable as OB,text as g,integer as PB,jsonb as LB,real as AB,index as w,varchar as u,timestamp as n}from"drizzle-orm/pg-core";var X=OB("long_term_memories",{id:u("id",{length:36}).primaryKey(),agentId:u("agent_id",{length:36}).notNull(),entityId:u("entity_id",{length:36}).notNull(),category:g("category").notNull(),content:g("content").notNull(),metadata:LB("metadata"),embedding:AB("embedding").array(),confidence:AB("confidence").default(1),source:g("source"),createdAt:n("created_at").default(BB`now()`).notNull(),updatedAt:n("updated_at").default(BB`now()`).notNull(),lastAccessedAt:n("last_accessed_at"),accessCount:PB("access_count").default(0)},(B)=>({agentEntityIdx:w("long_term_memories_agent_entity_idx").on(B.agentId,B.entityId),categoryIdx:w("long_term_memories_category_idx").on(B.category),confidenceIdx:w("long_term_memories_confidence_idx").on(B.confidence),createdAtIdx:w("long_term_memories_created_at_idx").on(B.createdAt)}));import{sql as JB}from"drizzle-orm";import{pgTable as RB,text as kB,integer as KB,jsonb as QB,real as zB,index as i,varchar as y,timestamp as c}from"drizzle-orm/pg-core";var E=RB("session_summaries",{id:y("id",{length:36}).primaryKey(),agentId:y("agent_id",{length:36}).notNull(),roomId:y("room_id",{length:36}).notNull(),entityId:y("entity_id",{length:36}),summary:kB("summary").notNull(),messageCount:KB("message_count").notNull(),lastMessageOffset:KB("last_message_offset").notNull().default(0),startTime:c("start_time").notNull(),endTime:c("end_time").notNull(),topics:QB("topics"),metadata:QB("metadata"),embedding:zB("embedding").array(),createdAt:c("created_at").default(JB`now()`).notNull(),updatedAt:c("updated_at").default(JB`now()`).notNull()},(B)=>({agentRoomIdx:i("session_summaries_agent_room_idx").on(B.agentId,B.roomId),entityIdx:i("session_summaries_entity_idx").on(B.entityId),startTimeIdx:i("session_summaries_start_time_idx").on(B.startTime)}));import{sql as qB}from"drizzle-orm";import{pgTable as fB,text as DB,integer as bB,real as CB,index as a,varchar as l,timestamp as TB}from"drizzle-orm/pg-core";var YB=fB("memory_access_logs",{id:l("id",{length:36}).primaryKey(),agentId:l("agent_id",{length:36}).notNull(),memoryId:l("memory_id",{length:36}).notNull(),memoryType:DB("memory_type").notNull(),accessedAt:TB("accessed_at").default(qB`now()`).notNull(),roomId:l("room_id",{length:36}),relevanceScore:CB("relevance_score"),wasUseful:bB("was_useful")},(B)=>({memoryIdx:a("memory_access_logs_memory_idx").on(B.memoryId),agentIdx:a("memory_access_logs_agent_idx").on(B.agentId),accessedAtIdx:a("memory_access_logs_accessed_at_idx").on(B.accessedAt)}));class I extends vB{static serviceType="memory";sessionMessageCounts;memoryConfig;lastExtractionCheckpoints;capabilityDescription="Advanced memory management with short-term summarization and long-term persistent facts";constructor(B){super(B);this.sessionMessageCounts=new Map,this.lastExtractionCheckpoints=new Map,this.memoryConfig={shortTermSummarizationThreshold:16,shortTermRetainRecent:6,shortTermSummarizationInterval:10,longTermExtractionEnabled:!0,longTermVectorSearchEnabled:!1,longTermConfidenceThreshold:0.85,longTermExtractionThreshold:30,longTermExtractionInterval:10,summaryModelType:"TEXT_LARGE",summaryMaxTokens:2500,summaryMaxNewMessages:20}}static async start(B){let Q=new I(B);return await Q.initialize(B),Q}async stop(){O.info("MemoryService stopped")}async initialize(B){this.runtime=B;let Q=B.getSetting("MEMORY_SUMMARIZATION_THRESHOLD");if(Q)this.memoryConfig.shortTermSummarizationThreshold=parseInt(Q,10);let J=B.getSetting("MEMORY_RETAIN_RECENT");if(J)this.memoryConfig.shortTermRetainRecent=parseInt(J,10);let K=B.getSetting("MEMORY_SUMMARIZATION_INTERVAL");if(K)this.memoryConfig.shortTermSummarizationInterval=parseInt(K,10);let A=B.getSetting("MEMORY_MAX_NEW_MESSAGES");if(A)this.memoryConfig.summaryMaxNewMessages=parseInt(A,10);let Y=B.getSetting("MEMORY_LONG_TERM_ENABLED");if(Y==="false")this.memoryConfig.longTermExtractionEnabled=!1;else if(Y==="true")this.memoryConfig.longTermExtractionEnabled=!0;let Z=B.getSetting("MEMORY_CONFIDENCE_THRESHOLD");if(Z)this.memoryConfig.longTermConfidenceThreshold=parseFloat(Z);let U=B.getSetting("MEMORY_EXTRACTION_THRESHOLD");if(U)this.memoryConfig.longTermExtractionThreshold=parseInt(U,10);let V=B.getSetting("MEMORY_EXTRACTION_INTERVAL");if(V)this.memoryConfig.longTermExtractionInterval=parseInt(V,10);O.debug({summarizationThreshold:this.memoryConfig.shortTermSummarizationThreshold,summarizationInterval:this.memoryConfig.shortTermSummarizationInterval,maxNewMessages:this.memoryConfig.summaryMaxNewMessages,retainRecent:this.memoryConfig.shortTermRetainRecent,longTermEnabled:this.memoryConfig.longTermExtractionEnabled,extractionThreshold:this.memoryConfig.longTermExtractionThreshold,extractionInterval:this.memoryConfig.longTermExtractionInterval,confidenceThreshold:this.memoryConfig.longTermConfidenceThreshold},"MemoryService initialized")}getDb(){let B=this.runtime.db;if(!B)throw Error("Database not available");return B}getConfig(){return{...this.memoryConfig}}updateConfig(B){this.memoryConfig={...this.memoryConfig,...B}}incrementMessageCount(B){let J=(this.sessionMessageCounts.get(B)||0)+1;return this.sessionMessageCounts.set(B,J),J}resetMessageCount(B){this.sessionMessageCounts.set(B,0)}async shouldSummarize(B){return await this.runtime.countMemories(B,!1,"messages")>=this.memoryConfig.shortTermSummarizationThreshold}getExtractionKey(B,Q){return`memory:extraction:${B}:${Q}`}async getLastExtractionCheckpoint(B,Q){let J=this.getExtractionKey(B,Q),K=this.lastExtractionCheckpoints.get(J);if(K!==void 0)return K;try{let Y=await this.runtime.getCache(J)??0;return this.lastExtractionCheckpoints.set(J,Y),Y}catch(A){return O.warn({error:A},"Failed to get extraction checkpoint from cache"),0}}async setLastExtractionCheckpoint(B,Q,J){let K=this.getExtractionKey(B,Q);this.lastExtractionCheckpoints.set(K,J);try{await this.runtime.setCache(K,J),O.debug(`Set extraction checkpoint for ${B} in room ${Q} at message count ${J}`)}catch(A){O.error({error:A},"Failed to persist extraction checkpoint to cache")}}async shouldRunExtraction(B,Q,J){let K=this.memoryConfig.longTermExtractionThreshold,A=this.memoryConfig.longTermExtractionInterval;if(J<K)return!1;let Y=await this.getLastExtractionCheckpoint(B,Q),Z=Math.floor(J/A)*A,U=J>=K&&Z>Y;return O.debug({entityId:B,roomId:Q,currentMessageCount:J,threshold:K,interval:A,lastCheckpoint:Y,currentCheckpoint:Z,shouldRun:U},"Extraction check"),U}async storeLongTermMemory(B){let Q=this.getDb(),J=crypto.randomUUID(),K=new Date,A={id:J,createdAt:K,updatedAt:K,accessCount:0,...B};try{await Q.insert(X).values({id:A.id,agentId:A.agentId,entityId:A.entityId,category:A.category,content:A.content,metadata:A.metadata||{},embedding:A.embedding,confidence:A.confidence,source:A.source,accessCount:A.accessCount,createdAt:K,updatedAt:K,lastAccessedAt:A.lastAccessedAt})}catch(Y){throw O.error({error:Y},"Failed to store long-term memory"),Y}return O.info(`Stored long-term memory: ${A.category} for entity ${A.entityId}`),A}async getLongTermMemories(B,Q,J=10){let K=this.getDb(),A=[W(X.agentId,this.runtime.agentId),W(X.entityId,B)];if(Q)A.push(W(X.category,Q));return(await K.select().from(X).where(D(...A)).orderBy(S(X.confidence),S(X.updatedAt)).limit(J)).map((Z)=>({id:Z.id,agentId:Z.agentId,entityId:Z.entityId,category:Z.category,content:Z.content,metadata:Z.metadata,embedding:Z.embedding,confidence:Z.confidence,source:Z.source,createdAt:Z.createdAt,updatedAt:Z.updatedAt,lastAccessedAt:Z.lastAccessedAt,accessCount:Z.accessCount}))}async updateLongTermMemory(B,Q,J){let K=this.getDb(),A={updatedAt:new Date};if(J.content!==void 0)A.content=J.content;if(J.metadata!==void 0)A.metadata=J.metadata;if(J.confidence!==void 0)A.confidence=J.confidence;if(J.embedding!==void 0)A.embedding=J.embedding;if(J.lastAccessedAt!==void 0)A.lastAccessedAt=J.lastAccessedAt;if(J.accessCount!==void 0)A.accessCount=J.accessCount;await K.update(X).set(A).where(D(W(X.id,B),W(X.agentId,this.runtime.agentId),W(X.entityId,Q))),O.info(`Updated long-term memory: ${B} for entity ${Q}`)}async deleteLongTermMemory(B,Q){await this.getDb().delete(X).where(D(W(X.id,B),W(X.agentId,this.runtime.agentId),W(X.entityId,Q))),O.info(`Deleted long-term memory: ${B} for entity ${Q}`)}async getCurrentSessionSummary(B){let J=await this.getDb().select().from(E).where(D(W(E.agentId,this.runtime.agentId),W(E.roomId,B))).orderBy(S(E.updatedAt)).limit(1);if(J.length===0)return null;let K=J[0];return{id:K.id,agentId:K.agentId,roomId:K.roomId,entityId:K.entityId,summary:K.summary,messageCount:K.messageCount,lastMessageOffset:K.lastMessageOffset,startTime:K.startTime,endTime:K.endTime,topics:K.topics||[],metadata:K.metadata,embedding:K.embedding,createdAt:K.createdAt,updatedAt:K.updatedAt}}async storeSessionSummary(B){let Q=this.getDb(),J=crypto.randomUUID(),K=new Date,A={id:J,createdAt:K,updatedAt:K,...B};return await Q.insert(E).values({id:A.id,agentId:A.agentId,roomId:A.roomId,entityId:A.entityId||null,summary:A.summary,messageCount:A.messageCount,lastMessageOffset:A.lastMessageOffset,startTime:A.startTime,endTime:A.endTime,topics:A.topics||[],metadata:A.metadata||{},embedding:A.embedding,createdAt:K,updatedAt:K}),O.info(`Stored session summary for room ${A.roomId}`),A}async updateSessionSummary(B,Q,J){let K=this.getDb(),A={updatedAt:new Date};if(J.summary!==void 0)A.summary=J.summary;if(J.messageCount!==void 0)A.messageCount=J.messageCount;if(J.lastMessageOffset!==void 0)A.lastMessageOffset=J.lastMessageOffset;if(J.endTime!==void 0)A.endTime=J.endTime;if(J.topics!==void 0)A.topics=J.topics;if(J.metadata!==void 0)A.metadata=J.metadata;if(J.embedding!==void 0)A.embedding=J.embedding;await K.update(E).set(A).where(D(W(E.id,B),W(E.agentId,this.runtime.agentId),W(E.roomId,Q))),O.info(`Updated session summary: ${B} for room ${Q}`)}async getSessionSummaries(B,Q=5){return(await this.getDb().select().from(E).where(D(W(E.agentId,this.runtime.agentId),W(E.roomId,B))).orderBy(S(E.updatedAt)).limit(Q)).map((A)=>({id:A.id,agentId:A.agentId,roomId:A.roomId,entityId:A.entityId,summary:A.summary,messageCount:A.messageCount,lastMessageOffset:A.lastMessageOffset,startTime:A.startTime,endTime:A.endTime,topics:A.topics||[],metadata:A.metadata,embedding:A.embedding,createdAt:A.createdAt,updatedAt:A.updatedAt}))}async searchLongTermMemories(B,Q,J=5,K=0.7){if(!this.memoryConfig.longTermVectorSearchEnabled)return O.warn("Vector search is not enabled, falling back to recent memories"),this.getLongTermMemories(B,void 0,J);let A=this.getDb();try{let Y=Q.map((_)=>Number.isFinite(_)?Number(_.toFixed(6)):0),Z=ZB`1 - (${xB(X.embedding,Y)})`,U=[W(X.agentId,this.runtime.agentId),W(X.entityId,B),ZB`${X.embedding} IS NOT NULL`];if(K>0)U.push(hB(Z,K));return(await A.select({memory:X,similarity:Z}).from(X).where(D(...U)).orderBy(S(Z)).limit(J)).map((_)=>({id:_.memory.id,agentId:_.memory.agentId,entityId:_.memory.entityId,category:_.memory.category,content:_.memory.content,metadata:_.memory.metadata,embedding:_.memory.embedding,confidence:_.memory.confidence,source:_.memory.source,createdAt:_.memory.createdAt,updatedAt:_.memory.updatedAt,lastAccessedAt:_.memory.lastAccessedAt,accessCount:_.memory.accessCount,similarity:_.similarity}))}catch(Y){return O.warn({error:Y},"Vector search failed, falling back to recent memories"),this.getLongTermMemories(B,void 0,J)}}async getFormattedLongTermMemories(B){let Q=await this.getLongTermMemories(B,void 0,20);if(Q.length===0)return"";let J=new Map;for(let A of Q){if(!J.has(A.category))J.set(A.category,[]);J.get(A.category)?.push(A)}let K=[];for(let[A,Y]of J.entries()){let Z=A.split("_").map((V)=>V.charAt(0).toUpperCase()+V.slice(1)).join(" "),U=Y.map((V)=>`- ${V.content}`).join(`
2
2
  `);K.push(`**${Z}**:
3
- ${$}`)}return K.join(`
3
+ ${U}`)}return K.join(`
4
4
 
5
- `)}}import{logger as L,ModelType as SB,composePromptFromState as _B}from"@elizaos/core";async function IB(A,Q){return(await A.getMemories({tableName:"messages",roomId:Q,count:100,unique:!1})).filter((B)=>!(B.content?.type==="action_result"&&B.metadata?.type==="action_result")&&(B.metadata?.type==="agent_response_message"||B.metadata?.type==="user_message")).length}var MB=`# Task: Summarize Conversation
5
+ `)}}import{logger as L,ModelType as SB,composePromptFromState as _B}from"@elizaos/core";async function IB(B,Q){return(await B.getMemories({tableName:"messages",roomId:Q,count:100,unique:!1})).filter((A)=>!(A.content?.type==="action_result"&&A.metadata?.type==="action_result")&&(A.metadata?.type==="agent_response_message"||A.metadata?.type==="user_message")).length}var MB=`# Task: Summarize Conversation
6
6
 
7
7
  You are analyzing a conversation to create a concise summary that captures the key points, topics, and important details.
8
8
 
@@ -62,9 +62,9 @@ Respond in this XML format:
62
62
  <point>First key point</point>
63
63
  <point>Second key point</point>
64
64
  </keyPoints>
65
- </summary>`;function wB(A){let Q=A.match(/<text>([\s\S]*?)<\/text>/),J=A.match(/<topics>([\s\S]*?)<\/topics>/),K=A.matchAll(/<point>([\s\S]*?)<\/point>/g),B=Q?Q[1].trim():"Summary not available",Y=J?J[1].split(",").map(($)=>$.trim()).filter(Boolean):[],Z=Array.from(K).map(($)=>$[1].trim());return{summary:B,topics:Y,keyPoints:Z}}var $B={name:"MEMORY_SUMMARIZATION",description:"Automatically summarizes conversations to optimize context usage",similes:["CONVERSATION_SUMMARY","CONTEXT_COMPRESSION","MEMORY_OPTIMIZATION"],alwaysRun:!0,validate:async(A,Q)=>{if(!Q.content?.text)return L.debug("Skipping summarization: no message text"),!1;let J=A.getService("memory");if(!J)return L.debug("Skipping summarization: memory service not available"),!1;let K=J.getConfig(),B=await IB(A,Q.roomId),Y=await J.getCurrentSessionSummary(Q.roomId);if(!Y){let Z=B>=K.shortTermSummarizationThreshold;return L.debug({roomId:Q.roomId,currentDialogueCount:B,threshold:K.shortTermSummarizationThreshold,shouldSummarize:Z,reason:"initial_summary_check"},"Summarization validation check"),Z}else{let Z=B-Y.lastMessageOffset,$=Z>=K.shortTermSummarizationInterval;return L.debug({roomId:Q.roomId,currentDialogueCount:B,lastOffset:Y.lastMessageOffset,newDialogueCount:Z,interval:K.shortTermSummarizationInterval,shouldUpdate:$,reason:"summary_update_check"},"Summarization validation check"),$}},handler:async(A,Q)=>{let J=A.getService("memory");if(!J){L.error("MemoryService not found");return}let K=J.getConfig(),{roomId:B}=Q;try{L.info(`Starting summarization for room ${B}`);let Y=await J.getCurrentSessionSummary(B),Z=Y?.lastMessageOffset||0,G=(await A.getMemories({tableName:"messages",roomId:B,count:1000,unique:!1})).filter((X)=>!(X.content?.type==="action_result"&&X.metadata?.type==="action_result")&&(X.metadata?.type==="agent_response_message"||X.metadata?.type==="user_message")),_=G.length,H=_-Z;if(H===0){L.debug("No new dialogue messages to summarize");return}let F=K.summaryMaxNewMessages||50,T=Math.min(H,F);if(H>F)L.warn(`Capping new dialogue messages at ${F} (${H} available). Oldest messages will be skipped.`);let q=G.sort((X,z)=>(X.createdAt||0)-(z.createdAt||0)),U=q.slice(Z,Z+T);if(U.length===0){L.debug("No new dialogue messages retrieved after filtering");return}let V=U.map((X)=>{return`${X.entityId===A.agentId?A.character.name:"User"}: ${X.content.text||"[non-text message]"}`}).join(`
66
- `),R=await A.composeState(Q),v,D;if(Y)D=pB,v=_B({state:{...R,existingSummary:Y.summary,existingTopics:Y.topics?.join(", ")||"None",newMessages:V},template:D});else{let X=q.map((z)=>{return`${z.entityId===A.agentId?A.character.name:"User"}: ${z.content.text||"[non-text message]"}`}).join(`
67
- `);D=MB,v=_B({state:{...R,recentMessages:X},template:D})}let d=await A.useModel(SB.TEXT_LARGE,{prompt:v,maxTokens:K.summaryMaxTokens||2500}),k=wB(d);L.info(`${Y?"Updated":"Generated"} summary: ${k.summary.substring(0,100)}...`);let x=Z+U.length,C=U[0],f=U[U.length-1],h=Y?Y.startTime:C?.createdAt&&C.createdAt>0?new Date(C.createdAt):new Date,p=f?.createdAt&&f.createdAt>0?new Date(f.createdAt):new Date;if(Y)await J.updateSessionSummary(Y.id,B,{summary:k.summary,messageCount:Y.messageCount+U.length,lastMessageOffset:x,endTime:p,topics:k.topics,metadata:{keyPoints:k.keyPoints}}),L.info(`Updated summary for room ${B}: ${U.length} new dialogue messages processed (offset: ${Z} → ${x})`);else await J.storeSessionSummary({agentId:A.agentId,roomId:B,entityId:Q.entityId!==A.agentId?Q.entityId:void 0,summary:k.summary,messageCount:_,lastMessageOffset:_,startTime:h,endTime:p,topics:k.topics,metadata:{keyPoints:k.keyPoints}}),L.info(`Created new summary for room ${B}: ${_} dialogue messages summarized (offset: 0 → ${_})`)}catch(Y){L.error({error:Y},"Error during summarization:")}},examples:[]};import{logger as P,ModelType as yB,composePromptFromState as cB}from"@elizaos/core";var m;((K)=>{K.EPISODIC="episodic";K.SEMANTIC="semantic";K.PROCEDURAL="procedural"})(m||={});var lB=`# Task: Extract Long-Term Memory (Strict Criteria)
65
+ </summary>`;function wB(B){let Q=B.match(/<text>([\s\S]*?)<\/text>/),J=B.match(/<topics>([\s\S]*?)<\/topics>/),K=B.matchAll(/<point>([\s\S]*?)<\/point>/g),A=Q?Q[1].trim():"Summary not available",Y=J?J[1].split(",").map((U)=>U.trim()).filter(Boolean):[],Z=Array.from(K).map((U)=>U[1].trim());return{summary:A,topics:Y,keyPoints:Z}}var $B={name:"MEMORY_SUMMARIZATION",description:"Automatically summarizes conversations to optimize context usage",similes:["CONVERSATION_SUMMARY","CONTEXT_COMPRESSION","MEMORY_OPTIMIZATION"],alwaysRun:!0,validate:async(B,Q)=>{if(!Q.content?.text)return!1;let J=B.getService("memory");if(!J)return!1;let K=J.getConfig(),A=await IB(B,Q.roomId),Y=await J.getCurrentSessionSummary(Q.roomId);if(!Y)return A>=K.shortTermSummarizationThreshold;else return A-Y.lastMessageOffset>=K.shortTermSummarizationInterval},handler:async(B,Q)=>{let J=B.getService("memory");if(!J){L.error("MemoryService not found");return}let K=J.getConfig(),{roomId:A}=Q;try{L.info(`Starting summarization for room ${A}`);let Y=await J.getCurrentSessionSummary(A),Z=Y?.lastMessageOffset||0,V=(await B.getMemories({tableName:"messages",roomId:A,count:1000,unique:!1})).filter((G)=>!(G.content?.type==="action_result"&&G.metadata?.type==="action_result")&&(G.metadata?.type==="agent_response_message"||G.metadata?.type==="user_message")),_=V.length,j=_-Z;if(j===0){L.debug("No new dialogue messages to summarize");return}let F=K.summaryMaxNewMessages||50,T=Math.min(j,F);if(j>F)L.warn(`Capping new dialogue messages at ${F} (${j} available). Oldest messages will be skipped.`);let q=V.sort((G,z)=>(G.createdAt||0)-(z.createdAt||0)),H=q.slice(Z,Z+T);if(H.length===0){L.debug("No new dialogue messages retrieved after filtering");return}let $=H.map((G)=>{return`${G.entityId===B.agentId?B.character.name:"User"}: ${G.content.text||"[non-text message]"}`}).join(`
66
+ `),k=await B.composeState(Q),v,b;if(Y)b=pB,v=_B({state:{...k,existingSummary:Y.summary,existingTopics:Y.topics?.join(", ")||"None",newMessages:$},template:b});else{let G=q.map((z)=>{return`${z.entityId===B.agentId?B.character.name:"User"}: ${z.content.text||"[non-text message]"}`}).join(`
67
+ `);b=MB,v=_B({state:{...k,recentMessages:G},template:b})}let d=await B.useModel(SB.TEXT_LARGE,{prompt:v,maxTokens:K.summaryMaxTokens||2500}),P=wB(d);L.info(`${Y?"Updated":"Generated"} summary: ${P.summary.substring(0,100)}...`);let x=Z+H.length,C=H[0],f=H[H.length-1],h=Y?Y.startTime:C?.createdAt&&C.createdAt>0?new Date(C.createdAt):new Date,p=f?.createdAt&&f.createdAt>0?new Date(f.createdAt):new Date;if(Y)await J.updateSessionSummary(Y.id,A,{summary:P.summary,messageCount:Y.messageCount+H.length,lastMessageOffset:x,endTime:p,topics:P.topics,metadata:{keyPoints:P.keyPoints}}),L.info(`Updated summary for room ${A}: ${H.length} new dialogue messages processed (offset: ${Z} → ${x})`);else await J.storeSessionSummary({agentId:B.agentId,roomId:A,entityId:Q.entityId!==B.agentId?Q.entityId:void 0,summary:P.summary,messageCount:_,lastMessageOffset:_,startTime:h,endTime:p,topics:P.topics,metadata:{keyPoints:P.keyPoints}}),L.info(`Created new summary for room ${A}: ${_} dialogue messages summarized (offset: 0 → ${_})`)}catch(Y){L.error({error:Y},"Error during summarization:")}},examples:[]};import{logger as R,ModelType as yB,composePromptFromState as cB}from"@elizaos/core";var o;((K)=>{K.EPISODIC="episodic";K.SEMANTIC="semantic";K.PROCEDURAL="procedural"})(o||={});var lB=`# Task: Extract Long-Term Memory (Strict Criteria)
68
68
 
69
69
  You are analyzing a conversation to extract ONLY the most critical, persistent information about the user using cognitive science memory categories.
70
70
 
@@ -196,14 +196,14 @@ Skills, workflows, methodologies, and how-to knowledge.
196
196
  <content>User led database migration from MongoDB to PostgreSQL for payment system in Q2 2024</content>
197
197
  <confidence>0.92</confidence>
198
198
  </memory>
199
- </memories>`;function dB(A){let Q=A.matchAll(/<memory>[\s\S]*?<category>(.*?)<\/category>[\s\S]*?<content>(.*?)<\/content>[\s\S]*?<confidence>(.*?)<\/confidence>[\s\S]*?<\/memory>/g),J=[];for(let K of Q){let B=K[1].trim(),Y=K[2].trim(),Z=parseFloat(K[3].trim());if(!Object.values(m).includes(B)){P.warn(`Invalid memory category: ${B}`);continue}if(Y&&!isNaN(Z))J.push({category:B,content:Y,confidence:Z})}return J}var VB={name:"LONG_TERM_MEMORY_EXTRACTION",description:"Extracts long-term facts about users from conversations",similes:["MEMORY_EXTRACTION","FACT_LEARNING","USER_PROFILING"],alwaysRun:!0,validate:async(A,Q)=>{if(P.debug(`Validating long-term memory extraction for message: ${Q.content?.text}`),Q.entityId===A.agentId)return P.debug("Skipping long-term memory extraction for agent's own message"),!1;if(!Q.content?.text)return P.debug("Skipping long-term memory extraction for message without text"),!1;let J=A.getService("memory");if(!J)return P.debug("MemoryService not found"),!1;if(!J.getConfig().longTermExtractionEnabled)return P.debug("Long-term memory extraction is disabled"),!1;let B=await A.countMemories(Q.roomId,!1,"messages"),Y=await J.shouldRunExtraction(Q.entityId,Q.roomId,B);return P.debug(`Should run extraction: ${Y}`),Y},handler:async(A,Q)=>{let J=A.getService("memory");if(!J){P.error("MemoryService not found");return}let K=J.getConfig(),{entityId:B,roomId:Y}=Q;try{P.info(`Extracting long-term memories for entity ${B}`);let $=(await A.getMemories({tableName:"messages",roomId:Y,count:20,unique:!1})).sort((V,R)=>(V.createdAt||0)-(R.createdAt||0)).map((V)=>{return`${V.entityId===A.agentId?A.character.name:"User"}: ${V.content.text||"[non-text message]"}`}).join(`
200
- `),G=await J.getLongTermMemories(B,void 0,30),_=G.length>0?G.map((V)=>`[${V.category}] ${V.content} (confidence: ${V.confidence})`).join(`
201
- `):"None yet",H=await A.composeState(Q),F=cB({state:{...H,recentMessages:$,existingMemories:_},template:lB}),T=await A.useModel(yB.TEXT_LARGE,{prompt:F}),q=dB(T);P.info(`Extracted ${q.length} long-term memories`);for(let V of q)if(V.confidence>=Math.max(K.longTermConfidenceThreshold,0.85))await J.storeLongTermMemory({agentId:A.agentId,entityId:B,category:V.category,content:V.content,confidence:V.confidence,source:"conversation",metadata:{roomId:Y,extractedAt:new Date().toISOString()}}),P.info(`Stored long-term memory: [${V.category}] ${V.content.substring(0,50)}...`);else P.debug(`Skipped low-confidence memory: ${V.content} (confidence: ${V.confidence}, threshold: ${Math.max(K.longTermConfidenceThreshold,0.85)})`);let U=await A.countMemories(Y,!1,"messages");await J.setLastExtractionCheckpoint(B,Y,U),P.debug(`Updated extraction checkpoint to ${U} for entity ${B} in room ${Y}`)}catch(Z){P.error({error:Z},"Error during long-term memory extraction:")}},examples:[]};import{logger as gB,addHeader as uB}from"@elizaos/core";var o={name:"LONG_TERM_MEMORY",description:"Persistent facts and preferences about the user",position:50,get:async(A,Q,J)=>{try{let K=A.getService("memory");if(!K)return{data:{memories:[]},values:{longTermMemories:""},text:""};let{entityId:B}=Q;if(B===A.agentId)return{data:{memories:[]},values:{longTermMemories:""},text:""};let Y=await K.getLongTermMemories(B,void 0,25);if(Y.length===0)return{data:{memories:[]},values:{longTermMemories:""},text:""};let Z=await K.getFormattedLongTermMemories(B),$=uB("# What I Know About You",Z),G=new Map;for(let H of Y){let F=G.get(H.category)||0;G.set(H.category,F+1)}let _=Array.from(G.entries()).map(([H,F])=>`${H}: ${F}`).join(", ");return{data:{memories:Y,categoryCounts:Object.fromEntries(G)},values:{longTermMemories:$,memoryCategories:_},text:$}}catch(K){return gB.error({error:K},"Error in longTermMemoryProvider:"),{data:{memories:[]},values:{longTermMemories:""},text:""}}}};import{addHeader as GB,logger as iB}from"@elizaos/core";var t={name:"SUMMARIZED_CONTEXT",description:"Provides summarized context from previous conversations",position:96,get:async(A,Q,J)=>{try{let K=A.getService("memory"),{roomId:B}=Q;if(!K)return{data:{summary:null},values:{sessionSummaries:"",sessionSummariesWithTopics:""},text:""};let Y=await K.getCurrentSessionSummary(B);if(!Y)return{data:{summary:null},values:{sessionSummaries:"",sessionSummariesWithTopics:""},text:""};let Z=`${Y.messageCount} messages`,$=new Date(Y.startTime).toLocaleDateString(),G=`**Previous Conversation** (${Z}, ${$})
202
- `;G+=Y.summary;let _=G;if(Y.topics&&Y.topics.length>0)_+=`
203
- *Topics: ${Y.topics.join(", ")}*`;let H=GB("# Conversation Summary",G),F=GB("# Conversation Summary",_);return{data:{summary:Y},values:{sessionSummaries:H,sessionSummariesWithTopics:F},text:F}}catch(K){return iB.error({error:K},"Error in contextSummaryProvider:"),{data:{summary:null},values:{sessionSummaries:"",sessionSummariesWithTopics:""},text:""}}}};import{addHeader as M,ChannelType as XB,formatMessages as nB,formatPosts as aB,getEntityDetails as sB,logger as mB}from"@elizaos/core";var r={name:"RECENT_MESSAGES",description:"Provides recent conversation messages with detailed context",position:94,get:async(A,Q,J)=>{try{let K=A.getService("memory"),{roomId:B}=Q,Y=K?.getConfig()||{shortTermSummarizationThreshold:16,shortTermRetainRecent:6},Z=A.getConversationLength(),$=Y.shortTermRetainRecent,G=0,_=!1;if(K){let X=await K.getCurrentSessionSummary(B);if(X)_=!0,G=X.lastMessageOffset||0}if(!_){if((await A.getMemories({tableName:"messages",roomId:B,count:Z,unique:!1})).filter((N)=>!(N.content?.type==="action_result"&&N.metadata?.type==="action_result")&&(N.metadata?.type==="agent_response_message"||N.metadata?.type==="user_message")).length<Y.shortTermSummarizationThreshold)$=Z}let[H,F,T]=await Promise.all([sB({runtime:A,roomId:B}),A.getRoom(B),A.getMemories({tableName:"messages",roomId:B,count:$,unique:!1,start:G})]),q=F?.type?F.type===XB.FEED||F.type===XB.THREAD:!1,U=T.filter((X)=>!(X.content?.type==="action_result"&&X.metadata?.type==="action_result")&&(X.metadata?.type==="agent_response_message"||X.metadata?.type==="user_message")),V="";if(U.length>0){if(q)V=aB({messages:U,entities:H,conversationHeader:!1});else V=nB({messages:U,entities:H});if(V)V=M("# Recent Messages",V)}let R=(X,z)=>{return X.sort((N,e)=>(N.createdAt||0)-(e.createdAt||0)).map((N)=>{let jB=H.find((FB)=>FB.id===N.entityId)?.names[0]||(N.entityId===A.agentId?A.character.name:"Unknown"),HB=N.createdAt?new Date(N.createdAt).toLocaleString():"Unknown time",UB=N.content.text||"",WB=z&&N.content.internalMonologue?`
204
- [Internal thought: ${N.content.internalMonologue}]`:"";return`[${HB}] ${jB}: ${UB}${WB}`}).join(`
205
- `)},v=M("# Conversation Messages",R(U,!1)),D=M("# Conversation Messages",R(U,!0)),d=Q.metadata,k=H.find((X)=>X.id===Q.entityId)?.names[0]||d?.entityName||"Unknown User",x=Q.content.text,C=!!x?.trim(),f=C?M("# Received Message",`${k}: ${x}`):"",h=C?M("# Focus your response",`You are replying to the above message from **${k}**. Keep your answer relevant to that message.`):"",p=[V,f,h].filter(Boolean).join(`
199
+ </memories>`;function dB(B){let Q=B.matchAll(/<memory>[\s\S]*?<category>(.*?)<\/category>[\s\S]*?<content>(.*?)<\/content>[\s\S]*?<confidence>(.*?)<\/confidence>[\s\S]*?<\/memory>/g),J=[];for(let K of Q){let A=K[1].trim(),Y=K[2].trim(),Z=parseFloat(K[3].trim());if(!Object.values(o).includes(A)){R.warn(`Invalid memory category: ${A}`);continue}if(Y&&!isNaN(Z))J.push({category:A,content:Y,confidence:Z})}return J}var UB={name:"LONG_TERM_MEMORY_EXTRACTION",description:"Extracts long-term facts about users from conversations",similes:["MEMORY_EXTRACTION","FACT_LEARNING","USER_PROFILING"],alwaysRun:!0,validate:async(B,Q)=>{if(Q.entityId===B.agentId)return!1;if(!Q.content?.text)return!1;let J=B.getService("memory");if(!J)return!1;if(!J.getConfig().longTermExtractionEnabled)return R.debug("Long-term memory extraction is disabled"),!1;let A=await B.countMemories(Q.roomId,!1,"messages");return await J.shouldRunExtraction(Q.entityId,Q.roomId,A)},handler:async(B,Q)=>{let J=B.getService("memory");if(!J){R.error("MemoryService not found");return}let K=J.getConfig(),{entityId:A,roomId:Y}=Q;try{R.info(`Extracting long-term memories for entity ${A}`);let U=(await B.getMemories({tableName:"messages",roomId:Y,count:20,unique:!1})).sort(($,k)=>($.createdAt||0)-(k.createdAt||0)).map(($)=>{return`${$.entityId===B.agentId?B.character.name:"User"}: ${$.content.text||"[non-text message]"}`}).join(`
200
+ `),V=await J.getLongTermMemories(A,void 0,30),_=V.length>0?V.map(($)=>`[${$.category}] ${$.content} (confidence: ${$.confidence})`).join(`
201
+ `):"None yet",j=await B.composeState(Q),F=cB({state:{...j,recentMessages:U,existingMemories:_},template:lB}),T=await B.useModel(yB.TEXT_LARGE,{prompt:F}),q=dB(T);R.info(`Extracted ${q.length} long-term memories`);for(let $ of q)if($.confidence>=Math.max(K.longTermConfidenceThreshold,0.85))await J.storeLongTermMemory({agentId:B.agentId,entityId:A,category:$.category,content:$.content,confidence:$.confidence,source:"conversation",metadata:{roomId:Y,extractedAt:new Date().toISOString()}}),R.info(`Stored long-term memory: [${$.category}] ${$.content.substring(0,50)}...`);else R.debug(`Skipped low-confidence memory: ${$.content} (confidence: ${$.confidence}, threshold: ${Math.max(K.longTermConfidenceThreshold,0.85)})`);let H=await B.countMemories(Y,!1,"messages");await J.setLastExtractionCheckpoint(A,Y,H),R.debug(`Updated extraction checkpoint to ${H} for entity ${A} in room ${Y}`)}catch(Z){R.error({error:Z},"Error during long-term memory extraction:")}},examples:[]};import{logger as gB,addHeader as uB}from"@elizaos/core";var m={name:"LONG_TERM_MEMORY",description:"Persistent facts and preferences about the user",position:50,get:async(B,Q,J)=>{try{let K=B.getService("memory");if(!K)return{data:{memories:[]},values:{longTermMemories:""},text:""};let{entityId:A}=Q;if(A===B.agentId)return{data:{memories:[]},values:{longTermMemories:""},text:""};let Y=await K.getLongTermMemories(A,void 0,25);if(Y.length===0)return{data:{memories:[]},values:{longTermMemories:""},text:""};let Z=await K.getFormattedLongTermMemories(A),U=uB("# What I Know About You",Z),V=new Map;for(let j of Y){let F=V.get(j.category)||0;V.set(j.category,F+1)}let _=Array.from(V.entries()).map(([j,F])=>`${j}: ${F}`).join(", ");return{data:{memories:Y,categoryCounts:Object.fromEntries(V)},values:{longTermMemories:U,memoryCategories:_},text:U}}catch(K){return gB.error({error:K},"Error in longTermMemoryProvider:"),{data:{memories:[]},values:{longTermMemories:""},text:""}}}};import{addHeader as VB,logger as nB}from"@elizaos/core";var t={name:"SUMMARIZED_CONTEXT",description:"Provides summarized context from previous conversations",position:96,get:async(B,Q,J)=>{try{let K=B.getService("memory"),{roomId:A}=Q;if(!K)return{data:{summary:null},values:{sessionSummaries:"",sessionSummariesWithTopics:""},text:""};let Y=await K.getCurrentSessionSummary(A);if(!Y)return{data:{summary:null},values:{sessionSummaries:"",sessionSummariesWithTopics:""},text:""};let Z=`${Y.messageCount} messages`,U=new Date(Y.startTime).toLocaleDateString(),V=`**Previous Conversation** (${Z}, ${U})
202
+ `;V+=Y.summary;let _=V;if(Y.topics&&Y.topics.length>0)_+=`
203
+ *Topics: ${Y.topics.join(", ")}*`;let j=VB("# Conversation Summary",V),F=VB("# Conversation Summary",_);return{data:{summary:Y},values:{sessionSummaries:j,sessionSummariesWithTopics:F},text:F}}catch(K){return nB.error({error:K},"Error in contextSummaryProvider:"),{data:{summary:null},values:{sessionSummaries:"",sessionSummariesWithTopics:""},text:""}}}};import{addHeader as M,ChannelType as GB,formatMessages as iB,formatPosts as aB,getEntityDetails as sB,logger as oB}from"@elizaos/core";var r={name:"RECENT_MESSAGES",description:"Provides recent conversation messages with detailed context",position:94,get:async(B,Q,J)=>{try{let K=B.getService("memory"),{roomId:A}=Q,Y=K?.getConfig()||{shortTermSummarizationThreshold:16,shortTermRetainRecent:6},Z=B.getConversationLength(),U=Y.shortTermRetainRecent,V=0,_=!1;if(K){let G=await K.getCurrentSessionSummary(A);if(G)_=!0,V=G.lastMessageOffset||0}if(!_){if((await B.getMemories({tableName:"messages",roomId:A,count:Z,unique:!1})).filter((N)=>!(N.content?.type==="action_result"&&N.metadata?.type==="action_result")&&(N.metadata?.type==="agent_response_message"||N.metadata?.type==="user_message")).length<Y.shortTermSummarizationThreshold)U=Z}let[j,F,T]=await Promise.all([sB({runtime:B,roomId:A}),B.getRoom(A),B.getMemories({tableName:"messages",roomId:A,count:U,unique:!1,start:V})]),q=F?.type?F.type===GB.FEED||F.type===GB.THREAD:!1,H=T.filter((G)=>!(G.content?.type==="action_result"&&G.metadata?.type==="action_result")&&(G.metadata?.type==="agent_response_message"||G.metadata?.type==="user_message")),$="";if(H.length>0){if(q)$=aB({messages:H,entities:j,conversationHeader:!1});else $=iB({messages:H,entities:j});if($)$=M("# Recent Messages",$)}let k=(G,z)=>{return G.sort((N,e)=>(N.createdAt||0)-(e.createdAt||0)).map((N)=>{let XB=j.find((FB)=>FB.id===N.entityId)?.names[0]||(N.entityId===B.agentId?B.character.name:"Unknown"),jB=N.createdAt?new Date(N.createdAt).toLocaleString():"Unknown time",HB=N.content.text||"",WB=z&&N.content.thought?`
204
+ [Internal thought: ${N.content.thought}]`:"";return`[${jB}] ${XB}: ${HB}${WB}`}).join(`
205
+ `)},v=M("# Conversation Messages",k(H,!1)),b=M("# Conversation Messages",k(H,!0)),d=Q.metadata,P=j.find((G)=>G.id===Q.entityId)?.names[0]||d?.entityName||"Unknown User",x=Q.content.text,C=!!x?.trim(),f=C?M("# Received Message",`${P}: ${x}`):"",h=C?M("# Focus your response",`You are replying to the above message from **${P}**. Keep your answer relevant to that message.`):"",p=[$,f,h].filter(Boolean).join(`
206
206
 
207
- `);return{data:{messages:U},values:{recentMessages:V,conversationLog:v,conversationLogWithAgentThoughts:D,...f&&{receivedMessageHeader:f},...h&&{focusHeader:h}},text:p}}catch(K){return mB.error({error:K},"Error in recentMessagesProvider:"),{data:{messages:[]},values:{recentMessages:"",conversationLog:"",conversationLogWithAgentThoughts:"",receivedMessageHeader:"",focusHeader:""},text:""}}}};var oB={name:"memory",description:"Advanced memory management with conversation summarization and long-term persistent memory",services:[I],evaluators:[$B,VB],providers:[o,t,r],schema:s},tB=oB;export{E as sessionSummaries,r as recentMessagesProvider,oB as memoryPlugin,YB as memoryAccessLogs,o as longTermMemoryProvider,j as longTermMemories,tB as default,t as contextSummaryProvider,I as MemoryService,m as LongTermMemoryCategory};
207
+ `);return{data:{messages:H},values:{recentMessages:$,conversationLog:v,conversationLogWithAgentThoughts:b,...f&&{receivedMessageHeader:f},...h&&{focusHeader:h}},text:p}}catch(K){return oB.error({error:K},"Error in recentMessagesProvider:"),{data:{messages:[]},values:{recentMessages:"",conversationLog:"",conversationLogWithAgentThoughts:"",receivedMessageHeader:"",focusHeader:""},text:""}}}};var mB={name:"memory",description:"Advanced memory management with conversation summarization and long-term persistent memory",services:[I],evaluators:[$B,UB],providers:[m,t,r],schema:s},tB=mB;export{E as sessionSummaries,r as recentMessagesProvider,mB as memoryPlugin,YB as memoryAccessLogs,m as longTermMemoryProvider,X as longTermMemories,tB as default,t as contextSummaryProvider,I as MemoryService,o as LongTermMemoryCategory};
208
208
 
209
- //# debugId=0DCBA5EC5774080B64756E2164756E21
209
+ //# debugId=BD2BA8E6D3119D2064756E2164756E21