@zhin.js/adapter-napcat 1.0.1 → 1.1.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 +757 -0
- package/{skills/napcat/PERMITS.md → PERMITS.md} +3 -3
- package/README.md +63 -95
- package/adapters/napcat/index.js +47 -0
- package/adapters/napcat/index.ts +64 -0
- package/agents/napcat/agent.json +20 -0
- package/agents/napcat/boundaries.md +3 -0
- package/agents/napcat/conventions.md +3 -0
- package/agents/napcat/skills/napcat-account/SKILL.md +25 -0
- package/agents/napcat/skills/napcat-account/tools/delete_friend/index.js +18 -0
- package/agents/napcat/skills/napcat-account/tools/delete_friend/index.ts +18 -0
- package/agents/napcat/skills/napcat-account/tools/get_user_status/index.js +16 -0
- package/agents/napcat/skills/napcat-account/tools/get_user_status/index.ts +16 -0
- package/agents/napcat/skills/napcat-account/tools/send_like/index.js +18 -0
- package/agents/napcat/skills/napcat-account/tools/send_like/index.ts +18 -0
- package/agents/napcat/skills/napcat-account/tools/set_avatar/index.js +17 -0
- package/agents/napcat/skills/napcat-account/tools/set_avatar/index.ts +17 -0
- package/agents/napcat/skills/napcat-account/tools/set_online_status/index.js +18 -0
- package/agents/napcat/skills/napcat-account/tools/set_online_status/index.ts +18 -0
- package/agents/napcat/skills/napcat-account/tools/set_profile/index.js +21 -0
- package/agents/napcat/skills/napcat-account/tools/set_profile/index.ts +21 -0
- package/agents/napcat/skills/napcat-account/tools/set_signature/index.js +17 -0
- package/agents/napcat/skills/napcat-account/tools/set_signature/index.ts +17 -0
- package/agents/napcat/skills/napcat-files-history/SKILL.md +22 -0
- package/agents/napcat/skills/napcat-files-history/tools/download_file/index.js +17 -0
- package/agents/napcat/skills/napcat-files-history/tools/download_file/index.ts +17 -0
- package/agents/napcat/skills/napcat-files-history/tools/get_friend_msg_history/index.js +18 -0
- package/agents/napcat/skills/napcat-files-history/tools/get_friend_msg_history/index.ts +18 -0
- package/agents/napcat/skills/napcat-files-history/tools/get_group_file_url/index.js +19 -0
- package/agents/napcat/skills/napcat-files-history/tools/get_group_file_url/index.ts +19 -0
- package/agents/napcat/skills/napcat-files-history/tools/get_group_msg_history/index.js +19 -0
- package/agents/napcat/skills/napcat-files-history/tools/get_group_msg_history/index.ts +19 -0
- package/agents/napcat/skills/napcat-files-history/tools/get_group_root_files/index.js +17 -0
- package/agents/napcat/skills/napcat-files-history/tools/get_group_root_files/index.ts +17 -0
- package/agents/napcat/skills/napcat-files-history/tools/upload_group_file/index.js +21 -0
- package/agents/napcat/skills/napcat-files-history/tools/upload_group_file/index.ts +21 -0
- package/agents/napcat/skills/napcat-group-content/SKILL.md +21 -0
- package/agents/napcat/skills/napcat-group-content/tools/del_group_notice/index.js +20 -0
- package/agents/napcat/skills/napcat-group-content/tools/del_group_notice/index.ts +20 -0
- package/agents/napcat/skills/napcat-group-content/tools/delete_essence_msg/index.js +19 -0
- package/agents/napcat/skills/napcat-group-content/tools/delete_essence_msg/index.ts +19 -0
- package/agents/napcat/skills/napcat-group-content/tools/get_essence_list/index.js +17 -0
- package/agents/napcat/skills/napcat-group-content/tools/get_essence_list/index.ts +17 -0
- package/agents/napcat/skills/napcat-group-content/tools/get_group_notice/index.js +17 -0
- package/agents/napcat/skills/napcat-group-content/tools/get_group_notice/index.ts +17 -0
- package/agents/napcat/skills/napcat-group-content/tools/send_group_notice/index.js +21 -0
- package/agents/napcat/skills/napcat-group-content/tools/send_group_notice/index.ts +21 -0
- package/agents/napcat/skills/napcat-group-content/tools/set_essence_msg/index.js +19 -0
- package/agents/napcat/skills/napcat-group-content/tools/set_essence_msg/index.ts +19 -0
- package/agents/napcat/skills/napcat-group-settings/SKILL.md +23 -0
- package/agents/napcat/skills/napcat-group-settings/tools/get_group_info_ex/index.js +17 -0
- package/agents/napcat/skills/napcat-group-settings/tools/get_group_info_ex/index.ts +17 -0
- package/agents/napcat/skills/napcat-group-settings/tools/get_group_shut_list/index.js +17 -0
- package/agents/napcat/skills/napcat-group-settings/tools/get_group_shut_list/index.ts +17 -0
- package/agents/napcat/skills/napcat-group-settings/tools/group_sign/index.js +18 -0
- package/agents/napcat/skills/napcat-group-settings/tools/group_sign/index.ts +18 -0
- package/agents/napcat/skills/napcat-group-settings/tools/set_group_portrait/index.js +20 -0
- package/agents/napcat/skills/napcat-group-settings/tools/set_group_portrait/index.ts +20 -0
- package/agents/napcat/skills/napcat-group-settings/tools/set_title/index.js +21 -0
- package/agents/napcat/skills/napcat-group-settings/tools/set_title/index.ts +21 -0
- package/agents/napcat/skills/napcat-media/SKILL.md +23 -0
- package/agents/napcat/skills/napcat-media/tools/ai_tts/index.js +19 -0
- package/agents/napcat/skills/napcat-media/tools/ai_tts/index.ts +19 -0
- package/agents/napcat/skills/napcat-media/tools/get_ai_characters/index.js +17 -0
- package/agents/napcat/skills/napcat-media/tools/get_ai_characters/index.ts +17 -0
- package/agents/napcat/skills/napcat-media/tools/get_mini_app_ark/index.js +20 -0
- package/agents/napcat/skills/napcat-media/tools/get_mini_app_ark/index.ts +20 -0
- package/agents/napcat/skills/napcat-media/tools/ocr_image/index.js +16 -0
- package/agents/napcat/skills/napcat-media/tools/ocr_image/index.ts +16 -0
- package/agents/napcat/skills/napcat-media/tools/translate/index.js +16 -0
- package/agents/napcat/skills/napcat-media/tools/translate/index.ts +16 -0
- package/agents/napcat/skills/napcat-messaging/SKILL.md +22 -0
- package/agents/napcat/skills/napcat-messaging/tools/forward_single_msg/index.js +22 -0
- package/agents/napcat/skills/napcat-messaging/tools/forward_single_msg/index.ts +28 -0
- package/agents/napcat/skills/napcat-messaging/tools/mark_msg_as_read/index.js +17 -0
- package/agents/napcat/skills/napcat-messaging/tools/mark_msg_as_read/index.ts +17 -0
- package/agents/napcat/skills/napcat-messaging/tools/send_forward_msg/index.js +19 -0
- package/agents/napcat/skills/napcat-messaging/tools/send_forward_msg/index.ts +27 -0
- package/agents/napcat/skills/napcat-messaging/tools/send_poke/index.js +18 -0
- package/agents/napcat/skills/napcat-messaging/tools/send_poke/index.ts +18 -0
- package/agents/napcat/skills/napcat-messaging/tools/set_emoji_reaction/index.js +18 -0
- package/agents/napcat/skills/napcat-messaging/tools/set_emoji_reaction/index.ts +18 -0
- package/agents/napcat/system.md +3 -0
- package/commands/napcat/endpoint/add/[id]/index.js +3 -0
- package/commands/napcat/endpoint/add/[id]/index.ts +3 -0
- package/commands/napcat/endpoint/definition.js +29 -0
- package/commands/napcat/endpoint/definition.ts +26 -0
- package/commands/napcat/endpoint/list/index.js +3 -0
- package/commands/napcat/endpoint/list/index.ts +3 -0
- package/commands/napcat/endpoint/remove/[id]/index.js +3 -0
- package/commands/napcat/endpoint/remove/[id]/index.ts +3 -0
- package/lib/client.d.ts +52 -0
- package/lib/client.js +62 -0
- package/lib/endpoint-management.d.ts +15 -0
- package/lib/endpoint-management.js +47 -0
- package/lib/http-endpoint.d.ts +27 -0
- package/lib/http-endpoint.js +177 -0
- package/lib/index.d.ts +11 -22
- package/lib/index.js +10 -59
- package/lib/napcat-inbound.d.ts +12 -5
- package/lib/napcat-inbound.js +28 -13
- package/lib/napcat-runtime-state.d.ts +1 -0
- package/lib/napcat-runtime-state.js +6 -0
- package/lib/onebot-get-msg.d.ts +16 -3
- package/lib/onebot-get-msg.js +53 -1
- package/lib/protocol.d.ts +147 -0
- package/lib/protocol.js +318 -0
- package/lib/side-event-dispatch.d.ts +7 -0
- package/lib/side-event-dispatch.js +36 -0
- package/lib/webhook.d.ts +2 -0
- package/lib/webhook.js +14 -0
- package/lib/ws-endpoint.d.ts +27 -0
- package/lib/ws-endpoint.js +241 -0
- package/lib/ws-transport.d.ts +13 -0
- package/lib/ws-transport.js +75 -0
- package/lib/ws-types.d.ts +17 -0
- package/lib/ws-types.js +1 -0
- package/lib/wss-auth.d.ts +2 -0
- package/lib/wss-auth.js +16 -0
- package/lib/wss-endpoint.d.ts +29 -0
- package/lib/wss-endpoint.js +196 -0
- package/package.json +76 -34
- package/plugin.js +18 -0
- package/schema.json +131 -0
- package/src/client.ts +79 -0
- package/src/endpoint-management.ts +72 -0
- package/src/http-endpoint.ts +234 -0
- package/src/index.ts +62 -87
- package/src/napcat-inbound.ts +34 -10
- package/src/napcat-runtime-state.ts +7 -0
- package/src/onebot-get-msg.ts +69 -5
- package/src/protocol.ts +465 -0
- package/src/side-event-dispatch.ts +48 -0
- package/src/webhook.ts +16 -0
- package/src/ws-endpoint.ts +301 -0
- package/src/ws-transport.ts +105 -0
- package/src/ws-types.ts +20 -0
- package/src/wss-auth.ts +17 -0
- package/src/wss-endpoint.ts +247 -0
- package/client/NapCatManagement.tsx +0 -113
- package/client/index.tsx +0 -11
- package/client/tsconfig.json +0 -7
- package/client/utils/api.ts +0 -30
- package/dist/index.js +0 -27
- package/lib/adapter.d.ts +0 -28
- package/lib/adapter.d.ts.map +0 -1
- package/lib/adapter.js +0 -94
- 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 +0 -105
- package/lib/agent-prompt.js.map +0 -1
- package/lib/endpoint-base.d.ts +0 -143
- package/lib/endpoint-base.d.ts.map +0 -1
- package/lib/endpoint-base.js +0 -334
- package/lib/endpoint-base.js.map +0 -1
- package/lib/endpoint-http.d.ts +0 -18
- package/lib/endpoint-http.d.ts.map +0 -1
- package/lib/endpoint-http.js +0 -119
- package/lib/endpoint-http.js.map +0 -1
- package/lib/endpoint-ws-client.d.ts +0 -21
- package/lib/endpoint-ws-client.d.ts.map +0 -1
- package/lib/endpoint-ws-client.js +0 -165
- package/lib/endpoint-ws-client.js.map +0 -1
- package/lib/endpoint-ws-server.d.ts +0 -21
- package/lib/endpoint-ws-server.d.ts.map +0 -1
- package/lib/endpoint-ws-server.js +0 -150
- package/lib/endpoint-ws-server.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/napcat-inbound.d.ts.map +0 -1
- package/lib/napcat-inbound.js.map +0 -1
- package/lib/onebot-get-msg.d.ts.map +0 -1
- package/lib/onebot-get-msg.js.map +0 -1
- package/lib/routes.d.ts +0 -4
- package/lib/routes.d.ts.map +0 -1
- package/lib/routes.js +0 -61
- package/lib/routes.js.map +0 -1
- package/lib/tools.d.ts +0 -8
- package/lib/tools.d.ts.map +0 -1
- package/lib/tools.js +0 -605
- package/lib/tools.js.map +0 -1
- package/lib/types.d.ts +0 -293
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js +0 -6
- package/lib/types.js.map +0 -1
- package/lib/typing-indicator.d.ts +0 -45
- package/lib/typing-indicator.d.ts.map +0 -1
- package/lib/typing-indicator.js +0 -132
- package/lib/typing-indicator.js.map +0 -1
- package/plugin.yml +0 -3
- package/skills/napcat/SKILL.md +0 -311
- package/src/adapter.ts +0 -101
- package/src/agent-prompt.ts +0 -114
- package/src/endpoint-base.ts +0 -376
- package/src/endpoint-http.ts +0 -109
- package/src/endpoint-ws-client.ts +0 -164
- package/src/endpoint-ws-server.ts +0 -150
- package/src/routes.ts +0 -61
- package/src/tools.ts +0 -632
- package/src/types.ts +0 -279
- package/src/typing-indicator.ts +0 -184
package/skills/napcat/SKILL.md
DELETED
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: napcat
|
|
3
|
-
platforms:
|
|
4
|
-
- napcat
|
|
5
|
-
description: >-
|
|
6
|
-
NapCatQQ 适配器完整能力集。当用户在 QQ 群或私聊中请求群管理(踢人、禁言、设管理、改名片、
|
|
7
|
-
设头衔)、社交互动(戳一戳、点赞、表情回应)、消息操作(合并转发、单条转发、
|
|
8
|
-
消息历史回溯)、群运营(精华消息、群公告、群签到、群文件管理)、多媒体能力(AI 语音
|
|
9
|
-
TTS、图片 OCR 文字识别、小程序卡片)、个人设置(修改资料/头像/签名/在线状态)、
|
|
10
|
-
或任何 QQ 特有功能时,都应使用此技能。即使用户没有明确提到 NapCat 或 OneBot,
|
|
11
|
-
只要上下文是 QQ 群聊/私聊场景且涉及上述能力,就应触发。覆盖 OneBot11 标准 +
|
|
12
|
-
go-cqhttp 扩展 + NapCat 独有 API 共 92 个接口。
|
|
13
|
-
keywords:
|
|
14
|
-
- napcat
|
|
15
|
-
- napneko
|
|
16
|
-
- onebot11
|
|
17
|
-
- adapter:napcat
|
|
18
|
-
- qq
|
|
19
|
-
- 群管理
|
|
20
|
-
- 头衔
|
|
21
|
-
- 戳一戳
|
|
22
|
-
- 表情回应
|
|
23
|
-
- 合并转发
|
|
24
|
-
- 群文件
|
|
25
|
-
- 精华消息
|
|
26
|
-
- 群公告
|
|
27
|
-
- AI语音
|
|
28
|
-
- OCR
|
|
29
|
-
- 小程序
|
|
30
|
-
- list_members
|
|
31
|
-
- 禁言
|
|
32
|
-
- 踢人
|
|
33
|
-
- 点赞
|
|
34
|
-
- 签到
|
|
35
|
-
- 转发
|
|
36
|
-
- 语音
|
|
37
|
-
- 翻译
|
|
38
|
-
- 头像
|
|
39
|
-
- 在线状态
|
|
40
|
-
tags:
|
|
41
|
-
- group
|
|
42
|
-
- management
|
|
43
|
-
- im
|
|
44
|
-
- qq
|
|
45
|
-
- napcat
|
|
46
|
-
tools:
|
|
47
|
-
- napcat_kick_member
|
|
48
|
-
- napcat_mute_member
|
|
49
|
-
- napcat_mute_all
|
|
50
|
-
- napcat_set_admin
|
|
51
|
-
- napcat_set_nickname
|
|
52
|
-
- napcat_set_group_name
|
|
53
|
-
- napcat_list_members
|
|
54
|
-
- napcat_get_group_info
|
|
55
|
-
- napcat_send_poke
|
|
56
|
-
- napcat_set_emoji_reaction
|
|
57
|
-
- napcat_send_forward_msg
|
|
58
|
-
- napcat_forward_single_msg
|
|
59
|
-
- napcat_send_like
|
|
60
|
-
- napcat_set_essence_msg
|
|
61
|
-
- napcat_delete_essence_msg
|
|
62
|
-
- napcat_get_essence_list
|
|
63
|
-
- napcat_send_group_notice
|
|
64
|
-
- napcat_get_group_notice
|
|
65
|
-
- napcat_del_group_notice
|
|
66
|
-
- napcat_upload_group_file
|
|
67
|
-
- napcat_get_group_file_url
|
|
68
|
-
- napcat_get_group_root_files
|
|
69
|
-
- napcat_get_group_shut_list
|
|
70
|
-
- napcat_set_group_portrait
|
|
71
|
-
- napcat_set_title
|
|
72
|
-
- napcat_group_sign
|
|
73
|
-
- napcat_ai_tts
|
|
74
|
-
- napcat_get_ai_characters
|
|
75
|
-
- napcat_ocr_image
|
|
76
|
-
- napcat_get_mini_app_ark
|
|
77
|
-
- napcat_get_group_msg_history
|
|
78
|
-
- napcat_get_friend_msg_history
|
|
79
|
-
- napcat_get_user_status
|
|
80
|
-
- napcat_get_group_info_ex
|
|
81
|
-
- napcat_set_profile
|
|
82
|
-
- napcat_set_avatar
|
|
83
|
-
- napcat_set_online_status
|
|
84
|
-
- napcat_set_signature
|
|
85
|
-
- napcat_translate
|
|
86
|
-
- napcat_mark_msg_as_read
|
|
87
|
-
- napcat_download_file
|
|
88
|
-
- napcat_delete_friend
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
# NapCat QQ 适配器技能
|
|
92
|
-
|
|
93
|
-
NapCat 是 OneBot11 协议的超集实现,提供标准群管理之外大量 QQ 特有功能。这份技能帮助你正确选择工具、组合调用、处理边界情况。
|
|
94
|
-
|
|
95
|
-
## 核心原则
|
|
96
|
-
|
|
97
|
-
### 先查后操作
|
|
98
|
-
|
|
99
|
-
用户说「把小明踢了」,但工具需要的是 QQ 号(数字),不是昵称。所有针对具体成员的操作,如果手头只有昵称/名片,第一步永远是 `napcat_list_members` 获取成员列表,从中匹配到 `user_id`,然后再执行后续操作。不要猜测 QQ 号。
|
|
100
|
-
|
|
101
|
-
**Example:**
|
|
102
|
-
```
|
|
103
|
-
用户: 把群里那个叫"小飞"的禁言10分钟
|
|
104
|
-
步骤1: napcat_list_members → 找到 小飞 的 user_id = 123456
|
|
105
|
-
步骤2: napcat_mute_member(user_id=123456, duration=600)
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### 权限意识
|
|
109
|
-
|
|
110
|
-
工具分三个权限层级,调用前先判断 Endpoint 在群里的身份:
|
|
111
|
-
|
|
112
|
-
- **user** — 普通成员即可,如查询、点赞、戳一戳
|
|
113
|
-
- **group_admin** — 需要管理员权限,如踢人、禁言、设精华、发公告
|
|
114
|
-
- **group_owner** — 需要群主权限,如设管理员、设专属头衔
|
|
115
|
-
|
|
116
|
-
如果 Endpoint 权限不足,API 会返回错误。遇到权限不足时,向用户说明需要什么权限,而不是重试。
|
|
117
|
-
|
|
118
|
-
### 数值单位
|
|
119
|
-
|
|
120
|
-
- **禁言 duration**:单位是秒。600 = 10 分钟,3600 = 1 小时,86400 = 1 天。设为 **0** 是解除禁言,不是永久禁言。
|
|
121
|
-
- **message_id**:消息收到时自带的数字 ID,用于回应、精华、转发等操作。
|
|
122
|
-
- **group_id / user_id**:QQ 号,纯数字。
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
## 工具分类与使用指南
|
|
127
|
-
|
|
128
|
-
### 群管理(基础)
|
|
129
|
-
|
|
130
|
-
日常群管理操作。Bot 需要管理员权限(`set_admin` 需群主权限)。
|
|
131
|
-
|
|
132
|
-
| 工具 | 用途 | 关键参数 |
|
|
133
|
-
|------|------|----------|
|
|
134
|
-
| `napcat_kick_member` | 踢出成员 | `user_id` |
|
|
135
|
-
| `napcat_mute_member` | 禁言/解禁 | `user_id`, `duration`(秒,0=解禁) |
|
|
136
|
-
| `napcat_mute_all` | 全员禁言/解除 | `enable`(true/false) |
|
|
137
|
-
| `napcat_set_admin` | 设/取消管理员 | `user_id`, `enable` |
|
|
138
|
-
| `napcat_set_nickname` | 改群名片 | `user_id`, `nickname` |
|
|
139
|
-
| `napcat_set_group_name` | 改群名称 | `name` |
|
|
140
|
-
| `napcat_set_title` | 设专属头衔 | `user_id`, `title`(需群主) |
|
|
141
|
-
| `napcat_list_members` | 获取成员列表 | — |
|
|
142
|
-
| `napcat_get_group_info` | 获取群基本信息 | — |
|
|
143
|
-
| `napcat_get_group_info_ex` | 获取群详细信息 | — |
|
|
144
|
-
| `napcat_get_group_shut_list` | 获取当前禁言列表 | — |
|
|
145
|
-
|
|
146
|
-
**批量禁言场景:** 用户说「把最近刷屏的人都禁言」时,先用 `napcat_get_group_msg_history` 分析最近消息,识别刷屏用户,然后逐个 `napcat_mute_member`。
|
|
147
|
-
|
|
148
|
-
### 社交互动
|
|
149
|
-
|
|
150
|
-
不需要管理员权限的轻量交互。
|
|
151
|
-
|
|
152
|
-
| 工具 | 用途 | 说明 |
|
|
153
|
-
|------|------|------|
|
|
154
|
-
| `napcat_send_poke` | 戳一戳 | `group_id` 不传 = 私聊戳 |
|
|
155
|
-
| `napcat_set_emoji_reaction` | 表情回应 | 对某条消息贴表情,需 `message_id` + `emoji_id` |
|
|
156
|
-
| `napcat_send_like` | 给好友点赞 | 每人每天上限 10 次 |
|
|
157
|
-
| `napcat_group_sign` | 群签到/打卡 | 每天一次 |
|
|
158
|
-
|
|
159
|
-
**Example:**
|
|
160
|
-
```
|
|
161
|
-
用户: 戳一下群里的张三
|
|
162
|
-
步骤1: napcat_list_members → 找到张三 user_id = 789
|
|
163
|
-
步骤2: napcat_send_poke(user_id=789, group_id=当前群号)
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### 消息操作
|
|
167
|
-
|
|
168
|
-
转发、历史查询是 NapCat 超越标准 OneBot11 的核心能力。
|
|
169
|
-
|
|
170
|
-
| 工具 | 用途 | 说明 |
|
|
171
|
-
|------|------|------|
|
|
172
|
-
| `napcat_send_forward_msg` | 合并转发 | 多条消息打包为一条转发消息 |
|
|
173
|
-
| `napcat_forward_single_msg` | 单条转发 | 把某条消息转到另一个群/好友 |
|
|
174
|
-
| `napcat_get_group_msg_history` | 群消息历史 | 支持指定起始序号和条数 |
|
|
175
|
-
| `napcat_get_friend_msg_history` | 私聊历史 | 同上 |
|
|
176
|
-
| `napcat_mark_msg_as_read` | 标记已读 | — |
|
|
177
|
-
|
|
178
|
-
**合并转发的 messages 格式:**
|
|
179
|
-
|
|
180
|
-
`messages` 参数是 JSON 字符串,每个元素是一个 node 节点:
|
|
181
|
-
|
|
182
|
-
```json
|
|
183
|
-
[
|
|
184
|
-
{
|
|
185
|
-
"type": "node",
|
|
186
|
-
"data": {
|
|
187
|
-
"name": "发送者昵称",
|
|
188
|
-
"uin": "10001",
|
|
189
|
-
"content": [{"type": "text", "data": {"text": "消息内容"}}]
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
]
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
也可以用 `id` 引用已有消息:`{"type": "node", "data": {"id": "消息ID"}}`
|
|
196
|
-
|
|
197
|
-
### 群运营
|
|
198
|
-
|
|
199
|
-
精华消息、群公告、群文件、群头像 — 让群看起来正规且有序。
|
|
200
|
-
|
|
201
|
-
| 工具 | 用途 | 权限 |
|
|
202
|
-
|------|------|------|
|
|
203
|
-
| `napcat_set_essence_msg` | 设为精华消息 | admin |
|
|
204
|
-
| `napcat_delete_essence_msg` | 取消精华 | admin |
|
|
205
|
-
| `napcat_get_essence_list` | 精华消息列表 | user |
|
|
206
|
-
| `napcat_send_group_notice` | 发群公告 | admin |
|
|
207
|
-
| `napcat_get_group_notice` | 查看公告 | user |
|
|
208
|
-
| `napcat_del_group_notice` | 删除公告 | admin |
|
|
209
|
-
| `napcat_upload_group_file` | 上传群文件 | user |
|
|
210
|
-
| `napcat_get_group_file_url` | 获取文件下载链接 | user |
|
|
211
|
-
| `napcat_get_group_root_files` | 群文件列表 | user |
|
|
212
|
-
| `napcat_set_group_portrait` | 修改群头像 | admin |
|
|
213
|
-
|
|
214
|
-
**群公告带图:** `napcat_send_group_notice` 的 `image` 参数支持 URL 或 base64,方便把生成的图片直接发到公告里。
|
|
215
|
-
|
|
216
|
-
**群文件工作流:** 用户说「帮我把这个文件发到群里」→ 用 `napcat_upload_group_file`,`file` 可以是本地路径或 URL。如果用户问「群里那个文件在哪下载」→ 先 `napcat_get_group_root_files` 列出文件,找到 `file_id` 和 `busid`,再 `napcat_get_group_file_url` 获取下载链接。
|
|
217
|
-
|
|
218
|
-
### AI 与多媒体
|
|
219
|
-
|
|
220
|
-
NapCat 独有的多媒体处理能力,标准 OneBot11 不支持这些。
|
|
221
|
-
|
|
222
|
-
| 工具 | 用途 | 说明 |
|
|
223
|
-
|------|------|------|
|
|
224
|
-
| `napcat_ai_tts` | AI 文字转语音 | 在群里发语音,需指定角色 |
|
|
225
|
-
| `napcat_get_ai_characters` | 语音角色列表 | 配合 ai_tts 使用 |
|
|
226
|
-
| `napcat_ocr_image` | 图片文字识别 | 传入图片的 file 字段 |
|
|
227
|
-
| `napcat_get_mini_app_ark` | 小程序卡片签名 | 生成可分享的小程序卡片 |
|
|
228
|
-
| `napcat_translate` | 英译中翻译 | NapCat 内置翻译 |
|
|
229
|
-
| `napcat_download_file` | 下载文件到缓存 | 返回本地路径 |
|
|
230
|
-
|
|
231
|
-
**AI 语音工作流:** 用户说「用甜美女声读一段话」→ 先 `napcat_get_ai_characters` 列出可用角色,从中选择匹配的 `character_id`,然后 `napcat_ai_tts(character=所选ID, text=要读的内容)`。角色列表因群不同可能不一样,所以每次都应重新查询。
|
|
232
|
-
|
|
233
|
-
**OCR 使用:** 当用户发了一张带文字的图片并问「这上面写了什么」,从消息中提取图片的 `file` 字段(通常是 `file://...` 或一个 hash),传给 `napcat_ocr_image`。
|
|
234
|
-
|
|
235
|
-
### 个人设置
|
|
236
|
-
|
|
237
|
-
修改 Endpoint 自身的 QQ 资料,通常是用户明确要求时才使用。
|
|
238
|
-
|
|
239
|
-
| 工具 | 用途 |
|
|
240
|
-
|------|------|
|
|
241
|
-
| `napcat_set_profile` | 修改昵称、公司、邮箱等 |
|
|
242
|
-
| `napcat_set_avatar` | 换头像(URL 或 base64) |
|
|
243
|
-
| `napcat_set_online_status` | 设在线状态 |
|
|
244
|
-
| `napcat_set_signature` | 设个性签名 |
|
|
245
|
-
| `napcat_delete_friend` | 删除好友 |
|
|
246
|
-
| `napcat_get_user_status` | 查看某人在线状态 |
|
|
247
|
-
|
|
248
|
-
**在线状态码:** 11=在线, 21=离开, 31=隐身, 41=忙碌, 50=请勿打扰, 60=Q我吧。
|
|
249
|
-
|
|
250
|
-
---
|
|
251
|
-
|
|
252
|
-
## 常见场景决策树
|
|
253
|
-
|
|
254
|
-
### 用户想管理群成员
|
|
255
|
-
|
|
256
|
-
```
|
|
257
|
-
用户提供了 QQ 号?
|
|
258
|
-
├─ 是 → 直接操作
|
|
259
|
-
└─ 否(只有昵称/名片)
|
|
260
|
-
└─ napcat_list_members → 匹配 → 操作
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
### 用户想查看/操作消息历史
|
|
264
|
-
|
|
265
|
-
```
|
|
266
|
-
群聊还是私聊?
|
|
267
|
-
├─ 群聊 → napcat_get_group_msg_history(group_id)
|
|
268
|
-
└─ 私聊 → napcat_get_friend_msg_history(user_id)
|
|
269
|
-
|
|
270
|
-
想转发其中某条?
|
|
271
|
-
├─ 转单条 → napcat_forward_single_msg(message_id)
|
|
272
|
-
└─ 打包多条 → napcat_send_forward_msg(messages=[node...])
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
### 用户想发语音
|
|
276
|
-
|
|
277
|
-
```
|
|
278
|
-
napcat_get_ai_characters(group_id) → 列出角色
|
|
279
|
-
选择最匹配的 character_id
|
|
280
|
-
napcat_ai_tts(group_id, character, text)
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
### 用户想发公告/管理精华
|
|
284
|
-
|
|
285
|
-
```
|
|
286
|
-
发新公告 → napcat_send_group_notice(content, image?)
|
|
287
|
-
查看公告 → napcat_get_group_notice
|
|
288
|
-
删除公告 → 先 get 拿到 notice_id → napcat_del_group_notice
|
|
289
|
-
|
|
290
|
-
设精华 → napcat_set_essence_msg(message_id)
|
|
291
|
-
取消精华 → napcat_delete_essence_msg(message_id)
|
|
292
|
-
看精华列表 → napcat_get_essence_list
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
---
|
|
296
|
-
|
|
297
|
-
## 易错点
|
|
298
|
-
|
|
299
|
-
1. **禁言 duration=0 是解禁**,不是永久禁言。没有「永久禁言」的概念,最长可以设很大的数(如 2592000 = 30 天)。
|
|
300
|
-
|
|
301
|
-
2. **合并转发的 messages 必须是 JSON 字符串**,不是对象。工具内部会解析,但传参时要传字符串化的 JSON。
|
|
302
|
-
|
|
303
|
-
3. **头衔(set_title)只有群主能设**,管理员不行。用户说「给他加个头衔」但 Endpoint 不是群主时,需告知无法操作。
|
|
304
|
-
|
|
305
|
-
4. **点赞有每日上限**(每人 10 次),用户说「给他点 100 个赞」时要说明限制。
|
|
306
|
-
|
|
307
|
-
5. **AI 语音只能在群聊用**,私聊不支持。如果用户在私聊请求 AI 语音,建议改用群聊。
|
|
308
|
-
|
|
309
|
-
6. **群文件操作需要 file_id 和 busid 两个参数**,它们来自 `get_group_root_files` 的返回,不要编造。
|
|
310
|
-
|
|
311
|
-
7. **OCR 的 image 参数**不是图片 URL,而是消息中图片的 `file` 字段值(形如 `xxxxx.image` 或本地路径)。
|
package/src/adapter.ts
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NapCat 适配器:支持正向 WS / 反向 WS / HTTP
|
|
3
|
-
*/
|
|
4
|
-
import { formatCompact, Adapter, Plugin } from 'zhin.js';
|
|
5
|
-
import type { Router } from '@zhin.js/host-router';
|
|
6
|
-
import { NapCatWsClient } from './endpoint-ws-client.js';
|
|
7
|
-
import { NapCatWsServer } from './endpoint-ws-server.js';
|
|
8
|
-
import { NapCatHttpEndpoint } from './endpoint-http.js';
|
|
9
|
-
import type { NapCatEndpointConfig, NapCatWsClientConfig, NapCatWsServerConfig, NapCatHttpConfig } from './types.js';
|
|
10
|
-
|
|
11
|
-
export type NapCatEndpoint = NapCatWsClient | NapCatWsServer | NapCatHttpEndpoint;
|
|
12
|
-
|
|
13
|
-
export class NapCatAdapter extends Adapter<NapCatEndpoint> {
|
|
14
|
-
static override readonly capabilities = ['inbound', 'outbound'] as const;
|
|
15
|
-
|
|
16
|
-
#router?: Router;
|
|
17
|
-
|
|
18
|
-
constructor(plugin: Plugin) {
|
|
19
|
-
super(plugin, 'napcat', []);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
createEndpoint(config: NapCatEndpointConfig): NapCatEndpoint {
|
|
23
|
-
const connection = config.connection ?? 'ws';
|
|
24
|
-
switch (connection) {
|
|
25
|
-
case 'ws':
|
|
26
|
-
return new NapCatWsClient(this, config as NapCatWsClientConfig);
|
|
27
|
-
case 'wss':
|
|
28
|
-
if (!this.#router) throw new Error('NapCat connection: wss requires router. Enable @zhin.js/host-router first.');
|
|
29
|
-
return new NapCatWsServer(this, this.#router, config as NapCatWsServerConfig);
|
|
30
|
-
case 'http':
|
|
31
|
-
if (!this.#router) throw new Error('NapCat connection: http requires router. Enable @zhin.js/host-router first.');
|
|
32
|
-
return new NapCatHttpEndpoint(this, this.#router, config as NapCatHttpConfig);
|
|
33
|
-
default:
|
|
34
|
-
throw new Error(`Unknown NapCat connection: ${connection}`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// ── 群管理接口(IGroupManagement 适配)──────────────────────────
|
|
39
|
-
|
|
40
|
-
async kickMember(endpointId: string, sceneId: string, userId: string) {
|
|
41
|
-
const endpoint = this.endpoints.get(endpointId);
|
|
42
|
-
if (!endpoint) throw new Error(`Endpoint ${endpointId} not found`);
|
|
43
|
-
return endpoint.kickMember(Number(sceneId), Number(userId));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
async muteMember(endpointId: string, sceneId: string, userId: string, duration = 600) {
|
|
47
|
-
const endpoint = this.endpoints.get(endpointId);
|
|
48
|
-
if (!endpoint) throw new Error(`Endpoint ${endpointId} not found`);
|
|
49
|
-
return endpoint.muteMember(Number(sceneId), Number(userId), duration);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
async muteAll(endpointId: string, sceneId: string, enable = true) {
|
|
53
|
-
const endpoint = this.endpoints.get(endpointId);
|
|
54
|
-
if (!endpoint) throw new Error(`Endpoint ${endpointId} not found`);
|
|
55
|
-
return endpoint.muteAll(Number(sceneId), enable);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async setAdmin(endpointId: string, sceneId: string, userId: string, enable = true) {
|
|
59
|
-
const endpoint = this.endpoints.get(endpointId);
|
|
60
|
-
if (!endpoint) throw new Error(`Endpoint ${endpointId} not found`);
|
|
61
|
-
return endpoint.setAdmin(Number(sceneId), Number(userId), enable);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async setMemberNickname(endpointId: string, sceneId: string, userId: string, nickname: string) {
|
|
65
|
-
const endpoint = this.endpoints.get(endpointId);
|
|
66
|
-
if (!endpoint) throw new Error(`Endpoint ${endpointId} not found`);
|
|
67
|
-
return endpoint.setCard(Number(sceneId), Number(userId), nickname);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
async setGroupName(endpointId: string, sceneId: string, name: string) {
|
|
71
|
-
const endpoint = this.endpoints.get(endpointId);
|
|
72
|
-
if (!endpoint) throw new Error(`Endpoint ${endpointId} not found`);
|
|
73
|
-
return endpoint.setGroupName(Number(sceneId), name);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
async listMembers(endpointId: string, sceneId: string) {
|
|
77
|
-
const endpoint = this.endpoints.get(endpointId);
|
|
78
|
-
if (!endpoint) throw new Error(`Endpoint ${endpointId} not found`);
|
|
79
|
-
const members = await endpoint.getMemberList(Number(sceneId));
|
|
80
|
-
return {
|
|
81
|
-
members: members.map((m: any) => ({
|
|
82
|
-
user_id: m.user_id, nickname: m.nickname, card: m.card, role: m.role, title: m.title,
|
|
83
|
-
})),
|
|
84
|
-
count: members.length,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
async getGroupInfo(endpointId: string, sceneId: string) {
|
|
89
|
-
const endpoint = this.endpoints.get(endpointId);
|
|
90
|
-
if (!endpoint) throw new Error(`Endpoint ${endpointId} not found`);
|
|
91
|
-
return endpoint.getGroupInfo(Number(sceneId));
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
async start(): Promise<void> {
|
|
95
|
-
this.#router = (this.plugin.inject as (key: string) => Router | undefined)('router');
|
|
96
|
-
(this.plugin.useContext as (key: string, fn: (router: Router) => void) => void)('router', (router: Router) => {
|
|
97
|
-
this.#router = router;
|
|
98
|
-
});
|
|
99
|
-
await super.start();
|
|
100
|
-
}
|
|
101
|
-
}
|
package/src/agent-prompt.ts
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
AgentPromptBuildContext,
|
|
3
|
-
AgentPromptContributor,
|
|
4
|
-
AgentPromptSection,
|
|
5
|
-
AgentTool,
|
|
6
|
-
} from 'zhin.js';
|
|
7
|
-
import { filterTools } from 'zhin.js';
|
|
8
|
-
|
|
9
|
-
function isNapCatDelegatedTask(query: string, goal: string): boolean {
|
|
10
|
-
const text = `${query} ${goal}`;
|
|
11
|
-
if (/\bnapcat\b|napcat_|mcp_napcat/i.test(text)) return true;
|
|
12
|
-
if (/戳一戳|poke|表情回应|emoji.*reaction/i.test(text)) return true;
|
|
13
|
-
if (/精华消息|essence|群公告|group.*notice/i.test(text)) return true;
|
|
14
|
-
if (/AI语音|ai.*record|tts|文字转语音/i.test(text)) return true;
|
|
15
|
-
if (/群文件|upload.*file|群签到|group.*sign/i.test(text)) return true;
|
|
16
|
-
if (/合并转发|forward.*msg|转发消息/i.test(text)) return true;
|
|
17
|
-
if (/点赞/.test(text) && /qq|好友|\d{5,}/i.test(text)) return true;
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function selectNapCatDeferredTools(
|
|
22
|
-
query: string,
|
|
23
|
-
goal: string,
|
|
24
|
-
deferredCatalog: AgentTool[],
|
|
25
|
-
maxTools: number,
|
|
26
|
-
): AgentTool[] {
|
|
27
|
-
const pool = deferredCatalog.filter(
|
|
28
|
-
t => !t.name.startsWith('mcp_filesystem') && !t.name.startsWith('mcp_memory_'),
|
|
29
|
-
);
|
|
30
|
-
const napcatTools = pool.filter(t => t.name.startsWith('napcat_'));
|
|
31
|
-
const pinned: AgentTool[] = [];
|
|
32
|
-
const preferOrder = [
|
|
33
|
-
'napcat_send_poke',
|
|
34
|
-
'napcat_set_emoji_reaction',
|
|
35
|
-
'napcat_send_like',
|
|
36
|
-
'napcat_set_essence_msg',
|
|
37
|
-
'napcat_send_group_notice',
|
|
38
|
-
'napcat_ai_tts',
|
|
39
|
-
];
|
|
40
|
-
for (const name of preferOrder) {
|
|
41
|
-
const t = napcatTools.find(x => x.name === name);
|
|
42
|
-
if (t) pinned.push(t);
|
|
43
|
-
}
|
|
44
|
-
for (const t of napcatTools) {
|
|
45
|
-
if (pinned.length >= maxTools) break;
|
|
46
|
-
if (!pinned.some(p => p.name === t.name)) pinned.push(t);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const extra = filterTools(query, pool, { maxTools, minScore: 0.08 })
|
|
50
|
-
.filter(t => !pinned.some(p => p.name === t.name));
|
|
51
|
-
|
|
52
|
-
const merged: AgentTool[] = [...pinned];
|
|
53
|
-
for (const t of extra) {
|
|
54
|
-
if (merged.length >= maxTools) break;
|
|
55
|
-
merged.push(t);
|
|
56
|
-
}
|
|
57
|
-
return merged.slice(0, maxTools);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const ORCHESTRATOR_NAPCAT = [
|
|
61
|
-
'On napcat/QQ: use run_deferred_task with tool_query "napcat_send_poke" or "napcat_set_emoji_reaction".',
|
|
62
|
-
'NapCat supports: poke, emoji reaction, forward msg, essence, group notice, AI TTS, OCR, group files.',
|
|
63
|
-
'Skip tool_search when the user clearly asks for QQ-specific features like poke, reaction, or group management.',
|
|
64
|
-
].join('\n');
|
|
65
|
-
|
|
66
|
-
const WORKER_NAPCAT = [
|
|
67
|
-
'- Use `napcat_send_poke` for poke/戳一戳.',
|
|
68
|
-
'- Use `napcat_set_emoji_reaction` for emoji reaction/表情回应.',
|
|
69
|
-
'- Use `napcat_send_like` for friend like/点赞.',
|
|
70
|
-
'- Use `napcat_ai_tts` for AI voice/AI语音.',
|
|
71
|
-
'- Use `napcat_set_essence_msg` / `napcat_delete_essence_msg` for essence messages.',
|
|
72
|
-
'- Use `napcat_send_group_notice` for group announcements.',
|
|
73
|
-
'- Do NOT use mcp_filesystem_* or explore node_modules for QQ tasks.',
|
|
74
|
-
].join('\n');
|
|
75
|
-
|
|
76
|
-
export function createNapCatAgentPromptContributor(): AgentPromptContributor {
|
|
77
|
-
return {
|
|
78
|
-
platform: 'napcat',
|
|
79
|
-
|
|
80
|
-
async buildSections(ctx: AgentPromptBuildContext): Promise<AgentPromptSection[] | null> {
|
|
81
|
-
if (ctx.slot === 'orchestrator') {
|
|
82
|
-
return [{
|
|
83
|
-
id: 'platform.napcat.orchestrator',
|
|
84
|
-
title: '## napcat / QQ',
|
|
85
|
-
body: ORCHESTRATOR_NAPCAT,
|
|
86
|
-
priority: 50,
|
|
87
|
-
}];
|
|
88
|
-
}
|
|
89
|
-
if (ctx.slot === 'deferred_worker') {
|
|
90
|
-
const query = ctx.deferred?.toolQuery ?? ctx.deferred?.goal ?? '';
|
|
91
|
-
const goal = ctx.deferred?.goal ?? '';
|
|
92
|
-
if (!isNapCatDelegatedTask(query, goal)) return null;
|
|
93
|
-
return [{
|
|
94
|
-
id: 'platform.napcat.deferred_worker',
|
|
95
|
-
title: '## napcat / QQ(本任务)',
|
|
96
|
-
body: WORKER_NAPCAT,
|
|
97
|
-
priority: 50,
|
|
98
|
-
}];
|
|
99
|
-
}
|
|
100
|
-
return null;
|
|
101
|
-
},
|
|
102
|
-
|
|
103
|
-
matchesDeferredTask(ctx: AgentPromptBuildContext): boolean {
|
|
104
|
-
const query = ctx.deferred?.toolQuery ?? ctx.deferred?.goal ?? ctx.userMessagePreview ?? '';
|
|
105
|
-
const goal = ctx.deferred?.goal ?? ctx.userMessagePreview ?? '';
|
|
106
|
-
return isNapCatDelegatedTask(query, goal);
|
|
107
|
-
},
|
|
108
|
-
|
|
109
|
-
selectDeferredTools(query, goal, catalog, maxTools) {
|
|
110
|
-
if (!isNapCatDelegatedTask(query, goal)) return null;
|
|
111
|
-
return selectNapCatDeferredTools(query, goal, catalog, maxTools);
|
|
112
|
-
},
|
|
113
|
-
};
|
|
114
|
-
}
|