@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 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 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
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.
@@ -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.13",
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.13",
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 : {};
@@ -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 { 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
+ }