@nowledge/openclaw-nowledge-mem 0.8.13 → 0.8.15
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/CHANGELOG.md +22 -0
- package/CLAUDE.md +1 -1
- package/README.md +9 -0
- package/openclaw.plugin.json +10 -2
- package/package.json +1 -1
- package/src/config.js +8 -1
- package/src/context-engine.js +2 -1
- package/src/index.js +16 -6
- package/src/register-mode.js +9 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,28 @@ All notable changes to the Nowledge Mem OpenClaw plugin will be documented in th
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## [0.8.15] - 2026-04-15
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **Corpus supplement now works cleanly while `memory-core` stays on the memory slot.** The plugin is now published as a dual-role OpenClaw plugin, so it can remain loaded for corpus supplement and native Nowledge Mem tools even when `memory-core` owns the primary memory slot.
|
|
12
|
+
- **Supplement mode no longer shadows `memory-core`'s own `memory_search` / `memory_get` tools.** Those compatibility tools now register only when Nowledge Mem itself owns the memory slot.
|
|
13
|
+
- **No local source patch should be needed for dreaming integration.** Earlier builds could fall into a broken topology where the plugin was disabled before supplement registration ever mattered, which made users patch local plugin source to keep corpus mode alive.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- The OpenClaw manifest and runtime export now declare the plugin as `["memory", "context-engine"]`, which matches its real capabilities and keeps supplement mode alive beside `memory-core`.
|
|
18
|
+
|
|
19
|
+
## [0.8.14] - 2026-04-14
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- OpenClaw-native `dreaming` config no longer crashes plugin registration when Nowledge Mem owns the memory slot. The plugin now accepts that host-managed config object instead of rejecting it as an unknown key, so memory-core can keep running the dreaming engine alongside Nowledge Mem.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- The OpenClaw manifest, validator, and docs now explicitly treat `dreaming` as a host-owned pass-through config key for memory-slot compatibility.
|
|
28
|
+
|
|
7
29
|
## [0.8.13] - 2026-04-11
|
|
8
30
|
|
|
9
31
|
### Fixed
|
package/CLAUDE.md
CHANGED
|
@@ -82,7 +82,7 @@ Enable when memory-core is the memory slot and you want cross-tool knowledge to
|
|
|
82
82
|
|
|
83
83
|
## Context Engine (CE) Architecture
|
|
84
84
|
|
|
85
|
-
The plugin
|
|
85
|
+
The plugin is published as a dual-role OpenClaw plugin (`kind: ["memory", "context-engine"]`). These roles remain independent at runtime:
|
|
86
86
|
|
|
87
87
|
- **Memory slot**: provides `memory_search` + `memory_get`, activates OpenClaw's "Memory Recall" system prompt section. Always active.
|
|
88
88
|
- **Context engine**: activated when user sets `plugins.slots.contextEngine: "nowledge-mem"`. Replaces hooks with richer CE lifecycle.
|
package/README.md
CHANGED
|
@@ -240,6 +240,10 @@ When OpenClaw's memory-core is the primary memory slot and Nowledge Mem runs alo
|
|
|
240
240
|
|
|
241
241
|
Requires OpenClaw >= 2026.4.5.
|
|
242
242
|
|
|
243
|
+
As of `0.8.15`, this works without local source edits. The plugin now stays active beside `memory-core` for supplement mode, while leaving `memory-core`'s own `memory_search` / `memory_get` pair in place.
|
|
244
|
+
|
|
245
|
+
If OpenClaw stores a top-level `dreaming` object on this plugin while it owns the memory slot, that is expected. Dreaming remains OpenClaw-native host config; this plugin accepts it so memory-core can run the dreaming engine alongside Nowledge Mem without registration errors.
|
|
246
|
+
|
|
243
247
|
### Three Modes at a Glance
|
|
244
248
|
|
|
245
249
|
```mermaid
|
|
@@ -428,6 +432,7 @@ To change settings, use the OpenClaw plugin settings UI. Changes take effect on
|
|
|
428
432
|
| `corpusSupplement` | boolean | `false` | Register as a searchable corpus inside memory-core's recall and dreaming pipeline |
|
|
429
433
|
| `corpusMaxResults` | integer | `5` | Max results per corpus supplement search (1-20) |
|
|
430
434
|
| `corpusMinScore` | integer | `0` | Min relevance score (0-100%) for supplement results. 0 = include all |
|
|
435
|
+
| `dreaming` | object | — | Optional OpenClaw-native dreaming config accepted when this plugin owns the memory slot. The host consumes it; this plugin only tolerates and preserves it |
|
|
431
436
|
| `apiUrl` | string | `""` | Remote server URL. Empty = local (`http://127.0.0.1:14242`) |
|
|
432
437
|
| `apiKey` | string | `""` | API key for remote access. Injected as `NMEM_API_KEY` env var, never logged |
|
|
433
438
|
|
|
@@ -526,6 +531,10 @@ All 10 plugin tools register automatically when the plugin loads. No tool-level
|
|
|
526
531
|
}
|
|
527
532
|
```
|
|
528
533
|
|
|
534
|
+
**`corpusSupplement: true` is set, but startup still logs `corpus=false`**
|
|
535
|
+
|
|
536
|
+
Update to `0.8.15` or newer. Older builds could disable the plugin too early when `memory-core` owned the memory slot, which made supplement mode look unavailable even on new OpenClaw builds.
|
|
537
|
+
|
|
529
538
|
If `openclaw status` shows a CRITICAL warning about `plugins.allow`, this is the fix. Run `nowledge_mem_status` inside a conversation to check both plugin trust and memory slot status.
|
|
530
539
|
|
|
531
540
|
Do not list `nowledge_mem_*` tool names in `tools.allow` — OpenClaw silently strips allowlists that contain only plugin entries, so the config looks active but does nothing.
|
package/openclaw.plugin.json
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"id": "openclaw-nowledge-mem",
|
|
3
3
|
"name": "Nowledge Mem",
|
|
4
4
|
"description": "Cross-tool knowledge graph memory for OpenClaw with Working Memory, graph search, and session distillation.",
|
|
5
|
-
"version": "0.8.
|
|
6
|
-
"kind": "memory",
|
|
5
|
+
"version": "0.8.15",
|
|
6
|
+
"kind": ["memory", "context-engine"],
|
|
7
7
|
"skills": [
|
|
8
8
|
"skills/memory-guide"
|
|
9
9
|
],
|
|
@@ -52,6 +52,10 @@
|
|
|
52
52
|
"label": "Corpus supplement min score (%)",
|
|
53
53
|
"help": "Minimum relevance score (0-100%) for corpus supplement results. Set to 0 to include all. Only used when corpusSupplement is enabled."
|
|
54
54
|
},
|
|
55
|
+
"dreaming": {
|
|
56
|
+
"label": "Dreaming",
|
|
57
|
+
"help": "Optional OpenClaw dreaming config consumed by the host when this plugin owns the memory slot. This plugin accepts and preserves the setting; memory-core still provides the dreaming engine."
|
|
58
|
+
},
|
|
55
59
|
"apiUrl": {
|
|
56
60
|
"label": "Server URL (remote mode)",
|
|
57
61
|
"help": "Leave empty for local mode (default: http://127.0.0.1:14242). Set to your remote server URL for cross-device or team access. See: https://docs.nowledge.co/docs/remote-access"
|
|
@@ -143,6 +147,10 @@
|
|
|
143
147
|
"maximum": 100,
|
|
144
148
|
"description": "Minimum relevance score (0-100%) for corpus supplement results (only used when corpusSupplement is enabled)"
|
|
145
149
|
},
|
|
150
|
+
"dreaming": {
|
|
151
|
+
"type": "object",
|
|
152
|
+
"description": "Optional OpenClaw native dreaming config. Accepted and preserved when this plugin owns the memory slot."
|
|
153
|
+
},
|
|
146
154
|
"apiUrl": {
|
|
147
155
|
"type": "string",
|
|
148
156
|
"default": "",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nowledge/openclaw-nowledge-mem",
|
|
3
3
|
"displayName": "Nowledge Mem for OpenClaw",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.15",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Nowledge Mem memory plugin for OpenClaw, local-first personal knowledge base",
|
|
7
7
|
"author": {
|
package/src/config.js
CHANGED
|
@@ -26,6 +26,7 @@ const ALLOWED_KEYS = new Set([
|
|
|
26
26
|
"corpusSupplement",
|
|
27
27
|
"corpusMaxResults",
|
|
28
28
|
"corpusMinScore",
|
|
29
|
+
"dreaming",
|
|
29
30
|
"apiUrl",
|
|
30
31
|
"apiKey",
|
|
31
32
|
"space",
|
|
@@ -213,7 +214,7 @@ function firstDefined(...options) {
|
|
|
213
214
|
*
|
|
214
215
|
* Canonical keys: sessionContext, sessionDigest, digestMinInterval,
|
|
215
216
|
* maxContextResults, recallMinScore, maxThreadMessageChars,
|
|
216
|
-
* apiUrl, apiKey, space, spaceTemplate
|
|
217
|
+
* apiUrl, apiKey, space, spaceTemplate, dreaming
|
|
217
218
|
*
|
|
218
219
|
* Legacy aliases (accepted from all sources; never shown in docs):
|
|
219
220
|
* autoRecall → sessionContext
|
|
@@ -234,6 +235,12 @@ function firstDefined(...options) {
|
|
|
234
235
|
* NMEM_API_URL — remote server URL
|
|
235
236
|
* NMEM_API_KEY — API key (never logged)
|
|
236
237
|
* NMEM_SPACE — ambient space name (legacy: NMEM_SPACE_ID)
|
|
238
|
+
*
|
|
239
|
+
* Host-owned pass-through key:
|
|
240
|
+
* dreaming — OpenClaw's native dreaming config object.
|
|
241
|
+
* This plugin does not interpret it, but must
|
|
242
|
+
* tolerate it when OpenClaw stores dreaming
|
|
243
|
+
* settings on the selected memory-slot owner.
|
|
237
244
|
*/
|
|
238
245
|
export function parseConfig(raw, logger) {
|
|
239
246
|
const pluginCfg = raw && typeof raw === "object" ? raw : {};
|
package/src/context-engine.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Nowledge Mem Context Engine for OpenClaw.
|
|
3
3
|
*
|
|
4
|
-
* Registers alongside the memory slot (kind
|
|
4
|
+
* Registers alongside the memory slot (plugin kind includes both "memory" and
|
|
5
|
+
* "context-engine"). When users activate
|
|
5
6
|
* this CE via `plugins.slots.contextEngine: "nowledge-mem"`, it takes over
|
|
6
7
|
* prompt assembly and adds richer lifecycle behavior:
|
|
7
8
|
*
|
package/src/index.js
CHANGED
|
@@ -26,13 +26,14 @@ import { createStatusTool } from "./tools/status.js";
|
|
|
26
26
|
import { createThreadFetchTool } from "./tools/thread-fetch.js";
|
|
27
27
|
import { createThreadSearchTool } from "./tools/thread-search.js";
|
|
28
28
|
import { createTimelineTool } from "./tools/timeline.js";
|
|
29
|
+
import { resolveRegistrationMode } from "./register-mode.js";
|
|
29
30
|
|
|
30
31
|
export default {
|
|
31
32
|
id: "openclaw-nowledge-mem",
|
|
32
33
|
name: "Nowledge Mem",
|
|
33
34
|
description:
|
|
34
35
|
"Local-first knowledge graph memory for AI agents — cross-AI continuity, powered by Nowledge Mem",
|
|
35
|
-
kind: "memory",
|
|
36
|
+
kind: ["memory", "context-engine"],
|
|
36
37
|
|
|
37
38
|
register(api) {
|
|
38
39
|
const logger = api.logger;
|
|
@@ -43,9 +44,19 @@ export default {
|
|
|
43
44
|
space: cfg.space,
|
|
44
45
|
});
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
const { memorySlotSelected } = resolveRegistrationMode({
|
|
48
|
+
pluginId: api.id,
|
|
49
|
+
configuredMemorySlot: api.config?.plugins?.slots?.memory,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Only the active memory slot should provide the OpenClaw-compatible
|
|
53
|
+
// memory_search / memory_get pair. When memory-core owns the slot, this
|
|
54
|
+
// plugin can still stay loaded for corpus supplement, thread sync, and
|
|
55
|
+
// native Nowledge Mem tools without shadowing memory-core's tools.
|
|
56
|
+
if (memorySlotSelected) {
|
|
57
|
+
api.registerTool(createMemorySearchTool(client, logger));
|
|
58
|
+
api.registerTool(createMemoryGetTool(client, logger));
|
|
59
|
+
}
|
|
49
60
|
|
|
50
61
|
// Nowledge Mem native tools (our differentiators)
|
|
51
62
|
api.registerTool(createSaveTool(client, logger));
|
|
@@ -61,7 +72,6 @@ export default {
|
|
|
61
72
|
// Diagnostics — pass runtime config so the status tool can detect:
|
|
62
73
|
// - plugins.allow missing or not including this plugin
|
|
63
74
|
// - memory/context-engine slot routing for capture and recall
|
|
64
|
-
const memorySlot = api.config?.plugins?.slots?.memory;
|
|
65
75
|
const contextEngineSlot = api.config?.plugins?.slots?.contextEngine;
|
|
66
76
|
const pluginsAllow = api.config?.plugins?.allow;
|
|
67
77
|
let contextEngineRegistered = false;
|
|
@@ -161,7 +171,7 @@ export default {
|
|
|
161
171
|
|
|
162
172
|
const remoteMode = !isDefaultApiUrl(cfg.apiUrl);
|
|
163
173
|
logger.info(
|
|
164
|
-
`nowledge-mem: initialized (context=${cfg.sessionContext}, digest=${cfg.sessionDigest}, corpus=${cfg.corpusSupplement}, mode=${remoteMode ? `remote → ${cfg.apiUrl}` : "local"})`,
|
|
174
|
+
`nowledge-mem: initialized (memorySlotSelected=${memorySlotSelected}, context=${cfg.sessionContext}, digest=${cfg.sessionDigest}, corpus=${cfg.corpusSupplement}, mode=${remoteMode ? `remote → ${cfg.apiUrl}` : "local"})`,
|
|
165
175
|
);
|
|
166
176
|
},
|
|
167
177
|
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function resolveRegistrationMode({ pluginId, configuredMemorySlot }) {
|
|
2
|
+
const memorySlot = configuredMemorySlot ?? "memory-core";
|
|
3
|
+
const memorySlotSelected = memorySlot === pluginId;
|
|
4
|
+
return {
|
|
5
|
+
memorySlot,
|
|
6
|
+
memorySlotSelected,
|
|
7
|
+
registerMemoryCompatTools: memorySlotSelected,
|
|
8
|
+
};
|
|
9
|
+
}
|