@openviking/openclaw-plugin 2026.9.24-1 → 2026.9.24

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/INSTALL-AGENT.md CHANGED
@@ -42,7 +42,7 @@ Before setup, determine:
42
42
  | --- | --- | --- |
43
43
  | OpenViking base URL | Yes | Ask user or read `OPENVIKING_BASE_URL` |
44
44
  | API key | Usually | Ask user or read `OPENVIKING_API_KEY` |
45
- | Memory scope | Optional; default `none` | Ask whether memory is shared, separated by assistant, or separated by sender. Use `sender`. |
45
+ | Memory scope | Optional; default `none` | Ask whether memory is shared, separated by assistant, or separated by sender. Use `sender`; accept legacy `person` as an alias. |
46
46
  | Account ID | Only for root API keys | Ask user if setup reports root-key tenant context is needed |
47
47
  | User ID | Only for root API keys | Ask user if setup reports root-key tenant context is needed |
48
48
  | Slot replacement approval | Only if another context engine owns the slot | Ask user before using `--force-slot` |
@@ -82,7 +82,7 @@ Choose memory scope before building that command:
82
82
  | `assistant` | Assistant-attributed peer memory under `.../peers/<assistant_id>/memories/...` | A human is the OpenViking user and uses multiple OpenClaw assistants |
83
83
  | `sender` | Sender-attributed peer memory under `.../peers/<sender_id>/memories/...` | An agent is the OpenViking user and receives messages from multiple humans |
84
84
 
85
- Setup rejects `person`; always pass `sender`. An existing config that still says `person` keeps working as `sender`. OpenViking initializes the managed `peers/` container for every user; `none` only means that no concrete `peers/<peer_id>/memories` subtree is used. Actor-peer recall includes shared user memory plus the current peer memory, and changing the scope does not move existing memories.
85
+ `person` is a legacy alias for `sender`. Accept it from existing config or user input, but write `sender` in new setup commands. OpenViking initializes the managed `peers/` container for every user; `none` only means that no concrete `peers/<peer_id>/memories` subtree is used. Actor-peer recall includes shared user memory plus the current peer memory, and changing the scope does not move existing memories.
86
86
 
87
87
  Examples:
88
88
 
package/INSTALL-ZH.md CHANGED
@@ -205,7 +205,7 @@ openclaw openviking setup --base-url <OPENVIKING_URL> --api-key <API_KEY> --forc
205
205
  | `assistant` | `viking://user/alice/peers/main/memories/...` | OpenViking user 代表人,并希望把 assistant 归因的 peer 记忆按不同 OpenClaw 助手分开。 |
206
206
  | `sender` | `viking://user/support-agent/peers/customer-42/memories/...` | OpenViking user 代表 agent,并希望把 sender 归因的 peer 记忆按不同发送者分开。 |
207
207
 
208
- 安装和 setup 只接受 `sender`;已有配置里的 `person` 仍按 `sender` 生效。
208
+ `person` 仍作为 `sender` 的旧配置别名被兼容;新配置请使用 `sender`。
209
209
 
210
210
  例如,让每个助手使用独立的 peer 记忆,并可选给 assistant id 加前缀:
211
211
 
@@ -405,7 +405,7 @@ ov-install
405
405
  | `--current-version` | 查看 helper 记录的当前版本 |
406
406
  | `--base-url URL` | OpenViking 服务器地址(启用非交互模式) |
407
407
  | `--api-key KEY` | OpenViking API key |
408
- | `--peer-role ROLE` | 记忆归属:`none`、`assistant` 或 `sender` |
408
+ | `--peer-role ROLE` | 记忆归属:`none`、`assistant` 或 `sender`;旧值 `person` 作为 `sender` 的别名兼容 |
409
409
  | `--peer-prefix PREFIX` | assistant `peer_id` / actor peer 值的前缀 |
410
410
  | `--update` | 更新 helper 管理的安装 |
411
411
 
package/INSTALL.md CHANGED
@@ -149,7 +149,7 @@ Choose `--peer-role` from what the OpenViking user represents:
149
149
  | `assistant` | `viking://user/alice/peers/main/memories/...` | The OpenViking user is a human and assistant-attributed peer memory should be separated by OpenClaw assistant. |
150
150
  | `sender` | `viking://user/support-agent/peers/customer-42/memories/...` | The OpenViking user is an agent and sender-attributed peer memory should be separated by human sender. |
151
151
 
152
- Setup and the installer accept only `sender`. An existing config that still says `person` keeps working as `sender`.
152
+ `person` is still accepted as a legacy alias for `sender`. New configuration should use `sender`.
153
153
 
