@linkmind_claw/openclaw-faq-kb 2.0.3 → 3.1.0

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.
@@ -1,10 +1,8 @@
1
1
  /**
2
- * faq_account_manage权限管理 tool
2
+ * Toolfaq_account_manage
3
3
  *
4
- * Admin 专用操作:
5
- * - grant_role: 授权用户角色和知识库范围
6
- * - list_users: 列出渠道用户
7
- * - my_info: 查看自己的身份和配额
4
+ * Admin-level account management for social-media channel users.
5
+ * Supports: grant_role, list_users, my_info.
8
6
  */
9
7
  import { Type } from "@sinclair/typebox";
10
8
  export const AccountManageParams = Type.Object({
@@ -12,78 +10,114 @@ export const AccountManageParams = Type.Object({
12
10
  Type.Literal("grant_role"),
13
11
  Type.Literal("list_users"),
14
12
  Type.Literal("my_info"),
15
- ], { description: "操作类型: grant_role / list_users / my_info" }),
16
- target_channel_user_id: Type.Optional(Type.String({ description: "目标用户渠道 ID(grant_role 必填)" })),
17
- target_channel_type: Type.Optional(Type.String({ description: "目标用户渠道类型(默认 telegram)" })),
13
+ ], {
14
+ description: "操作类型: grant_role=给用户授权, list_users=列出渠道用户, my_info=查看自己的身份信息",
15
+ }),
16
+ target_channel_user_id: Type.Optional(Type.String({
17
+ description: "目标用户的渠道 ID(grant_role 时必填)",
18
+ })),
19
+ target_channel_type: Type.Optional(Type.String({
20
+ description: "目标用户的渠道类型(默认 telegram)",
21
+ })),
18
22
  channel_bot_id: Type.Optional(Type.String({ description: "Bot 标识(默认 default)" })),
19
- role: Type.Optional(Type.String({ description: "要授予的角色: viewer / editor / reviewer / admin" })),
23
+ role: Type.Optional(Type.String({
24
+ description: "要授予的角色: viewer / editor / reviewer / admin(grant_role 时必填)",
25
+ })),
20
26
  kb_scope: Type.Optional(Type.Array(Type.String(), {
21
- description: "可访问的知识库 ID 列表(null=全部)",
27
+ description: "可访问的知识库 ID 列表,留空=全部(grant_role 时可选)",
22
28
  })),
23
29
  });
