n8n-nodes-tembory 1.0.5 → 1.0.6

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.
@@ -630,17 +630,21 @@ const toolHistoryFromMemory = (item) => {
630
630
  source: meta.source || 'metadata',
631
631
  };
632
632
  };
633
- const toolHistoryItemsFromMemory = (item) => {
633
+ const explicitToolHistoryItemsFromMemory = (item) => {
634
634
  const meta = metadataOf(item);
635
635
  const content = meta.content || item.memory || item.text || item.value || item.content || item.data;
636
636
  const marked = parseToolHistoryMarker(content);
637
637
  if (marked)
638
638
  return [marked];
639
- if (meta.kind === 'recent_message') {
640
- const textCalls = extractToolCallsFromText(content, meta.at || item.created_at || item.createdAt || nowIso());
641
- if (textCalls.length)
642
- return textCalls;
643
- }
639
+ const textCalls = extractToolCallsFromText(content, meta.at || item.created_at || item.createdAt || nowIso());
640
+ return textCalls.length ? textCalls : [];
641
+ };
642
+ const toolHistoryItemsFromMemory = (item) => {
643
+ const meta = metadataOf(item);
644
+ const content = meta.content || item.memory || item.text || item.value || item.content || item.data;
645
+ const explicit = explicitToolHistoryItemsFromMemory(item);
646
+ if (explicit.length)
647
+ return explicit;
644
648
  const single = toolHistoryFromMemory(item);
645
649
  return single ? [single] : [];
646
650
  };
@@ -1283,6 +1287,17 @@ const deriveContextHealth = ({ userId = '', project = '', vectorMemories = [], r
1283
1287
  generated_at: nowIso(),
1284
1288
  };
1285
1289
  };
1290
+ const contextMemoryText = (memory, max = 700) => {
1291
+ const text = memoryText(memory);
1292
+ const tools = explicitToolHistoryItemsFromMemory(memory);
1293
+ if (tools.length) {
1294
+ const names = tools.map((tool) => `${tool.name || 'tool'}:${tool.ok === false ? 'failed' : 'ok'}`).join(', ');
1295
+ const ids = tools.map((tool) => tool.result || tool.input || '').join(' ');
1296
+ const idMatch = /(reservation_id|confirmation_id|id)["':\s]+([A-Za-z0-9_.:-]+)/i.exec(ids);
1297
+ return truncate(`[tool_events_extracted] ${names}${idMatch ? ` ${idMatch[1]}=${idMatch[2]}` : ''}. See Tool history for structured details.`, max);
1298
+ }
1299
+ return truncate(text, max);
1300
+ };
1286
1301
  const wrapElefaiMemory = (memory, ctx, memoryKey) => new Proxy(memory, {
1287
1302
  get(target, prop) {
1288
1303
  if (prop === 'loadMemoryVariables') {
@@ -1361,7 +1376,7 @@ const buildContextMessages = ({ payloadFormat, query, userId, profileFacts, work
1361
1376
  });
1362
1377
  }
1363
1378
  if (includeSummary) {
1364
- const summary = vectorMemories.slice(0, Number(adv.summaryMaxFacts || 4)).map(memoryText).filter(Boolean);
1379
+ const summary = vectorMemories.slice(0, Number(adv.summaryMaxFacts || 4)).map((memory) => contextMemoryText(memory, 360)).filter(Boolean);
1365
1380
  sections.push({ section: 'summary', title: 'Summary', value: summary.length ? summary : null, why_null: summary.length ? undefined : 'no vector memories to summarize' });
1366
1381
  }
1367
1382
  sections.push({
@@ -1419,7 +1434,7 @@ const buildContextMessages = ({ payloadFormat, query, userId, profileFacts, work
1419
1434
  const scoreMeta = scoreMetaOf(m);
1420
1435
  const rawScore = scoreOf(m);
1421
1436
  return {
1422
- memory: memoryText(m),
1437
+ memory: contextMemoryText(m, Number(adv.vectorMemoryMaxChars || 700)),
1423
1438
  score: includeScores ? (rawScore !== undefined ? rawScore : scoreMeta.hybridScore ?? scoreMeta.recencyScore ?? 'unavailable') : undefined,
1424
1439
  semantic_score: includeScores ? scoreMeta.semanticScore : undefined,
1425
1440
  recency_score: includeScores ? scoreMeta.recencyScore : undefined,
@@ -2231,8 +2246,9 @@ class Mem0Memory {
2231
2246
  for (const msg of recentMessages)
2232
2247
  toolHistoryFromRecentMessages.push(...extractToolCallsFromText(msg.content, msg.at));
2233
2248
  }
2249
+ const toolHistoryFromVectorMarkers = adv.includeToolHistory === false ? [] : vectorMemories.flatMap(explicitToolHistoryItemsFromMemory);
2234
2250
  const toolHistoryFromVectorMemories = adv.includeToolHistory === false || adv.includeToolHistorySemanticFallback !== true ? [] : vectorMemories.flatMap(toolHistoryItemsFromMemory);
2235
- const toolHistory = adv.includeToolHistory === false ? [] : applyToolHistoryWindow((store.toolHistory[key] || []).concat(persistedToolHistory, toolHistoryFromRecentMessages, toolHistoryFromVectorMemories), adv.toolHistoryTTLSeconds, adv.toolHistoryLastN || 15);
2251
+ const toolHistory = adv.includeToolHistory === false ? [] : applyToolHistoryWindow((store.toolHistory[key] || []).concat(persistedToolHistory, toolHistoryFromRecentMessages, toolHistoryFromVectorMarkers, toolHistoryFromVectorMemories), adv.toolHistoryTTLSeconds, adv.toolHistoryLastN || 15);
2236
2252
  const highlights = adv.includeRecentHighlights === false ? [] : getRecentHighlights(recentMessages, toolHistory, adv.recentHighlightsMaxItems || 6);
2237
2253
  const profileFacts = adv.includeProfileFacts === false ? {} : mergeProfileFacts(store.profileFacts[key], profileFactsFromMessages(allRecentMessages), profileFactsFromMemories(vectorMemories));
2238
2254
  if (adv.includeProfileFacts !== false && Object.keys(profileFacts).length) {
@@ -2246,7 +2262,7 @@ class Mem0Memory {
2246
2262
  let connectedModelSummary = '';
2247
2263
  if (connectedLanguageModel && typeof connectedLanguageModel.invoke === 'function' && (vectorMemories.length || String(query || '').trim()) && adv.includeSummary !== false) {
2248
2264
  try {
2249
- const facts = vectorMemories.slice(0, Number(adv.summaryMaxFacts || 4)).map(memoryText).filter(Boolean).join('\n') || '(no vector memories found)';
2265
+ const facts = vectorMemories.slice(0, Number(adv.summaryMaxFacts || 4)).map((memory) => contextMemoryText(memory, 500)).filter(Boolean).join('\n') || '(no vector memories found)';
2250
2266
  if (facts || String(query || '').trim()) {
2251
2267
  const response = await connectedLanguageModel.invoke([
2252
2268
  toBaseMessage({
@@ -2530,6 +2546,7 @@ exports.__private = {
2530
2546
  extractToolCallsFromText,
2531
2547
  extractToolCalls,
2532
2548
  toolHistoryItemsFromMemory,
2549
+ explicitToolHistoryItemsFromMemory,
2533
2550
  toolHistoryFromMemory,
2534
2551
  recentMessageFromMemory,
2535
2552
  dedupeToolHistory,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-tembory",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Tembory node for n8n AI Agents with profile, tools, timeline, graph and semantic memory",
5
5
  "license": "MIT",
6
6
  "homepage": "https://tembory.com",