@elizaos/plugin-memory 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -174,7 +174,7 @@ class MemoryService extends Service {
174
174
  if (extractionInterval) {
175
175
  this.memoryConfig.longTermExtractionInterval = parseInt(extractionInterval, 10);
176
176
  }
177
- logger.info({
177
+ logger.debug({
178
178
  summarizationThreshold: this.memoryConfig.shortTermSummarizationThreshold,
179
179
  summarizationInterval: this.memoryConfig.shortTermSummarizationInterval,
180
180
  maxNewMessages: this.memoryConfig.summaryMaxNewMessages,
@@ -535,6 +535,16 @@ import {
535
535
  ModelType,
536
536
  composePromptFromState
537
537
  } from "@elizaos/core";
538
+ async function getDialogueMessageCount(runtime, roomId) {
539
+ const messages = await runtime.getMemories({
540
+ tableName: "messages",
541
+ roomId,
542
+ count: 100,
543
+ unique: false
544
+ });
545
+ const dialogueMessages = messages.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result") && (msg.metadata?.type === "agent_response_message" || msg.metadata?.type === "user_message"));
546
+ return dialogueMessages.length;
547
+ }
538
548
  var initialSummarizationTemplate = `# Task: Summarize Conversation
539
549
 
540
550
  You are analyzing a conversation to create a concise summary that captures the key points, topics, and important details.
@@ -622,26 +632,26 @@ var summarizationEvaluator = {
622
632
  return false;
623
633
  }
624
634
  const config = memoryService.getConfig();
625
- const currentMessageCount = await runtime.countMemories(message.roomId, false, "messages");
635
+ const currentDialogueCount = await getDialogueMessageCount(runtime, message.roomId);
626
636
  const existingSummary = await memoryService.getCurrentSessionSummary(message.roomId);
627
637
  if (!existingSummary) {
628
- const shouldSummarize = currentMessageCount >= config.shortTermSummarizationThreshold;
638
+ const shouldSummarize = currentDialogueCount >= config.shortTermSummarizationThreshold;
629
639
  logger2.debug({
630
640
  roomId: message.roomId,
631
- currentMessageCount,
641
+ currentDialogueCount,
632
642
  threshold: config.shortTermSummarizationThreshold,
633
643
  shouldSummarize,
634
644
  reason: "initial_summary_check"
635
645
  }, "Summarization validation check");
636
646
  return shouldSummarize;
637
647
  } else {
638
- const newMessageCount = currentMessageCount - existingSummary.lastMessageOffset;
639
- const shouldUpdate = newMessageCount >= config.shortTermSummarizationInterval;
648
+ const newDialogueCount = currentDialogueCount - existingSummary.lastMessageOffset;
649
+ const shouldUpdate = newDialogueCount >= config.shortTermSummarizationInterval;
640
650
  logger2.debug({
641
651
  roomId: message.roomId,
642
- currentMessageCount,
652
+ currentDialogueCount,
643
653
  lastOffset: existingSummary.lastMessageOffset,
644
- newMessageCount,
654
+ newDialogueCount,
645
655
  interval: config.shortTermSummarizationInterval,
646
656
  shouldUpdate,
647
657
  reason: "summary_update_check"
@@ -661,30 +671,31 @@ var summarizationEvaluator = {
661
671
  logger2.info(`Starting summarization for room ${roomId}`);
662
672
  const existingSummary = await memoryService.getCurrentSessionSummary(roomId);
663
673
  const lastOffset = existingSummary?.lastMessageOffset || 0;
664
- const totalMessageCount = await runtime.countMemories(roomId, false, "messages");
665
- const newMessageCount = totalMessageCount - lastOffset;
666
- const maxNewMessages = config.summaryMaxNewMessages || 50;
667
- const messagesToFetch = Math.min(newMessageCount, maxNewMessages);
668
- if (messagesToFetch === 0) {
669
- logger2.debug("No new messages to summarize");
670
- return;
671
- }
672
- if (newMessageCount > maxNewMessages) {
673
- logger2.warn(`Capping new messages at ${maxNewMessages} (${newMessageCount} available). Oldest messages will be skipped.`);
674
- }
675
- const newMessages = await runtime.getMemories({
674
+ const allMessages = await runtime.getMemories({
676
675
  tableName: "messages",
677
676
  roomId,
678
- count: messagesToFetch,
679
- unique: false,
680
- start: lastOffset
677
+ count: 1000,
678
+ unique: false
681
679
  });
682
- if (newMessages.length === 0) {
683
- logger2.debug("No new messages retrieved");
680
+ const allDialogueMessages = allMessages.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result") && (msg.metadata?.type === "agent_response_message" || msg.metadata?.type === "user_message"));
681
+ const totalDialogueCount = allDialogueMessages.length;
682
+ const newDialogueCount = totalDialogueCount - lastOffset;
683
+ if (newDialogueCount === 0) {
684
+ logger2.debug("No new dialogue messages to summarize");
685
+ return;
686
+ }
687
+ const maxNewMessages = config.summaryMaxNewMessages || 50;
688
+ const messagesToProcess = Math.min(newDialogueCount, maxNewMessages);
689
+ if (newDialogueCount > maxNewMessages) {
690
+ logger2.warn(`Capping new dialogue messages at ${maxNewMessages} (${newDialogueCount} available). Oldest messages will be skipped.`);
691
+ }
692
+ const sortedDialogueMessages = allDialogueMessages.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0));
693
+ const newDialogueMessages = sortedDialogueMessages.slice(lastOffset, lastOffset + messagesToProcess);
694
+ if (newDialogueMessages.length === 0) {
695
+ logger2.debug("No new dialogue messages retrieved after filtering");
684
696
  return;
685
697
  }
686
- const sortedMessages = newMessages.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0));
687
- const formattedMessages = sortedMessages.map((msg) => {
698
+ const formattedMessages = newDialogueMessages.map((msg) => {
688
699
  const sender = msg.entityId === runtime.agentId ? runtime.character.name : "User";
689
700
  return `${sender}: ${msg.content.text || "[non-text message]"}`;
690
701
  }).join(`
@@ -704,11 +715,16 @@ var summarizationEvaluator = {
704
715
  template
705
716
  });
706
717
  } else {
718
+ const initialMessages = sortedDialogueMessages.map((msg) => {
719
+ const sender = msg.entityId === runtime.agentId ? runtime.character.name : "User";
720
+ return `${sender}: ${msg.content.text || "[non-text message]"}`;
721
+ }).join(`
722
+ `);
707
723
  template = initialSummarizationTemplate;
708
724
  prompt = composePromptFromState({
709
725
  state: {
710
726
  ...state,
711
- recentMessages: formattedMessages
727
+ recentMessages: initialMessages
712
728
  },
713
729
  template
714
730
  });
@@ -719,15 +735,15 @@ var summarizationEvaluator = {
719
735
  });
720
736
  const summaryResult = parseSummaryXML(response);
721
737
  logger2.info(`${existingSummary ? "Updated" : "Generated"} summary: ${summaryResult.summary.substring(0, 100)}...`);
722
- const newOffset = totalMessageCount;
723
- const firstMessage = sortedMessages[0];
724
- const lastMessage = sortedMessages[sortedMessages.length - 1];
738
+ const newOffset = lastOffset + newDialogueMessages.length;
739
+ const firstMessage = newDialogueMessages[0];
740
+ const lastMessage = newDialogueMessages[newDialogueMessages.length - 1];
725
741
  const startTime = existingSummary ? existingSummary.startTime : firstMessage?.createdAt && firstMessage.createdAt > 0 ? new Date(firstMessage.createdAt) : new Date;
726
742
  const endTime = lastMessage?.createdAt && lastMessage.createdAt > 0 ? new Date(lastMessage.createdAt) : new Date;
727
743
  if (existingSummary) {
728
744
  await memoryService.updateSessionSummary(existingSummary.id, roomId, {
729
745
  summary: summaryResult.summary,
730
- messageCount: existingSummary.messageCount + sortedMessages.length,
746
+ messageCount: existingSummary.messageCount + newDialogueMessages.length,
731
747
  lastMessageOffset: newOffset,
732
748
  endTime,
733
749
  topics: summaryResult.topics,
@@ -735,15 +751,15 @@ var summarizationEvaluator = {
735
751
  keyPoints: summaryResult.keyPoints
736
752
  }
737
753
  });
738
- logger2.info(`Updated summary for room ${roomId}: ${sortedMessages.length} new messages processed (offset: ${lastOffset} → ${newOffset})`);
754
+ logger2.info(`Updated summary for room ${roomId}: ${newDialogueMessages.length} new dialogue messages processed (offset: ${lastOffset} → ${newOffset})`);
739
755
  } else {
740
756
  await memoryService.storeSessionSummary({
741
757
  agentId: runtime.agentId,
742
758
  roomId,
743
759
  entityId: message.entityId !== runtime.agentId ? message.entityId : undefined,
744
760
  summary: summaryResult.summary,
745
- messageCount: sortedMessages.length,
746
- lastMessageOffset: newOffset,
761
+ messageCount: totalDialogueCount,
762
+ lastMessageOffset: totalDialogueCount,
747
763
  startTime,
748
764
  endTime,
749
765
  topics: summaryResult.topics,
@@ -751,7 +767,7 @@ var summarizationEvaluator = {
751
767
  keyPoints: summaryResult.keyPoints
752
768
  }
753
769
  });
754
- logger2.info(`Created new summary for room ${roomId}: ${sortedMessages.length} messages summarized (offset: 0 → ${newOffset})`);
770
+ logger2.info(`Created new summary for room ${roomId}: ${totalDialogueCount} dialogue messages summarized (offset: 0 → ${totalDialogueCount})`);
755
771
  }
756
772
  } catch (error) {
757
773
  logger2.error({ error }, "Error during summarization:");
@@ -1023,484 +1039,10 @@ var longTermExtractionEvaluator = {
1023
1039
  examples: []
1024
1040
  };
1025
1041
 
1026
- // src/providers/short-term-memory.ts
1027
- import {
1028
- addHeader,
1029
- ChannelType,
1030
- formatMessages,
1031
- formatPosts,
1032
- getEntityDetails,
1033
- logger as logger4
1034
- } from "@elizaos/core";
1035
- var getRecentInteractions = async (runtime, sourceEntityId, targetEntityId, excludeRoomId) => {
1036
- const rooms = await runtime.getRoomsForParticipants([sourceEntityId, targetEntityId]);
1037
- return runtime.getMemoriesByRoomIds({
1038
- tableName: "messages",
1039
- roomIds: rooms.filter((room) => room !== excludeRoomId),
1040
- limit: 20
1041
- });
1042
- };
1043
- var shortTermMemoryProvider = {
1044
- name: "SHORT_TERM_MEMORY",
1045
- description: "Unified conversation context with smart summarization and interactions",
1046
- position: 95,
1047
- get: async (runtime, message, _state) => {
1048
- try {
1049
- const memoryService = runtime.getService("memory");
1050
- const { roomId } = message;
1051
- const conversationLength = 16;
1052
- const config = memoryService?.getConfig() || {
1053
- shortTermSummarizationThreshold: 16,
1054
- shortTermRetainRecent: 6
1055
- };
1056
- const totalMessageCount = await runtime.countMemories(roomId, false, "messages");
1057
- const useSummarization = memoryService && totalMessageCount >= config.shortTermSummarizationThreshold;
1058
- if (!useSummarization) {
1059
- const [entitiesData, room, recentMessagesData, recentInteractionsData] = await Promise.all([
1060
- getEntityDetails({ runtime, roomId }),
1061
- runtime.getRoom(roomId),
1062
- runtime.getMemories({
1063
- tableName: "messages",
1064
- roomId,
1065
- count: conversationLength,
1066
- unique: false
1067
- }),
1068
- message.entityId !== runtime.agentId ? getRecentInteractions(runtime, message.entityId, runtime.agentId, roomId) : Promise.resolve([])
1069
- ]);
1070
- const actionResultMessages = recentMessagesData.filter((msg) => msg.content?.type === "action_result" && msg.metadata?.type === "action_result");
1071
- const dialogueMessages = recentMessagesData.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result"));
1072
- const isPostFormat = room?.type ? room.type === ChannelType.FEED || room.type === ChannelType.THREAD : false;
1073
- const [formattedRecentMessages, formattedRecentPosts] = await Promise.all([
1074
- formatMessages({
1075
- messages: dialogueMessages,
1076
- entities: entitiesData
1077
- }),
1078
- formatPosts({
1079
- messages: dialogueMessages,
1080
- entities: entitiesData,
1081
- conversationHeader: false
1082
- })
1083
- ]);
1084
- const formatConversationLog = (messages, includeThoughts) => {
1085
- return messages.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0)).map((msg) => {
1086
- const entity = entitiesData.find((e) => e.id === msg.entityId);
1087
- const entityName = entity?.names[0] || (msg.entityId === runtime.agentId ? runtime.character.name : "Unknown");
1088
- const timestamp4 = msg.createdAt ? new Date(msg.createdAt).toLocaleString() : "Unknown time";
1089
- const text5 = msg.content.text || "";
1090
- const thought = includeThoughts && msg.content.internalMonologue ? `
1091
- [Internal thought: ${msg.content.internalMonologue}]` : "";
1092
- return `[${timestamp4}] ${entityName}: ${text5}${thought}`;
1093
- }).join(`
1094
- `);
1095
- };
1096
- const conversationLog = formatConversationLog(dialogueMessages, false);
1097
- const conversationLogWithAgentThoughts = formatConversationLog(dialogueMessages, true);
1098
- let actionResultsText = "";
1099
- if (actionResultMessages.length > 0) {
1100
- const groupedByRun = new Map;
1101
- for (const mem of actionResultMessages) {
1102
- const runId = String(mem.content?.runId || "unknown");
1103
- if (!groupedByRun.has(runId)) {
1104
- groupedByRun.set(runId, []);
1105
- }
1106
- const memories = groupedByRun.get(runId);
1107
- if (memories) {
1108
- memories.push(mem);
1109
- }
1110
- }
1111
- const formattedActionResults = Array.from(groupedByRun.entries()).slice(-3).map(([runId, memories]) => {
1112
- const sortedMemories = memories.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0));
1113
- const thought = sortedMemories[0]?.content?.planThought || "";
1114
- const runText = sortedMemories.map((mem) => {
1115
- const actionName = mem.content?.actionName || "Unknown";
1116
- const status = mem.content?.actionStatus || "unknown";
1117
- const planStep = mem.content?.planStep || "";
1118
- const text5 = mem.content?.text || "";
1119
- const error = mem.content?.error || "";
1120
- let memText = ` - ${actionName} (${status})`;
1121
- if (planStep)
1122
- memText += ` [${planStep}]`;
1123
- if (error) {
1124
- memText += `: Error - ${error}`;
1125
- } else if (text5 && text5 !== `Executed action: ${actionName}`) {
1126
- memText += `: ${text5}`;
1127
- }
1128
- return memText;
1129
- }).join(`
1130
- `);
1131
- return `**Action Run ${runId.slice(0, 8)}**${thought ? ` - "${thought}"` : ""}
1132
- ${runText}`;
1133
- }).join(`
1134
-
1135
- `);
1136
- actionResultsText = formattedActionResults ? addHeader("# Recent Action Executions", formattedActionResults) : "";
1137
- }
1138
- const recentPosts = formattedRecentPosts && formattedRecentPosts.length > 0 ? addHeader("# Posts in Thread", formattedRecentPosts) : "";
1139
- const recentMessages = formattedRecentMessages && formattedRecentMessages.length > 0 ? addHeader("# Conversation Messages", formattedRecentMessages) : "";
1140
- if (!recentPosts && !recentMessages && dialogueMessages.length === 0 && !message.content.text) {
1141
- return {
1142
- data: {
1143
- summaries: [],
1144
- recentMessages: [],
1145
- recentInteractions: [],
1146
- actionResults: [],
1147
- mode: "full_conversation"
1148
- },
1149
- values: {
1150
- recentPosts: "",
1151
- recentMessages: "",
1152
- recentMessageInteractions: "",
1153
- recentPostInteractions: "",
1154
- recentInteractions: "",
1155
- recentActionResults: "",
1156
- recentMessage: "No recent message available.",
1157
- conversationLog: "",
1158
- conversationLogWithAgentThoughts: ""
1159
- },
1160
- text: "No recent messages available"
1161
- };
1162
- }
1163
- let recentMessage = "No recent message available.";
1164
- if (dialogueMessages.length > 0) {
1165
- const mostRecentMessage = [...dialogueMessages].sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0))[0];
1166
- const formattedSingleMessage = formatMessages({
1167
- messages: [mostRecentMessage],
1168
- entities: entitiesData
1169
- });
1170
- if (formattedSingleMessage) {
1171
- recentMessage = formattedSingleMessage;
1172
- }
1173
- }
1174
- const metaData = message.metadata;
1175
- const senderName = entitiesData.find((entity) => entity.id === message.entityId)?.names[0] || metaData?.entityName || "Unknown User";
1176
- const receivedMessageContent = message.content.text;
1177
- const hasReceivedMessage = !!receivedMessageContent?.trim();
1178
- const receivedMessageHeader = hasReceivedMessage ? addHeader("# Received Message", `${senderName}: ${receivedMessageContent}`) : "";
1179
- const focusHeader = hasReceivedMessage ? addHeader("# Focus your response", `You are replying to the above message from **${senderName}**. Keep your answer relevant to that message. Do not repeat earlier replies unless the sender asks again.`) : "";
1180
- const interactionEntityMap = new Map;
1181
- if (recentInteractionsData.length > 0) {
1182
- const uniqueEntityIds = [
1183
- ...new Set(recentInteractionsData.map((message2) => message2.entityId).filter((id) => id !== runtime.agentId))
1184
- ];
1185
- const uniqueEntityIdSet = new Set(uniqueEntityIds);
1186
- const entitiesDataIdSet = new Set;
1187
- entitiesData.forEach((entity) => {
1188
- if (uniqueEntityIdSet.has(entity.id)) {
1189
- interactionEntityMap.set(entity.id, entity);
1190
- entitiesDataIdSet.add(entity.id);
1191
- }
1192
- });
1193
- const remainingEntityIds = uniqueEntityIds.filter((id) => !entitiesDataIdSet.has(id));
1194
- if (remainingEntityIds.length > 0) {
1195
- const entities = await Promise.all(remainingEntityIds.map((entityId) => runtime.getEntityById(entityId)));
1196
- entities.forEach((entity, index4) => {
1197
- if (entity) {
1198
- interactionEntityMap.set(remainingEntityIds[index4], entity);
1199
- }
1200
- });
1201
- }
1202
- }
1203
- const getRecentMessageInteractions = async (recentInteractionsData2) => {
1204
- const formattedInteractions = recentInteractionsData2.map((message2) => {
1205
- const isSelf = message2.entityId === runtime.agentId;
1206
- let sender;
1207
- if (isSelf) {
1208
- sender = runtime.character.name;
1209
- } else {
1210
- sender = interactionEntityMap.get(message2.entityId)?.metadata?.userName || "unknown";
1211
- }
1212
- return `${sender}: ${message2.content.text}`;
1213
- });
1214
- return formattedInteractions.join(`
1215
- `);
1216
- };
1217
- const getRecentPostInteractions = async (recentInteractionsData2, entities) => {
1218
- const combinedEntities = [...entities];
1219
- const actorIds = new Set(entities.map((entity) => entity.id));
1220
- for (const [id, entity] of interactionEntityMap.entries()) {
1221
- if (!actorIds.has(id)) {
1222
- combinedEntities.push(entity);
1223
- }
1224
- }
1225
- const formattedInteractions = formatPosts({
1226
- messages: recentInteractionsData2,
1227
- entities: combinedEntities,
1228
- conversationHeader: true
1229
- });
1230
- return formattedInteractions;
1231
- };
1232
- const [recentMessageInteractions, recentPostInteractions] = await Promise.all([
1233
- getRecentMessageInteractions(recentInteractionsData),
1234
- getRecentPostInteractions(recentInteractionsData, entitiesData)
1235
- ]);
1236
- const data = {
1237
- summaries: [],
1238
- recentMessages: dialogueMessages,
1239
- recentInteractions: recentInteractionsData,
1240
- actionResults: actionResultMessages,
1241
- mode: "full_conversation"
1242
- };
1243
- const values = {
1244
- recentPosts,
1245
- recentMessages,
1246
- recentMessageInteractions,
1247
- recentPostInteractions,
1248
- recentInteractions: isPostFormat ? recentPostInteractions : recentMessageInteractions,
1249
- recentActionResults: actionResultsText,
1250
- recentMessage,
1251
- conversationLog,
1252
- conversationLogWithAgentThoughts
1253
- };
1254
- const text4 = [
1255
- isPostFormat ? recentPosts : recentMessages,
1256
- actionResultsText,
1257
- recentMessages || recentPosts || message.content.text ? receivedMessageHeader : "",
1258
- recentMessages || recentPosts || message.content.text ? focusHeader : ""
1259
- ].filter(Boolean).join(`
1260
-
1261
- `);
1262
- return {
1263
- data,
1264
- values,
1265
- text: text4
1266
- };
1267
- } else {
1268
- const currentSummary = await memoryService.getCurrentSessionSummary(roomId);
1269
- const lastOffset = currentSummary?.lastMessageOffset || 0;
1270
- const recentCount = config.shortTermRetainRecent;
1271
- const [entitiesData, room, unsummarizedMessages, recentInteractionsData] = await Promise.all([
1272
- getEntityDetails({ runtime, roomId }),
1273
- runtime.getRoom(roomId),
1274
- runtime.getMemories({
1275
- tableName: "messages",
1276
- roomId,
1277
- count: recentCount,
1278
- unique: false,
1279
- start: lastOffset
1280
- }),
1281
- message.entityId !== runtime.agentId ? getRecentInteractions(runtime, message.entityId, runtime.agentId, roomId) : Promise.resolve([])
1282
- ]);
1283
- const isPostFormat = room?.type ? room.type === ChannelType.FEED || room.type === ChannelType.THREAD : false;
1284
- const actionResultMessages = unsummarizedMessages.filter((msg) => msg.content?.type === "action_result" && msg.metadata?.type === "action_result");
1285
- const dialogueMessages = unsummarizedMessages.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result"));
1286
- let actionResultsText = "";
1287
- if (actionResultMessages.length > 0) {
1288
- const groupedByRun = new Map;
1289
- for (const mem of actionResultMessages) {
1290
- const runId = String(mem.content?.runId || "unknown");
1291
- if (!groupedByRun.has(runId)) {
1292
- groupedByRun.set(runId, []);
1293
- }
1294
- groupedByRun.get(runId)?.push(mem);
1295
- }
1296
- const formattedActionResults = Array.from(groupedByRun.entries()).slice(-3).map(([runId, memories]) => {
1297
- const sortedMemories = memories.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0));
1298
- const thought = sortedMemories[0]?.content?.planThought || "";
1299
- const runText = sortedMemories.map((mem) => {
1300
- const actionName = mem.content?.actionName || "Unknown";
1301
- const status = mem.content?.actionStatus || "unknown";
1302
- const planStep = mem.content?.planStep || "";
1303
- const text5 = mem.content?.text || "";
1304
- const error = mem.content?.error || "";
1305
- let memText = ` - ${actionName} (${status})`;
1306
- if (planStep)
1307
- memText += ` [${planStep}]`;
1308
- if (error) {
1309
- memText += `: Error - ${error}`;
1310
- } else if (text5 && text5 !== `Executed action: ${actionName}`) {
1311
- memText += `: ${text5}`;
1312
- }
1313
- return memText;
1314
- }).join(`
1315
- `);
1316
- return `**Action Run ${runId.slice(0, 8)}**${thought ? ` - "${thought}"` : ""}
1317
- ${runText}`;
1318
- }).join(`
1319
-
1320
- `);
1321
- actionResultsText = formattedActionResults ? addHeader("# Recent Action Executions", formattedActionResults) : "";
1322
- }
1323
- let recentMessagesText = "";
1324
- if (dialogueMessages.length > 0) {
1325
- if (isPostFormat) {
1326
- recentMessagesText = formatPosts({
1327
- messages: dialogueMessages,
1328
- entities: entitiesData,
1329
- conversationHeader: false
1330
- });
1331
- } else {
1332
- recentMessagesText = formatMessages({
1333
- messages: dialogueMessages,
1334
- entities: entitiesData
1335
- });
1336
- }
1337
- if (recentMessagesText) {
1338
- recentMessagesText = addHeader("# Recent Messages", recentMessagesText);
1339
- }
1340
- }
1341
- let recentMessage = "No recent message available.";
1342
- if (dialogueMessages.length > 0) {
1343
- const mostRecentMessage = [...dialogueMessages].sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0))[0];
1344
- const formattedSingleMessage = formatMessages({
1345
- messages: [mostRecentMessage],
1346
- entities: entitiesData
1347
- });
1348
- if (formattedSingleMessage) {
1349
- recentMessage = formattedSingleMessage;
1350
- }
1351
- }
1352
- const formatConversationLog = (messages, includeThoughts) => {
1353
- return messages.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0)).map((msg) => {
1354
- const entity = entitiesData.find((e) => e.id === msg.entityId);
1355
- const entityName = entity?.names[0] || (msg.entityId === runtime.agentId ? runtime.character.name : "Unknown");
1356
- const timestamp4 = msg.createdAt ? new Date(msg.createdAt).toLocaleString() : "Unknown time";
1357
- const text5 = msg.content.text || "";
1358
- const thought = includeThoughts && msg.content.internalMonologue ? `
1359
- [Internal thought: ${msg.content.internalMonologue}]` : "";
1360
- return `[${timestamp4}] ${entityName}: ${text5}${thought}`;
1361
- }).join(`
1362
- `);
1363
- };
1364
- const conversationLog = formatConversationLog(dialogueMessages, false);
1365
- const conversationLogWithAgentThoughts = formatConversationLog(dialogueMessages, true);
1366
- let summaryText = "";
1367
- if (currentSummary) {
1368
- const messageRange = `${currentSummary.messageCount} messages`;
1369
- const timeRange = new Date(currentSummary.startTime).toLocaleDateString();
1370
- summaryText = `**Previous Conversation** (${messageRange}, ${timeRange})
1371
- `;
1372
- summaryText += currentSummary.summary;
1373
- if (currentSummary.topics && currentSummary.topics.length > 0) {
1374
- summaryText += `
1375
- *Topics: ${currentSummary.topics.join(", ")}*`;
1376
- }
1377
- summaryText = addHeader("# Conversation Summary", summaryText);
1378
- }
1379
- const metaData = message.metadata;
1380
- const senderName = entitiesData.find((entity) => entity.id === message.entityId)?.names[0] || metaData?.entityName || "Unknown User";
1381
- const receivedMessageContent = message.content.text;
1382
- const hasReceivedMessage = !!receivedMessageContent?.trim();
1383
- const receivedMessageHeader = hasReceivedMessage ? addHeader("# Received Message", `${senderName}: ${receivedMessageContent}`) : "";
1384
- const focusHeader = hasReceivedMessage ? addHeader("# Focus your response", `You are replying to the above message from **${senderName}**. Keep your answer relevant to that message.`) : "";
1385
- const interactionEntityMap = new Map;
1386
- if (recentInteractionsData.length > 0) {
1387
- const uniqueEntityIds = [
1388
- ...new Set(recentInteractionsData.map((message2) => message2.entityId).filter((id) => id !== runtime.agentId))
1389
- ];
1390
- const uniqueEntityIdSet = new Set(uniqueEntityIds);
1391
- const entitiesDataIdSet = new Set;
1392
- entitiesData.forEach((entity) => {
1393
- if (uniqueEntityIdSet.has(entity.id)) {
1394
- interactionEntityMap.set(entity.id, entity);
1395
- entitiesDataIdSet.add(entity.id);
1396
- }
1397
- });
1398
- const remainingEntityIds = uniqueEntityIds.filter((id) => !entitiesDataIdSet.has(id));
1399
- if (remainingEntityIds.length > 0) {
1400
- const entities = await Promise.all(remainingEntityIds.map((entityId) => runtime.getEntityById(entityId)));
1401
- entities.forEach((entity, index4) => {
1402
- if (entity) {
1403
- interactionEntityMap.set(remainingEntityIds[index4], entity);
1404
- }
1405
- });
1406
- }
1407
- }
1408
- const getRecentMessageInteractions = async (recentInteractionsData2) => {
1409
- const formattedInteractions = recentInteractionsData2.map((message2) => {
1410
- const isSelf = message2.entityId === runtime.agentId;
1411
- let sender;
1412
- if (isSelf) {
1413
- sender = runtime.character.name;
1414
- } else {
1415
- sender = interactionEntityMap.get(message2.entityId)?.metadata?.userName || "unknown";
1416
- }
1417
- return `${sender}: ${message2.content.text}`;
1418
- });
1419
- return formattedInteractions.join(`
1420
- `);
1421
- };
1422
- const getRecentPostInteractions = async (recentInteractionsData2, entities) => {
1423
- const combinedEntities = [...entities];
1424
- const actorIds = new Set(entities.map((entity) => entity.id));
1425
- for (const [id, entity] of interactionEntityMap.entries()) {
1426
- if (!actorIds.has(id)) {
1427
- combinedEntities.push(entity);
1428
- }
1429
- }
1430
- const formattedInteractions = formatPosts({
1431
- messages: recentInteractionsData2,
1432
- entities: combinedEntities,
1433
- conversationHeader: true
1434
- });
1435
- return formattedInteractions;
1436
- };
1437
- const [recentMessageInteractions, recentPostInteractions] = await Promise.all([
1438
- getRecentMessageInteractions(recentInteractionsData),
1439
- getRecentPostInteractions(recentInteractionsData, entitiesData)
1440
- ]);
1441
- const text4 = [
1442
- summaryText,
1443
- recentMessagesText,
1444
- actionResultsText,
1445
- hasReceivedMessage ? receivedMessageHeader : "",
1446
- hasReceivedMessage ? focusHeader : ""
1447
- ].filter(Boolean).join(`
1448
-
1449
- `);
1450
- return {
1451
- data: {
1452
- summaries: currentSummary ? [currentSummary] : [],
1453
- recentMessages: dialogueMessages,
1454
- recentInteractions: recentInteractionsData,
1455
- actionResults: actionResultMessages,
1456
- mode: "summarized"
1457
- },
1458
- values: {
1459
- ...summaryText && { sessionSummaries: summaryText },
1460
- ...recentMessagesText && { recentMessages: recentMessagesText },
1461
- recentMessageInteractions,
1462
- recentPostInteractions,
1463
- recentInteractions: isPostFormat ? recentPostInteractions : recentMessageInteractions,
1464
- ...actionResultsText && { recentActionResults: actionResultsText },
1465
- recentMessage,
1466
- conversationLog,
1467
- conversationLogWithAgentThoughts,
1468
- ...receivedMessageHeader && { receivedMessageHeader },
1469
- ...focusHeader && { focusHeader }
1470
- },
1471
- text: text4
1472
- };
1473
- }
1474
- } catch (error) {
1475
- logger4.error({ error }, "Error in shortTermMemoryProvider:");
1476
- return {
1477
- data: {
1478
- summaries: [],
1479
- recentMessages: [],
1480
- recentInteractions: [],
1481
- actionResults: [],
1482
- mode: "error"
1483
- },
1484
- values: {
1485
- recentPosts: "",
1486
- recentMessages: "",
1487
- recentMessageInteractions: "",
1488
- recentPostInteractions: "",
1489
- recentInteractions: "",
1490
- recentActionResults: "",
1491
- conversationLog: "",
1492
- conversationLogWithAgentThoughts: ""
1493
- },
1494
- text: "Error retrieving conversation context."
1495
- };
1496
- }
1497
- }
1498
- };
1499
-
1500
1042
  // src/providers/long-term-memory.ts
