@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,171 +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
- import { createRequire } from "node:module";
11
- import https from "node:https";
12
- import { getPackageVersion } from "./utils/pkg-version.js";
13
- const require = createRequire(import.meta.url);
14
- const PKG_NAME = "@tencent-connect/openclaw-qqbot";
15
- const ENCODED_PKG = encodeURIComponent(PKG_NAME);
16
- const REGISTRIES = [
17
- `https://registry.npmjs.org/${ENCODED_PKG}`,
18
- `https://registry.npmmirror.com/${ENCODED_PKG}`,
19
- ];
20
- let CURRENT_VERSION = getPackageVersion(import.meta.url);
21
- let _log;
22
- function fetchJson(url, timeoutMs) {
23
- return new Promise((resolve, reject) => {
24
- const req = https.get(url, { timeout: timeoutMs, headers: { Accept: "application/json" } }, (res) => {
25
- if (res.statusCode !== 200) {
26
- res.resume();
27
- reject(new Error(`HTTP ${res.statusCode} from ${url}`));
28
- return;
29
- }
30
- let data = "";
31
- res.on("data", (chunk) => { data += chunk; });
32
- res.on("end", () => {
33
- try {
34
- resolve(JSON.parse(data));
35
- }
36
- catch (e) {
37
- reject(e);
38
- }
39
- });
40
- });
41
- req.on("error", reject);
42
- req.on("timeout", () => { req.destroy(); reject(new Error(`timeout fetching ${url}`)); });
43
- });
44
- }
45
- async function fetchDistTags() {
46
- for (const url of REGISTRIES) {
47
- try {
48
- const json = await fetchJson(url, 10_000);
49
- const tags = json["dist-tags"];
50
- if (tags && typeof tags === "object")
51
- return tags;
52
- }
53
- catch (e) {
54
- _log?.debug?.(`[qqbot:update-checker] ${url} failed: ${e.message}`);
55
- }
56
- }
57
- throw new Error("all registries failed");
58
- }
59
- function buildUpdateInfo(tags) {
60
- const currentIsPrerelease = CURRENT_VERSION.includes("-");
61
- const stableTag = tags.latest || null;
62
- const alphaTag = tags.alpha || null;
63
- // 严格隔离:alpha 只跟 alpha 比,正式版只跟正式版比,不交叉
64
- const compareTarget = currentIsPrerelease ? alphaTag : stableTag;
65
- const hasUpdate = typeof compareTarget === "string"
66
- && compareTarget !== CURRENT_VERSION
67
- && compareVersions(compareTarget, CURRENT_VERSION) > 0;
68
- return {
69
- current: CURRENT_VERSION,
70
- latest: compareTarget,
71
- stable: stableTag,
72
- alpha: alphaTag,
73
- hasUpdate,
74
- checkedAt: Date.now(),
75
- };
76
- }
77
- /** gateway 启动时调用,保存 log 引用 */
78
- export function triggerUpdateCheck(log) {
79
- if (log)
80
- _log = log;
81
- // 预热:fire-and-forget
82
- getUpdateInfo().then((info) => {
83
- if (info.hasUpdate) {
84
- _log?.info?.(`[qqbot:update-checker] new version available: ${info.latest} (current: ${CURRENT_VERSION})`);
85
- }
86
- }).catch(() => { });
87
- }
88
- /** 每次实时查询 npm registry */
89
- export async function getUpdateInfo() {
90
- try {
91
- const tags = await fetchDistTags();
92
- return buildUpdateInfo(tags);
93
- }
94
- catch (err) {
95
- _log?.debug?.(`[qqbot:update-checker] check failed: ${err.message}`);
96
- return { current: CURRENT_VERSION, latest: null, stable: null, alpha: null, hasUpdate: false, checkedAt: Date.now(), error: err.message };
97
- }
98
- }
99
- /**
100
- * 检查指定版本是否存在于 npm registry
101
- * 用于 /bot-upgrade --version 的前置校验
102
- * @param version 要检查的版本号
103
- * @param pkgName 可选的包名(如 "@ryantest/openclaw-qqbot"),默认使用内置包名
104
- */
105
- export async function checkVersionExists(version, pkgName) {
106
- const registries = pkgName ? buildRegistries(pkgName) : REGISTRIES;
107
- for (const baseUrl of registries) {
108
- try {
109
- const url = `${baseUrl}/${version}`;
110
- const json = await fetchJson(url, 10_000);
111
- if (json && json.version === version)
112
- return true;
113
- }
114
- catch {
115
- // try next registry
116
- }
117
- }
118
- return false;
119
- }
120
- /** 根据自定义包名构建 registry URL 列表 */
121
- function buildRegistries(pkgName) {
122
- const encoded = encodeURIComponent(pkgName);
123
- return [
124
- `https://registry.npmjs.org/${encoded}`,
125
- `https://registry.npmmirror.com/${encoded}`,
126
- ];
127
- }
128
- function compareVersions(a, b) {
129
- const parse = (v) => {
130
- const clean = v.replace(/^v/, "");
131
- const [main, pre] = clean.split("-", 2);
132
- return { parts: main.split(".").map(Number), pre: pre || null };
133
- };
134
- const pa = parse(a);
135
- const pb = parse(b);
136
- // 先比主版本号
137
- for (let i = 0; i < 3; i++) {
138
- const diff = (pa.parts[i] || 0) - (pb.parts[i] || 0);
139
- if (diff !== 0)
140
- return diff;
141
- }
142
- // 主版本号相同:正式版 > prerelease
143
- if (!pa.pre && pb.pre)
144
- return 1;
145
- if (pa.pre && !pb.pre)
146
- return -1;
147
- if (!pa.pre && !pb.pre)
148
- return 0;
149
- // 都是 prerelease:按段逐一比较(alpha.1 vs alpha.2)
150
- const aParts = pa.pre.split(".");
151
- const bParts = pb.pre.split(".");
152
- for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
153
- const aP = aParts[i] ?? "";
154
- const bP = bParts[i] ?? "";
155
- const aNum = Number(aP);
156
- const bNum = Number(bP);
157
- // 都是数字则按数字比较
158
- if (!isNaN(aNum) && !isNaN(bNum)) {
159
- if (aNum !== bNum)
160
- return aNum - bNum;
161
- }
162
- else {
163
- // 字符串比较
164
- if (aP < bP)
165
- return -1;
166
- if (aP > bP)
167
- return 1;
168
- }
169
- }
170
- return 0;
171
- }
@@ -1,98 +0,0 @@
1
- /**
2
- * 将 SILK/AMR 语音文件转换为 WAV 格式
3
- *
4
- * @param inputPath 输入文件路径(.amr / .silk / .slk)
5
- * @param outputDir 输出目录(默认与输入文件同目录)
6
- * @returns 转换后的 WAV 文件路径,失败返回 null
7
- */
8
- export declare function convertSilkToWav(inputPath: string, outputDir?: string): Promise<{
9
- wavPath: string;
10
- duration: number;
11
- } | null>;
12
- /**
13
- * 判断是否为语音附件(根据 content_type 或文件扩展名)
14
- */
15
- export declare function isVoiceAttachment(att: {
16
- content_type?: string;
17
- filename?: string;
18
- }): boolean;
19
- /**
20
- * 格式化语音时长为可读字符串
21
- */
22
- export declare function formatDuration(durationMs: number): string;
23
- export declare function isAudioFile(filePath: string, mimeType?: string): boolean;
24
- /**
25
- * 判断语音是否需要转码(参考企微 wecom-app 的 shouldTranscodeWecomVoice)
26
- *
27
- * QQ Bot API 原生支持 WAV/MP3/SILK 三种格式,其他格式需要先转码。
28
- * 使用 MIME + 扩展名双重判断,避免仅靠扩展名导致误判。
29
- *
30
- * @param filePath 音频文件路径
31
- * @param mimeType 可选的 MIME 类型
32
- * @returns true 表示需要转码,false 表示可以直传
33
- */
34
- export declare function shouldTranscodeVoice(filePath: string, mimeType?: string): boolean;
35
- export interface TTSConfig {
36
- baseUrl: string;
37
- apiKey: string;
38
- model: string;
39
- voice: string;
40
- /** Azure OpenAI 风格:使用 api-key header 而非 Bearer token */
41
- authStyle?: "bearer" | "api-key";
42
- /** 附加在 URL 后的查询参数,如 Azure 的 api-version */
43
- queryParams?: Record<string, string>;
44
- /** 自定义速度(默认不传) */
45
- speed?: number;
46
- }
47
- export declare function resolveTTSConfig(cfg: Record<string, unknown>): TTSConfig | null;
48
- export declare function textToSpeechPCM(text: string, ttsCfg: TTSConfig): Promise<{
49
- pcmBuffer: Buffer;
50
- sampleRate: number;
51
- }>;
52
- export declare function pcmToSilk(pcmBuffer: Buffer, sampleRate: number): Promise<{
53
- silkBuffer: Buffer;
54
- duration: number;
55
- }>;
56
- export declare function textToSilk(text: string, ttsCfg: TTSConfig, outputDir: string): Promise<{
57
- silkPath: string;
58
- silkBase64: string;
59
- duration: number;
60
- }>;
61
- /**
62
- * 将本地音频文件转换为 QQ Bot 可上传的 Base64
63
- *
64
- * QQ Bot API 支持直传 WAV、MP3、SILK 三种格式,其他格式仍需转换。
65
- * 转换策略:
66
- *
67
- * 1. WAV / MP3 / SILK → 直传(跳过转换)
68
- * 2. 有 ffmpeg → ffmpeg 万能解码为 PCM → silk-wasm 编码
69
- * 支持: ogg, opus, aac, flac, wma, m4a, pcm 等所有 ffmpeg 支持的格式
70
- * 3. 无 ffmpeg → WASM fallback(仅支持 pcm, wav)
71
- *
72
- * @param directUploadFormats - 自定义直传格式列表,覆盖默认值。传 undefined 使用 QQ_NATIVE_UPLOAD_FORMATS
73
- */
74
- export declare function audioFileToSilkBase64(filePath: string, directUploadFormats?: string[]): Promise<string | null>;
75
- /**
76
- * 将音频文件转码为 SILK,**输出到临时文件**(供分片上传使用)。
77
- *
78
- * 如果文件已经是 QQ 原生格式(WAV/MP3/SILK)或已经是 SILK 编码,
79
- * 则直接返回原文件路径(不需要转码)。
80
- *
81
- * @returns 转码后的文件路径,或 null 表示转码失败
82
- */
83
- export declare function audioFileToSilkFile(filePath: string, directUploadFormats?: string[]): Promise<string | null>;
84
- /**
85
- * 等待文件就绪(轮询直到文件出现且大小稳定)
86
- * 用于 TTS 生成后等待文件写入完成
87
- *
88
- * 优化策略:
89
- * - 文件出现后如果持续 0 字节超过 emptyGiveUpMs(默认 10s),快速失败
90
- * - 文件未出现超过 noFileGiveUpMs(默认 15s),快速失败
91
- * - 整体超时 timeoutMs 作为最终兜底
92
- *
93
- * @param filePath 文件路径
94
- * @param timeoutMs 最大等待时间(默认 30 秒)
95
- * @param pollMs 轮询间隔(默认 500ms)
96
- * @returns 文件大小(字节),超时或文件始终为空返回 0
97
- */
98
- export declare function waitForFile(filePath: string, timeoutMs?: number, pollMs?: number): Promise<number>;