@xdarkicex/openclaw-memory-libravdb 1.9.10-beta.11 → 1.9.10-beta.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.
@@ -16,6 +16,7 @@ const EXACT_RECALL_MAX_TOKENS = 4;
16
16
  const RESERVED_CURRENT_TURN_TOKENS = 150;
17
17
  const AFTER_TURN_INGEST_MAX_TOKENS = 2048;
18
18
  const OPENCLAW_LEADING_TIMESTAMP_PREFIX_RE = /^\[[A-Za-z]{3} \d{4}-\d{2}-\d{2} \d{2}:\d{2}[^\]]*\] */;
19
+ const OPENCLAW_CONTEXT_PREFIX_RE = /^\[OpenClaw context: [^\]]*\][\r\n]*/;
19
20
  const SELECTED_CONTEXT_HEADER = "Conversation context (untrusted, chronological, selected for current message):";
20
21
  const RETRIEVAL_QUERY_MAX_CHARS = 1000;
21
22
  const SELECTED_CONTEXT_TURN_RE = /^#\d+\s+[A-Za-z]{3}\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}(?::\d{2})?\s+\S+\s+([^:\n]{1,80}):\s*(.*)$/;
@@ -208,6 +209,7 @@ function normalizeRetrievalQuery(primaryText, fallbackText = "") {
208
209
  }
209
210
  function normalizeRetrievalCandidate(text) {
210
211
  const normalized = text
212
+ .replace(OPENCLAW_CONTEXT_PREFIX_RE, "")
211
213
  .replace(OPENCLAW_LEADING_TIMESTAMP_PREFIX_RE, "")
212
214
  .replace(/\r\n/g, "\n")
213
215
  .trim();
@@ -1394,7 +1396,6 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
1394
1396
  // Then run the standard metadata envelope stripping.
1395
1397
  return stripOpenClawUntrustedMetadataEnvelope(stripped);
1396
1398
  }
1397
- const OPENCLAW_CONTEXT_PREFIX_RE = /^\[OpenClaw context: [^\]]*\][\r\n]*/;
1398
1399
  function formatRetrievedMemory(predictions) {
1399
1400
  if (!predictions?.length)
1400
1401
  return "";
@@ -1601,8 +1602,19 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
1601
1602
  : {}),
1602
1603
  };
1603
1604
  }
1605
+ const continuityCache = new Map(); // sessionKey -> raw context block
1606
+ function updateContinuityCache(sessionKey, messages) {
1607
+ const lastTurns = messages.filter(m => m.role === 'user' || m.role === 'assistant').slice(-2);
1608
+ if (lastTurns.length > 0) {
1609
+ continuityCache.set(sessionKey, lastTurns.map(m => `${m.role}: ${m.content}`).join('\n'));
1610
+ }
1611
+ }
1604
1612
  async function injectContinuityContext(params) {
1605
1613
  try {
1614
+ const cached = continuityCache.get(params.sessionKey);
1615
+ if (cached) {
1616
+ return `<continuity_context>\nRecent conversation:\n${cached}\n</continuity_context>`;
1617
+ }
1606
1618
  // Use a natural-language query that semantically matches the
1607
1619
  // pointer record text ("Previous session continuity — ...").
1608
1620
  // Fetch enough results so the exact ID match isn't crowded out
@@ -1940,6 +1952,7 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
1940
1952
  client,
1941
1953
  userId,
1942
1954
  sessionId,
1955
+ sessionKey: args.sessionKey ?? sessionId,
1943
1956
  logger,
1944
1957
  tokenBudget: args.tokenBudget,
1945
1958
  systemPromptAddition: assembled.systemPromptAddition,
@@ -2101,6 +2114,7 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
2101
2114
  isHeartbeat: args.isHeartbeat,
2102
2115
  cursor,
2103
2116
  });
2117
+ updateContinuityCache(args.sessionKey ?? sessionId, ingestMessages);
2104
2118
  // Reconcile manifest with daemon-confirmed cursor.
2105
2119
  // The daemon returns a cursor even when it ingests zero messages
2106
2120
  // (e.g. gap detected, all messages deduped). Trust its
package/dist/index.js CHANGED
@@ -35491,6 +35491,7 @@ var EXACT_RECALL_MAX_TOKENS = 4;
35491
35491
  var RESERVED_CURRENT_TURN_TOKENS = 150;
35492
35492
  var AFTER_TURN_INGEST_MAX_TOKENS = 2048;