1501
1043
  import {
1502
- logger as logger5,
1503
- addHeader as addHeader2
1044
+ logger as logger4,
1045
+ addHeader
1504
1046
  } from "@elizaos/core";
1505
1047
  var longTermMemoryProvider = {
1506
1048
  name: "LONG_TERM_MEMORY",
@@ -1533,7 +1075,7 @@ var longTermMemoryProvider = {
1533
1075
  };
1534
1076
  }
1535
1077
  const formattedMemories = await memoryService.getFormattedLongTermMemories(entityId);
1536
- const text4 = addHeader2("# What I Know About You", formattedMemories);
1078
+ const text4 = addHeader("# What I Know About You", formattedMemories);
1537
1079
  const categoryCounts = new Map;
1538
1080
  for (const memory of memories) {
1539
1081
  const count = categoryCounts.get(memory.category) || 0;
@@ -1552,7 +1094,7 @@ var longTermMemoryProvider = {
1552
1094
  text: text4
1553
1095
  };
1554
1096
  } catch (error) {
1555
- logger5.error({ error }, "Error in longTermMemoryProvider:");
1097
+ logger4.error({ error }, "Error in longTermMemoryProvider:");
1556
1098
  return {
1557
1099
  data: { memories: [] },
1558
1100
  values: { longTermMemories: "" },
@@ -1562,24 +1104,237 @@ var longTermMemoryProvider = {
1562
1104
  }
1563
1105
  };
1564
1106
 
1107
+ // src/providers/context-summary.ts
1108
+ import {
1109
+ addHeader as addHeader2,
1110
+ logger as logger5
1111
+ } from "@elizaos/core";
1112
+ var contextSummaryProvider = {
1113
+ name: "SUMMARIZED_CONTEXT",
1114
+ description: "Provides summarized context from previous conversations",
1115
+ position: 96,
1116
+ get: async (runtime, message, _state) => {
1117
+ try {
1118
+ const memoryService = runtime.getService("memory");
1119
+ const { roomId } = message;
1120
+ if (!memoryService) {
1121
+ return {
1122
+ data: {
1123
+ summary: null
1124
+ },
1125
+ values: {
1126
+ sessionSummaries: "",
1127
+ sessionSummariesWithTopics: ""
1128
+ },
1129
+ text: ""
1130
+ };
1131
+ }
1132
+ const currentSummary = await memoryService.getCurrentSessionSummary(roomId);
1133
+ if (!currentSummary) {
1134
+ return {
1135
+ data: {
1136
+ summary: null
1137
+ },
1138
+ values: {
1139
+ sessionSummaries: "",
1140
+ sessionSummariesWithTopics: ""
1141
+ },
1142
+ text: ""
1143
+ };
1144
+ }
1145
+ const messageRange = `${currentSummary.messageCount} messages`;
1146
+ const timeRange = new Date(currentSummary.startTime).toLocaleDateString();
1147
+ let summaryOnly = `**Previous Conversation** (${messageRange}, ${timeRange})
1148
+ `;
1149
+ summaryOnly += currentSummary.summary;
1150
+ let summaryWithTopics = summaryOnly;
1151
+ if (currentSummary.topics && currentSummary.topics.length > 0) {
1152
+ summaryWithTopics += `
1153
+ *Topics: ${currentSummary.topics.join(", ")}*`;
1154
+ }
1155
+ const sessionSummaries2 = addHeader2("# Conversation Summary", summaryOnly);
1156
+ const sessionSummariesWithTopics = addHeader2("# Conversation Summary", summaryWithTopics);
1157
+ return {
1158
+ data: {
1159
+ summary: currentSummary
1160
+ },
1161
+ values: {
1162
+ sessionSummaries: sessionSummaries2,
1163
+ sessionSummariesWithTopics
1164
+ },
1165
+ text: sessionSummariesWithTopics
1166
+ };
1167
+ } catch (error) {
1168
+ logger5.error({ error }, "Error in contextSummaryProvider:");
1169
+ return {
1170
+ data: {
1171
+ summary: null
1172
+ },
1173
+ values: {
1174
+ sessionSummaries: "",
1175
+ sessionSummariesWithTopics: ""
1176
+ },
1177
+ text: ""
1178
+ };
1179
+ }
1180
+ }
1181
+ };
1182
+
1183
+ // src/providers/recent-messages.ts
1184
+ import {
1185
+ addHeader as addHeader3,
1186
+ ChannelType,
1187
+ formatMessages,
1188
+ formatPosts,
1189
+ getEntityDetails,
1190
+ logger as logger6
1191
+ } from "@elizaos/core";
1192
+ var recentMessagesProvider = {
1193
+ name: "RECENT_MESSAGES",
1194
+ description: "Provides recent conversation messages with detailed context",
1195
+ position: 94,
1196
+ get: async (runtime, message, _state) => {
1197
+ try {
1198
+ const memoryService = runtime.getService("memory");
1199
+ const { roomId } = message;
1200
+ const config = memoryService?.getConfig() || {
1201
+ shortTermSummarizationThreshold: 16,
1202
+ shortTermRetainRecent: 6
1203
+ };
1204
+ const conversationLength = runtime.getConversationLength();
1205
+ let messagesToFetch = config.shortTermRetainRecent;
1206
+ let startOffset = 0;
1207
+ let hasSummary = false;
1208
+ if (memoryService) {
1209
+ const currentSummary = await memoryService.getCurrentSessionSummary(roomId);
1210
+ if (currentSummary) {
1211
+ hasSummary = true;
1212
+ startOffset = currentSummary.lastMessageOffset || 0;
1213
+ }
1214
+ }
1215
+ if (!hasSummary) {
1216
+ const allMessages = await runtime.getMemories({
1217
+ tableName: "messages",
1218
+ roomId,
1219
+ count: conversationLength,
1220
+ unique: false
1221
+ });
1222
+ const dialogueMessageCount = allMessages.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result") && (msg.metadata?.type === "agent_response_message" || msg.metadata?.type === "user_message")).length;
1223
+ if (dialogueMessageCount < config.shortTermSummarizationThreshold) {
1224
+ messagesToFetch = conversationLength;
1225
+ }
1226
+ }
1227
+ const [entitiesData, room, recentMessagesData] = await Promise.all([
1228
+ getEntityDetails({ runtime, roomId }),
1229
+ runtime.getRoom(roomId),
1230
+ runtime.getMemories({
1231
+ tableName: "messages",
1232
+ roomId,
1233
+ count: messagesToFetch,
1234
+ unique: false,
1235
+ start: startOffset
1236
+ })
1237
+ ]);
1238
+ const isPostFormat = room?.type ? room.type === ChannelType.FEED || room.type === ChannelType.THREAD : false;
1239
+ const dialogueMessages = recentMessagesData.filter((msg) => !(msg.content?.type === "action_result" && msg.metadata?.type === "action_result") && (msg.metadata?.type === "agent_response_message" || msg.metadata?.type === "user_message"));
1240
+ let recentMessagesText = "";
1241
+ if (dialogueMessages.length > 0) {
1242
+ if (isPostFormat) {
1243
+ recentMessagesText = formatPosts({
1244
+ messages: dialogueMessages,
1245
+ entities: entitiesData,
1246
+ conversationHeader: false
1247
+ });
1248
+ } else {
1249
+ recentMessagesText = formatMessages({
1250
+ messages: dialogueMessages,
1251
+ entities: entitiesData
1252
+ });
1253
+ }
1254
+ if (recentMessagesText) {
1255
+ recentMessagesText = addHeader3("# Recent Messages", recentMessagesText);
1256
+ }
1257
+ }
1258
+ const formatConversationLog = (messages, includeThoughts) => {
1259
+ return messages.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0)).map((msg) => {
1260
+ const entity = entitiesData.find((e) => e.id === msg.entityId);
1261
+ const entityName = entity?.names[0] || (msg.entityId === runtime.agentId ? runtime.character.name : "Unknown");
1262
+ const timestamp4 = msg.createdAt ? new Date(msg.createdAt).toLocaleString() : "Unknown time";
1263
+ const text5 = msg.content.text || "";
1264
+ const thought = includeThoughts && msg.content.internalMonologue ? `
1265
+ [Internal thought: ${msg.content.internalMonologue}]` : "";
1266
+ return `[${timestamp4}] ${entityName}: ${text5}${thought}`;
1267
+ }).join(`
1268
+ `);
1269
+ };
1270
+ const conversationLog = addHeader3("# Conversation Messages", formatConversationLog(dialogueMessages, false));
1271
+ const conversationLogWithAgentThoughts = addHeader3("# Conversation Messages", formatConversationLog(dialogueMessages, true));
1272
+ const metaData = message.metadata;
1273
+ const senderName = entitiesData.find((entity) => entity.id === message.entityId)?.names[0] || metaData?.entityName || "Unknown User";
1274
+ const receivedMessageContent = message.content.text;
1275
+ const hasReceivedMessage = !!receivedMessageContent?.trim();
1276
+ const receivedMessageHeader = hasReceivedMessage ? addHeader3("# Received Message", `${senderName}: ${receivedMessageContent}`) : "";
1277
+ const focusHeader = hasReceivedMessage ? addHeader3("# Focus your response", `You are replying to the above message from **${senderName}**. Keep your answer relevant to that message.`) : "";
1278
+ const text4 = [recentMessagesText, receivedMessageHeader, focusHeader].filter(Boolean).join(`
1279
+
1280
+ `);
1281
+ return {
1282
+ data: {
1283
+ messages: dialogueMessages
1284
+ },
1285
+ values: {
1286
+ recentMessages: recentMessagesText,
1287
+ conversationLog,
1288
+ conversationLogWithAgentThoughts,
1289
+ ...receivedMessageHeader && { receivedMessageHeader },
1290
+ ...focusHeader && { focusHeader }
1291
+ },
1292
+ text: text4
1293
+ };
1294
+ } catch (error) {
1295
+ logger6.error({ error }, "Error in recentMessagesProvider:");
1296
+ return {
1297
+ data: {
1298
+ messages: []
1299
+ },
1300
+ values: {
1301
+ recentMessages: "",
1302
+ conversationLog: "",
1303
+ conversationLogWithAgentThoughts: "",
1304
+ receivedMessageHeader: "",
1305
+ focusHeader: ""
1306
+ },
1307
+ text: ""
1308
+ };
1309
+ }
1310
+ }
1311
+ };
1312
+
1565
1313
  // src/index.ts
