@tencent-connect/openclaw-qqbot 1.7.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/README.md +206 -4
  2. package/README.zh.md +207 -4
  3. package/bin/qqbot-cli.js +5 -2
  4. package/dist/index.cjs +15549 -0
  5. package/dist/index.cjs.map +1 -0
  6. package/dist/index.d.cts +890 -0
  7. package/index.ts +56 -18
  8. package/openclaw.plugin.json +19 -3
  9. package/package.json +14 -23
  10. package/preload.cjs +17 -14
  11. package/scripts/link-sdk-core.cjs +133 -50
  12. package/scripts/upgrade-via-npm.sh +400 -73
  13. package/scripts/upgrade-via-source.sh +126 -89
  14. package/skills/qqbot-channel/SKILL.md +34 -12
  15. package/src/adapter/contract.ts +69 -0
  16. package/src/adapter/gateway.ts +61 -0
  17. package/src/adapter/index.ts +15 -0
  18. package/src/adapter/lint.ts +144 -0
  19. package/src/adapter/media.ts +112 -0
  20. package/src/adapter/pairing.ts +99 -0
  21. package/src/adapter/resolve.ts +333 -0
  22. package/src/adapter/setup.ts +55 -0
  23. package/src/adapter/webhook.ts +248 -0
  24. package/src/adapter/workspace.ts +29 -0
  25. package/src/bot-instance.ts +60 -0
  26. package/src/channel.ts +202 -413
  27. package/src/commands/bot-approve.ts +143 -0
  28. package/src/commands/bot-clear-storage.ts +114 -0
  29. package/src/commands/bot-group-always.ts +62 -0
  30. package/src/commands/bot-help.ts +40 -0
  31. package/src/commands/bot-logs.ts +248 -0
  32. package/src/commands/bot-me.ts +18 -0
  33. package/src/commands/bot-pairing.ts +57 -0
  34. package/src/commands/bot-ping.ts +33 -0
  35. package/src/commands/bot-streaming.ts +55 -0
  36. package/src/commands/bot-upgrade.ts +56 -0
  37. package/src/commands/bot-version.ts +41 -0
  38. package/src/commands/config-util.ts +96 -0
  39. package/src/commands/index.ts +49 -0
  40. package/src/config.ts +59 -19
  41. package/src/dispatch/body-assembler.ts +356 -0
  42. package/src/dispatch/ctx-builder.ts +110 -0
  43. package/src/dispatch/dispatch.ts +352 -0
  44. package/src/dispatch/envelope-builder.ts +112 -0
  45. package/src/dispatch/index.ts +2 -0
  46. package/src/{approval-handler.ts → features/approval-handler.ts} +40 -94
  47. package/src/features/approval-utils.ts +41 -0
  48. package/src/features/credential-backup.ts +82 -0
  49. package/src/features/history-store.ts +19 -0
  50. package/src/features/msgid-cache.ts +55 -0
  51. package/src/features/onboarding.ts +38 -0
  52. package/src/{proactive.ts → features/proactive.ts} +68 -49
  53. package/src/features/ref-index-store.ts +282 -0
  54. package/src/{update-checker.ts → features/update-checker.ts} +15 -35
  55. package/src/gateway/event-handlers.ts +241 -0
  56. package/src/gateway/index.ts +3 -0
  57. package/src/gateway/lifecycle.ts +221 -0
  58. package/src/gateway/middleware-setup.ts +139 -0
  59. package/src/gateway/qqbot-gateway.ts +342 -0
  60. package/src/middleware/access-control.ts +130 -0
  61. package/src/middleware/attachment.ts +314 -0
  62. package/src/middleware/policy-injector.ts +66 -0
  63. package/src/openclaw-plugin-sdk.d.ts +81 -10
  64. package/src/outbound/cron-scheduler.ts +130 -0
  65. package/src/outbound/debounce.ts +102 -0
  66. package/src/outbound/deliver-pipeline.ts +235 -0
  67. package/src/outbound/image-size.ts +123 -0
  68. package/src/outbound/index.ts +3 -0
  69. package/src/outbound/local-file-router.ts +145 -0
  70. package/src/outbound/media-send.ts +377 -0
  71. package/src/outbound/outbound-service.ts +222 -0
  72. package/src/outbound/reply-limiter.ts +128 -0
  73. package/src/outbound/sanitize.ts +32 -0
  74. package/src/outbound/streaming-controller.ts +228 -0
  75. package/src/outbound/target.ts +63 -0
  76. package/src/outbound/tts-provider.ts +84 -0
  77. package/src/request-context.ts +9 -8
  78. package/src/runtime.ts +31 -6
  79. package/src/setup/account-key.ts +41 -0
  80. package/src/setup/finalize.ts +110 -0
  81. package/src/setup/login.ts +197 -0
  82. package/src/setup/surface.ts +40 -0
  83. package/src/tools/platform.ts +149 -0
  84. package/src/tools/remind.ts +1 -1
  85. package/src/types-augment.d.ts +54 -0
  86. package/src/types.ts +71 -8
  87. package/src/typings/openclaw-webhook-ingress.d.ts +66 -0
  88. package/src/utils/mention.ts +52 -0
  89. package/src/utils/pkg-version.ts +84 -47
  90. package/src/utils/platform.ts +31 -7
  91. package/src/utils/plugin-logger.ts +104 -0
  92. package/src/utils/ssrf-guard.ts +32 -2
  93. package/src/utils/stt.ts +137 -0
  94. package/src/utils/voice-text.ts +61 -0
  95. package/tsconfig.json +2 -1
  96. package/tsup.config.ts +57 -0
  97. package/dist/index.d.ts +0 -17
  98. package/dist/index.js +0 -26
  99. package/dist/src/admin-resolver.d.ts +0 -33
  100. package/dist/src/admin-resolver.js +0 -157
  101. package/dist/src/api.d.ts +0 -307
  102. package/dist/src/api.js +0 -910
  103. package/dist/src/approval-handler.d.ts +0 -47
  104. package/dist/src/approval-handler.js +0 -372
  105. package/dist/src/channel.d.ts +0 -29
  106. package/dist/src/channel.js +0 -528
  107. package/dist/src/config.d.ts +0 -56
  108. package/dist/src/config.js +0 -278
  109. package/dist/src/credential-backup.d.ts +0 -31
  110. package/dist/src/credential-backup.js +0 -66
  111. package/dist/src/deliver-debounce.d.ts +0 -74
  112. package/dist/src/deliver-debounce.js +0 -174
  113. package/dist/src/gateway.d.ts +0 -18
  114. package/dist/src/gateway.js +0 -2063
  115. package/dist/src/group-history.d.ts +0 -136
  116. package/dist/src/group-history.js +0 -226
  117. package/dist/src/image-server.d.ts +0 -87
  118. package/dist/src/image-server.js +0 -570
  119. package/dist/src/inbound-attachments.d.ts +0 -60
  120. package/dist/src/inbound-attachments.js +0 -248
  121. package/dist/src/known-users.d.ts +0 -100
  122. package/dist/src/known-users.js +0 -263
  123. package/dist/src/message-gating.d.ts +0 -53
  124. package/dist/src/message-gating.js +0 -107
  125. package/dist/src/message-queue.d.ts +0 -91
  126. package/dist/src/message-queue.js +0 -257
  127. package/dist/src/onboarding.d.ts +0 -10
  128. package/dist/src/onboarding.js +0 -203
  129. package/dist/src/outbound-deliver.d.ts +0 -48
  130. package/dist/src/outbound-deliver.js +0 -392
  131. package/dist/src/outbound.d.ts +0 -220
  132. package/dist/src/outbound.js +0 -975
  133. package/dist/src/proactive.d.ts +0 -170
  134. package/dist/src/proactive.js +0 -399
  135. package/dist/src/ref-index-store.d.ts +0 -101
  136. package/dist/src/ref-index-store.js +0 -298
  137. package/dist/src/reply-dispatcher.d.ts +0 -35
  138. package/dist/src/reply-dispatcher.js +0 -311
  139. package/dist/src/request-context.d.ts +0 -25
  140. package/dist/src/request-context.js +0 -37
  141. package/dist/src/runtime.d.ts +0 -3
  142. package/dist/src/runtime.js +0 -13
  143. package/dist/src/session-store.d.ts +0 -52
  144. package/dist/src/session-store.js +0 -254
  145. package/dist/src/slash-commands.d.ts +0 -82
  146. package/dist/src/slash-commands.js +0 -2117
  147. package/dist/src/startup-greeting.d.ts +0 -30
  148. package/dist/src/startup-greeting.js +0 -97
  149. package/dist/src/streaming.d.ts +0 -247
  150. package/dist/src/streaming.js +0 -899
  151. package/dist/src/stt.d.ts +0 -21
  152. package/dist/src/stt.js +0 -70
  153. package/dist/src/tools/channel.d.ts +0 -16
  154. package/dist/src/tools/channel.js +0 -234
  155. package/dist/src/tools/remind.d.ts +0 -2
  156. package/dist/src/tools/remind.js +0 -256
  157. package/dist/src/types.d.ts +0 -443
  158. package/dist/src/types.js +0 -22
  159. package/dist/src/typing-keepalive.d.ts +0 -27
  160. package/dist/src/typing-keepalive.js +0 -64
  161. package/dist/src/update-checker.d.ts +0 -36
  162. package/dist/src/update-checker.js +0 -171
  163. package/dist/src/utils/audio-convert.d.ts +0 -98
  164. package/dist/src/utils/audio-convert.js +0 -755
  165. package/dist/src/utils/chunked-upload.d.ts +0 -68
  166. package/dist/src/utils/chunked-upload.js +0 -341
  167. package/dist/src/utils/file-utils.d.ts +0 -61
  168. package/dist/src/utils/file-utils.js +0 -172
  169. package/dist/src/utils/image-size.d.ts +0 -51
  170. package/dist/src/utils/image-size.js +0 -234
  171. package/dist/src/utils/media-send.d.ts +0 -158
  172. package/dist/src/utils/media-send.js +0 -502
  173. package/dist/src/utils/media-tags.d.ts +0 -14
  174. package/dist/src/utils/media-tags.js +0 -165
  175. package/dist/src/utils/payload.d.ts +0 -112
  176. package/dist/src/utils/payload.js +0 -186
  177. package/dist/src/utils/pkg-version.d.ts +0 -5
  178. package/dist/src/utils/pkg-version.js +0 -61
  179. package/dist/src/utils/platform.d.ts +0 -137
  180. package/dist/src/utils/platform.js +0 -390
  181. package/dist/src/utils/ssrf-guard.d.ts +0 -25
  182. package/dist/src/utils/ssrf-guard.js +0 -91
  183. package/dist/src/utils/text-parsing.d.ts +0 -31
  184. package/dist/src/utils/text-parsing.js +0 -74
  185. package/dist/src/utils/upload-cache.d.ts +0 -34
  186. package/dist/src/utils/upload-cache.js +0 -93
  187. package/node_modules/@eshaz/web-worker/LICENSE +0 -201
  188. package/node_modules/@eshaz/web-worker/README.md +0 -134
  189. package/node_modules/@eshaz/web-worker/browser.js +0 -17
  190. package/node_modules/@eshaz/web-worker/cjs/browser.js +0 -16
  191. package/node_modules/@eshaz/web-worker/cjs/node.js +0 -219
  192. package/node_modules/@eshaz/web-worker/index.d.ts +0 -4
  193. package/node_modules/@eshaz/web-worker/node.js +0 -223
  194. package/node_modules/@eshaz/web-worker/package.json +0 -54
  195. package/node_modules/@wasm-audio-decoders/common/index.js +0 -5
  196. package/node_modules/@wasm-audio-decoders/common/package.json +0 -36
  197. package/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderCommon.js +0 -231
  198. package/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderWorker.js +0 -129
  199. package/node_modules/@wasm-audio-decoders/common/src/puff/README +0 -67
  200. package/node_modules/@wasm-audio-decoders/common/src/puff/build_puff.js +0 -31
  201. package/node_modules/@wasm-audio-decoders/common/src/puff/puff.c +0 -863
  202. package/node_modules/@wasm-audio-decoders/common/src/puff/puff.h +0 -35
  203. package/node_modules/@wasm-audio-decoders/common/src/utilities.js +0 -3
  204. package/node_modules/@wasm-audio-decoders/common/types.d.ts +0 -7
  205. package/node_modules/mpg123-decoder/README.md +0 -265
  206. package/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js +0 -185
  207. package/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js.map +0 -1
  208. package/node_modules/mpg123-decoder/index.js +0 -8
  209. package/node_modules/mpg123-decoder/package.json +0 -58
  210. package/node_modules/mpg123-decoder/src/EmscriptenWasm.js +0 -464
  211. package/node_modules/mpg123-decoder/src/MPEGDecoder.js +0 -200
  212. package/node_modules/mpg123-decoder/src/MPEGDecoderWebWorker.js +0 -21
  213. package/node_modules/mpg123-decoder/types.d.ts +0 -30
  214. package/node_modules/silk-wasm/LICENSE +0 -21
  215. package/node_modules/silk-wasm/README.md +0 -85
  216. package/node_modules/silk-wasm/lib/index.cjs +0 -16
  217. package/node_modules/silk-wasm/lib/index.d.ts +0 -70
  218. package/node_modules/silk-wasm/lib/index.mjs +0 -16
  219. package/node_modules/silk-wasm/lib/silk.wasm +0 -0
  220. package/node_modules/silk-wasm/lib/utils.d.ts +0 -4
  221. package/node_modules/silk-wasm/package.json +0 -39
  222. package/node_modules/simple-yenc/.github/FUNDING.yml +0 -1
  223. package/node_modules/simple-yenc/.prettierignore +0 -1
  224. package/node_modules/simple-yenc/LICENSE +0 -7
  225. package/node_modules/simple-yenc/README.md +0 -163
  226. package/node_modules/simple-yenc/dist/esm.js +0 -1
  227. package/node_modules/simple-yenc/dist/index.js +0 -1
  228. package/node_modules/simple-yenc/package.json +0 -50
  229. package/node_modules/simple-yenc/rollup.config.js +0 -27
  230. package/node_modules/simple-yenc/src/simple-yenc.js +0 -302
  231. package/node_modules/ws/LICENSE +0 -20
  232. package/node_modules/ws/README.md +0 -548
  233. package/node_modules/ws/browser.js +0 -8
  234. package/node_modules/ws/index.js +0 -13
  235. package/node_modules/ws/lib/buffer-util.js +0 -131
  236. package/node_modules/ws/lib/constants.js +0 -19
  237. package/node_modules/ws/lib/event-target.js +0 -292
  238. package/node_modules/ws/lib/extension.js +0 -203
  239. package/node_modules/ws/lib/limiter.js +0 -55
  240. package/node_modules/ws/lib/permessage-deflate.js +0 -528
  241. package/node_modules/ws/lib/receiver.js +0 -706
  242. package/node_modules/ws/lib/sender.js +0 -602
  243. package/node_modules/ws/lib/stream.js +0 -161
  244. package/node_modules/ws/lib/subprotocol.js +0 -62
  245. package/node_modules/ws/lib/validation.js +0 -152
  246. package/node_modules/ws/lib/websocket-server.js +0 -554
  247. package/node_modules/ws/lib/websocket.js +0 -1393
  248. package/node_modules/ws/package.json +0 -69
  249. package/node_modules/ws/wrapper.mjs +0 -8
  250. package/scripts/postinstall-link-sdk.js +0 -126
  251. package/skills/qqbot-media/SKILL.md +0 -60
  252. package/src/admin-resolver.ts +0 -181
  253. package/src/api.ts +0 -1319
  254. package/src/credential-backup.ts +0 -72
  255. package/src/deliver-debounce.ts +0 -229
  256. package/src/gateway.ts +0 -2304
  257. package/src/group-history.ts +0 -328
  258. package/src/image-server.ts +0 -675
  259. package/src/inbound-attachments.ts +0 -321
  260. package/src/known-users.ts +0 -353
  261. package/src/message-gating.ts +0 -190
  262. package/src/message-queue.ts +0 -354
  263. package/src/onboarding.ts +0 -274
  264. package/src/outbound-deliver.ts +0 -486
  265. package/src/outbound.ts +0 -1179
  266. package/src/ref-index-store.ts +0 -412
  267. package/src/reply-dispatcher.ts +0 -334
  268. package/src/session-store.ts +0 -303
  269. package/src/slash-commands.ts +0 -2297
  270. package/src/startup-greeting.ts +0 -120
  271. package/src/streaming.ts +0 -1077
  272. package/src/stt.ts +0 -86
  273. package/src/tools/channel.ts +0 -281
  274. package/src/typing-keepalive.ts +0 -59
  275. package/src/utils/audio-convert.ts +0 -859
  276. package/src/utils/chunked-upload.ts +0 -483
  277. package/src/utils/file-utils.ts +0 -193
  278. package/src/utils/image-size.ts +0 -266
  279. package/src/utils/media-send.ts +0 -636
  280. package/src/utils/media-tags.ts +0 -183
  281. package/src/utils/payload.ts +0 -265
  282. package/src/utils/text-parsing.ts +0 -85
  283. package/src/utils/upload-cache.ts +0 -128