154
154
  For example, give each assistant its own peer memory and optionally namespace the assistant id:
155
155
 
@@ -329,7 +329,7 @@ Useful backup/source flags:
329
329
  | `--current-version` | Print the version tracked by the helper |
330
330
  | `--base-url URL` | OpenViking server URL (enables non-interactive mode) |
331
331
  | `--api-key KEY` | OpenViking API key |
332
- | `--peer-role ROLE` | Memory scope: `none`, `assistant`, or `sender` |
332
+ | `--peer-role ROLE` | Memory scope: `none`, `assistant`, or `sender`; legacy `person` is accepted as `sender` |
333
333
  | `--peer-prefix PREFIX` | Prefix for assistant `peer_id` / actor peer values |
334
334
  | `--update` | Update an existing helper-managed install |
335
335
 
package/commands/setup.ts CHANGED
@@ -136,12 +136,6 @@ function normalizePeerRole(value: unknown): PeerRole | undefined {
136
136
  return undefined;
137
137
  }
138
138
 
139
- // `person` survives only in existing configs; setup input must say `sender`.
140
- function normalizePeerRoleInput(value: unknown): PeerRole | undefined {
141
- if (typeof value === "string" && value.trim().toLowerCase() === "person") return undefined;
142
- return normalizePeerRole(value);
143
- }
144
-
145
139
  function resolveExistingPeerRole(existing: Record<string, unknown> | null | undefined): PeerRole {
146
140
  const explicit = normalizePeerRole(existing?.peer_role);
147
141
  if (explicit) return explicit;
@@ -157,9 +151,9 @@ function resolveExistingPeerPrefix(existing: Record<string, unknown> | null | un
157
151
 
158
152
  function resolveSetupPeerRole(value: unknown): PeerRole {
159
153
  if (value === undefined) return DEFAULT_SETUP_PEER_ROLE;
160
- const role = normalizePeerRoleInput(value);
154
+ const role = normalizePeerRole(value);
161
155
  if (role) return role;
162
- throw new Error('peer_role must be "none", "assistant", or "sender" ("person" was renamed to "sender")');
156
+ throw new Error('peer_role must be "none", "assistant", or "sender" (legacy alias: "person")');
163
157
  }
164
158
 
165
159
  function normalizeSetupRecallTargetTypes(value: unknown): RecallTargetType[] | undefined {
@@ -223,10 +217,10 @@ async function askPeerRole(
223
217
  zh,
224
218
  "Memory scope — none (default): viking://user/<user_id>/memories, shared across all conversations; " +
225
219
  "assistant: viking://user/<user_id>/peers/<assistant_id>/memories; " +
226
- "sender: viking://user/<user_id>/peers/<sender_id>/memories.",
220
+ "sender: viking://user/<user_id>/peers/<sender_id>/memories (legacy alias: person).",
227
221
  "记忆归属 —— none(默认):viking://user/<user_id>/memories,所有对话共享;" +
228
222
  "assistant:viking://user/<user_id>/peers/<assistant_id>/memories;" +
229
- "sender:viking://user/<user_id>/peers/<sender_id>/memories。",
223
+ "sender:viking://user/<user_id>/peers/<sender_id>/memories(兼容旧值 person)。",
230
224
  )}`,
231
225
  );
232
226
  while (true) {
@@ -234,13 +228,13 @@ async function askPeerRole(
234
228
  tr(zh, "Memory scope (none/assistant/sender)", "记忆归属(none/assistant/sender)"),
235
229
  defaultValue,
236
230
  );
237
- const role = normalizePeerRoleInput(value);
231
+ const role = normalizePeerRole(value);
238
232
  if (role) return role;
239
233
  console.log(
240
234
  ` ✗ ${tr(
241
235
  zh,
242
- 'Memory scope must be "none", "assistant", or "sender" ("person" was renamed to "sender").',
243
- '记忆归属必须是 "none"、"assistant" 或 "sender"("person" 已更名为 "sender")。',
236
+ 'Memory scope must be "none", "assistant", or "sender" (legacy "person" is also accepted).',
237
+ '记忆归属必须是 "none"、"assistant" 或 "sender"(也兼容旧值 "person")。',
244
238
  )}`,
245
239
  );
246
240
  }
@@ -502,7 +496,7 @@ export function registerSetupCli(api: any): void {
502
496
  .option("--zh", "Chinese prompts")
503
497
  .option("--base-url <url>", "OpenViking server URL (enables non-interactive mode)")
504
498
  .option("--api-key <key>", "API key for authentication")
505
- .option("--peer-role <role>", "Memory scope: none (shared), assistant (per assistant), or sender (per sender)")
499
+ .option("--peer-role <role>", "Memory scope: none (shared), assistant (per assistant), or sender (per sender); person is a legacy alias")
506
500
  .option("--peer-prefix <prefix>", "Prefix for assistant peer_id values")
507
501
  .option("--account-id <id>", "Account ID (required for root API keys)")
508
502
  .option("--user-id <id>", "User ID (required for root API keys)")
@@ -106,12 +106,6 @@ function normalizePeerRole(value) {
106
106
  return role;
107
107
  return undefined;
108
108
  }
109
- // `person` survives only in existing configs; setup input must say `sender`.
110
- function normalizePeerRoleInput(value) {
111
- if (typeof value === "string" && value.trim().toLowerCase() === "person")
112
- return undefined;
113
- return normalizePeerRole(value);
114
- }
115
109
  function resolveExistingPeerRole(existing) {
116
110
  const explicit = normalizePeerRole(existing?.peer_role);
117
111
  if (explicit)
@@ -128,10 +122,10 @@ function resolveExistingPeerPrefix(existing) {
128
122
  function resolveSetupPeerRole(value) {
129
123
  if (value === undefined)
130
124
  return DEFAULT_SETUP_PEER_ROLE;
131
- const role = normalizePeerRoleInput(value);
125
+ const role = normalizePeerRole(value);
132
126
  if (role)
133
127
  return role;
134
- throw new Error('peer_role must be "none", "assistant", or "sender" ("person" was renamed to "sender")');
128
+ throw new Error('peer_role must be "none", "assistant", or "sender" (legacy alias: "person")');
135
129
  }
136
130
  function normalizeSetupRecallTargetTypes(value) {
137
131
  if (value === undefined || value === null || value === "") {
@@ -184,15 +178,15 @@ function preserveCurrentConfig(existing) {
184
178
  async function askPeerRole(zh, q, defaultValue) {
185
179
  console.log(` ${tr(zh, "Memory scope — none (default): viking://user/<user_id>/memories, shared across all conversations; " +
186
180
  "assistant: viking://user/<user_id>/peers/<assistant_id>/memories; " +
187
- "sender: viking://user/<user_id>/peers/<sender_id>/memories.", "记忆归属 —— none(默认):viking://user/<user_id>/memories,所有对话共享;" +
181
+ "sender: viking://user/<user_id>/peers/<sender_id>/memories (legacy alias: person).", "记忆归属 —— none(默认):viking://user/<user_id>/memories,所有对话共享;" +
188
182
  "assistant:viking://user/<user_id>/peers/<assistant_id>/memories;" +
189
- "sender:viking://user/<user_id>/peers/<sender_id>/memories。")}`);
183
+ "sender:viking://user/<user_id>/peers/<sender_id>/memories(兼容旧值 person)。")}`);
190
184
  while (true) {
191
185
  const value = await q(tr(zh, "Memory scope (none/assistant/sender)", "记忆归属(none/assistant/sender)"), defaultValue);
192
- const role = normalizePeerRoleInput(value);
186
+ const role = normalizePeerRole(value);
193
187
  if (role)
194
188
  return role;
195
- console.log(` ✗ ${tr(zh, 'Memory scope must be "none", "assistant", or "sender" ("person" was renamed to "sender").', '记忆归属必须是 "none"、"assistant" 或 "sender"("person" 已更名为 "sender")。')}`);
189
+ console.log(` ✗ ${tr(zh, 'Memory scope must be "none", "assistant", or "sender" (legacy "person" is also accepted).', '记忆归属必须是 "none"、"assistant" 或 "sender"(也兼容旧值 "person")。')}`);
196
190
  }
197
191
  }
