@zhin.js/adapter-icqq 6.0.0 → 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.
- package/CHANGELOG.md +38 -0
- package/README.md +3 -3
- package/{skills/icqq → agent}/PERMITS.md +6 -6
- package/agent/tools/announce.ts +21 -0
- package/agent/tools/essence.ts +22 -0
- package/agent/tools/friend_list.ts +19 -0
- package/agent/tools/group_files.ts +27 -0
- package/agent/tools/group_invite.ts +20 -0
- package/agent/tools/group_list.ts +20 -0
- package/agent/tools/group_sign.ts +19 -0
- package/agent/tools/list_muted.ts +22 -0
- package/agent/tools/poke.ts +20 -0
- package/agent/tools/send_user_like.ts +22 -0
- package/agent/tools/set_anonymous.ts +22 -0
- package/agent/tools/set_title.ts +25 -0
- package/dist/index.js +2 -2
- package/lib/agent/tools/announce.js +21 -0
- package/lib/agent/tools/announce.js.map +1 -0
- package/lib/agent/tools/essence.js +22 -0
- package/lib/agent/tools/essence.js.map +1 -0
- package/lib/agent/tools/friend_list.js +19 -0
- package/lib/agent/tools/friend_list.js.map +1 -0
- package/lib/agent/tools/group_files.js +29 -0
- package/lib/agent/tools/group_files.js.map +1 -0
- package/lib/agent/tools/group_invite.js +20 -0
- package/lib/agent/tools/group_invite.js.map +1 -0
- package/lib/agent/tools/group_list.js +20 -0
- package/lib/agent/tools/group_list.js.map +1 -0
- package/lib/agent/tools/group_sign.js +19 -0
- package/lib/agent/tools/group_sign.js.map +1 -0
- package/lib/agent/tools/list_muted.js +23 -0
- package/lib/agent/tools/list_muted.js.map +1 -0
- package/lib/agent/tools/poke.js +20 -0
- package/lib/agent/tools/poke.js.map +1 -0
- package/lib/agent/tools/send_user_like.js +22 -0
- package/lib/agent/tools/send_user_like.js.map +1 -0
- package/lib/agent/tools/set_anonymous.js +22 -0
- package/lib/agent/tools/set_anonymous.js.map +1 -0
- package/lib/agent/tools/set_title.js +25 -0
- package/lib/agent/tools/set_title.js.map +1 -0
- package/lib/{adapter.js → src/adapter.js} +13 -6
- package/lib/src/adapter.js.map +1 -0
- package/lib/src/agent-prompt.js.map +1 -0
- package/lib/{cq-message.js → src/cq-message.js} +12 -3
- package/lib/src/cq-message.js.map +1 -0
- package/lib/{endpoint.js → src/endpoint.js} +130 -63
- package/lib/src/endpoint.js.map +1 -0
- package/lib/{forward-msg.js → src/forward-msg.js} +4 -1
- package/lib/src/forward-msg.js.map +1 -0
- package/lib/src/get-msg.js.map +1 -0
- package/lib/src/icqq-agent-deps.js +10 -0
- package/lib/src/icqq-agent-deps.js.map +1 -0
- package/lib/src/icqq-guild.js +115 -0
- package/lib/src/icqq-guild.js.map +1 -0
- package/lib/{icqq-inbound.js → src/icqq-inbound.js} +15 -5
- package/lib/src/icqq-inbound.js.map +1 -0
- package/lib/src/icqq-login-assist-bridge.js.map +1 -0
- package/lib/{icqq-side-events.js → src/icqq-side-events.js} +28 -92
- package/lib/src/icqq-side-events.js.map +1 -0
- package/lib/{index.js → src/index.js} +0 -1
- package/lib/src/index.js.map +1 -0
- package/lib/src/ipc-client.js.map +1 -0
- package/lib/src/login-assist-routes.js.map +1 -0
- package/lib/src/login-ipc-contract.js.map +1 -0
- package/lib/src/outbound-media.js.map +1 -0
- package/lib/src/protocol.js.map +1 -0
- package/lib/src/routes.js.map +1 -0
- package/lib/src/segment-mapper.js +2 -0
- package/lib/src/segment-mapper.js.map +1 -0
- package/lib/src/tools/index.js +23 -0
- package/lib/src/tools/index.js.map +1 -0
- package/lib/src/types.js.map +1 -0
- package/package.json +25 -21
- package/src/adapter.ts +13 -6
- package/src/agent-prompt.ts +1 -2
- package/src/cq-message.ts +11 -3
- package/src/endpoint.ts +158 -82
- package/src/forward-msg.ts +2 -2
- package/src/icqq-agent-deps.ts +18 -0
- package/src/icqq-guild.ts +157 -0
- package/src/icqq-inbound.ts +16 -5
- package/src/icqq-side-events.ts +33 -118
- package/src/index.ts +0 -8
- package/src/segment-mapper.ts +1 -0
- package/src/tools/index.ts +16 -397
- package/src/types.ts +0 -45
- package/lib/adapter.d.ts +0 -39
- package/lib/adapter.d.ts.map +0 -1
- package/lib/adapter.js.map +0 -1
- package/lib/agent-prompt.d.ts +0 -3
- package/lib/agent-prompt.d.ts.map +0 -1
- package/lib/agent-prompt.js.map +0 -1
- package/lib/cq-message.d.ts +0 -10
- package/lib/cq-message.d.ts.map +0 -1
- package/lib/cq-message.js.map +0 -1
- package/lib/endpoint.d.ts +0 -99
- package/lib/endpoint.d.ts.map +0 -1
- package/lib/endpoint.js.map +0 -1
- package/lib/forward-msg.d.ts +0 -27
- package/lib/forward-msg.d.ts.map +0 -1
- package/lib/forward-msg.js.map +0 -1
- package/lib/get-msg.d.ts +0 -3
- package/lib/get-msg.d.ts.map +0 -1
- package/lib/get-msg.js.map +0 -1
- package/lib/icqq-inbound.d.ts +0 -130
- package/lib/icqq-inbound.d.ts.map +0 -1
- package/lib/icqq-inbound.js.map +0 -1
- package/lib/icqq-login-assist-bridge.d.ts +0 -5
- package/lib/icqq-login-assist-bridge.d.ts.map +0 -1
- package/lib/icqq-login-assist-bridge.js.map +0 -1
- package/lib/icqq-side-events.d.ts +0 -34
- package/lib/icqq-side-events.d.ts.map +0 -1
- package/lib/icqq-side-events.js.map +0 -1
- package/lib/index.d.ts +0 -20
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/ipc-client.d.ts +0 -74
- package/lib/ipc-client.d.ts.map +0 -1
- package/lib/ipc-client.js.map +0 -1
- package/lib/login-assist-routes.d.ts +0 -7
- package/lib/login-assist-routes.d.ts.map +0 -1
- package/lib/login-assist-routes.js.map +0 -1
- package/lib/login-ipc-contract.d.ts +0 -44
- package/lib/login-ipc-contract.d.ts.map +0 -1
- package/lib/login-ipc-contract.js.map +0 -1
- package/lib/outbound-media.d.ts +0 -14
- package/lib/outbound-media.d.ts.map +0 -1
- package/lib/outbound-media.js.map +0 -1
- package/lib/protocol.d.ts +0 -198
- package/lib/protocol.d.ts.map +0 -1
- package/lib/protocol.js.map +0 -1
- package/lib/routes.d.ts +0 -8
- package/lib/routes.d.ts.map +0 -1
- package/lib/routes.js.map +0 -1
- package/lib/tools/index.d.ts +0 -10
- package/lib/tools/index.d.ts.map +0 -1
- package/lib/tools/index.js +0 -341
- package/lib/tools/index.js.map +0 -1
- package/lib/types.d.ts +0 -117
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js.map +0 -1
- package/lib/typing-indicator-example.d.ts +0 -108
- package/lib/typing-indicator-example.d.ts.map +0 -1
- package/lib/typing-indicator-example.js +0 -220
- package/lib/typing-indicator-example.js.map +0 -1
- package/lib/typing-indicator.d.ts +0 -87
- package/lib/typing-indicator.d.ts.map +0 -1
- package/lib/typing-indicator.js +0 -229
- package/lib/typing-indicator.js.map +0 -1
- package/src/typing-indicator-example.ts +0 -269
- package/src/typing-indicator.ts +0 -317
- /package/lib/{agent-prompt.js → src/agent-prompt.js} +0 -0
- /package/lib/{get-msg.js → src/get-msg.js} +0 -0
- /package/lib/{icqq-login-assist-bridge.js → src/icqq-login-assist-bridge.js} +0 -0
- /package/lib/{ipc-client.js → src/ipc-client.js} +0 -0
- /package/lib/{login-assist-routes.js → src/login-assist-routes.js} +0 -0
- /package/lib/{login-ipc-contract.js → src/login-ipc-contract.js} +0 -0
- /package/lib/{outbound-media.js → src/outbound-media.js} +0 -0
- /package/lib/{protocol.js → src/protocol.js} +0 -0
- /package/lib/{routes.js → src/routes.js} +0 -0
- /package/lib/{types.js → src/types.js} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
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
|
+
|
|
22
|
+
## 6.0.1
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- 5cc9c03: fix: ai 优化
|
|
27
|
+
- b9b3881: fix: 增加游戏引擎以及部分游戏
|
|
28
|
+
- Updated dependencies [5b08052]
|
|
29
|
+
- Updated dependencies [5cc9c03]
|
|
30
|
+
- Updated dependencies [36d6db2]
|
|
31
|
+
- Updated dependencies [b9b3881]
|
|
32
|
+
- Updated dependencies [7700903]
|
|
33
|
+
- @zhin.js/agent@1.0.2
|
|
34
|
+
- @zhin.js/core@1.3.3
|
|
35
|
+
- @zhin.js/client@2.0.4
|
|
36
|
+
- @zhin.js/contract@1.0.2
|
|
37
|
+
- @zhin.js/host-api@2.0.4
|
|
38
|
+
- @zhin.js/host-router@2.0.2
|
|
39
|
+
- zhin.js@4.1.1
|
|
40
|
+
|
|
3
41
|
## 6.0.0
|
|
4
42
|
|
|
5
43
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -261,11 +261,12 @@ const memberInfo = endpoint.getGroupMemberInfo(groupId, userId)
|
|
|
261
261
|
|
|
262
262
|
## 🔧 群管理工具(AI 可调用)
|
|
263
263
|
|
|
264
|
-
|
|
264
|
+
|
|
265
|
+
适配器通过覆写 `ISceneManagement` 标准方法自动注册群管理工具,同时保留平台特有工具,这些工具可以被 AI 调用,实现智能化的群管理。
|
|
265
266
|
|
|
266
267
|
### 标准群管工具(自动生成)
|
|
267
268
|
|
|
268
|
-
通过覆写 `
|
|
269
|
+
通过覆写 `ISceneManagement` 方法,`start()` 时自动检测并生成对应 Tool:
|
|
269
270
|
|
|
270
271
|
| 工具 | 覆写方法 | 所需权限 | 说明 |
|
|
271
272
|
|------|---------|----------|------|
|
|
@@ -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
|
|
|
@@ -8,15 +8,15 @@
|
|
|
8
8
|
|
|
9
9
|
| `platform(icqq,…)` | 含义 |
|
|
10
10
|
|--------------------|------|
|
|
11
|
-
| `
|
|
12
|
-
| `
|
|
11
|
+
| `scene_owner` | 群主 |
|
|
12
|
+
| `scene_admin` | 群管理员(含群主) |
|
|
13
13
|
|
|
14
14
|
## 扩展工具示例
|
|
15
15
|
|
|
16
16
|
| 工具 | permit |
|
|
17
17
|
|------|--------|
|
|
18
|
-
| `icqq_set_title` | `
|
|
19
|
-
| `icqq_announce` / `icqq_essence` / `icqq_list_muted` | `
|
|
20
|
-
| `icqq_set_anonymous` | `
|
|
18
|
+
| `icqq_set_title` | `scene_owner` |
|
|
19
|
+
| `icqq_announce` / `icqq_essence` / `icqq_list_muted` | `scene_admin` |
|
|
20
|
+
| `icqq_set_anonymous` | `scene_owner` |
|
|
21
21
|
|
|
22
|
-
工厂群管工具使用默认 `
|
|
22
|
+
工厂群管工具使用默认 `scene_admin` / `scene_owner`。
|
|
@@ -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
|
+
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{useCallback as De,useEffect as Re,useState as z}from"react";import{forwardRef as re,createElement as fe}from"react";var N=(...a)=>a.filter((u,f,s)=>!!u&&u.trim()!==""&&s.indexOf(u)===f).join(" ").trim();var Q=a=>a.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var J=a=>a.replace(/^([A-Z])|[\s-_]+(\w)/g,(u,f,s)=>s?s.toUpperCase():f.toLowerCase());var X=a=>{let u=J(a);return u.charAt(0).toUpperCase()+u.slice(1)};import{forwardRef as le,createElement as Y}from"react";var V={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var _=a=>{for(let u in a)if(u.startsWith("aria-")||u==="role"||u==="title")return!0;return!1};import{createContext as oe,useContext as ue,useMemo as Ee,createElement as Ne}from"react";var de=oe({});var j=()=>ue(de);var $=le(({color:a,size:u,strokeWidth:f,absoluteStrokeWidth:s,className:L="",children:i,iconNode:n,...h},x)=>{let{size:l=24,strokeWidth:m=2,absoluteStrokeWidth:G=!1,color:g="currentColor",className:F=""}=j()??{},P=s??G?Number(f??m)*24/Number(u??l):f??m;return Y("svg",{ref:x,...V,width:u??l??V.width,height:u??l??V.height,stroke:a??g,strokeWidth:P,className:N("lucide",F,L),...!i&&!_(h)&&{"aria-hidden":"true"},...h},[...n.map(([W,e])=>Y(W,e)),...Array.isArray(i)?i:[i]])});var o=(a,u)=>{let f=re(({className:s,...L},i)=>fe($,{ref:i,iconNode:u,className:N(`lucide-${Q(X(a))}`,`lucide-${a}`,s),...L}));return f.displayName=X(a),f};var se=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],y=o("activity",se);var ie=[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]],A=o("bot",ie);var ce=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],k=o("circle-alert",ce);var ne=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],C=o("loader-circle",ne);var pe=[["path",{d:"m10 17 5-5-5-5",key:"1bsop3"}],["path",{d:"M15 12H3",key:"6jk70r"}],["path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4",key:"u53s6r"}]],w=o("log-in",pe);var me=[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",key:"18887p"}]],D=o("message-square",me);var Le=[["path",{d:"M12.586 12.586 19 19",key:"ea5xo7"}],["path",{d:"M3.688 3.037a.497.497 0 0 0-.651.651l6.5 15.999a.501.501 0 0 0 .947-.062l1.569-6.083a2 2 0 0 1 1.448-1.479l6.124-1.579a.5.5 0 0 0 .063-.947z",key:"277e5u"}]],R=o("mouse-pointer",Le);var Ie=[["rect",{width:"5",height:"5",x:"3",y:"3",rx:"1",key:"1tu5fj"}],["rect",{width:"5",height:"5",x:"16",y:"3",rx:"1",key:"1v8r4q"}],["rect",{width:"5",height:"5",x:"3",y:"16",rx:"1",key:"1x03jg"}],["path",{d:"M21 16h-3a2 2 0 0 0-2 2v3",key:"177gqh"}],["path",{d:"M21 21v.01",key:"ents32"}],["path",{d:"M12 7v3a2 2 0 0 1-2 2H7",key:"8crl2c"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M12 3h.01",key:"n36tog"}],["path",{d:"M12 16v.01",key:"133mhm"}],["path",{d:"M16 12h1",key:"1slzba"}],["path",{d:"M21 12v.01",key:"1lwtk9"}],["path",{d:"M12 21v-1",key:"1880an"}]],b=o("qr-code",Ie);var xe=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],T=o("refresh-cw",xe);var Ce=[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]],B=o("smartphone",Ce);var he=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],q=o("users",he);var ge=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],v=o("wifi-off",ge);var Se=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]],U=o("wifi",Se);var ke=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],O=o("x",ke);import{useCallback as ae,useEffect as Be,useRef as te,useState as H}from"react";var ee="zhin_api_token",we="zhin_api_base";function Pe(){let a=localStorage.getItem(we)?.trim();return a?a.replace(/\/$/,""):typeof window<"u"?window.location.origin:""}function Ae(){return localStorage.getItem(ee)}async function M(a,u){let f=Ae(),s=new Headers(u?.headers);f&&s.set("Authorization",`Bearer ${f}`);let L=Pe(),i=typeof a=="string"&&a.startsWith("/")?`${L}${a}`:a,n=await fetch(i,{...u,headers:s});return n.status===401&&(localStorage.removeItem(ee),window.dispatchEvent(new CustomEvent("zhin:auth-required"))),n}import{jsx as t,jsxs as p}from"react/jsx-runtime";var Me=2e3,Fe=15e3,ye={qrcode:{icon:t(b,{className:"w-4 h-4"}),label:"\u626B\u7801\u767B\u5F55"},sms:{icon:t(D,{className:"w-4 h-4"}),label:"\u77ED\u4FE1\u9A8C\u8BC1\u7801"},device:{icon:t(B,{className:"w-4 h-4"}),label:"\u8BBE\u5907\u9A8C\u8BC1"},auth:{icon:t(B,{className:"w-4 h-4"}),label:"\u8EAB\u4EFD\u9A8C\u8BC1"},slider:{icon:t(R,{className:"w-4 h-4"}),label:"\u6ED1\u5757\u9A8C\u8BC1"}};function K(){let[a,u]=H([]),[f,s]=H(!0),[L,i]=H(null),[n,h]=H({}),[x,l]=H({}),m=te(0),G=te(),g=ae(async()=>{try{let e=await M("/api/login-assist/pending");if(!e.ok)throw new Error("\u83B7\u53D6\u5F85\u529E\u5931\u8D25");let S=await e.json(),I=(Array.isArray(S)?S:[]).filter(E=>E.adapter==="icqq");u(I),i(null),m.current=I.length>0?0:m.current+1}catch(e){i(e.message),m.current++}finally{s(!1)}},[]),F=ae(()=>{let e=Math.min(Me*Math.pow(1.5,m.current),Fe);G.current=setTimeout(async()=>{await g(),F()},e)},[g]);Be(()=>(g().then(F),()=>clearTimeout(G.current)),[g,F]);let P=async(e,S)=>{h(d=>({...d,[e]:!0}));try{if(!(await M("/api/login-assist/submit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e,value:S})})).ok)throw new Error("\u63D0\u4EA4\u5931\u8D25");l(I=>{let E={...I};return delete E[e],E}),m.current=0,await g()}catch(d){i(d.message)}finally{h(d=>({...d,[e]:!1}))}},W=async e=>{try{(await M("/api/login-assist/cancel",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e})})).ok&&await g()}catch{}};return f&&a.length===0?t("div",{className:"flex justify-center py-12",children:t(C,{className:"w-6 h-6 animate-spin text-blue-500"})}):p("div",{className:"space-y-4",children:[t("p",{className:"text-sm text-muted-foreground",children:"\u626B\u7801\u3001\u77ED\u4FE1\u6216\u6ED1\u5757\u7B49\u9A8C\u8BC1\u4F1A\u51FA\u73B0\u5728\u4E0B\u65B9\uFF1B\u5237\u65B0\u9875\u9762\u540E\u4ECD\u53EF\u7EE7\u7EED\u5904\u7406\uFF08\u4EC5 ICQQ \u5F85\u529E\uFF09\u3002"}),L&&p("div",{className:"flex items-center gap-2 p-3 rounded border border-red-200 bg-red-50 text-red-600 text-sm dark:bg-red-900/20 dark:text-red-400 dark:border-red-800",children:[t(k,{className:"w-4 h-4 shrink-0"}),t("span",{children:L}),t("button",{onClick:()=>i(null),className:"ml-auto",children:t(O,{className:"w-3.5 h-3.5"})})]}),a.length===0?p("div",{className:"border rounded-lg bg-card p-12 text-center",children:[t(w,{className:"w-16 h-16 mx-auto mb-4 opacity-25"}),t("h3",{className:"text-lg font-semibold mb-1",children:"\u6682\u65E0\u5F85\u529E"}),t("p",{className:"text-sm text-muted-foreground",children:"\u673A\u5668\u4EBA\u9700\u8981\u9A8C\u8BC1\u65F6\uFF0C\u5F85\u529E\u5C06\u663E\u793A\u5728\u6B64\u5904"})]}):t("div",{className:"space-y-4",children:a.map(e=>{let S=ye[e.type]??{icon:t(w,{className:"w-4 h-4"}),label:e.type};return p("div",{className:"border rounded-lg bg-card p-4 shadow-sm",children:[p("div",{className:"flex items-start justify-between flex-wrap gap-2 mb-2",children:[p("div",{className:"flex items-center gap-2 font-semibold",children:[S.icon," ",S.label]}),p("div",{className:"flex gap-1 text-xs",children:[t("span",{className:"px-2 py-0.5 rounded border",children:e.adapter}),t("span",{className:"px-2 py-0.5 rounded bg-muted",children:e.endpointId})]})]}),e.payload?.message&&t("p",{className:"text-sm text-muted-foreground mb-3",children:e.payload.message}),e.type==="qrcode"&&e.payload?.image&&t("div",{className:"flex justify-center p-4 bg-muted/30 rounded-lg mb-3",children:t("img",{src:String(e.payload.image),alt:"\u767B\u5F55\u4E8C\u7EF4\u7801",className:"max-w-[200px] w-full h-auto"})}),(e.type==="slider"||e.type==="auth")&&e.payload?.url&&p("p",{className:"text-sm break-all mb-3",children:[t("span",{className:"text-muted-foreground",children:"\u9A8C\u8BC1\u94FE\u63A5\uFF1A"})," ",t("a",{href:String(e.payload.url),target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",children:String(e.payload.url)})]}),e.type==="auth"&&e.payload?.device&&typeof e.payload.device=="object"&&p("div",{className:"text-xs text-muted-foreground mb-3 space-y-1 rounded border p-3 bg-muted/20",children:[t("div",{className:"font-medium text-foreground",children:"\u8BBE\u5907\u4FE1\u606F\uFF08\u767B\u5F55\u7EED\u4F20\u7528\uFF09"}),Object.entries(e.payload.device).filter(([,d])=>d!=null&&String(d)!=="").map(([d,I])=>p("div",{children:[p("span",{className:"opacity-70",children:[d,": "]}),t("span",{className:"font-mono break-all",children:String(I)})]},d))]}),e.type==="auth"&&p("div",{className:"flex gap-2 mt-3",children:[t("button",{className:"h-9 px-4 rounded-md bg-primary text-primary-foreground text-sm disabled:opacity-50",disabled:!!n[e.id],onClick:()=>{P(e.id,{done:!0})},children:n[e.id]?"\u63D0\u4EA4\u4E2D\u2026":"\u6211\u5DF2\u5B8C\u6210\u9A8C\u8BC1"}),t("button",{className:"h-9 px-4 rounded-md border text-sm hover:bg-accent transition-colors",onClick:()=>{W(e.id)},children:"\u53D6\u6D88"})]}),(e.type==="sms"||e.type==="device"||e.type==="slider")&&p("div",{className:"flex flex-wrap gap-2 items-center",children:[t("input",{className:"h-9 px-3 rounded-md border border-input bg-background text-sm max-w-[18rem] flex-1",placeholder:e.type==="slider"?"\u8F93\u5165 ticket":"\u8F93\u5165\u9A8C\u8BC1\u7801",value:x[e.id]??"",onChange:d=>l(I=>({...I,[e.id]:d.target.value})),onKeyDown:d=>{if(d.key==="Enter"){let I=x[e.id]?.trim();I&&P(e.id,e.type==="slider"?{ticket:I}:I)}}}),t("button",{className:"h-9 px-4 rounded-md bg-primary text-primary-foreground text-sm disabled:opacity-50",disabled:n[e.id]||!x[e.id]?.trim(),onClick:()=>{let d=x[e.id]?.trim();d&&P(e.id,e.type==="slider"?{ticket:d}:d)},children:n[e.id]?"\u63D0\u4EA4\u4E2D\u2026":"\u63D0\u4EA4"})]}),e.type==="qrcode"&&p("div",{className:"flex gap-2 mt-3",children:[t("button",{className:"h-9 px-4 rounded-md bg-primary text-primary-foreground text-sm disabled:opacity-50",disabled:!!n[e.id],onClick:()=>{P(e.id,{done:!0})},children:n[e.id]?"\u63D0\u4EA4\u4E2D\u2026":"\u6211\u5DF2\u626B\u7801"}),t("button",{className:"h-9 px-4 rounded-md border text-sm hover:bg-accent transition-colors",onClick:()=>{W(e.id)},children:"\u53D6\u6D88"})]})]},e.id)})})]})}import{Fragment as be,jsx as r,jsxs as c}from"react/jsx-runtime";function Z(){let[a,u]=z("overview"),[f,s]=z([]),[L,i]=z(!0),[n,h]=z(null),x=De(async()=>{i(!0),h(null);try{let l=await M("/api/icqq/endpoints"),m=await l.json();if(!l.ok||!m.success)throw new Error(m.message||"\u52A0\u8F7D\u5931\u8D25");s(Array.isArray(m.data)?m.data:[])}catch(l){h(l.message),s([])}finally{i(!1)}},[]);return Re(()=>{a==="overview"&&x()},[a,x]),c("div",{className:"p-6 max-w-5xl mx-auto space-y-5",children:[c("div",{className:"flex items-center justify-between",children:[c("div",{children:[c("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[r(A,{className:"w-6 h-6"})," ICQQ \u7BA1\u7406"]}),r("p",{className:"text-sm text-muted-foreground mt-1",children:"\u673A\u5668\u4EBA\u6982\u89C8\u4E0E\u767B\u5F55\u8F85\u52A9\uFF08\u626B\u7801 / \u9A8C\u8BC1\u7801 / \u6ED1\u5757\uFF09"})]}),a==="overview"&&c("button",{onClick:x,disabled:L,className:"flex items-center gap-1 px-3 py-1.5 rounded bg-blue-500 text-white hover:bg-blue-600 disabled:opacity-50 text-sm",children:[r(T,{className:`w-4 h-4 ${L?"animate-spin":""}`})," \u5237\u65B0"]})]}),c("div",{className:"flex gap-1 border-b",children:[r("button",{onClick:()=>u("overview"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${a==="overview"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:c("span",{className:"flex items-center gap-1.5",children:[r(A,{className:"w-4 h-4"})," \u6982\u89C8"]})}),r("button",{onClick:()=>u("login"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${a==="login"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:c("span",{className:"flex items-center gap-1.5",children:[r(w,{className:"w-4 h-4"})," \u767B\u5F55\u8F85\u52A9"]})})]}),a==="overview"&&c(be,{children:[n&&r("div",{className:"p-3 bg-red-50 text-red-600 rounded border border-red-200 text-sm dark:bg-red-900/20 dark:text-red-400 dark:border-red-800",children:n}),L?r("div",{className:"flex justify-center py-12",children:r(C,{className:"w-6 h-6 animate-spin text-blue-500"})}):f.length===0?r("div",{className:"text-center text-muted-foreground py-12",children:"\u6682\u65E0 ICQQ Endpoint \u5B9E\u4F8B"}):r("div",{className:"grid gap-4 md:grid-cols-2",children:f.map(l=>c("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[c("div",{className:"flex items-center justify-between mb-3",children:[r("span",{className:"font-medium text-lg",children:l.name}),l.connected?c("span",{className:"flex items-center gap-1 text-green-600 text-sm",children:[r(U,{className:"w-4 h-4"})," \u5728\u7EBF"]}):c("span",{className:"flex items-center gap-1 text-gray-400 text-sm",children:[r(v,{className:"w-4 h-4"})," \u79BB\u7EBF"]})]}),c("div",{className:"space-y-2 text-sm text-muted-foreground",children:[c("div",{className:"flex items-center gap-1.5",children:[r(q,{className:"w-3.5 h-3.5"}),"\u7FA4 ",l.groupCount," \xB7 \u597D\u53CB ",l.friendCount]}),c("div",{className:"flex items-center gap-1.5",children:[r(y,{className:"w-3.5 h-3.5"}),"\u767B\u5F55\u65B9\u5F0F ",l.loginMode," \xB7 ",l.status]})]})]},l.name))})]}),a==="login"&&r(K,{})]})}function dt(a){a.addRoute({path:"/console/icqq",name:"ICQQ\u7BA1\u7406",element:a.React.createElement(Z,{hostReact:a.React})}),a.addTool({id:"icqq",name:"ICQQ",path:"/console/icqq"})}export{dt as register};
|
|
1
|
+
import{useCallback as ye,useEffect as Re,useState as z}from"react";import{forwardRef as re,createElement as fe}from"react";var N=(...a)=>a.filter((u,f,s)=>!!u&&u.trim()!==""&&s.indexOf(u)===f).join(" ").trim();var Q=a=>a.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var J=a=>a.replace(/^([A-Z])|[\s-_]+(\w)/g,(u,f,s)=>s?s.toUpperCase():f.toLowerCase());var X=a=>{let u=J(a);return u.charAt(0).toUpperCase()+u.slice(1)};import{forwardRef as le,createElement as Y}from"react";var V={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var _=a=>{for(let u in a)if(u.startsWith("aria-")||u==="role"||u==="title")return!0;return!1};import{createContext as oe,useContext as ue,useMemo as Ee,createElement as Ne}from"react";var de=oe({});var j=()=>ue(de);var $=le(({color:a,size:u,strokeWidth:f,absoluteStrokeWidth:s,className:L="",children:i,iconNode:n,...h},x)=>{let{size:l=24,strokeWidth:m=2,absoluteStrokeWidth:G=!1,color:g="currentColor",className:D=""}=j()??{},P=s??G?Number(f??m)*24/Number(u??l):f??m;return Y("svg",{ref:x,...V,width:u??l??V.width,height:u??l??V.height,stroke:a??g,strokeWidth:P,className:N("lucide",D,L),...!i&&!_(h)&&{"aria-hidden":"true"},...h},[...n.map(([W,e])=>Y(W,e)),...Array.isArray(i)?i:[i]])});var o=(a,u)=>{let f=re(({className:s,...L},i)=>fe($,{ref:i,iconNode:u,className:N(`lucide-${Q(X(a))}`,`lucide-${a}`,s),...L}));return f.displayName=X(a),f};var se=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],F=o("activity",se);var ie=[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]],A=o("bot",ie);var ce=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],k=o("circle-alert",ce);var ne=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],C=o("loader-circle",ne);var pe=[["path",{d:"m10 17 5-5-5-5",key:"1bsop3"}],["path",{d:"M15 12H3",key:"6jk70r"}],["path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4",key:"u53s6r"}]],w=o("log-in",pe);var me=[["path",{d:"M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z",key:"18887p"}]],y=o("message-square",me);var Le=[["path",{d:"M12.586 12.586 19 19",key:"ea5xo7"}],["path",{d:"M3.688 3.037a.497.497 0 0 0-.651.651l6.5 15.999a.501.501 0 0 0 .947-.062l1.569-6.083a2 2 0 0 1 1.448-1.479l6.124-1.579a.5.5 0 0 0 .063-.947z",key:"277e5u"}]],R=o("mouse-pointer",Le);var Ie=[["rect",{width:"5",height:"5",x:"3",y:"3",rx:"1",key:"1tu5fj"}],["rect",{width:"5",height:"5",x:"16",y:"3",rx:"1",key:"1v8r4q"}],["rect",{width:"5",height:"5",x:"3",y:"16",rx:"1",key:"1x03jg"}],["path",{d:"M21 16h-3a2 2 0 0 0-2 2v3",key:"177gqh"}],["path",{d:"M21 21v.01",key:"ents32"}],["path",{d:"M12 7v3a2 2 0 0 1-2 2H7",key:"8crl2c"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M12 3h.01",key:"n36tog"}],["path",{d:"M12 16v.01",key:"133mhm"}],["path",{d:"M16 12h1",key:"1slzba"}],["path",{d:"M21 12v.01",key:"1lwtk9"}],["path",{d:"M12 21v-1",key:"1880an"}]],b=o("qr-code",Ie);var xe=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],T=o("refresh-cw",xe);var Ce=[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]],B=o("smartphone",Ce);var he=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],q=o("users",he);var ge=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],v=o("wifi-off",ge);var Se=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]],U=o("wifi",Se);var ke=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],O=o("x",ke);import{useCallback as ae,useEffect as Be,useRef as te,useState as H}from"react";var ee="zhin_api_token",we="zhin_api_base";function Pe(){let a=localStorage.getItem(we)?.trim();return a?a.replace(/\/$/,""):typeof window<"u"?window.location.origin:""}function Ae(){return localStorage.getItem(ee)}async function M(a,u){let f=Ae(),s=new Headers(u?.headers);f&&s.set("Authorization",`Bearer ${f}`);let L=Pe(),i=typeof a=="string"&&a.startsWith("/")?`${L}${a}`:a,n=await fetch(i,{...u,headers:s});return n.status===401&&(localStorage.removeItem(ee),window.dispatchEvent(new CustomEvent("zhin:auth-required"))),n}import{jsx as t,jsxs as p}from"react/jsx-runtime";var Me=2e3,De=15e3,Fe={qrcode:{icon:t(b,{className:"w-4 h-4"}),label:"\u626B\u7801\u767B\u5F55"},sms:{icon:t(y,{className:"w-4 h-4"}),label:"\u77ED\u4FE1\u9A8C\u8BC1\u7801"},device:{icon:t(B,{className:"w-4 h-4"}),label:"\u8BBE\u5907\u9A8C\u8BC1"},auth:{icon:t(B,{className:"w-4 h-4"}),label:"\u8EAB\u4EFD\u9A8C\u8BC1"},slider:{icon:t(R,{className:"w-4 h-4"}),label:"\u6ED1\u5757\u9A8C\u8BC1"}};function K(){let[a,u]=H([]),[f,s]=H(!0),[L,i]=H(null),[n,h]=H({}),[x,l]=H({}),m=te(0),G=te(),g=ae(async()=>{try{let e=await M("/api/login-assist/pending");if(!e.ok)throw new Error("\u83B7\u53D6\u5F85\u529E\u5931\u8D25");let S=await e.json(),I=(Array.isArray(S)?S:[]).filter(E=>E.adapter==="icqq");u(I),i(null),m.current=I.length>0?0:m.current+1}catch(e){i(e.message),m.current++}finally{s(!1)}},[]),D=ae(()=>{let e=Math.min(Me*Math.pow(1.5,m.current),De);G.current=setTimeout(async()=>{await g(),D()},e)},[g]);Be(()=>(g().then(D),()=>clearTimeout(G.current)),[g,D]);let P=async(e,S)=>{h(d=>({...d,[e]:!0}));try{if(!(await M("/api/login-assist/submit",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e,value:S})})).ok)throw new Error("\u63D0\u4EA4\u5931\u8D25");l(I=>{let E={...I};return delete E[e],E}),m.current=0,await g()}catch(d){i(d.message)}finally{h(d=>({...d,[e]:!1}))}},W=async e=>{try{(await M("/api/login-assist/cancel",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e})})).ok&&await g()}catch{}};return f&&a.length===0?t("div",{className:"flex justify-center py-12",children:t(C,{className:"w-6 h-6 animate-spin text-blue-500"})}):p("div",{className:"space-y-4",children:[t("p",{className:"text-sm text-muted-foreground",children:"\u626B\u7801\u3001\u77ED\u4FE1\u6216\u6ED1\u5757\u7B49\u9A8C\u8BC1\u4F1A\u51FA\u73B0\u5728\u4E0B\u65B9\uFF1B\u5237\u65B0\u9875\u9762\u540E\u4ECD\u53EF\u7EE7\u7EED\u5904\u7406\uFF08\u4EC5 ICQQ \u5F85\u529E\uFF09\u3002"}),L&&p("div",{className:"flex items-center gap-2 p-3 rounded border border-red-200 bg-red-50 text-red-600 text-sm dark:bg-red-900/20 dark:text-red-400 dark:border-red-800",children:[t(k,{className:"w-4 h-4 shrink-0"}),t("span",{children:L}),t("button",{onClick:()=>i(null),className:"ml-auto",children:t(O,{className:"w-3.5 h-3.5"})})]}),a.length===0?p("div",{className:"border rounded-lg bg-card p-12 text-center",children:[t(w,{className:"w-16 h-16 mx-auto mb-4 opacity-25"}),t("h3",{className:"text-lg font-semibold mb-1",children:"\u6682\u65E0\u5F85\u529E"}),t("p",{className:"text-sm text-muted-foreground",children:"\u673A\u5668\u4EBA\u9700\u8981\u9A8C\u8BC1\u65F6\uFF0C\u5F85\u529E\u5C06\u663E\u793A\u5728\u6B64\u5904"})]}):t("div",{className:"space-y-4",children:a.map(e=>{let S=Fe[e.type]??{icon:t(w,{className:"w-4 h-4"}),label:e.type};return p("div",{className:"border rounded-lg bg-card p-4 shadow-sm",children:[p("div",{className:"flex items-start justify-between flex-wrap gap-2 mb-2",children:[p("div",{className:"flex items-center gap-2 font-semibold",children:[S.icon," ",S.label]}),p("div",{className:"flex gap-1 text-xs",children:[t("span",{className:"px-2 py-0.5 rounded border",children:e.adapter}),t("span",{className:"px-2 py-0.5 rounded bg-muted",children:e.endpointId})]})]}),e.payload?.message&&t("p",{className:"text-sm text-muted-foreground mb-3",children:e.payload.message}),e.type==="qrcode"&&e.payload?.image&&t("div",{className:"flex justify-center p-4 bg-muted/30 rounded-lg mb-3",children:t("img",{src:String(e.payload.image),alt:"\u767B\u5F55\u4E8C\u7EF4\u7801",className:"max-w-[200px] w-full h-auto"})}),(e.type==="slider"||e.type==="auth")&&e.payload?.url&&p("p",{className:"text-sm break-all mb-3",children:[t("span",{className:"text-muted-foreground",children:"\u9A8C\u8BC1\u94FE\u63A5\uFF1A"})," ",t("a",{href:String(e.payload.url),target:"_blank",rel:"noopener noreferrer",className:"text-primary hover:underline",children:String(e.payload.url)})]}),e.type==="auth"&&e.payload?.device&&typeof e.payload.device=="object"&&p("div",{className:"text-xs text-muted-foreground mb-3 space-y-1 rounded border p-3 bg-muted/20",children:[t("div",{className:"font-medium text-foreground",children:"\u8BBE\u5907\u4FE1\u606F\uFF08\u767B\u5F55\u7EED\u4F20\u7528\uFF09"}),Object.entries(e.payload.device).filter(([,d])=>d!=null&&String(d)!=="").map(([d,I])=>p("div",{children:[p("span",{className:"opacity-70",children:[d,": "]}),t("span",{className:"font-mono break-all",children:String(I)})]},d))]}),e.type==="auth"&&p("div",{className:"flex gap-2 mt-3",children:[t("button",{className:"h-9 px-4 rounded-md bg-primary text-primary-foreground text-sm disabled:opacity-50",disabled:!!n[e.id],onClick:()=>{P(e.id,{done:!0})},children:n[e.id]?"\u63D0\u4EA4\u4E2D\u2026":"\u6211\u5DF2\u5B8C\u6210\u9A8C\u8BC1"}),t("button",{className:"h-9 px-4 rounded-md border text-sm hover:bg-accent transition-colors",onClick:()=>{W(e.id)},children:"\u53D6\u6D88"})]}),(e.type==="sms"||e.type==="device"||e.type==="slider")&&p("div",{className:"flex flex-wrap gap-2 items-center",children:[t("input",{className:"h-9 px-3 rounded-md border border-input bg-background text-sm max-w-[18rem] flex-1",placeholder:e.type==="slider"?"\u8F93\u5165 ticket":"\u8F93\u5165\u9A8C\u8BC1\u7801",value:x[e.id]??"",onChange:d=>l(I=>({...I,[e.id]:d.target.value})),onKeyDown:d=>{if(d.key==="Enter"){let I=x[e.id]?.trim();I&&P(e.id,e.type==="slider"?{ticket:I}:I)}}}),t("button",{className:"h-9 px-4 rounded-md bg-primary text-primary-foreground text-sm disabled:opacity-50",disabled:n[e.id]||!x[e.id]?.trim(),onClick:()=>{let d=x[e.id]?.trim();d&&P(e.id,e.type==="slider"?{ticket:d}:d)},children:n[e.id]?"\u63D0\u4EA4\u4E2D\u2026":"\u63D0\u4EA4"})]}),e.type==="qrcode"&&p("div",{className:"flex gap-2 mt-3",children:[t("button",{className:"h-9 px-4 rounded-md bg-primary text-primary-foreground text-sm disabled:opacity-50",disabled:!!n[e.id],onClick:()=>{P(e.id,{done:!0})},children:n[e.id]?"\u63D0\u4EA4\u4E2D\u2026":"\u6211\u5DF2\u626B\u7801"}),t("button",{className:"h-9 px-4 rounded-md border text-sm hover:bg-accent transition-colors",onClick:()=>{W(e.id)},children:"\u53D6\u6D88"})]})]},e.id)})})]})}import{Fragment as be,jsx as r,jsxs as c}from"react/jsx-runtime";function Z(){let[a,u]=z("overview"),[f,s]=z([]),[L,i]=z(!0),[n,h]=z(null),x=ye(async()=>{i(!0),h(null);try{let l=await M("/api/icqq/endpoints"),m=await l.json();if(!l.ok||!m.success)throw new Error(m.message||"\u52A0\u8F7D\u5931\u8D25");s(Array.isArray(m.data)?m.data:[])}catch(l){h(l.message),s([])}finally{i(!1)}},[]);return Re(()=>{a==="overview"&&x()},[a,x]),c("div",{className:"p-6 max-w-5xl mx-auto space-y-5",children:[c("div",{className:"flex items-center justify-between",children:[c("div",{children:[c("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[r(A,{className:"w-6 h-6"})," ICQQ \u7BA1\u7406"]}),r("p",{className:"text-sm text-muted-foreground mt-1",children:"\u673A\u5668\u4EBA\u6982\u89C8\u4E0E\u767B\u5F55\u8F85\u52A9\uFF08\u626B\u7801 / \u9A8C\u8BC1\u7801 / \u6ED1\u5757\uFF09"})]}),a==="overview"&&c("button",{onClick:x,disabled:L,className:"flex items-center gap-1 px-3 py-1.5 rounded bg-blue-500 text-white hover:bg-blue-600 disabled:opacity-50 text-sm",children:[r(T,{className:`w-4 h-4 ${L?"animate-spin":""}`})," \u5237\u65B0"]})]}),c("div",{className:"flex gap-1 border-b",children:[r("button",{onClick:()=>u("overview"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${a==="overview"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:c("span",{className:"flex items-center gap-1.5",children:[r(A,{className:"w-4 h-4"})," \u6982\u89C8"]})}),r("button",{onClick:()=>u("login"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${a==="login"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:c("span",{className:"flex items-center gap-1.5",children:[r(w,{className:"w-4 h-4"})," \u767B\u5F55\u8F85\u52A9"]})})]}),a==="overview"&&c(be,{children:[n&&r("div",{className:"p-3 bg-red-50 text-red-600 rounded border border-red-200 text-sm dark:bg-red-900/20 dark:text-red-400 dark:border-red-800",children:n}),L?r("div",{className:"flex justify-center py-12",children:r(C,{className:"w-6 h-6 animate-spin text-blue-500"})}):f.length===0?r("div",{className:"text-center text-muted-foreground py-12",children:"\u6682\u65E0 ICQQ Endpoint \u5B9E\u4F8B"}):r("div",{className:"grid gap-4 md:grid-cols-2",children:f.map(l=>c("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[c("div",{className:"flex items-center justify-between mb-3",children:[r("span",{className:"font-medium text-lg",children:l.name}),l.connected?c("span",{className:"flex items-center gap-1 text-green-600 text-sm",children:[r(U,{className:"w-4 h-4"})," \u5728\u7EBF"]}):c("span",{className:"flex items-center gap-1 text-gray-400 text-sm",children:[r(v,{className:"w-4 h-4"})," \u79BB\u7EBF"]})]}),c("div",{className:"space-y-2 text-sm text-muted-foreground",children:[c("div",{className:"flex items-center gap-1.5",children:[r(q,{className:"w-3.5 h-3.5"}),"\u7FA4 ",l.groupCount," \xB7 \u597D\u53CB ",l.friendCount]}),c("div",{className:"flex items-center gap-1.5",children:[r(F,{className:"w-3.5 h-3.5"}),"\u767B\u5F55\u65B9\u5F0F ",l.loginMode," \xB7 ",l.status]})]})]},l.name))})]}),a==="login"&&r(K,{})]})}function dt(a){a.addRoute({path:"/console/icqq",name:"ICQQ\u7BA1\u7406",element:a.React.createElement(Z,{hostReact:a.React})}),a.addTool({id:"icqq",name:"ICQQ",path:"/console/icqq"})}export{dt as register};
|
|
2
2
|
/*! Bundled license information:
|
|
3
3
|
|
|
4
4
|
lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs:
|
|
@@ -26,7 +26,7 @@ lucide-react/dist/esm/icons/wifi.mjs:
|
|
|
26
26
|
lucide-react/dist/esm/icons/x.mjs:
|
|
27
27
|
lucide-react/dist/esm/lucide-react.mjs:
|
|
28
28
|
(**
|
|
29
|
-
* @license lucide-react v1.
|
|
29
|
+
* @license lucide-react v1.23.0 - ISC
|
|
30
30
|
*
|
|
31
31
|
* This source code is licensed under the ISC license.
|
|
32
32
|
* See the LICENSE file in the root directory of this source tree.
|
|
@@ -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"}
|