1566
1314
  var memoryPlugin = {
1567
1315
  name: "memory",
1568
1316
  description: "Advanced memory management with conversation summarization and long-term persistent memory",
1569
1317
  services: [MemoryService],
1570
1318
  evaluators: [summarizationEvaluator, longTermExtractionEvaluator],
1571
- providers: [longTermMemoryProvider, shortTermMemoryProvider],
1319
+ providers: [
1320
+ longTermMemoryProvider,
1321
+ contextSummaryProvider,
1322
+ recentMessagesProvider
1323
+ ],
1572
1324
  schema: exports_schemas
1573
1325
  };
1574
1326
  var src_default = memoryPlugin;
1575
1327
  export {
1576
1328
  sessionSummaries,
1329
+ recentMessagesProvider,
1577
1330
  memoryPlugin,
1578
1331
  memoryAccessLogs,
1332
+ longTermMemoryProvider,
1579
1333
  longTermMemories,
1580
1334
  src_default as default,
1335
+ contextSummaryProvider,
1581
1336
  MemoryService,
1582
1337
  LongTermMemoryCategory
1583
1338
  };
1584
1339
 
1585
- //# debugId=B1C29E71DE6182A064756E2164756E21
1340
+ //# debugId=755CC91A4D2723F764756E2164756E21