@xdarkicex/openclaw-memory-libravdb 1.6.22 → 1.6.25
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 +3 -3
- package/dist/context-engine.js +37 -2
- package/dist/index.js +37 -3
- package/dist/markdown-ingest.js +14 -1
- package/docs/README.md +4 -4
- package/docs/TLS_configuration.md +17 -17
- package/docs/architecture-decisions/adr-004-sidecar-over-native-ts.md +1 -1
- package/docs/architecture.md +8 -8
- package/docs/configuration.md +13 -13
- package/docs/contributing.md +5 -5
- package/docs/dependencies.md +1 -1
- package/docs/development.md +9 -9
- package/docs/embedding-profiles.md +10 -10
- package/docs/features.md +6 -6
- package/docs/install.md +19 -19
- package/docs/installation.md +21 -21
- package/docs/mTLS_configuration.md +2 -2
- package/docs/models.md +3 -3
- package/docs/performance-and-tuning.md +5 -5
- package/docs/problem.md +1 -1
- package/docs/security.md +4 -4
- package/docs/uninstall.md +5 -5
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
`@xdarkicex/openclaw-memory-libravdb` is a local-first OpenClaw memory plugin
|
|
15
15
|
backed by the `libravdbd` vector service. It replaces the lightweight default memory
|
|
16
16
|
path with scoped session, user, and global memory; continuity-aware prompt
|
|
17
|
-
assembly; durable recall; and
|
|
17
|
+
assembly; durable recall; and daemon-owned compaction.
|
|
18
18
|
|
|
19
19
|
[Install](./docs/install.md) · [Full installation reference](./docs/installation.md) · [Architecture](./docs/architecture.md) · [Security](./docs/security.md) · [Performance and tuning](./docs/performance-and-tuning.md) · [Contributing](./docs/contributing.md)
|
|
20
20
|
|
|
@@ -109,7 +109,7 @@ Runtime requirements:
|
|
|
109
109
|
|
|
110
110
|
Compatibility note:
|
|
111
111
|
|
|
112
|
-
- this plugin is currently verified against OpenClaw `2026.
|
|
112
|
+
- this plugin is currently verified against OpenClaw `2026.5.22`
|
|
113
113
|
|
|
114
114
|
Default endpoints:
|
|
115
115
|
|
|
@@ -139,7 +139,7 @@ If your service runs elsewhere, set `sidecarPath`:
|
|
|
139
139
|
- **Memory capability ownership** - owns the OpenClaw `memory` slot and
|
|
140
140
|
registers the context engine capability at runtime.
|
|
141
141
|
- **Memory runtime bridge** - routes built-in `memory_search` calls to the same
|
|
142
|
-
libraVDB-backed
|
|
142
|
+
libraVDB-backed daemon on hosts that expose the runtime API.
|
|
143
143
|
- **Three memory scopes** - keeps active session, durable user, and global memory
|
|
144
144
|
separate.
|
|
145
145
|
- **Hybrid retrieval** - blends semantic similarity, scope, recency, and summary
|
package/dist/context-engine.js
CHANGED
|
@@ -445,6 +445,7 @@ function rankExactRecallCandidate(result, token) {
|
|
|
445
445
|
}
|
|
446
446
|
/**
|
|
447
447
|
* Extracts the exact recall fact text starting at the token marker.
|
|
448
|
+
* Tool-call patterns are sanitized to prevent loop-priming.
|
|
448
449
|
*/
|
|
449
450
|
function extractExactRecallFactText(text, token) {
|
|
450
451
|
const markerStart = text.indexOf(token);
|
|
@@ -452,7 +453,8 @@ function extractExactRecallFactText(text, token) {
|
|
|
452
453
|
return text.trim();
|
|
453
454
|
const tail = text.slice(markerStart).trim();
|
|
454
455
|
const factSentence = tail.match(/^[\s\S]*?\bmeans\b[\s\S]*?[.!?](?:\s|$)/i)?.[0]?.trim();
|
|
455
|
-
|
|
456
|
+
const extracted = factSentence ?? tail.split("\n")[0]?.trim() ?? tail;
|
|
457
|
+
return sanitizeToolCallPatterns(extracted);
|
|
456
458
|
}
|
|
457
459
|
/**
|
|
458
460
|
* Escapes special characters in memory fact text for safe rendering.
|
|
@@ -468,6 +470,38 @@ function escapeMemoryFactText(text) {
|
|
|
468
470
|
.replaceAll("\n", " ")
|
|
469
471
|
.replaceAll("\t", "	");
|
|
470
472
|
}
|
|
473
|
+
// Tool-call pattern detection for sanitization
|
|
474
|
+
const TOOL_CALL_BRACKET_RE = /\[tool:([^\]]+)\]/gi;
|
|
475
|
+
const TOOL_CALL_JSON_RE = /\{\s*"name"\s*:\s*"([^"]+)"[^}]*\}/g;
|
|
476
|
+
const TOOL_RESULT_ANNOTATION_RE = /\[tool:[^\]]+\](?:\s*[^{\[]*)?/g;
|
|
477
|
+
/**
|
|
478
|
+
* Sanitizes text that may contain tool-call syntax to prevent loop-priming.
|
|
479
|
+
* Replaces executable-looking patterns with neutral summaries rather than
|
|
480
|
+
* replaying them verbatim, so the model cannot pattern-match and repeat them.
|
|
481
|
+
*/
|
|
482
|
+
function sanitizeToolCallPatterns(text) {
|
|
483
|
+
let sanitized = text;
|
|
484
|
+
// Replace [tool:name] patterns with a neutral summary
|
|
485
|
+
sanitized = sanitized.replace(TOOL_CALL_BRACKET_RE, (_match, toolName) => {
|
|
486
|
+
return `[historical tool call: ${toolName}]`;
|
|
487
|
+
});
|
|
488
|
+
// Replace JSON tool-call objects with a neutral summary
|
|
489
|
+
sanitized = sanitized.replace(TOOL_CALL_JSON_RE, (_match, toolName) => {
|
|
490
|
+
return `[historical tool call: ${toolName}]`;
|
|
491
|
+
});
|
|
492
|
+
// Replace remaining tool-result annotations
|
|
493
|
+
sanitized = sanitized.replace(TOOL_RESULT_ANNOTATION_RE, "[historical tool call]");
|
|
494
|
+
// Detect and summarize repeated tool calls (loop indicator)
|
|
495
|
+
const toolCallCount = (sanitized.match(/\[historical tool call:\s*([^\]]+)\]/gi) || []).length;
|
|
496
|
+
if (toolCallCount > 2) {
|
|
497
|
+
const uniqueTools = new Set([...sanitized.matchAll(/\[historical tool call:\s*([^\]]+)\]/gi)].map((m) => m[1]));
|
|
498
|
+
if (uniqueTools.size === 1) {
|
|
499
|
+
// Single tool repeated multiple times — likely a loop, summarize aggressively
|
|
500
|
+
sanitized = `[Historical tool activity: repeated ${[...uniqueTools][0]} call ${toolCallCount} times. Do not repeat this pattern.]`;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return sanitized;
|
|
504
|
+
}
|
|
471
505
|
const TRUNCATION_MARKER = "...[truncated]";
|
|
472
506
|
/**
|
|
473
507
|
* Attempts to truncate an item to fit within token budget.
|
|
@@ -671,8 +705,9 @@ export function normalizeAssembleResult(result, sourceMessages) {
|
|
|
671
705
|
}
|
|
672
706
|
else {
|
|
673
707
|
if (content.trim().length > 0) {
|
|
708
|
+
const sanitizedContent = sanitizeToolCallPatterns(content);
|
|
674
709
|
const roleAttr = message.role ? ` role="${escapeMemoryFactText(message.role)}"` : "";
|
|
675
|
-
extractedMemoryItems.push(`<memory_item source="recalled"${roleAttr} provenance="durable_memory">${escapeMemoryFactText(
|
|
710
|
+
extractedMemoryItems.push(`<memory_item source="recalled"${roleAttr} provenance="durable_memory">${escapeMemoryFactText(sanitizedContent)}</memory_item>`);
|
|
676
711
|
}
|
|
677
712
|
}
|
|
678
713
|
}
|
package/dist/index.js
CHANGED
|
@@ -26891,11 +26891,35 @@ function extractExactRecallFactText(text, token) {
|
|
|
26891
26891
|
if (markerStart < 0) return text.trim();
|
|
26892
26892
|
const tail = text.slice(markerStart).trim();
|
|
26893
26893
|
const factSentence = tail.match(/^[\s\S]*?\bmeans\b[\s\S]*?[.!?](?:\s|$)/i)?.[0]?.trim();
|
|
26894
|
-
|
|
26894
|
+
const extracted = factSentence ?? tail.split("\n")[0]?.trim() ?? tail;
|
|
26895
|
+
return sanitizeToolCallPatterns(extracted);
|
|
26895
26896
|
}
|
|
26896
26897
|
function escapeMemoryFactText(text) {
|
|
26897
26898
|
return text.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'").replaceAll("\r", " ").replaceAll("\n", " ").replaceAll(" ", "	");
|
|
26898
26899
|
}
|
|
26900
|
+
var TOOL_CALL_BRACKET_RE = /\[tool:([^\]]+)\]/gi;
|
|
26901
|
+
var TOOL_CALL_JSON_RE = /\{\s*"name"\s*:\s*"([^"]+)"[^}]*\}/g;
|
|
26902
|
+
var TOOL_RESULT_ANNOTATION_RE = /\[tool:[^\]]+\](?:\s*[^{\[]*)?/g;
|
|
26903
|
+
function sanitizeToolCallPatterns(text) {
|
|
26904
|
+
let sanitized = text;
|
|
26905
|
+
sanitized = sanitized.replace(TOOL_CALL_BRACKET_RE, (_match, toolName) => {
|
|
26906
|
+
return `[historical tool call: ${toolName}]`;
|
|
26907
|
+
});
|
|
26908
|
+
sanitized = sanitized.replace(TOOL_CALL_JSON_RE, (_match, toolName) => {
|
|
26909
|
+
return `[historical tool call: ${toolName}]`;
|
|
26910
|
+
});
|
|
26911
|
+
sanitized = sanitized.replace(TOOL_RESULT_ANNOTATION_RE, "[historical tool call]");
|
|
26912
|
+
const toolCallCount = (sanitized.match(/\[historical tool call:\s*([^\]]+)\]/gi) || []).length;
|
|
26913
|
+
if (toolCallCount > 2) {
|
|
26914
|
+
const uniqueTools = new Set(
|
|
26915
|
+
[...sanitized.matchAll(/\[historical tool call:\s*([^\]]+)\]/gi)].map((m) => m[1])
|
|
26916
|
+
);
|
|
26917
|
+
if (uniqueTools.size === 1) {
|
|
26918
|
+
sanitized = `[Historical tool activity: repeated ${[...uniqueTools][0]} call ${toolCallCount} times. Do not repeat this pattern.]`;
|
|
26919
|
+
}
|
|
26920
|
+
}
|
|
26921
|
+
return sanitized;
|
|
26922
|
+
}
|
|
26899
26923
|
var TRUNCATION_MARKER = "...[truncated]";
|
|
26900
26924
|
function tryTruncateItem(rawText, tag, attributes, maxTokenBudget) {
|
|
26901
26925
|
const tagOpen = attributes ? `<${tag}${attributes}>` : `<${tag}>`;
|
|
@@ -27075,8 +27099,9 @@ function normalizeAssembleResult(result, sourceMessages) {
|
|
|
27075
27099
|
});
|
|
27076
27100
|
} else {
|
|
27077
27101
|
if (content.trim().length > 0) {
|
|
27102
|
+
const sanitizedContent = sanitizeToolCallPatterns(content);
|
|
27078
27103
|
const roleAttr = message.role ? ` role="${escapeMemoryFactText(message.role)}"` : "";
|
|
27079
|
-
extractedMemoryItems.push(`<memory_item source="recalled"${roleAttr} provenance="durable_memory">${escapeMemoryFactText(
|
|
27104
|
+
extractedMemoryItems.push(`<memory_item source="recalled"${roleAttr} provenance="durable_memory">${escapeMemoryFactText(sanitizedContent)}</memory_item>`);
|
|
27080
27105
|
}
|
|
27081
27106
|
}
|
|
27082
27107
|
}
|
|
@@ -33072,6 +33097,13 @@ var DirectoryMarkdownSourceAdapter = class {
|
|
|
33072
33097
|
if (!this.started || this.stopping) {
|
|
33073
33098
|
return;
|
|
33074
33099
|
}
|
|
33100
|
+
for (const state of this.states.values()) {
|
|
33101
|
+
if (state.scanState.timer) {
|
|
33102
|
+
clearTimeout(state.scanState.timer);
|
|
33103
|
+
state.scanState.timer = null;
|
|
33104
|
+
}
|
|
33105
|
+
state.scanState.dirty = false;
|
|
33106
|
+
}
|
|
33075
33107
|
for (const root of this.roots) {
|
|
33076
33108
|
await this.scanRoot(root);
|
|
33077
33109
|
}
|
|
@@ -33213,11 +33245,11 @@ var DirectoryMarkdownSourceAdapter = class {
|
|
|
33213
33245
|
continue;
|
|
33214
33246
|
}
|
|
33215
33247
|
stats.filesIncluded++;
|
|
33216
|
-
currentFiles.add(child);
|
|
33217
33248
|
const stat = await this.safeStatWithCtime(child);
|
|
33218
33249
|
if (!stat) {
|
|
33219
33250
|
continue;
|
|
33220
33251
|
}
|
|
33252
|
+
currentFiles.add(child);
|
|
33221
33253
|
candidates.push({ path: child, size: stat.size, mtimeMs: stat.mtimeMs, ctimeMs: stat.ctimeMs, ordinal: candidates.length });
|
|
33222
33254
|
}
|
|
33223
33255
|
}
|
|
@@ -33232,6 +33264,8 @@ var DirectoryMarkdownSourceAdapter = class {
|
|
|
33232
33264
|
this.lastRetryAfterMs = 0;
|
|
33233
33265
|
} else {
|
|
33234
33266
|
rootState.scanState.resumeFromPath = null;
|
|
33267
|
+
this.lastAcceptMore = true;
|
|
33268
|
+
this.lastRetryAfterMs = 0;
|
|
33235
33269
|
}
|
|
33236
33270
|
}
|
|
33237
33271
|
for (const candidate of sorted) {
|
package/dist/markdown-ingest.js
CHANGED
|
@@ -147,6 +147,14 @@ class DirectoryMarkdownSourceAdapter {
|
|
|
147
147
|
if (!this.started || this.stopping) {
|
|
148
148
|
return;
|
|
149
149
|
}
|
|
150
|
+
// Cancel any pending scheduled scans so they don't race with this refresh
|
|
151
|
+
for (const state of this.states.values()) {
|
|
152
|
+
if (state.scanState.timer) {
|
|
153
|
+
clearTimeout(state.scanState.timer);
|
|
154
|
+
state.scanState.timer = null;
|
|
155
|
+
}
|
|
156
|
+
state.scanState.dirty = false;
|
|
157
|
+
}
|
|
150
158
|
for (const root of this.roots) {
|
|
151
159
|
await this.scanRoot(root);
|
|
152
160
|
}
|
|
@@ -291,11 +299,11 @@ class DirectoryMarkdownSourceAdapter {
|
|
|
291
299
|
continue;
|
|
292
300
|
}
|
|
293
301
|
stats.filesIncluded++;
|
|
294
|
-
currentFiles.add(child);
|
|
295
302
|
const stat = await this.safeStatWithCtime(child);
|
|
296
303
|
if (!stat) {
|
|
297
304
|
continue;
|
|
298
305
|
}
|
|
306
|
+
currentFiles.add(child);
|
|
299
307
|
candidates.push({ path: child, size: stat.size, mtimeMs: stat.mtimeMs, ctimeMs: stat.ctimeMs, ordinal: candidates.length });
|
|
300
308
|
}
|
|
301
309
|
}
|
|
@@ -310,7 +318,10 @@ class DirectoryMarkdownSourceAdapter {
|
|
|
310
318
|
this.lastRetryAfterMs = 0;
|
|
311
319
|
}
|
|
312
320
|
else {
|
|
321
|
+
// Resume cursor target was deleted — clear it and resume normal processing
|
|
313
322
|
rootState.scanState.resumeFromPath = null;
|
|
323
|
+
this.lastAcceptMore = true;
|
|
324
|
+
this.lastRetryAfterMs = 0;
|
|
314
325
|
}
|
|
315
326
|
}
|
|
316
327
|
for (const candidate of sorted) {
|
|
@@ -439,6 +450,8 @@ class DirectoryMarkdownSourceAdapter {
|
|
|
439
450
|
async syncMarkdownFile(rootState, filePath, initialStat) {
|
|
440
451
|
const sourceDoc = filePath;
|
|
441
452
|
const relativePath = toPosixPath(path.relative(rootState.root, filePath));
|
|
453
|
+
// Re-check existence when initialStat is provided — the file may have been
|
|
454
|
+
// deleted between the scan pass and the sync pass.
|
|
442
455
|
const stat = initialStat ?? (await this.safeStatWithCtime(filePath));
|
|
443
456
|
if (!stat) {
|
|
444
457
|
await this.deleteSourceDocument(sourceDoc);
|
package/docs/README.md
CHANGED
|
@@ -6,14 +6,14 @@ deeper by goal.
|
|
|
6
6
|
|
|
7
7
|
## Start Here
|
|
8
8
|
|
|
9
|
-
- [Install](./install.md) - shortest supported install and
|
|
9
|
+
- [Install](./install.md) - shortest supported install and vector service lifecycle path.
|
|
10
10
|
- [Installation reference](./installation.md) - requirements, activation, verification, and troubleshooting.
|
|
11
|
-
- [Uninstall](./uninstall.md) - safe disable,
|
|
11
|
+
- [Uninstall](./uninstall.md) - safe disable, vector service shutdown, package removal, and optional data cleanup.
|
|
12
12
|
|
|
13
13
|
## Understand The System
|
|
14
14
|
|
|
15
15
|
- [Problem](./problem.md) - why this plugin replaces the stock memory lifecycle.
|
|
16
|
-
- [Architecture](./architecture.md) - plugin,
|
|
16
|
+
- [Architecture](./architecture.md) - plugin, vector service, storage, retrieval, and compaction overview.
|
|
17
17
|
- [Dependency rationale](./dependencies.md) - why LibraVDB and slab-style storage fit this workload.
|
|
18
18
|
- [Architecture decisions](./architecture-decisions/README.md) - accepted ADRs.
|
|
19
19
|
|
|
@@ -27,5 +27,5 @@ deeper by goal.
|
|
|
27
27
|
## Advanced And Source Docs
|
|
28
28
|
|
|
29
29
|
- [Performance and tuning](./performance-and-tuning.md) - resource expectations and tuning knobs.
|
|
30
|
-
- [Development](./development.md) - source setup, local
|
|
30
|
+
- [Development](./development.md) - source setup, local vector service builds, generated IPC files, and validation commands.
|
|
31
31
|
- [Contributing](./contributing.md) - contributor workflow and repository expectations.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# TLS Configuration
|
|
2
2
|
|
|
3
|
-
The plugin selects the right credentials automatically based on which address it connects to. Unix sockets and loopback addresses (localhost, 127.0.0.1, ::1) always use plaintext. All other addresses use TLS. In most deployments no TLS configuration is needed at all. The only time manual configuration is required is when the
|
|
3
|
+
The plugin selects the right credentials automatically based on which address it connects to. Unix sockets and loopback addresses (localhost, 127.0.0.1, ::1) always use plaintext. All other addresses use TLS. In most deployments no TLS configuration is needed at all. The only time manual configuration is required is when the vector service serves TLS on a loopback address, when the vector service uses a self-signed or private-CA certificate, or when infrastructure such as a service mesh handles TLS outside the plugin.
|
|
4
4
|
|
|
5
5
|
## Default behavior
|
|
6
6
|
|
|
@@ -18,21 +18,21 @@ Because these rules are automatic, most users do not set any TLS-related fields.
|
|
|
18
18
|
|
|
19
19
|
| Field | Type | Default | When to use |
|
|
20
20
|
|---|---|---|---|
|
|
21
|
-
| `grpcEndpoint` | string | — | The
|
|
22
|
-
| `grpcEndpointTlsCa` | string | — | Path to a CA certificate PEM file. Required only when the
|
|
21
|
+
| `grpcEndpoint` | string | — | The vector service address. Set to a unix socket path, a loopback address, or a remote host. |
|
|
22
|
+
| `grpcEndpointTlsCa` | string | — | Path to a CA certificate PEM file. Required only when the vector service certificate is self-signed or signed by a private CA not in the system certificate store. |
|
|
23
23
|
| `grpcEndpointTlsMode` | `"auto"` \| `"tls"` \| `"insecure"` | `"auto"` | Override the automatic selection. `"auto"` applies the default rules above. `"tls"` forces TLS regardless of address. `"insecure"` forces plaintext regardless of address. |
|
|
24
24
|
|
|
25
25
|
`grpcEndpointTlsMode` values explained:
|
|
26
26
|
|
|
27
27
|
- **`"auto"`** (default) — apply the automatic rules. Unix sockets and loopback use plaintext; all other addresses use TLS.
|
|
28
|
-
- **`"tls"`** — always use TLS, even for loopback addresses. Use this when the
|
|
28
|
+
- **`"tls"`** — always use TLS, even for loopback addresses. Use this when the vector service has TLS enabled on a loopback address.
|
|
29
29
|
- **`"insecure"`** — always use plaintext, even for remote addresses. Use this only when a service mesh or TLS-terminating tunnel handles encryption externally.
|
|
30
30
|
|
|
31
31
|
## Deployment scenarios
|
|
32
32
|
|
|
33
|
-
### Local
|
|
33
|
+
### Local vector service (default)
|
|
34
34
|
|
|
35
|
-
The
|
|
35
|
+
The vector service runs on the same machine, listening on a unix socket or a loopback address.
|
|
36
36
|
|
|
37
37
|
```json
|
|
38
38
|
{
|
|
@@ -50,9 +50,9 @@ or:
|
|
|
50
50
|
|
|
51
51
|
The plugin automatically uses plaintext. No TLS fields are needed.
|
|
52
52
|
|
|
53
|
-
### Remote
|
|
53
|
+
### Remote vector service with a trusted certificate
|
|
54
54
|
|
|
55
|
-
The
|
|
55
|
+
The vector service runs on a remote host and presents a certificate issued by a public CA such as Let's Encrypt or cert-manager.
|
|
56
56
|
|
|
57
57
|
```json
|
|
58
58
|
{
|
|
@@ -60,11 +60,11 @@ The daemon runs on a remote host and presents a certificate issued by a public C
|
|
|
60
60
|
}
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
TLS is automatic. The plugin uses the system certificate store to verify the
|
|
63
|
+
TLS is automatic. The plugin uses the system certificate store to verify the vector service's certificate, so no additional configuration is needed.
|
|
64
64
|
|
|
65
|
-
### Remote
|
|
65
|
+
### Remote vector service with a self-signed or private CA certificate
|
|
66
66
|
|
|
67
|
-
The
|
|
67
|
+
The vector service runs on a remote host and uses a self-signed certificate or a certificate signed by a private/internal CA not in the system certificate store.
|
|
68
68
|
|
|
69
69
|
```json
|
|
70
70
|
{
|
|
@@ -73,11 +73,11 @@ The daemon runs on a remote host and uses a self-signed certificate or a certifi
|
|
|
73
73
|
}
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
The CA certificate must be the certificate of the CA that signed the
|
|
76
|
+
The CA certificate must be the certificate of the CA that signed the vector service's server certificate — not the server certificate itself. The plugin uses this CA to verify the vector service's certificate during the TLS handshake. Without it, the plugin will reject the vector service's certificate as untrusted.
|
|
77
77
|
|
|
78
78
|
### TLS on a loopback address
|
|
79
79
|
|
|
80
|
-
The
|
|
80
|
+
The vector service has TLS enabled on a loopback address. This is uncommon. The automatic rules would select plaintext for a loopback address, so an explicit override is required.
|
|
81
81
|
|
|
82
82
|
```json
|
|
83
83
|
{
|
|
@@ -86,11 +86,11 @@ The daemon has TLS enabled on a loopback address. This is uncommon. The automati
|
|
|
86
86
|
}
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
-
Set `grpcEndpointTlsMode` to `"tls"` to force the plugin to use TLS even on the loopback address. The plugin will use the system certificate store for verification. If the
|
|
89
|
+
Set `grpcEndpointTlsMode` to `"tls"` to force the plugin to use TLS even on the loopback address. The plugin will use the system certificate store for verification. If the vector service uses a self-signed certificate, add `grpcEndpointTlsCa` as well.
|
|
90
90
|
|
|
91
91
|
## Service mesh and tunnels
|
|
92
92
|
|
|
93
|
-
When the
|
|
93
|
+
When the vector service runs behind Istio, Envoy, or any other infrastructure that terminates TLS at the mesh or tunnel layer, the plugin should not attempt its own TLS. Set `grpcEndpointTlsMode` to `"insecure"` so the plugin uses plaintext and lets the mesh handle encryption:
|
|
94
94
|
|
|
95
95
|
```json
|
|
96
96
|
{
|
|
@@ -105,8 +105,8 @@ This applies even for remote addresses. The mesh terminates TLS at the boundary,
|
|
|
105
105
|
|
|
106
106
|
| Error | Likely cause | Fix |
|
|
107
107
|
|---|---|---|
|
|
108
|
-
| `UNAVAILABLE / connection closed / TLS handshake failed` when connecting to a loopback address | The
|
|
109
|
-
| `x509: certificate signed by unknown authority` | The
|
|
108
|
+
| `UNAVAILABLE / connection closed / TLS handshake failed` when connecting to a loopback address | The vector service has TLS enabled on a loopback address but the plugin is using plaintext (the default for loopback). | Add `"grpcEndpointTlsMode": "tls"` to the plugin config. |
|
|
109
|
+
| `x509: certificate signed by unknown authority` | The vector service uses a self-signed certificate or a certificate from a private CA not trusted by the system. | Set `grpcEndpointTlsCa` to the path of the CA certificate PEM file that signed the vector service's server certificate. |
|
|
110
110
|
| `failed to load TLS CA certificate from "...": ENOENT: no such file or directory` | The file path given in `grpcEndpointTlsCa` does not exist on the machine. | Verify the file path is correct and the CA certificate file exists. |
|
|
111
111
|
| `LibraVDB: invalid grpcEndpointTlsMode "..."` | The value set in `grpcEndpointTlsMode` is not one of the accepted values. | Change the value to `"auto"`, `"tls"`, or `"insecure"`. |
|
|
112
112
|
| `LIBRAVDB: grpcEndpointTlsCa is set but grpcEndpointTlsMode is "insecure"` (warning) | Both `grpcEndpointTlsCa` and `grpcEndpointTlsMode: "insecure"` are set. The CA file will not be used. | Remove `grpcEndpointTlsCa` if plaintext is intended, or change `grpcEndpointTlsMode` to `"auto"` or `"tls"` to use the CA file. |
|
|
@@ -6,7 +6,7 @@ The plugin requires local vector storage, ONNX inference, transport isolation, a
|
|
|
6
6
|
|
|
7
7
|
## Decision
|
|
8
8
|
|
|
9
|
-
Implement the memory engine as a Go
|
|
9
|
+
Implement the memory engine as a Go vector service with a narrow gRPC transport boundary.
|
|
10
10
|
|
|
11
11
|
## Alternatives Considered
|
|
12
12
|
|
package/docs/architecture.md
CHANGED
|
@@ -10,9 +10,9 @@ LibraVDB Memory is split into two cooperating pieces:
|
|
|
10
10
|
|
|
11
11
|
- a TypeScript OpenClaw plugin that owns the `memory` slot and registers
|
|
12
12
|
context-engine capability at runtime
|
|
13
|
-
- a Go
|
|
13
|
+
- a Go vector service that owns storage, retrieval, and compaction
|
|
14
14
|
|
|
15
|
-
The plugin keeps the host integration light and stable. The
|
|
15
|
+
The plugin keeps the host integration light and stable. The vector service keeps the
|
|
16
16
|
data path local-first and handles the expensive memory operations outside the
|
|
17
17
|
main chat process.
|
|
18
18
|
|
|
@@ -22,9 +22,9 @@ main chat process.
|
|
|
22
22
|
flowchart LR
|
|
23
23
|
Host["OpenClaw host"]
|
|
24
24
|
Plugin["TypeScript plugin\nregistration + context engine"]
|
|
25
|
-
Runtime["Plugin runtime\nlazy
|
|
25
|
+
Runtime["Plugin runtime\nlazy vector service connect + RPC"]
|
|
26
26
|
MPS["memoryPromptSection\ncapability header"]
|
|
27
|
-
Sidecar["Go
|
|
27
|
+
Sidecar["Go vector service"]
|
|
28
28
|
Store["LibraVDB store"]
|
|
29
29
|
Embed["Embedding engine"]
|
|
30
30
|
Summarizer["Summarizer(s)"]
|
|
@@ -47,7 +47,7 @@ main retrieval path.
|
|
|
47
47
|
|
|
48
48
|
### `ingest`
|
|
49
49
|
|
|
50
|
-
Session messages are written into the
|
|
50
|
+
Session messages are written into the vector service-backed store. User turns may also
|
|
51
51
|
be promoted into durable user memory after gating.
|
|
52
52
|
|
|
53
53
|
### `assemble`
|
|
@@ -72,13 +72,13 @@ thresholds, compaction declines instead of forcing a rewrite.
|
|
|
72
72
|
- retrieval happens in `assemble`
|
|
73
73
|
- compaction is separate from prompt construction
|
|
74
74
|
- lifecycle hints such as `before_reset` and `session_end` are advisory
|
|
75
|
-
- the
|
|
75
|
+
- the vector service is the source of truth for stored memory state
|
|
76
76
|
|
|
77
77
|
## Failure Handling
|
|
78
78
|
|
|
79
79
|
The plugin is designed to degrade gracefully:
|
|
80
80
|
|
|
81
|
-
- if the
|
|
81
|
+
- if the vector service is unavailable, prompt assembly continues without recall
|
|
82
82
|
- if compaction fails, the active session is not blocked
|
|
83
83
|
- if summarization is unavailable, the system falls back to the safer path
|
|
84
84
|
|
|
@@ -93,5 +93,5 @@ This architecture keeps the host integration simple while still supporting:
|
|
|
93
93
|
- explicit compaction
|
|
94
94
|
- local-first storage and retrieval
|
|
95
95
|
|
|
96
|
-
In short, the plugin owns the lifecycle contract, and the
|
|
96
|
+
In short, the plugin owns the lifecycle contract, and the vector service owns the
|
|
97
97
|
heavy lifting.
|
package/docs/configuration.md
CHANGED
|
@@ -34,45 +34,45 @@ Use `grpcEndpointTlsMode` to override the default behavior:
|
|
|
34
34
|
|
|
35
35
|
| Value | When to use |
|
|
36
36
|
|---|---|
|
|
37
|
-
| `"auto"` (default) | Standard operation — plugin heuristic matches
|
|
38
|
-
| `"tls"` | Daemon has TLS enabled on loopback or unix socket (rare; use when the
|
|
37
|
+
| `"auto"` (default) | Standard operation — plugin heuristic matches vector service TLS setting automatically. |
|
|
38
|
+
| `"tls"` | Daemon has TLS enabled on loopback or unix socket (rare; use when the vector service's `LIBRAVDB_GRPC_TLS_*` env vars are set on a local address). |
|
|
39
39
|
| `"insecure"` | Service mesh or TLS-terminating tunnel handles encryption externally; both sides are plaintext. |
|
|
40
40
|
|
|
41
|
-
**Default (local
|
|
41
|
+
**Default (local vector service):** No TLS configuration needed.
|
|
42
42
|
Unix socket and loopback endpoints are always plaintext regardless
|
|
43
43
|
of any TLS settings.
|
|
44
44
|
|
|
45
|
-
**K8 / remote
|
|
45
|
+
**K8 / remote vector service with CA-issued cert:**
|
|
46
46
|
No extra configuration needed. The plugin uses the system CA pool,
|
|
47
47
|
which trusts certs issued by Let's Encrypt, cert-manager, and
|
|
48
48
|
other public CAs automatically.
|
|
49
49
|
|
|
50
|
-
**Remote
|
|
50
|
+
**Remote vector service with self-signed or private CA cert:**
|
|
51
51
|
Set `grpcEndpointTlsCa` to the path of the CA certificate PEM file:
|
|
52
52
|
```json
|
|
53
53
|
{
|
|
54
|
-
"grpcEndpoint": "tcp:
|
|
54
|
+
"grpcEndpoint": "tcp:yourvector service.internal:50051",
|
|
55
55
|
"grpcEndpointTlsCa": "/etc/certs/ca.pem"
|
|
56
56
|
}
|
|
57
57
|
```
|
|
58
|
-
The
|
|
58
|
+
The vector service must be configured with matching TLS cert and key via
|
|
59
59
|
`LIBRAVDB_GRPC_TLS_CERT` and `LIBRAVDB_GRPC_TLS_KEY`.
|
|
60
60
|
|
|
61
|
-
**Remote
|
|
62
|
-
When the
|
|
61
|
+
**Remote vector service with mTLS (mutual TLS):**
|
|
62
|
+
When the vector service requires client certificate authentication, set both
|
|
63
63
|
`grpcEndpointTlsClientCert` and `grpcEndpointTlsClientKey` (they must both
|
|
64
64
|
be present or both be omitted):
|
|
65
65
|
```json
|
|
66
66
|
{
|
|
67
|
-
"grpcEndpoint": "tcp:
|
|
67
|
+
"grpcEndpoint": "tcp:yourvector service.internal:50051",
|
|
68
68
|
"grpcEndpointTlsCa": "/etc/certs/ca.pem",
|
|
69
69
|
"grpcEndpointTlsClientCert": "/etc/certs/client-cert.pem",
|
|
70
70
|
"grpcEndpointTlsClientKey": "/etc/certs/client-key.pem"
|
|
71
71
|
}
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
**Local
|
|
75
|
-
If the
|
|
74
|
+
**Local vector service with TLS enabled:**
|
|
75
|
+
If the vector service has `LIBRAVDB_GRPC_TLS_CERT`/`LIBRAVDB_GRPC_TLS_KEY` set on a loopback
|
|
76
76
|
address, explicitly set `grpcEndpointTlsMode: "tls"` to match:
|
|
77
77
|
```json
|
|
78
78
|
{
|
|
@@ -89,7 +89,7 @@ address, explicitly set `grpcEndpointTlsMode: "tls"` to match:
|
|
|
89
89
|
| `fallbackProfile` | string | `bge-small-en-v1.5` | Fallback when primary model fails dimension checks |
|
|
90
90
|
| `embeddingBackend` | string | — | `bundled`, `onnx-local`, `custom-local`, or `remote` |
|
|
91
91
|
| `onnxDevice` | string | `auto` | ONNX execution provider: `auto`, `cpu`, `coreml` (macOS), `cuda` (Linux/Windows), `directml` (Windows), `openvino` (Linux) |
|
|
92
|
-
| `embeddingRuntimePath` | string | — | Path to ONNX runtime library visible to the
|
|
92
|
+
| `embeddingRuntimePath` | string | — | Path to ONNX runtime library visible to the vector service (maps to `LIBRAVDB_ONNX_RUNTIME`; required with `embeddingBackend: "onnx-local"`) |
|
|
93
93
|
| `embeddingModelPath` | string | — | Path to the model directory containing `embedding.json`, `model.onnx`, and `tokenizer.json` (maps to `LIBRAVDB_EMBEDDING_MODEL`; required with `embeddingBackend: "onnx-local"`) |
|
|
94
94
|
| `embeddingTokenizerPath` | string | — | Path to custom tokenizer file |
|
|
95
95
|
| `embeddingDimensions` | number | — | Embedding dimension override |
|
package/docs/contributing.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Contributing
|
|
2
2
|
|
|
3
|
-
Use [Development](./development.md) for source setup, local
|
|
3
|
+
Use [Development](./development.md) for source setup, local vector service preparation,
|
|
4
4
|
generated IPC files, and validation commands. This document covers contribution
|
|
5
5
|
expectations.
|
|
6
6
|
|
|
@@ -13,11 +13,11 @@ pnpm check
|
|
|
13
13
|
npm run test:integration
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
Integration tests require a running
|
|
16
|
+
Integration tests require a running vector service or a prepared local vector service binary.
|
|
17
17
|
Use:
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
bash scripts/build-
|
|
20
|
+
bash scripts/build-vector service.sh
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
## Behavioral Changes
|
|
@@ -28,8 +28,8 @@ regression.
|
|
|
28
28
|
|
|
29
29
|
## PR Expectations
|
|
30
30
|
|
|
31
|
-
- Keep plugin lifecycle and
|
|
31
|
+
- Keep plugin lifecycle and vector service lifecycle separate.
|
|
32
32
|
- Include focused docs updates for user-visible behavior or config changes.
|
|
33
33
|
- Keep internal design changes reflected in the appropriate design notes.
|
|
34
|
-
- Do not add install-time
|
|
34
|
+
- Do not add install-time vector service bootstrap to the npm/OpenClaw package without
|
|
35
35
|
documenting the security and distribution trade-off.
|
package/docs/dependencies.md
CHANGED
|
@@ -33,6 +33,6 @@ Slab-style raw-vector storage was selected because:
|
|
|
33
33
|
- collections grow in bursty append patterns
|
|
34
34
|
- compaction and search create pressure on allocation churn
|
|
35
35
|
|
|
36
|
-
The measured conclusion from the internal profiling pass was that slab-backed raw-vector storage was performance-competitive with the plain in-memory backend while making allocation behavior more predictable. The main trade-off is reserved-but-unused capacity, which is acceptable for this local
|
|
36
|
+
The measured conclusion from the internal profiling pass was that slab-backed raw-vector storage was performance-competitive with the plain in-memory backend while making allocation behavior more predictable. The main trade-off is reserved-but-unused capacity, which is acceptable for this local vector service workload.
|
|
37
37
|
|
|
38
38
|
The dependency is therefore justified by workload shape, not by novelty.
|
package/docs/development.md
CHANGED
|
@@ -8,9 +8,9 @@ installation, use [Install](./install.md).
|
|
|
8
8
|
- Node.js `>= 22`
|
|
9
9
|
- `pnpm`
|
|
10
10
|
- OpenClaw CLI for end-to-end plugin testing
|
|
11
|
-
- a published or locally built `libravdbd`
|
|
11
|
+
- a published or locally built `libravdbd` vector service for integration tests
|
|
12
12
|
|
|
13
|
-
Go is only required when building the
|
|
13
|
+
Go is only required when building the vector service from a local vector service checkout or
|
|
14
14
|
regenerating Go gRPC stubs.
|
|
15
15
|
|
|
16
16
|
## Source Setup
|
|
@@ -29,19 +29,19 @@ pnpm run test:ts
|
|
|
29
29
|
|
|
30
30
|
## Local Daemon Build
|
|
31
31
|
|
|
32
|
-
Prepare `.
|
|
32
|
+
Prepare `.vector service-bin/libravdbd` for local plugin testing:
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
|
-
bash scripts/build-
|
|
35
|
+
bash scripts/build-vector service.sh
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
Supported inputs:
|
|
39
39
|
|
|
40
|
-
- installed
|
|
40
|
+
- installed vector service on `PATH`, such as `brew install libravdbd`
|
|
41
41
|
- `LIBRAVDBD_BINARY_PATH=/path/to/libravdbd`
|
|
42
|
-
- `LIBRAVDBD_SOURCE_DIR=/path/to/libravdbd` to build from a local
|
|
42
|
+
- `LIBRAVDBD_SOURCE_DIR=/path/to/libravdbd` to build from a local vector service repo
|
|
43
43
|
|
|
44
|
-
For
|
|
44
|
+
For vector service-internal Go development and release work, use the separate
|
|
45
45
|
`libravdbd` repository.
|
|
46
46
|
|
|
47
47
|
## Validation Commands
|
|
@@ -96,7 +96,7 @@ The npm package contains:
|
|
|
96
96
|
- `dist/`
|
|
97
97
|
|
|
98
98
|
The package is connect-only. It does not compile Go code, download models, or
|
|
99
|
-
manage the
|
|
99
|
+
manage the vector service process during plugin installation.
|
|
100
100
|
|
|
101
101
|
## Release Automation
|
|
102
102
|
|
|
@@ -113,5 +113,5 @@ label. The workflow auto-bumps, tags, and publishes.
|
|
|
113
113
|
|
|
114
114
|
## Auto-Install Script
|
|
115
115
|
|
|
116
|
-
`scripts/auto-install.sh` automates
|
|
116
|
+
`scripts/auto-install.sh` automates vector service + plugin installation. Run it when
|
|
117
117
|
setting up a machine that needs the full stack quickly.
|
|
@@ -9,7 +9,7 @@ Default selection baseline:
|
|
|
9
9
|
|
|
10
10
|
Why:
|
|
11
11
|
|
|
12
|
-
- Nomic is the default because its Matryoshka-trained embeddings deliver significantly higher retrieval accuracy than MiniLM, with principled dimensionality tiering (`64d → 256d → 768d`) that lets the
|
|
12
|
+
- Nomic is the default because its Matryoshka-trained embeddings deliver significantly higher retrieval accuracy than MiniLM, with principled dimensionality tiering (`64d → 256d → 768d`) that lets the vector service trade memory for precision without re-embedding.
|
|
13
13
|
- bge-small-en-v1.5 is the fallback for resource-constrained systems and is automatically selected when the primary model's dimensions do not match the active collection.
|
|
14
14
|
- Intel Macs without reliable Metal/MPS support should set `onnxDevice: "cpu"` to force CPU ONNX execution and bypass CoreML.
|
|
15
15
|
|
|
@@ -32,33 +32,33 @@ How it works:
|
|
|
32
32
|
- `embeddingProfile` supplies metadata defaults like family, dimensions, and normalize behavior.
|
|
33
33
|
- `onnx-local` still requires local model assets through `embeddingModelPath`, typically a directory containing `embedding.json`.
|
|
34
34
|
- The manifest may override or refine the profile, but explicit dimension mismatches fail closed.
|
|
35
|
-
- The
|
|
36
|
-
- `onnxDevice` is passed through as `LIBRAVDB_ONNX_DEVICE` for
|
|
35
|
+
- The vector service store persists an embedding fingerprint, so reopening an existing store with a different effective model profile will fail instead of silently mixing vector spaces.
|
|
36
|
+
- `onnxDevice` is passed through as `LIBRAVDB_ONNX_DEVICE` for vector service versions that support execution-provider selection (`auto`, `cpu`, `cuda`, `coreml`, `directml`, `openvino`).
|
|
37
37
|
|
|
38
38
|
## Store Compatibility and Upgrades
|
|
39
39
|
|
|
40
40
|
The persisted embedding fingerprint is part of the database compatibility check.
|
|
41
|
-
That is intentional: if a
|
|
41
|
+
That is intentional: if a vector service opens a store with a different effective model
|
|
42
42
|
profile, the safest outcome is to stop before mixing vector spaces.
|
|
43
43
|
|
|
44
44
|
When updating `libravdbd`, keep the same effective embedding profile unless you
|
|
45
45
|
intend to rebuild the store. The effective profile includes the profile family,
|
|
46
46
|
dimensions, normalization setting, and any metadata supplied by the model
|
|
47
|
-
manifest or
|
|
47
|
+
manifest or vector service defaults.
|
|
48
48
|
|
|
49
49
|
Legacy local setups can be more fragile than the current packaged profiles. For
|
|
50
|
-
example, older `all-minilm-l6-v2` stores may fail to reopen after a
|
|
51
|
-
if the
|
|
50
|
+
example, older `all-minilm-l6-v2` stores may fail to reopen after a vector service update
|
|
51
|
+
if the vector service now computes different metadata for that local profile. This does
|
|
52
52
|
not imply that current packaged `nomic-embed-text-v1.5` or
|
|
53
53
|
`bge-small-en-v1.5` stores are incompatible; it means the old local profile must
|
|
54
54
|
be treated as a separate vector space unless a migration path is provided.
|
|
55
55
|
|
|
56
|
-
If a
|
|
56
|
+
If a vector service update reports that the database format or embedding profile is
|
|
57
57
|
incompatible:
|
|
58
58
|
|
|
59
59
|
1. back up both the `.libravdb` file and its `.embedding.json` metadata file;
|
|
60
|
-
2. either downgrade to the previous
|
|
61
|
-
old store aside and let the new
|
|
60
|
+
2. either downgrade to the previous vector service that created the store, or move the
|
|
61
|
+
old store aside and let the new vector service initialize a fresh database;
|
|
62
62
|
3. rebuild/reingest memories with the new effective embedding profile.
|
|
63
63
|
|
|
64
64
|
Do not delete the old store until the replacement has been verified.
|
package/docs/features.md
CHANGED
|
@@ -7,7 +7,7 @@ commands.
|
|
|
7
7
|
## Markdown Ingestion
|
|
8
8
|
|
|
9
9
|
LibraVDB Memory can watch markdown roots and sync changed notes into vector
|
|
10
|
-
memory without changing the
|
|
10
|
+
memory without changing the vector service gRPC interface.
|
|
11
11
|
|
|
12
12
|
The built-in source adapters are:
|
|
13
13
|
|
|
@@ -78,7 +78,7 @@ Each promoted bullet should include trailing metadata with the gating fields:
|
|
|
78
78
|
- Preserve the recent tail buffer {score=0.82 recall=3 unique=2}
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
Only bullets that satisfy the
|
|
81
|
+
Only bullets that satisfy the vector service gates are inserted. The dream collection
|
|
82
82
|
is isolated from normal `user:` and `global` retrieval by default, and dream
|
|
83
83
|
phrasing in chat or search queries routes there automatically.
|
|
84
84
|
|
|
@@ -109,7 +109,7 @@ openclaw memory dream-promote --user-id <userId> --dream-file ~/DREAMS.md
|
|
|
109
109
|
```
|
|
110
110
|
|
|
111
111
|
Dream diary files must live under the operator's home directory or the configured
|
|
112
|
-
`OPENCLAW_STATE_DIR`. The manual command and watcher both use the same
|
|
112
|
+
`OPENCLAW_STATE_DIR`. The manual command and watcher both use the same vector service
|
|
113
113
|
promotion RPC, so admission gates and provenance metadata are identical.
|
|
114
114
|
|
|
115
115
|
## Memory CLI
|
|
@@ -119,14 +119,14 @@ CLI API.
|
|
|
119
119
|
|
|
120
120
|
| Command | Purpose |
|
|
121
121
|
|---|---|
|
|
122
|
-
| `openclaw memory status` | Show
|
|
123
|
-
| `openclaw memory index --force` | Refresh delegated
|
|
122
|
+
| `openclaw memory status` | Show vector service health, counts, active thresholds, and model readiness. Use `--deep` to probe authored collection search health. |
|
|
123
|
+
| `openclaw memory index --force` | Refresh delegated vector service index state for OpenClaw memory CLI compatibility. |
|
|
124
124
|
| `openclaw memory search "query"` | Search LibraVDB memory through the active memory runtime bridge. |
|
|
125
125
|
| `openclaw memory export --user-id <userId>` | Stream stored memories as newline-delimited JSON for one durable namespace. |
|
|
126
126
|
| `openclaw memory export --session-key <sessionKey>` | Export a namespace derived from a session key. |
|
|
127
127
|
| `openclaw memory flush --user-id <userId>` | Delete one durable user namespace after confirmation. |
|
|
128
128
|
| `openclaw memory flush --session-key <sessionKey>` | Delete a namespace derived from a session key after confirmation. |
|
|
129
|
-
| `openclaw memory journal --limit 50` | Inspect bounded lifecycle hints recorded by the
|
|
129
|
+
| `openclaw memory journal --limit 50` | Inspect bounded lifecycle hints recorded by the vector service. |
|
|
130
130
|
| `openclaw memory dream-promote --user-id <userId> --dream-file <path>` | Promote vetted dream diary bullets from a file under the operator home directory or `OPENCLAW_STATE_DIR`. |
|
|
131
131
|
|
|
132
132
|
Use `--yes` with `flush` only when you intentionally want to skip the
|
package/docs/install.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
LibraVDB Memory is a connect-only OpenClaw plugin. Install the plugin as a
|
|
4
4
|
normal package, install `libravdbd` separately, and point the plugin at the
|
|
5
|
-
|
|
5
|
+
vector service endpoint when you need a non-default location.
|
|
6
6
|
|
|
7
7
|
OpenClaw compatibility note:
|
|
8
8
|
|
|
9
|
-
- the plugin is currently verified against OpenClaw `2026.
|
|
9
|
+
- the plugin is currently verified against OpenClaw `2026.5.22`
|
|
10
10
|
|
|
11
11
|
For deeper operational detail, use the full
|
|
12
12
|
[installation reference](./installation.md).
|
|
@@ -26,7 +26,7 @@ This gives you:
|
|
|
26
26
|
|
|
27
27
|
- a managed `libravdbd` service
|
|
28
28
|
- a scanner-clean plugin install
|
|
29
|
-
- a clean separation between plugin lifecycle and
|
|
29
|
+
- a clean separation between plugin lifecycle and vector service lifecycle
|
|
30
30
|
|
|
31
31
|
## Plugin Install
|
|
32
32
|
|
|
@@ -53,7 +53,7 @@ Activate the plugin in `~/.openclaw/openclaw.json`:
|
|
|
53
53
|
}
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
If you run the
|
|
56
|
+
If you run the vector service on a non-default endpoint, add a plugin config:
|
|
57
57
|
|
|
58
58
|
```json
|
|
59
59
|
{
|
|
@@ -76,15 +76,15 @@ If you run the daemon on a non-default endpoint, add a plugin config:
|
|
|
76
76
|
|
|
77
77
|
When `sidecarPath` is set to `"auto"`, the plugin resolves endpoints in this order on macOS/Linux:
|
|
78
78
|
|
|
79
|
-
1. `LIBRAVDB_GRPC_ENDPOINT` if it is set to a valid
|
|
79
|
+
1. `LIBRAVDB_GRPC_ENDPOINT` if it is set to a valid vector service endpoint
|
|
80
80
|
2. `$HOME/.libravdbd/run/libravdb.sock` if it exists
|
|
81
81
|
3. `/opt/homebrew/var/libravdbd/run/libravdb.sock` if it exists
|
|
82
82
|
4. `/usr/local/var/libravdbd/run/libravdb.sock` if it exists
|
|
83
83
|
5. fallback to `$HOME/.libravdbd/run/libravdb.sock`
|
|
84
84
|
|
|
85
|
-
##
|
|
85
|
+
## Vector Service Install
|
|
86
86
|
|
|
87
|
-
The
|
|
87
|
+
The vector service owns the local database, embeddings, and gRPC endpoint.
|
|
88
88
|
|
|
89
89
|
Default endpoints:
|
|
90
90
|
|
|
@@ -100,7 +100,7 @@ Default data path:
|
|
|
100
100
|
|
|
101
101
|
### Homebrew
|
|
102
102
|
|
|
103
|
-
Homebrew is the preferred
|
|
103
|
+
Homebrew is the preferred vector service lifecycle on macOS:
|
|
104
104
|
|
|
105
105
|
```bash
|
|
106
106
|
brew tap xDarkicex/homebrew-openclaw-libravdb-memory
|
|
@@ -118,7 +118,7 @@ brew info libravdbd
|
|
|
118
118
|
|
|
119
119
|
### Manual Service Management
|
|
120
120
|
|
|
121
|
-
If you are not using Homebrew, manage the
|
|
121
|
+
If you are not using Homebrew, manage the vector service explicitly.
|
|
122
122
|
|
|
123
123
|
Linux user service from the repo template:
|
|
124
124
|
|
|
@@ -146,7 +146,7 @@ Windows uses a loopback TCP endpoint by default:
|
|
|
146
146
|
- `tcp:127.0.0.1:37421`
|
|
147
147
|
|
|
148
148
|
This guide does not yet include a full Windows service-install walkthrough.
|
|
149
|
-
For now, use the published Windows
|
|
149
|
+
For now, use the published Windows vector service asset from the GitHub releases page
|
|
150
150
|
and run it under your preferred process supervisor or a manual terminal session.
|
|
151
151
|
|
|
152
152
|
Foreground manual run:
|
|
@@ -161,11 +161,11 @@ you wrap it in `brew services`, `systemd`, or `launchd`.
|
|
|
161
161
|
### Containers and Docker
|
|
162
162
|
|
|
163
163
|
The npm plugin does not start `libravdbd`. In a container, either run a separate
|
|
164
|
-
|
|
164
|
+
vector service or use a small entrypoint wrapper that starts the vector service before
|
|
165
165
|
the OpenClaw gateway.
|
|
166
166
|
|
|
167
|
-
Keep the
|
|
168
|
-
|
|
167
|
+
Keep the vector service assets and database in a mounted volume and point both the
|
|
168
|
+
vector service and plugin at paths inside the container:
|
|
169
169
|
|
|
170
170
|
```sh
|
|
171
171
|
export LIBRAVDB_GRPC_ENDPOINT=unix:/home/node/.openclaw/libravdbd/run/libravdb.sock
|
|
@@ -223,19 +223,19 @@ store directly. The context engine can still use LibraVDB for recall while
|
|
|
223
223
|
- Update it with your normal OpenClaw plugin update flow.
|
|
224
224
|
- Disable it by removing the slot assignment from `~/.openclaw/openclaw.json`.
|
|
225
225
|
|
|
226
|
-
The plugin does not manage the
|
|
227
|
-
|
|
226
|
+
The plugin does not manage the vector service process. Treat plugin activation and
|
|
227
|
+
vector service supervision as separate lifecycle decisions.
|
|
228
228
|
|
|
229
229
|
### Daemon Lifecycle
|
|
230
230
|
|
|
231
231
|
- Start it with `brew services`, `systemd --user`, `launchctl bootstrap`, or a manual `libravdbd serve`.
|
|
232
|
-
- Restart it when you change
|
|
232
|
+
- Restart it when you change vector service-level environment variables or replace the binary.
|
|
233
233
|
- Stop it before uninstalling or deleting on-disk data.
|
|
234
234
|
- Point the plugin at the correct endpoint with `sidecarPath` if you do not use the default location.
|
|
235
235
|
|
|
236
236
|
## Verification
|
|
237
237
|
|
|
238
|
-
After the plugin and
|
|
238
|
+
After the plugin and vector service are both in place, run:
|
|
239
239
|
|
|
240
240
|
```bash
|
|
241
241
|
openclaw memory status
|
|
@@ -243,11 +243,11 @@ openclaw memory status
|
|
|
243
243
|
|
|
244
244
|
Healthy output should show that:
|
|
245
245
|
|
|
246
|
-
- the
|
|
246
|
+
- the vector service answered the local health check
|
|
247
247
|
- the memory and context-engine slots are active
|
|
248
248
|
- the plugin can read stored counts and runtime settings
|
|
249
249
|
|
|
250
|
-
If OpenClaw cannot reach the
|
|
250
|
+
If OpenClaw cannot reach the vector service, verify the endpoint first:
|
|
251
251
|
|
|
252
252
|
- macOS/Linux default: `unix:$HOME/.libravdbd/run/libravdb.sock`
|
|
253
253
|
- Windows default: `tcp:127.0.0.1:37421`
|
package/docs/installation.md
CHANGED
|
@@ -10,23 +10,23 @@ This is the full installation reference for
|
|
|
10
10
|
|---|---:|---|
|
|
11
11
|
| Node.js | `22.0.0` | Enforced by `package.json` `engines.node`. |
|
|
12
12
|
| OpenClaw | `2026.3.22` | Earliest supported host version for this plugin API shape. |
|
|
13
|
-
| `libravdbd` | published
|
|
14
|
-
| Go | `1.22` | Required only for local
|
|
13
|
+
| `libravdbd` | published vector service asset | Required for normal runtime. |
|
|
14
|
+
| Go | `1.22` | Required only for local vector service development. |
|
|
15
15
|
| OS | macOS, Linux, Windows | Unix uses a local socket; Windows uses TCP loopback. |
|
|
16
|
-
| Architecture | `arm64`, `x64` | Must match the
|
|
16
|
+
| Architecture | `arm64`, `x64` | Must match the vector service release asset. |
|
|
17
17
|
|
|
18
18
|
Resource sizing and benchmark data live in
|
|
19
19
|
[Performance and tuning](./performance-and-tuning.md).
|
|
20
20
|
|
|
21
21
|
OpenClaw compatibility note:
|
|
22
22
|
|
|
23
|
-
- the plugin is currently verified against OpenClaw `2026.
|
|
23
|
+
- the plugin is currently verified against OpenClaw `2026.5.22`
|
|
24
24
|
|
|
25
25
|
## Install Flow
|
|
26
26
|
|
|
27
27
|
The published plugin package is connect-only. It installs TypeScript plugin code
|
|
28
28
|
and docs; it does not compile Go code, download model assets, or supervise the
|
|
29
|
-
|
|
29
|
+
vector service.
|
|
30
30
|
|
|
31
31
|
Recommended macOS path:
|
|
32
32
|
|
|
@@ -55,7 +55,7 @@ tcp:127.0.0.1:37421
|
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
This repository does not yet include a full Windows service-install walkthrough.
|
|
58
|
-
Use the published Windows
|
|
58
|
+
Use the published Windows vector service asset under your preferred process supervisor
|
|
59
59
|
or run `libravdbd serve` in a terminal for validation.
|
|
60
60
|
|
|
61
61
|
## Activation
|
|
@@ -77,7 +77,7 @@ The memory slot owns `openclaw memory ...` and memory-runtime calls. The
|
|
|
77
77
|
context-engine slot enables automatic bootstrap, ingest, after-turn, and recall
|
|
78
78
|
hooks during sessions.
|
|
79
79
|
|
|
80
|
-
If the
|
|
80
|
+
If the vector service uses a non-default endpoint, add `sidecarPath`:
|
|
81
81
|
|
|
82
82
|
```json
|
|
83
83
|
{
|
|
@@ -122,7 +122,7 @@ $HOME/.libravdbd/data_nomic-embed-text-v1_5.libravdb
|
|
|
122
122
|
|
|
123
123
|
## Container Layout
|
|
124
124
|
|
|
125
|
-
In Docker, keep the
|
|
125
|
+
In Docker, keep the vector service, model assets, socket, logs, and database in the
|
|
126
126
|
same mounted OpenClaw state volume. A typical container-side layout is:
|
|
127
127
|
|
|
128
128
|
```text
|
|
@@ -133,7 +133,7 @@ same mounted OpenClaw state volume. A typical container-side layout is:
|
|
|
133
133
|
/home/node/.openclaw/libravdbd/models/nomic-embed-text-v1.5/embedding.json
|
|
134
134
|
```
|
|
135
135
|
|
|
136
|
-
Start the
|
|
136
|
+
Start the vector service with explicit local ONNX paths before starting the gateway:
|
|
137
137
|
|
|
138
138
|
```sh
|
|
139
139
|
LIBRAVDB_GRPC_ENDPOINT=unix:/home/node/.openclaw/libravdbd/run/libravdb.sock \
|
|
@@ -171,7 +171,7 @@ Then configure the plugin with the same socket and asset paths:
|
|
|
171
171
|
|
|
172
172
|
Do not let a container initialize a database with deterministic fallback
|
|
173
173
|
embeddings and later switch the same file to ONNX embeddings. Move the fallback
|
|
174
|
-
database aside first, then let the
|
|
174
|
+
database aside first, then let the vector service create a fresh ONNX-backed store.
|
|
175
175
|
|
|
176
176
|
## Verification
|
|
177
177
|
|
|
@@ -185,7 +185,7 @@ Expected output shape:
|
|
|
185
185
|
|
|
186
186
|
```text
|
|
187
187
|
┌────────────────────┬──────────────────────────────┐
|
|
188
|
-
│
|
|
188
|
+
│ Daemon │ running │
|
|
189
189
|
│ Turns stored │ 0 │
|
|
190
190
|
│ Memories stored │ 0 │
|
|
191
191
|
│ Lifecycle hints │ 0 │
|
|
@@ -198,7 +198,7 @@ Expected output shape:
|
|
|
198
198
|
|
|
199
199
|
Interpretation:
|
|
200
200
|
|
|
201
|
-
- `
|
|
201
|
+
- `Daemon=running` means the vector service answered the health check.
|
|
202
202
|
- `Gate threshold=0.35` confirms the default durable-memory gate.
|
|
203
203
|
- `Abstractive model=not provisioned` is acceptable; compaction falls back to
|
|
204
204
|
the extractive path.
|
|
@@ -216,7 +216,7 @@ Common causes:
|
|
|
216
216
|
- `embeddingBackend` is set to `onnx-local` but `embeddingRuntimePath` or
|
|
217
217
|
`embeddingModelPath` is missing from plugin config
|
|
218
218
|
|
|
219
|
-
Check the
|
|
219
|
+
Check the vector service first:
|
|
220
220
|
|
|
221
221
|
```bash
|
|
222
222
|
openclaw memory status
|
|
@@ -231,8 +231,8 @@ libravdbd serve
|
|
|
231
231
|
|
|
232
232
|
### Deterministic fallback embeddings
|
|
233
233
|
|
|
234
|
-
If
|
|
235
|
-
configured ONNX runtime or model manifest. Stop the
|
|
234
|
+
If vector service logs mention deterministic fallback mode, the vector service did not find the
|
|
235
|
+
configured ONNX runtime or model manifest. Stop the vector service, set
|
|
236
236
|
`LIBRAVDB_ONNX_RUNTIME` and `LIBRAVDB_EMBEDDING_MODEL`, confirm the model
|
|
237
237
|
directory contains `embedding.json`, then restart. If a database was created
|
|
238
238
|
while fallback mode was active, move that `.libravdb` file and its adjacent
|
|
@@ -240,9 +240,9 @@ while fallback mode was active, move that `.libravdb` file and its adjacent
|
|
|
240
240
|
|
|
241
241
|
### Incompatible database or embedding profile
|
|
242
242
|
|
|
243
|
-
If the
|
|
243
|
+
If the vector service exits with `database format is incompatible` or `database
|
|
244
244
|
embedding profile is incompatible`, it is refusing to open a store whose saved
|
|
245
|
-
format or embedding fingerprint differs from the current
|
|
245
|
+
format or embedding fingerprint differs from the current vector service settings. This
|
|
246
246
|
fail-closed behavior protects the store from mixing incompatible vector spaces.
|
|
247
247
|
|
|
248
248
|
Before changing anything, back up both files for the affected store:
|
|
@@ -252,12 +252,12 @@ Before changing anything, back up both files for the affected store:
|
|
|
252
252
|
|
|
253
253
|
Then choose one recovery path:
|
|
254
254
|
|
|
255
|
-
- downgrade to the
|
|
256
|
-
- move the old store aside, start the new
|
|
255
|
+
- downgrade to the vector service version that created the store; or
|
|
256
|
+
- move the old store aside, start the new vector service so it creates a fresh store,
|
|
257
257
|
and rebuild/reingest memories with the current embedding profile.
|
|
258
258
|
|
|
259
259
|
This can affect legacy local profiles such as older `all-minilm-l6-v2` setups
|
|
260
|
-
when
|
|
260
|
+
when vector service defaults or model metadata change across releases. It is not
|
|
261
261
|
expected for stores that stay on the current packaged profiles and assets. See
|
|
262
262
|
[Embedding Profiles](./embedding-profiles.md#store-compatibility-and-upgrades)
|
|
263
263
|
for more detail.
|
|
@@ -276,6 +276,6 @@ automatic session ingest and recall may not run.
|
|
|
276
276
|
|
|
277
277
|
### Lifecycle journal looks empty
|
|
278
278
|
|
|
279
|
-
The
|
|
279
|
+
The vector service journal only records advisory lifecycle hints such as `before_reset`
|
|
280
280
|
and `session_end`. It is bounded by `lifecycleJournalMaxEntries`, default `500`,
|
|
281
281
|
and is not part of normal memory recall.
|
|
@@ -6,7 +6,7 @@ The plugin supports mutual TLS (mTLS) for gRPC connections to the Vector Service
|
|
|
6
6
|
|
|
7
7
|
The Vector Service operator enables mTLS by configuring a client CA on the service side. When this is enabled, the Vector Service requires every connecting client to present a certificate signed by that CA. If the plugin is configured to use TLS but does not present a client certificate, the TLS handshake will fail and the connection will be rejected.
|
|
8
8
|
|
|
9
|
-
The plugin cannot detect whether the
|
|
9
|
+
The plugin cannot detect whether the vector service requires mTLS — it must be configured explicitly. If connections fail with a "client did not provide a certificate" error, the plugin likely needs a client certificate configured.
|
|
10
10
|
|
|
11
11
|
## Configuration fields
|
|
12
12
|
|
|
@@ -65,7 +65,7 @@ openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key \
|
|
|
65
65
|
-CAcreateserial -out client.crt -days 365
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
Replace `ca.crt` and `ca.key` with the CA certificate and key that the
|
|
68
|
+
Replace `ca.crt` and `ca.key` with the CA certificate and key that the vector service operator provided.
|
|
69
69
|
|
|
70
70
|
## Error reference
|
|
71
71
|
|
package/docs/models.md
CHANGED
|
@@ -8,7 +8,7 @@ available offline after assets are installed.
|
|
|
8
8
|
|
|
9
9
|
`assemble` runs before each response build. An embedding request that crosses a
|
|
10
10
|
process and HTTP server boundary adds avoidable tail latency. Local ONNX
|
|
11
|
-
inference inside the
|
|
11
|
+
inference inside the vector service keeps retrieval close to the database and avoids a
|
|
12
12
|
runtime dependency on a separate model server.
|
|
13
13
|
|
|
14
14
|
ONNX assets can be provisioned once and reused without network access. Given
|
|
@@ -23,7 +23,7 @@ latency and offline operation are part of the product contract.
|
|
|
23
23
|
The default profile is `nomic-embed-text-v1.5`. Nomic was chosen as the default
|
|
24
24
|
because its Matryoshka-trained embeddings deliver significantly higher retrieval
|
|
25
25
|
accuracy than MiniLM, with principled dimensionality tiering (`64d → 256d →
|
|
26
|
-
768d`) that lets the
|
|
26
|
+
768d`) that lets the vector service trade memory for precision without re-embedding.
|
|
27
27
|
|
|
28
28
|
`bge-small-en-v1.5` is the fallback profile. It has a smaller disk and memory
|
|
29
29
|
footprint than Nomic and is automatically selected when the primary model's
|
|
@@ -35,7 +35,7 @@ For exact profile metadata, read [Embedding profiles](./embedding-profiles.md).
|
|
|
35
35
|
## Summarization
|
|
36
36
|
|
|
37
37
|
Compaction can run without an abstractive summarizer. When the optional T5-small
|
|
38
|
-
assets are not provisioned, the
|
|
38
|
+
assets are not provisioned, the vector service degrades to the extractive path.
|
|
39
39
|
|
|
40
40
|
T5-small is the optional local abstractive summarizer because it is small enough
|
|
41
41
|
for CPU-local operation while still useful for session-cluster summaries. Larger
|
|
@@ -12,7 +12,7 @@ The numbers below are local measurements from this repository as of
|
|
|
12
12
|
|
|
13
13
|
Measured local asset sizes:
|
|
14
14
|
|
|
15
|
-
-
|
|
15
|
+
- vector service binary: `7.7M`
|
|
16
16
|
- bundled Nomic model directory: `523M`
|
|
17
17
|
- bundled MiniLM fallback model directory: `87M`
|
|
18
18
|
- optional T5 summarizer directory: `371M`
|
|
@@ -34,7 +34,7 @@ structure, and index state are stored as well.
|
|
|
34
34
|
|
|
35
35
|
### Memory
|
|
36
36
|
|
|
37
|
-
Measured on Apple M2 by starting the
|
|
37
|
+
Measured on Apple M2 by starting the vector service and reading RSS after startup:
|
|
38
38
|
|
|
39
39
|
- Nomic embedding path loaded without optional T5 summarizer: about `266 MB`
|
|
40
40
|
- Nomic plus local ONNX T5 summarizer loaded: about `503 MB`
|
|
@@ -89,7 +89,7 @@ are advanced controls, not required install settings.
|
|
|
89
89
|
| `compactionThresholdFraction` | Dynamic trigger ratio when `compactThreshold` is unset, default `0.8`. |
|
|
90
90
|
| `compactSessionTokenBudget` | Auto-compaction budget since the last compaction, default `2000`; set `0` to disable. |
|
|
91
91
|
| `rpcTimeoutMs` | Sidecar RPC timeout, default `30000`. |
|
|
92
|
-
| `maxRetries` | Retry budget for
|
|
92
|
+
| `maxRetries` | Retry budget for vector service RPC calls. |
|
|
93
93
|
| `logLevel` | Plugin log level. |
|
|
94
94
|
|
|
95
95
|
Model-related fields live in [Embedding profiles](./embedding-profiles.md) and
|
|
@@ -111,7 +111,7 @@ Run it with:
|
|
|
111
111
|
LONGMEMEVAL_DATA_FILE=/path/to/longmemeval_oracle.json pnpm run benchmark:longmemeval
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
-
If you already have a
|
|
114
|
+
If you already have a vector service running and do not want the benchmark to spawn
|
|
115
115
|
another one, set:
|
|
116
116
|
|
|
117
117
|
```bash
|
|
@@ -127,7 +127,7 @@ Optional controls:
|
|
|
127
127
|
- `LONGMEMEVAL_OUT_FILE` writes JSONL records for analysis
|
|
128
128
|
|
|
129
129
|
The harness writes JSONL incrementally, so partial results survive if a
|
|
130
|
-
transient
|
|
130
|
+
transient vector service failure interrupts a long run. If the local test vector service drops
|
|
131
131
|
mid-run, the benchmark restarts it and retries the current instance once before
|
|
132
132
|
recording an error result.
|
|
133
133
|
|
package/docs/problem.md
CHANGED
|
@@ -9,7 +9,7 @@ The default `memory-lancedb` style plugin is still a good fit when you want:
|
|
|
9
9
|
- a simple top-k semantic lookup over durable notes
|
|
10
10
|
- a low-complexity setup
|
|
11
11
|
- a heuristic capture model where the agent decides what to save
|
|
12
|
-
- no additional
|
|
12
|
+
- no additional vector service process
|
|
13
13
|
|
|
14
14
|
For short sessions and light persistent memory, that is often the right answer.
|
|
15
15
|
|
package/docs/security.md
CHANGED
|
@@ -18,7 +18,7 @@ The system is designed so a failure in one layer does not automatically collapse
|
|
|
18
18
|
|
|
19
19
|
The published plugin package intentionally avoids install-time process execution.
|
|
20
20
|
That is a deliberate trust and distribution choice: the OpenClaw plugin is a
|
|
21
|
-
thin client, and the local `libravdbd`
|
|
21
|
+
thin client, and the local `libravdbd` vector service is a separate operator-managed
|
|
22
22
|
component.
|
|
23
23
|
|
|
24
24
|
Current implementation facts:
|
|
@@ -28,9 +28,9 @@ Current implementation facts:
|
|
|
28
28
|
- the published plugin source contains no direct `child_process` usage
|
|
29
29
|
- the plugin connects only to a configured local endpoint such as
|
|
30
30
|
`unix:/Users/<you>/.libravdbd/run/libravdb.sock` or `tcp:127.0.0.1:37421`
|
|
31
|
-
-
|
|
31
|
+
- vector service installation and lifecycle are explicit user or operator actions
|
|
32
32
|
|
|
33
|
-
The
|
|
33
|
+
The vector service distribution surface should be evaluated separately from the plugin
|
|
34
34
|
package. If you install `libravdbd` from release assets or another package
|
|
35
35
|
channel, validate that channel directly.
|
|
36
36
|
|
|
@@ -76,7 +76,7 @@ It reduces risk; it does not create a trusted execution environment.
|
|
|
76
76
|
|
|
77
77
|
## Deletion and Data Protection
|
|
78
78
|
|
|
79
|
-
The
|
|
79
|
+
The vector service exposes deletion and flush primitives. That matters operationally for:
|
|
80
80
|
|
|
81
81
|
- user-requested memory removal
|
|
82
82
|
- namespace cleanup
|
package/docs/uninstall.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Uninstall Guide
|
|
2
2
|
|
|
3
3
|
This guide covers safe removal of the OpenClaw / OpenClaw.ai plugin and the
|
|
4
|
-
separately managed `libravdbd`
|
|
4
|
+
separately managed `libravdbd` vector service.
|
|
5
5
|
|
|
6
6
|
If you only want to disable the memory replacement temporarily, remove the
|
|
7
|
-
plugin slot assignment first and leave the
|
|
7
|
+
plugin slot assignment first and leave the vector service plus data in place.
|
|
8
8
|
|
|
9
9
|
## 1. Disable the Plugin
|
|
10
10
|
|
|
@@ -29,7 +29,7 @@ your standard OpenClaw plugin removal flow for
|
|
|
29
29
|
|
|
30
30
|
## 2. Stop the Daemon
|
|
31
31
|
|
|
32
|
-
Stop the
|
|
32
|
+
Stop the vector service before deleting binaries or stored data.
|
|
33
33
|
|
|
34
34
|
Homebrew:
|
|
35
35
|
|
|
@@ -69,7 +69,7 @@ brew untap xDarkicex/homebrew-openclaw-libravdb-memory
|
|
|
69
69
|
|
|
70
70
|
### Manual Daemon Install
|
|
71
71
|
|
|
72
|
-
Delete the service file or launch agent you installed, along with the
|
|
72
|
+
Delete the service file or launch agent you installed, along with the vector service
|
|
73
73
|
binary you copied into place.
|
|
74
74
|
|
|
75
75
|
Common locations:
|
|
@@ -96,5 +96,5 @@ delete during uninstall.
|
|
|
96
96
|
## 5. Post-Uninstall Check
|
|
97
97
|
|
|
98
98
|
After cleanup, `openclaw memory status` should no longer show this plugin as the
|
|
99
|
-
active memory provider, and the
|
|
99
|
+
active memory provider, and the vector service endpoint should no longer be reachable
|
|
100
100
|
unless you intentionally kept it running for another workflow.
|
package/openclaw.plugin.json
CHANGED