@memtensor/memos-cloud-openclaw-plugin 0.1.11 → 0.1.12

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.
@@ -2,6 +2,7 @@ import { readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { homedir } from "node:os";
4
4
  import { setTimeout as delay } from "node:timers/promises";
5
+ import { CONFIG_RESOLUTION_FIELDS } from "./config-resolution-schema.js";
5
6
 
6
7
  const DEFAULT_BASE_URL = "https://memos.memtensor.cn/api/openmem/v1";
7
8
  export const USER_QUERY_MARKER = "user\u200b原\u200b始\u200bquery\u200b:\u200b\u200b\u200b\u200b";
@@ -127,7 +128,6 @@ function loadEnvVar(name) {
127
128
  loadEnvFiles();
128
129
  const fromFiles = loadEnvFromFiles(name);
129
130
  if (fromFiles !== undefined) return fromFiles;
130
- if (envFileContents.size === 0) return process.env[name];
131
131
  return undefined;
132
132
  }
133
133
 
@@ -226,6 +226,10 @@ export function buildConfig(pluginConfig = {}) {
226
226
  ? parseBool(loadEnvVar("MEMOS_INCLUDE_ASSISTANT"), true)
227
227
  : cfg.includeAssistant !== false;
228
228
  const maxMessageChars = cfg.maxMessageChars ?? parseNumber(loadEnvVar("MEMOS_MAX_MESSAGE_CHARS"), 20000);
229
+ const rumEnabled = parseBool(
230
+ cfg.rumEnabled,
231
+ parseBool(loadEnvVar("MEMOS_RUM_ENABLED"), true),
232
+ );
229
233
  const useDirectSessionUserId = parseBool(
230
234
  cfg.useDirectSessionUserId,
231
235
  parseBool(loadEnvVar("MEMOS_USE_DIRECT_SESSION_USER_ID"), false),
@@ -289,10 +293,64 @@ export function buildConfig(pluginConfig = {}) {
289
293
  timeoutMs: cfg.timeoutMs ?? 5000,
290
294
  retries: cfg.retries ?? 1,
291
295
  throttleMs,
296
+ rumEnabled,
292
297
  _agentOverrides: cfg.agentOverrides ?? parseJsonObject(loadEnvVar("MEMOS_AGENT_OVERRIDES")) ?? {},
293
298
  };
294
299
  }
295
300
 
301
+ function hasConfigValue(cfg, field) {
302
+ const configKey = field.configKey ?? field.key;
303
+ if (field.configMode === "truthy") return Boolean(cfg[configKey]);
304
+ return cfg[configKey] !== undefined && cfg[configKey] !== null;
305
+ }
306
+
307
+ function hasEnvValue(envValue, envMode) {
308
+ if (envMode === "truthy") return Boolean(envValue);
309
+ if (envMode === "defined") return envValue !== undefined;
310
+ return false;
311
+ }
312
+
313
+ function resolveInheritedValue(field, resolved, envRaw) {
314
+ if (Object.prototype.hasOwnProperty.call(field, "inheritedValue")) {
315
+ return field.inheritedValue;
316
+ }
317
+ if (field.inheritedFrom === "env") {
318
+ const envValue = field.envVar ? envRaw[field.envVar] : undefined;
319
+ return envValue ?? field.inheritedFallback;
320
+ }
321
+ const resolvedKey = field.resolvedKey ?? field.key;
322
+ return resolved[resolvedKey];
323
+ }
324
+
325
+ export function getConfigResolution(pluginConfig = {}) {
326
+ const cfg = pluginConfig ?? {};
327
+ const resolved = buildConfig(cfg);
328
+ const envRaw = {};
329
+
330
+ for (const field of CONFIG_RESOLUTION_FIELDS) {
331
+ if (!field.envVar) continue;
332
+ if (Object.prototype.hasOwnProperty.call(envRaw, field.envVar)) continue;
333
+ envRaw[field.envVar] = loadEnvVar(field.envVar);
334
+ }
335
+
336
+ const fieldMeta = {};
337
+ for (const field of CONFIG_RESOLUTION_FIELDS) {
338
+ const envValue = field.envVar ? envRaw[field.envVar] : undefined;
339
+ const source = hasConfigValue(cfg, field)
340
+ ? "config"
341
+ : hasEnvValue(envValue, field.envMode)
342
+ ? "env"
343
+ : field.fallbackSource;
344
+ fieldMeta[field.key] = {
345
+ source,
346
+ inheritedValue: resolveInheritedValue(field, resolved, envRaw),
347
+ uiDefaultValue: field.uiDefaultValue,
348
+ };
349
+ }
350
+
351
+ return { resolved, fieldMeta };
352
+ }
353
+
296
354
  const AGENT_OVERRIDABLE_KEYS = [
297
355
  "knowledgebaseIds", "memoryLimitNumber", "preferenceLimitNumber",
298
356
  "includePreference", "includeToolMemory", "toolMemoryLimitNumber",
@@ -2,7 +2,7 @@
2
2
  "id": "memos-cloud-openclaw-plugin",
3
3
  "name": "MemOS Cloud OpenClaw Plugin",
4
4
  "description": "MemOS Cloud recall + add memory via lifecycle hooks",
5
- "version": "0.1.11",
5
+ "version": "0.1.12",
6
6
  "kind": "lifecycle",
7
7
  "main": "./index.js",
8
8
  "configSchema": {
@@ -18,8 +18,7 @@
18
18
  },
19
19
  "userId": {
20
20
  "type": "string",
21
- "description": "MemOS user_id (default: openclaw-user)",
22
- "default": "openclaw-user"
21
+ "description": "MemOS user_id (default: openclaw-user)"
23
22
  },
24
23
  "conversationId": {
25
24
  "type": "string",
@@ -38,17 +37,14 @@
38
37
  "enum": [
39
38
  "none",
40
39
  "counter"
41
- ],
42
- "default": "none"
40
+ ]
43
41
  },
44
42
  "useDirectSessionUserId": {
45
43
  "type": "boolean",
46
- "description": "When enabled, direct-session keys like agent:main:<provider>:direct:<id> use the direct id as MemOS user_id instead of the default configured userId.",
47
- "default": false
44
+ "description": "When enabled, direct-session keys like agent:main:<provider>:direct:<id> use the direct id as MemOS user_id instead of the default configured userId."
48
45
  },
49
46
  "resetOnNew": {
50
- "type": "boolean",
51
- "default": true
47
+ "type": "boolean"
52
48
  },
53
49
  "queryPrefix": {
54
50
  "type": "string",
@@ -63,8 +59,37 @@
63
59
  "default": true
64
60
  },
65
61
  "recallGlobal": {
66
- "type": "boolean",
67
- "default": true
62
+ "type": "boolean"
63
+ },
64
+ "recallFilterEnabled": {
65
+ "type": "boolean"
66
+ },
67
+ "recallFilterBaseUrl": {
68
+ "type": "string",
69
+ "description": "OpenAI-compatible base URL for recall filter model"
70
+ },
71
+ "recallFilterApiKey": {
72
+ "type": "string",
73
+ "description": "API key for recall filter model endpoint"
74
+ },
75
+ "recallFilterModel": {
76
+ "type": "string",
77
+ "description": "Model name used to filter recall candidates"
78
+ },
79
+ "recallFilterTimeoutMs": {
80
+ "type": "integer"
81
+ },
82
+ "recallFilterRetries": {
83
+ "type": "integer"
84
+ },
85
+ "recallFilterCandidateLimit": {
86
+ "type": "integer"
87
+ },
88
+ "recallFilterMaxItemChars": {
89
+ "type": "integer"
90
+ },
91
+ "recallFilterFailOpen": {
92
+ "type": "boolean"
68
93
  },
69
94
  "addEnabled": {
70
95
  "type": "boolean",
@@ -75,13 +100,11 @@
75
100
  "enum": [
76
101
  "last_turn",
77
102
  "full_session"
78
- ],
79
- "default": "last_turn"
103
+ ]
80
104
  },
81
105
  "maxMessageChars": {
82
106
  "type": "integer",
83
- "description": "Max chars per message when adding",
84
- "default": 20000
107
+ "description": "Max chars per message when adding"
85
108
  },
86
109
  "maxItemChars": {
87
110
  "type": "integer",
@@ -89,12 +112,11 @@
89
112
  "default": 8000
90
113
  },
91
114
  "includeAssistant": {
92
- "type": "boolean",
93
- "default": true
115
+ "type": "boolean"
94
116
  },
95
117
  "memoryLimitNumber": {
96
118
  "type": "integer",
97
- "default": 6
119
+ "default": 9
98
120
  },
99
121
  "preferenceLimitNumber": {
100
122
  "type": "integer",
@@ -112,50 +134,15 @@
112
134
  "type": "integer",
113
135
  "default": 6
114
136
  },
137
+ "relativity": {
138
+ "type": "number",
139
+ "description": "Minimum relativity score required before a recalled item is injected"
140
+ },
115
141
  "filter": {
116
142
  "type": "object",
117
143
  "description": "MemOS search filter",
118
144
  "additionalProperties": true
119
145
  },
120
- "relativity": {
121
- "type": "number",
122
- "description": "Search relativity threshold",
123
- "default": 0.45
124
- },
125
- "recallFilterEnabled": {
126
- "type": "boolean",
127
- "default": false
128
- },
129
- "recallFilterBaseUrl": {
130
- "type": "string",
131
- "description": "OpenAI-compatible API base URL for recall filtering"
132
- },
133
- "recallFilterApiKey": {
134
- "type": "string"
135
- },
136
- "recallFilterModel": {
137
- "type": "string"
138
- },
139
- "recallFilterTimeoutMs": {
140
- "type": "integer",
141
- "default": 30000
142
- },
143
- "recallFilterRetries": {
144
- "type": "integer",
145
- "default": 1
146
- },
147
- "recallFilterCandidateLimit": {
148
- "type": "integer",
149
- "default": 30
150
- },
151
- "recallFilterMaxItemChars": {
152
- "type": "integer",
153
- "default": 500
154
- },
155
- "recallFilterFailOpen": {
156
- "type": "boolean",
157
- "default": true
158
- },
159
146
  "knowledgebaseIds": {
160
147
  "type": "array",
161
148
  "items": {
@@ -176,8 +163,7 @@
176
163
  "type": "string"
177
164
  },
178
165
  "multiAgentMode": {
179
- "type": "boolean",
180
- "default": false
166
+ "type": "boolean"
181
167
  },
182
168
  "allowedAgents": {
183
169
  "type": "array",
@@ -200,6 +186,9 @@
200
186
  }
201
187
  },
202
188
  "asyncMode": {
189
+ "type": "boolean"
190
+ },
191
+ "rumEnabled": {
203
192
  "type": "boolean",
204
193
  "default": true
205
194
  },
@@ -212,8 +201,7 @@
212
201
  "default": 1
213
202
  },
