@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 +2 -2
- package/INSTALL-ZH.md +2 -2
- package/INSTALL.md +2 -2
- package/commands/setup.ts +8 -14
- package/dist/commands/setup.js +7 -13
- package/dist/plugin/openviking-session-routing-runtime.js +0 -1
- package/dist/routing/identity-routing.js +1 -9
- package/dist/services/context-lifecycle-service.js +0 -1
- package/package.json +1 -1
- package/plugin/openviking-session-routing-runtime.ts +0 -2
- package/routing/identity-routing.ts +1 -12
- package/services/context-lifecycle-service.ts +0 -1
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
154
|
+
const role = normalizePeerRole(value);
|
|
161
155
|
if (role) return role;
|
|
162
|
-
throw new Error('peer_role must be "none", "assistant", or "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 =
|
|
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"
|
|
243
|
-
'记忆归属必须是 "none"、"assistant" 或 "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)")
|
package/dist/commands/setup.js
CHANGED
|
@@ -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 =
|
|
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" (
|
|
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 =
|
|
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"
|
|
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)")
|
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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,
|