n8n-nodes-tembory 1.1.35 → 1.1.36

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.
package/README.md CHANGED
@@ -2,7 +2,13 @@
2
2
 
3
3
  Node de memoria operacional da Tembory para agentes de IA no n8n.
4
4
 
5
- Versao atual: `1.1.35`.
5
+ Versao atual: `1.1.36`.
6
+
7
+ ## 1.1.36
8
+
9
+ - Mantem o comportamento funcional da `1.1.35`.
10
+ - Corrige o resumo visual do n8n para mensagens LangChain serializadas, incluindo objetos com `kwargs.content`.
11
+ - Evita o fallback pobre `{ action, messages }` quando o contexto foi carregado corretamente mas o output humano nao conseguiu parsear o `SystemMessage`.
6
12
 
7
13
  ## 1.1.35
8
14
 
@@ -933,8 +933,8 @@ const toolHistoryItemsFromMemory = (item) => {
933
933
  return single ? [single] : [];
934
934
  };
935
935
  const toBaseMessage = (message) => {
936
- const role = String((message === null || message === void 0 ? void 0 : message.role) || 'system').toLowerCase();
937
- const content = typeof message === 'string' ? message : String((message === null || message === void 0 ? void 0 : message.content) || '');
936
+ const role = String(messageTypeOf(message) || (message === null || message === void 0 ? void 0 : message.role) || 'system').toLowerCase();
937
+ const content = messageContentOf(message);
938
938
  const MessageClass = role === 'human' || role === 'user'
939
939
  ? LangChainMessages.HumanMessage
940
940
  : role === 'ai' || role === 'assistant'
@@ -1029,9 +1029,39 @@ const readDeep = (value, visitor, seen = new Set()) => {
1029
1029
  const messageTypeOf = (message) => {
1030
1030
  if (typeof (message === null || message === void 0 ? void 0 : message._getType) === 'function')
1031
1031
  return String(message._getType() || '');
1032
- return String((message === null || message === void 0 ? void 0 : message.role) || (message === null || message === void 0 ? void 0 : message.type) || (message === null || message === void 0 ? void 0 : message.lc_kwargs && message.lc_kwargs.type) || '').toLowerCase();
1032
+ const serializedId = Array.isArray(message === null || message === void 0 ? void 0 : message.id) ? message.id.join('.') : '';
1033
+ if (/SystemMessage/i.test(serializedId))
1034
+ return 'system';
1035
+ if (/HumanMessage/i.test(serializedId))
1036
+ return 'human';
1037
+ if (/AIMessage/i.test(serializedId))
1038
+ return 'ai';
1039
+ return String((message === null || message === void 0 ? void 0 : message.role) || (message === null || message === void 0 ? void 0 : message.type) || (message === null || message === void 0 ? void 0 : message.kwargs && message.kwargs.type) || (message === null || message === void 0 ? void 0 : message.lc_kwargs && message.lc_kwargs.type) || '').toLowerCase();
1040
+ };
1041
+ const messageContentOf = (message) => {
1042
+ if (typeof message === 'string')
1043
+ return message;
1044
+ const content = (message === null || message === void 0 ? void 0 : message.content) !== undefined
1045
+ ? message.content
1046
+ : (message === null || message === void 0 ? void 0 : message.kwargs && message.kwargs.content) !== undefined
1047
+ ? message.kwargs.content
1048
+ : (message === null || message === void 0 ? void 0 : message.lc_kwargs && message.lc_kwargs.content) !== undefined
1049
+ ? message.lc_kwargs.content
1050
+ : (message === null || message === void 0 ? void 0 : message.data && message.data.content) !== undefined
1051
+ ? message.data.content
1052
+ : undefined;
1053
+ if (typeof content === 'string')
1054
+ return content;
1055
+ if (Array.isArray(content)) {
1056
+ const joined = content
1057
+ .map((part) => typeof part === 'string' ? part : (part && typeof part.text === 'string' ? part.text : safeStringify(part)))
1058
+ .filter(Boolean)
1059
+ .join('\n');
1060
+ if (joined)
1061
+ return joined;
1062
+ }
1063
+ return content === undefined ? '' : safeStringify(content);
1033
1064
  };
1034
- const messageContentOf = (message) => typeof (message === null || message === void 0 ? void 0 : message.content) === 'string' ? message.content : safeStringify(message === null || message === void 0 ? void 0 : message.content);
1035
1065
  const extractToolCallsFromMessages = (messages = []) => {
1036
1066
  const calls = [];
1037
1067
  const toolCallById = new Map();
@@ -2985,7 +3015,18 @@ const summarizeMemoryMessagesForSideChannel = (messages = []) => {
2985
3015
  if (!firstSystem)
2986
3016
  return summary;
2987
3017
  try {
2988
- const parsed = JSON.parse(messageContentOf(firstSystem));
3018
+ const rawContent = messageContentOf(firstSystem);
3019
+ let parsed;
3020
+ try {
3021
+ parsed = JSON.parse(rawContent);
3022
+ }
3023
+ catch {
3024
+ const start = rawContent.indexOf('{');
3025
+ const end = rawContent.lastIndexOf('}');
3026
+ if (start < 0 || end <= start)
3027
+ throw new Error('Tembory visual summary could not find JSON context');
3028
+ parsed = JSON.parse(rawContent.slice(start, end + 1));
3029
+ }
2989
3030
  const conversation = parsed.conversation || {};
2990
3031
  const tools = parsed.tools || {};
2991
3032
  const toolItems = Array.isArray(tools.items) ? tools.items : [];
@@ -3094,7 +3135,13 @@ const summarizeMemoryMessagesForSideChannel = (messages = []) => {
3094
3135
  return Object.fromEntries(Object.entries(summary).filter(([, value]) => value !== undefined));
3095
3136
  }
3096
3137
  catch {
3097
- return summary;
3138
+ const content = messageContentOf(firstSystem);
3139
+ return cleanContextValue({
3140
+ ...summary,
3141
+ contextChars: content.length || undefined,
3142
+ contextPreview: content ? truncate(content, 260) : undefined,
3143
+ visualSummaryStatus: 'unparsed',
3144
+ });
3098
3145
  }
3099
3146
  };
3100
3147
  const contextSizeOfMessages = (messages = []) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-tembory",
3
- "version": "1.1.35",
3
+ "version": "1.1.36",
4
4
  "description": "Tembory node for n8n AI Agents with operational memory, tool history and decision state",
5
5
  "license": "MIT",
6
6
  "homepage": "https://tembory.com",