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