@openviking/openclaw-plugin 2026.9.10-1 → 2026.9.10
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/auto-recall.ts +1 -2
- package/client.ts +0 -1
- package/context-engine.ts +0 -1
- package/dist/auto-recall.js +1 -1
- package/dist/client.js +0 -1
- package/dist/context-engine.js +0 -1
- package/dist/services/context-lifecycle-service.js +31 -68
- package/package.json +1 -1
- package/services/context-lifecycle-service.ts +52 -94
package/auto-recall.ts
CHANGED
|
@@ -331,7 +331,6 @@ export async function buildAutoRecallContext(params: {
|
|
|
331
331
|
rawUserTextPreview?: string;
|
|
332
332
|
queryTruncated?: boolean;
|
|
333
333
|
resourceTypes?: RecallResourceType[];
|
|
334
|
-
dedupTurns?: number;
|
|
335
334
|
}): Promise<{ block?: string; memoryCount: number; estimatedTokens: number }> {
|
|
336
335
|
const { cfg, client, agentId, actorPeerId, queryText, logger, verbose } = params;
|
|
337
336
|
const queryConfig = params.queryConfig;
|
|
@@ -374,7 +373,7 @@ export async function buildAutoRecallContext(params: {
|
|
|
374
373
|
queryExpansion: "auto",
|
|
375
374
|
maxTokens,
|
|
376
375
|
detail: recallPreferAbstract ? "abstract" : undefined,
|
|
377
|
-
dedupTurns: params.
|
|
376
|
+
dedupTurns: params.ovSessionId ? AUTO_RECALL_DEDUP_TURNS : undefined,
|
|
378
377
|
peerScope: "actor",
|
|
379
378
|
actorPeerId,
|
|
380
379
|
requestTimeoutMs: cfg.autoRecallTimeoutMs,
|
package/client.ts
CHANGED
|
@@ -508,7 +508,6 @@ export class OpenVikingClient {
|
|
|
508
508
|
};
|
|
509
509
|
const body = {
|
|
510
510
|
...buildContextSearchBody(contractConfig, { sessionId: options.sessionId }),
|
|
511
|
-
...(options.dedupTurns === 0 ? { dedup_turns: 0 } : {}),
|
|
512
511
|
query,
|
|
513
512
|
...(options.contextType !== undefined ? { context_type: options.contextType } : {}),
|
|
514
513
|
...(options.detail !== undefined ? { detail: options.detail } : {}),
|
package/context-engine.ts
CHANGED
|
@@ -394,7 +394,6 @@ export function createMemoryOpenVikingContextEngine(params: {
|
|
|
394
394
|
sessionId: assembleParams.sessionId,
|
|
395
395
|
sessionKey: resolveSessionKey(assembleParams),
|
|
396
396
|
messages: assembleParams.messages,
|
|
397
|
-
prompt: assembleParams.prompt,
|
|
398
397
|
tokenBudget,
|
|
399
398
|
runtimeContext: assembleParams.runtimeContext,
|
|
400
399
|
isMainAssemble,
|
package/dist/auto-recall.js
CHANGED
|
@@ -244,7 +244,7 @@ export async function buildAutoRecallContext(params) {
|
|
|
244
244
|
queryExpansion: "auto",
|
|
245
245
|
maxTokens,
|
|
246
246
|
detail: recallPreferAbstract ? "abstract" : undefined,
|
|
247
|
-
dedupTurns: params.
|
|
247
|
+
dedupTurns: params.ovSessionId ? AUTO_RECALL_DEDUP_TURNS : undefined,
|
|
248
248
|
peerScope: "actor",
|
|
249
249
|
actorPeerId,
|
|
250
250
|
requestTimeoutMs: cfg.autoRecallTimeoutMs,
|
package/dist/client.js
CHANGED
|
@@ -205,7 +205,6 @@ export class OpenVikingClient {
|
|
|
205
205
|
};
|
|
206
206
|
const body = {
|
|
207
207
|
...buildContextSearchBody(contractConfig, { sessionId: options.sessionId }),
|
|
208
|
-
...(options.dedupTurns === 0 ? { dedup_turns: 0 } : {}),
|
|
209
208
|
query,
|
|
210
209
|
...(options.contextType !== undefined ? { context_type: options.contextType } : {}),
|
|
211
210
|
...(options.detail !== undefined ? { detail: options.detail } : {}),
|
package/dist/context-engine.js
CHANGED
|
@@ -214,7 +214,6 @@ export function createMemoryOpenVikingContextEngine(params) {
|
|
|
214
214
|
sessionId: assembleParams.sessionId,
|
|
215
215
|
sessionKey: resolveSessionKey(assembleParams),
|
|
216
216
|
messages: assembleParams.messages,
|
|
217
|
-
prompt: assembleParams.prompt,
|
|
218
217
|
tokenBudget,
|
|
219
218
|
runtimeContext: assembleParams.runtimeContext,
|
|
220
219
|
isMainAssemble,
|
|
@@ -195,73 +195,7 @@ function isSessionNotFoundError(err) {
|
|
|
195
195
|
const errorMessage = String(err);
|
|
196
196
|
return errorMessage.includes("[NOT_FOUND]") && errorMessage.includes("Session not found");
|
|
197
197
|
}
|
|
198
|
-
async function
|
|
199
|
-
const { sessionId, sessionKey, cfg, getClient, resolveAgentId, queryConfigStore, logger, traceRecorder } = params;
|
|
200
|
-
const ovSessionId = openClawSessionToOvStorageId(sessionId, sessionKey);
|
|
201
|
-
const sender = extractRuntimeSenderId(params.runtimeContext);
|
|
202
|
-
const client = await getClient();
|
|
203
|
-
const routingRef = sessionId ?? sessionKey ?? ovSessionId;
|
|
204
|
-
const agentId = resolveAgentId(routingRef, sessionKey, ovSessionId);
|
|
205
|
-
const actorPeerId = resolveOpenVikingActorPeerId({
|
|
206
|
-
peerRole: cfg.peer_role ?? "none",
|
|
207
|
-
senderPeerId: sanitizeOpenVikingPeerId(sender.senderId),
|
|
208
|
-
assistantPeerId: agentId,
|
|
209
|
-
});
|
|
210
|
-
const queryConfig = await queryConfigStore?.getEffective({
|
|
211
|
-
agentId,
|
|
212
|
-
sessionId,
|
|
213
|
-
sessionKey,
|
|
214
|
-
ovSessionId,
|
|
215
|
-
});
|
|
216
|
-
return buildAutoRecallContext({
|
|
217
|
-
cfg,
|
|
218
|
-
queryConfig,
|
|
219
|
-
client,
|
|
220
|
-
agentId,
|
|
221
|
-
actorPeerId,
|
|
222
|
-
queryText: recallQuery.query,
|
|
223
|
-
logger,
|
|
224
|
-
verbose: (message) => logger.info(message),
|
|
225
|
-
traceRecorder: traceRecorder,
|
|
226
|
-
sessionId,
|
|
227
|
-
sessionKey,
|
|
228
|
-
ovSessionId,
|
|
229
|
-
queryTruncated: recallQuery.truncated,
|
|
230
|
-
rawUserTextPreview: recallQuery.query,
|
|
231
|
-
// System additions are transient; the next turn must be able to recall the same URI.
|
|
232
|
-
dedupTurns: params.isMainAssemble ? 0 : undefined,
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
export async function assembleOpenVikingSession(params) {
|
|
236
|
-
const assembled = await assembleSessionContext(params);
|
|
237
|
-
// Current OpenClaw supplies the pending turn separately from history. Keep
|
|
238
|
-
// recalled context out of persisted messages and let the host own that turn.
|
|
239
|
-
if (!params.isMainAssemble || !params.cfg.autoRecall || !params.prompt ||
|
|
240
|
-
params.isBypassedSession(params)) {
|
|
241
|
-
return assembled;
|
|
242
|
-
}
|
|
243
|
-
const query = prepareRecallQuery(params.prompt);
|
|
244
|
-
if (query.query.length < 5)
|
|
245
|
-
return assembled;
|
|
246
|
-
try {
|
|
247
|
-
const recall = await recallForAssemble(params, query);
|
|
248
|
-
if (!recall.block)
|
|
249
|
-
return assembled;
|
|
250
|
-
const systemPromptAddition = [assembled.systemPromptAddition, recall.block].filter(Boolean).join("\n\n");
|
|
251
|
-
const estimatedTokens = assembled.estimatedTokens
|
|
252
|
-
+ estimateTextTokens(systemPromptAddition)
|
|
253
|
-
- estimateTextTokens(assembled.systemPromptAddition ?? "");
|
|
254
|
-
if (estimatedTokens > params.tokenBudget)
|
|
255
|
-
return assembled;
|
|
256
|
-
return { ...assembled, systemPromptAddition, estimatedTokens };
|
|
257
|
-
}
|
|
258
|
-
catch (err) {
|
|
259
|
-
params.logger.warn?.(`openviking: auto-recall failed: ${String(err)}`);
|
|
260
|
-
return assembled;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
async function assembleSessionContext(params) {
|
|
264
|
-
const { sessionId, sessionKey, messages, tokenBudget, runtimeContext, isMainAssemble, cfg, getClient, logger, resolveAgentId, rememberSessionAgentId, isBypassedSession, diag, roughEstimate, messageDigest, extractAgentMessageText, hasAutoRecallBlock, prependRecallToLatestUserMessage, } = params;
|
|
198
|
+
export async function assembleOpenVikingSession({ sessionId, sessionKey, messages, tokenBudget, runtimeContext, isMainAssemble, cfg, getClient, logger, resolveAgentId, rememberSessionAgentId, isBypassedSession, queryConfigStore, traceRecorder, diag, roughEstimate, messageDigest, extractAgentMessageText, hasAutoRecallBlock, prependRecallToLatestUserMessage, }) {
|
|
265
199
|
const latestMessage = messages.at(-1);
|
|
266
200
|
const isTransformContextAssemble = !isMainAssemble;
|
|
267
201
|
// Tool-loop calls do no recall work on non-user tails; avoid scanning the full history.
|
|
@@ -305,7 +239,36 @@ async function assembleSessionContext(params) {
|
|
|
305
239
|
`chars=${recallQuery.originalChars}->${recallQuery.finalChars})`);
|
|
306
240
|
}
|
|
307
241
|
try {
|
|
308
|
-
const
|
|
242
|
+
const client = await getClient();
|
|
243
|
+
const routingRef = sessionId ?? sessionKey ?? ovSessionId;
|
|
244
|
+
const agentId = resolveAgentId(routingRef, sessionKey, ovSessionId);
|
|
245
|
+
const actorPeerId = resolveOpenVikingActorPeerId({
|
|
246
|
+
peerRole: cfg.peer_role ?? "none",
|
|
247
|
+
senderPeerId: sanitizeOpenVikingPeerId(sender.senderId),
|
|
248
|
+
assistantPeerId: agentId,
|
|
249
|
+
});
|
|
250
|
+
const queryConfig = await queryConfigStore?.getEffective({
|
|
251
|
+
agentId,
|
|
252
|
+
sessionId,
|
|
253
|
+
sessionKey,
|
|
254
|
+
ovSessionId,
|
|
255
|
+
});
|
|
256
|
+
const recall = await buildAutoRecallContext({
|
|
257
|
+
cfg,
|
|
258
|
+
queryConfig,
|
|
259
|
+
client,
|
|
260
|
+
agentId,
|
|
261
|
+
actorPeerId,
|
|
262
|
+
queryText: recallQuery.query,
|
|
263
|
+
logger,
|
|
264
|
+
verbose: (message) => logger.info(message),
|
|
265
|
+
traceRecorder: traceRecorder,
|
|
266
|
+
sessionId,
|
|
267
|
+
sessionKey,
|
|
268
|
+
ovSessionId,
|
|
269
|
+
queryTruncated: recallQuery.truncated,
|
|
270
|
+
rawUserTextPreview: recallQuery.query,
|
|
271
|
+
});
|
|
309
272
|
if (!recall.block) {
|
|
310
273
|
return assemblePassthrough({
|
|
311
274
|
diag,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openviking/openclaw-plugin",
|
|
3
|
-
"version": "2026.9.10
|
|
3
|
+
"version": "2026.9.10",
|
|
4
4
|
"displayName": "OpenViking",
|
|
5
5
|
"description": "OpenClaw context-engine plugin — OpenViking AI memory, long-term memory, knowledge base, semantic search, RAG, context engine. 长期记忆 · 知识库 · 语义检索 · 上下文引擎",
|
|
6
6
|
"type": "module",
|
|
@@ -72,7 +72,6 @@ export type AssembleOpenVikingSessionParams = {
|
|
|
72
72
|
sessionId: string;
|
|
73
73
|
sessionKey?: string;
|
|
74
74
|
messages: AgentMessage[];
|
|
75
|
-
prompt?: string;
|
|
76
75
|
tokenBudget: number;
|
|
77
76
|
runtimeContext?: Record<string, unknown>;
|
|
78
77
|
isMainAssemble: boolean;
|
|
@@ -424,98 +423,28 @@ function isSessionNotFoundError(err: unknown): boolean {
|
|
|
424
423
|
return errorMessage.includes("[NOT_FOUND]") && errorMessage.includes("Session not found");
|
|
425
424
|
}
|
|
426
425
|
|
|
427
|
-
async function
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
cfg,
|
|
450
|
-
queryConfig,
|
|
451
|
-
client,
|
|
452
|
-
agentId,
|
|
453
|
-
actorPeerId,
|
|
454
|
-
queryText: recallQuery.query,
|
|
455
|
-
logger,
|
|
456
|
-
verbose: (message) => logger.info(message),
|
|
457
|
-
traceRecorder: traceRecorder as never,
|
|
458
|
-
sessionId,
|
|
459
|
-
sessionKey,
|
|
460
|
-
ovSessionId,
|
|
461
|
-
queryTruncated: recallQuery.truncated,
|
|
462
|
-
rawUserTextPreview: recallQuery.query,
|
|
463
|
-
// System additions are transient; the next turn must be able to recall the same URI.
|
|
464
|
-
dedupTurns: params.isMainAssemble ? 0 : undefined,
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
export async function assembleOpenVikingSession(
|
|
469
|
-
params: AssembleOpenVikingSessionParams,
|
|
470
|
-
): Promise<AssembleOpenVikingSessionResult> {
|
|
471
|
-
const assembled = await assembleSessionContext(params);
|
|
472
|
-
// Current OpenClaw supplies the pending turn separately from history. Keep
|
|
473
|
-
// recalled context out of persisted messages and let the host own that turn.
|
|
474
|
-
if (
|
|
475
|
-
!params.isMainAssemble || !params.cfg.autoRecall || !params.prompt ||
|
|
476
|
-
params.isBypassedSession(params)
|
|
477
|
-
) {
|
|
478
|
-
return assembled;
|
|
479
|
-
}
|
|
480
|
-
const query = prepareRecallQuery(params.prompt);
|
|
481
|
-
if (query.query.length < 5) return assembled;
|
|
482
|
-
|
|
483
|
-
try {
|
|
484
|
-
const recall = await recallForAssemble(params, query);
|
|
485
|
-
if (!recall.block) return assembled;
|
|
486
|
-
const systemPromptAddition = [assembled.systemPromptAddition, recall.block].filter(Boolean).join("\n\n");
|
|
487
|
-
const estimatedTokens = assembled.estimatedTokens
|
|
488
|
-
+ estimateTextTokens(systemPromptAddition)
|
|
489
|
-
- estimateTextTokens(assembled.systemPromptAddition ?? "");
|
|
490
|
-
if (estimatedTokens > params.tokenBudget) return assembled;
|
|
491
|
-
return { ...assembled, systemPromptAddition, estimatedTokens };
|
|
492
|
-
} catch (err) {
|
|
493
|
-
params.logger.warn?.(`openviking: auto-recall failed: ${String(err)}`);
|
|
494
|
-
return assembled;
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
async function assembleSessionContext(params: AssembleOpenVikingSessionParams): Promise<AssembleOpenVikingSessionResult> {
|
|
499
|
-
const {
|
|
500
|
-
sessionId,
|
|
501
|
-
sessionKey,
|
|
502
|
-
messages,
|
|
503
|
-
tokenBudget,
|
|
504
|
-
runtimeContext,
|
|
505
|
-
isMainAssemble,
|
|
506
|
-
cfg,
|
|
507
|
-
getClient,
|
|
508
|
-
logger,
|
|
509
|
-
resolveAgentId,
|
|
510
|
-
rememberSessionAgentId,
|
|
511
|
-
isBypassedSession,
|
|
512
|
-
diag,
|
|
513
|
-
roughEstimate,
|
|
514
|
-
messageDigest,
|
|
515
|
-
extractAgentMessageText,
|
|
516
|
-
hasAutoRecallBlock,
|
|
517
|
-
prependRecallToLatestUserMessage,
|
|
518
|
-
} = params;
|
|
426
|
+
export async function assembleOpenVikingSession({
|
|
427
|
+
sessionId,
|
|
428
|
+
sessionKey,
|
|
429
|
+
messages,
|
|
430
|
+
tokenBudget,
|
|
431
|
+
runtimeContext,
|
|
432
|
+
isMainAssemble,
|
|
433
|
+
cfg,
|
|
434
|
+
getClient,
|
|
435
|
+
logger,
|
|
436
|
+
resolveAgentId,
|
|
437
|
+
rememberSessionAgentId,
|
|
438
|
+
isBypassedSession,
|
|
439
|
+
queryConfigStore,
|
|
440
|
+
traceRecorder,
|
|
441
|
+
diag,
|
|
442
|
+
roughEstimate,
|
|
443
|
+
messageDigest,
|
|
444
|
+
extractAgentMessageText,
|
|
445
|
+
hasAutoRecallBlock,
|
|
446
|
+
prependRecallToLatestUserMessage,
|
|
447
|
+
}: AssembleOpenVikingSessionParams): Promise<AssembleOpenVikingSessionResult> {
|
|
519
448
|
const latestMessage = messages.at(-1);
|
|
520
449
|
const isTransformContextAssemble = !isMainAssemble;
|
|
521
450
|
|
|
@@ -568,7 +497,36 @@ async function assembleSessionContext(params: AssembleOpenVikingSessionParams):
|
|
|
568
497
|
}
|
|
569
498
|
|
|
570
499
|
try {
|
|
571
|
-
const
|
|
500
|
+
const client = await getClient();
|
|
501
|
+
const routingRef = sessionId ?? sessionKey ?? ovSessionId;
|
|
502
|
+
const agentId = resolveAgentId(routingRef, sessionKey, ovSessionId);
|
|
503
|
+
const actorPeerId = resolveOpenVikingActorPeerId({
|
|
504
|
+
peerRole: cfg.peer_role ?? "none",
|
|
505
|
+
senderPeerId: sanitizeOpenVikingPeerId(sender.senderId),
|
|
506
|
+
assistantPeerId: agentId,
|
|
507
|
+
});
|
|
508
|
+
const queryConfig = await queryConfigStore?.getEffective({
|
|
509
|
+
agentId,
|
|
510
|
+
sessionId,
|
|
511
|
+
sessionKey,
|
|
512
|
+
ovSessionId,
|
|
513
|
+
});
|
|
514
|
+
const recall = await buildAutoRecallContext({
|
|
515
|
+
cfg,
|
|
516
|
+
queryConfig,
|
|
517
|
+
client,
|
|
518
|
+
agentId,
|
|
519
|
+
actorPeerId,
|
|
520
|
+
queryText: recallQuery.query,
|
|
521
|
+
logger,
|
|
522
|
+
verbose: (message) => logger.info(message),
|
|
523
|
+
traceRecorder: traceRecorder as never,
|
|
524
|
+
sessionId,
|
|
525
|
+
sessionKey,
|
|
526
|
+
ovSessionId,
|
|
527
|
+
queryTruncated: recallQuery.truncated,
|
|
528
|
+
rawUserTextPreview: recallQuery.query,
|
|
529
|
+
});
|
|
572
530
|
|
|
573
531
|
if (!recall.block) {
|
|
574
532
|
return assemblePassthrough({
|