198
192
  async function askPeerPrefix(zh, q, defaultValue) {
@@ -381,7 +375,7 @@ export function registerSetupCli(api) {
381
375
  .option("--zh", "Chinese prompts")
382
376
  .option("--base-url <url>", "OpenViking server URL (enables non-interactive mode)")
383
377
  .option("--api-key <key>", "API key for authentication")
384
- .option("--peer-role <role>", "Memory scope: none (shared), assistant (per assistant), or sender (per sender)")
378
+ .option("--peer-role <role>", "Memory scope: none (shared), assistant (per assistant), or sender (per sender); person is a legacy alias")
385
379
  .option("--peer-prefix <prefix>", "Prefix for assistant peer_id values")
386
380
  .option("--account-id <id>", "Account ID (required for root API keys)")
387
381
  .option("--user-id <id>", "User ID (required for root API keys)")
@@ -50,7 +50,6 @@ export function createOpenVikingSessionRoutingRuntime(options) {
50
50
  peerRole,
51
51
  senderPeerId: sanitizeOpenVikingPeerId(ctx?.requesterSenderId ?? ctx?.senderId),
52
52
  assistantPeerId: agentId,
53
- warn: (message) => options.logger.warn(message),
54
53
  }),
55
54
  };
56
55
  };
@@ -20,21 +20,13 @@ export function resolveOpenVikingMessagePeerId(params) {
20
20
  }
