@xdarkicex/openclaw-memory-libravdb 1.6.11 → 1.6.13

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.
@@ -2,6 +2,7 @@ import { resolveIdentity } from "./identity.js";
2
2
  import { resolveUserCollection } from "./memory-scopes.js";
3
3
  const APPROX_CHARS_PER_TOKEN = 4;
4
4
  const ASSEMBLE_BUDGET_HEADROOM_TOKENS = 256;
5
+ const ASSEMBLE_BUDGET_HEADROOM_FRACTION = 0.2;
5
6
  const DEFAULT_COMPACTION_THRESHOLD_FRACTION = 0.8;
6
7
  const STRUCTURED_MARKER_RE = /\b[A-Z][A-Z0-9]*(?:_[A-Z0-9]+){2,}_\d{6,}\b/g;
7
8
  const DISTINCTIVE_IDENTIFIER_RE = /\b([A-Za-z][A-Za-z0-9]*(?:[_-][A-Za-z0-9]+){1,})\b/g;
@@ -138,7 +139,9 @@ function normalizeTokenBudget(tokenBudget) {
138
139
  }
139
140
  function resolveEffectiveAssembleBudget(tokenBudget) {
140
141
  const normalized = normalizeTokenBudget(tokenBudget) ?? 1;
141
- return Math.max(1, normalized - ASSEMBLE_BUDGET_HEADROOM_TOKENS);
142
+ const proportionalHeadroom = Math.max(1, Math.floor(normalized * ASSEMBLE_BUDGET_HEADROOM_FRACTION));
143
+ const headroom = Math.min(ASSEMBLE_BUDGET_HEADROOM_TOKENS, proportionalHeadroom);
144
+ return Math.max(1, normalized - headroom);
142
145
  }
