@zhin.js/adapter-icqq 1.0.71 → 1.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.
Files changed (111) hide show
  1. package/CHANGELOG.md +1125 -52
  2. package/README.md +116 -431
  3. package/adapters/icqq.js +31 -0
  4. package/adapters/icqq.ts +42 -0
  5. package/agent/PERMITS.md +24 -0
  6. package/agent/prompt-sections/platform.ts +17 -0
  7. package/commands/endpoint/add/[[id]].js +3 -0
  8. package/commands/endpoint/add/[[id]].ts +3 -0
  9. package/commands/endpoint/list.js +3 -0
  10. package/commands/endpoint/list.ts +3 -0
  11. package/commands/endpoint/remove/[id].js +3 -0
  12. package/commands/endpoint/remove/[id].ts +3 -0
  13. package/lib/client.d.ts +19 -0
  14. package/lib/client.js +3 -0
  15. package/lib/cq-message.d.ts +14 -0
  16. package/lib/cq-message.js +106 -0
  17. package/lib/endpoint.d.ts +31 -0
  18. package/lib/endpoint.js +1046 -0
  19. package/lib/forward-msg.d.ts +6 -0
  20. package/lib/forward-msg.js +107 -0
  21. package/lib/icqq-endpoint-commands.d.ts +1 -0
  22. package/lib/icqq-endpoint-commands.js +26 -0
  23. package/lib/icqq-guild.d.ts +57 -0
  24. package/lib/icqq-guild.js +109 -0
  25. package/lib/icqq-inbound.d.ts +165 -0
  26. package/lib/icqq-inbound.js +651 -0
  27. package/lib/icqq-inbox.d.ts +25 -0
  28. package/lib/icqq-inbox.js +129 -0
  29. package/lib/icqq-login-assist.d.ts +27 -0
  30. package/lib/icqq-login-assist.js +109 -0
  31. package/lib/icqq-runtime-state.d.ts +1 -0
  32. package/lib/icqq-runtime-state.js +6 -0
  33. package/lib/index.d.ts +5 -18
  34. package/lib/index.js +5 -124
  35. package/lib/outbound-media.d.ts +14 -0
  36. package/lib/outbound-media.js +76 -0
  37. package/lib/protocol.d.ts +276 -0
  38. package/lib/protocol.js +425 -0
  39. package/lib/types.d.ts +37 -11
  40. package/lib/types.js +0 -1
  41. package/package.json +80 -32
  42. package/plugin.js +19 -0
  43. package/schema.json +162 -0
  44. package/src/client.ts +29 -0
  45. package/src/cq-message.ts +113 -0
  46. package/src/endpoint.ts +1138 -0
  47. package/src/forward-msg.ts +112 -0
  48. package/src/icqq-endpoint-commands.ts +28 -0
  49. package/src/icqq-guild.ts +154 -0
  50. package/src/icqq-inbound.ts +814 -0
  51. package/src/icqq-inbox.ts +147 -0
  52. package/src/icqq-login-assist.ts +132 -0
  53. package/src/icqq-runtime-state.ts +7 -0
  54. package/src/index.ts +30 -149
  55. package/src/outbound-media.ts +103 -0
  56. package/src/protocol.ts +575 -0
  57. package/src/types.ts +40 -11
  58. package/tools/announce.js +16 -0
  59. package/tools/announce.ts +15 -0
  60. package/tools/essence.js +22 -0
  61. package/tools/essence.ts +20 -0
  62. package/tools/friend_list.js +18 -0
  63. package/tools/friend_list.ts +18 -0
  64. package/tools/group_files.js +22 -0
  65. package/tools/group_files.ts +20 -0
  66. package/tools/group_invite.js +23 -0
  67. package/tools/group_invite.ts +20 -0
  68. package/tools/group_kick.js +26 -0
  69. package/tools/group_kick.ts +22 -0
  70. package/tools/group_list.js +19 -0
  71. package/tools/group_list.ts +19 -0
  72. package/tools/group_member_info.js +24 -0
  73. package/tools/group_member_info.ts +26 -0
  74. package/tools/group_sign.js +19 -0
  75. package/tools/group_sign.ts +17 -0
  76. package/tools/list_muted.js +17 -0
  77. package/tools/list_muted.ts +16 -0
  78. package/tools/poke.js +16 -0
  79. package/tools/poke.ts +15 -0
  80. package/tools/send_user_like.js +25 -0
  81. package/tools/send_user_like.ts +22 -0
  82. package/tools/set_anonymous.js +21 -0
  83. package/tools/set_anonymous.ts +19 -0
  84. package/tools/set_mute.js +24 -0
  85. package/tools/set_mute.ts +21 -0
  86. package/tools/set_title.js +25 -0
  87. package/tools/set_title.ts +22 -0
  88. package/tools/user_info.js +14 -0
  89. package/tools/user_info.ts +13 -0
  90. package/LICENSE +0 -21
  91. package/client/ICQQManagement.tsx +0 -139
  92. package/client/LoginAssistPanel.tsx +0 -293
  93. package/client/index.tsx +0 -11
  94. package/client/tsconfig.json +0 -7
  95. package/client/utils/api.ts +0 -20
  96. package/dist/index.js +0 -1
  97. package/lib/adapter.d.ts +0 -34
  98. package/lib/adapter.d.ts.map +0 -1
  99. package/lib/adapter.js +0 -396
  100. package/lib/adapter.js.map +0 -1
  101. package/lib/bot.d.ts +0 -46
  102. package/lib/bot.d.ts.map +0 -1
  103. package/lib/bot.js +0 -457
  104. package/lib/bot.js.map +0 -1
  105. package/lib/index.d.ts.map +0 -1
  106. package/lib/index.js.map +0 -1
  107. package/lib/types.d.ts.map +0 -1
  108. package/lib/types.js.map +0 -1
  109. package/skills/icqq/SKILL.md +0 -22
  110. package/src/adapter.ts +0 -448
  111. package/src/bot.ts +0 -521
