@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 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 registers both a **memory slot** (`kind: "memory"`) and a **context engine** (`api.registerContextEngine`). These are independent registrations:
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`, activates OpenClaw's "Memory Recall" system prompt section. Always active.
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.
@@ -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.14",
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.14",
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": {
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Nowledge Mem Context Engine for OpenClaw.
3
3
  *
4
- * Registers alongside the memory slot (kind: "memory"). When users activate
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
- // OpenClaw memory-slot compatibility (required for system prompt activation)
47
- api.registerTool(createMemorySearchTool(client, logger));
48
- api.registerTool(createMemoryGetTool(client, logger));
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
+ }