@xdarkicex/openclaw-memory-libravdb 1.4.68 → 1.4.70

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.
@@ -275,6 +275,17 @@ function resolvePredictiveCompactionTokenCount(args) {
275
275
  return (normalizeCurrentTokenCount(args.currentTokenCount) ??
276
276
  approximateMessagesTokens(args.messages) + approximateTokenCount(args.prompt ?? ""));
277
277
  }
278
+ function resolveAfterTurnPredictiveCompactionTokenCount(args) {
279
+ const currentTokenCount = normalizeCurrentTokenCount(args.currentTokenCount);
280
+ const forwardedMessageTokens = normalizeCurrentTokenCount(approximateMessagesTokens(args.messages));
281
+ if (currentTokenCount == null) {
282
+ return forwardedMessageTokens;
283
+ }
284
+ if (forwardedMessageTokens == null) {
285
+ return currentTokenCount;
286
+ }
287
+ return Math.max(currentTokenCount, forwardedMessageTokens);
288
+ }
278
289
  export function normalizeKernelMessage(message) {
279
290
  return {
280
291
  role: message.role,
@@ -387,6 +398,7 @@ export function normalizeAssembleResult(result) {
387
398
  };
388
399
  }
389
400
  export function buildContextEngineFactory(runtime, cfg, logger = console) {
401
+ const predictiveContextCache = new Map();
390
402
  let cachedIdentity = null;
391
403
  let cachedSessionKey;
392
404
  function resolveUserId(args) {
@@ -564,11 +576,15 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
564
576
  }
565
577
  async function performAfterTurnPredictiveCompaction(args) {
566
578
  const dynamicCompactThreshold = getDynamicCompactThreshold(args.tokenBudget);
567
- const predictiveTargetSize = resolvePredictiveCompactionTarget({
579
+ const currentContextTokens = resolveAfterTurnPredictiveCompactionTokenCount({
568
580
  currentTokenCount: args.currentTokenCount,
581
+ messages: args.messages,
582
+ });
583
+ const predictiveTargetSize = resolvePredictiveCompactionTarget({
584
+ currentTokenCount: currentContextTokens,
569
585
  threshold: dynamicCompactThreshold,
570
586
  });
571
- if (args.currentTokenCount == null ||
587
+ if (currentContextTokens == null ||
572
588
  dynamicCompactThreshold == null ||
573
589
  predictiveTargetSize == null) {
574
590
  return;
@@ -577,7 +593,7 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
577
593
  logger,
578
594
  phase: "afterTurn",
579
595
  sessionId: args.sessionId,
580
- currentTokenCount: args.currentTokenCount,
596
+ currentTokenCount: currentContextTokens,
581
597
  threshold: dynamicCompactThreshold,
582
598
  targetSize: predictiveTargetSize,
583
599
  tokenBudget: args.tokenBudget,
@@ -587,13 +603,13 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
587
603
  targetSize: predictiveTargetSize,
588
604
  tokenBudget: args.tokenBudget,
589
605
  force: true,
590
- currentTokenCount: args.currentTokenCount,
606
+ currentTokenCount: currentContextTokens,
591
607
  });
592
608
  logPredictiveCompactionOutcome({
593
609
  logger,
594
610
  phase: "afterTurn",
595
611
  sessionId: args.sessionId,
596
- currentTokenCount: args.currentTokenCount,
612
+ currentTokenCount: currentContextTokens,
597
613
  threshold: dynamicCompactThreshold,
598
614
  targetSize: predictiveTargetSize,
599
615
  tokenBudget: args.tokenBudget,
@@ -760,12 +776,19 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
760
776
  config: buildAssemblyConfig(args.tokenBudget),
761
777
  });
762
778
  const assembled = normalizeAssembleResult(resp);
763
- return enforceTokenBudgetInvariant(await augmentWithExactRecall(assembled, {
779
+ const enforced = enforceTokenBudgetInvariant(await augmentWithExactRecall(assembled, {
764
780
  queryText: args.prompt ?? messages[messages.length - 1]?.content ?? "",
765
781
  userId,
766
782
  sessionId,
767
783
  tokenBudget: args.tokenBudget,
768
784
  }), args.tokenBudget);
785
+ const predictions = predictiveContextCache.get(sessionId) || [];
786
+ predictiveContextCache.delete(sessionId);
787
+ if (predictions.length > 0) {
788
+ const injection = ["<predictive_context>", ...predictions.map((p) => p.text), "</predictive_context>"].join("\n");
789
+ enforced.systemPromptAddition = appendSystemPromptAddition(enforced.systemPromptAddition, injection);
790
+ }
791
+ return enforced;
769
792
  }
770
793
  catch (error) {
771
794
  logger.warn?.(`LibraVDB assemble sidecar failed, using budget-clamped fallback context: ${error instanceof Error ? error.message : String(error)}`);
@@ -803,9 +826,14 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
803
826
  });
804
827
  await performAfterTurnPredictiveCompaction({
805
828
  sessionId,
829
+ messages,
806
830
  tokenBudget: args.tokenBudget,
807
831
  currentTokenCount,
808
832
  });
833
+ const predictions = result.predictions;
834
+ if (Array.isArray(predictions) && predictions.length > 0) {
835
+ predictiveContextCache.set(sessionId, predictions);
836
+ }
809
837
  return result;
810
838
  }
811
839
  const rpc = await runtime.getRpc();
@@ -818,9 +846,14 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
818
846
  });
819
847
  await performAfterTurnPredictiveCompaction({
820
848
  sessionId,
849
+ messages,
821
850
  tokenBudget: args.tokenBudget,
822
851
  currentTokenCount,
823
852
  });
853
+ const predictions = result.predictions;
854
+ if (Array.isArray(predictions) && predictions.length > 0) {
855
+ predictiveContextCache.set(sessionId, predictions);
856
+ }
824
857
  return result;
825
858
  }
826
859
  catch (error) {
@@ -36,8 +36,12 @@ export class GrpcKernelClient {
36
36
  if (!this.nonceHex) {
37
37
  throw new Error("call initializeSession before authenticated RPCs");
38
38
  }
39
- const hmac = createHmac("sha256", Buffer.from(this.nonceHex, "hex"));
40
- hmac.update(this.secret);
39
+ // Challenge-response: HMAC(secret, nonce) — the secret is the HMAC key,
40
+ // the server-issued nonce is the message. The previous implementation
41
+ // swapped these, computing HMAC(nonce, secret), which is cryptographically
42
+ // incorrect: the nonce is sent in the clear and must not be used as the key.
43
+ const hmac = createHmac("sha256", this.secret);
44
+ hmac.update(this.nonceHex);
41
45
  const signature = hmac.digest("hex");
42
46
  md.add("x-libravdb-auth", signature);
43
47
  }
package/dist/index.js CHANGED
@@ -33927,6 +33927,19 @@ function buildBudgetFallbackContext(messages, tokenBudget) {
33927
33927
  function resolvePredictiveCompactionTokenCount(args) {
33928
33928
  return normalizeCurrentTokenCount(args.currentTokenCount) ?? approximateMessagesTokens(args.messages) + approximateTokenCount(args.prompt ?? "");
33929
33929
  }
33930
+ function resolveAfterTurnPredictiveCompactionTokenCount(args) {
33931
+ const currentTokenCount = normalizeCurrentTokenCount(args.currentTokenCount);
33932
+ const forwardedMessageTokens = normalizeCurrentTokenCount(
33933
+ approximateMessagesTokens(args.messages)
33934
+ );
33935
+ if (currentTokenCount == null) {
33936
+ return forwardedMessageTokens;
33937
+ }
33938
+ if (forwardedMessageTokens == null) {
33939
+ return currentTokenCount;
33940
+ }
33941
+ return Math.max(currentTokenCount, forwardedMessageTokens);
33942
+ }
33930
33943
  function normalizeKernelMessage(message) {
33931
33944
  return {
33932
33945
  role: message.role,
@@ -34021,6 +34034,7 @@ function normalizeAssembleResult(result) {
34021
34034
  };
34022
34035
  }
34023
34036
  function buildContextEngineFactory(runtime, cfg, logger = console) {
34037
+ const predictiveContextCache = /* @__PURE__ */ new Map();
34024
34038
  let cachedIdentity = null;
34025
34039
  let cachedSessionKey;
34026
34040
  function resolveUserId(args) {
@@ -34184,18 +34198,22 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
34184
34198
  }
34185
34199
  async function performAfterTurnPredictiveCompaction(args) {
34186
34200
  const dynamicCompactThreshold = getDynamicCompactThreshold(args.tokenBudget);
34187
- const predictiveTargetSize = resolvePredictiveCompactionTarget({
34201
+ const currentContextTokens = resolveAfterTurnPredictiveCompactionTokenCount({
34188
34202
  currentTokenCount: args.currentTokenCount,
34203
+ messages: args.messages
34204
+ });
34205
+ const predictiveTargetSize = resolvePredictiveCompactionTarget({
34206
+ currentTokenCount: currentContextTokens,
34189
34207
  threshold: dynamicCompactThreshold
34190
34208
  });
34191
- if (args.currentTokenCount == null || dynamicCompactThreshold == null || predictiveTargetSize == null) {
34209
+ if (currentContextTokens == null || dynamicCompactThreshold == null || predictiveTargetSize == null) {
34192
34210
  return;
34193
34211
  }
34194
34212
  logPredictiveCompactionAttempt({
34195
34213
  logger,
34196
34214
  phase: "afterTurn",
34197
34215
  sessionId: args.sessionId,
34198
- currentTokenCount: args.currentTokenCount,
34216
+ currentTokenCount: currentContextTokens,
34199
34217
  threshold: dynamicCompactThreshold,
34200
34218
  targetSize: predictiveTargetSize,
34201
34219
  tokenBudget: args.tokenBudget
@@ -34205,13 +34223,13 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
34205
34223
  targetSize: predictiveTargetSize,
34206
34224
  tokenBudget: args.tokenBudget,
34207
34225
  force: true,
34208
- currentTokenCount: args.currentTokenCount
34226
+ currentTokenCount: currentContextTokens
34209
34227
  });
34210
34228
  logPredictiveCompactionOutcome({
34211
34229
  logger,
34212
34230
  phase: "afterTurn",
34213
34231
  sessionId: args.sessionId,
34214
- currentTokenCount: args.currentTokenCount,
34232
+ currentTokenCount: currentContextTokens,
34215
34233
  threshold: dynamicCompactThreshold,
34216
34234
  targetSize: predictiveTargetSize,
34217
34235
  tokenBudget: args.tokenBudget,
@@ -34382,7 +34400,7 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
34382
34400
  config: buildAssemblyConfig(args.tokenBudget)
34383
34401
  });
34384
34402
  const assembled = normalizeAssembleResult(resp);
34385
- return enforceTokenBudgetInvariant(
34403
+ const enforced = enforceTokenBudgetInvariant(
34386
34404
  await augmentWithExactRecall(assembled, {
34387
34405
  queryText: args.prompt ?? messages[messages.length - 1]?.content ?? "",
34388
34406
  userId,
@@ -34391,6 +34409,13 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
34391
34409
  }),
34392
34410
  args.tokenBudget
34393
34411
  );
34412
+ const predictions = predictiveContextCache.get(sessionId) || [];
34413
+ predictiveContextCache.delete(sessionId);
34414
+ if (predictions.length > 0) {
34415
+ const injection = ["<predictive_context>", ...predictions.map((p) => p.text), "</predictive_context>"].join("\n");
34416
+ enforced.systemPromptAddition = appendSystemPromptAddition(enforced.systemPromptAddition, injection);
34417
+ }
34418
+ return enforced;
34394
34419
  } catch (error) {
34395
34420
  logger.warn?.(
34396
34421
  `LibraVDB assemble sidecar failed, using budget-clamped fallback context: ${error instanceof Error ? error.message : String(error)}`
@@ -34428,9 +34453,14 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
34428
34453
  });
34429
34454
  await performAfterTurnPredictiveCompaction({
34430
34455
  sessionId,
34456
+ messages,
34431
34457
  tokenBudget: args.tokenBudget,
34432
34458
  currentTokenCount
34433
34459
  });
34460
+ const predictions2 = result2.predictions;
34461
+ if (Array.isArray(predictions2) && predictions2.length > 0) {
34462
+ predictiveContextCache.set(sessionId, predictions2);
34463
+ }
34434
34464
  return result2;
34435
34465
  }
34436
34466
  const rpc = await runtime.getRpc();
@@ -34443,9 +34473,14 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
34443
34473
  });
34444
34474
  await performAfterTurnPredictiveCompaction({
34445
34475
  sessionId,
34476
+ messages,
34446
34477
  tokenBudget: args.tokenBudget,
34447
34478
  currentTokenCount
34448
34479
  });
34480
+ const predictions = result.predictions;
34481
+ if (Array.isArray(predictions) && predictions.length > 0) {
34482
+ predictiveContextCache.set(sessionId, predictions);
34483
+ }
34449
34484
  return result;
34450
34485
  } catch (error) {
34451
34486
  logger.warn?.(
@@ -39522,8 +39557,8 @@ var GrpcKernelClient = class {
39522
39557
  if (!this.nonceHex) {
39523
39558
  throw new Error("call initializeSession before authenticated RPCs");
39524
39559
  }
39525
- const hmac = createHmac("sha256", Buffer.from(this.nonceHex, "hex"));
39526
- hmac.update(this.secret);
39560
+ const hmac = createHmac("sha256", this.secret);
39561
+ hmac.update(this.nonceHex);
39527
39562
  const signature = hmac.digest("hex");
39528
39563
  md.add("x-libravdb-auth", signature);
39529
39564
  }
package/dist/types.d.ts CHANGED
@@ -155,3 +155,8 @@ export interface SidecarHandle {
155
155
  export interface RpcCallOptions {
156
156
  timeoutMs: number;
157
157
  }
158
+ export interface PredictedContext {
159
+ id: string;
160
+ text: string;
161
+ reason: string;
162
+ }
@@ -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.68",
5
+ "version": "1.4.70",
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.68",
3
+ "version": "1.4.70",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",