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