@xdarkicex/openclaw-memory-libravdb 1.4.59 → 1.4.61

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.
@@ -186,6 +186,15 @@ function truncateContentToTokenBudget(content, tokenBudget) {
186
186
  // Keep the tail so recent tool output / latest answer content is preserved.
187
187
  return normalized.slice(normalized.length - maxChars);
188
188
  }
189
+ function truncateSystemPromptAdditionToTokenBudget(value, tokenBudget) {
190
+ if (tokenBudget <= 0)
191
+ return "";
192
+ const maxChars = Math.max(1, tokenBudget * APPROX_CHARS_PER_TOKEN);
193
+ if (value.length <= maxChars)
194
+ return value;
195
+ // System additions are head-structured: preserve XML/preamble/instructions.
196
+ return value.slice(0, maxChars);
197
+ }
189
198
  function trimMessagesToBudget(messages, tokenBudget) {
190
199
  if (tokenBudget <= 0 || messages.length === 0) {
191
200
  return [];
@@ -205,7 +214,10 @@ function trimMessagesToBudget(messages, tokenBudget) {
205
214
  return kept.reverse();
206
215
  }
207
216
  const last = messages[messages.length - 1];
208
- const contentBudget = Math.max(1, tokenBudget - 8);
217
+ const contentBudget = tokenBudget - 8;
218
+ if (contentBudget <= 0) {
219
+ return [];
220
+ }
209
221
  const truncated = truncateContentToTokenBudget(last.content, contentBudget);
210
222
  if (!truncated) {
211
223
  return [];
@@ -219,16 +231,29 @@ function enforceTokenBudgetInvariant(result, tokenBudget) {
219
231
  const hardBudget = Math.max(1, Math.floor(tokenBudget));
220
232
  const effectiveBudget = resolveEffectiveAssembleBudget(hardBudget);
221
233
  const estimated = typeof result.estimatedTokens === "number" ? result.estimatedTokens : 0;
234
+ const systemPromptTokens = approximateTokenCount(result.systemPromptAddition);
222
235
  const approxFromMessages = approximateMessagesTokens(result.messages);
223
- if (estimated <= effectiveBudget && approxFromMessages <= effectiveBudget) {
236
+ const approxTotal = systemPromptTokens + approxFromMessages;
237
+ if (estimated <= effectiveBudget && approxTotal <= effectiveBudget) {
224
238
  return result;
225
239
  }
226
- const trimmedMessages = trimMessagesToBudget(result.messages, effectiveBudget);
240
+ if (systemPromptTokens >= effectiveBudget) {
241
+ const trimmedSystemPromptAddition = truncateSystemPromptAdditionToTokenBudget(result.systemPromptAddition, effectiveBudget);
242
+ const trimmedSystemPromptTokens = approximateTokenCount(trimmedSystemPromptAddition);
243
+ return {
244
+ ...result,
245
+ systemPromptAddition: trimmedSystemPromptAddition,
246
+ messages: [],
247
+ estimatedTokens: Math.min(effectiveBudget, trimmedSystemPromptTokens),
248
+ };
249
+ }
250
+ const messageBudget = Math.max(0, effectiveBudget - systemPromptTokens);
251
+ const trimmedMessages = trimMessagesToBudget(result.messages, messageBudget);
227
252
  const trimmedEstimate = approximateMessagesTokens(trimmedMessages);
228
253
  return {
229
254
  ...result,
230
255
  messages: trimmedMessages,
231
- estimatedTokens: Math.min(effectiveBudget, trimmedEstimate),
256
+ estimatedTokens: Math.min(effectiveBudget, systemPromptTokens + trimmedEstimate),
232
257
  };
233
258
  }
234
259
  function buildBudgetFallbackContext(messages, tokenBudget) {
package/dist/index.js CHANGED
@@ -33806,6 +33806,12 @@ function truncateContentToTokenBudget(content, tokenBudget) {
33806
33806
  if (normalized.length <= maxChars) return normalized;
33807
33807
  return normalized.slice(normalized.length - maxChars);
33808
33808
  }
33809
+ function truncateSystemPromptAdditionToTokenBudget(value, tokenBudget) {
33810
+ if (tokenBudget <= 0) return "";
33811
+ const maxChars = Math.max(1, tokenBudget * APPROX_CHARS_PER_TOKEN);
33812
+ if (value.length <= maxChars) return value;
33813
+ return value.slice(0, maxChars);
33814
+ }
33809
33815
  function trimMessagesToBudget(messages, tokenBudget) {
33810
33816
  if (tokenBudget <= 0 || messages.length === 0) {
33811
33817
  return [];
@@ -33825,7 +33831,10 @@ function trimMessagesToBudget(messages, tokenBudget) {
33825
33831
  return kept.reverse();
33826
33832
  }
33827
33833
  const last = messages[messages.length - 1];
33828
- const contentBudget = Math.max(1, tokenBudget - 8);
33834
+ const contentBudget = tokenBudget - 8;
33835
+ if (contentBudget <= 0) {
33836
+ return [];
33837
+ }
33829
33838
  const truncated = truncateContentToTokenBudget(last.content, contentBudget);
33830
33839
  if (!truncated) {
33831
33840
  return [];
@@ -33839,16 +33848,32 @@ function enforceTokenBudgetInvariant(result, tokenBudget) {
33839
33848
  const hardBudget = Math.max(1, Math.floor(tokenBudget));
33840
33849
  const effectiveBudget = resolveEffectiveAssembleBudget(hardBudget);
33841
33850
  const estimated = typeof result.estimatedTokens === "number" ? result.estimatedTokens : 0;
33851
+ const systemPromptTokens = approximateTokenCount(result.systemPromptAddition);
33842
33852
  const approxFromMessages = approximateMessagesTokens(result.messages);
33843
- if (estimated <= effectiveBudget && approxFromMessages <= effectiveBudget) {
33853
+ const approxTotal = systemPromptTokens + approxFromMessages;
33854
+ if (estimated <= effectiveBudget && approxTotal <= effectiveBudget) {
33844
33855
  return result;
33845
33856
  }
33846
- const trimmedMessages = trimMessagesToBudget(result.messages, effectiveBudget);
33857
+ if (systemPromptTokens >= effectiveBudget) {
33858
+ const trimmedSystemPromptAddition = truncateSystemPromptAdditionToTokenBudget(
33859
+ result.systemPromptAddition,
33860
+ effectiveBudget
33861
+ );
33862
+ const trimmedSystemPromptTokens = approximateTokenCount(trimmedSystemPromptAddition);
33863
+ return {
33864
+ ...result,
33865
+ systemPromptAddition: trimmedSystemPromptAddition,
33866
+ messages: [],
33867
+ estimatedTokens: Math.min(effectiveBudget, trimmedSystemPromptTokens)
33868
+ };
33869
+ }
33870
+ const messageBudget = Math.max(0, effectiveBudget - systemPromptTokens);
33871
+ const trimmedMessages = trimMessagesToBudget(result.messages, messageBudget);
33847
33872
  const trimmedEstimate = approximateMessagesTokens(trimmedMessages);
33848
33873
  return {
33849
33874
  ...result,
33850
33875
  messages: trimmedMessages,
33851
- estimatedTokens: Math.min(effectiveBudget, trimmedEstimate)
33876
+ estimatedTokens: Math.min(effectiveBudget, systemPromptTokens + trimmedEstimate)
33852
33877
  };
33853
33878
  }
33854
33879
  function buildBudgetFallbackContext(messages, tokenBudget) {
@@ -39886,6 +39911,21 @@ function register(api) {
39886
39911
  logger.info?.(
39887
39912
  `LibraVDB registering mode=${registrationMode} lightweight=${isLightweight} discovery=${isDiscovery} userId=${cfg.userId ?? "(auto)"} crossSessionRecall=${cfg.crossSessionRecall !== false}`
39888
39913
  );
39914
+ const memSlot = api.config?.plugins?.slots?.memory;
39915
+ if (!isLightweight && !isDiscovery) {
39916
+ if (memSlot && memSlot !== MEMORY_ID && memSlot !== "none") {
39917
+ throw new Error(
39918
+ `[libravdb-memory] plugins.slots.memory is "${memSlot}". Set it to "libravdb-memory" before enabling this plugin.`
39919
+ );
39920
+ }
39921
+ if (memSlot === "none") {
39922
+ logger.info?.(
39923
+ '[libravdb-memory] plugins.slots.memory is "none"; skipping memory capability, context engine, embedding providers, services, and hooks.'
39924
+ );
39925
+ registerMemoryCli(api, null, cfg, logger);
39926
+ return;
39927
+ }
39928
+ }
39889
39929
  const runtimeOrNull = isLightweight ? null : createPluginRuntime(cfg, logger);
39890
39930
  registerMemoryCli(api, runtimeOrNull, cfg, logger);
39891
39931
  if (isLightweight || isDiscovery) {
@@ -39902,11 +39942,8 @@ function register(api) {
39902
39942
  }
39903
39943
  const runtime = runtimeOrNull;
39904
39944
  if (!runtime) return;
39905
- const memSlot = api.config?.plugins?.slots?.memory;
39906
- if (memSlot && memSlot !== MEMORY_ID && memSlot !== "none") {
39907
- throw new Error(
39908
- `[libravdb-memory] plugins.slots.memory is "${memSlot}". Set it to "libravdb-memory" before enabling this plugin.`
39909
- );
39945
+ if (!memSlot) {
39946
+ logger.warn?.('[libravdb-memory] plugins.slots.memory is unset; set it to "libravdb-memory" for memory to work.');
39910
39947
  }
39911
39948
  api.registerMemoryCapability(MEMORY_ID, {
39912
39949
  promptBuilder: buildMemoryPromptSection(runtime.getRpc, cfg),
@@ -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.4.59",
5
+ "version": "1.4.61",
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.4.59",
3
+ "version": "1.4.61",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",