koishi-plugin-chatluna-toolbox 0.0.18 → 0.0.19

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.
Files changed (2) hide show
  1. package/lib/index.js +215 -61
  2. package/package.json +1 -1
package/lib/index.js CHANGED
@@ -421,6 +421,7 @@ __export(index_exports, {
421
421
  createLogger: () => createLogger,
422
422
  createPokeTool: () => createPokeTool,
423
423
  createRandomProvider: () => createRandomProvider,
424
+ createSearchGroupMemberTool: () => createSearchGroupMemberTool,
424
425
  createSetGroupBanTool: () => createSetGroupBanTool,
425
426
  createSetGroupCardTool: () => createSetGroupCardTool,
426
427
  createSetGroupSpecialTitleTool: () => createSetGroupSpecialTitleTool,
@@ -440,6 +441,7 @@ __export(index_exports, {
440
441
  registerVariables: () => registerVariables,
441
442
  registerXmlTools: () => registerXmlTools,
442
443
  resolveOneBotProtocol: () => resolveOneBotProtocol,
444
+ searchGroupMember: () => searchGroupMember,
443
445
  sendDeleteMessage: () => sendDeleteMessage,
444
446
  sendGroupBan: () => sendGroupBan,
445
447
  sendMsgEmoji: () => sendMsgEmoji,
@@ -472,6 +474,7 @@ var DEFAULT_POKE_TOOL_DESCRIPTION = "\u5BF9\u6307\u5B9A\u7528\u6237\u6267\u884C\
472
474
  var DEFAULT_SET_SELF_PROFILE_TOOL_DESCRIPTION = "\u4FEE\u6539\u81EA\u5DF1\u7684 QQ \u8D44\u6599\uFF0C\u53EF\u8BBE\u7F6E\u6635\u79F0\u3001\u7B7E\u540D\u548C\u6027\u522B\u3002";
473
475
  var DEFAULT_SET_QQ_AVATAR_TOOL_DESCRIPTION = "\u4FEE\u6539\u673A\u5668\u4EBA QQ \u5934\u50CF\u3002\u63D0\u4F9B imageUrl\uFF1BHTTP/HTTPS \u56FE\u7247\u4F1A\u5148\u7531 Koishi \u8BFB\u53D6\u5E76\u8F6C\u4E3A OneBot base64 \u6587\u4EF6\uFF0C\u907F\u514D\u4E34\u65F6 URL \u8FC7\u671F\u6216 OneBot \u7AEF\u65E0\u6CD5\u8BBF\u95EE\u3002";
474
476
  var DEFAULT_SET_GROUP_CARD_TOOL_DESCRIPTION = "\u4FEE\u6539\u7FA4\u6210\u5458\u7684\u7FA4\u6635\u79F0\u3002";
477
+ var DEFAULT_SEARCH_GROUP_MEMBER_TOOL_DESCRIPTION = "\u6839\u636E qqid \u7CBE\u786E\u67E5\u8BE2\u7FA4\u6210\u5458\u7684\u7FA4\u6635\u79F0\u4E0E QQ \u6635\u79F0\uFF0C\u6216\u6839\u636E\u7FA4\u6635\u79F0/QQ \u6635\u79F0\u641C\u7D22 qqid\u3002\u9ED8\u8BA4\u67E5\u8BE2\u5F53\u524D\u7FA4\u804A\uFF0C\u53EF\u901A\u8FC7 groupId \u67E5\u8BE2\u6307\u5B9A\u7FA4\u3002";
475
478
  var DEFAULT_SET_GROUP_BAN_TOOL_DESCRIPTION = "\u7528\u4E8E\u7BA1\u7406\u7FA4\u6210\u5458\u7981\u8A00\u72B6\u6001\uFF0C\u53EF\u8BBE\u7F6E\u7981\u8A00\u65F6\u957F\u6216\u89E3\u9664\u7981\u8A00\u3002";
476
479
  var DEFAULT_SET_GROUP_SPECIAL_TITLE_TOOL_DESCRIPTION = "\u4FEE\u6539\u6216\u6E05\u9664\u7FA4\u6210\u5458\u7684 QQ \u7FA4\u4E13\u5C5E\u5934\u8854\u3002";
477
480
  var DEFAULT_SET_MSG_EMOJI_TOOL_DESCRIPTION = "\u5BF9\u6307\u5B9A\u6D88\u606F\u6DFB\u52A0\u8868\u60C5\u56DE\u5E94\u3002";
@@ -484,6 +487,7 @@ var EnabledNativeToolsSchema = import_koishi2.Schema.array(
484
487
  import_koishi2.Schema.const("setSelfProfile").description("\u4FEE\u6539\u81EA\u8EAB\u8D26\u6237\u4FE1\u606F"),
485
488
  import_koishi2.Schema.const("setQQAvatar").description("\u4FEE\u6539 QQ \u5934\u50CF"),
486
489
  import_koishi2.Schema.const("setGroupCard").description("\u4FEE\u6539\u7FA4\u6210\u5458\u6635\u79F0"),
490
+ import_koishi2.Schema.const("searchGroupMember").description("\u641C\u7D22\u7FA4\u6210\u5458"),
487
491
  import_koishi2.Schema.const("setGroupBan").description("\u7981\u8A00\u7FA4\u6210\u5458"),
488
492
  import_koishi2.Schema.const("setGroupSpecialTitle").description("\u4FEE\u6539\u7FA4\u6210\u5458\u4E13\u5C5E\u5934\u8854"),
489
493
  import_koishi2.Schema.const("setMsgEmoji").description("\u6D88\u606F\u8868\u60C5"),
@@ -513,6 +517,11 @@ var NativeToolAdvancedSettingsSchema = import_koishi2.Schema.object({
513
517
  toolName: import_koishi2.Schema.string().default("set_group_card").description("\u5DE5\u5177\u540D\u79F0"),
514
518
  description: import_koishi2.Schema.string().default(DEFAULT_SET_GROUP_CARD_TOOL_DESCRIPTION).description("\u5DE5\u5177\u63CF\u8FF0")
515
519
  }).description("\u4FEE\u6539\u7FA4\u6210\u5458\u6635\u79F0\u5DE5\u5177").collapse(),
520
+ searchGroupMember: import_koishi2.Schema.object({
521
+ enabled: import_koishi2.Schema.boolean().default(false).hidden(),
522
+ toolName: import_koishi2.Schema.string().default("search_group_member").description("\u5DE5\u5177\u540D\u79F0"),
523
+ description: import_koishi2.Schema.string().default(DEFAULT_SEARCH_GROUP_MEMBER_TOOL_DESCRIPTION).description("\u5DE5\u5177\u63CF\u8FF0")
524
+ }).description("\u641C\u7D22\u7FA4\u6210\u5458\u5DE5\u5177").collapse(),
516
525
  setGroupBan: import_koishi2.Schema.object({
517
526
  enabled: import_koishi2.Schema.boolean().default(false).hidden(),
518
527
  toolName: import_koishi2.Schema.string().default("set_group_ban").description("\u5DE5\u5177\u540D\u79F0"),
@@ -904,10 +913,135 @@ function createPokeTool(deps) {
904
913
  }();
905
914
  }
906
915
 
907
- // src/features/native-tools/tools/set-group-ban.ts
916
+ // src/features/native-tools/tools/search-group-member.ts
908
917
  var import_zod3 = require("zod");
909
918
  var import_tools3 = require("@langchain/core/tools");
919
+ var MAX_RESULTS = 10;
920
+ function pickFirst(...values) {
921
+ for (const value of values) {
922
+ if (value === null || value === void 0) continue;
923
+ const text = String(value).trim();
924
+ if (text) return text;
925
+ }
926
+ return "";
927
+ }
910
928
  function resolveGroupId(session, groupId) {
929
+ return groupId?.trim() || session.guildId?.trim() || (session.event?.guild?.id || "");
930
+ }
931
+ function normalizeId(value) {
932
+ return /^\d+$/.test(value) ? Number(value) : value;
933
+ }
934
+ function getUserId(member) {
935
+ return pickFirst(
936
+ member.user_id,
937
+ member.userId,
938
+ member.id,
939
+ member.qq,
940
+ member.uid
941
+ );
942
+ }
943
+ function getGroupCard(member) {
944
+ return pickFirst(member.card, member.remark, member.displayName);
945
+ }
946
+ function getNickname(member) {
947
+ return pickFirst(
948
+ member.nick,
949
+ member.nickname,
950
+ member.name,
951
+ member.user?.nickname,
952
+ member.user?.name
953
+ );
954
+ }
955
+ function matchByName(member, query) {
956
+ const keyword = query.toLowerCase();
957
+ return [getGroupCard(member), getNickname(member)].filter(Boolean).some((value) => value.toLowerCase().includes(keyword));
958
+ }
959
+ async function fetchGroupMembers(session, groupId) {
960
+ const internal = session.bot.internal;
961
+ if (!internal) return [];
962
+ if (typeof internal.getGroupMemberList === "function") {
963
+ const result = await internal.getGroupMemberList(normalizeId(groupId));
964
+ return Array.isArray(result) ? result : [];
965
+ }
966
+ if (typeof internal._request === "function") {
967
+ const result = await internal._request("get_group_member_list", {
968
+ group_id: normalizeId(groupId)
969
+ });
970
+ if (Array.isArray(result)) return result;
971
+ const data = result?.data;
972
+ return Array.isArray(data) ? data : [];
973
+ }
974
+ throw new Error("\u5F53\u524D OneBot \u9002\u914D\u5668\u4E0D\u652F\u6301 get_group_member_list \u63A5\u53E3\u3002");
975
+ }
976
+ function formatMember(index, member) {
977
+ const userId = getUserId(member) || "\u672A\u77E5";
978
+ const groupCard = getGroupCard(member) || "\u65E0";
979
+ const nickname = getNickname(member) || "\u65E0";
980
+ return `${index}. qqid\uFF1A${userId}\uFF0C\u7FA4\u6635\u79F0\uFF1A${groupCard}\uFF0CQQ\u6635\u79F0\uFF1A${nickname}`;
981
+ }
982
+ async function searchGroupMember(params) {
983
+ try {
984
+ const { session, query, groupId, log } = params;
985
+ const mode = params.mode || "auto";
986
+ if (!["auto", "byName", "byQQ"].includes(mode)) {
987
+ return "mode must be auto, byName, or byQQ.";
988
+ }
989
+ const queryText = query.trim();
990
+ if (!queryText) return "query is required.";
991
+ const {
992
+ error,
993
+ session: validatedSession
994
+ } = ensureOneBotSession(session);
995
+ if (error) return error;
996
+ const resolvedGroupId = resolveGroupId(validatedSession, groupId);
997
+ if (!resolvedGroupId) {
998
+ return "Missing groupId. Provide groupId explicitly or run inside a group session.";
999
+ }
1000
+ const members = await fetchGroupMembers(validatedSession, resolvedGroupId);
1001
+ const shouldSearchQQ = mode === "byQQ" || mode === "auto" && /^\d+$/.test(queryText);
1002
+ const matches = members.filter(
1003
+ (member) => shouldSearchQQ ? getUserId(member) === queryText : matchByName(member, queryText)
1004
+ );
1005
+ if (matches.length === 0) return "\u672A\u627E\u5230\u5339\u914D\u7684\u7FA4\u6210\u5458\u3002";
1006
+ const visibleMatches = matches.slice(0, MAX_RESULTS);
1007
+ const header = matches.length > MAX_RESULTS ? `\u4EC5\u663E\u793A\u524D ${MAX_RESULTS} \u6761\uFF0C\u5171 ${matches.length} \u6761\u5339\u914D\uFF1A` : `\u627E\u5230 ${matches.length} \u4E2A\u5339\u914D\u6210\u5458\uFF1A`;
1008
+ const message = [
1009
+ header,
1010
+ ...visibleMatches.map((member, index) => formatMember(index + 1, member))
1011
+ ].join("\n");
1012
+ log?.("info", `\u7FA4 ${resolvedGroupId} \u6210\u5458\u641C\u7D22\u5B8C\u6210\uFF1A${matches.length} \u6761\u5339\u914D`);
1013
+ return message;
1014
+ } catch (error) {
1015
+ params.log?.("warn", "search_group_member failed", error);
1016
+ return `search_group_member failed: ${error.message}`;
1017
+ }
1018
+ }
1019
+ function createSearchGroupMemberTool(deps) {
1020
+ const { toolName, description, log } = deps;
1021
+ return new class extends import_tools3.StructuredTool {
1022
+ name = toolName || "search_group_member";
1023
+ description = description || DEFAULT_SEARCH_GROUP_MEMBER_TOOL_DESCRIPTION;
1024
+ schema = import_zod3.z.object({
1025
+ groupId: import_zod3.z.string().optional().describe("Target group ID. Defaults to current session group."),
1026
+ query: import_zod3.z.string().min(1, "query is required").describe("qqid, group card, or QQ nickname to search."),
1027
+ mode: import_zod3.z.enum(["auto", "byName", "byQQ"]).optional().describe("Search mode. Defaults to auto.")
1028
+ });
1029
+ async _call(input, _manager, runnable) {
1030
+ return searchGroupMember({
1031
+ session: getSession(runnable),
1032
+ groupId: input.groupId,
1033
+ query: input.query,
1034
+ mode: input.mode,
1035
+ log
1036
+ });
1037
+ }
1038
+ }();
1039
+ }
1040
+
1041
+ // src/features/native-tools/tools/set-group-ban.ts
1042
+ var import_zod4 = require("zod");
1043
+ var import_tools4 = require("@langchain/core/tools");
1044
+ function resolveGroupId2(session, groupId) {
911
1045
  return groupId?.trim() || (session.guildId || "").trim() || (session.channelId || "").trim() || (session.roomId || "").trim();
912
1046
  }
913
1047
  function parseDuration(duration) {
@@ -926,7 +1060,7 @@ async function sendGroupBan(params) {
926
1060
  session: validatedSession
927
1061
  } = ensureOneBotSession(session);
928
1062
  if (error) return error;
929
- const resolvedGroupId = resolveGroupId(validatedSession, groupId);
1063
+ const resolvedGroupId = resolveGroupId2(validatedSession, groupId);
930
1064
  if (!resolvedGroupId) {
931
1065
  return "Missing groupId. Provide groupId explicitly or run inside a group session.";
932
1066
  }
@@ -956,13 +1090,13 @@ async function sendGroupBan(params) {
956
1090
  }
957
1091
  function createSetGroupBanTool(deps) {
958
1092
  const { toolName, description, protocol, log } = deps;
959
- return new class extends import_tools3.StructuredTool {
1093
+ return new class extends import_tools4.StructuredTool {
960
1094
  name = toolName || "set_group_ban";
961
1095
  description = description || DEFAULT_SET_GROUP_BAN_TOOL_DESCRIPTION;
962
- schema = import_zod3.z.object({
963
- groupId: import_zod3.z.string().optional().describe("Target group ID. Defaults to current session group."),
964
- userId: import_zod3.z.string().min(1, "userId is required").describe("Target member user ID."),
965
- duration: import_zod3.z.union([import_zod3.z.string(), import_zod3.z.number().int().min(0)]).describe("Mute duration in seconds. Use 0 to unmute.")
1096
+ schema = import_zod4.z.object({
1097
+ groupId: import_zod4.z.string().optional().describe("Target group ID. Defaults to current session group."),
1098
+ userId: import_zod4.z.string().min(1, "userId is required").describe("Target member user ID."),
1099
+ duration: import_zod4.z.union([import_zod4.z.string(), import_zod4.z.number().int().min(0)]).describe("Mute duration in seconds. Use 0 to unmute.")
966
1100
  });
967
1101
  async _call(input, _manager, runnable) {
968
1102
  const session = getSession(runnable);
@@ -979,8 +1113,8 @@ function createSetGroupBanTool(deps) {
979
1113
  }
980
1114
 
981
1115
  // src/features/native-tools/tools/set-group-card.ts
982
- var import_zod4 = require("zod");
983
- var import_tools4 = require("@langchain/core/tools");
1116
+ var import_zod5 = require("zod");
1117
+ var import_tools5 = require("@langchain/core/tools");
984
1118
  async function sendSetGroupCard(params) {
985
1119
  try {
986
1120
  const { session, userId, card, groupId, log } = params;
@@ -1011,13 +1145,13 @@ async function sendSetGroupCard(params) {
1011
1145
  }
1012
1146
  function createSetGroupCardTool(deps) {
1013
1147
  const { toolName, description, log } = deps;
1014
- return new class extends import_tools4.StructuredTool {
1148
+ return new class extends import_tools5.StructuredTool {
1015
1149
  name = toolName || "set_group_card";
1016
1150
  description = description || DEFAULT_SET_GROUP_CARD_TOOL_DESCRIPTION;
1017
- schema = import_zod4.z.object({
1018
- groupId: import_zod4.z.string().optional().describe("Target group ID. Defaults to current session group."),
1019
- userId: import_zod4.z.string().min(1, "userId is required").describe("Target member user ID."),
1020
- card: import_zod4.z.string().min(1, "card is required").describe("New group card for the member.")
1151
+ schema = import_zod5.z.object({
1152
+ groupId: import_zod5.z.string().optional().describe("Target group ID. Defaults to current session group."),
1153
+ userId: import_zod5.z.string().min(1, "userId is required").describe("Target member user ID."),
1154
+ card: import_zod5.z.string().min(1, "card is required").describe("New group card for the member.")
1021
1155
  });
1022
1156
  async _call(input, _manager, runnable) {
1023
1157
  return sendSetGroupCard({
@@ -1032,9 +1166,9 @@ function createSetGroupCardTool(deps) {
1032
1166
  }
1033
1167
 
1034
1168
  // src/features/native-tools/tools/set-group-special-title.ts
1035
- var import_zod5 = require("zod");
1036
- var import_tools5 = require("@langchain/core/tools");
1037
- function resolveGroupId2(session, groupId) {
1169
+ var import_zod6 = require("zod");
1170
+ var import_tools6 = require("@langchain/core/tools");
1171
+ function resolveGroupId3(session, groupId) {
1038
1172
  return groupId?.trim() || (session.guildId || "").trim() || (session.channelId || "").trim() || (session.roomId || "").trim();
1039
1173
  }
1040
1174
  async function sendSetGroupSpecialTitle(params) {
@@ -1046,7 +1180,7 @@ async function sendSetGroupSpecialTitle(params) {
1046
1180
  session: validatedSession
1047
1181
  } = ensureOneBotSession(session);
1048
1182
  if (error) return error;
1049
- const resolvedGroupId = resolveGroupId2(validatedSession, groupId);
1183
+ const resolvedGroupId = resolveGroupId3(validatedSession, groupId);
1050
1184
  if (!resolvedGroupId) {
1051
1185
  return "Missing groupId. Provide groupId explicitly or run inside a group session.";
1052
1186
  }
@@ -1073,13 +1207,13 @@ async function sendSetGroupSpecialTitle(params) {
1073
1207
  }
1074
1208
  function createSetGroupSpecialTitleTool(deps) {
1075
1209
  const { toolName, description, protocol, log } = deps;
1076
- return new class extends import_tools5.StructuredTool {
1210
+ return new class extends import_tools6.StructuredTool {
1077
1211
  name = toolName || "set_group_special_title";
1078
1212
  description = description || DEFAULT_SET_GROUP_SPECIAL_TITLE_TOOL_DESCRIPTION;
1079
- schema = import_zod5.z.object({
1080
- groupId: import_zod5.z.string().optional().describe("Target group ID. Defaults to current session group."),
1081
- userId: import_zod5.z.string().min(1, "userId is required").describe("Target member user ID."),
1082
- title: import_zod5.z.string().describe("New special title. Use an empty string to clear it.")
1213
+ schema = import_zod6.z.object({
1214
+ groupId: import_zod6.z.string().optional().describe("Target group ID. Defaults to current session group."),
1215
+ userId: import_zod6.z.string().min(1, "userId is required").describe("Target member user ID."),
1216
+ title: import_zod6.z.string().describe("New special title. Use an empty string to clear it.")
1083
1217
  });
1084
1218
  async _call(input, _manager, runnable) {
1085
1219
  const session = getSession(runnable);
@@ -1096,8 +1230,8 @@ function createSetGroupSpecialTitleTool(deps) {
1096
1230
  }
1097
1231
 
1098
1232
  // src/features/native-tools/tools/set-msg-emoji.ts
1099
- var import_zod6 = require("zod");
1100
- var import_tools6 = require("@langchain/core/tools");
1233
+ var import_zod7 = require("zod");
1234
+ var import_tools7 = require("@langchain/core/tools");
1101
1235
  async function sendMsgEmoji(params) {
1102
1236
  try {
1103
1237
  const { session, messageId, emojiId, log, protocol } = params;
@@ -1128,12 +1262,12 @@ async function sendMsgEmoji(params) {
1128
1262
  }
1129
1263
  function createSetMsgEmojiTool(deps) {
1130
1264
  const { toolName, description, log, protocol } = deps;
1131
- return new class extends import_tools6.StructuredTool {
1265
+ return new class extends import_tools7.StructuredTool {
1132
1266
  name = toolName || "set_msg_emoji";
1133
1267
  description = description || DEFAULT_SET_MSG_EMOJI_TOOL_DESCRIPTION;
1134
- schema = import_zod6.z.object({
1135
- messageId: import_zod6.z.string().min(1, "message_id is required").describe("Target message ID."),
1136
- emojiId: import_zod6.z.string().min(1, "emoji_id is required").describe("Emoji ID to send.")
1268
+ schema = import_zod7.z.object({
1269
+ messageId: import_zod7.z.string().min(1, "message_id is required").describe("Target message ID."),
1270
+ emojiId: import_zod7.z.string().min(1, "emoji_id is required").describe("Emoji ID to send.")
1137
1271
  });
1138
1272
  async _call(input, _manager, runnable) {
1139
1273
  const session = getSession(runnable);
@@ -1149,8 +1283,8 @@ function createSetMsgEmojiTool(deps) {
1149
1283
  }
1150
1284
 
1151
1285
  // src/features/native-tools/tools/profile.ts
1152
- var import_zod7 = require("zod");
1153
- var import_tools7 = require("@langchain/core/tools");
1286
+ var import_zod8 = require("zod");
1287
+ var import_tools8 = require("@langchain/core/tools");
1154
1288
  var genders = {
1155
1289
  unknown: "0",
1156
1290
  male: "1",
@@ -1177,13 +1311,13 @@ async function sendSetProfile(params) {
1177
1311
  }
1178
1312
  function createSetProfileTool(deps) {
1179
1313
  const { toolName, description, log, protocol } = deps;
1180
- return new class extends import_tools7.StructuredTool {
1314
+ return new class extends import_tools8.StructuredTool {
1181
1315
  name = toolName || "set_self_profile";
1182
1316
  description = description || DEFAULT_SET_SELF_PROFILE_TOOL_DESCRIPTION;
1183
- schema = import_zod7.z.object({
1184
- nickname: import_zod7.z.string().min(1, "nickname is required").describe("The new nickname for the bot."),
1185
- signature: import_zod7.z.string().optional().describe("Optional: the new personal signature."),
1186
- gender: import_zod7.z.enum(["unknown", "male", "female"]).optional().describe("Optional: the new gender.")
1317
+ schema = import_zod8.z.object({
1318
+ nickname: import_zod8.z.string().min(1, "nickname is required").describe("The new nickname for the bot."),
1319
+ signature: import_zod8.z.string().optional().describe("Optional: the new personal signature."),
1320
+ gender: import_zod8.z.enum(["unknown", "male", "female"]).optional().describe("Optional: the new gender.")
1187
1321
  });
1188
1322
  async _call(input, _manager, runnable) {
1189
1323
  return sendSetProfile({
@@ -1199,8 +1333,8 @@ function createSetProfileTool(deps) {
1199
1333
  }
1200
1334
 
1201
1335
  // src/features/native-tools/tools/set-qq-avatar.ts
1202
- var import_zod8 = require("zod");
1203
- var import_tools8 = require("@langchain/core/tools");
1336
+ var import_zod9 = require("zod");
1337
+ var import_tools9 = require("@langchain/core/tools");
1204
1338
  function isHttpUrl(value) {
1205
1339
  return /^https?:\/\//i.test(value);
1206
1340
  }
@@ -1259,11 +1393,11 @@ async function sendSetQQAvatar(params) {
1259
1393
  }
1260
1394
  function createSetQQAvatarTool(deps) {
1261
1395
  const { ctx, toolName, description, log } = deps;
1262
- return new class extends import_tools8.StructuredTool {
1396
+ return new class extends import_tools9.StructuredTool {
1263
1397
  name = toolName || "set_qq_avatar";
1264
1398
  description = description || DEFAULT_SET_QQ_AVATAR_TOOL_DESCRIPTION;
1265
- schema = import_zod8.z.object({
1266
- imageUrl: import_zod8.z.string().min(1, "imageUrl is required").describe("Image URL or local file path readable by the OneBot side.")
1399
+ schema = import_zod9.z.object({
1400
+ imageUrl: import_zod9.z.string().min(1, "imageUrl is required").describe("Image URL or local file path readable by the OneBot side.")
1267
1401
  });
1268
1402
  async _call(input, _manager, runnable) {
1269
1403
  return sendSetQQAvatar({
@@ -1379,6 +1513,24 @@ function registerNativeTools(deps) {
1379
1513
  });
1380
1514
  log?.("info", `\u7FA4\u6635\u79F0\u5DE5\u5177\u5DF2\u6CE8\u518C: ${toolName}`);
1381
1515
  }
1516
+ if (isNativeToolEnabled(config, "searchGroupMember")) {
1517
+ const toolName = resolveToolName(
1518
+ config.searchGroupMember.toolName,
1519
+ "search_group_member"
1520
+ );
1521
+ const description = resolveToolDescription(
1522
+ config.searchGroupMember.description,
1523
+ DEFAULT_SEARCH_GROUP_MEMBER_TOOL_DESCRIPTION
1524
+ );
1525
+ plugin.registerTool(toolName, {
1526
+ selector: () => true,
1527
+ authorization: (session) => session?.platform === "onebot",
1528
+ description,
1529
+ createTool: () => createSearchGroupMemberTool({ toolName, description, log }),
1530
+ meta: createNativeToolMeta("onebot", ["group"])
1531
+ });
1532
+ log?.("info", `\u7FA4\u6210\u5458\u641C\u7D22\u5DE5\u5177\u5DF2\u6CE8\u518C: ${toolName}`);
1533
+ }
1382
1534
  if (isNativeToolEnabled(config, "setGroupBan")) {
1383
1535
  const toolName = resolveToolName(
1384
1536
  config.setGroupBan.toolName,
@@ -1849,7 +2001,7 @@ function registerXmlTools(deps) {
1849
2001
  }
1850
2002
 
1851
2003
  // src/features/variables/providers/bot-info.ts
1852
- function pickFirst(...values) {
2004
+ function pickFirst2(...values) {
1853
2005
  for (const value of values) {
1854
2006
  if (value === null || value === void 0) continue;
1855
2007
  const text = String(value).trim();
@@ -1936,7 +2088,7 @@ function renderBotInfo(session, member, items) {
1936
2088
  switch (item) {
1937
2089
  case "nickname": {
1938
2090
  const name2 = String(
1939
- pickFirst(
2091
+ pickFirst2(
1940
2092
  member?.card,
1941
2093
  member?.remark,
1942
2094
  member?.displayName,
@@ -1954,7 +2106,7 @@ function renderBotInfo(session, member, items) {
1954
2106
  break;
1955
2107
  case "role": {
1956
2108
  const role = normalizeRole(
1957
- pickFirst(
2109
+ pickFirst2(
1958
2110
  member?.role,
1959
2111
  member?.roleName,
1960
2112
  member?.permission,
@@ -1965,7 +2117,7 @@ function renderBotInfo(session, member, items) {
1965
2117
  break;
1966
2118
  }
1967
2119
  case "level": {
1968
- const level = pickFirst(
2120
+ const level = pickFirst2(
1969
2121
  member?.level,
1970
2122
  member?.levelName,
1971
2123
  member?.level_name,
@@ -1975,7 +2127,7 @@ function renderBotInfo(session, member, items) {
1975
2127
  break;
1976
2128
  }
1977
2129
  case "title": {
1978
- const title = pickFirst(
2130
+ const title = pickFirst2(
1979
2131
  member?.title,
1980
2132
  member?.specialTitle,
1981
2133
  member?.special_title
@@ -1994,14 +2146,14 @@ function renderBotInfo(session, member, items) {
1994
2146
  break;
1995
2147
  }
1996
2148
  case "area": {
1997
- const area = pickFirst(member?.area, member?.region, member?.location);
2149
+ const area = pickFirst2(member?.area, member?.region, member?.location);
1998
2150
  if (area !== null) values.push(`\u5730\u533A:${area}`);
1999
2151
  break;
2000
2152
  }
2001
2153
  case "joinTime": {
2002
2154
  const joinTime = formatDateOnly(
2003
2155
  normalizeTimestamp(
2004
- pickFirst(
2156
+ pickFirst2(
2005
2157
  member?.join_time,
2006
2158
  member?.joined_at,
2007
2159
  member?.joinTime,
@@ -2015,7 +2167,7 @@ function renderBotInfo(session, member, items) {
2015
2167
  case "lastSentTime": {
2016
2168
  const lastSentTime = formatDateTime(
2017
2169
  normalizeTimestamp(
2018
- pickFirst(
2170
+ pickFirst2(
2019
2171
  member?.last_sent_time,
2020
2172
  member?.lastSentTime,
2021
2173
  member?.lastSpeakTimestamp
@@ -2212,7 +2364,7 @@ function formatDateTime2(value) {
2212
2364
  if (Number.isNaN(date.valueOf())) return "\u672A\u77E5";
2213
2365
  return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")} ${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`;
2214
2366
  }
2215
- function pickFirst2(...values) {
2367
+ function pickFirst3(...values) {
2216
2368
  for (const value of values) {
2217
2369
  if (value === null || value === void 0) continue;
2218
2370
  const text = String(value).trim();
@@ -2221,12 +2373,12 @@ function pickFirst2(...values) {
2221
2373
  return "";
2222
2374
  }
2223
2375
  function normalizeShutItem(item) {
2224
- const userId = pickFirst2(
2376
+ const userId = pickFirst3(
2225
2377
  item.uin,
2226
2378
  item.user_id
2227
2379
  );
2228
2380
  if (!userId) return null;
2229
- const cardName = pickFirst2(
2381
+ const cardName = pickFirst3(
2230
2382
  item.cardName,
2231
2383
  item.remark,
2232
2384
  item.nick,
@@ -2235,7 +2387,7 @@ function normalizeShutItem(item) {
2235
2387
  );
2236
2388
  const shutUpTimeText = formatDateTime2(
2237
2389
  normalizeTimestamp2(
2238
- pickFirst2(
2390
+ pickFirst3(
2239
2391
  item.shutUpTime,
2240
2392
  item.shut_up_time
2241
2393
  )
@@ -2564,7 +2716,7 @@ function formatDateTime3(value) {
2564
2716
  if (Number.isNaN(date.valueOf())) return "";
2565
2717
  return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")} ${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`;
2566
2718
  }
2567
- function pickFirst3(...values) {
2719
+ function pickFirst4(...values) {
2568
2720
  for (const value of values) {
2569
2721
  if (value === null || value === void 0) continue;
2570
2722
  const text = String(value).trim();
@@ -2622,7 +2774,7 @@ function renderUserInfo(session, member, items) {
2622
2774
  switch (item) {
2623
2775
  case "nickname": {
2624
2776
  const name2 = String(
2625
- pickFirst3(
2777
+ pickFirst4(
2626
2778
  member?.card,
2627
2779
  member?.remark,
2628
2780
  member?.displayName,
@@ -2641,7 +2793,7 @@ function renderUserInfo(session, member, items) {
2641
2793
  break;
2642
2794
  case "role": {
2643
2795
  const role = normalizeRole2(
2644
- pickFirst3(
2796
+ pickFirst4(
2645
2797
  member?.role,
2646
2798
  member?.roleName,
2647
2799
  member?.permission,
@@ -2652,7 +2804,7 @@ function renderUserInfo(session, member, items) {
2652
2804
  break;
2653
2805
  }
2654
2806
  case "level": {
2655
- const level = pickFirst3(
2807
+ const level = pickFirst4(
2656
2808
  member?.level,
2657
2809
  member?.levelName,
2658
2810
  member?.level_name,
@@ -2662,7 +2814,7 @@ function renderUserInfo(session, member, items) {
2662
2814
  break;
2663
2815
  }
2664
2816
  case "title": {
2665
- const title = pickFirst3(
2817
+ const title = pickFirst4(
2666
2818
  member?.title,
2667
2819
  member?.specialTitle,
2668
2820
  member?.special_title
@@ -2681,14 +2833,14 @@ function renderUserInfo(session, member, items) {
2681
2833
  break;
2682
2834
  }
2683
2835
  case "area": {
2684
- const area = pickFirst3(member?.area, member?.region, member?.location);
2836
+ const area = pickFirst4(member?.area, member?.region, member?.location);
2685
2837
  if (area !== null) values.push(`\u5730\u533A:${area}`);
2686
2838
  break;
2687
2839
  }
2688
2840
  case "joinTime": {
2689
2841
  const joinTime = formatDateOnly3(
2690
2842
  normalizeTimestamp3(
2691
- pickFirst3(
2843
+ pickFirst4(
2692
2844
  member?.join_time,
2693
2845
  member?.joined_at,
2694
2846
  member?.joinTime,
@@ -2702,7 +2854,7 @@ function renderUserInfo(session, member, items) {
2702
2854
  case "lastSentTime": {
2703
2855
  const lastSentTime = formatDateTime3(
2704
2856
  normalizeTimestamp3(
2705
- pickFirst3(
2857
+ pickFirst4(
2706
2858
  member?.last_sent_time,
2707
2859
  member?.lastSentTime,
2708
2860
  member?.lastSpeakTimestamp
@@ -2875,6 +3027,7 @@ Character XML \u5DE5\u5177\u4EC5\u4F9B [koishi-plugin-chatluna-character](https:
2875
3027
  createLogger,
2876
3028
  createPokeTool,
2877
3029
  createRandomProvider,
3030
+ createSearchGroupMemberTool,
2878
3031
  createSetGroupBanTool,
2879
3032
  createSetGroupCardTool,
2880
3033
  createSetGroupSpecialTitleTool,
@@ -2894,6 +3047,7 @@ Character XML \u5DE5\u5177\u4EC5\u4F9B [koishi-plugin-chatluna-character](https:
2894
3047
  registerVariables,
2895
3048
  registerXmlTools,
2896
3049
  resolveOneBotProtocol,
3050
+ searchGroupMember,
2897
3051
  sendDeleteMessage,
2898
3052
  sendGroupBan,
2899
3053
  sendMsgEmoji,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-chatluna-toolbox",
3
3
  "description": "为 ChatLuna 提供更多原生工具、Character XML 工具与变量,仅支持 onebot 平台。",
4
- "version": "0.0.18",
4
+ "version": "0.0.19",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
7
7
  "files": [