143
146
  function normalizeThresholdFraction(fraction) {
144
147
  if (typeof fraction !== "number" || !Number.isFinite(fraction)) {
@@ -279,7 +279,7 @@ function parseHeading(value) {
279
279
  return normalizeSectionName(match[2] ?? "");
280
280
  }
281
281
  function isPromotionSection(section) {
282
- return section.includes("deep sleep") || section.includes("promot") || section.includes("dream");
282
+ return /^(?:deep sleep|dream promotion(?: candidates?)?|promotion candidates?|promote candidates?)$/.test(section);
283
283
  }
284
284
  function parseBulletCandidate(line) {
285
285
  const match = /^\s*[-*+]\s+(.+)$/.exec(line);
package/dist/index.js CHANGED
@@ -25601,7 +25601,7 @@ function parseHeading(value) {
25601
25601
  return normalizeSectionName(match[2] ?? "");
25602
25602
  }
25603
25603
  function isPromotionSection(section) {
25604
- return section.includes("deep sleep") || section.includes("promot") || section.includes("dream");
25604
+ return /^(?:deep sleep|dream promotion(?: candidates?)?|promotion candidates?|promote candidates?)$/.test(section);
25605
25605
  }
25606
25606
  function parseBulletCandidate(line) {
25607
25607
  const match = /^\s*[-*+]\s+(.+)$/.exec(line);
@@ -26504,6 +26504,7 @@ function resolveCliMemoryOperationScope(opts) {
26504
26504
  // src/context-engine.ts
26505
26505
  var APPROX_CHARS_PER_TOKEN = 4;
26506
26506
  var ASSEMBLE_BUDGET_HEADROOM_TOKENS = 256;
26507
+ var ASSEMBLE_BUDGET_HEADROOM_FRACTION = 0.2;
26507
26508
  var DEFAULT_COMPACTION_THRESHOLD_FRACTION = 0.8;
26508
26509
  var STRUCTURED_MARKER_RE = /\b[A-Z][A-Z0-9]*(?:_[A-Z0-9]+){2,}_\d{6,}\b/g;
26509
26510
  var DISTINCTIVE_IDENTIFIER_RE = /\b([A-Za-z][A-Za-z0-9]*(?:[_-][A-Za-z0-9]+){1,})\b/g;
@@ -26656,7 +26657,9 @@ function normalizeTokenBudget(tokenBudget) {
26656
26657
  }
26657
26658
  function resolveEffectiveAssembleBudget(tokenBudget) {
26658
26659
  const normalized = normalizeTokenBudget(tokenBudget) ?? 1;
26659
- return Math.max(1, normalized - ASSEMBLE_BUDGET_HEADROOM_TOKENS);
26660
+ const proportionalHeadroom = Math.max(1, Math.floor(normalized * ASSEMBLE_BUDGET_HEADROOM_FRACTION));
26661
+ const headroom = Math.min(ASSEMBLE_BUDGET_HEADROOM_TOKENS, proportionalHeadroom);
26662
+ return Math.max(1, normalized - headroom);
26660
26663
  }
26661
26664
  function normalizeThresholdFraction(fraction) {
26662
26665
  if (typeof fraction !== "number" || !Number.isFinite(fraction)) {
@@ -15,6 +15,8 @@ CPU when a provider is unavailable.
15
15
  | `grpcEndpoint` | string | — | gRPC kernel endpoint. See `grpcEndpointTlsMode` for credential control. |
16
16
  | `grpcEndpointTlsCa` | string | — | Path to CA certificate PEM file. Only needed for self-signed or private CA certs. Omit when using Let's Encrypt or cert-manager. |
17
17
  | `grpcEndpointTlsMode` | string | `"auto"` | gRPC credential mode. `"auto"`: loopback/unix → plaintext, remote → TLS. `"tls"`: always TLS. `"insecure"`: always plaintext. |
18
+ | `grpcEndpointTlsClientCert` | string | — | Path to client certificate PEM for mTLS. Must be paired with `grpcEndpointTlsClientKey`. |
19
+ | `grpcEndpointTlsClientKey` | string | — | Path to client private key PEM for mTLS. Must be paired with `grpcEndpointTlsClientCert`. |
18
20
  | `rpcTimeoutMs` | number | `30000` | Per-call timeout for service RPC (ms) |
19
21
  | `dbPath` | string | auto-named | Explicit DB path; when set bypasses model-specific naming |
20
22
 
@@ -56,6 +58,19 @@ Set `grpcEndpointTlsCa` to the path of the CA certificate PEM file:
56
58
  The daemon must be configured with matching TLS cert and key via
57
59
  `LIBRAVDB_GRPC_TLS_CERT` and `LIBRAVDB_GRPC_TLS_KEY`.
58
60
 
61
+ **Remote daemon with mTLS (mutual TLS):**
62
+ When the daemon requires client certificate authentication, set both
63
+ `grpcEndpointTlsClientCert` and `grpcEndpointTlsClientKey` (they must both
64
+ be present or both be omitted):
65
+ ```json
66
+ {
67
+ "grpcEndpoint": "tcp:yourdaemon.internal:50051",
68
+ "grpcEndpointTlsCa": "/etc/certs/ca.pem",
69
+ "grpcEndpointTlsClientCert": "/etc/certs/client-cert.pem",
70
+ "grpcEndpointTlsClientKey": "/etc/certs/client-key.pem"
71
+ }
72
+ ```
73
+
59
74
  **Local daemon with TLS enabled:**
60
75
  If the daemon has `LIBRAVDB_GRPC_TLS_CERT`/`LIBRAVDB_GRPC_TLS_KEY` set on a loopback
61
76
  address, explicitly set `grpcEndpointTlsMode: "tls"` to match:
@@ -147,11 +162,49 @@ The plugin exposes `ingestionGateThreshold` for host-side gating decisions:
147
162
  | `markdownIngestionObsidianInclude` | string[] | — | Obsidian glob include patterns |
148
163
  | `markdownIngestionObsidianExclude` | string[] | same defaults as above | Obsidian glob exclude patterns; defaults to the same set as generic markdown ingestion |
149
164
  | `markdownIngestionObsidianDebounceMs` | number | `150` | Obsidian debounce window |
165
+ | `markdownIngestionSnapshotPath` | string | — | Path to snapshot file for generic markdown ingestion state |
166
+ | `markdownIngestionObsidianSnapshotPath` | string | — | Path to snapshot file for Obsidian ingestion state |
150
167
 
151
168
  Configured markdown roots are ignored unless the matching enable flag is set to
152
169
  `true`. Set `markdownIngestionEnabled: true` for generic roots and
153
170
  `markdownIngestionObsidianEnabled: true` for Obsidian vault roots.
154
171
 
172
+ ## Continuity
173
+
174
+ | Key | Type | Default | Notes |
175
+ |---|---|---|---|
176
+ | `continuityMinTurns` | number | — | Minimum conversation turns before continuity retrieval activates |
177
+ | `continuityPriorContextTokens` | number | — | Token budget allocated to prior context in continuity retrieval |
178
+ | `continuityTailBudgetTokens` | number | — | Token budget for tail-end context in continuity retrieval |
179
+
180
+ ## Recovery
181
+
182
+ | Key | Type | Default | Notes |
183
+ |---|---|---|---|
184
+ | `recoveryFloorScore` | number | — | Minimum score floor for recovery-phase retrieval |
185
+ | `recoveryMinConfidenceMean` | number | — | Minimum mean confidence threshold for recovery candidates |
186
+ | `recoveryMinTopK` | number | — | Minimum number of top-K results required for recovery |
187
+
188
+ ## Section 7 scoring
189
+
190
+ Two-pass retrieval scoring subsystem. These keys control the authority-weighted
191
+ and recency-adjusted scoring pass that runs after the initial vector search.
192
+
193
+ | Key | Type | Default | Notes |
194
+ |---|---|---|---|
195
+ | `section7Theta1` | number | — | Primary theta parameter for first-pass scoring |
196
+ | `section7Kappa` | number | — | Kappa scaling factor for authority scoring |
197
+ | `section7HopEta` | number | — | Eta decay for hop-distance scoring |
198
+ | `section7HopThreshold` | number | — | Hop distance threshold for second-pass eligibility |
199
+ | `section7CoarseTopK` | number | — | Top-K for coarse (first-pass) retrieval |
200
+ | `section7SecondPassTopK` | number | — | Top-K for second-pass refined retrieval |
201
+ | `section7AuthorityRecencyLambda` | number | — | Lambda for recency decay in authority scoring (commented out in code) |
202
+ | `section7AuthorityRecencyWeight` | number | — | Weight for authority recency in combined score |
203
+ | `section7AuthorityFrequencyWeight` | number | — | Weight for authority frequency in combined score |
204
+ | `section7AuthorityAuthoredWeight` | number | — | Weight for authority authored signal in combined score |
205
+ | `section7AuthoritySalienceWeight` | number | — | Weight for authority salience in combined score |
206
+ | `section7RecencyAccessLambda` | number | — | Lambda for access-based recency decay |
207
+
155
208
  ## Dream promotion
156
209
 
157
210
  | Key | Type | Default | Notes |
@@ -35,6 +35,34 @@ How it works:
35
35
  - The sidecar 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
36
  - `onnxDevice` is passed through as `LIBRAVDB_ONNX_DEVICE` for daemon versions that support execution-provider selection (`auto`, `cpu`, `cuda`, `coreml`, `directml`, `openvino`).
37
37
 
38
+ ## Store Compatibility and Upgrades
39
+
40
+ The persisted embedding fingerprint is part of the database compatibility check.
41
+ That is intentional: if a daemon opens a store with a different effective model
42
+ profile, the safest outcome is to stop before mixing vector spaces.
43
+
44
+ When updating `libravdbd`, keep the same effective embedding profile unless you
45
+ intend to rebuild the store. The effective profile includes the profile family,
46
+ dimensions, normalization setting, and any metadata supplied by the model
47
+ manifest or daemon defaults.
48
+
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 daemon update
51
+ if the daemon now computes different metadata for that local profile. This does
52
+ not imply that current packaged `nomic-embed-text-v1.5` or
53
+ `bge-small-en-v1.5` stores are incompatible; it means the old local profile must
54
+ be treated as a separate vector space unless a migration path is provided.
55
+
56
+ If a daemon update reports that the database format or embedding profile is
57
+ incompatible:
58
+
59
+ 1. back up both the `.libravdb` file and its `.embedding.json` metadata file;
60
+ 2. either downgrade to the previous daemon that created the store, or move the
61
+ old store aside and let the new daemon initialize a fresh database;
62
+ 3. rebuild/reingest memories with the new effective embedding profile.
63
+
64
+ Do not delete the old store until the replacement has been verified.
65
+
38
66
  Recommended usage:
39
67
 
40
68
  - `bundled` for the shipped default path, which uses `nomic-embed-text-v1.5`.
@@ -171,6 +171,30 @@ For foreground debugging:
171
171
  libravdbd serve
172
172
  ```
173
173
 
174
+ ### Incompatible database or embedding profile
175
+
176
+ If the daemon exits with `database format is incompatible` or `database
177
+ embedding profile is incompatible`, it is refusing to open a store whose saved
178
+ format or embedding fingerprint differs from the current daemon settings. This
179
+ fail-closed behavior protects the store from mixing incompatible vector spaces.
180
+
181
+ Before changing anything, back up both files for the affected store:
182
+
183
+ - the database file, such as `$HOME/.libravdbd/data_nomic-embed-text-v1_5.libravdb`
184
+ - the adjacent `.embedding.json` metadata file
185
+
186
+ Then choose one recovery path:
187
+
188
+ - downgrade to the daemon version that created the store; or
189
+ - move the old store aside, start the new daemon so it creates a fresh store,
190
+ and rebuild/reingest memories with the current embedding profile.
191
+
192
+ This can affect legacy local profiles such as older `all-minilm-l6-v2` setups
193
+ when daemon defaults or model metadata change across releases. It is not
194
+ expected for stores that stay on the current packaged profiles and assets. See
195
+ [Embedding Profiles](./embedding-profiles.md#store-compatibility-and-upgrades)
196
+ for more detail.
197
+
174
198
  ### Hash mismatch
175
199
 
176
200
  Do not bypass a checksum mismatch. Delete the corrupt or stale asset and rerun
@@ -2,7 +2,7 @@
2
2
  "id": "libravdb-memory",
3
3
  "name": "LibraVDB Memory",
4
4
  "description": "Persistent vector memory with three-tier hybrid scoring",
5
- "version": "1.6.11",
5
+ "version": "1.6.13",
6
6
  "kind": [
7
7
  "memory",
8
8
  "context-engine"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xdarkicex/openclaw-memory-libravdb",
3
- "version": "1.6.11",
3
+ "version": "1.6.13",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",