35493
35493
  var OPENCLAW_LEADING_TIMESTAMP_PREFIX_RE = /^\[[A-Za-z]{3} \d{4}-\d{2}-\d{2} \d{2}:\d{2}[^\]]*\] */;
35494
+ var OPENCLAW_CONTEXT_PREFIX_RE = /^\[OpenClaw context: [^\]]*\][\r\n]*/;
35494
35495
  var SELECTED_CONTEXT_HEADER = "Conversation context (untrusted, chronological, selected for current message):";
35495
35496
  var RETRIEVAL_QUERY_MAX_CHARS = 1e3;
35496
35497
  var SELECTED_CONTEXT_TURN_RE = /^#\d+\s+[A-Za-z]{3}\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}(?::\d{2})?\s+\S+\s+([^:\n]{1,80}):\s*(.*)$/;
@@ -35666,7 +35667,7 @@ function normalizeRetrievalQuery(primaryText, fallbackText = "") {
35666
35667
  return normalizeRetrievalCandidate(fallbackText);
35667
35668
  }
35668
35669
  function normalizeRetrievalCandidate(text) {
35669
- const normalized = text.replace(OPENCLAW_LEADING_TIMESTAMP_PREFIX_RE, "").replace(/\r\n/g, "\n").trim();
35670
+ const normalized = text.replace(OPENCLAW_CONTEXT_PREFIX_RE, "").replace(OPENCLAW_LEADING_TIMESTAMP_PREFIX_RE, "").replace(/\r\n/g, "\n").trim();
35670
35671
  if (!normalized) return "";
35671
35672
  const selected = extractLatestSelectedContextUtterance(normalized);
35672
35673
  const candidate = selected || normalized;
@@ -36637,7 +36638,6 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
36637
36638
  const stripped = text.replace(OPENCLAW_CONTEXT_PREFIX_RE, "").trimStart();
36638
36639
  return stripOpenClawUntrustedMetadataEnvelope(stripped);
36639
36640
  }
36640
- const OPENCLAW_CONTEXT_PREFIX_RE = /^\[OpenClaw context: [^\]]*\][\r\n]*/;
36641
36641
  function formatRetrievedMemory(predictions) {
36642
36642
  if (!predictions?.length) return "";
36643
36643
  if (cfg.beforeTurnDebug) {
@@ -36837,8 +36837,22 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
36837
36837
  ...typeof cfg.continuityPriorContextTokens === "number" ? { continuityPriorContextTokens: cfg.continuityPriorContextTokens } : {}
36838
36838
  };
36839
36839
  }
36840
+ const continuityCache = /* @__PURE__ */ new Map();
36841
+ function updateContinuityCache(sessionKey, messages) {
36842
+ const lastTurns = messages.filter((m) => m.role === "user" || m.role === "assistant").slice(-2);
36843
+ if (lastTurns.length > 0) {
36844
+ continuityCache.set(sessionKey, lastTurns.map((m) => `${m.role}: ${m.content}`).join("\n"));
36845
+ }
36846
+ }
36840
36847
  async function injectContinuityContext(params) {
36841
36848
  try {
36849
+ const cached = continuityCache.get(params.sessionKey);
36850
+ if (cached) {
36851
+ return `<continuity_context>
36852
+ Recent conversation:
36853
+ ${cached}
36854
+ </continuity_context>`;
36855
+ }
36842
36856
  const continuityHits = await params.client.searchTextCollections({
36843
36857
  collections: [resolveUserCollection(params.userId)],
36844
36858
  text: "previous session context continuity",
@@ -37162,6 +37176,7 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
37162
37176
  client,
37163
37177
  userId,
37164
37178
  sessionId,
37179
+ sessionKey: args.sessionKey ?? sessionId,
37165
37180
  logger,
37166
37181
  tokenBudget: args.tokenBudget,
37167
37182
  systemPromptAddition: assembled.systemPromptAddition
@@ -37321,6 +37336,7 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
37321
37336
  isHeartbeat: args.isHeartbeat,
37322
37337
  cursor
37323
37338
  });
37339
+ updateContinuityCache(args.sessionKey ?? sessionId, ingestMessages);
37324
37340
  const daemonCursor = extractCursorFromResult(result);
37325
37341
  if (daemonCursor) {
37326
37342
  if (!daemonCursor.manifestTailHash) {
@@ -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.9.10-beta.11",
5
+ "version": "1.9.10-beta.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.9.10-beta.11",
3
+ "version": "1.9.10-beta.13",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",