@@ -1,443 +0,0 @@
1
- /** 普通文本消息 */
2
- export declare const MSG_TYPE_TEXT = 0;
3
- /** 引用(回复)消息 */
4
- export declare const MSG_TYPE_QUOTE = 103;
5
- /**
6
- * QQ Bot 配置类型
7
- */
8
- export interface QQBotConfig {
9
- appId: string;
10
- clientSecret?: string;
11
- clientSecretFile?: string;
12
- }
13
- /**
14
- * 解析后的 QQ Bot 账户
15
- */
16
- export interface ResolvedQQBotAccount {
17
- accountId: string;
18
- name?: string;
19
- enabled: boolean;
20
- appId: string;
21
- clientSecret: string;
22
- secretSource: "config" | "file" | "env" | "none";
23
- /** 系统提示词 */
24
- systemPrompt?: string;
25
- /** 图床服务器公网地址 */
26
- imageServerBaseUrl?: string;
27
- /** 是否支持 markdown 消息(默认 true) */
28
- markdownSupport: boolean;
29
- config: QQBotAccountConfig;
30
- }
31
- /** 群消息策略:open=全响应 | allowlist=白名单 | disabled=不响应 */
32
- export type GroupPolicy = "open" | "allowlist" | "disabled";
33
- /** 工具策略:full=全部 | restricted=限制敏感工具 | none=禁止 */
34
- export type ToolPolicy = "full" | "restricted" | "none";
35
- /** 单个群的配置 */
36
- export interface GroupConfig {
37
- /** 是否需要 @机器人才响应(默认 true) */
38
- requireMention?: boolean;
39
- /**
40
- * 是否忽略 @了其他用户但没有 @机器人的消息(默认 false)。
41
- * 开启后,消息中 @了其他人但未 @bot 时直接丢弃(不记录历史、不触发 AI)。
42
- */
43
- ignoreOtherMentions?: boolean;
44
- /** 群聊中 AI 可使用的工具范围(默认 restricted) */
45
- toolPolicy?: ToolPolicy;
46
- /** 群名称 */
47
- name?: string;
48
- /** 群消息行为 PE(未配置时使用内置默认值) */
49
- prompt?: string;
50
- /** 群历史消息缓存条数(0 禁用,默认 20) */
51
- historyLimit?: number;
52
- }
53
- /**
54
- * QQ Bot 账户配置
55
- */
56
- export interface QQBotAccountConfig {
57
- enabled?: boolean;
58
- name?: string;
59
- appId?: string;
60
- clientSecret?: string;
61
- clientSecretFile?: string;
62
- dmPolicy?: "open" | "pairing" | "allowlist";
63
- allowFrom?: string[];
64
- /** 群消息策略(默认 allowlist) */
65
- groupPolicy?: GroupPolicy;
66
- /** 群白名单(groupPolicy 为 allowlist 时生效) */
67
- groupAllowFrom?: string[];
68
- /** 群配置映射(按 groupOpenid 索引,"*" 为默认) */
69
- groups?: Record<string, GroupConfig>;
70
- /** 系统提示词,会添加在用户消息前面 */
71
- systemPrompt?: string;
72
- /** 图床服务器公网地址,用于发送图片,例如 http://your-ip:18765 */
73
- imageServerBaseUrl?: string;
74
- /** 是否支持 markdown 消息(默认 true,设为 false 可禁用) */
75
- markdownSupport?: boolean;
76
- /**
77
- * @deprecated 请使用 audioFormatPolicy.uploadDirectFormats
78
- * 可直接上传的音频格式(不转换为 SILK),向后兼容
79
- */
80
- voiceDirectUploadFormats?: string[];
81
- /**
82
- * 音频格式策略配置
83
- * 统一管理入站(STT)和出站(上传)的音频格式转换行为
84
- */
85
- audioFormatPolicy?: AudioFormatPolicy;
86
- /**
87
- * 是否启用公网 URL 直传 QQ 平台(默认 true)
88
- * 启用时:公网 URL 先直传给 QQ 开放平台的富媒体 API,平台自行拉取;失败后自动 fallback 到插件下载再 Base64 上传
89
- * 禁用时:公网 URL 始终由插件先下载到本地,再以 Base64 上传(适用于 QQ 平台无法访问目标 URL 的场景)
90
- */
91
- urlDirectUpload?: boolean;
92
- /**
93
- * /bot-upgrade 指令返回的升级指引网址
94
- * 默认: https://doc.weixin.qq.com/doc/w3_AKEAGQaeACgCNHrh1CbHzTAKtT2gB?scode=AJEAIQdfAAozxFEnLZAKEAGQaeACg
95
- */
96
- upgradeUrl?: string;
97
- /**
98
- * /bot-upgrade 指令的行为模式
99
- * - "doc":展示升级文档链接(安全模式)
100
- * - "hot-reload":检测到新版本时直接执行 npm 升级脚本进行热更新(默认)
101
- */
102
- upgradeMode?: "doc" | "hot-reload";
103
- /**
104
- * /bot-upgrade 热更新时使用的 npm 包名
105
- * 支持 "scope/name"(自动补 @)或 "@scope/name" 格式
106
- * 默认: "@tencent-connect/openclaw-qqbot"
107
- * 示例: "ryantest/openclaw-qqbot"
108
- */
109
- upgradePkg?: string;
110
- /**
111
- * 出站消息合并回复(debounce)配置
112
- * 当短时间内收到多次 deliver 时,将文本合并为一条消息发送,避免消息轰炸
113
- */
114
- deliverDebounce?: DeliverDebounceConfig;
115
- /**
116
- * 是否启用流式消息(默认 false)
117
- * 启用后,AI 的回复会以流式形式逐步显示在 QQ 聊天中,
118
- * 用户可以看到文字逐字出现的打字机效果。
119
- * 设置为 true 可开启流式消息。
120
- *
121
- * 注意:仅 C2C(私聊)支持流式消息 API。
122
- */
123
- streaming?: boolean;
124
- }
125
- /**
126
- * 出站消息合并回复配置
127
- */
128
- export interface DeliverDebounceConfig {
129
- /**
130
- * 是否启用合并回复(默认 true)
131
- */
132
- enabled?: boolean;
133
- /**
134
- * 合并窗口时长(毫秒),在此时间内的连续 deliver 会被合并
135
- * 默认 1500ms
136
- */
137
- windowMs?: number;
138
- /**
139
- * 最大等待时长(毫秒),从第一条 deliver 开始计算,超过此时间强制发送
140
- * 防止持续有新 deliver 导致一直不发送
141
- * 默认 8000ms
142
- */
143
- maxWaitMs?: number;
144
- /**
145
- * 合并文本之间的分隔符
146
- * 默认 "\n\n---\n\n"
147
- */
148
- separator?: string;
149
- }
150
- /**
151
- * 音频格式策略:控制哪些格式可跳过转换
152
- */
153
- export interface AudioFormatPolicy {
154
- /**
155
- * STT 模型直接支持的音频格式(入站:跳过 SILK→WAV 转换)
156
- * 如果 STT 服务支持直接处理某些格式(如 silk/amr),可将其加入此列表
157
- * 例如: [".silk", ".amr", ".wav", ".mp3", ".ogg"]
158
- * 默认为空(所有语音都先转换为 WAV 再送 STT)
159
- */
160
- sttDirectFormats?: string[];
161
- /**
162
- * QQ 平台支持直传的音频格式(出站:跳过→SILK 转换)
163
- * 默认为 [".wav", ".mp3", ".silk"](QQ Bot API 原生支持的三种格式)
164
- * 仅当需要覆盖默认值时才配置此项
165
- */
166
- uploadDirectFormats?: string[];
167
- /**
168
- * 是否启用语音转码(默认 true)
169
- * 设为 false 可在环境无 ffmpeg 时跳过转码,直接以文件形式发送
170
- * 当禁用时,非原生格式的音频会 fallback 到 sendDocument(文件发送)
171
- */
172
- transcodeEnabled?: boolean;
173
- }
174
- /**
175
- * 富媒体附件
176
- */
177
- export interface MessageAttachment {
178
- content_type: string;
179
- filename?: string;
180
- height?: number;
181
- width?: number;
182
- size?: number;
183
- url: string;
184
- voice_wav_url?: string;
185
- asr_refer_text?: string;
186
- }
187
- /**
188
- * C2C 消息事件
189
- */
190
- export interface C2CMessageEvent {
191
- author: {
192
- id: string;
193
- union_openid: string;
194
- user_openid: string;
195
- };
196
- content: string;
197
- id: string;
198
- timestamp: string;
199
- message_scene?: {
200
- source: string;
201
- /** ext 数组,可能包含 ref_msg_idx=REFIDX_xxx(引用的消息)和 msg_idx=REFIDX_xxx(自身索引) */
202
- ext?: string[];
203
- };
204
- attachments?: MessageAttachment[];
205
- /** 消息类型,参见 MSG_TYPE_* */
206
- message_type?: number;
207
- /** 消息元素列表,引用消息时 [0] 为被引用的原始消息 */
208
- msg_elements?: MsgElement[];
209
- }
210
- /**
211
- * 频道 AT 消息事件
212
- */
213
- export interface GuildMessageEvent {
214
- id: string;
215
- channel_id: string;
216
- guild_id: string;
217
- content: string;
218
- timestamp: string;
219
- author: {
220
- id: string;
221
- username?: string;
222
- bot?: boolean;
223
- };
224
- member?: {
225
- nick?: string;
226
- joined_at?: string;
227
- };
228
- attachments?: MessageAttachment[];
229
- }
230
- /** 消息元素结点,引用消息时 msg_elements[0] 为被引用的原始消息 */
231
- export interface MsgElement {
232
- /** 消息索引标识 */
233
- msg_idx?: string;
234
- /** 消息类型,参见 MSG_TYPE_* 常量 */
235
- message_type?: number;
236
- /** 文本内容 */
237
- content?: string;
238
- /** 附件列表 */
239
- attachments?: MessageAttachment[];
240
- /** 嵌套消息元素(引用消息场景下可能存在) */
241
- msg_elements?: MsgElement[];
242
- }
243
- /**
244
- * 群聊 AT 消息事件
245
- */
246
- export interface GroupMessageEvent {
247
- author: {
248
- id: string;
249
- member_openid: string;
250
- username?: string;
251
- bot?: boolean;
252
- };
253
- content: string;
254
- id: string;
255
- timestamp: string;
256
- group_id: string;
257
- group_openid: string;
258
- message_scene?: {
259
- source: string;
260
- ext?: string[];
261
- };
262
- attachments?: MessageAttachment[];
263
- /** @提及列表 */
264
- mentions?: Array<{
265
- scope?: "all" | "single";
266
- id?: string;
267
- user_openid?: string;
268
- member_openid?: string;
269
- nickname?: string;
270
- bot?: boolean;
271
- /** 是否 @机器人自身 */
272
- is_you?: boolean;
273
- }>;
274
- /** 消息类型,参见 MSG_TYPE_* */
275
- message_type?: number;
276
- /** 消息元素列表,引用消息时 [0] 为被引用的原始消息 */
277
- msg_elements?: MsgElement[];
278
- }
279
- /**
280
- * 按钮交互事件(INTERACTION_CREATE)
281
- */
282
- export interface InteractionEvent {
283
- /** 事件 ID,用于回应交互(PUT /interactions/{id}) */
284
- id: string;
285
- /** 事件类型:11=消息按钮 12=单聊快捷菜单 */
286
- type: number;
287
- /** 场景:c2c / group / guild */
288
- scene?: string;
289
- /** 场景类型:0=频道 1=群聊 2=单聊 */
290
- chat_type?: number;
291
- /** 触发时间 RFC3339 */
292
- timestamp?: string;
293
- /** 频道 openid(仅频道场景) */
294
- guild_id?: string;
295
- /** 子频道 openid(仅频道场景) */
296
- channel_id?: string;
297
- /** 单聊用户 openid(仅 c2c 场景) */
298
- user_openid?: string;
299
- /** 群 openid(仅群聊场景) */
300
- group_openid?: string;
301
- /** 群内触发用户 openid(仅群聊场景) */
302
- group_member_openid?: string;
303
- version: number;
304
- data: {
305
- type: number;
306
- resolved: {
307
- /** 按钮 action.data 值 */
308
- button_data?: string;
309
- /** 按钮 id */
310
- button_id?: string;
311
- /** 操作用户 userid(仅频道场景) */
312
- user_id?: string;
313
- /** 自定义菜单 id(仅菜单场景) */
314
- feature_id?: string;
315
- /** 操作的消息 id(仅频道场景) */
316
- message_id?: string;
317
- /** 配置更新:群消息模式 "mention"=@机器人时激活 "always"=总是激活 */
318
- require_mention?: string;
319
- /** 配置更新:群消息策略 */
320
- group_policy?: GroupPolicy;
321
- /** 配置更新:@文本的名称提及BOT名,多个使用,分隔 */
322
- mention_patterns?: string;
323
- };
324
- };
325
- }
326
- /**
327
- * 按钮 Action 类型
328
- * 0=跳转链接 1=回调型(INTERACTION_CREATE) 2=指令型(直接发文本) 3=mqqapi
329
- */
330
- export type KeyboardActionType = 0 | 1 | 2 | 3;
331
- /** 按钮权限 */
332
- export interface KeyboardPermission {
333
- /** 0=全体 1=管理员 2=按钮指定 3=身份组 */
334
- type: 0 | 1 | 2 | 3;
335
- specify_role_ids?: string[];
336
- specify_user_ids?: string[];
337
- }
338
- /** 二次确认弹窗 */
339
- export interface KeyboardModal {
340
- content: string;
341
- confirm_text?: string;
342
- cancel_text?: string;
343
- }
344
- /** 按钮 Action */
345
- export interface KeyboardAction {
346
- type: KeyboardActionType;
347
- data?: string;
348
- /** true = 点击后直接发出(Enter)*/
349
- enter?: boolean;
350
- /** 仅指令型(type=2):是否把指令发到输入框(reply=true)还是静默发出 */
351
- reply?: boolean;
352
- permission?: KeyboardPermission;
353
- click_limit?: number;
354
- unsupport_tips?: string;
355
- modal?: KeyboardModal;
356
- }
357
- /** 按钮渲染数据 */
358
- export interface KeyboardRenderData {
359
- label: string;
360
- visited_label?: string;
361
- /** 0=灰色线框 1=蓝色线框 2=推荐回复专用 3=红色字体 4=蓝色背景 */
362
- style?: 0 | 1 | 2 | 3 | 4;
363
- }
364
- /** 单个按钮 */
365
- export interface KeyboardButton {
366
- id: string;
367
- render_data?: KeyboardRenderData;
368
- action?: KeyboardAction;
369
- group_id?: string;
370
- }
371
- /** 一行按钮 */
372
- export interface KeyboardRow {
373
- buttons: KeyboardButton[];
374
- }
375
- /** CustomKeyboard(自定义按钮内容) */
376
- export interface CustomKeyboard {
377
- rows: KeyboardRow[];
378
- }
379
- /** MessageKeyboard(keyboard / prompt_keyboard.keyboard 共用) */
380
- export interface MessageKeyboard {
381
- /** 模板 ID(与 content 二选一) */
382
- id?: string;
383
- /** 自定义内容 */
384
- content?: CustomKeyboard;
385
- }
386
- /**
387
- * Inline Keyboard(消息内嵌按钮,需平台审核)
388
- * 发送字段:keyboard
389
- * JSON: { "keyboard": { "id": "...", "content": { "rows": [...] } } }
390
- */
391
- export type InlineKeyboard = MessageKeyboard;
392
- /**
393
- * WebSocket 事件负载
394
- */
395
- export interface WSPayload {
396
- op: number;
397
- d?: unknown;
398
- s?: number;
399
- t?: string;
400
- }
401
- /** 流式消息输入模式 */
402
- export declare const StreamInputMode: {
403
- /** 每次发送的 content_raw 替换整条消息内容 */
404
- readonly REPLACE: "replace";
405
- };
406
- export type StreamInputMode = (typeof StreamInputMode)[keyof typeof StreamInputMode];
407
- /** 流式消息输入状态 */
408
- export declare const StreamInputState: {
409
- /** 正文生成中 */
410
- readonly GENERATING: 1;
411
- /** 正文生成结束(终结状态) */
412
- readonly DONE: 10;
413
- };
414
- export type StreamInputState = (typeof StreamInputState)[keyof typeof StreamInputState];
415
- /** 流式消息内容类型 */
416
- export declare const StreamContentType: {
417
- readonly MARKDOWN: "markdown";
418
- };
419
- export type StreamContentType = (typeof StreamContentType)[keyof typeof StreamContentType];
420
- /**
421
- * 流式消息请求体
422
- * 对应 StreamReq proto
423
- */
424
- export interface StreamMessageRequest {
425
- /** 输入模式 */
426
- input_mode: StreamInputMode;
427
- /** 输入状态 */
428
- input_state: StreamInputState;
429
- /** 内容类型 */
430
- content_type: StreamContentType;
431
- /** markdown 内容 */
432
- content_raw: string;
433
- /** 事件 ID */
434
- event_id: string;
435
- /** 原始消息 ID */
436
- msg_id: string;
437
- /** 流式消息 ID,首次发送后返回,后续分片需携带 */
438
- stream_msg_id?: string;
439
- /** 递增序号 */
440
- msg_seq: number;
441
- /** 同一条流式会话内的发送索引,从 0 开始,每次发送前递增;新流式会话重新从 0 开始 */
442
- index: number;
443
- }
package/dist/src/types.js DELETED
@@ -1,22 +0,0 @@
1
- // ── QQ 消息类型常量(message_type 枚举值) ──
2
- /** 普通文本消息 */
3
- export const MSG_TYPE_TEXT = 0;
4
- /** 引用(回复)消息 */
5
- export const MSG_TYPE_QUOTE = 103;
6
- // ---- 流式消息常量 ----
7
- /** 流式消息输入模式 */
8
- export const StreamInputMode = {
9
- /** 每次发送的 content_raw 替换整条消息内容 */
10
- REPLACE: "replace",
11
- };
12
- /** 流式消息输入状态 */
13
- export const StreamInputState = {
14
- /** 正文生成中 */
15
- GENERATING: 1,
16
- /** 正文生成结束(终结状态) */
17
- DONE: 10,
18
- };
19
- /** 流式消息内容类型 */
20
- export const StreamContentType = {
21
- MARKDOWN: "markdown",
22
- };
@@ -1,27 +0,0 @@
1
- /**
2
- * 输入状态自动续期
3
- * 在消息处理期间定时续发 "正在输入" 状态通知,确保用户持续看到 bot 在处理中。
4
- * 仅 C2C 私聊有效(QQ 群聊 API 不支持输入状态通知)。
5
- */
6
- export declare const TYPING_INTERVAL_MS = 50000;
7
- export declare const TYPING_INPUT_SECOND = 60;
8
- export declare class TypingKeepAlive {
9
- private readonly getToken;
10
- private readonly clearCache;
11
- private readonly openid;
12
- private readonly msgId;
13
- private readonly log?;
14
- private readonly logPrefix;
15
- private timer;
16
- private stopped;
17
- constructor(getToken: () => Promise<string>, clearCache: () => void, openid: string, msgId: string | undefined, log?: {
18
- info: (msg: string) => void;
19
- error: (msg: string) => void;
20
- debug?: (msg: string) => void;
21
- } | undefined, logPrefix?: string);
22
- /** 启动定时续期(首次发送由调用方自行处理,这里只负责后续续期) */
23
- start(): void;
24
- /** 停止续期 */
25
- stop(): void;
26
- private send;
27
- }
@@ -1,64 +0,0 @@
1
- /**
2
- * 输入状态自动续期
3
- * 在消息处理期间定时续发 "正在输入" 状态通知,确保用户持续看到 bot 在处理中。
4
- * 仅 C2C 私聊有效(QQ 群聊 API 不支持输入状态通知)。
5
- */
6
- import { sendC2CInputNotify } from "./api.js";
7
- // 每 50 秒续发一次(QQ API input_second=60,留 10s 余量)
8
- export const TYPING_INTERVAL_MS = 50_000;
9
- export const TYPING_INPUT_SECOND = 60;
10
- export class TypingKeepAlive {
11
- getToken;
12
- clearCache;
13
- openid;
14
- msgId;
15
- log;
16
- logPrefix;
17
- timer = null;
18
- stopped = false;
19
- constructor(getToken, clearCache, openid, msgId, log, logPrefix = "[qqbot]") {
20
- this.getToken = getToken;
21
- this.clearCache = clearCache;
22
- this.openid = openid;
23
- this.msgId = msgId;
24
- this.log = log;
25
- this.logPrefix = logPrefix;
26
- }
27
- /** 启动定时续期(首次发送由调用方自行处理,这里只负责后续续期) */
28
- start() {
29
- if (this.stopped)
30
- return;
31
- this.timer = setInterval(() => {
32
- if (this.stopped) {
33
- this.stop();
34
- return;
35
- }
36
- this.send().catch(() => { });
37
- }, TYPING_INTERVAL_MS);
38
- }
39
- /** 停止续期 */
40
- stop() {
41
- this.stopped = true;
42
- if (this.timer) {
43
- clearInterval(this.timer);
44
- this.timer = null;
45
- }
46
- }
47
- async send() {
48
- try {
49
- const token = await this.getToken();
50
- await sendC2CInputNotify(token, this.openid, this.msgId, TYPING_INPUT_SECOND);
51
- this.log?.debug?.(`${this.logPrefix} Typing keep-alive sent to ${this.openid}`);
52
- }
53
- catch (err) {
54
- try {
55
- this.clearCache();
56
- const token = await this.getToken();
57
- await sendC2CInputNotify(token, this.openid, this.msgId, TYPING_INPUT_SECOND);
58
- }
59
- catch {
60
- this.log?.debug?.(`${this.logPrefix} Typing keep-alive failed for ${this.openid}: ${err}`);
61
- }
62
- }
63
- }
64
- }
@@ -1,36 +0,0 @@
1
- /**
2
- * 版本检查器
3
- *
4
- * - triggerUpdateCheck(): gateway 启动时调用,后台预热缓存
5
- * - getUpdateInfo(): 每次实时查询 npm registry,返回最新结果
6
- *
7
- * 使用 HTTPS 直接请求 npm registry API(不依赖 npm CLI),
8
- * 支持多 registry fallback:npmjs.org → npmmirror.com,解决国内网络问题。
9
- */
10
- export interface UpdateInfo {
11
- current: string;
12
- /** 最佳升级目标(prerelease 用户优先 alpha,稳定版用户取 latest) */
13
- latest: string | null;
14
- /** 稳定版 dist-tag */
15
- stable: string | null;
16
- /** alpha dist-tag */
17
- alpha: string | null;
18
- hasUpdate: boolean;
19
- checkedAt: number;
20
- error?: string;
21
- }
22
- /** gateway 启动时调用,保存 log 引用 */
23
- export declare function triggerUpdateCheck(log?: {
24
- info: (msg: string) => void;
25
- error: (msg: string) => void;
26
- debug?: (msg: string) => void;
27
- }): void;
28
- /** 每次实时查询 npm registry */
29
- export declare function getUpdateInfo(): Promise<UpdateInfo>;
30
- /**
31
- * 检查指定版本是否存在于 npm registry
32
- * 用于 /bot-upgrade --version 的前置校验
33
- * @param version 要检查的版本号
34
- * @param pkgName 可选的包名(如 "@ryantest/openclaw-qqbot"),默认使用内置包名
35
- */
36
- export declare function checkVersionExists(version: string, pkgName?: string): Promise<boolean>;