@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.
- package/dist/context-engine.d.ts +4 -11
- package/dist/context-engine.js +33 -11
- package/dist/index.js +30 -10
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
package/dist/context-engine.d.ts
CHANGED
|
@@ -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:
|
|
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:
|
|
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;
|
package/dist/context-engine.js
CHANGED
|
@@ -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 (
|
|
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
|
-
|
|
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
|
-
|
|
166
|
-
|
|
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
|
|
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
|
|
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}
|
|
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 (
|
|
33668
|
-
|
|
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
|
-
|
|
33735
|
-
|
|
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
|
|
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");
|
package/openclaw.plugin.json
CHANGED