@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 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
- requestTimeoutMs,
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
- requestTimeoutMs,
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() + (options.timeoutMs ?? DEFAULT_PHASE2_POLL_TIMEOUT_MS);
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) }, requestTimeoutMs, actorPeerId);
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) }, requestTimeoutMs, actorPeerId);
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() + (options.timeoutMs ?? DEFAULT_PHASE2_POLL_TIMEOUT_MS);
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] [--timeout SEC]");
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] [--timeout SEC]");
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.12",
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] [--timeout SEC]");
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] [--timeout SEC]");
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 --timeout=30
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
  ```