@zhin.js/adapter-icqq 6.0.1 → 6.0.2

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 (149) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +1 -1
  3. package/agent/tools/announce.ts +21 -0
  4. package/agent/tools/essence.ts +22 -0
  5. package/agent/tools/friend_list.ts +19 -0
  6. package/agent/tools/group_files.ts +27 -0
  7. package/agent/tools/group_invite.ts +20 -0
  8. package/agent/tools/group_list.ts +20 -0
  9. package/agent/tools/group_sign.ts +19 -0
  10. package/agent/tools/list_muted.ts +22 -0
  11. package/agent/tools/poke.ts +20 -0
  12. package/agent/tools/send_user_like.ts +22 -0
  13. package/agent/tools/set_anonymous.ts +22 -0
  14. package/agent/tools/set_title.ts +25 -0
  15. package/lib/agent/tools/announce.js +21 -0
  16. package/lib/agent/tools/announce.js.map +1 -0
  17. package/lib/agent/tools/essence.js +22 -0
  18. package/lib/agent/tools/essence.js.map +1 -0
  19. package/lib/agent/tools/friend_list.js +19 -0
  20. package/lib/agent/tools/friend_list.js.map +1 -0
  21. package/lib/agent/tools/group_files.js +29 -0
  22. package/lib/agent/tools/group_files.js.map +1 -0
  23. package/lib/agent/tools/group_invite.js +20 -0
  24. package/lib/agent/tools/group_invite.js.map +1 -0
  25. package/lib/agent/tools/group_list.js +20 -0
  26. package/lib/agent/tools/group_list.js.map +1 -0
  27. package/lib/agent/tools/group_sign.js +19 -0
  28. package/lib/agent/tools/group_sign.js.map +1 -0
  29. package/lib/agent/tools/list_muted.js +23 -0
  30. package/lib/agent/tools/list_muted.js.map +1 -0
  31. package/lib/agent/tools/poke.js +20 -0
  32. package/lib/agent/tools/poke.js.map +1 -0
  33. package/lib/agent/tools/send_user_like.js +22 -0
  34. package/lib/agent/tools/send_user_like.js.map +1 -0
  35. package/lib/agent/tools/set_anonymous.js +22 -0
  36. package/lib/agent/tools/set_anonymous.js.map +1 -0
  37. package/lib/agent/tools/set_title.js +25 -0
  38. package/lib/agent/tools/set_title.js.map +1 -0
  39. package/lib/src/adapter.js.map +1 -0
  40. package/lib/src/agent-prompt.js.map +1 -0
  41. package/lib/src/cq-message.js.map +1 -0
  42. package/lib/{endpoint.js → src/endpoint.js} +21 -20
  43. package/lib/src/endpoint.js.map +1 -0
  44. package/lib/{forward-msg.js → src/forward-msg.js} +4 -1
  45. package/lib/src/forward-msg.js.map +1 -0
  46. package/lib/src/get-msg.js.map +1 -0
  47. package/lib/src/icqq-agent-deps.js +10 -0
  48. package/lib/src/icqq-agent-deps.js.map +1 -0
  49. package/lib/src/icqq-guild.js.map +1 -0
  50. package/lib/src/icqq-inbound.js.map +1 -0
  51. package/lib/src/icqq-login-assist-bridge.js.map +1 -0
  52. package/lib/{icqq-side-events.js → src/icqq-side-events.js} +28 -92
  53. package/lib/src/icqq-side-events.js.map +1 -0
  54. package/lib/src/index.js.map +1 -0
  55. package/lib/src/ipc-client.js.map +1 -0
  56. package/lib/src/login-assist-routes.js.map +1 -0
  57. package/lib/src/login-ipc-contract.js.map +1 -0
  58. package/lib/src/outbound-media.js.map +1 -0
  59. package/lib/src/protocol.js.map +1 -0
  60. package/lib/src/routes.js.map +1 -0
  61. package/lib/src/segment-mapper.js.map +1 -0
  62. package/lib/src/tools/index.js +23 -0
  63. package/lib/src/tools/index.js.map +1 -0
  64. package/lib/src/types.js.map +1 -0
  65. package/package.json +23 -19
  66. package/src/agent-prompt.ts +1 -2
  67. package/src/endpoint.ts +21 -33
  68. package/src/forward-msg.ts +2 -2
  69. package/src/icqq-agent-deps.ts +18 -0
  70. package/src/icqq-side-events.ts +33 -118
  71. package/src/tools/index.ts +14 -395
  72. package/lib/adapter.d.ts +0 -46
  73. package/lib/adapter.d.ts.map +0 -1
  74. package/lib/adapter.js.map +0 -1
  75. package/lib/agent-prompt.d.ts +0 -3
  76. package/lib/agent-prompt.d.ts.map +0 -1
  77. package/lib/agent-prompt.js.map +0 -1
  78. package/lib/cq-message.d.ts +0 -10
  79. package/lib/cq-message.d.ts.map +0 -1
  80. package/lib/cq-message.js.map +0 -1
  81. package/lib/endpoint.d.ts +0 -103
  82. package/lib/endpoint.d.ts.map +0 -1
  83. package/lib/endpoint.js.map +0 -1
  84. package/lib/forward-msg.d.ts +0 -27
  85. package/lib/forward-msg.d.ts.map +0 -1
  86. package/lib/forward-msg.js.map +0 -1
  87. package/lib/get-msg.d.ts +0 -3
  88. package/lib/get-msg.d.ts.map +0 -1
  89. package/lib/get-msg.js.map +0 -1
  90. package/lib/icqq-guild.d.ts +0 -48
  91. package/lib/icqq-guild.d.ts.map +0 -1
  92. package/lib/icqq-guild.js.map +0 -1
  93. package/lib/icqq-inbound.d.ts +0 -130
  94. package/lib/icqq-inbound.d.ts.map +0 -1
  95. package/lib/icqq-inbound.js.map +0 -1
  96. package/lib/icqq-login-assist-bridge.d.ts +0 -5
  97. package/lib/icqq-login-assist-bridge.d.ts.map +0 -1
  98. package/lib/icqq-login-assist-bridge.js.map +0 -1
  99. package/lib/icqq-side-events.d.ts +0 -34
  100. package/lib/icqq-side-events.d.ts.map +0 -1
  101. package/lib/icqq-side-events.js.map +0 -1
  102. package/lib/index.d.ts +0 -18
  103. package/lib/index.d.ts.map +0 -1
  104. package/lib/index.js.map +0 -1
  105. package/lib/ipc-client.d.ts +0 -74
  106. package/lib/ipc-client.d.ts.map +0 -1
  107. package/lib/ipc-client.js.map +0 -1
  108. package/lib/login-assist-routes.d.ts +0 -7
  109. package/lib/login-assist-routes.d.ts.map +0 -1
  110. package/lib/login-assist-routes.js.map +0 -1
  111. package/lib/login-ipc-contract.d.ts +0 -44
  112. package/lib/login-ipc-contract.d.ts.map +0 -1
  113. package/lib/login-ipc-contract.js.map +0 -1
  114. package/lib/outbound-media.d.ts +0 -14
  115. package/lib/outbound-media.d.ts.map +0 -1
  116. package/lib/outbound-media.js.map +0 -1
  117. package/lib/protocol.d.ts +0 -198
  118. package/lib/protocol.d.ts.map +0 -1
  119. package/lib/protocol.js.map +0 -1
  120. package/lib/routes.d.ts +0 -8
  121. package/lib/routes.d.ts.map +0 -1
  122. package/lib/routes.js.map +0 -1
  123. package/lib/segment-mapper.d.ts +0 -2
  124. package/lib/segment-mapper.d.ts.map +0 -1
  125. package/lib/segment-mapper.js.map +0 -1
  126. package/lib/tools/index.d.ts +0 -10
  127. package/lib/tools/index.d.ts.map +0 -1
  128. package/lib/tools/index.js +0 -341
  129. package/lib/tools/index.js.map +0 -1
  130. package/lib/types.d.ts +0 -73
  131. package/lib/types.d.ts.map +0 -1
  132. package/lib/types.js.map +0 -1
  133. /package/{skills/icqq → agent}/PERMITS.md +0 -0
  134. /package/lib/{adapter.js → src/adapter.js} +0 -0
  135. /package/lib/{agent-prompt.js → src/agent-prompt.js} +0 -0
  136. /package/lib/{cq-message.js → src/cq-message.js} +0 -0
  137. /package/lib/{get-msg.js → src/get-msg.js} +0 -0
  138. /package/lib/{icqq-guild.js → src/icqq-guild.js} +0 -0
  139. /package/lib/{icqq-inbound.js → src/icqq-inbound.js} +0 -0
  140. /package/lib/{icqq-login-assist-bridge.js → src/icqq-login-assist-bridge.js} +0 -0
  141. /package/lib/{index.js → src/index.js} +0 -0
  142. /package/lib/{ipc-client.js → src/ipc-client.js} +0 -0
  143. /package/lib/{login-assist-routes.js → src/login-assist-routes.js} +0 -0
  144. /package/lib/{login-ipc-contract.js → src/login-ipc-contract.js} +0 -0
  145. /package/lib/{outbound-media.js → src/outbound-media.js} +0 -0
  146. /package/lib/{protocol.js → src/protocol.js} +0 -0
  147. /package/lib/{routes.js → src/routes.js} +0 -0
  148. /package/lib/{segment-mapper.js → src/segment-mapper.js} +0 -0
  149. /package/lib/{types.js → src/types.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @zhin.js/adapter-icqq
2
2
 
3
+ ## 6.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 872c583: Slack 适配器 Phase 1/2:mrkdwn 出站、长消息切分、斜杠/按钮 ephemeral 反馈、入站 mrkdwn→Markdown、editMessage 对齐 core。
8
+
9
+ Logger 表格日志与 string-width 列宽;Agent AI Handler 框线表格与 introspection/MCP 导出;Core side-event 归一化;Schedule 时区规划;多适配器 side-event 与 API surface 更新。
10
+
11
+ - 872c583: fix: 代码格式优化
12
+ - Updated dependencies [872c583]
13
+ - Updated dependencies [872c583]
14
+ - @zhin.js/agent@1.0.3
15
+ - @zhin.js/client@2.0.5
16
+ - @zhin.js/contract@1.0.3
17
+ - @zhin.js/core@1.3.4
18
+ - @zhin.js/host-api@2.0.5
19
+ - @zhin.js/host-router@2.0.3
20
+ - zhin.js@4.1.2
21
+
3
22
  ## 6.0.1
4
23
 
5
24
  ### Patch Changes
package/README.md CHANGED
@@ -261,6 +261,7 @@ const memberInfo = endpoint.getGroupMemberInfo(groupId, userId)
261
261
 
262
262
  ## 🔧 群管理工具(AI 可调用)
263
263
 
264
+
264
265
  适配器通过覆写 `ISceneManagement` 标准方法自动注册群管理工具,同时保留平台特有工具,这些工具可以被 AI 调用,实现智能化的群管理。
265
266
 
266
267
  ### 标准群管工具(自动生成)
@@ -393,7 +394,6 @@ onGroupMessage(async (message) => {
393
394
 
394
395
  ## icqq CLI 与 AI bash 安全
395
396
 
396
- 启用 **icqq 技能**(`skills/icqq`)时,模型通常会通过 **`bash`** 调用 `icqq …` 命令行。此时由框架 **`execSecurity` / `execApprovalMode`** 与 **Owner 私聊指令**(`approve always bash`、`approve rule <正则>` 等)共同约束:在 `allowlist` 下,**非敏感**子命令多数可直接执行;**敏感**子命令(踢人、禁言、解散、支付等)在 `execApprovalMode: ask` 时需 Owner 确认,并可用 **正则匹配整条子命令** 做持久化放行(不必把 QQ 号写进配置)。持久化文件为数据目录下的 `owner-approve-always.json`。
397
397
 
398
398
  完整说明与指令表见仓库文档:[docs/advanced/ai.md](../../../docs/advanced/ai.md)(锚点:`#icqq-bash-exec`、`#owner-approve-commands`)。
399
399
 
@@ -0,0 +1,21 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string; group_id: number; content: string }>({
5
+ description: '发送 QQ 群公告(需要管理员权限)',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ content: z.string().describe('公告内容'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ permissions: ['platform(icqq,scene_admin)'],
14
+ async execute({ endpoint_id, group_id, content }: { endpoint_id: string; group_id: number; content: string }) {
15
+ const { Actions } = await import('../../src/protocol.js');
16
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
17
+ const resp = await endpoint.ipc.request(Actions.GROUP_ANNOUNCE, { group_id, content });
18
+ return { success: resp.ok, message: resp.ok ? '群公告已发送' : (resp.error ?? '发送失败') };
19
+ },
20
+ });
21
+
@@ -0,0 +1,22 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string; message_id: string; action: 'add' | 'remove' }>({
5
+ description: '设置或移除 QQ 群精华消息',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ message_id: z.string().describe('消息 ID'),
9
+ action: z.enum(['add', 'remove']).describe('add=设为精华, remove=移除精华'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ permissions: ['platform(icqq,scene_admin)'],
14
+ async execute({ endpoint_id, message_id, action }: { endpoint_id: string; message_id: string; action: 'add' | 'remove' }) {
15
+ const { Actions } = await import('../../src/protocol.js');
16
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
17
+ const act = action === 'add' ? Actions.GROUP_ESSENCE_ADD : Actions.GROUP_ESSENCE_REMOVE;
18
+ const resp = await endpoint.ipc.request(act, { message_id });
19
+ return { success: resp.ok, message: resp.ok ? (action === 'add' ? '已设为精华' : '已移除精华') : (resp.error ?? '操作失败') };
20
+ },
21
+ });
22
+
@@ -0,0 +1,19 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string }>({
5
+ description: '获取 QQ 好友列表',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint 名称'),
8
+ }),
9
+ platforms: ['icqq'],
10
+ tags: ['icqq'],
11
+ async execute({ endpoint_id }: { endpoint_id: string }) {
12
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
13
+ const friends = Array.from(endpoint.friends.values()).map((f) => ({
14
+ user_id: f.user_id, nickname: f.nickname, remark: f.remark,
15
+ }));
16
+ return { friends: friends.slice(0, 50), count: endpoint.friends.size };
17
+ },
18
+ });
19
+
@@ -0,0 +1,27 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string; group_id: number }>({
5
+ description: '获取 QQ 群的群文件列表',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint 名称'),
8
+ group_id: z.number().describe('群号'),
9
+ }),
10
+ platforms: ['icqq'],
11
+ tags: ['icqq'],
12
+ async execute({ endpoint_id, group_id }: { endpoint_id: string; group_id: number }) {
13
+ const { Actions } = await import('../../src/protocol.js');
14
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
15
+ const resp = await endpoint.ipc.request(Actions.GFS_LIST, { group_id });
16
+ if (!resp.ok) throw new Error(resp.error ?? '获取群文件失败');
17
+ const files = Array.isArray(resp.data) ? resp.data : [];
18
+ if (!files.length) return { files: [], message: '群文件为空' };
19
+ return {
20
+ files: files.slice(0, 30).map((f: { name: string; size: number; uploader_uin: string; upload_time: number }) => ({
21
+ name: f.name, size: f.size, uploader: f.uploader_uin, upload_time: f.upload_time,
22
+ })),
23
+ count: files.length,
24
+ };
25
+ },
26
+ });
27
+
@@ -0,0 +1,20 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string; group_id: number; user_id: number }>({
5
+ description: '邀请好友加入 QQ 群',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ user_id: z.number().describe('要邀请的 QQ号'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ async execute({ endpoint_id, group_id, user_id }: { endpoint_id: string; group_id: number; user_id: number }) {
14
+ const { Actions } = await import('../../src/protocol.js');
15
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
16
+ const resp = await endpoint.ipc.request(Actions.GROUP_INVITE, { group_id, user_id });
17
+ return { success: resp.ok, message: resp.ok ? `已邀请 ${user_id} 加入群` : (resp.error ?? '邀请失败') };
18
+ },
19
+ });
20
+
@@ -0,0 +1,20 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string }>({
5
+ description: '获取 Endpoint 的 QQ 群列表',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint 名称'),
8
+ }),
9
+ platforms: ['icqq'],
10
+ tags: ['icqq'],
11
+ async execute({ endpoint_id }: { endpoint_id: string }) {
12
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
13
+ const groups = Array.from(endpoint.groups.values()).map((g) => ({
14
+ group_id: g.group_id, group_name: g.group_name,
15
+ member_count: g.member_count, max_member_count: g.max_member_count,
16
+ }));
17
+ return { groups: groups.slice(0, 50), count: endpoint.groups.size };
18
+ },
19
+ });
20
+
@@ -0,0 +1,19 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string; group_id: number }>({
5
+ description: 'QQ 群签到打卡',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ }),
10
+ platforms: ['icqq'],
11
+ tags: ['icqq'],
12
+ async execute({ endpoint_id, group_id }: { endpoint_id: string; group_id: number }) {
13
+ const { Actions } = await import('../../src/protocol.js');
14
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
15
+ const resp = await endpoint.ipc.request(Actions.GROUP_SIGN, { group_id });
16
+ return { success: resp.ok, message: resp.ok ? '群签到成功' : (resp.error ?? '签到失败') };
17
+ },
18
+ });
19
+
@@ -0,0 +1,22 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string; group_id: number }>({
5
+ description: '查询 QQ 群中当前被禁言的成员列表',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ }),
10
+ platforms: ['icqq'],
11
+ tags: ['icqq'],
12
+ permissions: ['platform(icqq,scene_admin)'],
13
+ async execute({ endpoint_id, group_id }: { endpoint_id: string; group_id: number }) {
14
+ const { Actions } = await import('../../src/protocol.js');
15
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
16
+ const resp = await endpoint.ipc.request(Actions.GROUP_MUTED_LIST, { group_id });
17
+ if (!resp.ok) throw new Error(resp.error ?? '获取禁言列表失败');
18
+ const list = Array.isArray(resp.data) ? resp.data : [];
19
+ return { muted_members: list, count: list.length };
20
+ },
21
+ });
22
+
@@ -0,0 +1,20 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string; group_id: number; user_id: number }>({
5
+ description: '在 QQ 群中对某个成员执行戳一戳互动操作',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ user_id: z.number().describe('要戳的目标成员 QQ号'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ async execute({ endpoint_id, group_id, user_id }: { endpoint_id: string; group_id: number; user_id: number }) {
14
+ const { Actions } = await import('../../src/protocol.js');
15
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
16
+ const resp = await endpoint.ipc.request(Actions.GROUP_POKE, { group_id, user_id });
17
+ return { success: resp.ok, message: resp.ok ? `已戳了戳 ${user_id}` : (resp.error ?? '戳一戳失败') };
18
+ },
19
+ });
20
+
@@ -0,0 +1,22 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string; user_id: number; times?: number }>({
5
+ description: '给用户点赞(竖大拇指),每人每天最多 20 次',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ user_id: z.number().describe('要点赞的目标用户 QQ号'),
9
+ times: z.number().optional().describe('点赞次数(1-20),默认 1'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ async execute({ endpoint_id, user_id, times }: { endpoint_id: string; user_id: number; times?: number }) {
14
+ const { Actions } = await import('../../src/protocol.js');
15
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
16
+ const resp = await endpoint.ipc.request(Actions.FRIEND_LIKE, {
17
+ user_id, times: Math.min(times ?? 1, 20),
18
+ });
19
+ return { success: resp.ok, message: resp.ok ? `已给 ${user_id} 点赞` : (resp.error ?? '点赞失败') };
20
+ },
21
+ });
22
+
@@ -0,0 +1,22 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string; group_id: number; enable?: boolean }>({
5
+ description: '开启或关闭 QQ 群的匿名聊天功能',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ enable: z.boolean().optional().describe('true=开启,false=关闭,默认 true'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ permissions: ['platform(icqq,scene_owner)'],
14
+ async execute({ endpoint_id, group_id, enable }: { endpoint_id: string; group_id: number; enable?: boolean }) {
15
+ const { Actions } = await import('../../src/protocol.js');
16
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
17
+ const on = enable ?? true;
18
+ const resp = await endpoint.ipc.request(Actions.GROUP_ALLOW_ANONY, { group_id, enable: on });
19
+ return { success: resp.ok, message: resp.ok ? (on ? '已开启匿名聊天' : '已关闭匿名聊天') : (resp.error ?? '操作失败') };
20
+ },
21
+ });
22
+
@@ -0,0 +1,25 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool<{ endpoint_id: string; group_id: number; user_id: number; title: string; duration?: number }>({
5
+ description: '设置 QQ 群成员的专属头衔',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ user_id: z.number().describe('目标成员 QQ号'),
10
+ title: z.string().describe('头衔文字'),
11
+ duration: z.number().optional().describe('持续时间(秒),-1永久'),
12
+ }),
13
+ platforms: ['icqq'],
14
+ tags: ['icqq'],
15
+ permissions: ['platform(icqq,scene_owner)'],
16
+ async execute({ endpoint_id, group_id, user_id, title, duration }: { endpoint_id: string; group_id: number; user_id: number; title: string; duration?: number }) {
17
+ const { Actions } = await import('../../src/protocol.js');
18
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
19
+ const resp = await endpoint.ipc.request(Actions.SET_GROUP_TITLE, {
20
+ group_id, user_id, title, duration: duration ?? -1,
21
+ });
22
+ return { success: resp.ok, message: resp.ok ? `已将 ${user_id} 的头衔设为 "${title}"` : (resp.error ?? '设置失败') };
23
+ },
24
+ });
25
+
@@ -0,0 +1,21 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool({
5
+ description: '发送 QQ 群公告(需要管理员权限)',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ content: z.string().describe('公告内容'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ permissions: ['platform(icqq,scene_admin)'],
14
+ async execute({ endpoint_id, group_id, content }) {
15
+ const { Actions } = await import('../../src/protocol.js');
16
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
17
+ const resp = await endpoint.ipc.request(Actions.GROUP_ANNOUNCE, { group_id, content });
18
+ return { success: resp.ok, message: resp.ok ? '群公告已发送' : (resp.error ?? '发送失败') };
19
+ },
20
+ });
21
+ //# sourceMappingURL=announce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"announce.js","sourceRoot":"","sources":["../../../agent/tools/announce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,eAAe,UAAU,CAA6D;IACpF,WAAW,EAAE,oBAAoB;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;KACrC,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,WAAW,EAAE,CAAC,4BAA4B,CAAC;IAC3C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAiE;QAC7G,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACvF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC;IACpF,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool({
5
+ description: '设置或移除 QQ 群精华消息',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ message_id: z.string().describe('消息 ID'),
9
+ action: z.enum(['add', 'remove']).describe('add=设为精华, remove=移除精华'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ permissions: ['platform(icqq,scene_admin)'],
14
+ async execute({ endpoint_id, message_id, action }) {
15
+ const { Actions } = await import('../../src/protocol.js');
16
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
17
+ const act = action === 'add' ? Actions.GROUP_ESSENCE_ADD : Actions.GROUP_ESSENCE_REMOVE;
18
+ const resp = await endpoint.ipc.request(act, { message_id });
19
+ return { success: resp.ok, message: resp.ok ? (action === 'add' ? '已设为精华' : '已移除精华') : (resp.error ?? '操作失败') };
20
+ },
21
+ });
22
+ //# sourceMappingURL=essence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"essence.js","sourceRoot":"","sources":["../../../agent/tools/essence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,eAAe,UAAU,CAAwE;IAC/F,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QACxC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KACpE,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,WAAW,EAAE,CAAC,4BAA4B,CAAC;IAC3C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAyE;QACtH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;QACxF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC;IAClH,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool({
5
+ description: '获取 QQ 好友列表',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint 名称'),
8
+ }),
9
+ platforms: ['icqq'],
10
+ tags: ['icqq'],
11
+ async execute({ endpoint_id }) {
12
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
13
+ const friends = Array.from(endpoint.friends.values()).map((f) => ({
14
+ user_id: f.user_id, nickname: f.nickname, remark: f.remark,
15
+ }));
16
+ return { friends: friends.slice(0, 50), count: endpoint.friends.size };
17
+ },
18
+ });
19
+ //# sourceMappingURL=friend_list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"friend_list.js","sourceRoot":"","sources":["../../../agent/tools/friend_list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,eAAe,UAAU,CAA0B;IACjD,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KAChD,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAA8B;QACvD,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM;SAC3D,CAAC,CAAC,CAAC;QACJ,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACzE,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool({
5
+ description: '获取 QQ 群的群文件列表',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint 名称'),
8
+ group_id: z.number().describe('群号'),
9
+ }),
10
+ platforms: ['icqq'],
11
+ tags: ['icqq'],
12
+ async execute({ endpoint_id, group_id }) {
13
+ const { Actions } = await import('../../src/protocol.js');
14
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
15
+ const resp = await endpoint.ipc.request(Actions.GFS_LIST, { group_id });
16
+ if (!resp.ok)
17
+ throw new Error(resp.error ?? '获取群文件失败');
18
+ const files = Array.isArray(resp.data) ? resp.data : [];
19
+ if (!files.length)
20
+ return { files: [], message: '群文件为空' };
21
+ return {
22
+ files: files.slice(0, 30).map((f) => ({
23
+ name: f.name, size: f.size, uploader: f.uploader_uin, upload_time: f.upload_time,
24
+ })),
25
+ count: files.length,
26
+ };
27
+ },
28
+ });
29
+ //# sourceMappingURL=group_files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group_files.js","sourceRoot":"","sources":["../../../agent/tools/group_files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,eAAe,UAAU,CAA4C;IACnE,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;KACpC,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAgD;QACnF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC1D,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAA4E,EAAE,EAAE,CAAC,CAAC;gBAC/G,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW;aACjF,CAAC,CAAC;YACH,KAAK,EAAE,KAAK,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool({
5
+ description: '邀请好友加入 QQ 群',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ user_id: z.number().describe('要邀请的 QQ号'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ async execute({ endpoint_id, group_id, user_id }) {
14
+ const { Actions } = await import('../../src/protocol.js');
15
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
16
+ const resp = await endpoint.ipc.request(Actions.GROUP_INVITE, { group_id, user_id });
17
+ return { success: resp.ok, message: resp.ok ? `已邀请 ${user_id} 加入群` : (resp.error ?? '邀请失败') };
18
+ },
19
+ });
20
+ //# sourceMappingURL=group_invite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group_invite.js","sourceRoot":"","sources":["../../../agent/tools/group_invite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,eAAe,UAAU,CAA6D;IACpF,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;KACzC,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAiE;QAC7G,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACrF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC;IAChG,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool({
5
+ description: '获取 Endpoint 的 QQ 群列表',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint 名称'),
8
+ }),
9
+ platforms: ['icqq'],
10
+ tags: ['icqq'],
11
+ async execute({ endpoint_id }) {
12
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
13
+ const groups = Array.from(endpoint.groups.values()).map((g) => ({
14
+ group_id: g.group_id, group_name: g.group_name,
15
+ member_count: g.member_count, max_member_count: g.max_member_count,
16
+ }));
17
+ return { groups: groups.slice(0, 50), count: endpoint.groups.size };
18
+ },
19
+ });
20
+ //# sourceMappingURL=group_list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group_list.js","sourceRoot":"","sources":["../../../agent/tools/group_list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,eAAe,UAAU,CAA0B;IACjD,WAAW,EAAE,sBAAsB;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KAChD,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAA8B;QACvD,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU;YAC9C,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;SACnE,CAAC,CAAC,CAAC;QACJ,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACtE,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool({
5
+ description: 'QQ 群签到打卡',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ }),
10
+ platforms: ['icqq'],
11
+ tags: ['icqq'],
12
+ async execute({ endpoint_id, group_id }) {
13
+ const { Actions } = await import('../../src/protocol.js');
14
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
15
+ const resp = await endpoint.ipc.request(Actions.GROUP_SIGN, { group_id });
16
+ return { success: resp.ok, message: resp.ok ? '群签到成功' : (resp.error ?? '签到失败') };
17
+ },
18
+ });
19
+ //# sourceMappingURL=group_sign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group_sign.js","sourceRoot":"","sources":["../../../agent/tools/group_sign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,eAAe,UAAU,CAA4C;IACnE,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;KACtC,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAgD;QACnF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC;IACnF,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool({
5
+ description: '查询 QQ 群中当前被禁言的成员列表',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ }),
10
+ platforms: ['icqq'],
11
+ tags: ['icqq'],
12
+ permissions: ['platform(icqq,scene_admin)'],
13
+ async execute({ endpoint_id, group_id }) {
14
+ const { Actions } = await import('../../src/protocol.js');
15
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
16
+ const resp = await endpoint.ipc.request(Actions.GROUP_MUTED_LIST, { group_id });
17
+ if (!resp.ok)
18
+ throw new Error(resp.error ?? '获取禁言列表失败');
19
+ const list = Array.isArray(resp.data) ? resp.data : [];
20
+ return { muted_members: list, count: list.length };
21
+ },
22
+ });
23
+ //# sourceMappingURL=list_muted.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_muted.js","sourceRoot":"","sources":["../../../agent/tools/list_muted.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,eAAe,UAAU,CAA4C;IACnE,WAAW,EAAE,oBAAoB;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;KACtC,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,WAAW,EAAE,CAAC,4BAA4B,CAAC;IAC3C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAgD;QACnF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACrD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool({
5
+ description: '在 QQ 群中对某个成员执行戳一戳互动操作',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ user_id: z.number().describe('要戳的目标成员 QQ号'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ async execute({ endpoint_id, group_id, user_id }) {
14
+ const { Actions } = await import('../../src/protocol.js');
15
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
16
+ const resp = await endpoint.ipc.request(Actions.GROUP_POKE, { group_id, user_id });
17
+ return { success: resp.ok, message: resp.ok ? `已戳了戳 ${user_id}` : (resp.error ?? '戳一戳失败') };
18
+ },
19
+ });
20
+ //# sourceMappingURL=poke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poke.js","sourceRoot":"","sources":["../../../agent/tools/poke.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,eAAe,UAAU,CAA6D;IACpF,WAAW,EAAE,uBAAuB;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;KAC5C,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAiE;QAC7G,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACnF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,EAAE,CAAC;IAC9F,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool({
5
+ description: '给用户点赞(竖大拇指),每人每天最多 20 次',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ user_id: z.number().describe('要点赞的目标用户 QQ号'),
9
+ times: z.number().optional().describe('点赞次数(1-20),默认 1'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ async execute({ endpoint_id, user_id, times }) {
14
+ const { Actions } = await import('../../src/protocol.js');
15
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
16
+ const resp = await endpoint.ipc.request(Actions.FRIEND_LIKE, {
17
+ user_id, times: Math.min(times ?? 1, 20),
18
+ });
19
+ return { success: resp.ok, message: resp.ok ? `已给 ${user_id} 点赞` : (resp.error ?? '点赞失败') };
20
+ },
21
+ });
22
+ //# sourceMappingURL=send_user_like.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send_user_like.js","sourceRoot":"","sources":["../../../agent/tools/send_user_like.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,eAAe,UAAU,CAA2D;IAClF,WAAW,EAAE,yBAAyB;IACtC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAChD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;KACzD,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAA+D;QACxG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE;YAC3D,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;SACzC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC;IAC9F,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { defineTool } from '@zhin.js/agent/tools';
2
+ import { z } from 'zod';
3
+ import { getIcqqAgentDeps } from '../../src/icqq-agent-deps.js';
4
+ export default defineTool({
5
+ description: '开启或关闭 QQ 群的匿名聊天功能',
6
+ inputSchema: z.object({
7
+ endpoint_id: z.string().describe('Endpoint QQ号'),
8
+ group_id: z.number().describe('目标群号'),
9
+ enable: z.boolean().optional().describe('true=开启,false=关闭,默认 true'),
10
+ }),
11
+ platforms: ['icqq'],
12
+ tags: ['icqq'],
13
+ permissions: ['platform(icqq,scene_owner)'],
14
+ async execute({ endpoint_id, group_id, enable }) {
15
+ const { Actions } = await import('../../src/protocol.js');
16
+ const endpoint = getIcqqAgentDeps().getEndpoint(endpoint_id);
17
+ const on = enable ?? true;
18
+ const resp = await endpoint.ipc.request(Actions.GROUP_ALLOW_ANONY, { group_id, enable: on });
19
+ return { success: resp.ok, message: resp.ok ? (on ? '已开启匿名聊天' : '已关闭匿名聊天') : (resp.error ?? '操作失败') };
20
+ },
21
+ });
22
+ //# sourceMappingURL=set_anonymous.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set_anonymous.js","sourceRoot":"","sources":["../../../agent/tools/set_anonymous.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,eAAe,UAAU,CAA8D;IACrF,WAAW,EAAE,mBAAmB;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KACpE,CAAC;IACF,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,WAAW,EAAE,CAAC,4BAA4B,CAAC;IAC3C,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAkE;QAC7G,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7F,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,CAAC;IACxG,CAAC;CACF,CAAC,CAAC"}