24
30
  export async function executeAccountManage(client, params) {
25
31
  switch (params.action) {
26
- case "grant_role": {
27
- if (!params.target_channel_user_id || !params.role) {
28
- return {
29
- content: [
30
- {
31
- type: "text",
32
- text: "grant_role 需要 target_channel_user_id 和 role 参数",
33
- },
34
- ],
35
- };
36
- }
37
- const res = await client.post("/auth/grant_role", {
38
- target_channel_user_id: params.target_channel_user_id,
39
- target_channel_type: params.target_channel_type ?? "telegram",
40
- channel_bot_id: params.channel_bot_id ?? "default",
41
- role: params.role,
42
- kb_scope: params.kb_scope ?? null,
43
- });
44
- return {
45
- content: [{ type: "text", text: res.message || "授权成功" }],
46
- };
47
- }
48
- case "list_users": {
49
- const qp = new URLSearchParams();
50
- if (params.target_channel_type)
51
- qp.set("channel_type", params.target_channel_type);
52
- if (params.channel_bot_id)
53
- qp.set("channel_bot_id", params.channel_bot_id);
54
- const res = await client.get(`/auth/channel_users?${qp.toString()}`);
55
- const users = res.data?.users ?? [];
56
- const lines = [`渠道用户列表(共 ${users.length} 人):`];
57
- for (const u of users) {
58
- const scope = u.kb_scope ? `[${u.kb_scope.length} 个 KB]` : "[全部]";
59
- lines.push(` ${u.name} 角色=${u.role} 渠道=${u.channel_type} 范围=${scope}`);
60
- }
61
- if (users.length === 0)
62
- lines.push(" (暂无用户)");
63
- return { content: [{ type: "text", text: lines.join("\n") }] };
64
- }
65
- case "my_info": {
66
- const res = await client.get("/oauth/me");
67
- const d = res.data;
68
- const lines = [
69
- "当前用户信息:",
70
- ` 用户 ID: ${d.user_id}`,
71
- ` 名称: ${d.name}`,
72
- ` 角色: ${d.role}`,
73
- ` 渠道: ${d.channel_type}`,
74
- ` 知识库范围: ${d.kb_scope ? JSON.stringify(d.kb_scope) : "全部"}`,
75
- ];
76
- return { content: [{ type: "text", text: lines.join("\n") }] };
77
- }
32
+ case "grant_role":
33
+ return doGrantRole(client, params);
34
+ case "list_users":
35
+ return doListUsers(client, params);
36
+ case "my_info":
37
+ return doMyInfo(client);
78
38
  default:
79
- return {
80
- content: [
81
- {
82
- type: "text",
83
- text: "未知操作,可选: grant_role / list_users / my_info",
84
- },
85
- ],
86
- };
39
+ return textResult(`[ERROR] 不支持的 action: ${params.action}`);
40
+ }
41
+ }
42
+ async function doGrantRole(client, p) {
43
+ if (!p.target_channel_user_id) {
44
+ return textResult("[ERROR] grant_role 需要提供 target_channel_user_id");
87
45
  }
46
+ if (!p.role) {
47
+ return textResult("[ERROR] grant_role 需要提供 role (viewer/editor/reviewer/admin)");
48
+ }
49
+ const res = await client.post("/auth/grant_role", {
50
+ target_channel_user_id: p.target_channel_user_id,
51
+ target_channel_type: p.target_channel_type ?? "telegram",
52
+ channel_bot_id: p.channel_bot_id ?? "default",
53
+ role: p.role,
54
+ kb_scope: p.kb_scope ?? null,
55
+ });
56
+ if (!res.success) {
57
+ return textResult(`[ERROR] 授权失败: ${res.message}`);
58
+ }
59
+ const d = res.data;
60
+ const lines = [
61
+ `授权成功!`,
62
+ ` 用户 : ${d.name} (${d.user_id})`,
63
+ ` 角色变更 : ${d.old_role} → ${d.new_role}`,
64
+ ];
65
+ if (d.kb_scope) {
66
+ lines.push(` 可访问知识库: ${d.kb_scope.join(", ")}`);
67
+ }
68
+ else {
69
+ lines.push(` 可访问知识库: 全部`);
70
+ }
71
+ return textResult(lines.join("\n"));
72
+ }
73
+ async function doListUsers(client, p) {
74
+ const qp = new URLSearchParams();
75
+ if (p.target_channel_type)
76
+ qp.set("channel_type", p.target_channel_type);
77
+ if (p.channel_bot_id)
78
+ qp.set("channel_bot_id", p.channel_bot_id);
79
+ const res = await client.get(`/auth/channel_users?${qp.toString()}`);
80
+ if (!res.success) {
81
+ return textResult(`[ERROR] 获取用户列表失败: ${res.message}`);
82
+ }
83
+ const { users, total } = res.data;
84
+ const lines = [`渠道用户列表(共 ${total} 人):`];
85
+ for (const u of users) {
86
+ const active = u.is_active ? "" : " [已停用]";
87
+ const scope = u.kb_scope ? `[${u.kb_scope.length} 个库]` : "[全部]";
88
+ lines.push(` ${u.channel_type}:${u.channel_user_id} ${u.name} ${u.role} ${scope}${active}`);
89
+ }
90
+ if (users.length === 0) {
91
+ lines.push(" (暂无渠道用户)");
92
+ }
93
+ return textResult(lines.join("\n"));
94
+ }
95
+ async function doMyInfo(client) {
96
+ const res = await client.get("/auth/me");
97
+ if (!res.success) {
98
+ return textResult(`[ERROR] 获取身份信息失败: ${res.message}`);
99
+ }
100
+ const d = res.data;
101
+ const lines = [
102
+ "当前身份信息:",
103
+ ` 用户 ID : ${d.id}`,
104
+ ` 名称 : ${d.name}`,
105
+ ` 角色 : ${d.role}`,
106
+ ` 可执行操作: ${d.allowed_actions.join(", ")}`,
107
+ ` 数据等级 : ${d.max_data_level}`,
108
+ ];
109
+ if (d.kb_scope) {
110
+ lines.push(` 可访问知识库: ${d.kb_scope.join(", ")}`);
111
+ }
112
+ else {
113
+ lines.push(` 可访问知识库: 全部`);
114
+ }
115
+ if (d.quota) {
116
+ lines.push(` 今日配额 : ${d.quota.today_used} / ${d.quota.daily_limit}(剩余 ${d.quota.remaining})`);
117
+ }
118
+ return textResult(lines.join("\n"));
119
+ }
120
+ function textResult(text) {
121
+ return { content: [{ type: "text", text }] };
88
122
  }
