koishi-plugin-chatluna-toolbox 0.0.9 → 0.0.11
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/lib/index.js +343 -57
- package/package.json +8 -9
package/lib/index.js
CHANGED
|
@@ -47,9 +47,11 @@ __export(index_exports, {
|
|
|
47
47
|
createXmlProcessor: () => createXmlProcessor,
|
|
48
48
|
ensureOneBotSession: () => ensureOneBotSession,
|
|
49
49
|
getSession: () => getSession,
|
|
50
|
+
hasReplyToolsEnabled: () => hasReplyToolsEnabled,
|
|
50
51
|
inject: () => inject,
|
|
51
52
|
name: () => name,
|
|
52
53
|
parseSelfClosingXmlTags: () => parseSelfClosingXmlTags,
|
|
54
|
+
registerCharacterReplyTools: () => registerCharacterReplyTools,
|
|
53
55
|
registerNativeTools: () => registerNativeTools,
|
|
54
56
|
registerVariables: () => registerVariables,
|
|
55
57
|
registerXmlTools: () => registerXmlTools,
|
|
@@ -57,7 +59,9 @@ __export(index_exports, {
|
|
|
57
59
|
sendDeleteMessage: () => sendDeleteMessage,
|
|
58
60
|
sendGroupBan: () => sendGroupBan,
|
|
59
61
|
sendMsgEmoji: () => sendMsgEmoji,
|
|
60
|
-
sendPoke: () => sendPoke
|
|
62
|
+
sendPoke: () => sendPoke,
|
|
63
|
+
sendSetGroupCard: () => sendSetGroupCard,
|
|
64
|
+
sendSetProfile: () => sendSetProfile
|
|
61
65
|
});
|
|
62
66
|
module.exports = __toCommonJS(index_exports);
|
|
63
67
|
|
|
@@ -195,6 +199,7 @@ var DEFAULT_XML_REFERENCE_PROMPT = `## \u52A8\u4F5C\u6307\u4EE4
|
|
|
195
199
|
</actions>
|
|
196
200
|
\`\`\``;
|
|
197
201
|
var XmlToolsSchema = import_koishi3.Schema.object({
|
|
202
|
+
injectXmlToolAsReplyTool: import_koishi3.Schema.boolean().default(false).description("\u5C06 XML \u5DE5\u5177\u6539\u4E3A\u6CE8\u5165\u5B9E\u9A8C\u6027\u201C\u5DE5\u5177\u8C03\u7528\u56DE\u590D\u201D\u7684\u53C2\u6570\u4E2D"),
|
|
198
203
|
enablePokeXmlTool: import_koishi3.Schema.boolean().default(false).description("\u542F\u7528 XML \u5F62\u5F0F\u7684\u6233\u4E00\u6233\u8C03\u7528\uFF08\u4E0E \u539F\u751F\u5DE5\u5177 \u4E8C\u9009\u4E00\uFF09"),
|
|
199
204
|
enableEmojiXmlTool: import_koishi3.Schema.boolean().default(false).description(
|
|
200
205
|
"\u542F\u7528 XML \u5F62\u5F0F\u7684\u6D88\u606F\u8868\u60C5\u8C03\u7528\uFF0C\uFF08\u9700 chatluna-character \u5F00\u542F enableMessageId\uFF0C\u4E0E \u539F\u751F\u5DE5\u5177 \u4E8C\u9009\u4E00\uFF0Cemoji_id \u5BF9\u7167\u8868\uFF1Ahttps://bot.q.qq.com/wiki/develop/pythonsdk/model/emoji.html \uFF09"
|
|
@@ -566,6 +571,34 @@ function createSetGroupBanTool(deps) {
|
|
|
566
571
|
// src/features/native-tools/tools/set-group-card.ts
|
|
567
572
|
var import_zod4 = require("zod");
|
|
568
573
|
var import_tools3 = require("@langchain/core/tools");
|
|
574
|
+
async function sendSetGroupCard(params) {
|
|
575
|
+
try {
|
|
576
|
+
const { session, userId, card, groupId, log } = params;
|
|
577
|
+
if (!session) return "No session context available.";
|
|
578
|
+
const resolvedGroupId = groupId?.trim() || (session.guildId ? String(session.guildId).trim() : "") || (session.channelId ? String(session.channelId).trim() : "");
|
|
579
|
+
if (!resolvedGroupId) {
|
|
580
|
+
return "Missing groupId. Provide groupId explicitly or run inside a group session.";
|
|
581
|
+
}
|
|
582
|
+
const userIdRaw = userId.trim();
|
|
583
|
+
const cardRaw = card.trim();
|
|
584
|
+
if (!userIdRaw) return "userId is required.";
|
|
585
|
+
if (!cardRaw) return "card is required.";
|
|
586
|
+
const { error, internal } = ensureOneBotSession(session);
|
|
587
|
+
if (error) return error;
|
|
588
|
+
await callOneBotAPI(
|
|
589
|
+
internal,
|
|
590
|
+
"set_group_card",
|
|
591
|
+
{ group_id: resolvedGroupId, user_id: userIdRaw, card: cardRaw },
|
|
592
|
+
["setGroupCard"]
|
|
593
|
+
);
|
|
594
|
+
const message = `\u7FA4\u6635\u79F0\u5DF2\u66F4\u65B0\uFF1A${userIdRaw} -> ${cardRaw}`;
|
|
595
|
+
log?.("info", message);
|
|
596
|
+
return message;
|
|
597
|
+
} catch (error) {
|
|
598
|
+
params.log?.("warn", "set_group_card failed", error);
|
|
599
|
+
return `set_group_card failed: ${error.message}`;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
569
602
|
function createSetGroupCardTool(deps) {
|
|
570
603
|
const { toolName, description, log } = deps;
|
|
571
604
|
return new class extends import_tools3.StructuredTool {
|
|
@@ -577,31 +610,13 @@ function createSetGroupCardTool(deps) {
|
|
|
577
610
|
card: import_zod4.z.string().min(1, "card is required").describe("New group card for the member.")
|
|
578
611
|
});
|
|
579
612
|
async _call(input, _manager, runnable) {
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
const card = input.card.trim();
|
|
588
|
-
if (!userId) return "userId is required.";
|
|
589
|
-
if (!card) return "card is required.";
|
|
590
|
-
const { error, internal } = ensureOneBotSession(session);
|
|
591
|
-
if (error) return error;
|
|
592
|
-
await callOneBotAPI(
|
|
593
|
-
internal,
|
|
594
|
-
"set_group_card",
|
|
595
|
-
{ group_id: groupId, user_id: userId, card },
|
|
596
|
-
["setGroupCard"]
|
|
597
|
-
);
|
|
598
|
-
const message = `\u7FA4\u6635\u79F0\u5DF2\u66F4\u65B0\uFF1A${userId} -> ${card}`;
|
|
599
|
-
log?.("info", message);
|
|
600
|
-
return message;
|
|
601
|
-
} catch (error) {
|
|
602
|
-
log?.("warn", "set_group_card failed", error);
|
|
603
|
-
return `set_group_card failed: ${error.message}`;
|
|
604
|
-
}
|
|
613
|
+
return sendSetGroupCard({
|
|
614
|
+
session: getSession(runnable),
|
|
615
|
+
groupId: input.groupId,
|
|
616
|
+
userId: input.userId,
|
|
617
|
+
card: input.card,
|
|
618
|
+
log
|
|
619
|
+
});
|
|
605
620
|
}
|
|
606
621
|
}();
|
|
607
622
|
}
|
|
@@ -625,12 +640,10 @@ async function sendMsgEmoji(params) {
|
|
|
625
640
|
const numericMessageId = /^\d+$/.test(messageIdRaw) ? Number(messageIdRaw) : messageIdRaw;
|
|
626
641
|
const { error, internal } = ensureOneBotSession(session);
|
|
627
642
|
if (error) return error;
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
"
|
|
631
|
-
|
|
632
|
-
["setMsgEmojiLike"]
|
|
633
|
-
);
|
|
643
|
+
const requestPayload = protocol === "napcat" ? { message_id: numericMessageId, emoji_id: emojiIdRaw, set: true } : { message_id: numericMessageId, emoji_id: emojiIdRaw };
|
|
644
|
+
await callOneBotAPI(internal, "set_msg_emoji_like", requestPayload, [
|
|
645
|
+
"setMsgEmojiLike"
|
|
646
|
+
]);
|
|
634
647
|
const success = `Emoji ${emojiIdRaw} sent to message ${messageIdRaw}.`;
|
|
635
648
|
log?.("info", success);
|
|
636
649
|
return success;
|
|
@@ -669,6 +682,25 @@ var genders = {
|
|
|
669
682
|
male: "1",
|
|
670
683
|
female: "2"
|
|
671
684
|
};
|
|
685
|
+
async function sendSetProfile(params) {
|
|
686
|
+
try {
|
|
687
|
+
const { session, nickname, signature, gender, protocol, log } = params;
|
|
688
|
+
const { error, internal } = ensureOneBotSession(session);
|
|
689
|
+
if (error) return error;
|
|
690
|
+
const payload = { nickname };
|
|
691
|
+
if (signature) payload.personal_note = signature;
|
|
692
|
+
if (gender && protocol !== "llbot") payload.sex = genders[gender];
|
|
693
|
+
await callOneBotAPI(internal, "set_qq_profile", payload, [
|
|
694
|
+
"setQQProfile"
|
|
695
|
+
]);
|
|
696
|
+
const message = "\u673A\u5668\u4EBA\u8D44\u6599\u5DF2\u66F4\u65B0\u3002";
|
|
697
|
+
log?.("info", message);
|
|
698
|
+
return message;
|
|
699
|
+
} catch (error) {
|
|
700
|
+
params.log?.("warn", "\u4FEE\u6539\u673A\u5668\u4EBA\u8D26\u6237\u4FE1\u606F\u5931\u8D25", error);
|
|
701
|
+
return `\u4FEE\u6539\u673A\u5668\u4EBA\u8D26\u6237\u4FE1\u606F\u5931\u8D25\uFF1A${error.message}`;
|
|
702
|
+
}
|
|
703
|
+
}
|
|
672
704
|
function createSetProfileTool(deps) {
|
|
673
705
|
const { toolName, description, log, protocol } = deps;
|
|
674
706
|
return new class extends import_tools5.StructuredTool {
|
|
@@ -680,24 +712,14 @@ function createSetProfileTool(deps) {
|
|
|
680
712
|
gender: import_zod6.z.enum(["unknown", "male", "female"]).optional().describe("Optional: the new gender.")
|
|
681
713
|
});
|
|
682
714
|
async _call(input, _manager, runnable) {
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
await callOneBotAPI(internal, "set_qq_profile", payload, [
|
|
692
|
-
"setQQProfile"
|
|
693
|
-
]);
|
|
694
|
-
const message = "\u673A\u5668\u4EBA\u8D44\u6599\u5DF2\u66F4\u65B0\u3002";
|
|
695
|
-
log?.("info", message);
|
|
696
|
-
return message;
|
|
697
|
-
} catch (error) {
|
|
698
|
-
log?.("warn", "\u4FEE\u6539\u673A\u5668\u4EBA\u8D26\u6237\u4FE1\u606F\u5931\u8D25", error);
|
|
699
|
-
return `\u4FEE\u6539\u673A\u5668\u4EBA\u8D26\u6237\u4FE1\u606F\u5931\u8D25\uFF1A${error.message}`;
|
|
700
|
-
}
|
|
715
|
+
return sendSetProfile({
|
|
716
|
+
session: getSession(runnable),
|
|
717
|
+
nickname: input.nickname,
|
|
718
|
+
signature: input.signature,
|
|
719
|
+
gender: input.gender,
|
|
720
|
+
protocol,
|
|
721
|
+
log
|
|
722
|
+
});
|
|
701
723
|
}
|
|
702
724
|
}();
|
|
703
725
|
}
|
|
@@ -818,6 +840,253 @@ function registerNativeTools(deps) {
|
|
|
818
840
|
}
|
|
819
841
|
}
|
|
820
842
|
|
|
843
|
+
// src/features/reply-tools/register.ts
|
|
844
|
+
function escapeAttr(value) {
|
|
845
|
+
return String(value ?? "").replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """);
|
|
846
|
+
}
|
|
847
|
+
function hasReplyToolsEnabled(config) {
|
|
848
|
+
return !!(config.injectXmlToolAsReplyTool && (config.enablePokeXmlTool || config.enableBanXmlTool || config.enableEmojiXmlTool || config.enableDeleteXmlTool));
|
|
849
|
+
}
|
|
850
|
+
function registerCharacterReplyTools(deps) {
|
|
851
|
+
const { ctx, config, protocol, log } = deps;
|
|
852
|
+
const service = ctx.chatluna_character;
|
|
853
|
+
if (!service?.registerReplyToolField) {
|
|
854
|
+
return () => {
|
|
855
|
+
};
|
|
856
|
+
}
|
|
857
|
+
const disposers = [];
|
|
858
|
+
if (config.injectXmlToolAsReplyTool && config.enablePokeXmlTool) {
|
|
859
|
+
disposers.push(
|
|
860
|
+
service.registerReplyToolField({
|
|
861
|
+
name: "toolbox_poke",
|
|
862
|
+
schema: {
|
|
863
|
+
type: "array",
|
|
864
|
+
description: "Poke one or more users after sending this reply. Each item is one poke action.",
|
|
865
|
+
items: {
|
|
866
|
+
type: "object",
|
|
867
|
+
properties: {
|
|
868
|
+
user_id: {
|
|
869
|
+
type: "string",
|
|
870
|
+
description: "Target user ID to poke."
|
|
871
|
+
},
|
|
872
|
+
group_id: {
|
|
873
|
+
type: "string",
|
|
874
|
+
description: "Optional target group ID. Defaults to the current session group."
|
|
875
|
+
}
|
|
876
|
+
},
|
|
877
|
+
required: ["user_id"]
|
|
878
|
+
}
|
|
879
|
+
},
|
|
880
|
+
async invoke(_, session, value) {
|
|
881
|
+
if (!Array.isArray(value)) return;
|
|
882
|
+
for (const item of value) {
|
|
883
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
884
|
+
continue;
|
|
885
|
+
}
|
|
886
|
+
const action = item;
|
|
887
|
+
if (typeof action.user_id !== "string") continue;
|
|
888
|
+
await sendPoke({
|
|
889
|
+
session,
|
|
890
|
+
userId: action.user_id,
|
|
891
|
+
groupId: typeof action.group_id === "string" ? action.group_id : void 0,
|
|
892
|
+
protocol,
|
|
893
|
+
log
|
|
894
|
+
});
|
|
895
|
+
}
|
|
896
|
+
},
|
|
897
|
+
render(_, __, value) {
|
|
898
|
+
if (!Array.isArray(value)) return;
|
|
899
|
+
return value.flatMap((item) => {
|
|
900
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
901
|
+
return [];
|
|
902
|
+
}
|
|
903
|
+
const action = item;
|
|
904
|
+
if (typeof action.user_id !== "string") return [];
|
|
905
|
+
const group = typeof action.group_id === "string" && action.group_id.trim() ? ` group_id="${escapeAttr(action.group_id)}"` : "";
|
|
906
|
+
return [`<poke id="${escapeAttr(action.user_id)}"${group} />`];
|
|
907
|
+
});
|
|
908
|
+
}
|
|
909
|
+
})
|
|
910
|
+
);
|
|
911
|
+
}
|
|
912
|
+
if (config.injectXmlToolAsReplyTool && config.enableBanXmlTool) {
|
|
913
|
+
disposers.push(
|
|
914
|
+
service.registerReplyToolField({
|
|
915
|
+
name: "toolbox_set_group_ban",
|
|
916
|
+
schema: {
|
|
917
|
+
type: "array",
|
|
918
|
+
description: "Mute or unmute one or more users after this reply. Each item is one group ban action.",
|
|
919
|
+
items: {
|
|
920
|
+
type: "object",
|
|
921
|
+
properties: {
|
|
922
|
+
user_id: {
|
|
923
|
+
type: "string",
|
|
924
|
+
description: "Target member user ID."
|
|
925
|
+
},
|
|
926
|
+
duration: {
|
|
927
|
+
type: "number",
|
|
928
|
+
description: "Mute duration in seconds. Use 0 to unmute the member."
|
|
929
|
+
},
|
|
930
|
+
group_id: {
|
|
931
|
+
type: "string",
|
|
932
|
+
description: "Optional target group ID. Defaults to the current session group."
|
|
933
|
+
}
|
|
934
|
+
},
|
|
935
|
+
required: ["user_id", "duration"]
|
|
936
|
+
}
|
|
937
|
+
},
|
|
938
|
+
async invoke(_, session, value) {
|
|
939
|
+
if (!Array.isArray(value)) return;
|
|
940
|
+
for (const item of value) {
|
|
941
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
942
|
+
continue;
|
|
943
|
+
}
|
|
944
|
+
const action = item;
|
|
945
|
+
if (typeof action.user_id !== "string") continue;
|
|
946
|
+
await sendGroupBan({
|
|
947
|
+
session,
|
|
948
|
+
userId: action.user_id,
|
|
949
|
+
duration: typeof action.duration === "number" || typeof action.duration === "string" ? action.duration : "",
|
|
950
|
+
groupId: typeof action.group_id === "string" ? action.group_id : void 0,
|
|
951
|
+
protocol,
|
|
952
|
+
log
|
|
953
|
+
});
|
|
954
|
+
}
|
|
955
|
+
},
|
|
956
|
+
render(_, __, value) {
|
|
957
|
+
if (!Array.isArray(value)) return;
|
|
958
|
+
return value.flatMap((item) => {
|
|
959
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
960
|
+
return [];
|
|
961
|
+
}
|
|
962
|
+
const action = item;
|
|
963
|
+
if (typeof action.user_id !== "string") return [];
|
|
964
|
+
const duration = typeof action.duration === "number" || typeof action.duration === "string" ? String(action.duration) : "";
|
|
965
|
+
if (!duration) return [];
|
|
966
|
+
const group = typeof action.group_id === "string" && action.group_id.trim() ? ` group_id="${escapeAttr(action.group_id)}"` : "";
|
|
967
|
+
return [
|
|
968
|
+
`<ban id="${escapeAttr(action.user_id)}" duration="${escapeAttr(duration)}"${group} />`
|
|
969
|
+
];
|
|
970
|
+
});
|
|
971
|
+
}
|
|
972
|
+
})
|
|
973
|
+
);
|
|
974
|
+
}
|
|
975
|
+
if (config.injectXmlToolAsReplyTool && config.enableEmojiXmlTool) {
|
|
976
|
+
disposers.push(
|
|
977
|
+
service.registerReplyToolField({
|
|
978
|
+
name: "toolbox_set_msg_emoji",
|
|
979
|
+
schema: {
|
|
980
|
+
type: "array",
|
|
981
|
+
description: "Add emoji reactions to one or more messages after this reply. Each item is one emoji action.",
|
|
982
|
+
items: {
|
|
983
|
+
type: "object",
|
|
984
|
+
properties: {
|
|
985
|
+
message_id: {
|
|
986
|
+
type: "string",
|
|
987
|
+
description: "Target message ID."
|
|
988
|
+
},
|
|
989
|
+
emoji_id: {
|
|
990
|
+
type: "string",
|
|
991
|
+
description: "Emoji ID to send."
|
|
992
|
+
}
|
|
993
|
+
},
|
|
994
|
+
required: ["message_id", "emoji_id"]
|
|
995
|
+
}
|
|
996
|
+
},
|
|
997
|
+
async invoke(_, session, value) {
|
|
998
|
+
if (!Array.isArray(value)) return;
|
|
999
|
+
for (const item of value) {
|
|
1000
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
1001
|
+
continue;
|
|
1002
|
+
}
|
|
1003
|
+
const action = item;
|
|
1004
|
+
if (typeof action.message_id !== "string" || typeof action.emoji_id !== "string") {
|
|
1005
|
+
continue;
|
|
1006
|
+
}
|
|
1007
|
+
await sendMsgEmoji({
|
|
1008
|
+
session,
|
|
1009
|
+
messageId: action.message_id,
|
|
1010
|
+
emojiId: action.emoji_id,
|
|
1011
|
+
protocol,
|
|
1012
|
+
log
|
|
1013
|
+
});
|
|
1014
|
+
}
|
|
1015
|
+
},
|
|
1016
|
+
render(_, __, value) {
|
|
1017
|
+
if (!Array.isArray(value)) return;
|
|
1018
|
+
return value.flatMap((item) => {
|
|
1019
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
1020
|
+
return [];
|
|
1021
|
+
}
|
|
1022
|
+
const action = item;
|
|
1023
|
+
if (typeof action.message_id !== "string" || typeof action.emoji_id !== "string") {
|
|
1024
|
+
return [];
|
|
1025
|
+
}
|
|
1026
|
+
return [
|
|
1027
|
+
`<emoji message_id="${escapeAttr(action.message_id)}" emoji_id="${escapeAttr(action.emoji_id)}" />`
|
|
1028
|
+
];
|
|
1029
|
+
});
|
|
1030
|
+
}
|
|
1031
|
+
})
|
|
1032
|
+
);
|
|
1033
|
+
}
|
|
1034
|
+
if (config.injectXmlToolAsReplyTool && config.enableDeleteXmlTool) {
|
|
1035
|
+
disposers.push(
|
|
1036
|
+
service.registerReplyToolField({
|
|
1037
|
+
name: "toolbox_delete_message",
|
|
1038
|
+
schema: {
|
|
1039
|
+
type: "array",
|
|
1040
|
+
description: "Delete one or more messages after this reply. Each item is one delete action.",
|
|
1041
|
+
items: {
|
|
1042
|
+
type: "object",
|
|
1043
|
+
properties: {
|
|
1044
|
+
message_id: {
|
|
1045
|
+
type: "string",
|
|
1046
|
+
description: "Target message ID to delete."
|
|
1047
|
+
}
|
|
1048
|
+
},
|
|
1049
|
+
required: ["message_id"]
|
|
1050
|
+
}
|
|
1051
|
+
},
|
|
1052
|
+
async invoke(_, session, value) {
|
|
1053
|
+
if (!Array.isArray(value)) return;
|
|
1054
|
+
for (const item of value) {
|
|
1055
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
1056
|
+
continue;
|
|
1057
|
+
}
|
|
1058
|
+
const action = item;
|
|
1059
|
+
if (typeof action.message_id !== "string") continue;
|
|
1060
|
+
await sendDeleteMessage({
|
|
1061
|
+
session,
|
|
1062
|
+
messageId: action.message_id,
|
|
1063
|
+
log
|
|
1064
|
+
});
|
|
1065
|
+
}
|
|
1066
|
+
},
|
|
1067
|
+
render(_, __, value) {
|
|
1068
|
+
if (!Array.isArray(value)) return;
|
|
1069
|
+
return value.flatMap((item) => {
|
|
1070
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
1071
|
+
return [];
|
|
1072
|
+
}
|
|
1073
|
+
const action = item;
|
|
1074
|
+
if (typeof action.message_id !== "string") return [];
|
|
1075
|
+
return [
|
|
1076
|
+
`<delete message_id="${escapeAttr(action.message_id)}" />`
|
|
1077
|
+
];
|
|
1078
|
+
});
|
|
1079
|
+
}
|
|
1080
|
+
})
|
|
1081
|
+
);
|
|
1082
|
+
}
|
|
1083
|
+
return () => {
|
|
1084
|
+
for (const dispose of disposers.reverse()) {
|
|
1085
|
+
dispose();
|
|
1086
|
+
}
|
|
1087
|
+
};
|
|
1088
|
+
}
|
|
1089
|
+
|
|
821
1090
|
// src/features/xml-tools/parser.ts
|
|
822
1091
|
function parseSelfClosingXmlTags(text, tagName) {
|
|
823
1092
|
const tags = Array.from(
|
|
@@ -1877,34 +2146,47 @@ function apply(ctx, config) {
|
|
|
1877
2146
|
}
|
|
1878
2147
|
};
|
|
1879
2148
|
const log = createLogger(ctx, config);
|
|
2149
|
+
const enableXmlRuntime = !config.injectXmlToolAsReplyTool && (config.enablePokeXmlTool || config.enableEmojiXmlTool || config.enableDeleteXmlTool || config.enableBanXmlTool);
|
|
1880
2150
|
let xmlRuntime = null;
|
|
1881
2151
|
let characterCtx = null;
|
|
2152
|
+
let replyToolsDispose = null;
|
|
1882
2153
|
const initializeServices = async () => {
|
|
1883
2154
|
log("info", "toolbox \u521D\u59CB\u5316\u5F00\u59CB");
|
|
1884
2155
|
registerVariables({ ctx, config, log });
|
|
1885
2156
|
const protocol = resolveOneBotProtocol(config, log);
|
|
1886
2157
|
registerNativeTools({ ctx, config, plugin, protocol, log });
|
|
1887
|
-
xmlRuntime = registerXmlTools({ ctx, config, protocol, log });
|
|
1888
|
-
if (characterCtx && xmlRuntime
|
|
2158
|
+
xmlRuntime = enableXmlRuntime ? registerXmlTools({ ctx, config, protocol, log }) : null;
|
|
2159
|
+
if (characterCtx && xmlRuntime?.start()) {
|
|
1889
2160
|
log("info", "XML \u5DE5\u5177\u5DF2\u542F\u7528");
|
|
1890
2161
|
}
|
|
1891
2162
|
log("info", "toolbox \u521D\u59CB\u5316\u5B8C\u6210");
|
|
1892
2163
|
};
|
|
1893
2164
|
const dispose = () => {
|
|
1894
2165
|
characterCtx = null;
|
|
2166
|
+
replyToolsDispose?.();
|
|
2167
|
+
replyToolsDispose = null;
|
|
1895
2168
|
xmlRuntime?.stop();
|
|
1896
2169
|
xmlRuntime = null;
|
|
1897
2170
|
};
|
|
1898
|
-
if (config
|
|
2171
|
+
if (hasReplyToolsEnabled(config) || enableXmlRuntime) {
|
|
1899
2172
|
ctx.inject(["chatluna_character"], (innerCtx) => {
|
|
1900
2173
|
characterCtx = innerCtx;
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
2174
|
+
replyToolsDispose?.();
|
|
2175
|
+
replyToolsDispose = hasReplyToolsEnabled(config) ? registerCharacterReplyTools({
|
|
2176
|
+
ctx: innerCtx,
|
|
2177
|
+
config,
|
|
2178
|
+
protocol: resolveOneBotProtocol(config, log),
|
|
2179
|
+
log
|
|
2180
|
+
}) : null;
|
|
1904
2181
|
innerCtx.on("dispose", () => {
|
|
1905
2182
|
if (characterCtx === innerCtx) characterCtx = null;
|
|
2183
|
+
replyToolsDispose?.();
|
|
2184
|
+
replyToolsDispose = null;
|
|
1906
2185
|
xmlRuntime?.stop();
|
|
1907
2186
|
});
|
|
2187
|
+
if (!xmlRuntime) return;
|
|
2188
|
+
const started = xmlRuntime.start();
|
|
2189
|
+
if (started) log("info", "XML \u5DE5\u5177\u5DF2\u542F\u7528");
|
|
1908
2190
|
});
|
|
1909
2191
|
}
|
|
1910
2192
|
ctx.on("dispose", dispose);
|
|
@@ -1945,9 +2227,11 @@ function apply(ctx, config) {
|
|
|
1945
2227
|
createXmlProcessor,
|
|
1946
2228
|
ensureOneBotSession,
|
|
1947
2229
|
getSession,
|
|
2230
|
+
hasReplyToolsEnabled,
|
|
1948
2231
|
inject,
|
|
1949
2232
|
name,
|
|
1950
2233
|
parseSelfClosingXmlTags,
|
|
2234
|
+
registerCharacterReplyTools,
|
|
1951
2235
|
registerNativeTools,
|
|
1952
2236
|
registerVariables,
|
|
1953
2237
|
registerXmlTools,
|
|
@@ -1955,5 +2239,7 @@ function apply(ctx, config) {
|
|
|
1955
2239
|
sendDeleteMessage,
|
|
1956
2240
|
sendGroupBan,
|
|
1957
2241
|
sendMsgEmoji,
|
|
1958
|
-
sendPoke
|
|
2242
|
+
sendPoke,
|
|
2243
|
+
sendSetGroupCard,
|
|
2244
|
+
sendSetProfile
|
|
1959
2245
|
});
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koishi-plugin-chatluna-toolbox",
|
|
3
3
|
"description": "为 ChatLuna 提供更多原生工具、XML 工具与变量,仅支持 onebot 平台。",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.11",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
|
-
"
|
|
6
|
+
"types": "lib/index.d.ts",
|
|
7
7
|
"files": [
|
|
8
8
|
"lib"
|
|
9
9
|
],
|
|
10
10
|
"license": "MIT",
|
|
11
|
+
"homepage": "https://github.com/Sor85/koishi-plugins",
|
|
11
12
|
"repository": {
|
|
12
13
|
"type": "git",
|
|
13
14
|
"url": "https://github.com/Sor85/koishi-plugins.git"
|
|
@@ -30,20 +31,18 @@
|
|
|
30
31
|
},
|
|
31
32
|
"dependencies": {
|
|
32
33
|
"@langchain/core": "^0.3.62",
|
|
33
|
-
"zod": "^3.
|
|
34
|
+
"zod": "^3.25.76"
|
|
34
35
|
},
|
|
35
36
|
"devDependencies": {
|
|
36
|
-
"@types/node": "^
|
|
37
|
-
"rimraf": "^5.0.5",
|
|
37
|
+
"@types/node": "^22.10.1",
|
|
38
38
|
"tsup": "^8.0.0",
|
|
39
|
-
"typescript": "^5.
|
|
40
|
-
"vitest": "^2.
|
|
39
|
+
"typescript": "^5.7.2",
|
|
40
|
+
"vitest": "^3.2.4"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
43
|
"build": "tsup",
|
|
44
44
|
"watch": "tsup --watch",
|
|
45
|
-
"
|
|
46
|
-
"typecheck": "tsc --noEmit",
|
|
45
|
+
"typecheck": "NODE_OPTIONS=--max-old-space-size=8192 tsc --noEmit",
|
|
47
46
|
"test": "vitest run"
|
|
48
47
|
}
|
|
49
48
|
}
|