@nowledge/openclaw-nowledge-mem 0.8.14 → 0.8.16
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 +19 -0
- package/CLAUDE.md +2 -2
- package/README.md +6 -0
- package/openclaw.plugin.json +2 -2
- package/package.json +1 -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,25 @@ All notable changes to the Nowledge Mem OpenClaw plugin will be documented in th
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## [0.8.16] - 2026-04-15
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Fixed a regression in `0.8.15` where supplement-mode startup could fail during plugin registration because the status tool was passed an undefined `memorySlot` variable. This could block the plugin before corpus supplement or native tools became available.
|
|
12
|
+
- Added coverage for the implicit default path where OpenClaw leaves the memory slot on `memory-core`.
|
|
13
|
+
|
|
14
|
+
## [0.8.15] - 2026-04-15
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- **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.
|
|
19
|
+
- **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.
|
|
20
|
+
- **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.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- 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`.
|
|
25
|
+
|
|
7
26
|
## [0.8.14] - 2026-04-14
|
|
8
27
|
|
|
9
28
|
### Fixed
|
package/CLAUDE.md
CHANGED
|
@@ -82,9 +82,9 @@ 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
|
-
- **Memory slot**: provides `memory_search` + `memory_get
|
|
87
|
+
- **Memory slot**: provides `memory_search` + `memory_get` and activates OpenClaw's "Memory Recall" system prompt section only when `plugins.slots.memory = "openclaw-nowledge-mem"`. In supplement mode with `memory-core`, these compatibility tools stay off so memory-core keeps owning that surface.
|
|
88
88
|
- **Context engine**: activated when user sets `plugins.slots.contextEngine: "nowledge-mem"`. Replaces hooks with richer CE lifecycle.
|
|
89
89
|
|
|
90
90
|
### CE vs Hooks (dual-path design)
|
package/README.md
CHANGED
|
@@ -240,6 +240,8 @@ 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
|
+
|
|
243
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.
|
|
244
246
|
|
|
245
247
|
### Three Modes at a Glance
|
|
@@ -529,6 +531,10 @@ All 10 plugin tools register automatically when the plugin loads. No tool-level
|
|
|
529
531
|
}
|
|
530
532
|
```
|
|
531
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
|
+
|
|
532
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.
|
|
533
539
|
|
|
534
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.16",
|
|
6
|
+
"kind": ["memory", "context-engine"],
|
|
7
7
|
"skills": [
|
|
8
8
|
"skills/memory-guide"
|
|
9
9
|
],
|
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.16",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Nowledge Mem memory plugin for OpenClaw, local-first personal knowledge base",
|
|
7
7
|
"author": {
|
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 { memorySlot, 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
|
+
}
|