n8n-nodes-smart-memory 1.0.2 → 1.0.4
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/dist/SmartMemory.d.ts +0 -1
- package/dist/SmartMemory.d.ts.map +1 -1
- package/dist/SmartMemory.js +12 -33
- package/dist/SmartMemory.js.map +1 -1
- package/dist/SmartMemory.node.d.ts +7 -0
- package/dist/SmartMemory.node.d.ts.map +1 -1
- package/dist/SmartMemory.node.js +20 -12
- package/dist/SmartMemory.node.js.map +1 -1
- package/dist/storage/GoogleSheetsStorage.d.ts +7 -4
- package/dist/storage/GoogleSheetsStorage.d.ts.map +1 -1
- package/dist/storage/GoogleSheetsStorage.js +93 -10
- package/dist/storage/GoogleSheetsStorage.js.map +1 -1
- package/dist/storage/RedisStorage.d.ts +13 -4
- package/dist/storage/RedisStorage.d.ts.map +1 -1
- package/dist/storage/RedisStorage.js +37 -10
- package/dist/storage/RedisStorage.js.map +1 -1
- package/dist/utils/ExpressionEvaluator.d.ts +7 -1
- package/dist/utils/ExpressionEvaluator.d.ts.map +1 -1
- package/dist/utils/ExpressionEvaluator.js +20 -18
- package/dist/utils/ExpressionEvaluator.js.map +1 -1
- package/package.json +2 -6
package/dist/SmartMemory.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SmartMemory.d.ts","sourceRoot":"","sources":["../src/SmartMemory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"SmartMemory.d.ts","sourceRoot":"","sources":["../src/SmartMemory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAiC1F,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAgB;gBAEnB,MAAM,EAAE,mBAAmB;IAiBjC,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAiBrD,SAAS;YAIT,eAAe;YAsCf,oBAAoB;YAOpB,kBAAkB;CAwDjC"}
|
package/dist/SmartMemory.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PureMemoryManager = void 0;
|
|
4
4
|
const InMemoryStorage_1 = require("./storage/InMemoryStorage");
|
|
5
|
+
const ExpressionEvaluator_1 = require("./utils/ExpressionEvaluator");
|
|
5
6
|
// Import placeholder implementations for now
|
|
6
7
|
// import { GoogleSheetsStorage } from './storage/GoogleSheetsStorage';
|
|
7
8
|
// import { RedisStorage } from './storage/RedisStorage';
|
|
@@ -75,9 +76,9 @@ class PureMemoryManager {
|
|
|
75
76
|
};
|
|
76
77
|
// Only add private user info for private chats
|
|
77
78
|
if (chat.type === 'private' && !isBotResponse && user) {
|
|
78
|
-
const displayName =
|
|
79
|
+
const displayName = ExpressionEvaluator_1.ExpressionEvaluator.evaluateExpression(inputData, this.config.userFieldMapping.displayName);
|
|
79
80
|
const username = this.config.userFieldMapping.username ?
|
|
80
|
-
|
|
81
|
+
ExpressionEvaluator_1.ExpressionEvaluator.evaluateExpression(inputData, this.config.userFieldMapping.username) :
|
|
81
82
|
undefined;
|
|
82
83
|
// Create the object conditionally to avoid exactOptionalPropertyTypes issue
|
|
83
84
|
const privateUserInfo = {
|
|
@@ -106,9 +107,9 @@ class PureMemoryManager {
|
|
|
106
107
|
// Add user info for user messages in groups
|
|
107
108
|
if (!isBotResponse && memory.chatInfo.chatType !== 'private' && message.from) {
|
|
108
109
|
newMessage.userInfo = {
|
|
109
|
-
displayName:
|
|
110
|
+
displayName: ExpressionEvaluator_1.ExpressionEvaluator.evaluateExpression(inputData, this.config.userFieldMapping.displayName),
|
|
110
111
|
username: this.config.userFieldMapping.username ?
|
|
111
|
-
|
|
112
|
+
ExpressionEvaluator_1.ExpressionEvaluator.evaluateExpression(inputData, this.config.userFieldMapping.username) :
|
|
112
113
|
undefined,
|
|
113
114
|
};
|
|
114
115
|
}
|
|
@@ -117,9 +118,9 @@ class PureMemoryManager {
|
|
|
117
118
|
const replyUser = message.reply_to_message.from;
|
|
118
119
|
if (replyUser) {
|
|
119
120
|
newMessage.replyInfo = {
|
|
120
|
-
replyToDisplayName:
|
|
121
|
+
replyToDisplayName: ExpressionEvaluator_1.ExpressionEvaluator.evaluateExpression({ message: { from: replyUser } }, this.config.userFieldMapping.displayName),
|
|
121
122
|
replyToUsername: this.config.userFieldMapping.username ?
|
|
122
|
-
|
|
123
|
+
ExpressionEvaluator_1.ExpressionEvaluator.evaluateExpression({ message: { from: replyUser } }, this.config.userFieldMapping.username) :
|
|
123
124
|
undefined,
|
|
124
125
|
replyToMessage: message.reply_to_message.text ||
|
|
125
126
|
message.reply_to_message.caption ||
|
|
@@ -127,37 +128,15 @@ class PureMemoryManager {
|
|
|
127
128
|
};
|
|
128
129
|
}
|
|
129
130
|
}
|
|
131
|
+
// Add the new message to the existing messages
|
|
132
|
+
const updatedMessages = [...memory.messages, newMessage];
|
|
133
|
+
// Apply memory window size - keep only the last N messages
|
|
134
|
+
const trimmedMessages = updatedMessages.slice(-this.config.memoryWindowSize);
|
|
130
135
|
return {
|
|
131
136
|
...memory,
|
|
132
|
-
messages:
|
|
137
|
+
messages: trimmedMessages,
|
|
133
138
|
};
|
|
134
139
|
}
|
|
135
|
-
evaluateExpression(data, expression) {
|
|
136
|
-
// Simple expression evaluator - in real implementation, use n8n's expression system
|
|
137
|
-
// Examples: "={{ $json.message.from.first_name + ' ' + $json.message.from.last_name }}"
|
|
138
|
-
// "={{ $json.message.from.username }}"
|
|
139
|
-
try {
|
|
140
|
-
// This would integrate with n8n's expression system
|
|
141
|
-
if (expression.startsWith('={{ ') && expression.endsWith(' }}')) {
|
|
142
|
-
// Extract the expression part
|
|
143
|
-
const expr = expression.slice(3, -2);
|
|
144
|
-
// Simple evaluation for common cases
|
|
145
|
-
if (expr.includes('$json.message.from.first_name') && expr.includes('$json.message.from.last_name')) {
|
|
146
|
-
const firstName = data.message?.from?.first_name || '';
|
|
147
|
-
const lastName = data.message?.from?.last_name || '';
|
|
148
|
-
return `${firstName} ${lastName}`.trim();
|
|
149
|
-
}
|
|
150
|
-
if (expr.includes('$json.message.from.username')) {
|
|
151
|
-
return data.message?.from?.username || '';
|
|
152
|
-
}
|
|
153
|
-
return expr;
|
|
154
|
-
}
|
|
155
|
-
return expression;
|
|
156
|
-
}
|
|
157
|
-
catch {
|
|
158
|
-
return '';
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
140
|
}
|
|
162
141
|
exports.PureMemoryManager = PureMemoryManager;
|
|
163
142
|
//# sourceMappingURL=SmartMemory.js.map
|
package/dist/SmartMemory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SmartMemory.js","sourceRoot":"","sources":["../src/SmartMemory.ts"],"names":[],"mappings":";;;AACA,+DAA4D;
|
|
1
|
+
{"version":3,"file":"SmartMemory.js","sourceRoot":"","sources":["../src/SmartMemory.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,12 @@ import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription
|
|
|
2
2
|
export declare class SmartMemory implements INodeType {
|
|
3
3
|
description: INodeTypeDescription;
|
|
4
4
|
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
5
|
+
/**
|
|
6
|
+
* Estimates the token count for a given memory structure
|
|
7
|
+
* This is a rough approximation - actual token count depends on the specific tokenizer used
|
|
8
|
+
* @param memory The memory structure to estimate tokens for
|
|
9
|
+
* @returns Estimated token count
|
|
10
|
+
*/
|
|
11
|
+
static estimateTokenCount(memory: any): number;
|
|
5
12
|
}
|
|
6
13
|
//# sourceMappingURL=SmartMemory.node.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SmartMemory.node.d.ts","sourceRoot":"","sources":["../src/SmartMemory.node.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,oBAAoB,EACrB,MAAM,+BAA+B,CAAC;AAIvC,qBAAa,WAAY,YAAW,SAAS;IAC3C,WAAW,EAAE,oBAAoB,CAqI/B;IAEI,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"SmartMemory.node.d.ts","sourceRoot":"","sources":["../src/SmartMemory.node.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,oBAAoB,EACrB,MAAM,+BAA+B,CAAC;AAIvC,qBAAa,WAAY,YAAW,SAAS;IAC3C,WAAW,EAAE,oBAAoB,CAqI/B;IAEI,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;IA4FvE;;;;;OAKG;IACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM;CAI/C"}
|
package/dist/SmartMemory.node.js
CHANGED
|
@@ -9,7 +9,7 @@ class SmartMemory {
|
|
|
9
9
|
name: 'smartMemory',
|
|
10
10
|
icon: 'fa:brain',
|
|
11
11
|
group: ['transform'],
|
|
12
|
-
version: 1
|
|
12
|
+
version: 1,
|
|
13
13
|
description: 'Configuration-driven memory management for chatbots',
|
|
14
14
|
defaults: {
|
|
15
15
|
name: 'Smart Memory',
|
|
@@ -135,8 +135,9 @@ class SmartMemory {
|
|
|
135
135
|
storageBackend: this.getNodeParameter('storageBackend', 0),
|
|
136
136
|
assistantRole: this.getNodeParameter('assistantRole', 0),
|
|
137
137
|
userFieldMapping: {
|
|
138
|
-
|
|
139
|
-
|
|
138
|
+
// Don't use expressions here, just field names
|
|
139
|
+
displayName: 'userDisplayName',
|
|
140
|
+
username: 'userUsername',
|
|
140
141
|
},
|
|
141
142
|
includeReplyContext: this.getNodeParameter('includeReplyContext', 0),
|
|
142
143
|
enableSemanticMemory: false,
|
|
@@ -157,6 +158,8 @@ class SmartMemory {
|
|
|
157
158
|
const messageContent = this.getNodeParameter('messageContent', i);
|
|
158
159
|
const isBotResponse = this.getNodeParameter('isBotResponse', i);
|
|
159
160
|
const replyToMessage = this.getNodeParameter('replyToMessage', i);
|
|
161
|
+
// Create a display name from first and last name
|
|
162
|
+
const userDisplayName = [userFirstName, userLastName].filter(Boolean).join(' ').trim();
|
|
160
163
|
// Create standardized input data
|
|
161
164
|
const inputData = {
|
|
162
165
|
message: {
|
|
@@ -171,6 +174,7 @@ class SmartMemory {
|
|
|
171
174
|
first_name: userFirstName,
|
|
172
175
|
last_name: userLastName,
|
|
173
176
|
username: userUsername,
|
|
177
|
+
displayName: userDisplayName, // Add pre-computed display name
|
|
174
178
|
} : undefined,
|
|
175
179
|
text: messageContent,
|
|
176
180
|
reply_to_message: replyToMessage,
|
|
@@ -178,16 +182,15 @@ class SmartMemory {
|
|
|
178
182
|
bot_response: isBotResponse ? messageContent : undefined,
|
|
179
183
|
};
|
|
180
184
|
// Process the message
|
|
181
|
-
|
|
182
|
-
// Apply memory window size
|
|
183
|
-
memory.messages = memory.messages.slice(-config.memoryWindowSize);
|
|
185
|
+
const memory = await memoryManager.processMessage(inputData);
|
|
184
186
|
// Build output
|
|
185
187
|
const output = {
|
|
186
188
|
chatId: memory.chatInfo.chatId,
|
|
187
189
|
chatType: memory.chatInfo.chatType,
|
|
188
190
|
memory: memory,
|
|
189
191
|
messageCount: memory.messages.length,
|
|
190
|
-
|
|
192
|
+
// Use a static method to estimate token count
|
|
193
|
+
tokenEstimate: SmartMemory.estimateTokenCount(memory),
|
|
191
194
|
};
|
|
192
195
|
returnData.push({
|
|
193
196
|
json: output,
|
|
@@ -205,11 +208,16 @@ class SmartMemory {
|
|
|
205
208
|
}
|
|
206
209
|
return [returnData];
|
|
207
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* Estimates the token count for a given memory structure
|
|
213
|
+
* This is a rough approximation - actual token count depends on the specific tokenizer used
|
|
214
|
+
* @param memory The memory structure to estimate tokens for
|
|
215
|
+
* @returns Estimated token count
|
|
216
|
+
*/
|
|
217
|
+
static estimateTokenCount(memory) {
|
|
218
|
+
const text = JSON.stringify(memory);
|
|
219
|
+
return Math.ceil(text.length / 4);
|
|
220
|
+
}
|
|
208
221
|
}
|
|
209
222
|
exports.SmartMemory = SmartMemory;
|
|
210
|
-
// Helper function outside the class
|
|
211
|
-
function estimateTokenCount(memory) {
|
|
212
|
-
const text = JSON.stringify(memory);
|
|
213
|
-
return Math.ceil(text.length / 4);
|
|
214
|
-
}
|
|
215
223
|
//# sourceMappingURL=SmartMemory.node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SmartMemory.node.js","sourceRoot":"","sources":["../src/SmartMemory.node.ts"],"names":[],"mappings":";;;AAMA,+CAAkD;AAGlD,MAAa,WAAW;IAAxB;QACE,gBAAW,GAAyB;YAClC,WAAW,EAAE,cAAc;YAC3B,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,CAAC,WAAW,CAAC;YACpB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"SmartMemory.node.js","sourceRoot":"","sources":["../src/SmartMemory.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { CleanMemoryStructure } from '../interfaces/MemoryInterfaces';
|
|
2
1
|
import { MemoryStorage } from './MemoryStorage';
|
|
2
|
+
import { CleanMemoryStructure } from '../interfaces/MemoryInterfaces';
|
|
3
3
|
export declare class GoogleSheetsStorage implements MemoryStorage {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
private spreadsheetId;
|
|
5
|
+
private sheetName;
|
|
6
|
+
constructor(spreadsheetId: string, sheetName?: string);
|
|
7
|
+
getMemory(chatId: string): Promise<CleanMemoryStructure | null>;
|
|
8
|
+
saveMemory(chatId: string, memory: CleanMemoryStructure): Promise<void>;
|
|
9
|
+
clearMemory(chatId: string): Promise<void>;
|
|
7
10
|
}
|
|
8
11
|
//# sourceMappingURL=GoogleSheetsStorage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleSheetsStorage.d.ts","sourceRoot":"","sources":["../../src/storage/GoogleSheetsStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"GoogleSheetsStorage.d.ts","sourceRoot":"","sources":["../../src/storage/GoogleSheetsStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,aAAa,EAAE,MAAM,EAAE,SAAS,GAAE,MAAiB;IAKzD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAkC/D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCvE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBjD"}
|
|
@@ -2,18 +2,101 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GoogleSheetsStorage = void 0;
|
|
4
4
|
class GoogleSheetsStorage {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return null;
|
|
5
|
+
constructor(spreadsheetId, sheetName = 'Memory') {
|
|
6
|
+
this.spreadsheetId = spreadsheetId;
|
|
7
|
+
this.sheetName = sheetName;
|
|
9
8
|
}
|
|
10
|
-
async
|
|
11
|
-
//
|
|
12
|
-
|
|
9
|
+
async getMemory(chatId) {
|
|
10
|
+
// Implementation would use Google Sheets API
|
|
11
|
+
// This is a placeholder implementation that uses the mocked gapi
|
|
12
|
+
try {
|
|
13
|
+
// For testing purposes, we'll use the global gapi if it exists
|
|
14
|
+
const gapi = global.gapi;
|
|
15
|
+
if (gapi && gapi.client && gapi.client.sheets) {
|
|
16
|
+
// Fetch data from Google Sheets
|
|
17
|
+
const response = await gapi.client.sheets.spreadsheets.values.get({
|
|
18
|
+
spreadsheetId: this.spreadsheetId,
|
|
19
|
+
range: `${this.sheetName}!A:Z`,
|
|
20
|
+
});
|
|
21
|
+
// Find row with matching chatId
|
|
22
|
+
const values = response.result.values || [];
|
|
23
|
+
for (const row of values) {
|
|
24
|
+
if (row[0] === chatId) {
|
|
25
|
+
return JSON.parse(row[1]);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// If gapi is not available (e.g., in production), log and return null
|
|
32
|
+
console.log(`Getting memory for chat ${chatId} from Google Sheets (ID: ${this.spreadsheetId}, Sheet: ${this.sheetName})`);
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.error('Error getting memory from Google Sheets:', error);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
13
40
|
}
|
|
14
|
-
async
|
|
15
|
-
//
|
|
16
|
-
|
|
41
|
+
async saveMemory(chatId, memory) {
|
|
42
|
+
// Implementation would use Google Sheets API
|
|
43
|
+
// This is a placeholder implementation that uses the mocked gapi
|
|
44
|
+
try {
|
|
45
|
+
// For testing purposes, we'll use the global gapi if it exists
|
|
46
|
+
const gapi = global.gapi;
|
|
47
|
+
if (gapi && gapi.client && gapi.client.sheets) {
|
|
48
|
+
// Check if chatId exists
|
|
49
|
+
const existingMemory = await this.getMemory(chatId);
|
|
50
|
+
if (existingMemory) {
|
|
51
|
+
// Update existing row
|
|
52
|
+
// This is simplified - in a real implementation, we'd need to find the row number
|
|
53
|
+
await gapi.client.sheets.spreadsheets.values.update({
|
|
54
|
+
spreadsheetId: this.spreadsheetId,
|
|
55
|
+
range: `${this.sheetName}!A:Z`,
|
|
56
|
+
valueInputOption: 'USER_ENTERED',
|
|
57
|
+
resource: { values: [[chatId, JSON.stringify(memory)]] }
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Append new row
|
|
62
|
+
await gapi.client.sheets.spreadsheets.values.append({
|
|
63
|
+
spreadsheetId: this.spreadsheetId,
|
|
64
|
+
range: `${this.sheetName}!A:Z`,
|
|
65
|
+
valueInputOption: 'USER_ENTERED',
|
|
66
|
+
resource: { values: [[chatId, JSON.stringify(memory)]] }
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// If gapi is not available (e.g., in production), log and return
|
|
72
|
+
console.log(`Saving memory for chat ${chatId} to Google Sheets (ID: ${this.spreadsheetId}, Sheet: ${this.sheetName})`);
|
|
73
|
+
console.log(`Memory contains ${memory.messages.length} messages`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
console.error('Error saving memory to Google Sheets:', error);
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async clearMemory(chatId) {
|
|
82
|
+
// Implementation would find and delete the row with the matching chatId
|
|
83
|
+
try {
|
|
84
|
+
// For testing purposes, we'll use the global gapi if it exists
|
|
85
|
+
const gapi = global.gapi;
|
|
86
|
+
if (gapi && gapi.client && gapi.client.sheets) {
|
|
87
|
+
// Find row with matching chatId
|
|
88
|
+
// Delete the row
|
|
89
|
+
// This is a simplified implementation
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// If gapi is not available (e.g., in production), log and return
|
|
93
|
+
console.log(`Clearing memory for chat ${chatId} from Google Sheets (ID: ${this.spreadsheetId}, Sheet: ${this.sheetName})`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.error('Error clearing memory from Google Sheets:', error);
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
17
100
|
}
|
|
18
101
|
}
|
|
19
102
|
exports.GoogleSheetsStorage = GoogleSheetsStorage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleSheetsStorage.js","sourceRoot":"","sources":["../../src/storage/GoogleSheetsStorage.ts"],"names":[],"mappings":";;;AAGA,MAAa,mBAAmB;
|
|
1
|
+
{"version":3,"file":"GoogleSheetsStorage.js","sourceRoot":"","sources":["../../src/storage/GoogleSheetsStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
import { CleanMemoryStructure } from '../interfaces/MemoryInterfaces';
|
|
2
1
|
import { MemoryStorage } from './MemoryStorage';
|
|
2
|
+
import { CleanMemoryStructure } from '../interfaces/MemoryInterfaces';
|
|
3
3
|
export declare class RedisStorage implements MemoryStorage {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
private client;
|
|
5
|
+
private keyPrefix;
|
|
6
|
+
constructor(redisClient: any, keyPrefix?: string);
|
|
7
|
+
/**
|
|
8
|
+
* Generates a Redis key for a given chat ID
|
|
9
|
+
* @param chatId The chat ID
|
|
10
|
+
* @returns The Redis key
|
|
11
|
+
*/
|
|
12
|
+
private getKey;
|
|
13
|
+
getMemory(chatId: string): Promise<CleanMemoryStructure | null>;
|
|
14
|
+
saveMemory(chatId: string, memory: CleanMemoryStructure): Promise<void>;
|
|
15
|
+
clearMemory(chatId: string): Promise<void>;
|
|
7
16
|
}
|
|
8
17
|
//# sourceMappingURL=RedisStorage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisStorage.d.ts","sourceRoot":"","sources":["../../src/storage/RedisStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"RedisStorage.d.ts","sourceRoot":"","sources":["../../src/storage/RedisStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,SAAS,CAAS;gBAEd,WAAW,EAAE,GAAG,EAAE,SAAS,GAAE,MAAuB;IAKhE;;;;OAIG;IACH,OAAO,CAAC,MAAM;IAIR,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAU/D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IASvE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQjD"}
|
|
@@ -2,18 +2,45 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RedisStorage = void 0;
|
|
4
4
|
class RedisStorage {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return null;
|
|
5
|
+
constructor(redisClient, keyPrefix = 'smartMemory:') {
|
|
6
|
+
this.client = redisClient;
|
|
7
|
+
this.keyPrefix = keyPrefix;
|
|
9
8
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Generates a Redis key for a given chat ID
|
|
11
|
+
* @param chatId The chat ID
|
|
12
|
+
* @returns The Redis key
|
|
13
|
+
*/
|
|
14
|
+
getKey(chatId) {
|
|
15
|
+
return `${this.keyPrefix}${chatId}`;
|
|
13
16
|
}
|
|
14
|
-
async
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
async getMemory(chatId) {
|
|
18
|
+
try {
|
|
19
|
+
const data = await this.client.get(this.getKey(chatId));
|
|
20
|
+
return data ? JSON.parse(data) : null;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
console.error('Error getting memory from Redis:', error);
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async saveMemory(chatId, memory) {
|
|
28
|
+
try {
|
|
29
|
+
await this.client.set(this.getKey(chatId), JSON.stringify(memory));
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error('Error saving memory to Redis:', error);
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async clearMemory(chatId) {
|
|
37
|
+
try {
|
|
38
|
+
await this.client.del(this.getKey(chatId));
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error('Error clearing memory from Redis:', error);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
17
44
|
}
|
|
18
45
|
}
|
|
19
46
|
exports.RedisStorage = RedisStorage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RedisStorage.js","sourceRoot":"","sources":["../../src/storage/RedisStorage.ts"],"names":[],"mappings":";;;AAGA,MAAa,YAAY;
|
|
1
|
+
{"version":3,"file":"RedisStorage.js","sourceRoot":"","sources":["../../src/storage/RedisStorage.ts"],"names":[],"mappings":";;;AAGA,MAAa,YAAY;IAIvB,YAAY,WAAgB,EAAE,YAAoB,cAAc;QAC9D,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,MAAc;QAC3B,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,MAA4B;QAC3D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YAC1D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AA7CD,oCA6CC"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
export declare class ExpressionEvaluator {
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Evaluates simple expressions for user field mapping
|
|
4
|
+
* @param data The input data
|
|
5
|
+
* @param fieldName The field name to evaluate
|
|
6
|
+
* @returns The evaluated value
|
|
7
|
+
*/
|
|
8
|
+
static evaluateExpression(data: any, fieldName: string): string;
|
|
3
9
|
}
|
|
4
10
|
//# sourceMappingURL=ExpressionEvaluator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpressionEvaluator.d.ts","sourceRoot":"","sources":["../../src/utils/ExpressionEvaluator.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"ExpressionEvaluator.d.ts","sourceRoot":"","sources":["../../src/utils/ExpressionEvaluator.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAmB;IAC9B;;;;;OAKG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;CAwBhE"}
|
|
@@ -2,27 +2,29 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ExpressionEvaluator = void 0;
|
|
4
4
|
class ExpressionEvaluator {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Evaluates simple expressions for user field mapping
|
|
7
|
+
* @param data The input data
|
|
8
|
+
* @param fieldName The field name to evaluate
|
|
9
|
+
* @returns The evaluated value
|
|
10
|
+
*/
|
|
11
|
+
static evaluateExpression(data, fieldName) {
|
|
9
12
|
try {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
// Simple evaluation for common cases
|
|
15
|
-
if (expr.includes('$json.message.from.first_name') && expr.includes('$json.message.from.last_name')) {
|
|
16
|
-
const firstName = _data.message?.from?.first_name || '';
|
|
17
|
-
const lastName = _data.message?.from?.last_name || '';
|
|
18
|
-
return `${firstName} ${lastName}`.trim();
|
|
13
|
+
if (fieldName === 'userDisplayName') {
|
|
14
|
+
// First check if displayName is already computed
|
|
15
|
+
if (data.message?.from?.displayName) {
|
|
16
|
+
return data.message.from.displayName;
|
|
19
17
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
// Otherwise, construct it from first_name and last_name
|
|
19
|
+
return [data.message?.from?.first_name, data.message?.from?.last_name]
|
|
20
|
+
.filter(Boolean)
|
|
21
|
+
.join(' ')
|
|
22
|
+
.trim() || '';
|
|
23
|
+
}
|
|
24
|
+
if (fieldName === 'userUsername') {
|
|
25
|
+
return data.message?.from?.username || '';
|
|
24
26
|
}
|
|
25
|
-
return
|
|
27
|
+
return '';
|
|
26
28
|
}
|
|
27
29
|
catch {
|
|
28
30
|
return '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpressionEvaluator.js","sourceRoot":"","sources":["../../src/utils/ExpressionEvaluator.ts"],"names":[],"mappings":";;;AAAA,MAAa,mBAAmB;IAC9B,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"ExpressionEvaluator.js","sourceRoot":"","sources":["../../src/utils/ExpressionEvaluator.ts"],"names":[],"mappings":";;;AAAA,MAAa,mBAAmB;IAC9B;;;;;OAKG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAS,EAAE,SAAiB;QACpD,IAAI,CAAC;YACH,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;gBACpC,iDAAiD;gBACjD,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;oBACpC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;gBACvC,CAAC;gBAED,wDAAwD;gBACxD,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC;qBACnE,MAAM,CAAC,OAAO,CAAC;qBACf,IAAI,CAAC,GAAG,CAAC;qBACT,IAAI,EAAE,IAAI,EAAE,CAAC;YAClB,CAAC;YAED,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;YAC5C,CAAC;YAED,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF;AA/BD,kDA+BC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "n8n-nodes-smart-memory",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Flexible memory management node for n8n with support for multiple storage backends",
|
|
5
5
|
"main": "dist/SmartMemory.node.js",
|
|
6
6
|
"scripts": {
|
|
@@ -16,11 +16,7 @@
|
|
|
16
16
|
"n8n": {
|
|
17
17
|
"n8nNodesApiVersion": 1,
|
|
18
18
|
"nodes": [
|
|
19
|
-
|
|
20
|
-
"name": "Smart Memory",
|
|
21
|
-
"path": "./dist/SmartMemory.node.js",
|
|
22
|
-
"icon": "smart-memory-icon.svg"
|
|
23
|
-
}
|
|
19
|
+
"dist/SmartMemory.node.js"
|
|
24
20
|
]
|
|
25
21
|
},
|
|
26
22
|
"keywords": [
|