214
203
  "throttleMs": {
215
- "type": "integer",
216
- "default": 0
204
+ "type": "integer"
217
205
  },
218
206
  "agentOverrides": {
219
207
  "type": "object",
@@ -2,7 +2,7 @@
2
2
  "id": "memos-cloud-openclaw-plugin",
3
3
  "name": "MemOS Cloud OpenClaw Plugin",
4
4
  "description": "MemOS Cloud recall + add memory via lifecycle hooks",
5
- "version": "0.1.11",
5
+ "version": "0.1.12",
6
6
  "kind": "lifecycle",
7
7
  "main": "./index.js",
8
8
  "configSchema": {
@@ -18,8 +18,7 @@
18
18
  },
19
19
  "userId": {
20
20
  "type": "string",
21
- "description": "MemOS user_id (default: openclaw-user)",
22
- "default": "openclaw-user"
21
+ "description": "MemOS user_id (default: openclaw-user)"
23
22
  },
24
23
  "conversationId": {
25
24
  "type": "string",
@@ -38,17 +37,14 @@
38
37
  "enum": [
39
38
  "none",
40
39
  "counter"
41
- ],
42
- "default": "none"
40
+ ]
43
41
  },
44
42
  "useDirectSessionUserId": {
45
43
  "type": "boolean",
46
- "description": "When enabled, direct-session keys like agent:main:<provider>:direct:<id> use the direct id as MemOS user_id instead of the default configured userId.",
47
- "default": false
44
+ "description": "When enabled, direct-session keys like agent:main:<provider>:direct:<id> use the direct id as MemOS user_id instead of the default configured userId."
48
45
  },
