n8n-nodes-memory 0.5.1 → 0.6.1

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
@@ -1,6 +1,13 @@
1
1
  # n8n-nodes-memory
2
2
 
3
- Custom memory node for n8n AI Agent with external API support.
3
+ Custom memory nodes for n8n AI Agent with workflow-based storage.
4
+
5
+ ## Two Nodes
6
+
7
+ | Node | Use Case |
8
+ |------|----------|
9
+ | **Memory API** | External webhook/API as memory backend |
10
+ | **Memory Workflow** | Sub-workflow within n8n as memory backend |
4
11
 
5
12
  ## The Power: Memory as Workflows
6
13
 
@@ -81,6 +88,8 @@ Message types: `human` or `ai`
81
88
 
82
89
  ## Parameters
83
90
 
91
+ ### Memory API
92
+
84
93
  | Parameter | Description |
85
94
  |-----------|-------------|
86
95
  | API URL | Your memory webhook URL |
@@ -88,6 +97,14 @@ Message types: `human` or `ai`
88
97
  | API Key | Optional Bearer token |
89
98
  | Context Window Length | Messages to include (default: 10) |
90
99
 
100
+ ### Memory Workflow
101
+
102
+ | Parameter | Description |
103
+ |-----------|-------------|
104
+ | Workflow ID | ID of the sub-workflow to execute |
105
+ | Session ID | Unique conversation identifier |
106
+ | Context Window Length | Messages to include (default: 10) |
107
+
91
108
  ## How It Works
92
109
 
93
110
  Implements LangChain's `BaseListChatMessageHistory` with `BufferWindowMemory`. The AI Agent calls your workflows automatically during conversation.
