neuralmemory 1.9.0 → 1.10.0
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/README.md +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +31 -8
- package/dist/index.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/src/index.ts +41 -8
package/README.md
CHANGED
|
@@ -54,7 +54,7 @@ Add to `~/.openclaw/openclaw.json`:
|
|
|
54
54
|
|
|
55
55
|
**v1.7.0+**: The plugin dynamically fetches **all tools** from the MCP server at startup. Whatever version of `neural-memory` you have installed, the plugin automatically exposes every tool it provides — no plugin update needed when new tools are added.
|
|
56
56
|
|
|
57
|
-
With `neural-memory>=2.28.0`, this includes **
|
|
57
|
+
With `neural-memory>=2.28.0`, this includes **44 tools**:
|
|
58
58
|
|
|
59
59
|
| Category | Tools |
|
|
60
60
|
|----------|-------|
|
package/dist/index.d.ts
CHANGED
|
@@ -20,6 +20,11 @@
|
|
|
20
20
|
* v1.9.0: Backward-compat shim tools (memory_search, memory_get) to prevent
|
|
21
21
|
* "allowList contains unknown entries" warnings when NM replaces memory-core.
|
|
22
22
|
*
|
|
23
|
+
* v1.10.0: Singleton MCP client — multiple workspaces (multi-agent) share
|
|
24
|
+
* the same connected client instance, keyed by (pythonPath, brain). Fixes
|
|
25
|
+
* "NeuralMemory service not running" when OpenClaw registers the plugin
|
|
26
|
+
* for a second workspace after gateway startup.
|
|
27
|
+
*
|
|
23
28
|
* Registers:
|
|
24
29
|
* N tools — dynamically from MCP server (fallback: 5 core + 2 compat)
|
|
25
30
|
* 1 service — MCP process lifecycle (start/stop)
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,11 @@
|
|
|
20
20
|
* v1.9.0: Backward-compat shim tools (memory_search, memory_get) to prevent
|
|
21
21
|
* "allowList contains unknown entries" warnings when NM replaces memory-core.
|
|
22
22
|
*
|
|
23
|
+
* v1.10.0: Singleton MCP client — multiple workspaces (multi-agent) share
|
|
24
|
+
* the same connected client instance, keyed by (pythonPath, brain). Fixes
|
|
25
|
+
* "NeuralMemory service not running" when OpenClaw registers the plugin
|
|
26
|
+
* for a second workspace after gateway startup.
|
|
27
|
+
*
|
|
23
28
|
* Registers:
|
|
24
29
|
* N tools — dynamically from MCP server (fallback: 5 core + 2 compat)
|
|
25
30
|
* 1 service — MCP process lifecycle (start/stop)
|
|
@@ -99,22 +104,37 @@ export function resolveConfig(raw) {
|
|
|
99
104
|
: DEFAULT_CONFIG.initTimeout,
|
|
100
105
|
};
|
|
101
106
|
}
|
|
107
|
+
// ── Singleton MCP client pool ────────────────────────────────
|
|
108
|
+
// Multiple workspaces may call register() independently, but all
|
|
109
|
+
// should share the same MCP process per (pythonPath, brain) combo.
|
|
110
|
+
const mcpClients = new Map();
|
|
111
|
+
function getOrCreateMcpClient(cfg, logger) {
|
|
112
|
+
const key = `${cfg.pythonPath}::${cfg.brain}`;
|
|
113
|
+
const existing = mcpClients.get(key);
|
|
114
|
+
if (existing) {
|
|
115
|
+
logger.info(`Reusing existing MCP client for brain "${cfg.brain}"`);
|
|
116
|
+
return existing;
|
|
117
|
+
}
|
|
118
|
+
const mcp = new NeuralMemoryMcpClient({
|
|
119
|
+
pythonPath: cfg.pythonPath,
|
|
120
|
+
brain: cfg.brain,
|
|
121
|
+
logger,
|
|
122
|
+
timeout: cfg.timeout,
|
|
123
|
+
initTimeout: cfg.initTimeout,
|
|
124
|
+
});
|
|
125
|
+
mcpClients.set(key, mcp);
|
|
126
|
+
return mcp;
|
|
127
|
+
}
|
|
102
128
|
// ── Plugin definition ──────────────────────────────────────
|
|
103
129
|
const plugin = {
|
|
104
130
|
id: "neuralmemory",
|
|
105
131
|
name: "NeuralMemory",
|
|
106
132
|
description: "Brain-inspired persistent memory for AI agents — neurons, synapses, and fibers",
|
|
107
|
-
version: "1.
|
|
133
|
+
version: "1.10.0",
|
|
108
134
|
kind: "memory",
|
|
109
135
|
register(api) {
|
|
110
136
|
const cfg = resolveConfig(api.pluginConfig);
|
|
111
|
-
const mcp =
|
|
112
|
-
pythonPath: cfg.pythonPath,
|
|
113
|
-
brain: cfg.brain,
|
|
114
|
-
logger: api.logger,
|
|
115
|
-
timeout: cfg.timeout,
|
|
116
|
-
initTimeout: cfg.initTimeout,
|
|
117
|
-
});
|
|
137
|
+
const mcp = getOrCreateMcpClient(cfg, api.logger);
|
|
118
138
|
// ── Register fallback tools synchronously ────────────
|
|
119
139
|
// OpenClaw requires register() to be synchronous.
|
|
120
140
|
// Register stable fallback tools immediately; MCP connection
|
|
@@ -151,6 +171,9 @@ const plugin = {
|
|
|
151
171
|
}
|
|
152
172
|
},
|
|
153
173
|
async stop() {
|
|
174
|
+
// Remove from singleton pool so next register() creates fresh client
|
|
175
|
+
const key = `${cfg.pythonPath}::${cfg.brain}`;
|
|
176
|
+
mcpClients.delete(key);
|
|
154
177
|
await mcp.close();
|
|
155
178
|
api.logger.info("NeuralMemory MCP service stopped");
|
|
156
179
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"kind": "memory",
|
|
4
4
|
"name": "NeuralMemory",
|
|
5
5
|
"description": "Brain-inspired persistent memory for AI agents — neurons, synapses, and fibers. REQUIRED: set plugins.slots.memory = \"neuralmemory\" in openclaw.json to disable the default memory-core plugin and activate NeuralMemory as the exclusive memory provider.",
|
|
6
|
-
"version": "1.
|
|
6
|
+
"version": "1.10.0",
|
|
7
7
|
"configSchema": {
|
|
8
8
|
"jsonSchema": {
|
|
9
9
|
"type": "object",
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -20,6 +20,11 @@
|
|
|
20
20
|
* v1.9.0: Backward-compat shim tools (memory_search, memory_get) to prevent
|
|
21
21
|
* "allowList contains unknown entries" warnings when NM replaces memory-core.
|
|
22
22
|
*
|
|
23
|
+
* v1.10.0: Singleton MCP client — multiple workspaces (multi-agent) share
|
|
24
|
+
* the same connected client instance, keyed by (pythonPath, brain). Fixes
|
|
25
|
+
* "NeuralMemory service not running" when OpenClaw registers the plugin
|
|
26
|
+
* for a second workspace after gateway startup.
|
|
27
|
+
*
|
|
23
28
|
* Registers:
|
|
24
29
|
* N tools — dynamically from MCP server (fallback: 5 core + 2 compat)
|
|
25
30
|
* 1 service — MCP process lifecycle (start/stop)
|
|
@@ -34,6 +39,7 @@ import type {
|
|
|
34
39
|
AgentEndEvent,
|
|
35
40
|
} from "./types.js";
|
|
36
41
|
import { NeuralMemoryMcpClient } from "./mcp-client.js";
|
|
42
|
+
import type { PluginLogger } from "./types.js";
|
|
37
43
|
import { createToolsFromMcp, createFallbackTools, createCompatibilityTools } from "./tools.js";
|
|
38
44
|
import type { ToolDefinition } from "./tools.js";
|
|
39
45
|
|
|
@@ -137,6 +143,36 @@ export function resolveConfig(raw?: Record<string, unknown>): PluginConfig {
|
|
|
137
143
|
};
|
|
138
144
|
}
|
|
139
145
|
|
|
146
|
+
// ── Singleton MCP client pool ────────────────────────────────
|
|
147
|
+
// Multiple workspaces may call register() independently, but all
|
|
148
|
+
// should share the same MCP process per (pythonPath, brain) combo.
|
|
149
|
+
|
|
150
|
+
const mcpClients = new Map<string, NeuralMemoryMcpClient>();
|
|
151
|
+
|
|
152
|
+
function getOrCreateMcpClient(
|
|
153
|
+
cfg: PluginConfig,
|
|
154
|
+
logger: PluginLogger,
|
|
155
|
+
): NeuralMemoryMcpClient {
|
|
156
|
+
const key = `${cfg.pythonPath}::${cfg.brain}`;
|
|
157
|
+
|
|
158
|
+
const existing = mcpClients.get(key);
|
|
159
|
+
if (existing) {
|
|
160
|
+
logger.info(`Reusing existing MCP client for brain "${cfg.brain}"`);
|
|
161
|
+
return existing;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const mcp = new NeuralMemoryMcpClient({
|
|
165
|
+
pythonPath: cfg.pythonPath,
|
|
166
|
+
brain: cfg.brain,
|
|
167
|
+
logger,
|
|
168
|
+
timeout: cfg.timeout,
|
|
169
|
+
initTimeout: cfg.initTimeout,
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
mcpClients.set(key, mcp);
|
|
173
|
+
return mcp;
|
|
174
|
+
}
|
|
175
|
+
|
|
140
176
|
// ── Plugin definition ──────────────────────────────────────
|
|
141
177
|
|
|
142
178
|
const plugin: OpenClawPluginDefinition = {
|
|
@@ -144,19 +180,13 @@ const plugin: OpenClawPluginDefinition = {
|
|
|
144
180
|
name: "NeuralMemory",
|
|
145
181
|
description:
|
|
146
182
|
"Brain-inspired persistent memory for AI agents — neurons, synapses, and fibers",
|
|
147
|
-
version: "1.
|
|
183
|
+
version: "1.10.0",
|
|
148
184
|
kind: "memory",
|
|
149
185
|
|
|
150
186
|
register(api: OpenClawPluginApi): void {
|
|
151
187
|
const cfg = resolveConfig(api.pluginConfig);
|
|
152
188
|
|
|
153
|
-
const mcp =
|
|
154
|
-
pythonPath: cfg.pythonPath,
|
|
155
|
-
brain: cfg.brain,
|
|
156
|
-
logger: api.logger,
|
|
157
|
-
timeout: cfg.timeout,
|
|
158
|
-
initTimeout: cfg.initTimeout,
|
|
159
|
-
});
|
|
189
|
+
const mcp = getOrCreateMcpClient(cfg, api.logger);
|
|
160
190
|
|
|
161
191
|
// ── Register fallback tools synchronously ────────────
|
|
162
192
|
// OpenClaw requires register() to be synchronous.
|
|
@@ -208,6 +238,9 @@ const plugin: OpenClawPluginDefinition = {
|
|
|
208
238
|
},
|
|
209
239
|
|
|
210
240
|
async stop(): Promise<void> {
|
|
241
|
+
// Remove from singleton pool so next register() creates fresh client
|
|
242
|
+
const key = `${cfg.pythonPath}::${cfg.brain}`;
|
|
243
|
+
mcpClients.delete(key);
|
|
211
244
|
await mcp.close();
|
|
212
245
|
api.logger.info("NeuralMemory MCP service stopped");
|
|
213
246
|
},
|