89
123
  //# sourceMappingURL=account-manage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"account-manage.js","sourceRoot":"","sources":["../../tools/account-manage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"account-manage.js","sourceRoot":"","sources":["../../tools/account-manage.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,28 @@
1
1
  /**
2
- * faq_account_registerOAuth 用户注册/登录
2
+ * Toolfaq_account_register
3
3
  *
4
- * 社媒用户首次使用时自动调用,完成 OAuth 注册并缓存 JWT。
4
+ * Auto-register or login a social-media channel user.
5
+ * Maps (channel_type, channel_user_id, channel_bot_id) to a local account
6
+ * in the api_users table. On first call creates the account; on subsequent
7
+ * calls returns the existing identity.
8
+ *
9
+ * The returned api_key (new users only) is automatically cached in the
10
+ * FaqKbApiClient so all future requests use user-level RBAC.
5
11
  */
6
12
  import { type Static } from "@sinclair/typebox";
7
13
  import type { FaqKbApiClient } from "../lib/api-client.js";
8
14
  export declare const AccountRegisterParams: import("@sinclair/typebox").TObject<{
9
15
  channel_type: import("@sinclair/typebox").TString;
10
16
  channel_user_id: import("@sinclair/typebox").TString;
11
- display_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
12
17
  channel_bot_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
18
+ display_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
19
+ role: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
13
20
  }>;
14
21
  export type AccountRegisterInput = Static<typeof AccountRegisterParams>;
15
22
  export declare function executeAccountRegister(client: FaqKbApiClient, params: AccountRegisterInput): Promise<{
16
- content: Array<{
23
+ content: {
17
24
  type: "text";
18
25
  text: string;
19
- }>;
26
+ }[];
20
27
  }>;
21
28
  //# sourceMappingURL=account-register.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"account-register.d.ts","sourceRoot":"","sources":["../../tools/account-register.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,sBAAsB,CAAC;AAE7E,eAAO,MAAM,qBAAqB;;;;;EAahC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAExE,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAoC7D"}