49
46
  "resetOnNew": {
50
- "type": "boolean",
51
- "default": true
47
+ "type": "boolean"
52
48
  },
53
49
  "queryPrefix": {
54
50
  "type": "string",
@@ -63,8 +59,37 @@
63
59
  "default": true
64
60
  },
65
61
  "recallGlobal": {
66
- "type": "boolean",
67
- "default": true
62
+ "type": "boolean"
63
+ },
64
+ "recallFilterEnabled": {
65
+ "type": "boolean"
66
+ },
67
+ "recallFilterBaseUrl": {
68
+ "type": "string",
69
+ "description": "OpenAI-compatible base URL for recall filter model"
70
+ },
71
+ "recallFilterApiKey": {
72
+ "type": "string",
73
+ "description": "API key for recall filter model endpoint"
74
+ },
75
+ "recallFilterModel": {
76
+ "type": "string",
77
+ "description": "Model name used to filter recall candidates"
78
+ },
79
+ "recallFilterTimeoutMs": {
80
+ "type": "integer"
81
+ },
82
+ "recallFilterRetries": {
83
+ "type": "integer"
84
+ },
85
+ "recallFilterCandidateLimit": {
86
+ "type": "integer"
87
+ },
88
+ "recallFilterMaxItemChars": {
89
+ "type": "integer"
90
+ },
91
+ "recallFilterFailOpen": {
92
+ "type": "boolean"
68
93
  },
