@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 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.dedupTurns ?? (params.ovSessionId ? AUTO_RECALL_DEDUP_TURNS : undefined),
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,
@@ -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.dedupTurns ?? (params.ovSessionId ? AUTO_RECALL_DEDUP_TURNS : undefined),
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 } : {}),
@@ -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 recallForAssemble(params, recallQuery) {
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 recall = await recallForAssemble(params, recallQuery);
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-1",
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 recallForAssemble(
428
- params: AssembleOpenVikingSessionParams,
429
- recallQuery: ReturnType<typeof prepareRecallQuery>,
430
- ) {
431
- const { sessionId, sessionKey, cfg, getClient, resolveAgentId, queryConfigStore, logger, traceRecorder } = params;
432
- const ovSessionId = openClawSessionToOvStorageId(sessionId, sessionKey);
433
- const sender = extractRuntimeSenderId(params.runtimeContext);
434
- const client = await getClient();
435
- const routingRef = sessionId ?? sessionKey ?? ovSessionId;
436
- const agentId = resolveAgentId(routingRef, sessionKey, ovSessionId);
437
- const actorPeerId = resolveOpenVikingActorPeerId({
438
- peerRole: cfg.peer_role ?? "none",
439
- senderPeerId: sanitizeOpenVikingPeerId(sender.senderId),
440
- assistantPeerId: agentId,
441
- });
442
- const queryConfig = await queryConfigStore?.getEffective({
443
- agentId,
444
- sessionId,
445
- sessionKey,
446
- ovSessionId,
447
- });
448
- return buildAutoRecallContext({
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 recall = await recallForAssemble(params, recallQuery);
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({