























@@ -17,6 +17,49 @@ const WIKI_ACCESS_HINT =
1717"To grant wiki access: Open wiki space → Settings → Members → Add the bot. " +
1818"See: https://open.feishu.cn/document/server-docs/docs/wiki-v2/wiki-qa#a40ad4ca";
191920+function requireWikiSpaceId(value: unknown, fieldName: string): string {
21+if (typeof value !== "string") {
22+throw new Error(
23+`${fieldName} must be a string. Feishu wiki space IDs are opaque identifiers; pass them quoted to avoid JavaScript number precision loss.`,
24+);
25+}
26+27+const trimmed = value.trim();
28+if (!trimmed) {
29+throw new Error(`${fieldName} must not be empty.`);
30+}
31+32+return trimmed;
33+}
34+35+function optionalWikiSpaceId(value: unknown, fieldName: string): string | undefined {
36+if (value === undefined || value === null || value === "") {
37+return undefined;
38+}
39+return requireWikiSpaceId(value, fieldName);
40+}
41+42+function validateWikiSpaceIds(params: { action?: unknown } & Record<string, unknown>): {
43+spaceId?: string;
44+targetSpaceId?: string;
45+} {
46+switch (params.action) {
47+case "nodes":
48+case "create":
49+case "rename":
50+return { spaceId: requireWikiSpaceId(params.space_id, "space_id") };
51+case "move":
52+return {
53+spaceId: requireWikiSpaceId(params.space_id, "space_id"),
54+targetSpaceId: optionalWikiSpaceId(params.target_space_id, "target_space_id"),
55+};
56+case "search":
57+return { spaceId: optionalWikiSpaceId(params.space_id, "space_id") };
58+default:
59+return {};
60+}
61+}
62+2063async function listSpaces(client: Lark.Client) {
2164const res = await client.wiki.space.list({});
2265if (res.code !== 0) {
@@ -180,6 +223,9 @@ export function registerFeishuWikiTools(api: OpenClawPluginApi) {
180223async execute(_toolCallId, params) {
181224const p = params as FeishuWikiExecuteParams;
182225try {
226+const { spaceId, targetSpaceId } = validateWikiSpaceIds(
227+p as { action?: unknown } & Record<string, unknown>,
228+);
183229const client = createFeishuToolClient({
184230 api,
185231executeParams: p,
@@ -189,7 +235,7 @@ export function registerFeishuWikiTools(api: OpenClawPluginApi) {
189235case "spaces":
190236return jsonToolResult(await listSpaces(client));
191237case "nodes":
192-return jsonToolResult(await listNodes(client, p.space_id, p.parent_node_token));
238+return jsonToolResult(await listNodes(client, spaceId!, p.parent_node_token));
193239case "get":
194240return jsonToolResult(await getNode(client, p.token));
195241case "search":
@@ -199,20 +245,20 @@ export function registerFeishuWikiTools(api: OpenClawPluginApi) {
199245});
200246case "create":
201247return jsonToolResult(
202-await createNode(client, p.space_id, p.title, p.obj_type, p.parent_node_token),
248+await createNode(client, spaceId!, p.title, p.obj_type, p.parent_node_token),
203249);
204250case "move":
205251return jsonToolResult(
206252await moveNode(
207253client,
208-p.space_id,
254+spaceId!,
209255p.node_token,
210-p.target_space_id,
256+targetSpaceId,
211257p.target_parent_token,
212258),
213259);
214260case "rename":
215-return jsonToolResult(await renameNode(client, p.space_id, p.node_token, p.title));
261+return jsonToolResult(await renameNode(client, spaceId!, p.node_token, p.title));
216262default:
217263return unknownToolActionResult((p as { action?: unknown }).action);
218264}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。