@@ -0,0 +1,20 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ message_id: string; action: 'add' | 'remove' }>({
4
+ description: '设置或移除 QQ 群精华消息',
5
+ inputSchema: z.object({
6
+ message_id: z.string().describe('消息 ID'),
7
+ action: z.enum(['add', 'remove']).describe('add=设为精华, remove=移除精华'),
8
+ }),
9
+ adapter: 'icqq',
10
+ approval: 'always',
11
+ async execute({ message_id, action }, context) {
12
+ const client = context.$client;
13
+ if (action === 'add') {
14
+ await client.setEssenceMessage(message_id);
15
+ } else {
16
+ await client.removeEssenceMessage(message_id);
17
+ }
18
+ return { success: true, message: action === 'add' ? '已设为精华' : '已移除精华' };
19
+ },
20
+ });
@@ -0,0 +1,18 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '获取 QQ 好友列表',
6
+ inputSchema: z.object({}),
7
+ adapter: 'icqq',
8
+ approval: 'never',
9
+ async execute(_input, context) {
10
+ const client = context.$client;
11
+ const friends = Array.from(client.fl.values()).map((friend) => ({
12
+ user_id: friend.user_id,
13
+ nickname: friend.nickname,
14
+ remark: friend.remark,
15
+ }));
16
+ return { friends: friends.slice(0, 50), count: client.fl.size };
17
+ },
18
+ });
@@ -0,0 +1,18 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+
4
+ export default defineAgentTool<Record<string, never>>({
5
+ description: '获取 QQ 好友列表',
6
+ inputSchema: z.object({}),
7
+ adapter: 'icqq',
8
+ approval: 'never',
9
+ async execute(_input, context) {
10
+ const client = context.$client;
11
+ const friends = Array.from(client.fl.values()).map((friend) => ({
12
+ user_id: friend.user_id,
13
+ nickname: friend.nickname,
14
+ remark: friend.remark,
15
+ }));
16
+ return { friends: friends.slice(0, 50), count: client.fl.size };
17
+ },
18
+ });
@@ -0,0 +1,22 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '获取 QQ 群的群文件列表',
6
+ inputSchema: z.object({
7
+ group_id: z.number().describe('群号'),
8
+ }),
9
+ adapter: 'icqq',
10
+ approval: 'never',
11
+ async execute({ group_id }, context) {
12
+ const files = await context.$client.acquireGfs(group_id).ls('/');
13
+ if (!files.length)
14
+ return { files: [], message: '群文件为空' };
15
+ return {
16
+ files: files.slice(0, 30).map((f) => 'size' in f
17
+ ? { name: f.name, is_dir: false, size: f.size, uploader: f.user_id, upload_time: f.create_time }
18
+ : { name: f.name, is_dir: true, file_count: f.file_count }),
19
+ count: files.length,
20
+ };
21
+ },
22
+ });
@@ -0,0 +1,20 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ group_id: number }>({
4
+ description: '获取 QQ 群的群文件列表',
5
+ inputSchema: z.object({
6
+ group_id: z.number().describe('群号'),
7
+ }),
8
+ adapter: 'icqq',
9
+ approval: 'never',
10
+ async execute({ group_id }, context) {
11
+ const files = await context.$client.acquireGfs(group_id).ls('/');
12
+ if (!files.length) return { files: [], message: '群文件为空' };
13
+ return {
14
+ files: files.slice(0, 30).map((f) => 'size' in f
15
+ ? { name: f.name, is_dir: false, size: f.size, uploader: f.user_id, upload_time: f.create_time }
16
+ : { name: f.name, is_dir: true, file_count: f.file_count }),
17
+ count: files.length,
18
+ };
19
+ },
20
+ });
@@ -0,0 +1,23 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '邀请好友加入 QQ 群',
6
+ inputSchema: z.object({
7
+ group_id: z.number().describe('目标群号'),
8
+ user_id: z.number().describe('要邀请的 QQ号'),
9
+ }),
10
+ adapter: 'icqq',
11
+ approval: 'never',
12
+ async execute({ group_id, user_id }, context) {
13
+ const client = context.$client;
14
+ const groupInfo = client.pickGroup(group_id);
15
+ if (!groupInfo)
16
+ return { success: false, message: '目标群不存在' };
17
+ const memberInfo = client.pickMember(group_id, user_id);
18
+ if (memberInfo)
19
+ return { success: false, message: '目标成员已加入群' };
20
+ await client.inviteFriend(group_id, user_id);
21
+ return { success: true, message: `已尝试邀请 ${user_id} 加入群 ${group_id}` };
22
+ },
23
+ });
@@ -0,0 +1,20 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ group_id: number; user_id: number }>({
4
+ description: '邀请好友加入 QQ 群',
5
+ inputSchema: z.object({
6
+ group_id: z.number().describe('目标群号'),
7
+ user_id: z.number().describe('要邀请的 QQ号'),
8
+ }),
9
+ adapter: 'icqq',
10
+ approval: 'never',
11
+ async execute({ group_id, user_id }, context) {
12
+ const client = context.$client;
13
+ const groupInfo= client.pickGroup(group_id);
14
+ if(!groupInfo) return { success: false, message: '目标群不存在' };
15
+ const memberInfo= client.pickMember(group_id,user_id);
16
+ if(memberInfo) return { success: false, message: '目标成员已加入群' };
17
+ await client.inviteFriend(group_id, user_id);
18
+ return { success: true, message: `已尝试邀请 ${user_id} 加入群 ${group_id}` };
19
+ },
20
+ });
@@ -0,0 +1,26 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '踢出 QQ 群中的某个成员',
6
+ inputSchema: z.object({
7
+ group_id: z.number().describe('目标群号'),
8
+ user_id: z.number().describe('要踢出的成员 QQ号'),
9
+ }),
10
+ adapter: 'icqq',
11
+ permissions: ['role(master,admin,trusted,owner)'],
12
+ approval: 'never',
13
+ async execute({ group_id, user_id }, context) {
14
+ const client = context.$client;
15
+ const selfInfo = client.pickMember(group_id, client.uin);
16
+ if (!selfInfo.is_admin && !selfInfo.is_owner)
17
+ return { success: false, message: '我不是群主或管理员,无法踢出成员' };
18
+ if (selfInfo.user_id === user_id)
19
+ return { success: false, message: '我不能踢出自己' };
20
+ const memberInfo = client.pickMember(group_id, user_id);
21
+ if (!memberInfo)
22
+ return { success: false, message: '目标成员不存在' };
23
+ await client.setGroupKick(group_id, user_id);
24
+ return { success: true, message: `已踢出 ${user_id} 成员` };
25
+ },
26
+ });
@@ -0,0 +1,22 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ group_id: number; user_id: number }>({
4
+ description: '踢出 QQ 群中的某个成员',
5
+ inputSchema: z.object({
6
+ group_id: z.number().describe('目标群号'),
7
+ user_id: z.number().describe('要踢出的成员 QQ号'),
8
+ }),
9
+ adapter: 'icqq',
10
+ permissions: ['role(master,admin,trusted,owner)'],
11
+ approval: 'never',
12
+ async execute({ group_id, user_id }, context) {
13
+ const client = context.$client;
14
+ const selfInfo= client.pickMember(group_id,client.uin);
15
+ if(!selfInfo.is_admin && !selfInfo.is_owner) return { success: false, message: '我不是群主或管理员,无法踢出成员' };
16
+ if(selfInfo.user_id === user_id) return { success: false, message: '我不能踢出自己' };
17
+ const memberInfo= client.pickMember(group_id,user_id);
18
+ if(!memberInfo) return { success: false, message: '目标成员不存在' };
19
+ await client.setGroupKick(group_id, user_id);
20
+ return { success: true, message: `已踢出 ${user_id} 成员` };
21
+ },
22
+ });
@@ -0,0 +1,19 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ adapter: 'icqq',
6
+ description: '获取当前 QQ 账号的群列表',
7
+ inputSchema: z.object({}),
8
+ approval: 'never',
9
+ async execute(_input, context) {
10
+ const client = context.$client;
11
+ const groups = Array.from(client.gl.values()).map((group) => ({
12
+ group_id: group.group_id,
13
+ group_name: group.group_name,
14
+ member_count: group.member_count,
15
+ max_member_count: group.max_member_count,
16
+ }));
17
+ return { groups: groups.slice(0, 50), count: client.gl.size };
18
+ },
19
+ });
@@ -0,0 +1,19 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+
4
+ export default defineAgentTool<Record<string, never>>({
5
+ adapter: 'icqq',
6
+ description: '获取当前 QQ 账号的群列表',
7
+ inputSchema: z.object({}),
8
+ approval: 'never',
9
+ async execute(_input, context) {
10
+ const client = context.$client;
11
+ const groups = Array.from(client.gl.values()).map((group) => ({
12
+ group_id: group.group_id,
13
+ group_name: group.group_name,
14
+ member_count: group.member_count,
15
+ max_member_count: group.max_member_count,
16
+ }));
17
+ return { groups: groups.slice(0, 50), count: client.gl.size };
18
+ },
19
+ });
@@ -0,0 +1,24 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '获取 QQ 群成员信息',
6
+ inputSchema: z.object({
7
+ group_id: z.number().describe('目标群号'),
8
+ user_id: z.number().describe('目标成员 QQ号'),
9
+ }),
10
+ adapter: 'icqq',
11
+ approval: 'never',
12
+ async execute({ group_id, user_id }, context) {
13
+ const group = context.$client.pickGroup(group_id);
14
+ if (!group)
15
+ return { success: false, message: '目标群不存在' };
16
+ const memberInfo = group.pickMember(user_id);
17
+ if (!memberInfo)
18
+ return { success: false, message: '目标成员不存在' };
19
+ return {
20
+ success: true,
21
+ member: memberInfo,
22
+ };
23
+ },
24
+ });
@@ -0,0 +1,26 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ interface GroupMemberInfoInput {
4
+ group_id: number;
5
+ user_id: number;
6
+ }
7
+
8
+ export default defineAgentTool<GroupMemberInfoInput>({
9
+ description: '获取 QQ 群成员信息',
10
+ inputSchema: z.object({
11
+ group_id: z.number().describe('目标群号'),
12
+ user_id: z.number().describe('目标成员 QQ号'),
13
+ }),
14
+ adapter: 'icqq',
15
+ approval: 'never',
16
+ async execute({ group_id, user_id }, context) {
17
+ const group = context.$client.pickGroup(group_id);
18
+ if (!group) return { success: false, message: '目标群不存在' };
19
+ const memberInfo = group.pickMember(user_id);
20
+ if (!memberInfo) return { success: false, message: '目标成员不存在' };
21
+ return {
22
+ success: true,
23
+ member: memberInfo,
24
+ };
25
+ },
26
+ });
@@ -0,0 +1,19 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: 'QQ 群签到/打卡',
6
+ inputSchema: z.object({
7
+ group_id: z.number().describe('目标群号'),
8
+ }),
9
+ adapter: 'icqq',
10
+ approval: 'never',
11
+ async execute({ group_id }, context) {
12
+ const client = context.$client;
13
+ const groupInfo = client.pickGroup(group_id);
14
+ if (!groupInfo)
15
+ return { success: false, message: '目标群不存在' };
16
+ await client.sendGroupSign(group_id);
17
+ return { success: true, message: '群签到成功' };
18
+ },
19
+ });
@@ -0,0 +1,17 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ group_id: number }>({
4
+ description: 'QQ 群签到/打卡',
5
+ inputSchema: z.object({
6
+ group_id: z.number().describe('目标群号'),
7
+ }),
8
+ adapter: 'icqq',
9
+ approval: 'never',
10
+ async execute({ group_id }, context) {
11
+ const client = context.$client;
12
+ const groupInfo= client.pickGroup(group_id);
13
+ if(!groupInfo) return { success: false, message: '目标群不存在' };
14
+ await client.sendGroupSign(group_id);
15
+ return { success: true, message: '群签到成功' };
16
+ },
17
+ });
@@ -0,0 +1,17 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '查询 QQ 群中当前被禁言的成员列表',
6
+ inputSchema: z.object({
7
+ group_id: z.number().describe('目标群号'),
8
+ }),
9
+ adapter: 'icqq',
10
+ permissions: ['role(master,admin)'],
11
+ async execute({ group_id }, context) {
12
+ const members = await context.$client.getGroupMemberList(group_id);
13
+ const now = Math.floor(Date.now() / 1000);
14
+ const muted = Array.from(members.values()).filter((m) => m.shutup_time > now);
15
+ return { muted_members: muted, count: muted.length };
16
+ },
17
+ });
@@ -0,0 +1,16 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ group_id: number }>({
4
+ description: '查询 QQ 群中当前被禁言的成员列表',
5
+ inputSchema: z.object({
6
+ group_id: z.number().describe('目标群号'),
7
+ }),
8
+ adapter: 'icqq',
9
+ permissions: ['role(master,admin)'],
10
+ async execute({ group_id }, context) {
11
+ const members = await context.$client.getGroupMemberList(group_id);
12
+ const now = Math.floor(Date.now() / 1000);
13
+ const muted = Array.from(members.values()).filter((m) => m.shutup_time > now);
14
+ return { muted_members: muted, count: muted.length };
15
+ },
16
+ });
package/tools/poke.js ADDED
@@ -0,0 +1,16 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '在 QQ 群中对某个成员执行戳一戳互动操作',
6
+ inputSchema: z.object({
7
+ group_id: z.number().describe('目标群号'),
8
+ user_id: z.number().describe('要戳的目标成员 QQ号'),
9
+ }),
10
+ adapter: 'icqq',
11
+ approval: 'never',
12
+ async execute({ group_id, user_id }, context) {
13
+ await context.$client.sendGroupPoke(group_id, user_id);
14
+ return { success: true, message: `已戳了戳 ${user_id}` };
15
+ },
16
+ });
package/tools/poke.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ group_id: number; user_id: number }>({
4
+ description: '在 QQ 群中对某个成员执行戳一戳互动操作',
5
+ inputSchema: z.object({
6
+ group_id: z.number().describe('目标群号'),
7
+ user_id: z.number().describe('要戳的目标成员 QQ号'),
8
+ }),
9
+ adapter: 'icqq',
10
+ approval: 'never',
11
+ async execute({ group_id, user_id }, context) {
12
+ await context.$client.sendGroupPoke(group_id, user_id);
13
+ return { success: true, message: `已戳了戳 ${user_id}` };
14
+ },
15
+ });
@@ -0,0 +1,25 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '尝试给用户点尽量多的赞',
6
+ inputSchema: z.object({
7
+ user_id: z.number().describe('要点赞的目标用户 QQ号'),
8
+ }),
9
+ adapter: 'icqq',
10
+ approval: 'never',
11
+ async execute({ user_id }, context) {
12
+ const successArray = [];
13
+ await Promise.all([20, 20, 10].map(async (times) => {
14
+ try {
15
+ await context.$client.sendLike(user_id, times);
16
+ successArray.push(times);
17
+ }
18
+ catch { /* ignore */ }
19
+ }));
20
+ const successTimes = successArray.reduce((a, b) => a + b, 0);
21
+ if (!successTimes)
22
+ return { success: false, message: '点赞失败' };
23
+ return { success: true, message: `已给 ${user_id} 点赞 ${successTimes} 次` };
24
+ },
25
+ });
@@ -0,0 +1,22 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ user_id: number }>({
4
+ description: '尝试给用户点尽量多的赞',
5
+ inputSchema: z.object({
6
+ user_id: z.number().describe('要点赞的目标用户 QQ号'),
7
+ }),
8
+ adapter: 'icqq',
9
+ approval: 'never',
10
+ async execute({ user_id }, context) {
11
+ const successArray: number[] = [];
12
+ await Promise.all([20, 20, 10].map(async (times) => {
13
+ try {
14
+ await context.$client.sendLike(user_id, times);
15
+ successArray.push(times);
16
+ } catch { /* ignore */ }
17
+ }));
18
+ const successTimes = successArray.reduce((a, b) => a + b, 0);
19
+ if (!successTimes) return { success: false, message: '点赞失败' };
20
+ return { success: true, message: `已给 ${user_id} 点赞 ${successTimes} 次` };
21
+ },
22
+ });
@@ -0,0 +1,21 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '开启或关闭 QQ 群的匿名聊天功能',
6
+ inputSchema: z.object({
7
+ group_id: z.number().describe('目标群号'),
8
+ enable: z.boolean().optional().describe('true=开启,false=关闭,默认 true'),
9
+ }),
10
+ adapter: 'icqq',
11
+ permissions: ['role(master,trusted,owner,admin)'],
12
+ async execute({ group_id, enable }, context) {
13
+ const client = context.$client;
14
+ const on = enable ?? true;
15
+ const selfInfo = client.pickMember(group_id, client.uin);
16
+ if (!selfInfo.is_admin && !selfInfo.is_owner)
17
+ return { success: false, message: '我不是群主或管理员,无法开启或关闭匿名聊天' };
18
+ await client.setGroupAnonymous(group_id, on);
19
+ return { success: true, message: on ? '已开启匿名聊天' : '已关闭匿名聊天' };
20
+ },
21
+ });
@@ -0,0 +1,19 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ group_id: number; enable?: boolean }>({
4
+ description: '开启或关闭 QQ 群的匿名聊天功能',
5
+ inputSchema: z.object({
6
+ group_id: z.number().describe('目标群号'),
7
+ enable: z.boolean().optional().describe('true=开启,false=关闭,默认 true'),
8
+ }),
9
+ adapter: 'icqq',
10
+ permissions: ['role(master,trusted,owner,admin)'],
11
+ async execute({ group_id, enable }, context) {
12
+ const client = context.$client;
13
+ const on = enable ?? true;
14
+ const selfInfo= client.pickMember(group_id,client.uin);
15
+ if(!selfInfo.is_admin && !selfInfo.is_owner) return { success: false, message: '我不是群主或管理员,无法开启或关闭匿名聊天' };
16
+ await client.setGroupAnonymous(group_id, on);
17
+ return { success: true, message: on ? '已开启匿名聊天' : '已关闭匿名聊天' };
18
+ },
19
+ });
@@ -0,0 +1,24 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '禁言/解除禁言指定成员',
6
+ inputSchema: z.object({
7
+ group_id: z.number().describe('目标群号'),
8
+ user_id: z.number().describe('目标成员 QQ号'),
9
+ duration: z.number().describe('禁言时间(秒),0=解除禁言').default(0),
10
+ }),
11
+ adapter: 'icqq',
12
+ approval: 'always',
13
+ async execute({ group_id, user_id, duration }, context) {
14
+ const client = context.$client;
15
+ const selfInfo = client.pickMember(group_id, client.uin);
16
+ if (!selfInfo.is_admin && !selfInfo.is_owner)
17
+ return { success: false, message: '我不是群主或管理员,无法禁言/解除禁言成员' };
18
+ const memberInfo = client.pickMember(group_id, user_id);
19
+ if (!memberInfo)
20
+ return { success: false, message: '目标成员不存在' };
21
+ await client.setGroupBan(group_id, user_id, duration === 0 ? 0 : duration);
22
+ return { success: true, message: `已${duration === 0 ? '解除' : ''}禁言 ${user_id} 成员${duration === 0 ? '' : `(${duration}秒)`}` };
23
+ },
24
+ });
@@ -0,0 +1,21 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ group_id: number; user_id: number; duration?: number }>({
4
+ description: '禁言/解除禁言指定成员',
5
+ inputSchema: z.object({
6
+ group_id: z.number().describe('目标群号'),
7
+ user_id: z.number().describe('目标成员 QQ号'),
8
+ duration: z.number().describe('禁言时间(秒),0=解除禁言').default(0),
9
+ }),
10
+ adapter: 'icqq',
11
+ approval: 'always',
12
+ async execute({ group_id, user_id, duration }, context) {
13
+ const client = context.$client;
14
+ const selfInfo= client.pickMember(group_id,client.uin);
15
+ if(!selfInfo.is_admin && !selfInfo.is_owner) return { success: false, message: '我不是群主或管理员,无法禁言/解除禁言成员' };
16
+ const memberInfo= client.pickMember(group_id,user_id);
17
+ if(!memberInfo) return { success: false, message: '目标成员不存在' };
18
+ await client.setGroupBan(group_id, user_id, duration === 0 ? 0 : duration);
19
+ return { success: true, message: `已${duration === 0 ? '解除' : ''}禁言 ${user_id} 成员${duration === 0 ? '' : `(${duration}秒)`}` };
20
+ },
21
+ });
@@ -0,0 +1,25 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '设置 QQ 群成员的专属头衔',
6
+ inputSchema: z.object({
7
+ group_id: z.number().describe('目标群号'),
8
+ user_id: z.number().describe('目标成员 QQ号'),
9
+ title: z.string().describe('头衔文字'),
10
+ duration: z.number().optional().describe('持续时间(秒),-1永久').default(-1),
11
+ }),
12
+ adapter: 'icqq',
13
+ approval: 'always',
14
+ async execute({ group_id, user_id, title, duration }, context) {
15
+ const client = context.$client;
16
+ const selfInfo = client.pickMember(group_id, client.uin);
17
+ if (!selfInfo.is_admin && !selfInfo.is_owner)
18
+ return { success: false, message: '我不是群主或管理员,无法设置头衔' };
19
+ const memberInfo = client.pickMember(group_id, user_id);
20
+ if (!memberInfo)
21
+ return { success: false, message: '目标成员不存在' };
22
+ await client.setGroupSpecialTitle(group_id, user_id, title, duration ?? -1);
23
+ return { success: true, message: `已将 ${user_id} 的头衔设为 "${title}"` };
24
+ },
25
+ });
@@ -0,0 +1,22 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ group_id: number; user_id: number; title: string; duration?: number }>({
4
+ description: '设置 QQ 群成员的专属头衔',
5
+ inputSchema: z.object({
6
+ group_id: z.number().describe('目标群号'),
7
+ user_id: z.number().describe('目标成员 QQ号'),
8
+ title: z.string().describe('头衔文字'),
9
+ duration: z.number().optional().describe('持续时间(秒),-1永久').default(-1),
10
+ }),
11
+ adapter: 'icqq',
12
+ approval: 'always',
13
+ async execute({ group_id, user_id, title, duration }, context) {
14
+ const client = context.$client;
15
+ const selfInfo= client.pickMember(group_id,client.uin);
16
+ if(!selfInfo.is_admin && !selfInfo.is_owner) return { success: false, message: '我不是群主或管理员,无法设置头衔' };
17
+ const memberInfo= client.pickMember(group_id,user_id);
18
+ if(!memberInfo) return { success: false, message: '目标成员不存在' };
19
+ await client.setGroupSpecialTitle(group_id, user_id, title, duration ?? -1);
20
+ return { success: true, message: `已将 ${user_id} 的头衔设为 "${title}"` };
21
+ },
22
+ });
@@ -0,0 +1,14 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '获取指定QQ号的用户信息/资料/详情',
6
+ inputSchema: z.object({
7
+ user_id: z.number().describe('目标成员 QQ号'),
8
+ }),
9
+ adapter: 'icqq',
10
+ async execute({ user_id }, context) {
11
+ const profile = await context.$client.getProfile(user_id);
12
+ return { success: true, message: `已获取 ${user_id} 的用户信息:${JSON.stringify(profile, null, 2)}` };
13
+ },
14
+ });
@@ -0,0 +1,13 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ user_id: number }>({
4
+ description: '获取指定QQ号的用户信息/资料/详情',
5
+ inputSchema: z.object({
6
+ user_id: z.number().describe('目标成员 QQ号'),
7
+ }),
8
+ adapter: 'icqq',
9
+ async execute({ user_id }, context) {
10
+ const profile = await context.$client.getProfile(user_id);
11
+ return { success: true, message: `已获取 ${user_id} 的用户信息:${JSON.stringify(profile,null,2)}` };
12
+ },
13
+ });
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 凉菜
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.