69
94
  "addEnabled": {
70
95
  "type": "boolean",
@@ -75,13 +100,11 @@
75
100
  "enum": [
76
101
  "last_turn",
77
102
  "full_session"
78
- ],
79
- "default": "last_turn"
103
+ ]
80
104
  },
81
105
  "maxMessageChars": {
82
106
  "type": "integer",
83
- "description": "Max chars per message when adding",
84
- "default": 20000
107
+ "description": "Max chars per message when adding"
85
108
  },
86
109
  "maxItemChars": {
87
110
  "type": "integer",
@@ -89,12 +112,11 @@
89
112
  "default": 8000
90
113
  },
91
114
  "includeAssistant": {
92
- "type": "boolean",
93
- "default": true
115
+ "type": "boolean"
94
116
  },
95
117
  "memoryLimitNumber": {
96
118
  "type": "integer",
97
- "default": 6
119
+ "default": 9
98
120
  },
99
121
  "preferenceLimitNumber": {
100
122
  "type": "integer",
@@ -112,50 +134,15 @@
112
134
  "type": "integer",
113
135
  "default": 6
114
136
  },
137
+ "relativity": {
138
+ "type": "number",
139
+ "description": "Minimum relativity score required before a recalled item is injected"
140
+ },
115
141
  "filter": {
116
142
  "type": "object",
117
143
  "description": "MemOS search filter",
118
144
  "additionalProperties": true
119
145
  },
120
- "relativity": {
121
- "type": "number",
122
- "description": "Search relativity threshold",
123
- "default": 0.45
124
- },
125
- "recallFilterEnabled": {
126
- "type": "boolean",
127
- "default": false
128
- },
129
- "recallFilterBaseUrl": {
130
- "type": "string",
131
- "description": "OpenAI-compatible API base URL for recall filtering"
132
- },
133
- "recallFilterApiKey": {
134
- "type": "string"
135
- },
136
- "recallFilterModel": {
137
- "type": "string"
138
- },
139
- "recallFilterTimeoutMs": {
140
- "type": "integer",
141
- "default": 30000
142
- },
143
- "recallFilterRetries": {
144
- "type": "integer",
145
- "default": 1
146
- },
147
- "recallFilterCandidateLimit": {
148
- "type": "integer",
149
- "default": 30
150
- },
151
- "recallFilterMaxItemChars": {
152
- "type": "integer",
153
- "default": 500
154
- },
155
- "recallFilterFailOpen": {
156
- "type": "boolean",
157
- "default": true
158
- },
159
146
  "knowledgebaseIds": {
160
147
  "type": "array",
161
148
  "items": {
@@ -176,8 +163,7 @@
176
163
  "type": "string"
177
164
  },
178
165
  "multiAgentMode": {
179
- "type": "boolean",
180
- "default": false
166
+ "type": "boolean"
181
167
  },
182
168
  "allowedAgents": {
183
169
  "type": "array",
@@ -200,6 +186,9 @@
200
186
  }
201
187
  },
202
188
  "asyncMode": {
189
+ "type": "boolean"
190
+ },
191
+ "rumEnabled": {
203
192
  "type": "boolean",
204
193
  "default": true
205
194
  },
@@ -212,8 +201,7 @@
212
201
  "default": 1
213
202
  },
214
203
  "throttleMs": {
215
- "type": "integer",
216
- "default": 0
204
+ "type": "integer"
217
205
  },
218
206
  "agentOverrides": {
219
207
  "type": "object",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memtensor/memos-cloud-openclaw-plugin",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "OpenClaw lifecycle plugin for MemOS Cloud (add + recall memory)",
5
5
  "scripts": {
6
6
  "sync-version": "node scripts/sync-version.js",
@@ -29,16 +29,25 @@
29
29
  "author": "MemTensor",
30
30
  "license": "MIT",
31
31
  "openclaw": {
32
+ "hooks": [
33
+ "./index.js"
34
+ ],
32
35
  "extensions": [
33
36
  "./index.js"
34
37
  ]
35
38
  },
36
39
  "clawdbot": {
40
+ "hooks": [
41
+ "./index.js"
42
+ ],
37
43
  "extensions": [
38
44
  "./index.js"
39
45
  ]
40
46
  },
41
47
  "moltbot": {
48
+ "hooks": [
49
+ "./index.js"
50
+ ],
42
51
  "extensions": [
43
52
  "./index.js"
44
53
  ]