@openviking/openclaw-plugin 2026.10.12 → 2026.10.14-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/client.ts +3 -22
- package/dist/client.js +3 -15
- package/dist/plugin/openviking-command-args.js +2 -4
- package/dist/plugin/openviking-import-runtime.js +0 -2
- package/dist/plugin/openviking-import-tools.js +0 -4
- package/dist/shared/recall-compress-core.mjs +6 -0
- package/package.json +1 -1
- package/plugin/openviking-command-args.ts +2 -6
- package/plugin/openviking-command-definitions.ts +0 -2
- package/plugin/openviking-import-runtime.ts +0 -4
- package/plugin/openviking-import-tools.ts +0 -4
- package/shared/recall-compress-core.mjs +6 -0
- package/skills/install-openviking-memory/SKILL.md +0 -2
- package/skills/openviking-context-database/SKILL.md +1 -3
package/client.ts
CHANGED
|
@@ -207,7 +207,6 @@ export type AddResourceInput = {
|
|
|
207
207
|
reason?: string;
|
|
208
208
|
instruction?: string;
|
|
209
209
|
wait?: boolean;
|
|
210
|
-
timeout?: number;
|
|
211
210
|
strict?: boolean;
|
|
212
211
|
ignoreDirs?: string;
|
|
213
212
|
include?: string;
|
|
@@ -230,7 +229,6 @@ export type AddSkillInput = {
|
|
|
230
229
|
path?: string;
|
|
231
230
|
data?: unknown;
|
|
232
231
|
wait?: boolean;
|
|
233
|
-
timeout?: number;
|
|
234
232
|
};
|
|
235
233
|
|
|
236
234
|
export type AddSkillResult = {
|
|
@@ -241,22 +239,12 @@ export type AddSkillResult = {
|
|
|
241
239
|
queue_status?: unknown;
|
|
242
240
|
};
|
|
243
241
|
|
|
244
|
-
const DEFAULT_WAIT_REQUEST_TIMEOUT_MS = 120_000;
|
|
245
242
|
export const DEFAULT_PHASE2_POLL_TIMEOUT_MS = 300_000;
|
|
246
|
-
const WAIT_REQUEST_TIMEOUT_BUFFER_MS = 5_000;
|
|
247
243
|
|
|
248
244
|
function sleep(ms: number): Promise<void> {
|
|
249
245
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
250
246
|
}
|
|
251
247
|
|
|
252
|
-
function resolveWaitRequestTimeoutMs(defaultTimeoutMs: number, waitTimeoutSeconds?: number): number {
|
|
253
|
-
const requestedMs =
|
|
254
|
-
typeof waitTimeoutSeconds === "number" && Number.isFinite(waitTimeoutSeconds) && waitTimeoutSeconds > 0
|
|
255
|
-
? Math.ceil(waitTimeoutSeconds * 1000) + WAIT_REQUEST_TIMEOUT_BUFFER_MS
|
|
256
|
-
: DEFAULT_WAIT_REQUEST_TIMEOUT_MS;
|
|
257
|
-
return Math.max(defaultTimeoutMs, requestedMs);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
248
|
export class OpenVikingClient {
|
|
261
249
|
private readonly transport: HttpTransport;
|
|
262
250
|
private readonly configuredHeaders: Record<string, string>;
|
|
@@ -678,7 +666,6 @@ export class OpenVikingClient {
|
|
|
678
666
|
reason: input.reason ?? "",
|
|
679
667
|
instruction: input.instruction ?? "",
|
|
680
668
|
wait: input.wait ?? false,
|
|
681
|
-
timeout: input.timeout,
|
|
682
669
|
strict: input.strict ?? false,
|
|
683
670
|
ignore_dirs: input.ignoreDirs,
|
|
684
671
|
include: input.include,
|
|
@@ -689,8 +676,6 @@ export class OpenVikingClient {
|
|
|
689
676
|
}
|
|
690
677
|
|
|
691
678
|
let packagedSource: Awaited<ReturnType<ResourcePackager["prepareResourceSource"]>> | undefined;
|
|
692
|
-
const requestTimeoutMs =
|
|
693
|
-
input.wait ? resolveWaitRequestTimeoutMs(this.timeoutMs, input.timeout) : undefined;
|
|
694
679
|
try {
|
|
695
680
|
packagedSource = await this.resourcePackager.prepareResourceSource(pathOrUrl);
|
|
696
681
|
if (packagedSource.kind === "remote") {
|
|
@@ -704,7 +689,7 @@ export class OpenVikingClient {
|
|
|
704
689
|
return this.request<AddResourceResult>(
|
|
705
690
|
"/api/v1/resources",
|
|
706
691
|
{ method: "POST", body: JSON.stringify(body) },
|
|
707
|
-
|
|
692
|
+
undefined,
|
|
708
693
|
actorPeerId,
|
|
709
694
|
);
|
|
710
695
|
} finally {
|
|
@@ -721,11 +706,8 @@ export class OpenVikingClient {
|
|
|
721
706
|
|
|
722
707
|
const body: Record<string, unknown> = {
|
|
723
708
|
wait: input.wait ?? false,
|
|
724
|
-
timeout: input.timeout,
|
|
725
709
|
};
|
|
726
710
|
let packagedSource: Awaited<ReturnType<ResourcePackager["prepareLocalUploadSource"]>> | undefined;
|
|
727
|
-
const requestTimeoutMs =
|
|
728
|
-
input.wait ? resolveWaitRequestTimeoutMs(this.timeoutMs, input.timeout) : undefined;
|
|
729
711
|
try {
|
|
730
712
|
if (hasPath) {
|
|
731
713
|
const skillPath = input.path!.trim();
|
|
@@ -740,7 +722,7 @@ export class OpenVikingClient {
|
|
|
740
722
|
return this.request<AddSkillResult>(
|
|
741
723
|
"/api/v1/skills",
|
|
742
724
|
{ method: "POST", body: JSON.stringify(body) },
|
|
743
|
-
|
|
725
|
+
undefined,
|
|
744
726
|
actorPeerId,
|
|
745
727
|
);
|
|
746
728
|
} finally {
|
|
@@ -850,7 +832,6 @@ export class OpenVikingClient {
|
|
|
850
832
|
options?: {
|
|
851
833
|
wait?: boolean;
|
|
852
834
|
enableWorkingMemory?: boolean;
|
|
853
|
-
timeoutMs?: number;
|
|
854
835
|
/**
|
|
855
836
|
* WM v2: number of most-recent messages to keep live after commit.
|
|
856
837
|
* Forwarded as `keep_recent_count` in the POST body. 0 (default)
|
|
@@ -907,7 +888,7 @@ export class OpenVikingClient {
|
|
|
907
888
|
}
|
|
908
889
|
|
|
909
890
|
// Client-side poll until Phase 2 finishes
|
|
910
|
-
const deadline = this.now() +
|
|
891
|
+
const deadline = this.now() + DEFAULT_PHASE2_POLL_TIMEOUT_MS;
|
|
911
892
|
const pollInterval = 500;
|
|
912
893
|
while (this.now() < deadline) {
|
|
913
894
|
await this.sleep(pollInterval);
|
package/dist/client.js
CHANGED
|
@@ -4,18 +4,10 @@ import { buildContextSearchBody, contextRequestTimeoutMs, normalizeContextEntry,
|
|
|
4
4
|
function userSessionUri(sessionId) {
|
|
5
5
|
return `viking://~/sessions/${encodeURIComponent(sessionId)}`;
|
|
6
6
|
}
|
|
7
|
-
const DEFAULT_WAIT_REQUEST_TIMEOUT_MS = 120_000;
|
|
8
7
|
export const DEFAULT_PHASE2_POLL_TIMEOUT_MS = 300_000;
|
|
9
|
-
const WAIT_REQUEST_TIMEOUT_BUFFER_MS = 5_000;
|
|
10
8
|
function sleep(ms) {
|
|
11
9
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
12
10
|
}
|
|
13
|
-
function resolveWaitRequestTimeoutMs(defaultTimeoutMs, waitTimeoutSeconds) {
|
|
14
|
-
const requestedMs = typeof waitTimeoutSeconds === "number" && Number.isFinite(waitTimeoutSeconds) && waitTimeoutSeconds > 0
|
|
15
|
-
? Math.ceil(waitTimeoutSeconds * 1000) + WAIT_REQUEST_TIMEOUT_BUFFER_MS
|
|
16
|
-
: DEFAULT_WAIT_REQUEST_TIMEOUT_MS;
|
|
17
|
-
return Math.max(defaultTimeoutMs, requestedMs);
|
|
18
|
-
}
|
|
19
11
|
export class OpenVikingClient {
|
|
20
12
|
baseUrl;
|
|
21
13
|
apiKey;
|
|
@@ -320,7 +312,6 @@ export class OpenVikingClient {
|
|
|
320
312
|
reason: input.reason ?? "",
|
|
321
313
|
instruction: input.instruction ?? "",
|
|
322
314
|
wait: input.wait ?? false,
|
|
323
|
-
timeout: input.timeout,
|
|
324
315
|
strict: input.strict ?? false,
|
|
325
316
|
ignore_dirs: input.ignoreDirs,
|
|
326
317
|
include: input.include,
|
|
@@ -330,7 +321,6 @@ export class OpenVikingClient {
|
|
|
330
321
|
body.preserve_structure = input.preserveStructure;
|
|
331
322
|
}
|
|
332
323
|
let packagedSource;
|
|
333
|
-
const requestTimeoutMs = input.wait ? resolveWaitRequestTimeoutMs(this.timeoutMs, input.timeout) : undefined;
|
|
334
324
|
try {
|
|
335
325
|
packagedSource = await this.resourcePackager.prepareResourceSource(pathOrUrl);
|
|
336
326
|
if (packagedSource.kind === "remote") {
|
|
@@ -342,7 +332,7 @@ export class OpenVikingClient {
|
|
|
342
332
|
}
|
|
343
333
|
body.temp_file_id = await this.uploadTempFile(packagedSource.uploadPath, actorPeerId);
|
|
344
334
|
}
|
|
345
|
-
return this.request("/api/v1/resources", { method: "POST", body: JSON.stringify(body) },
|
|
335
|
+
return this.request("/api/v1/resources", { method: "POST", body: JSON.stringify(body) }, undefined, actorPeerId);
|
|
346
336
|
}
|
|
347
337
|
finally {
|
|
348
338
|
await this.resourcePackager.cleanup(packagedSource);
|
|
@@ -356,10 +346,8 @@ export class OpenVikingClient {
|
|
|
356
346
|
}
|
|
357
347
|
const body = {
|
|
358
348
|
wait: input.wait ?? false,
|
|
359
|
-
timeout: input.timeout,
|
|
360
349
|
};
|
|
361
350
|
let packagedSource;
|
|
362
|
-
const requestTimeoutMs = input.wait ? resolveWaitRequestTimeoutMs(this.timeoutMs, input.timeout) : undefined;
|
|
363
351
|
try {
|
|
364
352
|
if (hasPath) {
|
|
365
353
|
const skillPath = input.path.trim();
|
|
@@ -372,7 +360,7 @@ export class OpenVikingClient {
|
|
|
372
360
|
else {
|
|
373
361
|
body.data = input.data;
|
|
374
362
|
}
|
|
375
|
-
return this.request("/api/v1/skills", { method: "POST", body: JSON.stringify(body) },
|
|
363
|
+
return this.request("/api/v1/skills", { method: "POST", body: JSON.stringify(body) }, undefined, actorPeerId);
|
|
376
364
|
}
|
|
377
365
|
finally {
|
|
378
366
|
await this.resourcePackager.cleanup(packagedSource);
|
|
@@ -442,7 +430,7 @@ export class OpenVikingClient {
|
|
|
442
430
|
return result;
|
|
443
431
|
}
|
|
444
432
|
// Client-side poll until Phase 2 finishes
|
|
445
|
-
const deadline = this.now() +
|
|
433
|
+
const deadline = this.now() + DEFAULT_PHASE2_POLL_TIMEOUT_MS;
|
|
446
434
|
const pollInterval = 500;
|
|
447
435
|
while (this.now() < deadline) {
|
|
448
436
|
await this.sleep(pollInterval);
|
|
@@ -98,7 +98,7 @@ export function parseAddResourceCommandArgs(args) {
|
|
|
98
98
|
const parsed = parseFlagArgs(args);
|
|
99
99
|
const source = parsed.positionals.length <= 1 ? parsed.positionals[0] : parsed.positionals.join(" ").trim();
|
|
100
100
|
if (!source) {
|
|
101
|
-
throw new Error("Usage: /add-resource <source> [--to URI] [--parent URI] [--reason TEXT] [--instruction TEXT] [--wait]
|
|
101
|
+
throw new Error("Usage: /add-resource <source> [--to URI] [--parent URI] [--reason TEXT] [--instruction TEXT] [--wait]");
|
|
102
102
|
}
|
|
103
103
|
const to = getStringFlag(parsed.flags, "to");
|
|
104
104
|
const parent = getStringFlag(parsed.flags, "parent");
|
|
@@ -112,14 +112,13 @@ export function parseAddResourceCommandArgs(args) {
|
|
|
112
112
|
reason: getStringFlag(parsed.flags, "reason"),
|
|
113
113
|
instruction: getStringFlag(parsed.flags, "instruction"),
|
|
114
114
|
wait: getBoolFlag(parsed.flags, "wait"),
|
|
115
|
-
timeout: getNumberFlag(parsed.flags, "timeout"),
|
|
116
115
|
};
|
|
117
116
|
}
|
|
118
117
|
export function parseAddSkillCommandArgs(args) {
|
|
119
118
|
const parsed = parseFlagArgs(args);
|
|
120
119
|
const source = parsed.positionals.length <= 1 ? parsed.positionals[0] : parsed.positionals.join(" ").trim();
|
|
121
120
|
if (!source) {
|
|
122
|
-
throw new Error("Usage: /add-skill <source> [--wait]
|
|
121
|
+
throw new Error("Usage: /add-skill <source> [--wait]");
|
|
123
122
|
}
|
|
124
123
|
if (parsed.flags.has("to") || parsed.flags.has("parent") || parsed.flags.has("reason") || parsed.flags.has("instruction")) {
|
|
125
124
|
throw new Error("--to, --parent, --reason, and --instruction are resource-only options.");
|
|
@@ -127,7 +126,6 @@ export function parseAddSkillCommandArgs(args) {
|
|
|
127
126
|
return {
|
|
128
127
|
source,
|
|
129
128
|
wait: getBoolFlag(parsed.flags, "wait"),
|
|
130
|
-
timeout: getNumberFlag(parsed.flags, "timeout"),
|
|
131
129
|
};
|
|
132
130
|
}
|
|
133
131
|
export function parseOVSearchCommandArgs(args) {
|
|
@@ -38,13 +38,11 @@ export function createOpenVikingImportRuntime(deps) {
|
|
|
38
38
|
reason: input.reason,
|
|
39
39
|
instruction: input.instruction,
|
|
40
40
|
wait: input.wait,
|
|
41
|
-
timeout: input.timeout,
|
|
42
41
|
}, agentId);
|
|
43
42
|
const addSkillOpenViking = (input, agentId) => importSkill({
|
|
44
43
|
path: input.source,
|
|
45
44
|
data: input.data,
|
|
46
45
|
wait: input.wait,
|
|
47
|
-
timeout: input.timeout,
|
|
48
46
|
}, agentId);
|
|
49
47
|
return { addResourceOpenViking, addSkillOpenViking };
|
|
50
48
|
}
|
|
@@ -24,7 +24,6 @@ export function registerOpenVikingImportTools(deps) {
|
|
|
24
24
|
reason: Type.Optional(Type.String({ description: "Reason or note for adding this resource" })),
|
|
25
25
|
instruction: Type.Optional(Type.String({ description: "Processing instruction for semantic extraction" })),
|
|
26
26
|
wait: Type.Optional(Type.Boolean({ description: "Wait for processing to complete" })),
|
|
27
|
-
timeout: Type.Optional(Type.Number({ description: "Timeout in seconds when wait is true" })),
|
|
28
27
|
}),
|
|
29
28
|
async execute(_toolCallId, params) {
|
|
30
29
|
if (deps.isBypassedSession(ctx)) {
|
|
@@ -39,7 +38,6 @@ export function registerOpenVikingImportTools(deps) {
|
|
|
39
38
|
reason: typeof params.reason === "string" ? params.reason : undefined,
|
|
40
39
|
instruction: typeof params.instruction === "string" ? params.instruction : undefined,
|
|
41
40
|
wait: typeof params.wait === "boolean" ? params.wait : undefined,
|
|
42
|
-
timeout: typeof params.timeout === "number" ? params.timeout : undefined,
|
|
43
41
|
}, session.actorPeerId);
|
|
44
42
|
return {
|
|
45
43
|
content: [{ type: "text", text: formatResourceImportText(result) }],
|
|
@@ -60,7 +58,6 @@ export function registerOpenVikingImportTools(deps) {
|
|
|
60
58
|
source: Type.Optional(Type.String({ description: "Local SKILL.md path or skill directory path" })),
|
|
61
59
|
data: Type.Optional(Type.Any({ description: "Raw SKILL.md content or MCP tool dict" })),
|
|
62
60
|
wait: Type.Optional(Type.Boolean({ description: "Wait for processing to complete" })),
|
|
63
|
-
timeout: Type.Optional(Type.Number({ description: "Timeout in seconds when wait is true" })),
|
|
64
61
|
}),
|
|
65
62
|
async execute(_toolCallId, params) {
|
|
66
63
|
if (deps.isBypassedSession(ctx)) {
|
|
@@ -72,7 +69,6 @@ export function registerOpenVikingImportTools(deps) {
|
|
|
72
69
|
path: typeof params.source === "string" ? params.source : undefined,
|
|
73
70
|
data: params.data,
|
|
74
71
|
wait: typeof params.wait === "boolean" ? params.wait : undefined,
|
|
75
|
-
timeout: typeof params.timeout === "number" ? params.timeout : undefined,
|
|
76
72
|
}, session.actorPeerId);
|
|
77
73
|
return {
|
|
78
74
|
content: [{ type: "text", text: formatSkillImportText(result) }],
|
|
@@ -25,9 +25,15 @@ Write a memory digest for a coding agent about to answer that query. Keep the
|
|
|
25
25
|
concrete facts (paths, identifiers, decisions, constraints); drop pleasantries
|
|
26
26
|
and conversational filler.
|
|
27
27
|
|
|
28
|
+
Report only facts found in the fragments; never restate the user query as a
|
|
29
|
+
fact. Do not tell the agent what to do with them: no advice, instructions,
|
|
30
|
+
warnings, or next steps of your own. Report a preference or rule as something
|
|
31
|
+
the user recorded, not as a command to the agent.
|
|
32
|
+
|
|
28
33
|
Format rules:
|
|
29
34
|
- Group related facts by topic, one bullet per topic, at most ${maxBullets} bullets.
|
|
30
35
|
- Start every bullet with "- ".
|
|
36
|
+
- Write in the language of the user query.
|
|
31
37
|
- End every bullet with its source, copied verbatim from the fragments above:
|
|
32
38
|
"来源:viking://..." or "source: viking://...". Never edit, shorten, or invent a URI.
|
|
33
39
|
- Output the digest body only. No preamble, no closing remark.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openviking/openclaw-plugin",
|
|
3
|
-
"version": "2026.10.
|
|
3
|
+
"version": "2026.10.14-1",
|
|
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",
|
|
@@ -5,14 +5,12 @@ export type AddResourceCommandArgs = {
|
|
|
5
5
|
reason?: string;
|
|
6
6
|
instruction?: string;
|
|
7
7
|
wait?: boolean;
|
|
8
|
-
timeout?: number;
|
|
9
8
|
};
|
|
10
9
|
|
|
11
10
|
export type AddSkillCommandArgs = {
|
|
12
11
|
source?: string;
|
|
13
12
|
data?: unknown;
|
|
14
13
|
wait?: boolean;
|
|
15
|
-
timeout?: number;
|
|
16
14
|
};
|
|
17
15
|
|
|
18
16
|
export type OVSearchCommandArgs = {
|
|
@@ -136,7 +134,7 @@ export function parseAddResourceCommandArgs(args: string): AddResourceCommandArg
|
|
|
136
134
|
const source =
|
|
137
135
|
parsed.positionals.length <= 1 ? parsed.positionals[0] : parsed.positionals.join(" ").trim();
|
|
138
136
|
if (!source) {
|
|
139
|
-
throw new Error("Usage: /add-resource <source> [--to URI] [--parent URI] [--reason TEXT] [--instruction TEXT] [--wait]
|
|
137
|
+
throw new Error("Usage: /add-resource <source> [--to URI] [--parent URI] [--reason TEXT] [--instruction TEXT] [--wait]");
|
|
140
138
|
}
|
|
141
139
|
const to = getStringFlag(parsed.flags, "to");
|
|
142
140
|
const parent = getStringFlag(parsed.flags, "parent");
|
|
@@ -150,7 +148,6 @@ export function parseAddResourceCommandArgs(args: string): AddResourceCommandArg
|
|
|
150
148
|
reason: getStringFlag(parsed.flags, "reason"),
|
|
151
149
|
instruction: getStringFlag(parsed.flags, "instruction"),
|
|
152
150
|
wait: getBoolFlag(parsed.flags, "wait"),
|
|
153
|
-
timeout: getNumberFlag(parsed.flags, "timeout"),
|
|
154
151
|
};
|
|
155
152
|
}
|
|
156
153
|
|
|
@@ -159,7 +156,7 @@ export function parseAddSkillCommandArgs(args: string): AddSkillCommandArgs {
|
|
|
159
156
|
const source =
|
|
160
157
|
parsed.positionals.length <= 1 ? parsed.positionals[0] : parsed.positionals.join(" ").trim();
|
|
161
158
|
if (!source) {
|
|
162
|
-
throw new Error("Usage: /add-skill <source> [--wait]
|
|
159
|
+
throw new Error("Usage: /add-skill <source> [--wait]");
|
|
163
160
|
}
|
|
164
161
|
if (parsed.flags.has("to") || parsed.flags.has("parent") || parsed.flags.has("reason") || parsed.flags.has("instruction")) {
|
|
165
162
|
throw new Error("--to, --parent, --reason, and --instruction are resource-only options.");
|
|
@@ -167,7 +164,6 @@ export function parseAddSkillCommandArgs(args: string): AddSkillCommandArgs {
|
|
|
167
164
|
return {
|
|
168
165
|
source,
|
|
169
166
|
wait: getBoolFlag(parsed.flags, "wait"),
|
|
170
|
-
timeout: getNumberFlag(parsed.flags, "timeout"),
|
|
171
167
|
};
|
|
172
168
|
}
|
|
173
169
|
|
|
@@ -21,14 +21,12 @@ export type AddResourceCommandInput = {
|
|
|
21
21
|
reason?: string;
|
|
22
22
|
instruction?: string;
|
|
23
23
|
wait?: boolean;
|
|
24
|
-
timeout?: number;
|
|
25
24
|
};
|
|
26
25
|
|
|
27
26
|
export type AddSkillCommandInput = {
|
|
28
27
|
source?: string;
|
|
29
28
|
data?: unknown;
|
|
30
29
|
wait?: boolean;
|
|
31
|
-
timeout?: number;
|
|
32
30
|
};
|
|
33
31
|
|
|
34
32
|
export type OVSearchCommandInput = {
|
|
@@ -12,14 +12,12 @@ export type OpenVikingImportRuntimeResourceInput = {
|
|
|
12
12
|
reason?: string;
|
|
13
13
|
instruction?: string;
|
|
14
14
|
wait?: boolean;
|
|
15
|
-
timeout?: number;
|
|
16
15
|
};
|
|
17
16
|
|
|
18
17
|
export type OpenVikingImportRuntimeSkillInput = {
|
|
19
18
|
source?: string;
|
|
20
19
|
data?: unknown;
|
|
21
20
|
wait?: boolean;
|
|
22
|
-
timeout?: number;
|
|
23
21
|
};
|
|
24
22
|
|
|
25
23
|
export type OpenVikingImportRuntimeToolResult = {
|
|
@@ -90,7 +88,6 @@ export function createOpenVikingImportRuntime(deps: OpenVikingImportRuntimeDeps)
|
|
|
90
88
|
reason: input.reason,
|
|
91
89
|
instruction: input.instruction,
|
|
92
90
|
wait: input.wait,
|
|
93
|
-
timeout: input.timeout,
|
|
94
91
|
}, agentId);
|
|
95
92
|
|
|
96
93
|
const addSkillOpenViking = (input: OpenVikingImportRuntimeSkillInput, agentId?: string) =>
|
|
@@ -98,7 +95,6 @@ export function createOpenVikingImportRuntime(deps: OpenVikingImportRuntimeDeps)
|
|
|
98
95
|
path: input.source,
|
|
99
96
|
data: input.data,
|
|
100
97
|
wait: input.wait,
|
|
101
|
-
timeout: input.timeout,
|
|
102
98
|
}, agentId);
|
|
103
99
|
|
|
104
100
|
return { addResourceOpenViking, addSkillOpenViking };
|
|
@@ -66,7 +66,6 @@ export function registerOpenVikingImportTools(deps: OpenVikingImportToolsDeps):
|
|
|
66
66
|
reason: Type.Optional(Type.String({ description: "Reason or note for adding this resource" })),
|
|
67
67
|
instruction: Type.Optional(Type.String({ description: "Processing instruction for semantic extraction" })),
|
|
68
68
|
wait: Type.Optional(Type.Boolean({ description: "Wait for processing to complete" })),
|
|
69
|
-
timeout: Type.Optional(Type.Number({ description: "Timeout in seconds when wait is true" })),
|
|
70
69
|
}),
|
|
71
70
|
async execute(_toolCallId: string, params: Record<string, unknown>) {
|
|
72
71
|
if (deps.isBypassedSession(ctx)) {
|
|
@@ -81,7 +80,6 @@ export function registerOpenVikingImportTools(deps: OpenVikingImportToolsDeps):
|
|
|
81
80
|
reason: typeof params.reason === "string" ? params.reason : undefined,
|
|
82
81
|
instruction: typeof params.instruction === "string" ? params.instruction : undefined,
|
|
83
82
|
wait: typeof params.wait === "boolean" ? params.wait : undefined,
|
|
84
|
-
timeout: typeof params.timeout === "number" ? params.timeout : undefined,
|
|
85
83
|
}, session.actorPeerId);
|
|
86
84
|
return {
|
|
87
85
|
content: [{ type: "text" as const, text: formatResourceImportText(result) }],
|
|
@@ -107,7 +105,6 @@ export function registerOpenVikingImportTools(deps: OpenVikingImportToolsDeps):
|
|
|
107
105
|
source: Type.Optional(Type.String({ description: "Local SKILL.md path or skill directory path" })),
|
|
108
106
|
data: Type.Optional(Type.Any({ description: "Raw SKILL.md content or MCP tool dict" })),
|
|
109
107
|
wait: Type.Optional(Type.Boolean({ description: "Wait for processing to complete" })),
|
|
110
|
-
timeout: Type.Optional(Type.Number({ description: "Timeout in seconds when wait is true" })),
|
|
111
108
|
}),
|
|
112
109
|
async execute(_toolCallId: string, params: Record<string, unknown>) {
|
|
113
110
|
if (deps.isBypassedSession(ctx)) {
|
|
@@ -119,7 +116,6 @@ export function registerOpenVikingImportTools(deps: OpenVikingImportToolsDeps):
|
|
|
119
116
|
path: typeof params.source === "string" ? params.source : undefined,
|
|
120
117
|
data: params.data,
|
|
121
118
|
wait: typeof params.wait === "boolean" ? params.wait : undefined,
|
|
122
|
-
timeout: typeof params.timeout === "number" ? params.timeout : undefined,
|
|
123
119
|
}, session.actorPeerId);
|
|
124
120
|
return {
|
|
125
121
|
content: [{ type: "text" as const, text: formatSkillImportText(result) }],
|
|
@@ -27,9 +27,15 @@ Write a memory digest for a coding agent about to answer that query. Keep the
|
|
|
27
27
|
concrete facts (paths, identifiers, decisions, constraints); drop pleasantries
|
|
28
28
|
and conversational filler.
|
|
29
29
|
|
|
30
|
+
Report only facts found in the fragments; never restate the user query as a
|
|
31
|
+
fact. Do not tell the agent what to do with them: no advice, instructions,
|
|
32
|
+
warnings, or next steps of your own. Report a preference or rule as something
|
|
33
|
+
the user recorded, not as a command to the agent.
|
|
34
|
+
|
|
30
35
|
Format rules:
|
|
31
36
|
- Group related facts by topic, one bullet per topic, at most ${maxBullets} bullets.
|
|
32
37
|
- Start every bullet with "- ".
|
|
38
|
+
- Write in the language of the user query.
|
|
33
39
|
- End every bullet with its source, copied verbatim from the fragments above:
|
|
34
40
|
"来源:viking://..." or "source: viking://...". Never edit, shorten, or invent a URI.
|
|
35
41
|
- Output the digest body only. No preamble, no closing remark.
|
|
@@ -543,7 +543,6 @@ The agent-visible `add_resource` tool is disabled by default (`enableAddResource
|
|
|
543
543
|
| `reason` | No | Reason or note for import. |
|
|
544
544
|
| `instruction` | No | Processing instruction for semantic extraction. |
|
|
545
545
|
| `wait` | No | Wait for processing completion. |
|
|
546
|
-
| `timeout` | No | Timeout in seconds when `wait=true`. |
|
|
547
546
|
|
|
548
547
|
### `add_skill` — Import Agent Skill
|
|
549
548
|
|
|
@@ -552,7 +551,6 @@ The agent-visible `add_resource` tool is disabled by default (`enableAddResource
|
|
|
552
551
|
| `source` | No | Local `SKILL.md` path or skill directory. Exactly one of `source` or `data` is required. |
|
|
553
552
|
| `data` | No | Raw `SKILL.md` content or MCP tool dict. Exactly one of `source` or `data` is required. |
|
|
554
553
|
| `wait` | No | Wait for processing completion. |
|
|
555
|
-
| `timeout` | No | Timeout in seconds when `wait=true`. |
|
|
556
554
|
|
|
557
555
|
Agent Skill best practice: verify frontmatter has a precise `name`, a trigger-oriented `description`, useful `tags`, explicit scope boundaries, and concrete execution steps. Do not include secrets in skill content.
|
|
558
556
|
|
|
@@ -190,7 +190,6 @@ This agent tool is disabled by default. Prefer manual `/add-resource` for resour
|
|
|
190
190
|
| `reason` | No | Reason/note for import. |
|
|
191
191
|
| `instruction` | No | Processing instruction for semantic extraction. |
|
|
192
192
|
| `wait` | No | Wait for processing completion. |
|
|
193
|
-
| `timeout` | No | Timeout in seconds when `wait=true`. |
|
|
194
193
|
|
|
195
194
|
The current OpenClaw tool exposes the parameters above. The underlying client also supports server-facing resource options such as `strict`, `ignore_dirs`, `include`, `exclude`, and `preserve_structure` for command/internal paths; do not pass them to the tool unless the registered schema exposes them.
|
|
196
195
|
|
|
@@ -203,7 +202,6 @@ Import Agent Skills into `viking://~/skills/...`.
|
|
|
203
202
|
| `source` | No | Local `SKILL.md` path or skill directory. Exactly one of `source` or `data` is required. |
|
|
204
203
|
| `data` | No | Raw `SKILL.md` content or an MCP tool dict. Exactly one of `source` or `data` is required. |
|
|
205
204
|
| `wait` | No | Wait for processing completion. |
|
|
206
|
-
| `timeout` | No | Timeout in seconds when `wait=true`. |
|
|
207
205
|
|
|
208
206
|
Agent Skill best practice: a skill should have precise frontmatter (`name`, trigger-oriented `description`, useful `tags`), clear scope boundaries, explicit “when not to use” guidance if needed, and executable steps with concrete parameters. Keep secrets out of skill content.
|
|
209
207
|
|
|
@@ -258,7 +256,7 @@ The plugin refuses to read/search a tool-result ref from another session.
|
|
|
258
256
|
|
|
259
257
|
```text
|
|
260
258
|
/add-resource ./README.md --to viking://resources/openviking-readme --wait
|
|
261
|
-
/add-skill ./skills/install-openviking-memory --wait
|
|
259
|
+
/add-skill ./skills/install-openviking-memory --wait
|
|
262
260
|
/ov-search "OpenViking install" --uri viking://resources/openviking-readme --limit=5
|
|
263
261
|
/ov-recall-trace --turn latest --source auto_recall --include-content
|
|
264
262
|
```
|