@xdarkicex/openclaw-memory-libravdb 1.4.39 → 1.4.41

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.
@@ -8,8 +8,9 @@ type KernelCompatibleMessage = {
8
8
  };
9
9
  type OpenClawCompatibleMessage = {
10
10
  role: string;
11
- content: string;
11
+ content: string | unknown[];
12
12
  id?: string;
13
+ [key: string]: unknown;
13
14
  };
14
15
  type OpenClawCompatibleAssembleResult = {
15
16
  messages: OpenClawCompatibleMessage[];
@@ -76,11 +77,7 @@ export declare function buildContextEngineFactory(runtime: PluginRuntime, cfg: P
76
77
  sessionId: string;
77
78
  sessionKey?: string;
78
79
  userId?: string;
79
- messages: Array<{
80
- role: string;
81
- content: unknown;
82
- id?: string;
83
- }>;
80
+ messages: OpenClawCompatibleMessage[];
84
81
  tokenBudget: number;
85
82
  prompt?: string;
86
83
  currentTokenCount?: number;
@@ -96,11 +93,7 @@ export declare function buildContextEngineFactory(runtime: PluginRuntime, cfg: P
96
93
  sessionId: string;
97
94
  sessionKey?: string;
98
95
  userId?: string;
99
- messages: Array<{
100
- role: string;
101
- content: unknown;
102
- id?: string;
103
- }>;
96
+ messages: OpenClawCompatibleMessage[];
104
97
  prePromptMessageCount?: number;
105
98
  isHeartbeat?: boolean;
106
99
  tokenBudget?: number;
@@ -85,9 +85,13 @@ function normalizeKernelContent(content) {
85
85
  return content.map(stringifyKernelBlock).filter((part) => part.length > 0).join("\n");
86
86
  }
87
87
  function approximateTokenCount(text) {
88
- if (!text)
88
+ if (typeof text === "string") {
89
+ return Math.ceil(text.length / APPROX_CHARS_PER_TOKEN);
90
+ }
91
+ if (!Array.isArray(text)) {
89
92
  return 0;
90
- return Math.ceil(text.length / APPROX_CHARS_PER_TOKEN);
93
+ }
94
+ return Math.ceil(normalizeKernelContent(text).length / APPROX_CHARS_PER_TOKEN);
91
95
  }
92
96
  function approximateMessageTokens(message) {
93
97
  // Approximate per-message wrapper overhead so trimming is conservative.
@@ -96,6 +100,20 @@ function approximateMessageTokens(message) {
96
100
  function approximateMessagesTokens(messages) {
97
101
  return messages.reduce((sum, message) => sum + approximateMessageTokens(message), 0);
98
102
  }
103
+ function selectAfterTurnMessages(messages, prePromptMessageCount, logger) {
104
+ if (typeof prePromptMessageCount !== "number" ||
105
+ !Number.isFinite(prePromptMessageCount) ||
106
+ prePromptMessageCount <= 0) {
107
+ return messages;
108
+ }
109
+ const start = Math.floor(prePromptMessageCount);
110
+ if (start >= messages.length) {
111
+ logger?.warn?.(`LibraVDB afterTurn prePromptMessageCount produced zero forwarded messages ` +
112
+ `prePromptMessageCount=${prePromptMessageCount} start=${start} totalMessages=${messages.length}`);
113
+ return [];
114
+ }
115
+ return messages.slice(start);
116
+ }
99
117
  function normalizeCurrentTokenCount(currentTokenCount) {
100
118
  if (typeof currentTokenCount !== "number" ||
101
119
  !Number.isFinite(currentTokenCount) ||
@@ -162,10 +180,11 @@ function truncateContentToTokenBudget(content, tokenBudget) {
162
180
  if (tokenBudget <= 0)
163
181
  return "";
164
182
  const maxChars = Math.max(1, tokenBudget * APPROX_CHARS_PER_TOKEN);
165
- if (content.length <= maxChars)
166
- return content;
183
+ const normalized = normalizeKernelContent(content);
184
+ if (normalized.length <= maxChars)
185
+ return normalized;
167
186
  // Keep the tail so recent tool output / latest answer content is preserved.
168
- return content.slice(content.length - maxChars);
187
+ return normalized.slice(normalized.length - maxChars);
169
188
  }
170
189
  function trimMessagesToBudget(messages, tokenBudget) {
171
190
  if (tokenBudget <= 0 || messages.length === 0) {
@@ -399,7 +418,7 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
399
418
  return assembled;
400
419
  const existingBlocks = [
401
420
  assembled.systemPromptAddition,
402
- ...assembled.messages.map((message) => message.content),
421
+ ...assembled.messages.map((message) => normalizeKernelContent(message.content)),
403
422
  ]
404
423
  .flatMap((block) => block.split(/\n+/))
405
424
  .map((block) => block.trim())
@@ -657,7 +676,7 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
657
676
  if (!compactionResult.ok) {
658
677
  logger.warn?.(`LibraVDB predictive compaction blocked assemble path at ${currentContextTokens} tokens ` +
659
678
  `(threshold=${dynamicCompactThreshold}): ${compactionResult.reason ?? "compaction failed"}`);
660
- return buildBudgetFallbackContext(messages, args.tokenBudget);
679
+ return buildBudgetFallbackContext(args.messages, args.tokenBudget);
661
680
  }
662
681
  }
663
682
  const kernel = await getKernelOrNull("assemble");
@@ -682,7 +701,7 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
682
701
  }
683
702
  catch (error) {
684
703
  logger.warn?.(`LibraVDB assemble kernel failed, using budget-clamped fallback context: ${error instanceof Error ? error.message : String(error)}`);
685
- return buildBudgetFallbackContext(messages, args.tokenBudget);
704
+ return buildBudgetFallbackContext(args.messages, args.tokenBudget);
686
705
  }
687
706
  }
688
707
  const rpc = await runtime.getRpc();
@@ -707,7 +726,7 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
707
726
  }
708
727
  catch (error) {
709
728
  logger.warn?.(`LibraVDB assemble sidecar failed, using budget-clamped fallback context: ${error instanceof Error ? error.message : String(error)}`);
710
- return buildBudgetFallbackContext(messages, args.tokenBudget);
729
+ return buildBudgetFallbackContext(args.messages, args.tokenBudget);
711
730
  }
712
731
  },
713
732
  async compact(args) {
@@ -718,10 +737,13 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
718
737
  userIdOverride: args.userId,
719
738
  sessionKey: args.sessionKey,
720
739
  });
721
- const messages = normalizeKernelMessages(args.messages);
740
+ const afterTurnMessages = selectAfterTurnMessages(args.messages, args.prePromptMessageCount, logger);
741
+ const messages = normalizeKernelMessages(afterTurnMessages);
722
742
  const msgCount = messages.length;
723
743
  logger.info?.(`LibraVDB afterTurn sessionId=${args.sessionId} userId=${userId} ` +
724
- `messageCount=${msgCount} heartbeat=${args.isHeartbeat ?? false}`);
744
+ `messageCount=${msgCount} totalMessages=${args.messages.length} ` +
745
+ `prePromptMessageCount=${args.prePromptMessageCount ?? "unknown"} ` +
746
+ `heartbeat=${args.isHeartbeat ?? false}`);
725
747
  try {
726
748
  const kernel = await getKernelOrNull("afterTurn");
727
749
  const currentTokenCount = normalizeCurrentTokenCount(typeof args.runtimeContext?.currentTokenCount === "number"
package/dist/index.js CHANGED
@@ -33664,8 +33664,13 @@ function normalizeKernelContent(content) {
33664
33664
  return content.map(stringifyKernelBlock).filter((part) => part.length > 0).join("\n");
33665
33665
  }
33666
33666
  function approximateTokenCount(text) {
33667
- if (!text) return 0;
33668
- return Math.ceil(text.length / APPROX_CHARS_PER_TOKEN);
33667
+ if (typeof text === "string") {
33668
+ return Math.ceil(text.length / APPROX_CHARS_PER_TOKEN);
33669
+ }
33670
+ if (!Array.isArray(text)) {
33671
+ return 0;
33672
+ }
33673
+ return Math.ceil(normalizeKernelContent(text).length / APPROX_CHARS_PER_TOKEN);
33669
33674
  }
33670
33675
  function approximateMessageTokens(message) {
33671
33676
  return approximateTokenCount(message.content) + 8;
@@ -33673,6 +33678,19 @@ function approximateMessageTokens(message) {
33673
33678
  function approximateMessagesTokens(messages) {
33674
33679
  return messages.reduce((sum, message) => sum + approximateMessageTokens(message), 0);
33675
33680
  }
33681
+ function selectAfterTurnMessages(messages, prePromptMessageCount, logger) {
33682
+ if (typeof prePromptMessageCount !== "number" || !Number.isFinite(prePromptMessageCount) || prePromptMessageCount <= 0) {
33683
+ return messages;
33684
+ }
33685
+ const start = Math.floor(prePromptMessageCount);
33686
+ if (start >= messages.length) {
33687
+ logger?.warn?.(
33688
+ `LibraVDB afterTurn prePromptMessageCount produced zero forwarded messages prePromptMessageCount=${prePromptMessageCount} start=${start} totalMessages=${messages.length}`
33689
+ );
33690
+ return [];
33691
+ }
33692
+ return messages.slice(start);
33693
+ }
33676
33694
  function normalizeCurrentTokenCount(currentTokenCount) {
33677
33695
  if (typeof currentTokenCount !== "number" || !Number.isFinite(currentTokenCount) || currentTokenCount <= 0) {
33678
33696
  return void 0;
@@ -33731,8 +33749,9 @@ function logPredictiveCompactionOutcome(params) {
33731
33749
  function truncateContentToTokenBudget(content, tokenBudget) {
33732
33750
  if (tokenBudget <= 0) return "";
33733
33751
  const maxChars = Math.max(1, tokenBudget * APPROX_CHARS_PER_TOKEN);
33734
- if (content.length <= maxChars) return content;
33735
- return content.slice(content.length - maxChars);
33752
+ const normalized = normalizeKernelContent(content);
33753
+ if (normalized.length <= maxChars) return normalized;
33754
+ return normalized.slice(normalized.length - maxChars);
33736
33755
  }
33737
33756
  function trimMessagesToBudget(messages, tokenBudget) {
33738
33757
  if (tokenBudget <= 0 || messages.length === 0) {
@@ -33952,7 +33971,7 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
33952
33971
  if (tokens.length === 0) return assembled;
33953
33972
  const existingBlocks = [
33954
33973
  assembled.systemPromptAddition,
33955
- ...assembled.messages.map((message) => message.content)
33974
+ ...assembled.messages.map((message) => normalizeKernelContent(message.content))
33956
33975
  ].flatMap((block) => block.split(/\n+/)).map((block) => block.trim()).filter((block) => block.length > 0);
33957
33976
  const missingTokens = tokens.filter(
33958
33977
  (token) => !existingBlocks.some((block) => isExactRecallFact(block, token))
@@ -34194,7 +34213,7 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
34194
34213
  logger.warn?.(
34195
34214
  `LibraVDB predictive compaction blocked assemble path at ${currentContextTokens} tokens (threshold=${dynamicCompactThreshold}): ${compactionResult.reason ?? "compaction failed"}`
34196
34215
  );
34197
- return buildBudgetFallbackContext(messages, args.tokenBudget);
34216
+ return buildBudgetFallbackContext(args.messages, args.tokenBudget);
34198
34217
  }
34199
34218
  }
34200
34219
  const kernel = await getKernelOrNull("assemble");
@@ -34223,7 +34242,7 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
34223
34242
  logger.warn?.(
34224
34243
  `LibraVDB assemble kernel failed, using budget-clamped fallback context: ${error instanceof Error ? error.message : String(error)}`
34225
34244
  );
34226
- return buildBudgetFallbackContext(messages, args.tokenBudget);
34245
+ return buildBudgetFallbackContext(args.messages, args.tokenBudget);
34227
34246
  }
34228
34247
  }
34229
34248
  const rpc = await runtime.getRpc();
@@ -34252,7 +34271,7 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
34252
34271
  logger.warn?.(
34253
34272
  `LibraVDB assemble sidecar failed, using budget-clamped fallback context: ${error instanceof Error ? error.message : String(error)}`
34254
34273
  );
34255
- return buildBudgetFallbackContext(messages, args.tokenBudget);
34274
+ return buildBudgetFallbackContext(args.messages, args.tokenBudget);
34256
34275
  }
34257
34276
  },
34258
34277
  async compact(args) {
@@ -34263,10 +34282,11 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
34263
34282
  userIdOverride: args.userId,
34264
34283
  sessionKey: args.sessionKey
34265
34284
  });
34266
- const messages = normalizeKernelMessages(args.messages);
34285
+ const afterTurnMessages = selectAfterTurnMessages(args.messages, args.prePromptMessageCount, logger);
34286
+ const messages = normalizeKernelMessages(afterTurnMessages);
34267
34287
  const msgCount = messages.length;
34268
34288
  logger.info?.(
34269
- `LibraVDB afterTurn sessionId=${args.sessionId} userId=${userId} messageCount=${msgCount} heartbeat=${args.isHeartbeat ?? false}`
34289
+ `LibraVDB afterTurn sessionId=${args.sessionId} userId=${userId} messageCount=${msgCount} totalMessages=${args.messages.length} prePromptMessageCount=${args.prePromptMessageCount ?? "unknown"} heartbeat=${args.isHeartbeat ?? false}`
34270
34290
  );
34271
34291
  try {
34272
34292
  const kernel = await getKernelOrNull("afterTurn");
@@ -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.39",
5
+ "version": "1.4.41",
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.39",
3
+ "version": "1.4.41",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",