@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,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>;