1
+ {"version":3,"file":"account-register.d.ts","sourceRoot":"","sources":["../../tools/account-register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAC;AAExE,eAAO,MAAM,qBAAqB;;;;;;EAoBhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAaxE,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,oBAAoB;;;;;GAuD7B"}
@@ -1,51 +1,74 @@
1
1
  /**
2
- * faq_account_registerOAuth 用户注册/登录
2
+ * Toolfaq_account_register
3
3
  *
4
- * 社媒用户首次使用时自动调用,完成 OAuth 注册并缓存 JWT。
4
+ * Auto-register or login a social-media channel user.
5
+ * Maps (channel_type, channel_user_id, channel_bot_id) to a local account
6
+ * in the api_users table. On first call creates the account; on subsequent
7
+ * calls returns the existing identity.
8
+ *
9
+ * The returned api_key (new users only) is automatically cached in the
10
+ * FaqKbApiClient so all future requests use user-level RBAC.
5
11
  */
6
12
  import { Type } from "@sinclair/typebox";
7
13
  export const AccountRegisterParams = Type.Object({
8
14
  channel_type: Type.String({
9
- description: "渠道类型: telegram / discord / slack / web",
15
+ description: "渠道类型: telegram / discord / slack / web / whatsapp / line",
10
16
  }),
11
17
  channel_user_id: Type.String({
12
18
  description: "渠道平台用户唯一标识(如 Telegram user ID)",
13
19
  }),
20
+ channel_bot_id: Type.Optional(Type.String({
21
+ description: "Bot 标识,区分同用户在不同 Bot 下的身份(默认 default)",
22
+ })),
14
23
  display_name: Type.Optional(Type.String({ description: "用户显示名称(可选)" })),
15
- channel_bot_id: Type.Optional(Type.String({ description: "Bot 标识,默认 default" })),
24
+ role: Type.Optional(Type.String({
25
+ description: "初始角色(仅首次注册生效): viewer / editor / admin。默认 viewer",
26
+ })),
16
27
  });
17
28
  export async function executeAccountRegister(client, params) {
18
- client.setSender(params.channel_user_id);
19
- if (client.hasUserToken(params.channel_user_id)) {
20
- return {
21
- content: [
22
- {
23
- type: "text",
24
- text: "✅ 你已经注册过了,无需重复操作。可以直接使用知识库功能。",
25
- },
26
- ],
27
- };
28
- }
29
- const result = await client.oauthLogin({
29
+ const botId = params.channel_bot_id || "default";
30
+ const res = await client.post("/auth/channel_register", {
30
31
  channel_type: params.channel_type,
31
32
  channel_user_id: params.channel_user_id,
32
- channel_bot_id: params.channel_bot_id ?? "default",
33
+ channel_bot_id: botId,
33
34
  display_name: params.display_name ?? "",
35
+ role: params.role ?? "viewer",
34
36
  });
37
+ if (!res.success) {
38
+ return textResult(`[ERROR] 注册/登录失败: ${res.message}`);
39
+ }
40
+ const d = res.data;
41
+ if (d.api_key) {
42
+ client.storeUserApiKey({
43
+ channelType: params.channel_type,
44
+ channelUserId: params.channel_user_id,
45
+ channelBotId: botId,
46
+ }, d.api_key);
47
+ }
35
48
  const lines = [];
36
- if (result.is_new) {
37
- lines.push("✅ 注册成功!已为你创建账号。");
38
- lines.push("");
39
- lines.push("现在你可以:");
40
- lines.push(" /faq_create <名称> <文档URL> — 创建知识库");
41
- lines.push(" /faq_list — 查看你的知识库");
42
- lines.push(" /faq_query <名称> <问题> — 提问");
49
+ if (d.is_new) {
50
+ lines.push("新用户注册成功!");
43
51
  }
44
52
  else {
45
- lines.push("✅ 欢迎回来!已自动登录。");
53
+ lines.push("欢迎回来(已有账号)");
54
+ }
55
+ lines.push(` 用户 ID : ${d.user_id}`);
56
+ lines.push(` 名称 : ${d.name}`);
57
+ lines.push(` 角色 : ${d.role}`);
58
+ lines.push(` 渠道 : ${d.channel_type}`);
59
+ if (d.kb_scope) {
60
+ lines.push(` 可访问知识库: ${d.kb_scope.join(", ")}`);
46
61
  }
47
- lines.push(` 用户 ID: ${result.user_id}`);
48
- lines.push(` 角色: ${result.role}`);
49
- return { content: [{ type: "text", text: lines.join("\n") }] };
62
+ else {
63
+ lines.push(` 可访问知识库: 全部`);
64
+ }
65
+ if (d.is_new) {
66
+ lines.push("");
67
+ lines.push("提示: 你的 API Key 已自动缓存,后续操作将使用你的身份进行鉴权。");
68
+ }
69
+ return textResult(lines.join("\n"));
70
+ }
71
+ function textResult(text) {
72
+ return { content: [{ type: "text", text }] };
50
73
  }
51
74
  //# sourceMappingURL=account-register.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"account-register.js","sourceRoot":"","sources":["../../tools/account-register.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAGtD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/C,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC;QACxB,WAAW,EAAE,wCAAwC;KACtD,CAAC;IACF,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC;QAC3B,WAAW,EAAE,gCAAgC;KAC9C,CAAC;IACF,YAAY,EAAE,IAAI,CAAC,QAAQ,CACzB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAC3C;IACD,cAAc,EAAE,IAAI,CAAC,QAAQ,CAC3B,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC,CAClD;CACF,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAsB,EACtB,MAA4B;IAE5B,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QAChD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,+BAA+B;iBACtC;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAqB,MAAM,MAAM,CAAC,UAAU,CAAC;QACvD,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,SAAS;QAClD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;KACxC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAEnC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAC1E,CAAC"}
1
+ {"version":3,"file":"account-register.js","sourceRoot":"","sources":["../../tools/account-register.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,14 @@
1
1
  /**
2
- * Tool — faq_kb_query
2
+ * Tool 2 — faq_kb_query
3
3
  *
4
- * Ask a question against a trained knowledge base.
5
- * Accepts either kb_id or kb_name (name preferred for UX).
4
+ * Ask a question against a trained knowledge base and get an
5
+ * AI-generated answer with source references.
6
6
  */
7
7
  import { type Static } from "@sinclair/typebox";
8
8
  import type { FaqKbApiClient } from "../lib/api-client.js";
9
9
  export declare const QueryParams: import("@sinclair/typebox").TObject<{
10
+ kb_id: import("@sinclair/typebox").TString;
10
11
  question: import("@sinclair/typebox").TString;
11
- kb_name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
12
- kb_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
13
12
  enable_polish: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
14
13
  user_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
15
14
  session_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
@@ -1 +1 @@
1
- {"version":3,"file":"query-kb.d.ts","sourceRoot":"","sources":["../../tools/query-kb.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAC;AAExE,eAAO,MAAM,WAAW;;;;;;;EAoBtB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAiBpD,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,UAAU;;;;;GAoEnB"}
1
+ {"version":3,"file":"query-kb.d.ts","sourceRoot":"","sources":["../../tools/query-kb.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAC;AAExE,eAAO,MAAM,WAAW;;;;;;EAetB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAcpD,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,UAAU;;;;;GAsCnB"}
@@ -1,14 +1,13 @@
1
1
  /**
2
- * Tool — faq_kb_query
2
+ * Tool 2 — faq_kb_query
3
3
  *
4
- * Ask a question against a trained knowledge base.
5
- * Accepts either kb_id or kb_name (name preferred for UX).
4
+ * Ask a question against a trained knowledge base and get an
5
+ * AI-generated answer with source references.
6
6
  */
7
7
  import { Type } from "@sinclair/typebox";
8
8
  export const QueryParams = Type.Object({
9
+ kb_id: Type.String({ description: "知识库 ID" }),
9
10
  question: Type.String({ description: "要查询的问题" }),
10
- kb_name: Type.Optional(Type.String({ description: "知识库名称(推荐,支持模糊匹配)" })),
11
- kb_id: Type.Optional(Type.String({ description: "知识库 ID(精确匹配,可选)" })),
12
11
  enable_polish: Type.Optional(Type.Boolean({
13
12
  description: "是否启用 LLM 综合分析(多 FAQ 融合生成更自然的答案)。默认 false",
14
13
  })),
@@ -16,42 +15,17 @@ export const QueryParams = Type.Object({
16
15
  session_id: Type.Optional(Type.String({ description: "会话 ID(用于上下文关联)" })),
17
16
  });
18
17
  export async function executeQuery(client, params) {
19
- if (!params.kb_id && !params.kb_name) {
20
- return textResult("请提供知识库名称(kb_name)或 ID(kb_id)");
21
- }
22
- let res;
23
- if (params.kb_name && !params.kb_id) {
24
- res = await client.post("/knowledge_bases/query_by_name", {
25
- kb_name: params.kb_name,
26
- question: params.question,
27
- enable_polish: params.enable_polish ?? false,
28
- user_id: params.user_id ?? null,
29
- session_id: params.session_id ?? null,
30
- });
31
- }
32
- else {
33
- res = await client.post(`/knowledge_bases/${params.kb_id}/query`, {
34
- question: params.question,
35
- enable_polish: params.enable_polish ?? false,
36
- user_id: params.user_id ?? null,
37
- session_id: params.session_id ?? null,
38
- });
39
- }
18
+ const res = await client.post(`/knowledge_bases/${params.kb_id}/query`, {
19
+ question: params.question,
20
+ enable_polish: params.enable_polish ?? false,
21
+ user_id: params.user_id ?? null,
22
+ session_id: params.session_id ?? null,
23
+ });
40
24
  if (!res.success) {
41
- const candidates = res.data?.candidates;
42
- if (candidates?.length) {
43
- const list = candidates
44
- .map((c) => ` • ${c.name} (ID: ${c.id})`)
45
- .join("\n");
46
- return textResult(`${res.message}\n\n可选知识库:\n${list}`);
47
- }
48
- return textResult(`[ERROR] ${res.message}`);
25
+ return textResult(`[ERROR] 问答失败: ${res.message}`);
49
26
  }
50
27
  const d = res.data;
51
28
  const lines = [];
52
- if (d.kb_name) {
53
- lines.push(`**知识库**: ${d.kb_name}`);
54
- }
55
29
  lines.push(`**答案**: ${d.answer || "(无答案)"}`);
56
30
  if (d.faq_data?.question) {
57
31
  lines.push(`**匹配问题**: ${d.faq_data.question}`);
@@ -1 +1 @@
1
- {"version":3,"file":"query-kb.js","sourceRoot":"","sources":["../../tools/query-kb.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-kb.js","sourceRoot":"","sources":["../../tools/query-kb.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAGtD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IAC7C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IAChD,aAAa,EAAE,IAAI,CAAC,QAAQ,CAC1B,IAAI,CAAC,OAAO,CAAC;QACX,WAAW,EACT,0CAA0C;KAC7C,CAAC,CACH;IACD,OAAO,EAAE,IAAI,CAAC,QAAQ,CACpB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAC/C;IACD,UAAU,EAAE,IAAI,CAAC,QAAQ,CACvB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAC/C;CACF,CAAC,CAAC;AAgBH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAsB,EACtB,MAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAC3B,oBAAoB,MAAM,CAAC,KAAK,QAAQ,EACxC;QACE,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,KAAK;QAC5C,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;KACtC,CACF,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,UAAU,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;IACnB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;IAE7C,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACxD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linkmind_claw/openclaw-faq-kb",
3
- "version": "2.0.3",
3
+ "version": "3.1.0",
4
4
  "description": "OpenClaw Plugin - FAQ Knowledge Base: one-click document training & intelligent Q&A",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -28,8 +28,8 @@
28
28
  "@sinclair/typebox": "^0.34.0"
29
29
  },
30
30
  "devDependencies": {
31
- "typescript": "^5.5.0",
31
+ "@types/node": "^22.0.0",
32
32
  "ts-node": "^10.9.0",
33
- "@types/node": "^22.0.0"
33
+ "typescript": "^5.9.3"
34
34
  }
35
35
  }