21
21
  return undefined;
22
22
  }
23
- /**
24
- * Peer scoping is soft isolation. OpenClaw does not hand every path a sender
25
- * (context-engine assemble gets no runtimeContext; cron and heartbeat turns
26
- * have no sender at all), so a missing one widens to the unscoped request a
27
- * caller without X-OpenViking-Actor-Peer gets, with a warning, rather than
28
- * taking OpenViking away for the turn.
29
- */
30
23
  export function resolveOpenVikingActorPeerId(params) {
31
24
  const actorPeerId = resolveOpenVikingMessagePeerId({
32
25
  ...params,
33
26
  role: params.peerRole === "sender" ? "user" : "assistant",
34
27
  });
35
28
  if (params.peerRole === "sender" && !actorPeerId) {
36
- params.warn?.("openviking: peer_role=sender but OpenClaw supplied no sender identity; " +
37
- "continuing as an unscoped request under this user (no X-OpenViking-Actor-Peer)");
29
+ throw new Error("openviking: peer_role=sender requires a sender identity");
38
30
  }
39
31
  return actorPeerId;
40
32
  }
@@ -207,7 +207,6 @@ async function recallForAssemble(params, recallQuery) {
207
207
  peerRole: cfg.peer_role ?? "none",
208
208
  senderPeerId: sanitizeOpenVikingPeerId(sender.senderId),
209
209
  assistantPeerId: agentId,
210
- warn: (message) => logger.warn?.(message),
211
210
  });
212
211
  const queryConfig = await queryConfigStore?.getEffective({
213
212
  agentId,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openviking/openclaw-plugin",
3
- "version": "2026.9.24-1",
3
+ "version": "2026.9.24",
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",
@@ -9,7 +9,6 @@ import {
9
9
 
10
10
  type Logger = {
11
11
  info: (message: string) => void;
12
- warn: (message: string) => void;
13
12
  };
14
13
 
15
14
  export type SessionAgentLookup = {
@@ -100,7 +99,6 @@ export function createOpenVikingSessionRoutingRuntime(options: {
100
99
  peerRole,
101
100
  senderPeerId: sanitizeOpenVikingPeerId(ctx?.requesterSenderId ?? ctx?.senderId),
102
101
  assistantPeerId: agentId,
103
- warn: (message) => options.logger.warn(message),
104
102
  }),
105
103
  };
106
104
  };
@@ -41,28 +41,17 @@ export function resolveOpenVikingMessagePeerId(params: {
41
41
  return undefined;
42
42
  }
43
43
 
44
- /**
45
- * Peer scoping is soft isolation. OpenClaw does not hand every path a sender
46
- * (context-engine assemble gets no runtimeContext; cron and heartbeat turns
47
- * have no sender at all), so a missing one widens to the unscoped request a
48
- * caller without X-OpenViking-Actor-Peer gets, with a warning, rather than
49
- * taking OpenViking away for the turn.
50
- */
51
44
  export function resolveOpenVikingActorPeerId(params: {
52
45
  peerRole: OpenVikingPeerRole;
53
46
  senderPeerId?: string;
54
47
  assistantPeerId?: string;
55
- warn?: (message: string) => void;
56
48
  }): string | undefined {
57
49
  const actorPeerId = resolveOpenVikingMessagePeerId({
58
50
  ...params,
59
51
  role: params.peerRole === "sender" ? "user" : "assistant",
60
52
  });
61
53
  if (params.peerRole === "sender" && !actorPeerId) {
62
- params.warn?.(
63
- "openviking: peer_role=sender but OpenClaw supplied no sender identity; " +
64
- "continuing as an unscoped request under this user (no X-OpenViking-Actor-Peer)",
65
- );
54
+ throw new Error("openviking: peer_role=sender requires a sender identity");
66
55
  }
67
56
  return actorPeerId;
68
57
  }
@@ -440,7 +440,6 @@ async function recallForAssemble(
440
440
  peerRole: cfg.peer_role ?? "none",
441
441
  senderPeerId: sanitizeOpenVikingPeerId(sender.senderId),
442
442
  assistantPeerId: agentId,
443
- warn: (message) => logger.warn?.(message),
444
443
  });
445
444
  const queryConfig = await queryConfigStore?.getEffective({
446
445
  agentId,