package/dist/index.d.ts CHANGED
@@ -1 +1,2 @@
1
- export { Memory } from './nodes/Memory/Memory.node';
1
+ export { MemoryApi } from './nodes/Memory/MemoryApi.node';
2
+ export { MemoryWorkflow } from './nodes/Memory/MemoryWorkflow.node';
package/dist/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Memory = void 0;
4
- var Memory_node_1 = require("./nodes/Memory/Memory.node");
5
- Object.defineProperty(exports, "Memory", { enumerable: true, get: function () { return Memory_node_1.Memory; } });
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQW9EO0FBQTNDLHFHQUFBLE1BQU0sT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IE1lbW9yeSB9IGZyb20gJy4vbm9kZXMvTWVtb3J5L01lbW9yeS5ub2RlJztcbiJdfQ==
3
+ exports.MemoryWorkflow = exports.MemoryApi = void 0;
4
+ var MemoryApi_node_1 = require("./nodes/Memory/MemoryApi.node");
5
+ Object.defineProperty(exports, "MemoryApi", { enumerable: true, get: function () { return MemoryApi_node_1.MemoryApi; } });
6
+ var MemoryWorkflow_node_1 = require("./nodes/Memory/MemoryWorkflow.node");
7
+ Object.defineProperty(exports, "MemoryWorkflow", { enumerable: true, get: function () { return MemoryWorkflow_node_1.MemoryWorkflow; } });
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0VBQTBEO0FBQWpELDJHQUFBLFNBQVMsT0FBQTtBQUNsQiwwRUFBb0U7QUFBM0QscUhBQUEsY0FBYyxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgTWVtb3J5QXBpIH0gZnJvbSAnLi9ub2Rlcy9NZW1vcnkvTWVtb3J5QXBpLm5vZGUnO1xuZXhwb3J0IHsgTWVtb3J5V29ya2Zsb3cgfSBmcm9tICcuL25vZGVzL01lbW9yeS9NZW1vcnlXb3JrZmxvdy5ub2RlJztcbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import type { INodeType, INodeTypeDescription, ISupplyDataFunctions, SupplyData } from 'n8n-workflow';
2
- export declare class Memory implements INodeType {
2
+ export declare class MemoryApi implements INodeType {
3
3
  description: INodeTypeDescription;
4
4
  supplyData(this: ISupplyDataFunctions, itemIndex: number): Promise<SupplyData>;
5
5
  }
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryApi = void 0;
4
+ const memory_1 = require("langchain/memory");
5
+ const chat_history_1 = require("@langchain/core/chat_history");
6
+ const messages_1 = require("@langchain/core/messages");
7
+ class ApiChatHistory extends chat_history_1.BaseListChatMessageHistory {
8
+ constructor(apiUrl, sessionId, apiKey) {
9
+ super();
10
+ this.apiUrl = apiUrl;
11
+ this.sessionId = sessionId;
12
+ this.apiKey = apiKey;
13
+ this.lc_namespace = ['langchain', 'stores', 'message', 'api'];
14
+ }
15
+ getHeaders() {
16
+ const headers = {
17
+ 'Content-Type': 'application/json',
18
+ };
19
+ if (this.apiKey) {
20
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
21
+ }
22
+ return headers;
23
+ }
24
+ async getMessages() {
25
+ console.log('[ApiChatHistory] getMessages called for session:', this.sessionId);
26
+ try {
27
+ console.log('[ApiChatHistory] Fetching from:', this.apiUrl);
28
+ const response = await fetch(this.apiUrl, {
29
+ method: 'POST',
30
+ headers: this.getHeaders(),
31
+ body: JSON.stringify({
32
+ action: 'get',
33
+ sessionId: this.sessionId,
34
+ }),
35
+ });
36
+ if (!response.ok) {
37
+ console.error(`[ApiChatHistory] API error: ${response.status}`);
38
+ return [];
39
+ }
40
+ const data = await response.json();
41
+ const messages = data?.messages ?? [];
42
+ console.log('[ApiChatHistory] Got messages:', messages.length);
43
+ return messages.map((m) => {
44
+ if (m.type === 'human') {
45
+ return new messages_1.HumanMessage(m.content);
46
+ }
47
+ else {
48
+ return new messages_1.AIMessage(m.content);
49
+ }
50
+ });
51
+ }
52
+ catch (error) {
53
+ console.error('[ApiChatHistory] getMessages error:', error);
54
+ return [];
55
+ }
56
+ }
57
+ async addMessage(message) {
58
+ console.log('[ApiChatHistory] addMessage called for session:', this.sessionId);
59
+ try {
60
+ const type = message._getType() === 'human' ? 'human' : 'ai';
61
+ await fetch(this.apiUrl, {
62
+ method: 'POST',
63
+ headers: this.getHeaders(),
64
+ body: JSON.stringify({
65
+ action: 'add',
66
+ sessionId: this.sessionId,
67
+ message: {
68
+ type,
69
+ content: message.content,
70
+ },
71
+ }),
72
+ });
73
+ console.log('[ApiChatHistory] Message added successfully');
74
+ }
75
+ catch (error) {
76
+ console.error('[ApiChatHistory] addMessage error:', error);
77
+ }
78
+ }
79
+ async addMessages(messages) {
80
+ for (const message of messages) {
81
+ await this.addMessage(message);
82
+ }
83
+ }
84
+ async clear() {
85
+ console.log('[ApiChatHistory] clear called for session:', this.sessionId);
86
+ try {
87
+ await fetch(this.apiUrl, {
88
+ method: 'POST',
89
+ headers: this.getHeaders(),
90
+ body: JSON.stringify({
91
+ action: 'clear',
92
+ sessionId: this.sessionId,
93
+ }),
94
+ });
95
+ }
96
+ catch (error) {
97
+ console.error('[ApiChatHistory] clear error:', error);
98
+ }
99
+ }
100
+ }
101
+ class MemoryApi {
102
+ constructor() {
103
+ this.description = {
104
+ displayName: 'Memory API',
105
+ name: 'memoryApi',
106
+ icon: 'fa:brain',
107
+ group: ['transform'],
108
+ version: 1,
109
+ subtitle: 'External API Memory',
110
+ description: 'Use an external API as chat memory storage',
111
+ defaults: {
112
+ name: 'Memory API',
113
+ },
114
+ codex: {
115
+ categories: ['AI'],
116
+ subcategories: {
117
+ AI: ['Memory'],
118
+ },
119
+ resources: {
120
+ primaryDocumentation: [
121
+ {
122
+ url: 'https://github.com/filipexyz/n8n-nodes-memory',
123
+ },
124
+ ],
125
+ },
126
+ },
127
+ inputs: [],
128
+ outputs: ['ai_memory'],
129
+ outputNames: ['Memory'],
130
+ properties: [
131
+ {
132
+ displayName: 'API URL',
133
+ name: 'apiUrl',
134
+ type: 'string',
135
+ default: '',
136
+ required: true,
137
+ description: 'URL of the memory API (e.g., n8n webhook URL)',
138
+ placeholder: 'https://your-n8n.com/webhook/memory',
139
+ },
140
+ {
141
+ displayName: 'Session ID',
142
+ name: 'sessionId',
143
+ type: 'string',
144
+ default: '={{ $json.sessionId }}',
145
+ required: true,
146
+ description: 'Unique identifier for the conversation session',
147
+ },
148
+ {
149
+ displayName: 'API Key',
150
+ name: 'apiKey',
151
+ type: 'string',
152
+ typeOptions: {
153
+ password: true,
154
+ },
155
+ default: '',
156
+ description: 'Optional API key for authentication',
157
+ },
158
+ {
159
+ displayName: 'Context Window Length',
160
+ name: 'contextWindowLength',
161
+ type: 'number',
162
+ default: 10,
163
+ description: 'Number of previous messages to include as context',
164
+ },
165
+ ],
166
+ };
167
+ }
168
+ async supplyData(itemIndex) {
169
+ const apiUrl = this.getNodeParameter('apiUrl', itemIndex);
170
+ const sessionId = this.getNodeParameter('sessionId', itemIndex);
171
+ const apiKey = this.getNodeParameter('apiKey', itemIndex, '') || undefined;
172
+ const contextWindowLength = this.getNodeParameter('contextWindowLength', itemIndex, 10);
173
+ console.log('[Memory API] Creating memory for session:', sessionId);
174
+ const chatHistory = new ApiChatHistory(apiUrl, sessionId, apiKey);
175
+ const memory = new memory_1.BufferWindowMemory({
176
+ memoryKey: 'chat_history',
177
+ chatHistory,
178
+ returnMessages: true,
179
+ inputKey: 'input',
180
+ outputKey: 'output',
181
+ k: contextWindowLength,
182
+ });
183
+ return {
184
+ response: memory,
185
+ };
186
+ }
187
+ }
188
+ exports.MemoryApi = MemoryApi;
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5QXBpLm5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbm9kZXMvTWVtb3J5L01lbW9yeUFwaS5ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLDZDQUFzRDtBQUN0RCwrREFBMEU7QUFDMUUsdURBSWtDO0FBRWxDLE1BQU0sY0FBZSxTQUFRLHlDQUEwQjtJQUdyRCxZQUNVLE1BQWMsRUFDZCxTQUFpQixFQUNqQixNQUFlO1FBRXZCLEtBQUssRUFBRSxDQUFDO1FBSkEsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDakIsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUx6QixpQkFBWSxHQUFHLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFRekQsQ0FBQztJQUVPLFVBQVU7UUFDaEIsTUFBTSxPQUFPLEdBQTJCO1lBQ3RDLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkMsQ0FBQztRQUNGLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXO1FBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrREFBa0QsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDO1lBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDeEMsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JB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LEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSwyQkFBa0IsQ0FBQztZQUNwQyxTQUFTLEVBQUUsY0FBYztZQUN6QixXQUFXO1lBQ1gsY0FBYyxFQUFFLElBQUk7WUFDcEIsUUFBUSxFQUFFLE9BQU87WUFDakIsU0FBUyxFQUFFLFFBQVE7WUFDbkIsQ0FBQyxFQUFFLG1CQUFtQjtTQUN2QixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsUUFBUSxFQUFFLE1BQU07U0FDakIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTVGRCw4QkE0RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIElOb2RlVHlwZSxcbiAgSU5vZGVUeXBlRGVzY3JpcHRpb24sXG4gIElTdXBwbHlEYXRhRnVuY3Rpb25zLFxuICBTdXBwbHlEYXRhLFxufSBmcm9tICduOG4td29ya2Zsb3cnO1xuaW1wb3J0IHsgQnVmZmVyV2luZG93TWVtb3J5IH0gZnJvbSAnbGFuZ2NoYWluL21lbW9yeSc7XG5pbXBvcnQgeyBCYXNlTGlzdENoYXRNZXNzYWdlSGlzdG9yeSB9IGZyb20gJ0BsYW5nY2hhaW4vY29yZS9jaGF0X2hpc3RvcnknO1xuaW1wb3J0IHtcbiAgQmFzZU1lc3NhZ2UsXG4gIEh1bWFuTWVzc2FnZSxcbiAgQUlNZXNzYWdlLFxufSBmcm9tICdAbGFuZ2NoYWluL2NvcmUvbWVzc2FnZXMnO1xuXG5jbGFzcyBBcGlDaGF0SGlzdG9yeSBleHRlbmRzIEJhc2VMaXN0Q2hhdE1lc3NhZ2VIaXN0b3J5IHtcbiAgbGNfbmFtZXNwYWNlID0gWydsYW5nY2hhaW4nLCAnc3RvcmVzJywgJ21lc3NhZ2UnLCAnYXBpJ107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcGlVcmw6IHN0cmluZyxcbiAgICBwcml2YXRlIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIHByaXZhdGUgYXBpS2V5Pzogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH07XG4gICAgaWYgKHRoaXMuYXBpS2V5KSB7XG4gICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dGhpcy5hcGlLZXl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBhc3luYyBnZXRNZXNzYWdlcygpOiBQcm9taXNlPEJhc2VNZXNzYWdlW10+IHtcbiAgICBjb25zb2xlLmxvZygnW0FwaUNoYXRIaXN0b3J5XSBnZXRNZXNzYWdlcyBjYWxsZWQgZm9yIHNlc3Npb246JywgdGhpcy5zZXNzaW9uSWQpO1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZygnW0FwaUNoYXRIaXN0b3J5XSBGZXRjaGluZyBmcm9tOicsIHRoaXMuYXBpVXJsKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5hcGlVcmwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgYWN0aW9uOiAnZ2V0JyxcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtBcGlDaGF0SGlzdG9yeV0gQVBJIGVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIHsgbWVzc2FnZXM/OiBBcnJheTx7IHR5cGU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0+IH07XG4gICAgICBjb25zdCBtZXNzYWdlcyA9IGRhdGE/Lm1lc3NhZ2VzID8/IFtdO1xuICAgICAgY29uc29sZS5sb2coJ1tBcGlDaGF0SGlzdG9yeV0gR290IG1lc3NhZ2VzOicsIG1lc3NhZ2VzLmxlbmd0aCk7XG5cbiAgICAgIHJldHVybiBtZXNzYWdlcy5tYXAoKG06IHsgdHlwZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICBpZiAobS50eXBlID09PSAnaHVtYW4nKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBIdW1hbk1lc3NhZ2UobS5jb250ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEFJTWVzc2FnZShtLmNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignW0FwaUNoYXRIaXN0b3J5XSBnZXRNZXNzYWdlcyBlcnJvcjonLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkTWVzc2FnZShtZXNzYWdlOiBCYXNlTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCdbQXBpQ2hhdEhpc3RvcnldIGFkZE1lc3NhZ2UgY2FsbGVkIGZvciBzZXNzaW9uOicsIHRoaXMuc2Vzc2lvbklkKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHlwZSA9IG1lc3NhZ2UuX2dldFR5cGUoKSA9PT0gJ2h1bWFuJyA/ICdodW1hbicgOiAnYWknO1xuXG4gICAgICBhd2FpdCBmZXRjaCh0aGlzLmFwaVVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBhY3Rpb246ICdhZGQnLFxuICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgbWVzc2FnZToge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2UuY29udGVudCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5sb2coJ1tBcGlDaGF0SGlzdG9yeV0gTWVzc2FnZSBhZGRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignW0FwaUNoYXRIaXN0b3J5XSBhZGRNZXNzYWdlIGVycm9yOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRNZXNzYWdlcyhtZXNzYWdlczogQmFzZU1lc3NhZ2VbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgICAgYXdhaXQgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCdbQXBpQ2hhdEhpc3RvcnldIGNsZWFyIGNhbGxlZCBmb3Igc2Vzc2lvbjonLCB0aGlzLnNlc3Npb25JZCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZldGNoKHRoaXMuYXBpVXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGFjdGlvbjogJ2NsZWFyJyxcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbQXBpQ2hhdEhpc3RvcnldIGNsZWFyIGVycm9yOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1lbW9yeUFwaSBpbXBsZW1lbnRzIElOb2RlVHlwZSB7XG4gIGRlc2NyaXB0aW9uOiBJTm9kZVR5cGVEZXNjcmlwdGlvbiA9IHtcbiAgICBkaXNwbGF5TmFtZTogJ01lbW9yeSBBUEknLFxuICAgIG5hbWU6ICdtZW1vcnlBcGknLFxuICAgIGljb246ICdmYTpicmFpbicsXG4gICAgZ3JvdXA6IFsndHJhbnNmb3JtJ10sXG4gICAgdmVyc2lvbjogMSxcbiAgICBzdWJ0aXRsZTogJ0V4dGVybmFsIEFQSSBNZW1vcnknLFxuICAgIGRlc2NyaXB0aW9uOiAnVXNlIGFuIGV4dGVybmFsIEFQSSBhcyBjaGF0IG1lbW9yeSBzdG9yYWdlJyxcbiAgICBkZWZhdWx0czoge1xuICAgICAgbmFtZTogJ01lbW9yeSBBUEknLFxuICAgIH0sXG4gICAgY29kZXg6IHtcbiAgICAgIGNhdGVnb3JpZXM6IFsnQUknXSxcbiAgICAgIHN1YmNhdGVnb3JpZXM6IHtcbiAgICAgICAgQUk6IFsnTWVtb3J5J10sXG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIHByaW1hcnlEb2N1bWVudGF0aW9uOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9naXRodWIuY29tL2ZpbGlwZXh5ei9uOG4tbm9kZXMtbWVtb3J5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGlucHV0czogW10sXG4gICAgb3V0cHV0czogWydhaV9tZW1vcnknIGFzIGNvbnN0XSxcbiAgICBvdXRwdXROYW1lczogWydNZW1vcnknXSxcbiAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiAnQVBJIFVSTCcsXG4gICAgICAgIG5hbWU6ICdhcGlVcmwnLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogJycsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VSTCBvZiB0aGUgbWVtb3J5IEFQSSAoZS5nLiwgbjhuIHdlYmhvb2sgVVJMKScsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnaHR0cHM6Ly95b3VyLW44bi5jb20vd2ViaG9vay9tZW1vcnknLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGlzcGxheU5hbWU6ICdTZXNzaW9uIElEJyxcbiAgICAgICAgbmFtZTogJ3Nlc3Npb25JZCcsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiAnPXt7ICRqc29uLnNlc3Npb25JZCB9fScsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29udmVyc2F0aW9uIHNlc3Npb24nLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGlzcGxheU5hbWU6ICdBUEkgS2V5JyxcbiAgICAgICAgbmFtZTogJ2FwaUtleScsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICB0eXBlT3B0aW9uczoge1xuICAgICAgICAgIHBhc3N3b3JkOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdPcHRpb25hbCBBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkaXNwbGF5TmFtZTogJ0NvbnRleHQgV2luZG93IExlbmd0aCcsXG4gICAgICAgIG5hbWU6ICdjb250ZXh0V2luZG93TGVuZ3RoJyxcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGRlZmF1bHQ6IDEwLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBwcmV2aW91cyBtZXNzYWdlcyB0byBpbmNsdWRlIGFzIGNvbnRleHQnLFxuICAgICAgfSxcbiAgICBdLFxuICB9O1xuXG4gIGFzeW5jIHN1cHBseURhdGEoXG4gICAgdGhpczogSVN1cHBseURhdGFGdW5jdGlvbnMsXG4gICAgaXRlbUluZGV4OiBudW1iZXJcbiAgKTogUHJvbWlzZTxTdXBwbHlEYXRhPiB7XG4gICAgY29uc3QgYXBpVXJsID0gdGhpcy5nZXROb2RlUGFyYW1ldGVyKCdhcGlVcmwnLCBpdGVtSW5kZXgpIGFzIHN0cmluZztcbiAgICBjb25zdCBzZXNzaW9uSWQgPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ3Nlc3Npb25JZCcsIGl0ZW1JbmRleCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGFwaUtleSA9ICh0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ2FwaUtleScsIGl0ZW1JbmRleCwgJycpIGFzIHN0cmluZykgfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRleHRXaW5kb3dMZW5ndGggPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ2NvbnRleHRXaW5kb3dMZW5ndGgnLCBpdGVtSW5kZXgsIDEwKSBhcyBudW1iZXI7XG5cbiAgICBjb25zb2xlLmxvZygnW01lbW9yeSBBUEldIENyZWF0aW5nIG1lbW9yeSBmb3Igc2Vzc2lvbjonLCBzZXNzaW9uSWQpO1xuXG4gICAgY29uc3QgY2hhdEhpc3RvcnkgPSBuZXcgQXBpQ2hhdEhpc3RvcnkoYXBpVXJsLCBzZXNzaW9uSWQsIGFwaUtleSk7XG5cbiAgICBjb25zdCBtZW1vcnkgPSBuZXcgQnVmZmVyV2luZG93TWVtb3J5KHtcbiAgICAgIG1lbW9yeUtleTogJ2NoYXRfaGlzdG9yeScsXG4gICAgICBjaGF0SGlzdG9yeSxcbiAgICAgIHJldHVybk1lc3NhZ2VzOiB0cnVlLFxuICAgICAgaW5wdXRLZXk6ICdpbnB1dCcsXG4gICAgICBvdXRwdXRLZXk6ICdvdXRwdXQnLFxuICAgICAgazogY29udGV4dFdpbmRvd0xlbmd0aCxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zZTogbWVtb3J5LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import type { INodeType, INodeTypeDescription, ISupplyDataFunctions, SupplyData } from 'n8n-workflow';
2
+ export declare class MemoryWorkflow implements INodeType {
3
+ description: INodeTypeDescription;
4
+ supplyData(this: ISupplyDataFunctions, itemIndex: number): Promise<SupplyData>;
5
+ }
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryWorkflow = void 0;
4
+ const memory_1 = require("langchain/memory");
5
+ const chat_history_1 = require("@langchain/core/chat_history");
6
+ const messages_1 = require("@langchain/core/messages");
7
+ class WorkflowChatHistory extends chat_history_1.BaseListChatMessageHistory {
8
+ constructor(executeWorkflow, sessionId) {
9
+ super();
10
+ this.executeWorkflow = executeWorkflow;
11
+ this.sessionId = sessionId;
12
+ this.lc_namespace = ['langchain', 'stores', 'message', 'workflow'];
13
+ }
14
+ async getMessages() {
15
+ console.log('[WorkflowChatHistory] getMessages called for session:', this.sessionId);
16
+ try {
17
+ const result = await this.executeWorkflow({
18
+ action: 'get',
19
+ sessionId: this.sessionId,
20
+ });
21
+ const messages = result?.messages ?? [];
22
+ console.log('[WorkflowChatHistory] Got messages:', messages.length);
23
+ return messages.map((m) => {
24
+ if (m.type === 'human') {
25
+ return new messages_1.HumanMessage(m.content);
26
+ }
27
+ else {
28
+ return new messages_1.AIMessage(m.content);
29
+ }
30
+ });
31
+ }
32
+ catch (error) {
33
+ console.error('[WorkflowChatHistory] getMessages error:', error);
34
+ return [];
35
+ }
36
+ }
37
+ async addMessage(message) {
38
+ console.log('[WorkflowChatHistory] addMessage called for session:', this.sessionId);
39
+ try {
40
+ const type = message._getType() === 'human' ? 'human' : 'ai';
41
+ await this.executeWorkflow({
42
+ action: 'add',
43
+ sessionId: this.sessionId,
44
+ message: {
45
+ type,
46
+ content: message.content,
47
+ },
48
+ });
49
+ console.log('[WorkflowChatHistory] Message added successfully');
50
+ }
51
+ catch (error) {
52
+ console.error('[WorkflowChatHistory] addMessage error:', error);
53
+ }
54
+ }
55
+ async addMessages(messages) {
56
+ for (const message of messages) {
57
+ await this.addMessage(message);
58
+ }
59
+ }
60
+ async clear() {
61
+ console.log('[WorkflowChatHistory] clear called for session:', this.sessionId);
62
+ try {
63
+ await this.executeWorkflow({
64
+ action: 'clear',
65
+ sessionId: this.sessionId,
66
+ });
67
+ }
68
+ catch (error) {
69
+ console.error('[WorkflowChatHistory] clear error:', error);
70
+ }
71
+ }
72
+ }
73
+ class MemoryWorkflow {
74
+ constructor() {
75
+ this.description = {
76
+ displayName: 'Memory Workflow',
77
+ name: 'memoryWorkflow',
78
+ icon: 'fa:project-diagram',
79
+ group: ['transform'],
80
+ version: 1,
81
+ subtitle: 'Sub-Workflow Memory',
82
+ description: 'Use a sub-workflow as chat memory storage',
83
+ defaults: {
84
+ name: 'Memory Workflow',
85
+ },
86
+ codex: {
87
+ categories: ['AI'],
88
+ subcategories: {
89
+ AI: ['Memory'],
90
+ },
91
+ resources: {
92
+ primaryDocumentation: [
93
+ {
94
+ url: 'https://github.com/filipexyz/n8n-nodes-memory',
95
+ },
96
+ ],
97
+ },
98
+ },
99
+ inputs: [],
100
+ outputs: ['ai_memory'],
101
+ outputNames: ['Memory'],
102
+ properties: [
103
+ {
104
+ displayName: 'Workflow',
105
+ name: 'workflowId',
106
+ type: 'workflowSelector',
107
+ default: '',
108
+ required: true,
109
+ description: 'The workflow to execute for memory operations',
110
+ },
111
+ {
112
+ displayName: 'Session ID',
113
+ name: 'sessionId',
114
+ type: 'string',
115
+ default: '={{ $json.sessionId }}',
116
+ required: true,
117
+ description: 'Unique identifier for the conversation session',
118
+ },
119
+ {
120
+ displayName: 'Context Window Length',
121
+ name: 'contextWindowLength',
122
+ type: 'number',
123
+ default: 10,
124
+ description: 'Number of previous messages to include as context',
125
+ },
126
+ ],
127
+ };
128
+ }
129
+ async supplyData(itemIndex) {
130
+ const workflowIdParam = this.getNodeParameter('workflowId', itemIndex);
131
+ const workflowId = typeof workflowIdParam === 'string' ? workflowIdParam : workflowIdParam.value;
132
+ const sessionId = this.getNodeParameter('sessionId', itemIndex);
133
+ const contextWindowLength = this.getNodeParameter('contextWindowLength', itemIndex, 10);
134
+ console.log('[Memory Workflow] Creating memory for session:', sessionId);
135
+ const nodeContext = this;
136
+ const executeWorkflow = async (data) => {
137
+ const workflowInfo = {
138
+ id: workflowId,
139
+ };
140
+ const items = [{ json: data }];
141
+ const result = await nodeContext.executeWorkflow(workflowInfo, items);
142
+ // Get the output from the last node
143
+ const lastNodeData = result.data?.[0]?.[0]?.json;
144
+ return lastNodeData ?? {};
145
+ };
146
+ const chatHistory = new WorkflowChatHistory(executeWorkflow, sessionId);
147
+ const memory = new memory_1.BufferWindowMemory({
148
+ memoryKey: 'chat_history',
149
+ chatHistory,
150
+ returnMessages: true,
151
+ inputKey: 'input',
152
+ outputKey: 'output',
153
+ k: contextWindowLength,
154
+ });
155
+ return {
156
+ response: memory,
157
+ };
158
+ }
159
+ }
160
+ exports.MemoryWorkflow = MemoryWorkflow;
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5V29ya2Zsb3cubm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ub2Rlcy9NZW1vcnkvTWVtb3J5V29ya2Zsb3cubm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFTQSw2Q0FBc0Q7QUFDdEQsK0RBQTBFO0FBQzFFLHVEQUlrQztBQUlsQyxNQUFNLG1CQUFvQixTQUFRLHlDQUEwQjtJQUcxRCxZQUNVLGVBQWlDLEVBQ2pDLFNBQWlCO1FBRXpCLEtBQUssRUFBRSxDQUFDO1FBSEEsb0JBQWUsR0FBZixlQUFlLENBQWtCO1FBQ2pDLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFKM0IsaUJBQVksR0FBRyxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBTzlELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsdURBQXVELEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQzFCLENBQUMsQ0FBQztZQUVILE1BQU0sUUFBUSxHQUFJLE1BQU0sRUFBRSxRQUFxRCxJQUFJLEVBQUUsQ0FBQztZQUN0RixPQUFPLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVwRSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUN2QixPQUFPLElBQUksdUJBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JDLENBQUM7cUJBQU0sQ0FBQztv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TSxLQUFLLEdBQXlCLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBbUIsRUFBRSxDQUFDLENBQUM7WUFDcEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxXQUFXLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUV0RSxvQ0FBb0M7WUFDcEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2pELE9BQU8sWUFBdUMsSUFBSSxFQUFFLENBQUM7UUFDdkQsQ0FBQyxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFeEUsTUFBTSxNQUFNLEdBQUcsSUFBSSwyQkFBa0IsQ0FBQztZQUNwQyxTQUFTLEVBQUUsY0FBYztZQUN6QixXQUFXO1lBQ1gsY0FBYyxFQUFFLElBQUk7WUFDcEIsUUFBUSxFQUFFLE9BQU87WUFDakIsU0FBUyxFQUFFLFFBQVE7WUFDbkIsQ0FBQyxFQUFFLG1CQUFtQjtTQUN2QixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsUUFBUSxFQUFFLE1BQU07U0FDakIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWhHRCx3Q0FnR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIElOb2RlVHlwZSxcbiAgSU5vZGVUeXBlRGVzY3JpcHRpb24sXG4gIElTdXBwbHlEYXRhRnVuY3Rpb25zLFxuICBTdXBwbHlEYXRhLFxuICBJRXhlY3V0ZVdvcmtmbG93SW5mbyxcbiAgSU5vZGVFeGVjdXRpb25EYXRhLFxuICBJRGF0YU9iamVjdCxcbn0gZnJvbSAnbjhuLXdvcmtmbG93JztcbmltcG9ydCB7IEJ1ZmZlcldpbmRvd01lbW9yeSB9IGZyb20gJ2xhbmdjaGFpbi9tZW1vcnknO1xuaW1wb3J0IHsgQmFzZUxpc3RDaGF0TWVzc2FnZUhpc3RvcnkgfSBmcm9tICdAbGFuZ2NoYWluL2NvcmUvY2hhdF9oaXN0b3J5JztcbmltcG9ydCB7XG4gIEJhc2VNZXNzYWdlLFxuICBIdW1hbk1lc3NhZ2UsXG4gIEFJTWVzc2FnZSxcbn0gZnJvbSAnQGxhbmdjaGFpbi9jb3JlL21lc3NhZ2VzJztcblxudHlwZSBXb3JrZmxvd0V4ZWN1dG9yID0gKGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcblxuY2xhc3MgV29ya2Zsb3dDaGF0SGlzdG9yeSBleHRlbmRzIEJhc2VMaXN0Q2hhdE1lc3NhZ2VIaXN0b3J5IHtcbiAgbGNfbmFtZXNwYWNlID0gWydsYW5nY2hhaW4nLCAnc3RvcmVzJywgJ21lc3NhZ2UnLCAnd29ya2Zsb3cnXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGV4ZWN1dGVXb3JrZmxvdzogV29ya2Zsb3dFeGVjdXRvcixcbiAgICBwcml2YXRlIHNlc3Npb25JZDogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWVzc2FnZXMoKTogUHJvbWlzZTxCYXNlTWVzc2FnZVtdPiB7XG4gICAgY29uc29sZS5sb2coJ1tXb3JrZmxvd0NoYXRIaXN0b3J5XSBnZXRNZXNzYWdlcyBjYWxsZWQgZm9yIHNlc3Npb246JywgdGhpcy5zZXNzaW9uSWQpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVXb3JrZmxvdyh7XG4gICAgICAgIGFjdGlvbjogJ2dldCcsXG4gICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWVzc2FnZXMgPSAocmVzdWx0Py5tZXNzYWdlcyBhcyBBcnJheTx7IHR5cGU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0+KSA/PyBbXTtcbiAgICAgIGNvbnNvbGUubG9nKCdbV29ya2Zsb3dDaGF0SGlzdG9yeV0gR290IG1lc3NhZ2VzOicsIG1lc3NhZ2VzLmxlbmd0aCk7XG5cbiAgICAgIHJldHVybiBtZXNzYWdlcy5tYXAoKG0pID0+IHtcbiAgICAgICAgaWYgKG0udHlwZSA9PT0gJ2h1bWFuJykge1xuICAgICAgICAgIHJldHVybiBuZXcgSHVtYW5NZXNzYWdlKG0uY29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBBSU1lc3NhZ2UobS5jb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tXb3JrZmxvd0NoYXRIaXN0b3J5XSBnZXRNZXNzYWdlcyBlcnJvcjonLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkTWVzc2FnZShtZXNzYWdlOiBCYXNlTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCdbV29ya2Zsb3dDaGF0SGlzdG9yeV0gYWRkTWVzc2FnZSBjYWxsZWQgZm9yIHNlc3Npb246JywgdGhpcy5zZXNzaW9uSWQpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eXBlID0gbWVzc2FnZS5fZ2V0VHlwZSgpID09PSAnaHVtYW4nID8gJ2h1bWFuJyA6ICdhaSc7XG5cbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVdvcmtmbG93KHtcbiAgICAgICAgYWN0aW9uOiAnYWRkJyxcbiAgICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgbWVzc2FnZToge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgY29udGVudDogbWVzc2FnZS5jb250ZW50LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZygnW1dvcmtmbG93Q2hhdEhpc3RvcnldIE1lc3NhZ2UgYWRkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tXb3JrZmxvd0NoYXRIaXN0b3J5XSBhZGRNZXNzYWdlIGVycm9yOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRNZXNzYWdlcyhtZXNzYWdlczogQmFzZU1lc3NhZ2VbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgICAgYXdhaXQgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCdbV29ya2Zsb3dDaGF0SGlzdG9yeV0gY2xlYXIgY2FsbGVkIGZvciBzZXNzaW9uOicsIHRoaXMuc2Vzc2lvbklkKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5leGVjdXRlV29ya2Zsb3coe1xuICAgICAgICBhY3Rpb246ICdjbGVhcicsXG4gICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignW1dvcmtmbG93Q2hhdEhpc3RvcnldIGNsZWFyIGVycm9yOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1lbW9yeVdvcmtmbG93IGltcGxlbWVudHMgSU5vZGVUeXBlIHtcbiAgZGVzY3JpcHRpb246IElOb2RlVHlwZURlc2NyaXB0aW9uID0ge1xuICAgIGRpc3BsYXlOYW1lOiAnTWVtb3J5IFdvcmtmbG93JyxcbiAgICBuYW1lOiAnbWVtb3J5V29ya2Zsb3cnLFxuICAgIGljb246ICdmYTpwcm9qZWN0LWRpYWdyYW0nLFxuICAgIGdyb3VwOiBbJ3RyYW5zZm9ybSddLFxuICAgIHZlcnNpb246IDEsXG4gICAgc3VidGl0bGU6ICdTdWItV29ya2Zsb3cgTWVtb3J5JyxcbiAgICBkZXNjcmlwdGlvbjogJ1VzZSBhIHN1Yi13b3JrZmxvdyBhcyBjaGF0IG1lbW9yeSBzdG9yYWdlJyxcbiAgICBkZWZhdWx0czoge1xuICAgICAgbmFtZTogJ01lbW9yeSBXb3JrZmxvdycsXG4gICAgfSxcbiAgICBjb2RleDoge1xuICAgICAgY2F0ZWdvcmllczogWydBSSddLFxuICAgICAgc3ViY2F0ZWdvcmllczoge1xuICAgICAgICBBSTogWydNZW1vcnknXSxcbiAgICAgIH0sXG4gICAgICByZXNvdXJjZXM6IHtcbiAgICAgICAgcHJpbWFyeURvY3VtZW50YXRpb246IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1cmw6ICdodHRwczovL2dpdGh1Yi5jb20vZmlsaXBleHl6L244bi1ub2Rlcy1tZW1vcnknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgaW5wdXRzOiBbXSxcbiAgICBvdXRwdXRzOiBbJ2FpX21lbW9yeScgYXMgY29uc3RdLFxuICAgIG91dHB1dE5hbWVzOiBbJ01lbW9yeSddLFxuICAgIHByb3BlcnRpZXM6IFtcbiAgICAgIHtcbiAgICAgICAgZGlzcGxheU5hbWU6ICdXb3JrZmxvdycsXG4gICAgICAgIG5hbWU6ICd3b3JrZmxvd0lkJyxcbiAgICAgICAgdHlwZTogJ3dvcmtmbG93U2VsZWN0b3InLFxuICAgICAgICBkZWZhdWx0OiAnJyxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHdvcmtmbG93IHRvIGV4ZWN1dGUgZm9yIG1lbW9yeSBvcGVyYXRpb25zJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiAnU2Vzc2lvbiBJRCcsXG4gICAgICAgIG5hbWU6ICdzZXNzaW9uSWQnLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogJz17eyAkanNvbi5zZXNzaW9uSWQgfX0nLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbnZlcnNhdGlvbiBzZXNzaW9uJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiAnQ29udGV4dCBXaW5kb3cgTGVuZ3RoJyxcbiAgICAgICAgbmFtZTogJ2NvbnRleHRXaW5kb3dMZW5ndGgnLFxuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgZGVmYXVsdDogMTAsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIHByZXZpb3VzIG1lc3NhZ2VzIHRvIGluY2x1ZGUgYXMgY29udGV4dCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG5cbiAgYXN5bmMgc3VwcGx5RGF0YShcbiAgICB0aGlzOiBJU3VwcGx5RGF0YUZ1bmN0aW9ucyxcbiAgICBpdGVtSW5kZXg6IG51bWJlclxuICApOiBQcm9taXNlPFN1cHBseURhdGE+IHtcbiAgICBjb25zdCB3b3JrZmxvd0lkUGFyYW0gPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ3dvcmtmbG93SWQnLCBpdGVtSW5kZXgpIGFzIHN0cmluZyB8IHsgdmFsdWU6IHN0cmluZyB9O1xuICAgIGNvbnN0IHdvcmtmbG93SWQgPSB0eXBlb2Ygd29ya2Zsb3dJZFBhcmFtID09PSAnc3RyaW5nJyA/IHdvcmtmbG93SWRQYXJhbSA6IHdvcmtmbG93SWRQYXJhbS52YWx1ZTtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ3Nlc3Npb25JZCcsIGl0ZW1JbmRleCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNvbnRleHRXaW5kb3dMZW5ndGggPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ2NvbnRleHRXaW5kb3dMZW5ndGgnLCBpdGVtSW5kZXgsIDEwKSBhcyBudW1iZXI7XG5cbiAgICBjb25zb2xlLmxvZygnW01lbW9yeSBXb3JrZmxvd10gQ3JlYXRpbmcgbWVtb3J5IGZvciBzZXNzaW9uOicsIHNlc3Npb25JZCk7XG5cbiAgICBjb25zdCBub2RlQ29udGV4dCA9IHRoaXM7XG5cbiAgICBjb25zdCBleGVjdXRlV29ya2Zsb3c6IFdvcmtmbG93RXhlY3V0b3IgPSBhc3luYyAoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgd29ya2Zsb3dJbmZvOiBJRXhlY3V0ZVdvcmtmbG93SW5mbyA9IHtcbiAgICAgICAgaWQ6IHdvcmtmbG93SWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBpdGVtczogSU5vZGVFeGVjdXRpb25EYXRhW10gPSBbeyBqc29uOiBkYXRhIGFzIElEYXRhT2JqZWN0IH1dO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbm9kZUNvbnRleHQuZXhlY3V0ZVdvcmtmbG93KHdvcmtmbG93SW5mbywgaXRlbXMpO1xuXG4gICAgICAvLyBHZXQgdGhlIG91dHB1dCBmcm9tIHRoZSBsYXN0IG5vZGVcbiAgICAgIGNvbnN0IGxhc3ROb2RlRGF0YSA9IHJlc3VsdC5kYXRhPy5bMF0/LlswXT8uanNvbjtcbiAgICAgIHJldHVybiBsYXN0Tm9kZURhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPz8ge307XG4gICAgfTtcblxuICAgIGNvbnN0IGNoYXRIaXN0b3J5ID0gbmV3IFdvcmtmbG93Q2hhdEhpc3RvcnkoZXhlY3V0ZVdvcmtmbG93LCBzZXNzaW9uSWQpO1xuXG4gICAgY29uc3QgbWVtb3J5ID0gbmV3IEJ1ZmZlcldpbmRvd01lbW9yeSh7XG4gICAgICBtZW1vcnlLZXk6ICdjaGF0X2hpc3RvcnknLFxuICAgICAgY2hhdEhpc3RvcnksXG4gICAgICByZXR1cm5NZXNzYWdlczogdHJ1ZSxcbiAgICAgIGlucHV0S2V5OiAnaW5wdXQnLFxuICAgICAgb3V0cHV0S2V5OiAnb3V0cHV0JyxcbiAgICAgIGs6IGNvbnRleHRXaW5kb3dMZW5ndGgsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVzcG9uc2U6IG1lbW9yeSxcbiAgICB9O1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-memory",
3
- "version": "0.5.1",
3
+ "version": "0.6.1",
4
4
  "description": "Custom memory node for n8n AI Agent with external API support",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",
@@ -28,7 +28,8 @@
28
28
  "n8n": {
29
29
  "n8nNodesApiVersion": 1,
30
30
  "nodes": [
31
- "dist/nodes/Memory/Memory.node.js"
31
+ "dist/nodes/Memory/MemoryApi.node.js",
32
+ "dist/nodes/Memory/MemoryWorkflow.node.js"
32
33
  ],
33
34
  "credentials": []
34
35
  },
@@ -1,18 +0,0 @@
1
- import { BaseListChatMessageHistory } from '@langchain/core/chat_history';
2
- import { BaseMessage } from '@langchain/core/messages';
3
- export interface ApiMemoryHistoryConfig {
4
- apiUrl: string;
5
- sessionId: string;
6
- apiKey?: string;
7
- }
8
- export declare class ApiMemoryHistory extends BaseListChatMessageHistory {
9
- lc_namespace: string[];
10
- private apiUrl;
11
- private sessionId;
12
- private apiKey?;
13
- constructor(config: ApiMemoryHistoryConfig);
14
- getMessages(): Promise<BaseMessage[]>;
15
- addMessage(message: BaseMessage): Promise<void>;
16
- addMessages(messages: BaseMessage[]): Promise<void>;
17
- clear(): Promise<void>;
18
- }
@@ -1,113 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ApiMemoryHistory = void 0;
4
- const chat_history_1 = require("@langchain/core/chat_history");
5
- const messages_1 = require("@langchain/core/messages");
6
- class ApiMemoryHistory extends chat_history_1.BaseListChatMessageHistory {
7
- constructor(config) {
8
- super();
9
- this.lc_namespace = ['langchain', 'stores', 'message', 'api'];
10
- this.apiUrl = config.apiUrl;
11
- this.sessionId = config.sessionId;
12
- this.apiKey = config.apiKey;
13
- }
14
- async getMessages() {
15
- try {
16
- const url = new URL(this.apiUrl);
17
- url.searchParams.set('sessionId', this.sessionId);
18
- url.searchParams.set('action', 'get');
19
- const headers = {
20
- 'Content-Type': 'application/json',
21
- };
22
- if (this.apiKey) {
23
- headers['Authorization'] = `Bearer ${this.apiKey}`;
24
- }
25
- const response = await fetch(url.toString(), {
26
- method: 'GET',
27
- headers,
28
- });
29
- if (!response.ok) {
30
- console.error(`Memory API error: ${response.status}`);
31
- return [];
32
- }
33
- const data = await response.json();
34
- const messages = data.messages || [];
35
- return messages.map((msg) => {
36
- switch (msg.type) {
37
- case 'human':
38
- return new messages_1.HumanMessage(msg.content);
39
- case 'ai':
40
- return new messages_1.AIMessage(msg.content);
41
- case 'system':
42
- return new messages_1.SystemMessage(msg.content);
43
- default:
44
- return new messages_1.HumanMessage(msg.content);
45
- }
46
- });
47
- }
48
- catch (error) {
49
- console.error('Failed to get messages from API:', error);
50
- return [];
51
- }
52
- }
53
- async addMessage(message) {
54
- try {
55
- const headers = {
56
- 'Content-Type': 'application/json',
57
- };
58
- if (this.apiKey) {
59
- headers['Authorization'] = `Bearer ${this.apiKey}`;
60
- }
61
- let type = 'human';
62
- if (message._getType() === 'ai') {
63
- type = 'ai';
64
- }
65
- else if (message._getType() === 'system') {
66
- type = 'system';
67
- }
68
- await fetch(this.apiUrl, {
69
- method: 'POST',
70
- headers,
71
- body: JSON.stringify({
72
- action: 'add',
73
- sessionId: this.sessionId,
74
- message: {
75
- type,
76
- content: message.content,
77
- },
78
- }),
79
- });
80
- }
81
- catch (error) {
82
- console.error('Failed to add message to API:', error);
83
- }
84
- }
85
- async addMessages(messages) {
86
- for (const message of messages) {
87
- await this.addMessage(message);
88
- }
89
- }
90
- async clear() {
91
- try {
92
- const headers = {
93
- 'Content-Type': 'application/json',
94
- };
95
- if (this.apiKey) {
96
- headers['Authorization'] = `Bearer ${this.apiKey}`;
97
- }
98
- await fetch(this.apiUrl, {
99
- method: 'POST',
100
- headers,
101
- body: JSON.stringify({
102
- action: 'clear',
103
- sessionId: this.sessionId,
104
- }),
105
- });
106
- }
107
- catch (error) {
108
- console.error('Failed to clear messages from API:', error);
109
- }
110
- }
111
- }
112
- exports.ApiMemoryHistory = ApiMemoryHistory;
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBpTWVtb3J5SGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ub2Rlcy9NZW1vcnkvQXBpTWVtb3J5SGlzdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrREFFc0M7QUFDdEMsdURBS2tDO0FBaUJsQyxNQUFhLGdCQUFpQixTQUFRLHlDQUEwQjtJQU85RCxZQUFZLE1BQThCO1FBQ3hDLEtBQUssRUFBRSxDQUFDO1FBUFYsaUJBQVksR0FBRyxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBUXZELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xELEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUV0QyxNQUFNLE9BQU8sR0FBMkI7Z0JBQ3RDLGNBQWMsRUFBRSxrQkFBa0I7YUFDbkMsQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUs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QkFBa0I7YUFDbkMsQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsQ0FBQztZQUVELE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU87Z0JBQ1AsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLE1BQU0sRUFBRSxPQUFPO29CQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztpQkFDMUIsQ0FBQzthQUNILENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBdEhELDRDQXNIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJhc2VMaXN0Q2hhdE1lc3NhZ2VIaXN0b3J5LFxufSBmcm9tICdAbGFuZ2NoYWluL2NvcmUvY2hhdF9oaXN0b3J5JztcbmltcG9ydCB7XG4gIEJhc2VNZXNzYWdlLFxuICBIdW1hbk1lc3NhZ2UsXG4gIEFJTWVzc2FnZSxcbiAgU3lzdGVtTWVzc2FnZSxcbn0gZnJvbSAnQGxhbmdjaGFpbi9jb3JlL21lc3NhZ2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBBcGlNZW1vcnlIaXN0b3J5Q29uZmlnIHtcbiAgYXBpVXJsOiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBhcGlLZXk/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBBcGlNZXNzYWdlIHtcbiAgdHlwZTogJ2h1bWFuJyB8ICdhaScgfCAnc3lzdGVtJztcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBpUmVzcG9uc2Uge1xuICBtZXNzYWdlcz86IEFwaU1lc3NhZ2VbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEFwaU1lbW9yeUhpc3RvcnkgZXh0ZW5kcyBCYXNlTGlzdENoYXRNZXNzYWdlSGlzdG9yeSB7XG4gIGxjX25hbWVzcGFjZSA9IFsnbGFuZ2NoYWluJywgJ3N0b3JlcycsICdtZXNzYWdlJywgJ2FwaSddO1xuXG4gIHByaXZhdGUgYXBpVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgYXBpS2V5Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQXBpTWVtb3J5SGlzdG9yeUNvbmZpZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcGlVcmwgPSBjb25maWcuYXBpVXJsO1xuICAgIHRoaXMuc2Vzc2lvbklkID0gY29uZmlnLnNlc3Npb25JZDtcbiAgICB0aGlzLmFwaUtleSA9IGNvbmZpZy5hcGlLZXk7XG4gIH1cblxuICBhc3luYyBnZXRNZXNzYWdlcygpOiBQcm9taXNlPEJhc2VNZXNzYWdlW10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmFwaVVybCk7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2Vzc2lvbklkJywgdGhpcy5zZXNzaW9uSWQpO1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2FjdGlvbicsICdnZXQnKTtcblxuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5hcGlLZXkpIHtcbiAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3RoaXMuYXBpS2V5fWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLnRvU3RyaW5nKCksIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE1lbW9yeSBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQXBpUmVzcG9uc2U7XG4gICAgICBjb25zdCBtZXNzYWdlczogQXBpTWVzc2FnZVtdID0gZGF0YS5tZXNzYWdlcyB8fCBbXTtcblxuICAgICAgcmV0dXJuIG1lc3NhZ2VzLm1hcCgobXNnKSA9PiB7XG4gICAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdodW1hbic6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEh1bWFuTWVzc2FnZShtc2cuY29udGVudCk7XG4gICAgICAgICAgY2FzZSAnYWknOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBSU1lc3NhZ2UobXNnLmNvbnRlbnQpO1xuICAgICAgICAgIGNhc2UgJ3N5c3RlbSc6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN5c3RlbU1lc3NhZ2UobXNnLmNvbnRlbnQpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEh1bWFuTWVzc2FnZShtc2cuY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZ2V0IG1lc3NhZ2VzIGZyb20gQVBJOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRNZXNzYWdlKG1lc3NhZ2U6IEJhc2VNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuYXBpS2V5KSB7XG4gICAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0aGlzLmFwaUtleX1gO1xuICAgICAgfVxuXG4gICAgICBsZXQgdHlwZTogJ2h1bWFuJyB8ICdhaScgfCAnc3lzdGVtJyA9ICdodW1hbic7XG4gICAgICBpZiAobWVzc2FnZS5fZ2V0VHlwZSgpID09PSAnYWknKSB7XG4gICAgICAgIHR5cGUgPSAnYWknO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLl9nZXRUeXBlKCkgPT09ICdzeXN0ZW0nKSB7XG4gICAgICAgIHR5cGUgPSAnc3lzdGVtJztcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZmV0Y2godGhpcy5hcGlVcmwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBhY3Rpb246ICdhZGQnLFxuICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgbWVzc2FnZToge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2UuY29udGVudCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYWRkIG1lc3NhZ2UgdG8gQVBJOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRNZXNzYWdlcyhtZXNzYWdlczogQmFzZU1lc3NhZ2VbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgICAgYXdhaXQgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmFwaUtleSkge1xuICAgICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dGhpcy5hcGlLZXl9YDtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZmV0Y2godGhpcy5hcGlVcmwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBhY3Rpb246ICdjbGVhcicsXG4gICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNsZWFyIG1lc3NhZ2VzIGZyb20gQVBJOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,189 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Memory = void 0;
4
- const memory_1 = require("langchain/memory");
5
- const chat_history_1 = require("@langchain/core/chat_history");
6
- const messages_1 = require("@langchain/core/messages");
7
- class ApiChatHistory extends chat_history_1.BaseListChatMessageHistory {
8
- constructor(apiUrl, sessionId, apiKey) {
9
- super();
10
- this.apiUrl = apiUrl;
11
- this.sessionId = sessionId;
12
- this.apiKey = apiKey;
13
- this.lc_namespace = ['langchain', 'stores', 'message', 'api'];
14
- }
15
- getHeaders() {
16
- const headers = {
17
- 'Content-Type': 'application/json',
18
- };
19
- if (this.apiKey) {
20
- headers['Authorization'] = `Bearer ${this.apiKey}`;
21
- }
22
- return headers;
23
- }
24
- async getMessages() {
25
- console.log('[ApiChatHistory] getMessages called for session:', this.sessionId);
26
- try {
27
- console.log('[ApiChatHistory] Fetching from:', this.apiUrl);
28
- const response = await fetch(this.apiUrl, {
29
- method: 'POST',
30
- headers: this.getHeaders(),
31
- body: JSON.stringify({
32
- action: 'get',
33
- sessionId: this.sessionId,
34
- }),
35
- });
36
- if (!response.ok) {
37
- console.error(`[ApiChatHistory] API error: ${response.status}`);
38
- return [];
39
- }
40
- const data = await response.json();
41
- const messages = data?.messages ?? [];
42
- console.log('[ApiChatHistory] Got messages:', messages.length);
43
- return messages.map((m) => {
44
- if (m.type === 'human') {
45
- return new messages_1.HumanMessage(m.content);
46
- }
47
- else {
48
- return new messages_1.AIMessage(m.content);
49
- }
50
- });
51
- }
52
- catch (error) {
53
- console.error('[ApiChatHistory] getMessages error:', error);
54
- return [];
55
- }
56
- }
57
- async addMessage(message) {
58
- console.log('[ApiChatHistory] addMessage called for session:', this.sessionId);
59
- try {
60
- const type = message._getType() === 'human' ? 'human' : 'ai';
61
- await fetch(this.apiUrl, {
62
- method: 'POST',
63
- headers: this.getHeaders(),
64
- body: JSON.stringify({
65
- action: 'add',
66
- sessionId: this.sessionId,
67
- message: {
68
- type,
69
- content: message.content,
70
- },
71
- }),
72
- });
73
- console.log('[ApiChatHistory] Message added successfully');
74
- }
75
- catch (error) {
76
- console.error('[ApiChatHistory] addMessage error:', error);
77
- }
78
- }
79
- async addMessages(messages) {
80
- for (const message of messages) {
81
- await this.addMessage(message);
82
- }
83
- }
84
- async clear() {
85
- console.log('[ApiChatHistory] clear called for session:', this.sessionId);
86
- try {
87
- await fetch(this.apiUrl, {
88
- method: 'POST',
89
- headers: this.getHeaders(),
90
- body: JSON.stringify({
91
- action: 'clear',
92
- sessionId: this.sessionId,
93
- }),
94
- });
95
- }
96
- catch (error) {
97
- console.error('[ApiChatHistory] clear error:', error);
98
- }
99
- }
100
- }
101
- class Memory {
102
- constructor() {
103
- this.description = {
104
- displayName: 'Memory API',
105
- name: 'memoryApi',
106
- icon: 'fa:brain',
107
- group: ['transform'],
108
- version: 1,
109
- subtitle: 'External API Memory',
110
- description: 'Use an external API as chat memory storage',
111
- defaults: {
112
- name: 'Memory API',
113
- },
114
- codex: {
115
- categories: ['AI'],
116
- subcategories: {
117
- AI: ['Memory'],
118
- },
119
- resources: {
120
- primaryDocumentation: [
121
- {
122
- url: 'https://github.com/filipexyz/n8n-nodes-memory',
123
- },
124
- ],
125
- },
126
- },
127
- inputs: [],
128
- outputs: ['ai_memory'],
129
- outputNames: ['Memory'],
130
- properties: [
131
- {
132
- displayName: 'API URL',
133
- name: 'apiUrl',
134
- type: 'string',
135
- default: '',
136
- required: true,
137
- description: 'URL of the memory API (e.g., n8n webhook URL)',
138
- placeholder: 'https://your-n8n.com/webhook/memory',
139
- },
140
- {
141
- displayName: 'Session ID',
142
- name: 'sessionId',
143
- type: 'string',
144
- default: '={{ $json.sessionId }}',
145
- required: true,
146
- description: 'Unique identifier for the conversation session',
147
- },
148
- {
149
- displayName: 'API Key',
150
- name: 'apiKey',
151
- type: 'string',
152
- typeOptions: {
153
- password: true,
154
- },
155
- default: '',
156
- description: 'Optional API key for authentication',
157
- },
158
- {
159
- displayName: 'Context Window Length',
160
- name: 'contextWindowLength',
161
- type: 'number',
162
- default: 10,
163
- description: 'Number of previous messages to include as context',
164
- },
165
- ],
166
- };
167
- }
168
- async supplyData(itemIndex) {
169
- const apiUrl = this.getNodeParameter('apiUrl', itemIndex);
170
- const sessionId = this.getNodeParameter('sessionId', itemIndex);
171
- const apiKey = this.getNodeParameter('apiKey', itemIndex, '') || undefined;
172
- const contextWindowLength = this.getNodeParameter('contextWindowLength', itemIndex, 10);
173
- console.log('[Memory API] Creating memory for session:', sessionId);
174
- const chatHistory = new ApiChatHistory(apiUrl, sessionId, apiKey);
175
- const memory = new memory_1.BufferWindowMemory({
176
- memoryKey: 'chat_history',
177
- chatHistory,
178
- returnMessages: true,
179
- inputKey: 'input',
180
- outputKey: 'output',
181
- k: contextWindowLength,
182
- });
183
- return {
184
- response: memory,
185
- };
186
- }
187
- }
188
- exports.Memory = Memory;
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5Lm5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbm9kZXMvTWVtb3J5L01lbW9yeS5ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLDZDQUFzRDtBQUN0RCwrREFBMEU7QUFDMUUsdURBSWtDO0FBRWxDLE1BQU0sY0FBZSxTQUFRLHlDQUEwQjtJQUdyRCxZQUNVLE1BQWMsRUFDZCxTQUFpQixFQUNqQixNQUFlO1FBRXZCLEtBQUssRUFBRSxDQUFDO1FBSkEsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDakIsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUx6QixpQkFBWSxHQUFHLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFRekQsQ0FBQztJQUVPLFVBQVU7UUFDaEIsTUFBTSxPQUFPLEdBQTJCO1lBQ3RDLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkMsQ0FBQztRQUNGLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXO1FBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrREFBa0QsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDO1lBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDeEMsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixNQUFNLEVBQUUsS0FBSztvQkFDYixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7aUJBQzFCLENBQUM7YUFDSCxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDaEUsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUE2RCxDQUFDO1lBQzlGLE1BQU0sUUFBUSxHQUFHLElBQUksRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRS9ELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQW9DLEVBQUUsRUFBRTtnQkFDM0QsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUN2QixPQUFPLElBQUksdUJBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLElBQUksb0JBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2xDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1RCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFvQjtRQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUU3RCxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUN2QixNQUFNLEVBQUUsTUFBTTtnQkFDZCxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDMUIsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLE1BQU0sRUFBRSxLQUFLO29CQUNiLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDekIsT0FBTyxFQUFFO3dCQUNQLElBQUk7d0JBQ0osT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO3FCQUN6QjtpQkFDRixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBdUI7UUFDdkMsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDbkIsTUFBTSxFQUFFLE9BQU87b0JBQ2YsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2lCQUMxQixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxNQUFhLE1BQU07SUFBbkI7UUFDRSxnQkFBVyxHQUF5QjtZQUNsQyxXQUFXLEVBQUUsWUFBWTtZQUN6QixJQUFJLEVBQUUsV0FBVztZQUNqQixJQUFJLEVBQUUsVUFBVTtZQUNoQixLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDcEIsT0FBTyxFQUFFLENBQUM7WUFDVixRQUFRLEVBQUUscUJBQXFCO1lBQy9CLFdBQVcsRUFBRSw0Q0FBNEM7WUFDekQsUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxZQUFZO2FBQ25CO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQztnQkFDbEIsYUFBYSxFQUFFO29CQUNiLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQztpQkFDZjtnQkFDRCxTQUFTLEVBQUU7b0JBQ1Qsb0JBQW9CLEVBQUU7d0JBQ3BCOzRCQUNFLEdBQUcsRUFBRSwrQ0FBK0M7eUJBQ3JEO3FCQUNGO2lCQUNGO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxDQUFDLFdBQW9CLENBQUM7WUFDL0IsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3ZCLFVBQVUsRUFBRTtnQkFDVjtvQkFDRSxXQUFXLEVBQUUsU0FBUztvQkFDdEIsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsUUFBUSxFQUFFLElBQUk7b0JBQ2QsV0FBVyxFQUFFLCtDQUErQztvQkFDNUQsV0FBVyxFQUFFLHFDQUFxQztpQkFDbkQ7Z0JBQ0Q7b0JBQ0UsV0FBVyxFQUFFLFlBQVk7b0JBQ3pCLElBQUksRUFBRSxXQUFXO29CQUNqQixJQUFJLEVBQUUsUUFBUTtvQkFDZCxPQUFPLEVBQUUsd0JBQXdCO29CQUNqQyxRQUFRLEVBQUUsSUFBSTtvQkFDZCxXQUFXLEVBQUUsZ0RBQWdEO2lCQUM5RDtnQkFDRDtvQkFDRSxXQUFXLEVBQUUsU0FBUztvQkFDdEIsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsV0FBVyxFQUFFO3dCQUNYLFFBQVEsRUFBRSxJQUFJO3FCQUNmO29CQUNELE9BQU8sRUFBRSxFQUFFO29CQUNYLFdBQVcsRUFBRSxxQ0FBcUM7aUJBQ25EO2dCQUNEO29CQUNFLFdBQVcsRUFBRSx1QkFBdUI7b0JBQ3BDLElBQUksRUFBRSxxQkFBcUI7b0JBQzNCLElBQUksRUFBRSxRQUFRO29CQUNkLE9BQU8sRUFBRSxFQUFFO29CQUNYLFdBQVcsRUFBRSxtREFBbUQ7aUJBQ2pFO2FBQ0Y7U0FDRixDQUFDO0lBNEJKLENBQUM7SUExQkMsS0FBSyxDQUFDLFVBQVUsQ0FFZCxTQUFpQjtRQUVqQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBVyxDQUFDO1FBQ3BFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFXLENBQUM7UUFDMUUsTUFBTSxNQUFNLEdBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFZLElBQUksU0FBUyxDQUFDO1FBQ3ZGLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxFQUFFLENBQVcsQ0FBQztRQUVsRyxPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXBFLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSwyQkFBa0IsQ0FBQztZQUNwQyxTQUFTLEVBQUUsY0FBYztZQUN6QixXQUFXO1lBQ1gsY0FBYyxFQUFFLElBQUk7WUFDcEIsUUFBUSxFQUFFLE9BQU87WUFDakIsU0FBUyxFQUFFLFFBQVE7WUFDbkIsQ0FBQyxFQUFFLG1CQUFtQjtTQUN2QixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsUUFBUSxFQUFFLE1BQU07U0FDakIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTVGRCx3QkE0RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIElOb2RlVHlwZSxcbiAgSU5vZGVUeXBlRGVzY3JpcHRpb24sXG4gIElTdXBwbHlEYXRhRnVuY3Rpb25zLFxuICBTdXBwbHlEYXRhLFxufSBmcm9tICduOG4td29ya2Zsb3cnO1xuaW1wb3J0IHsgQnVmZmVyV2luZG93TWVtb3J5IH0gZnJvbSAnbGFuZ2NoYWluL21lbW9yeSc7XG5pbXBvcnQgeyBCYXNlTGlzdENoYXRNZXNzYWdlSGlzdG9yeSB9IGZyb20gJ0BsYW5nY2hhaW4vY29yZS9jaGF0X2hpc3RvcnknO1xuaW1wb3J0IHtcbiAgQmFzZU1lc3NhZ2UsXG4gIEh1bWFuTWVzc2FnZSxcbiAgQUlNZXNzYWdlLFxufSBmcm9tICdAbGFuZ2NoYWluL2NvcmUvbWVzc2FnZXMnO1xuXG5jbGFzcyBBcGlDaGF0SGlzdG9yeSBleHRlbmRzIEJhc2VMaXN0Q2hhdE1lc3NhZ2VIaXN0b3J5IHtcbiAgbGNfbmFtZXNwYWNlID0gWydsYW5nY2hhaW4nLCAnc3RvcmVzJywgJ21lc3NhZ2UnLCAnYXBpJ107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcGlVcmw6IHN0cmluZyxcbiAgICBwcml2YXRlIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIHByaXZhdGUgYXBpS2V5Pzogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH07XG4gICAgaWYgKHRoaXMuYXBpS2V5KSB7XG4gICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dGhpcy5hcGlLZXl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBhc3luYyBnZXRNZXNzYWdlcygpOiBQcm9taXNlPEJhc2VNZXNzYWdlW10+IHtcbiAgICBjb25zb2xlLmxvZygnW0FwaUNoYXRIaXN0b3J5XSBnZXRNZXNzYWdlcyBjYWxsZWQgZm9yIHNlc3Npb246JywgdGhpcy5zZXNzaW9uSWQpO1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZygnW0FwaUNoYXRIaXN0b3J5XSBGZXRjaGluZyBmcm9tOicsIHRoaXMuYXBpVXJsKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5hcGlVcmwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgYWN0aW9uOiAnZ2V0JyxcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtBcGlDaGF0SGlzdG9yeV0gQVBJIGVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIHsgbWVzc2FnZXM/OiBBcnJheTx7IHR5cGU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0+IH07XG4gICAgICBjb25zdCBtZXNzYWdlcyA9IGRhdGE/Lm1lc3NhZ2VzID8/IFtdO1xuICAgICAgY29uc29sZS5sb2coJ1tBcGlDaGF0SGlzdG9yeV0gR290IG1lc3NhZ2VzOicsIG1lc3NhZ2VzLmxlbmd0aCk7XG5cbiAgICAgIHJldHVybiBtZXNzYWdlcy5tYXAoKG06IHsgdHlwZTogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICBpZiAobS50eXBlID09PSAnaHVtYW4nKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBIdW1hbk1lc3NhZ2UobS5jb250ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEFJTWVzc2FnZShtLmNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignW0FwaUNoYXRIaXN0b3J5XSBnZXRNZXNzYWdlcyBlcnJvcjonLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkTWVzc2FnZShtZXNzYWdlOiBCYXNlTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCdbQXBpQ2hhdEhpc3RvcnldIGFkZE1lc3NhZ2UgY2FsbGVkIGZvciBzZXNzaW9uOicsIHRoaXMuc2Vzc2lvbklkKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHlwZSA9IG1lc3NhZ2UuX2dldFR5cGUoKSA9PT0gJ2h1bWFuJyA/ICdodW1hbicgOiAnYWknO1xuXG4gICAgICBhd2FpdCBmZXRjaCh0aGlzLmFwaVVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBhY3Rpb246ICdhZGQnLFxuICAgICAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgbWVzc2FnZToge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2UuY29udGVudCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5sb2coJ1tBcGlDaGF0SGlzdG9yeV0gTWVzc2FnZSBhZGRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignW0FwaUNoYXRIaXN0b3J5XSBhZGRNZXNzYWdlIGVycm9yOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRNZXNzYWdlcyhtZXNzYWdlczogQmFzZU1lc3NhZ2VbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgICAgYXdhaXQgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUubG9nKCdbQXBpQ2hhdEhpc3RvcnldIGNsZWFyIGNhbGxlZCBmb3Igc2Vzc2lvbjonLCB0aGlzLnNlc3Npb25JZCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZldGNoKHRoaXMuYXBpVXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGFjdGlvbjogJ2NsZWFyJyxcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbQXBpQ2hhdEhpc3RvcnldIGNsZWFyIGVycm9yOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1lbW9yeSBpbXBsZW1lbnRzIElOb2RlVHlwZSB7XG4gIGRlc2NyaXB0aW9uOiBJTm9kZVR5cGVEZXNjcmlwdGlvbiA9IHtcbiAgICBkaXNwbGF5TmFtZTogJ01lbW9yeSBBUEknLFxuICAgIG5hbWU6ICdtZW1vcnlBcGknLFxuICAgIGljb246ICdmYTpicmFpbicsXG4gICAgZ3JvdXA6IFsndHJhbnNmb3JtJ10sXG4gICAgdmVyc2lvbjogMSxcbiAgICBzdWJ0aXRsZTogJ0V4dGVybmFsIEFQSSBNZW1vcnknLFxuICAgIGRlc2NyaXB0aW9uOiAnVXNlIGFuIGV4dGVybmFsIEFQSSBhcyBjaGF0IG1lbW9yeSBzdG9yYWdlJyxcbiAgICBkZWZhdWx0czoge1xuICAgICAgbmFtZTogJ01lbW9yeSBBUEknLFxuICAgIH0sXG4gICAgY29kZXg6IHtcbiAgICAgIGNhdGVnb3JpZXM6IFsnQUknXSxcbiAgICAgIHN1YmNhdGVnb3JpZXM6IHtcbiAgICAgICAgQUk6IFsnTWVtb3J5J10sXG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIHByaW1hcnlEb2N1bWVudGF0aW9uOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9naXRodWIuY29tL2ZpbGlwZXh5ei9uOG4tbm9kZXMtbWVtb3J5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGlucHV0czogW10sXG4gICAgb3V0cHV0czogWydhaV9tZW1vcnknIGFzIGNvbnN0XSxcbiAgICBvdXRwdXROYW1lczogWydNZW1vcnknXSxcbiAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiAnQVBJIFVSTCcsXG4gICAgICAgIG5hbWU6ICdhcGlVcmwnLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogJycsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VSTCBvZiB0aGUgbWVtb3J5IEFQSSAoZS5nLiwgbjhuIHdlYmhvb2sgVVJMKScsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnaHR0cHM6Ly95b3VyLW44bi5jb20vd2ViaG9vay9tZW1vcnknLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGlzcGxheU5hbWU6ICdTZXNzaW9uIElEJyxcbiAgICAgICAgbmFtZTogJ3Nlc3Npb25JZCcsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiAnPXt7ICRqc29uLnNlc3Npb25JZCB9fScsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29udmVyc2F0aW9uIHNlc3Npb24nLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGlzcGxheU5hbWU6ICdBUEkgS2V5JyxcbiAgICAgICAgbmFtZTogJ2FwaUtleScsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICB0eXBlT3B0aW9uczoge1xuICAgICAgICAgIHBhc3N3b3JkOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdPcHRpb25hbCBBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkaXNwbGF5TmFtZTogJ0NvbnRleHQgV2luZG93IExlbmd0aCcsXG4gICAgICAgIG5hbWU6ICdjb250ZXh0V2luZG93TGVuZ3RoJyxcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGRlZmF1bHQ6IDEwLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBwcmV2aW91cyBtZXNzYWdlcyB0byBpbmNsdWRlIGFzIGNvbnRleHQnLFxuICAgICAgfSxcbiAgICBdLFxuICB9O1xuXG4gIGFzeW5jIHN1cHBseURhdGEoXG4gICAgdGhpczogSVN1cHBseURhdGFGdW5jdGlvbnMsXG4gICAgaXRlbUluZGV4OiBudW1iZXJcbiAgKTogUHJvbWlzZTxTdXBwbHlEYXRhPiB7XG4gICAgY29uc3QgYXBpVXJsID0gdGhpcy5nZXROb2RlUGFyYW1ldGVyKCdhcGlVcmwnLCBpdGVtSW5kZXgpIGFzIHN0cmluZztcbiAgICBjb25zdCBzZXNzaW9uSWQgPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ3Nlc3Npb25JZCcsIGl0ZW1JbmRleCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGFwaUtleSA9ICh0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ2FwaUtleScsIGl0ZW1JbmRleCwgJycpIGFzIHN0cmluZykgfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRleHRXaW5kb3dMZW5ndGggPSB0aGlzLmdldE5vZGVQYXJhbWV0ZXIoJ2NvbnRleHRXaW5kb3dMZW5ndGgnLCBpdGVtSW5kZXgsIDEwKSBhcyBudW1iZXI7XG5cbiAgICBjb25zb2xlLmxvZygnW01lbW9yeSBBUEldIENyZWF0aW5nIG1lbW9yeSBmb3Igc2Vzc2lvbjonLCBzZXNzaW9uSWQpO1xuXG4gICAgY29uc3QgY2hhdEhpc3RvcnkgPSBuZXcgQXBpQ2hhdEhpc3RvcnkoYXBpVXJsLCBzZXNzaW9uSWQsIGFwaUtleSk7XG5cbiAgICBjb25zdCBtZW1vcnkgPSBuZXcgQnVmZmVyV2luZG93TWVtb3J5KHtcbiAgICAgIG1lbW9yeUtleTogJ2NoYXRfaGlzdG9yeScsXG4gICAgICBjaGF0SGlzdG9yeSxcbiAgICAgIHJldHVybk1lc3NhZ2VzOiB0cnVlLFxuICAgICAgaW5wdXRLZXk6ICdpbnB1dCcsXG4gICAgICBvdXRwdXRLZXk6ICdvdXRwdXQnLFxuICAgICAgazogY29udGV4dFdpbmRvd0xlbmd0aCxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICByZXNwb25zZTogbWVtb3J5LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==