@xdarkicex/openclaw-memory-libravdb 1.9.0 → 1.9.1
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.js +65 -10
- package/dist/index.js +62 -10
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
package/dist/context-engine.js
CHANGED
|
@@ -748,6 +748,10 @@ function resolveDynamicCompactThreshold(tokenBudget, compactThreshold, compactio
|
|
|
748
748
|
logger?.info?.(`[compact:trace] resolveDynamicCompactThreshold branch=explicit tokenBudget=${tokenBudget} compactThreshold=${compactThreshold} → ${val}`);
|
|
749
749
|
return val;
|
|
750
750
|
}
|
|
751
|
+
if (compactSessionTokenBudget === 0) {
|
|
752
|
+
logger?.info?.(`[compact:trace] resolveDynamicCompactThreshold branch=disabled tokenBudget=${tokenBudget}`);
|
|
753
|
+
return undefined;
|
|
754
|
+
}
|
|
751
755
|
const normalizedBudget = normalizeTokenBudget(tokenBudget);
|
|
752
756
|
if (normalizedBudget == null) {
|
|
753
757
|
logger?.info?.(`[compact:trace] resolveDynamicCompactThreshold branch=null_budget tokenBudget=${tokenBudget} → undefined`);
|
|
@@ -759,12 +763,6 @@ function resolveDynamicCompactThreshold(tokenBudget, compactThreshold, compactio
|
|
|
759
763
|
// enough turns to compact) or absurdly high (Codex Runtime 1M tokens
|
|
760
764
|
// would produce an unreachable 800k threshold).
|
|
761
765
|
const withBounds = Math.max(2000, Math.min(16000, derived));
|
|
762
|
-
// User-configured compactSessionTokenBudget overrides the ceiling.
|
|
763
|
-
if (typeof compactSessionTokenBudget === "number" && compactSessionTokenBudget > 0) {
|
|
764
|
-
const capped = Math.min(withBounds, compactSessionTokenBudget);
|
|
765
|
-
logger?.info?.(`[compact:trace] resolveDynamicCompactThreshold branch=user_cap tokenBudget=${tokenBudget} normalizedBudget=${normalizedBudget} fraction=${fraction} derived=${derived} withBounds=${withBounds} cap=${compactSessionTokenBudget} → ${capped}`);
|
|
766
|
-
return capped;
|
|
767
|
-
}
|
|
768
766
|
logger?.info?.(`[compact:trace] resolveDynamicCompactThreshold branch=clamped tokenBudget=${tokenBudget} normalizedBudget=${normalizedBudget} fraction=${fraction} derived=${derived} withBounds=${withBounds} → ${withBounds}`);
|
|
769
767
|
return withBounds;
|
|
770
768
|
}
|
|
@@ -774,6 +772,13 @@ function resolvePredictiveCompactionTarget(params) {
|
|
|
774
772
|
if (currentTokenCount == null || threshold == null || currentTokenCount < threshold) {
|
|
775
773
|
return undefined;
|
|
776
774
|
}
|
|
775
|
+
const sinceLastBudget = normalizeTokenBudget(params.compactSessionTokenBudget);
|
|
776
|
+
const lastCompactedTokenCount = normalizeCurrentTokenCount(params.lastCompactedTokenCount);
|
|
777
|
+
if (sinceLastBudget != null &&
|
|
778
|
+
lastCompactedTokenCount != null &&
|
|
779
|
+
currentTokenCount - lastCompactedTokenCount < sinceLastBudget) {
|
|
780
|
+
return undefined;
|
|
781
|
+
}
|
|
777
782
|
const belowThresholdTarget = Math.max(1, threshold - 1);
|
|
778
783
|
return belowThresholdTarget < currentTokenCount
|
|
779
784
|
? belowThresholdTarget
|
|
@@ -918,8 +923,30 @@ function buildBudgetFallbackContext(messages, tokenBudget) {
|
|
|
918
923
|
}
|
|
919
924
|
const DAEMON_AUTHORED_CONTEXT_RE = /<authored_context\b[^>]*>([\s\S]*?)<\/authored_context>/gi;
|
|
920
925
|
const DAEMON_AUTHORED_CONTEXT_GUIDANCE_RE = /^\s*Treat the authored entries below as active project rules and identity context\.?\s*$/i;
|
|
926
|
+
const COMPACTED_SESSION_CONTEXT_RE = /<compacted_session_context\b([^>]*)>([\s\S]*?)<\/compacted_session_context>/gi;
|
|
927
|
+
const COMPACTED_SESSION_RENDER_LEDGER_RE = /(?:^|\n)(?:Artifacts:|Constraints:|Open Next Steps:|Extracted context anchors:)(?:\n|$)/;
|
|
921
928
|
function sanitizeDaemonSystemPromptAddition(text) {
|
|
922
|
-
return demoteDaemonAuthoredContextBlocks(sanitizeToolCallPatterns(text));
|
|
929
|
+
return demoteDaemonAuthoredContextBlocks(sanitizeToolCallPatterns(canonicalizeCompactedSessionContextBlocks(text)));
|
|
930
|
+
}
|
|
931
|
+
function canonicalizeCompactedSessionContextBlocks(text) {
|
|
932
|
+
return text.replace(COMPACTED_SESSION_CONTEXT_RE, (match, attrs, inner) => {
|
|
933
|
+
const trimmed = String(inner).trim();
|
|
934
|
+
const firstLine = trimmed.split(/\r?\n/, 1)[0]?.trim();
|
|
935
|
+
if (!firstLine?.startsWith("{")) {
|
|
936
|
+
return match;
|
|
937
|
+
}
|
|
938
|
+
const rest = trimmed.slice(firstLine.length).trim();
|
|
939
|
+
if (!COMPACTED_SESSION_RENDER_LEDGER_RE.test(rest)) {
|
|
940
|
+
return match;
|
|
941
|
+
}
|
|
942
|
+
try {
|
|
943
|
+
JSON.parse(firstLine);
|
|
944
|
+
}
|
|
945
|
+
catch {
|
|
946
|
+
return match;
|
|
947
|
+
}
|
|
948
|
+
return `<compacted_session_context${attrs}>\n${firstLine}\n</compacted_session_context>`;
|
|
949
|
+
});
|
|
923
950
|
}
|
|
924
951
|
function demoteDaemonAuthoredContextBlocks(text) {
|
|
925
952
|
return text.replace(DAEMON_AUTHORED_CONTEXT_RE, (_match, inner) => {
|
|
@@ -1372,9 +1399,13 @@ function ensureReplaySafeUserTurn(assembled, sourceMessages, logger, tokenBudget
|
|
|
1372
1399
|
* Normalizes a compact result into the OpenClaw-compatible assemble result format.
|
|
1373
1400
|
*/
|
|
1374
1401
|
export function normalizeAssembleResult(result, sourceMessages) {
|
|
1375
|
-
|
|
1376
|
-
?
|
|
1402
|
+
const rawSystemPromptAddition = typeof result.systemPromptAddition === "string"
|
|
1403
|
+
? result.systemPromptAddition
|
|
1404
|
+
: "";
|
|
1405
|
+
let systemPromptAddition = rawSystemPromptAddition
|
|
1406
|
+
? sanitizeDaemonSystemPromptAddition(rawSystemPromptAddition)
|
|
1377
1407
|
: "";
|
|
1408
|
+
const systemPromptWasReduced = rawSystemPromptAddition.length > systemPromptAddition.length;
|
|
1378
1409
|
const messages = [];
|
|
1379
1410
|
const extractedMemoryItems = [];
|
|
1380
1411
|
const pushMemoryItem = (args) => {
|
|
@@ -1465,7 +1496,9 @@ export function normalizeAssembleResult(result, sourceMessages) {
|
|
|
1465
1496
|
}
|
|
1466
1497
|
return {
|
|
1467
1498
|
messages,
|
|
1468
|
-
estimatedTokens:
|
|
1499
|
+
estimatedTokens: systemPromptWasReduced
|
|
1500
|
+
? approximateTokenCount(systemPromptAddition) + approximateMessagesTokens(messages)
|
|
1501
|
+
: typeof result.estimatedTokens === "number" ? result.estimatedTokens : 0,
|
|
1469
1502
|
systemPromptAddition,
|
|
1470
1503
|
promptAuthority: PROMPT_AUTHORITY_PREASSEMBLY_MAY_OVERFLOW,
|
|
1471
1504
|
...(result.debug != null ? { debug: result.debug } : {}),
|
|
@@ -1563,6 +1596,8 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
1563
1596
|
}
|
|
1564
1597
|
const predictiveContextCache = new Map();
|
|
1565
1598
|
const PREDICTIVE_CACHE_MAX_SIZE = 100;
|
|
1599
|
+
const predictiveCompactionCursors = new Map();
|
|
1600
|
+
const PREDICTIVE_COMPACTION_CURSOR_MAX_SIZE = 100;
|
|
1566
1601
|
// BeforeTurnKernel state
|
|
1567
1602
|
const turnCache = new TurnMemoryCache(100);
|
|
1568
1603
|
const circuitBreakers = new Map();
|
|
@@ -1760,6 +1795,14 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
1760
1795
|
return scored.slice(0, maxItems).map((s) => s.prediction);
|
|
1761
1796
|
}
|
|
1762
1797
|
const getDynamicCompactThreshold = (tokenBudget) => resolveDynamicCompactThreshold(tokenBudget, cfg.compactThreshold, cfg.compactionThresholdFraction, cfg.compactSessionTokenBudget);
|
|
1798
|
+
const markPredictiveCompactionCursor = (sessionId, currentTokenCount) => {
|
|
1799
|
+
if (predictiveCompactionCursors.size >= PREDICTIVE_COMPACTION_CURSOR_MAX_SIZE) {
|
|
1800
|
+
const oldest = predictiveCompactionCursors.keys().next().value;
|
|
1801
|
+
if (oldest !== undefined)
|
|
1802
|
+
predictiveCompactionCursors.delete(oldest);
|
|
1803
|
+
}
|
|
1804
|
+
predictiveCompactionCursors.set(sessionId, currentTokenCount);
|
|
1805
|
+
};
|
|
1763
1806
|
const buildAssemblyConfig = (tokenBudget) => ({
|
|
1764
1807
|
useSessionRecallProjection: cfg.useSessionRecallProjection,
|
|
1765
1808
|
useSessionSummarySearchExperiment: cfg.useSessionSummarySearchExperiment,
|
|
@@ -1971,6 +2014,8 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
1971
2014
|
const predictiveTargetSize = resolvePredictiveCompactionTarget({
|
|
1972
2015
|
currentTokenCount: currentContextTokens,
|
|
1973
2016
|
threshold: dynamicCompactThreshold,
|
|
2017
|
+
compactSessionTokenBudget: cfg.compactSessionTokenBudget,
|
|
2018
|
+
lastCompactedTokenCount: predictiveCompactionCursors.get(args.sessionId),
|
|
1974
2019
|
});
|
|
1975
2020
|
if (currentContextTokens == null ||
|
|
1976
2021
|
dynamicCompactThreshold == null ||
|
|
@@ -1993,6 +2038,9 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
1993
2038
|
force: true,
|
|
1994
2039
|
currentTokenCount: currentContextTokens,
|
|
1995
2040
|
});
|
|
2041
|
+
if (compactionResult.compacted) {
|
|
2042
|
+
markPredictiveCompactionCursor(args.sessionId, currentContextTokens);
|
|
2043
|
+
}
|
|
1996
2044
|
logPredictiveCompactionOutcome({
|
|
1997
2045
|
logger,
|
|
1998
2046
|
phase: "afterTurn",
|
|
@@ -2011,6 +2059,7 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
2011
2059
|
async bootstrap(args) {
|
|
2012
2060
|
const sessionId = requireSessionId(args.sessionId, "bootstrap");
|
|
2013
2061
|
predictiveContextCache.delete(sessionId);
|
|
2062
|
+
predictiveCompactionCursors.delete(sessionId);
|
|
2014
2063
|
postToolRecallCache.delete(sessionId);
|
|
2015
2064
|
asyncIngestionQueues.delete(sessionId);
|
|
2016
2065
|
const userId = resolveUserId({
|
|
@@ -2078,6 +2127,8 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
2078
2127
|
const predictiveTargetSize = resolvePredictiveCompactionTarget({
|
|
2079
2128
|
currentTokenCount: currentContextTokens,
|
|
2080
2129
|
threshold: dynamicCompactThreshold,
|
|
2130
|
+
compactSessionTokenBudget: cfg.compactSessionTokenBudget,
|
|
2131
|
+
lastCompactedTokenCount: predictiveCompactionCursors.get(sessionId),
|
|
2081
2132
|
});
|
|
2082
2133
|
if (dynamicCompactThreshold != null && predictiveTargetSize != null) {
|
|
2083
2134
|
logPredictiveCompactionAttempt({
|
|
@@ -2096,6 +2147,9 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
2096
2147
|
force: true,
|
|
2097
2148
|
currentTokenCount: currentContextTokens,
|
|
2098
2149
|
});
|
|
2150
|
+
if (compactionResult.compacted) {
|
|
2151
|
+
markPredictiveCompactionCursor(sessionId, currentContextTokens);
|
|
2152
|
+
}
|
|
2099
2153
|
logPredictiveCompactionOutcome({
|
|
2100
2154
|
logger,
|
|
2101
2155
|
phase: "assemble",
|
|
@@ -2479,6 +2533,7 @@ export function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
2479
2533
|
}
|
|
2480
2534
|
}
|
|
2481
2535
|
predictiveContextCache.clear();
|
|
2536
|
+
predictiveCompactionCursors.clear();
|
|
2482
2537
|
postToolRecallCache.clear();
|
|
2483
2538
|
asyncIngestionQueues.clear();
|
|
2484
2539
|
triggerCache.clear();
|
package/dist/index.js
CHANGED
|
@@ -36117,6 +36117,10 @@ function resolveDynamicCompactThreshold(tokenBudget, compactThreshold, compactio
|
|
|
36117
36117
|
logger?.info?.(`[compact:trace] resolveDynamicCompactThreshold branch=explicit tokenBudget=${tokenBudget} compactThreshold=${compactThreshold} \u2192 ${val}`);
|
|
36118
36118
|
return val;
|
|
36119
36119
|
}
|
|
36120
|
+
if (compactSessionTokenBudget === 0) {
|
|
36121
|
+
logger?.info?.(`[compact:trace] resolveDynamicCompactThreshold branch=disabled tokenBudget=${tokenBudget}`);
|
|
36122
|
+
return void 0;
|
|
36123
|
+
}
|
|
36120
36124
|
const normalizedBudget = normalizeTokenBudget(tokenBudget);
|
|
36121
36125
|
if (normalizedBudget == null) {
|
|
36122
36126
|
logger?.info?.(`[compact:trace] resolveDynamicCompactThreshold branch=null_budget tokenBudget=${tokenBudget} \u2192 undefined`);
|
|
@@ -36125,11 +36129,6 @@ function resolveDynamicCompactThreshold(tokenBudget, compactThreshold, compactio
|
|
|
36125
36129
|
const fraction = normalizeThresholdFraction(compactionThresholdFraction);
|
|
36126
36130
|
const derived = Math.max(1, Math.floor(normalizedBudget * fraction));
|
|
36127
36131
|
const withBounds = Math.max(2e3, Math.min(16e3, derived));
|
|
36128
|
-
if (typeof compactSessionTokenBudget === "number" && compactSessionTokenBudget > 0) {
|
|
36129
|
-
const capped = Math.min(withBounds, compactSessionTokenBudget);
|
|
36130
|
-
logger?.info?.(`[compact:trace] resolveDynamicCompactThreshold branch=user_cap tokenBudget=${tokenBudget} normalizedBudget=${normalizedBudget} fraction=${fraction} derived=${derived} withBounds=${withBounds} cap=${compactSessionTokenBudget} \u2192 ${capped}`);
|
|
36131
|
-
return capped;
|
|
36132
|
-
}
|
|
36133
36132
|
logger?.info?.(`[compact:trace] resolveDynamicCompactThreshold branch=clamped tokenBudget=${tokenBudget} normalizedBudget=${normalizedBudget} fraction=${fraction} derived=${derived} withBounds=${withBounds} \u2192 ${withBounds}`);
|
|
36134
36133
|
return withBounds;
|
|
36135
36134
|
}
|
|
@@ -36139,6 +36138,11 @@ function resolvePredictiveCompactionTarget(params) {
|
|
|
36139
36138
|
if (currentTokenCount == null || threshold == null || currentTokenCount < threshold) {
|
|
36140
36139
|
return void 0;
|
|
36141
36140
|
}
|
|
36141
|
+
const sinceLastBudget = normalizeTokenBudget(params.compactSessionTokenBudget);
|
|
36142
|
+
const lastCompactedTokenCount = normalizeCurrentTokenCount(params.lastCompactedTokenCount);
|
|
36143
|
+
if (sinceLastBudget != null && lastCompactedTokenCount != null && currentTokenCount - lastCompactedTokenCount < sinceLastBudget) {
|
|
36144
|
+
return void 0;
|
|
36145
|
+
}
|
|
36142
36146
|
const belowThresholdTarget = Math.max(1, threshold - 1);
|
|
36143
36147
|
return belowThresholdTarget < currentTokenCount ? belowThresholdTarget : Math.max(1, currentTokenCount - 1);
|
|
36144
36148
|
}
|
|
@@ -36253,8 +36257,33 @@ function buildBudgetFallbackContext(messages, tokenBudget) {
|
|
|
36253
36257
|
}
|
|
36254
36258
|
var DAEMON_AUTHORED_CONTEXT_RE = /<authored_context\b[^>]*>([\s\S]*?)<\/authored_context>/gi;
|
|
36255
36259
|
var DAEMON_AUTHORED_CONTEXT_GUIDANCE_RE = /^\s*Treat the authored entries below as active project rules and identity context\.?\s*$/i;
|
|
36260
|
+
var COMPACTED_SESSION_CONTEXT_RE = /<compacted_session_context\b([^>]*)>([\s\S]*?)<\/compacted_session_context>/gi;
|
|
36261
|
+
var COMPACTED_SESSION_RENDER_LEDGER_RE = /(?:^|\n)(?:Artifacts:|Constraints:|Open Next Steps:|Extracted context anchors:)(?:\n|$)/;
|
|
36256
36262
|
function sanitizeDaemonSystemPromptAddition(text) {
|
|
36257
|
-
return demoteDaemonAuthoredContextBlocks(
|
|
36263
|
+
return demoteDaemonAuthoredContextBlocks(
|
|
36264
|
+
sanitizeToolCallPatterns(canonicalizeCompactedSessionContextBlocks(text))
|
|
36265
|
+
);
|
|
36266
|
+
}
|
|
36267
|
+
function canonicalizeCompactedSessionContextBlocks(text) {
|
|
36268
|
+
return text.replace(COMPACTED_SESSION_CONTEXT_RE, (match, attrs, inner) => {
|
|
36269
|
+
const trimmed = String(inner).trim();
|
|
36270
|
+
const firstLine = trimmed.split(/\r?\n/, 1)[0]?.trim();
|
|
36271
|
+
if (!firstLine?.startsWith("{")) {
|
|
36272
|
+
return match;
|
|
36273
|
+
}
|
|
36274
|
+
const rest = trimmed.slice(firstLine.length).trim();
|
|
36275
|
+
if (!COMPACTED_SESSION_RENDER_LEDGER_RE.test(rest)) {
|
|
36276
|
+
return match;
|
|
36277
|
+
}
|
|
36278
|
+
try {
|
|
36279
|
+
JSON.parse(firstLine);
|
|
36280
|
+
} catch {
|
|
36281
|
+
return match;
|
|
36282
|
+
}
|
|
36283
|
+
return `<compacted_session_context${attrs}>
|
|
36284
|
+
${firstLine}
|
|
36285
|
+
</compacted_session_context>`;
|
|
36286
|
+
});
|
|
36258
36287
|
}
|
|
36259
36288
|
function demoteDaemonAuthoredContextBlocks(text) {
|
|
36260
36289
|
return text.replace(DAEMON_AUTHORED_CONTEXT_RE, (_match, inner) => {
|
|
@@ -36622,7 +36651,9 @@ function ensureReplaySafeUserTurn(assembled, sourceMessages, logger, tokenBudget
|
|
|
36622
36651
|
};
|
|
36623
36652
|
}
|
|
36624
36653
|
function normalizeAssembleResult(result, sourceMessages) {
|
|
36625
|
-
|
|
36654
|
+
const rawSystemPromptAddition = typeof result.systemPromptAddition === "string" ? result.systemPromptAddition : "";
|
|
36655
|
+
let systemPromptAddition = rawSystemPromptAddition ? sanitizeDaemonSystemPromptAddition(rawSystemPromptAddition) : "";
|
|
36656
|
+
const systemPromptWasReduced = rawSystemPromptAddition.length > systemPromptAddition.length;
|
|
36626
36657
|
const messages = [];
|
|
36627
36658
|
const extractedMemoryItems = [];
|
|
36628
36659
|
const pushMemoryItem = (args) => {
|
|
@@ -36712,7 +36743,7 @@ ${extractedMemoryItems.join("\n")}
|
|
|
36712
36743
|
}
|
|
36713
36744
|
return {
|
|
36714
36745
|
messages,
|
|
36715
|
-
estimatedTokens: typeof result.estimatedTokens === "number" ? result.estimatedTokens : 0,
|
|
36746
|
+
estimatedTokens: systemPromptWasReduced ? approximateTokenCount(systemPromptAddition) + approximateMessagesTokens(messages) : typeof result.estimatedTokens === "number" ? result.estimatedTokens : 0,
|
|
36716
36747
|
systemPromptAddition,
|
|
36717
36748
|
promptAuthority: PROMPT_AUTHORITY_PREASSEMBLY_MAY_OVERFLOW,
|
|
36718
36749
|
...result.debug != null ? { debug: result.debug } : {}
|
|
@@ -36786,6 +36817,8 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
36786
36817
|
}
|
|
36787
36818
|
const predictiveContextCache = /* @__PURE__ */ new Map();
|
|
36788
36819
|
const PREDICTIVE_CACHE_MAX_SIZE = 100;
|
|
36820
|
+
const predictiveCompactionCursors = /* @__PURE__ */ new Map();
|
|
36821
|
+
const PREDICTIVE_COMPACTION_CURSOR_MAX_SIZE = 100;
|
|
36789
36822
|
const turnCache = new TurnMemoryCache(100);
|
|
36790
36823
|
const circuitBreakers = /* @__PURE__ */ new Map();
|
|
36791
36824
|
const CIRCUIT_STATE_MAX_SIZE = 200;
|
|
@@ -36978,6 +37011,13 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
36978
37011
|
cfg.compactionThresholdFraction,
|
|
36979
37012
|
cfg.compactSessionTokenBudget
|
|
36980
37013
|
);
|
|
37014
|
+
const markPredictiveCompactionCursor = (sessionId, currentTokenCount) => {
|
|
37015
|
+
if (predictiveCompactionCursors.size >= PREDICTIVE_COMPACTION_CURSOR_MAX_SIZE) {
|
|
37016
|
+
const oldest = predictiveCompactionCursors.keys().next().value;
|
|
37017
|
+
if (oldest !== void 0) predictiveCompactionCursors.delete(oldest);
|
|
37018
|
+
}
|
|
37019
|
+
predictiveCompactionCursors.set(sessionId, currentTokenCount);
|
|
37020
|
+
};
|
|
36981
37021
|
const buildAssemblyConfig = (tokenBudget) => ({
|
|
36982
37022
|
useSessionRecallProjection: cfg.useSessionRecallProjection,
|
|
36983
37023
|
useSessionSummarySearchExperiment: cfg.useSessionSummarySearchExperiment,
|
|
@@ -37169,7 +37209,9 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
37169
37209
|
});
|
|
37170
37210
|
const predictiveTargetSize = resolvePredictiveCompactionTarget({
|
|
37171
37211
|
currentTokenCount: currentContextTokens,
|
|
37172
|
-
threshold: dynamicCompactThreshold
|
|
37212
|
+
threshold: dynamicCompactThreshold,
|
|
37213
|
+
compactSessionTokenBudget: cfg.compactSessionTokenBudget,
|
|
37214
|
+
lastCompactedTokenCount: predictiveCompactionCursors.get(args.sessionId)
|
|
37173
37215
|
});
|
|
37174
37216
|
if (currentContextTokens == null || dynamicCompactThreshold == null || predictiveTargetSize == null) {
|
|
37175
37217
|
return;
|
|
@@ -37190,6 +37232,9 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
37190
37232
|
force: true,
|
|
37191
37233
|
currentTokenCount: currentContextTokens
|
|
37192
37234
|
});
|
|
37235
|
+
if (compactionResult.compacted) {
|
|
37236
|
+
markPredictiveCompactionCursor(args.sessionId, currentContextTokens);
|
|
37237
|
+
}
|
|
37193
37238
|
logPredictiveCompactionOutcome({
|
|
37194
37239
|
logger,
|
|
37195
37240
|
phase: "afterTurn",
|
|
@@ -37208,6 +37253,7 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
37208
37253
|
async bootstrap(args) {
|
|
37209
37254
|
const sessionId = requireSessionId(args.sessionId, "bootstrap");
|
|
37210
37255
|
predictiveContextCache.delete(sessionId);
|
|
37256
|
+
predictiveCompactionCursors.delete(sessionId);
|
|
37211
37257
|
postToolRecallCache.delete(sessionId);
|
|
37212
37258
|
asyncIngestionQueues.delete(sessionId);
|
|
37213
37259
|
const userId = resolveUserId({
|
|
@@ -37270,7 +37316,9 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
37270
37316
|
const dynamicCompactThreshold = getDynamicCompactThreshold(args.tokenBudget);
|
|
37271
37317
|
const predictiveTargetSize = resolvePredictiveCompactionTarget({
|
|
37272
37318
|
currentTokenCount: currentContextTokens,
|
|
37273
|
-
threshold: dynamicCompactThreshold
|
|
37319
|
+
threshold: dynamicCompactThreshold,
|
|
37320
|
+
compactSessionTokenBudget: cfg.compactSessionTokenBudget,
|
|
37321
|
+
lastCompactedTokenCount: predictiveCompactionCursors.get(sessionId)
|
|
37274
37322
|
});
|
|
37275
37323
|
if (dynamicCompactThreshold != null && predictiveTargetSize != null) {
|
|
37276
37324
|
logPredictiveCompactionAttempt({
|
|
@@ -37289,6 +37337,9 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
37289
37337
|
force: true,
|
|
37290
37338
|
currentTokenCount: currentContextTokens
|
|
37291
37339
|
});
|
|
37340
|
+
if (compactionResult.compacted) {
|
|
37341
|
+
markPredictiveCompactionCursor(sessionId, currentContextTokens);
|
|
37342
|
+
}
|
|
37292
37343
|
logPredictiveCompactionOutcome({
|
|
37293
37344
|
logger,
|
|
37294
37345
|
phase: "assemble",
|
|
@@ -37669,6 +37720,7 @@ function buildContextEngineFactory(runtime, cfg, logger = console) {
|
|
|
37669
37720
|
}
|
|
37670
37721
|
}
|
|
37671
37722
|
predictiveContextCache.clear();
|
|
37723
|
+
predictiveCompactionCursors.clear();
|
|
37672
37724
|
postToolRecallCache.clear();
|
|
37673
37725
|
asyncIngestionQueues.clear();
|
|
37674
37726
|
triggerCache.clear();
|
package/openclaw.plugin.json
CHANGED