@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.
Files changed (202) hide show
  1. package/CHANGELOG.md +757 -0
  2. package/{skills/napcat/PERMITS.md → PERMITS.md} +3 -3
  3. package/README.md +63 -95
  4. package/adapters/napcat/index.js +47 -0
  5. package/adapters/napcat/index.ts +64 -0
  6. package/agents/napcat/agent.json +20 -0
  7. package/agents/napcat/boundaries.md +3 -0
  8. package/agents/napcat/conventions.md +3 -0
  9. package/agents/napcat/skills/napcat-account/SKILL.md +25 -0
  10. package/agents/napcat/skills/napcat-account/tools/delete_friend/index.js +18 -0
  11. package/agents/napcat/skills/napcat-account/tools/delete_friend/index.ts +18 -0
  12. package/agents/napcat/skills/napcat-account/tools/get_user_status/index.js +16 -0
  13. package/agents/napcat/skills/napcat-account/tools/get_user_status/index.ts +16 -0
  14. package/agents/napcat/skills/napcat-account/tools/send_like/index.js +18 -0
  15. package/agents/napcat/skills/napcat-account/tools/send_like/index.ts +18 -0
  16. package/agents/napcat/skills/napcat-account/tools/set_avatar/index.js +17 -0
  17. package/agents/napcat/skills/napcat-account/tools/set_avatar/index.ts +17 -0
  18. package/agents/napcat/skills/napcat-account/tools/set_online_status/index.js +18 -0
  19. package/agents/napcat/skills/napcat-account/tools/set_online_status/index.ts +18 -0
  20. package/agents/napcat/skills/napcat-account/tools/set_profile/index.js +21 -0
  21. package/agents/napcat/skills/napcat-account/tools/set_profile/index.ts +21 -0
  22. package/agents/napcat/skills/napcat-account/tools/set_signature/index.js +17 -0
  23. package/agents/napcat/skills/napcat-account/tools/set_signature/index.ts +17 -0
  24. package/agents/napcat/skills/napcat-files-history/SKILL.md +22 -0
  25. package/agents/napcat/skills/napcat-files-history/tools/download_file/index.js +17 -0
  26. package/agents/napcat/skills/napcat-files-history/tools/download_file/index.ts +17 -0
  27. package/agents/napcat/skills/napcat-files-history/tools/get_friend_msg_history/index.js +18 -0
  28. package/agents/napcat/skills/napcat-files-history/tools/get_friend_msg_history/index.ts +18 -0
  29. package/agents/napcat/skills/napcat-files-history/tools/get_group_file_url/index.js +19 -0
  30. package/agents/napcat/skills/napcat-files-history/tools/get_group_file_url/index.ts +19 -0
  31. package/agents/napcat/skills/napcat-files-history/tools/get_group_msg_history/index.js +19 -0
  32. package/agents/napcat/skills/napcat-files-history/tools/get_group_msg_history/index.ts +19 -0
  33. package/agents/napcat/skills/napcat-files-history/tools/get_group_root_files/index.js +17 -0
  34. package/agents/napcat/skills/napcat-files-history/tools/get_group_root_files/index.ts +17 -0
  35. package/agents/napcat/skills/napcat-files-history/tools/upload_group_file/index.js +21 -0
  36. package/agents/napcat/skills/napcat-files-history/tools/upload_group_file/index.ts +21 -0
  37. package/agents/napcat/skills/napcat-group-content/SKILL.md +21 -0
  38. package/agents/napcat/skills/napcat-group-content/tools/del_group_notice/index.js +20 -0
  39. package/agents/napcat/skills/napcat-group-content/tools/del_group_notice/index.ts +20 -0
  40. package/agents/napcat/skills/napcat-group-content/tools/delete_essence_msg/index.js +19 -0
  41. package/agents/napcat/skills/napcat-group-content/tools/delete_essence_msg/index.ts +19 -0
  42. package/agents/napcat/skills/napcat-group-content/tools/get_essence_list/index.js +17 -0
  43. package/agents/napcat/skills/napcat-group-content/tools/get_essence_list/index.ts +17 -0
  44. package/agents/napcat/skills/napcat-group-content/tools/get_group_notice/index.js +17 -0
  45. package/agents/napcat/skills/napcat-group-content/tools/get_group_notice/index.ts +17 -0
  46. package/agents/napcat/skills/napcat-group-content/tools/send_group_notice/index.js +21 -0
  47. package/agents/napcat/skills/napcat-group-content/tools/send_group_notice/index.ts +21 -0
  48. package/agents/napcat/skills/napcat-group-content/tools/set_essence_msg/index.js +19 -0
  49. package/agents/napcat/skills/napcat-group-content/tools/set_essence_msg/index.ts +19 -0
  50. package/agents/napcat/skills/napcat-group-settings/SKILL.md +23 -0
  51. package/agents/napcat/skills/napcat-group-settings/tools/get_group_info_ex/index.js +17 -0
  52. package/agents/napcat/skills/napcat-group-settings/tools/get_group_info_ex/index.ts +17 -0
  53. package/agents/napcat/skills/napcat-group-settings/tools/get_group_shut_list/index.js +17 -0
  54. package/agents/napcat/skills/napcat-group-settings/tools/get_group_shut_list/index.ts +17 -0
  55. package/agents/napcat/skills/napcat-group-settings/tools/group_sign/index.js +18 -0
  56. package/agents/napcat/skills/napcat-group-settings/tools/group_sign/index.ts +18 -0
  57. package/agents/napcat/skills/napcat-group-settings/tools/set_group_portrait/index.js +20 -0
  58. package/agents/napcat/skills/napcat-group-settings/tools/set_group_portrait/index.ts +20 -0
  59. package/agents/napcat/skills/napcat-group-settings/tools/set_title/index.js +21 -0
  60. package/agents/napcat/skills/napcat-group-settings/tools/set_title/index.ts +21 -0
  61. package/agents/napcat/skills/napcat-media/SKILL.md +23 -0
  62. package/agents/napcat/skills/napcat-media/tools/ai_tts/index.js +19 -0
  63. package/agents/napcat/skills/napcat-media/tools/ai_tts/index.ts +19 -0
  64. package/agents/napcat/skills/napcat-media/tools/get_ai_characters/index.js +17 -0
  65. package/agents/napcat/skills/napcat-media/tools/get_ai_characters/index.ts +17 -0
  66. package/agents/napcat/skills/napcat-media/tools/get_mini_app_ark/index.js +20 -0
  67. package/agents/napcat/skills/napcat-media/tools/get_mini_app_ark/index.ts +20 -0
  68. package/agents/napcat/skills/napcat-media/tools/ocr_image/index.js +16 -0
  69. package/agents/napcat/skills/napcat-media/tools/ocr_image/index.ts +16 -0
  70. package/agents/napcat/skills/napcat-media/tools/translate/index.js +16 -0
  71. package/agents/napcat/skills/napcat-media/tools/translate/index.ts +16 -0
  72. package/agents/napcat/skills/napcat-messaging/SKILL.md +22 -0
  73. package/agents/napcat/skills/napcat-messaging/tools/forward_single_msg/index.js +22 -0
  74. package/agents/napcat/skills/napcat-messaging/tools/forward_single_msg/index.ts +28 -0
  75. package/agents/napcat/skills/napcat-messaging/tools/mark_msg_as_read/index.js +17 -0
  76. package/agents/napcat/skills/napcat-messaging/tools/mark_msg_as_read/index.ts +17 -0
  77. package/agents/napcat/skills/napcat-messaging/tools/send_forward_msg/index.js +19 -0
  78. package/agents/napcat/skills/napcat-messaging/tools/send_forward_msg/index.ts +27 -0
  79. package/agents/napcat/skills/napcat-messaging/tools/send_poke/index.js +18 -0
  80. package/agents/napcat/skills/napcat-messaging/tools/send_poke/index.ts +18 -0
  81. package/agents/napcat/skills/napcat-messaging/tools/set_emoji_reaction/index.js +18 -0
  82. package/agents/napcat/skills/napcat-messaging/tools/set_emoji_reaction/index.ts +18 -0
  83. package/agents/napcat/system.md +3 -0
  84. package/commands/napcat/endpoint/add/[id]/index.js +3 -0
  85. package/commands/napcat/endpoint/add/[id]/index.ts +3 -0
  86. package/commands/napcat/endpoint/definition.js +29 -0
  87. package/commands/napcat/endpoint/definition.ts +26 -0
  88. package/commands/napcat/endpoint/list/index.js +3 -0
  89. package/commands/napcat/endpoint/list/index.ts +3 -0
  90. package/commands/napcat/endpoint/remove/[id]/index.js +3 -0
  91. package/commands/napcat/endpoint/remove/[id]/index.ts +3 -0
  92. package/lib/client.d.ts +52 -0
  93. package/lib/client.js +62 -0
  94. package/lib/endpoint-management.d.ts +15 -0
  95. package/lib/endpoint-management.js +47 -0
  96. package/lib/http-endpoint.d.ts +27 -0
  97. package/lib/http-endpoint.js +177 -0
  98. package/lib/index.d.ts +11 -22
  99. package/lib/index.js +10 -59
  100. package/lib/napcat-inbound.d.ts +12 -5
  101. package/lib/napcat-inbound.js +28 -13
  102. package/lib/napcat-runtime-state.d.ts +1 -0
  103. package/lib/napcat-runtime-state.js +6 -0
  104. package/lib/onebot-get-msg.d.ts +16 -3
  105. package/lib/onebot-get-msg.js +53 -1
  106. package/lib/protocol.d.ts +147 -0
  107. package/lib/protocol.js +318 -0
  108. package/lib/side-event-dispatch.d.ts +7 -0
  109. package/lib/side-event-dispatch.js +36 -0
  110. package/lib/webhook.d.ts +2 -0
  111. package/lib/webhook.js +14 -0
  112. package/lib/ws-endpoint.d.ts +27 -0
  113. package/lib/ws-endpoint.js +241 -0
  114. package/lib/ws-transport.d.ts +13 -0
  115. package/lib/ws-transport.js +75 -0
  116. package/lib/ws-types.d.ts +17 -0
  117. package/lib/ws-types.js +1 -0
  118. package/lib/wss-auth.d.ts +2 -0
  119. package/lib/wss-auth.js +16 -0
  120. package/lib/wss-endpoint.d.ts +29 -0
  121. package/lib/wss-endpoint.js +196 -0
  122. package/package.json +76 -34
  123. package/plugin.js +18 -0
  124. package/schema.json +131 -0
  125. package/src/client.ts +79 -0
  126. package/src/endpoint-management.ts +72 -0
  127. package/src/http-endpoint.ts +234 -0
  128. package/src/index.ts +62 -87
  129. package/src/napcat-inbound.ts +34 -10
  130. package/src/napcat-runtime-state.ts +7 -0
  131. package/src/onebot-get-msg.ts +69 -5
  132. package/src/protocol.ts +465 -0
  133. package/src/side-event-dispatch.ts +48 -0
  134. package/src/webhook.ts +16 -0
  135. package/src/ws-endpoint.ts +301 -0
  136. package/src/ws-transport.ts +105 -0
  137. package/src/ws-types.ts +20 -0
  138. package/src/wss-auth.ts +17 -0
  139. package/src/wss-endpoint.ts +247 -0
  140. package/client/NapCatManagement.tsx +0 -113
  141. package/client/index.tsx +0 -11
  142. package/client/tsconfig.json +0 -7
  143. package/client/utils/api.ts +0 -30
  144. package/dist/index.js +0 -27
  145. package/lib/adapter.d.ts +0 -28
  146. package/lib/adapter.d.ts.map +0 -1
  147. package/lib/adapter.js +0 -94
  148. package/lib/adapter.js.map +0 -1
  149. package/lib/agent-prompt.d.ts +0 -3
  150. package/lib/agent-prompt.d.ts.map +0 -1
  151. package/lib/agent-prompt.js +0 -105
  152. package/lib/agent-prompt.js.map +0 -1
  153. package/lib/endpoint-base.d.ts +0 -143
  154. package/lib/endpoint-base.d.ts.map +0 -1
  155. package/lib/endpoint-base.js +0 -334
  156. package/lib/endpoint-base.js.map +0 -1
  157. package/lib/endpoint-http.d.ts +0 -18
  158. package/lib/endpoint-http.d.ts.map +0 -1
  159. package/lib/endpoint-http.js +0 -119
  160. package/lib/endpoint-http.js.map +0 -1
  161. package/lib/endpoint-ws-client.d.ts +0 -21
  162. package/lib/endpoint-ws-client.d.ts.map +0 -1
  163. package/lib/endpoint-ws-client.js +0 -165
  164. package/lib/endpoint-ws-client.js.map +0 -1
  165. package/lib/endpoint-ws-server.d.ts +0 -21
  166. package/lib/endpoint-ws-server.d.ts.map +0 -1
  167. package/lib/endpoint-ws-server.js +0 -150
  168. package/lib/endpoint-ws-server.js.map +0 -1
  169. package/lib/index.d.ts.map +0 -1
  170. package/lib/index.js.map +0 -1
  171. package/lib/napcat-inbound.d.ts.map +0 -1
  172. package/lib/napcat-inbound.js.map +0 -1
  173. package/lib/onebot-get-msg.d.ts.map +0 -1
  174. package/lib/onebot-get-msg.js.map +0 -1
  175. package/lib/routes.d.ts +0 -4
  176. package/lib/routes.d.ts.map +0 -1
  177. package/lib/routes.js +0 -61
  178. package/lib/routes.js.map +0 -1
  179. package/lib/tools.d.ts +0 -8
  180. package/lib/tools.d.ts.map +0 -1
  181. package/lib/tools.js +0 -605
  182. package/lib/tools.js.map +0 -1
  183. package/lib/types.d.ts +0 -293
  184. package/lib/types.d.ts.map +0 -1
  185. package/lib/types.js +0 -6
  186. package/lib/types.js.map +0 -1
  187. package/lib/typing-indicator.d.ts +0 -45
  188. package/lib/typing-indicator.d.ts.map +0 -1
  189. package/lib/typing-indicator.js +0 -132
  190. package/lib/typing-indicator.js.map +0 -1
  191. package/plugin.yml +0 -3
  192. package/skills/napcat/SKILL.md +0 -311
  193. package/src/adapter.ts +0 -101
  194. package/src/agent-prompt.ts +0 -114
  195. package/src/endpoint-base.ts +0 -376
  196. package/src/endpoint-http.ts +0 -109
  197. package/src/endpoint-ws-client.ts +0 -164
  198. package/src/endpoint-ws-server.ts +0 -150
  199. package/src/routes.ts +0 -61
  200. package/src/tools.ts +0 -632
  201. package/src/types.ts +0 -279
  202. package/src/typing-indicator.ts +0 -184
@@ -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
- }
@@ -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
- }