@teammy/server 0.1.4 → 0.1.6

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 (585) hide show
  1. package/dist/main.js +11646 -7952
  2. package/dist/native-pi-entry.js +14 -1
  3. package/dist/project-pi-entry.js +46 -8
  4. package/dist/runtime/workflows/task-bootstrap/prompt.md +2 -0
  5. package/dist/web/assets/{Assistant-B3h2yQF3.css → Assistant-4yZWjYm-.css} +1 -1
  6. package/dist/web/assets/Assistant-BNVXOHQZ.js +1 -0
  7. package/dist/web/assets/Dashboard-zKTK6EZD.js +1 -0
  8. package/dist/web/assets/Files-DI98WkdW.js +1 -0
  9. package/dist/web/assets/{Markdown-Bq8P_NBV.js → Markdown-D3cU0ani.js} +4 -4
  10. package/dist/web/assets/Materials-CK-mbNmo.css +1 -0
  11. package/dist/web/assets/Materials-CWptgAHz.js +6 -0
  12. package/dist/web/assets/Sessions-DiDwqXLI.js +1 -0
  13. package/dist/web/assets/WorkspaceTree-DeAA1QtV.js +1 -0
  14. package/dist/web/assets/{file-links-CFCIacLV.js → file-links-GfCXWkEh.js} +1 -1
  15. package/dist/web/assets/index-BwEl1PIa.js +66 -0
  16. package/dist/web/assets/{index-B-MqU_88.css → index-CTIAGUGG.css} +1 -1
  17. package/dist/web/downloads/teammy-skill.zip +0 -0
  18. package/dist/web/index.html +2 -2
  19. package/node_modules/@isaacs/nonrecursive-glob-match/LICENSE.md +55 -0
  20. package/node_modules/@isaacs/nonrecursive-glob-match/README.md +333 -0
  21. package/node_modules/@isaacs/nonrecursive-glob-match/dist/commonjs/index.d.ts +114 -0
  22. package/node_modules/@isaacs/nonrecursive-glob-match/dist/commonjs/index.d.ts.map +1 -0
  23. package/node_modules/@isaacs/nonrecursive-glob-match/dist/commonjs/index.js +762 -0
  24. package/node_modules/@isaacs/nonrecursive-glob-match/dist/commonjs/index.js.map +1 -0
  25. package/node_modules/@isaacs/nonrecursive-glob-match/dist/commonjs/index.min.js +3 -0
  26. package/node_modules/@isaacs/nonrecursive-glob-match/dist/commonjs/index.min.js.map +7 -0
  27. package/node_modules/@isaacs/nonrecursive-glob-match/dist/commonjs/package.json +3 -0
  28. package/node_modules/@isaacs/nonrecursive-glob-match/dist/commonjs/parse-class.d.ts +4 -0
  29. package/node_modules/@isaacs/nonrecursive-glob-match/dist/commonjs/parse-class.d.ts.map +1 -0
  30. package/node_modules/@isaacs/nonrecursive-glob-match/dist/commonjs/parse-class.js +142 -0
  31. package/node_modules/@isaacs/nonrecursive-glob-match/dist/commonjs/parse-class.js.map +1 -0
  32. package/node_modules/@isaacs/nonrecursive-glob-match/dist/esm/index.d.ts +114 -0
  33. package/node_modules/@isaacs/nonrecursive-glob-match/dist/esm/index.d.ts.map +1 -0
  34. package/node_modules/@isaacs/nonrecursive-glob-match/dist/esm/index.js +758 -0
  35. package/node_modules/@isaacs/nonrecursive-glob-match/dist/esm/index.js.map +1 -0
  36. package/node_modules/@isaacs/nonrecursive-glob-match/dist/esm/index.min.js +3 -0
  37. package/node_modules/@isaacs/nonrecursive-glob-match/dist/esm/index.min.js.map +7 -0
  38. package/node_modules/@isaacs/nonrecursive-glob-match/dist/esm/package.json +3 -0
  39. package/node_modules/@isaacs/nonrecursive-glob-match/dist/esm/parse-class.d.ts +4 -0
  40. package/node_modules/@isaacs/nonrecursive-glob-match/dist/esm/parse-class.d.ts.map +1 -0
  41. package/node_modules/@isaacs/nonrecursive-glob-match/dist/esm/parse-class.js +138 -0
  42. package/node_modules/@isaacs/nonrecursive-glob-match/dist/esm/parse-class.js.map +1 -0
  43. package/node_modules/@isaacs/nonrecursive-glob-match/package.json +56 -0
  44. package/node_modules/@isaacs/nonrecursive-glob-match/src/index.ts +900 -0
  45. package/node_modules/@isaacs/nonrecursive-glob-match/src/parse-class.ts +158 -0
  46. package/node_modules/@wecom/aibot-node-sdk/README.md +786 -0
  47. package/node_modules/@wecom/aibot-node-sdk/dist/api.d.ts +17 -0
  48. package/node_modules/@wecom/aibot-node-sdk/dist/client.d.ts +217 -0
  49. package/node_modules/@wecom/aibot-node-sdk/dist/crypto.d.ts +12 -0
  50. package/node_modules/@wecom/aibot-node-sdk/dist/index.cjs.js +1563 -0
  51. package/node_modules/@wecom/aibot-node-sdk/dist/index.cjs.js.map +1 -0
  52. package/node_modules/@wecom/aibot-node-sdk/dist/index.d.ts +1324 -0
  53. package/node_modules/@wecom/aibot-node-sdk/dist/index.esm.js +1544 -0
  54. package/node_modules/@wecom/aibot-node-sdk/dist/index.esm.js.map +1 -0
  55. package/node_modules/@wecom/aibot-node-sdk/dist/logger.d.ts +14 -0
  56. package/node_modules/@wecom/aibot-node-sdk/dist/message-handler.d.ts +29 -0
  57. package/node_modules/@wecom/aibot-node-sdk/dist/types/api.d.ts +466 -0
  58. package/node_modules/@wecom/aibot-node-sdk/dist/types/common.d.ts +30 -0
  59. package/node_modules/@wecom/aibot-node-sdk/dist/types/config.d.ts +34 -0
  60. package/node_modules/@wecom/aibot-node-sdk/dist/types/event.d.ts +109 -0
  61. package/node_modules/@wecom/aibot-node-sdk/dist/types/index.d.ts +10 -0
  62. package/node_modules/@wecom/aibot-node-sdk/dist/types/message.d.ts +158 -0
  63. package/node_modules/@wecom/aibot-node-sdk/dist/utils.d.ts +19 -0
  64. package/node_modules/@wecom/aibot-node-sdk/dist/wecom-crypto/index.d.ts +46 -0
  65. package/node_modules/@wecom/aibot-node-sdk/dist/ws.d.ts +161 -0
  66. package/node_modules/@wecom/aibot-node-sdk/package.json +43 -0
  67. package/node_modules/asynckit/LICENSE +21 -0
  68. package/node_modules/asynckit/README.md +233 -0
  69. package/node_modules/asynckit/bench.js +76 -0
  70. package/node_modules/asynckit/index.js +6 -0
  71. package/node_modules/asynckit/lib/abort.js +29 -0
  72. package/node_modules/asynckit/lib/async.js +34 -0
  73. package/node_modules/asynckit/lib/defer.js +26 -0
  74. package/node_modules/asynckit/lib/iterate.js +75 -0
  75. package/node_modules/asynckit/lib/readable_asynckit.js +91 -0
  76. package/node_modules/asynckit/lib/readable_parallel.js +25 -0
  77. package/node_modules/asynckit/lib/readable_serial.js +25 -0
  78. package/node_modules/asynckit/lib/readable_serial_ordered.js +29 -0
  79. package/node_modules/asynckit/lib/state.js +37 -0
  80. package/node_modules/asynckit/lib/streamify.js +141 -0
  81. package/node_modules/asynckit/lib/terminator.js +29 -0
  82. package/node_modules/asynckit/package.json +63 -0
  83. package/node_modules/asynckit/parallel.js +43 -0
  84. package/node_modules/asynckit/serial.js +17 -0
  85. package/node_modules/asynckit/serialOrdered.js +75 -0
  86. package/node_modules/asynckit/stream.js +21 -0
  87. package/node_modules/axios/CHANGELOG.md +1934 -0
  88. package/node_modules/axios/LICENSE +7 -0
  89. package/node_modules/axios/MIGRATION_GUIDE.md +877 -0
  90. package/node_modules/axios/README.md +2786 -0
  91. package/node_modules/axios/dist/axios.js +6460 -0
  92. package/node_modules/axios/dist/axios.min.js +5 -0
  93. package/node_modules/axios/dist/axios.min.js.map +1 -0
  94. package/node_modules/axios/dist/browser/axios.cjs +6509 -0
  95. package/node_modules/axios/dist/esm/axios.js +6530 -0
  96. package/node_modules/axios/dist/esm/axios.min.js +3 -0
  97. package/node_modules/axios/dist/esm/axios.min.js.map +1 -0
  98. package/node_modules/axios/dist/node/axios.cjs +7491 -0
  99. package/node_modules/axios/index.d.cts +785 -0
  100. package/node_modules/axios/index.d.ts +804 -0
  101. package/node_modules/axios/index.js +45 -0
  102. package/node_modules/axios/lib/adapters/README.md +36 -0
  103. package/node_modules/axios/lib/adapters/adapters.js +132 -0
  104. package/node_modules/axios/lib/adapters/fetch.js +749 -0
  105. package/node_modules/axios/lib/adapters/http.js +1609 -0
  106. package/node_modules/axios/lib/adapters/xhr.js +384 -0
  107. package/node_modules/axios/lib/axios.js +89 -0
  108. package/node_modules/axios/lib/cancel/CancelToken.js +135 -0
  109. package/node_modules/axios/lib/cancel/CanceledError.js +22 -0
  110. package/node_modules/axios/lib/cancel/isCancel.js +5 -0
  111. package/node_modules/axios/lib/core/Axios.js +361 -0
  112. package/node_modules/axios/lib/core/AxiosError.js +278 -0
  113. package/node_modules/axios/lib/core/AxiosHeaders.js +487 -0
  114. package/node_modules/axios/lib/core/InterceptorManager.js +182 -0
  115. package/node_modules/axios/lib/core/README.md +8 -0
  116. package/node_modules/axios/lib/core/assertParamsAcyclic.js +49 -0
  117. package/node_modules/axios/lib/core/buildFullPath.js +76 -0
  118. package/node_modules/axios/lib/core/createMultipartBody.js +37 -0
  119. package/node_modules/axios/lib/core/dispatchRequest.js +115 -0
  120. package/node_modules/axios/lib/core/mergeConfig.js +237 -0
  121. package/node_modules/axios/lib/core/methodList.js +17 -0
  122. package/node_modules/axios/lib/core/setFormDataHeaders.js +27 -0
  123. package/node_modules/axios/lib/core/settle.js +27 -0
  124. package/node_modules/axios/lib/core/transformData.js +28 -0
  125. package/node_modules/axios/lib/defaults/index.js +178 -0
  126. package/node_modules/axios/lib/defaults/transitional.js +11 -0
  127. package/node_modules/axios/lib/env/README.md +3 -0
  128. package/node_modules/axios/lib/env/classes/FormData.js +2 -0
  129. package/node_modules/axios/lib/env/data.js +1 -0
  130. package/node_modules/axios/lib/helpers/AxiosTransformStream.js +165 -0
  131. package/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +59 -0
  132. package/node_modules/axios/lib/helpers/Http2Sessions.js +122 -0
  133. package/node_modules/axios/lib/helpers/HttpStatusCode.js +88 -0
  134. package/node_modules/axios/lib/helpers/README.md +7 -0
  135. package/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js +29 -0
  136. package/node_modules/axios/lib/helpers/bind.js +14 -0
  137. package/node_modules/axios/lib/helpers/buildURL.js +69 -0
  138. package/node_modules/axios/lib/helpers/callbackify.js +18 -0
  139. package/node_modules/axios/lib/helpers/combineURLs.js +23 -0
  140. package/node_modules/axios/lib/helpers/composeSignals.js +71 -0
  141. package/node_modules/axios/lib/helpers/cookies.js +88 -0
  142. package/node_modules/axios/lib/helpers/deprecatedMethod.js +31 -0
  143. package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +193 -0
  144. package/node_modules/axios/lib/helpers/formDataToBlob.js +113 -0
  145. package/node_modules/axios/lib/helpers/formDataToJSON.js +149 -0
  146. package/node_modules/axios/lib/helpers/formDataToStream.js +119 -0
  147. package/node_modules/axios/lib/helpers/fromDataURI.js +75 -0
  148. package/node_modules/axios/lib/helpers/isAbsoluteURL.js +19 -0
  149. package/node_modules/axios/lib/helpers/isAxiosError.js +14 -0
  150. package/node_modules/axios/lib/helpers/isURLSameOrigin.js +11 -0
  151. package/node_modules/axios/lib/helpers/normalizeURLForProtocolCheck.js +24 -0
  152. package/node_modules/axios/lib/helpers/null.js +2 -0
  153. package/node_modules/axios/lib/helpers/parseHeaders.js +72 -0
  154. package/node_modules/axios/lib/helpers/parseProtocol.js +6 -0
  155. package/node_modules/axios/lib/helpers/progressEventReducer.js +54 -0
  156. package/node_modules/axios/lib/helpers/readBlob.js +15 -0
  157. package/node_modules/axios/lib/helpers/resolveConfig.js +120 -0
  158. package/node_modules/axios/lib/helpers/sanitizeHeaderValue.js +60 -0
  159. package/node_modules/axios/lib/helpers/shouldBypassProxy.js +520 -0
  160. package/node_modules/axios/lib/helpers/speedometer.js +55 -0
  161. package/node_modules/axios/lib/helpers/spread.js +28 -0
  162. package/node_modules/axios/lib/helpers/throttle.js +45 -0
  163. package/node_modules/axios/lib/helpers/toFormData.js +279 -0
  164. package/node_modules/axios/lib/helpers/toURLEncodedForm.js +19 -0
  165. package/node_modules/axios/lib/helpers/trackStream.js +89 -0
  166. package/node_modules/axios/lib/helpers/validator.js +112 -0
  167. package/node_modules/axios/lib/platform/browser/classes/Blob.js +3 -0
  168. package/node_modules/axios/lib/platform/browser/classes/FormData.js +3 -0
  169. package/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js +4 -0
  170. package/node_modules/axios/lib/platform/browser/index.js +13 -0
  171. package/node_modules/axios/lib/platform/common/utils.js +52 -0
  172. package/node_modules/axios/lib/platform/index.js +7 -0
  173. package/node_modules/axios/lib/platform/node/classes/Buffer.js +11 -0
  174. package/node_modules/axios/lib/platform/node/classes/FormData.js +3 -0
  175. package/node_modules/axios/lib/platform/node/classes/URLSearchParams.js +4 -0
  176. package/node_modules/axios/lib/platform/node/index.js +37 -0
  177. package/node_modules/axios/lib/utils.js +1201 -0
  178. package/node_modules/axios/node_modules/agent-base/README.md +145 -0
  179. package/node_modules/axios/node_modules/agent-base/dist/src/index.d.ts +78 -0
  180. package/node_modules/axios/node_modules/agent-base/dist/src/index.js +203 -0
  181. package/node_modules/axios/node_modules/agent-base/dist/src/index.js.map +1 -0
  182. package/node_modules/axios/node_modules/agent-base/dist/src/promisify.d.ts +4 -0
  183. package/node_modules/axios/node_modules/agent-base/dist/src/promisify.js +18 -0
  184. package/node_modules/axios/node_modules/agent-base/dist/src/promisify.js.map +1 -0
  185. package/node_modules/axios/node_modules/agent-base/package.json +64 -0
  186. package/node_modules/axios/node_modules/agent-base/src/index.ts +345 -0
  187. package/node_modules/axios/node_modules/agent-base/src/promisify.ts +33 -0
  188. package/node_modules/axios/node_modules/https-proxy-agent/README.md +137 -0
  189. package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.d.ts +30 -0
  190. package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.js +177 -0
  191. package/node_modules/axios/node_modules/https-proxy-agent/dist/agent.js.map +1 -0
  192. package/node_modules/axios/node_modules/https-proxy-agent/dist/index.d.ts +23 -0
  193. package/node_modules/axios/node_modules/https-proxy-agent/dist/index.js +14 -0
  194. package/node_modules/axios/node_modules/https-proxy-agent/dist/index.js.map +1 -0
  195. package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +7 -0
  196. package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.js +66 -0
  197. package/node_modules/axios/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map +1 -0
  198. package/node_modules/axios/node_modules/https-proxy-agent/package.json +56 -0
  199. package/node_modules/axios/package.json +202 -0
  200. package/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
  201. package/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
  202. package/node_modules/call-bind-apply-helpers/.nycrc +9 -0
  203. package/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
  204. package/node_modules/call-bind-apply-helpers/LICENSE +21 -0
  205. package/node_modules/call-bind-apply-helpers/README.md +62 -0
  206. package/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
  207. package/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
  208. package/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
  209. package/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
  210. package/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
  211. package/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
  212. package/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
  213. package/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
  214. package/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
  215. package/node_modules/call-bind-apply-helpers/index.js +15 -0
  216. package/node_modules/call-bind-apply-helpers/package.json +85 -0
  217. package/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
  218. package/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
  219. package/node_modules/call-bind-apply-helpers/test/index.js +63 -0
  220. package/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
  221. package/node_modules/combined-stream/License +19 -0
  222. package/node_modules/combined-stream/Readme.md +138 -0
  223. package/node_modules/combined-stream/lib/combined_stream.js +208 -0
  224. package/node_modules/combined-stream/package.json +25 -0
  225. package/node_modules/delayed-stream/.npmignore +1 -0
  226. package/node_modules/delayed-stream/License +19 -0
  227. package/node_modules/delayed-stream/Makefile +7 -0
  228. package/node_modules/delayed-stream/Readme.md +141 -0
  229. package/node_modules/delayed-stream/lib/delayed_stream.js +107 -0
  230. package/node_modules/delayed-stream/package.json +27 -0
  231. package/node_modules/dunder-proto/.eslintrc +5 -0
  232. package/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
  233. package/node_modules/dunder-proto/.nycrc +13 -0
  234. package/node_modules/dunder-proto/CHANGELOG.md +24 -0
  235. package/node_modules/dunder-proto/LICENSE +21 -0
  236. package/node_modules/dunder-proto/README.md +54 -0
  237. package/node_modules/dunder-proto/get.d.ts +5 -0
  238. package/node_modules/dunder-proto/get.js +30 -0
  239. package/node_modules/dunder-proto/package.json +76 -0
  240. package/node_modules/dunder-proto/set.d.ts +5 -0
  241. package/node_modules/dunder-proto/set.js +35 -0
  242. package/node_modules/dunder-proto/test/get.js +34 -0
  243. package/node_modules/dunder-proto/test/index.js +4 -0
  244. package/node_modules/dunder-proto/test/set.js +50 -0
  245. package/node_modules/dunder-proto/tsconfig.json +9 -0
  246. package/node_modules/es-define-property/.eslintrc +13 -0
  247. package/node_modules/es-define-property/.github/FUNDING.yml +12 -0
  248. package/node_modules/es-define-property/.nycrc +9 -0
  249. package/node_modules/es-define-property/CHANGELOG.md +29 -0
  250. package/node_modules/es-define-property/LICENSE +21 -0
  251. package/node_modules/es-define-property/README.md +49 -0
  252. package/node_modules/es-define-property/index.d.ts +3 -0
  253. package/node_modules/es-define-property/index.js +14 -0
  254. package/node_modules/es-define-property/package.json +81 -0
  255. package/node_modules/es-define-property/test/index.js +56 -0
  256. package/node_modules/es-define-property/tsconfig.json +10 -0
  257. package/node_modules/es-errors/.eslintrc +5 -0
  258. package/node_modules/es-errors/.github/FUNDING.yml +12 -0
  259. package/node_modules/es-errors/CHANGELOG.md +40 -0
  260. package/node_modules/es-errors/LICENSE +21 -0
  261. package/node_modules/es-errors/README.md +55 -0
  262. package/node_modules/es-errors/eval.d.ts +3 -0
  263. package/node_modules/es-errors/eval.js +4 -0
  264. package/node_modules/es-errors/index.d.ts +3 -0
  265. package/node_modules/es-errors/index.js +4 -0
  266. package/node_modules/es-errors/package.json +80 -0
  267. package/node_modules/es-errors/range.d.ts +3 -0
  268. package/node_modules/es-errors/range.js +4 -0
  269. package/node_modules/es-errors/ref.d.ts +3 -0
  270. package/node_modules/es-errors/ref.js +4 -0
  271. package/node_modules/es-errors/syntax.d.ts +3 -0
  272. package/node_modules/es-errors/syntax.js +4 -0
  273. package/node_modules/es-errors/test/index.js +19 -0
  274. package/node_modules/es-errors/tsconfig.json +49 -0
  275. package/node_modules/es-errors/type.d.ts +3 -0
  276. package/node_modules/es-errors/type.js +4 -0
  277. package/node_modules/es-errors/uri.d.ts +3 -0
  278. package/node_modules/es-errors/uri.js +4 -0
  279. package/node_modules/es-object-atoms/.eslintrc +16 -0
  280. package/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
  281. package/node_modules/es-object-atoms/CHANGELOG.md +44 -0
  282. package/node_modules/es-object-atoms/LICENSE +21 -0
  283. package/node_modules/es-object-atoms/README.md +63 -0
  284. package/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
  285. package/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
  286. package/node_modules/es-object-atoms/ToObject.d.ts +7 -0
  287. package/node_modules/es-object-atoms/ToObject.js +10 -0
  288. package/node_modules/es-object-atoms/index.d.ts +3 -0
  289. package/node_modules/es-object-atoms/index.js +4 -0
  290. package/node_modules/es-object-atoms/isObject.d.ts +3 -0
  291. package/node_modules/es-object-atoms/isObject.js +6 -0
  292. package/node_modules/es-object-atoms/package.json +79 -0
  293. package/node_modules/es-object-atoms/test/index.js +38 -0
  294. package/node_modules/es-object-atoms/tsconfig.json +7 -0
  295. package/node_modules/es-set-tostringtag/.eslintrc +13 -0
  296. package/node_modules/es-set-tostringtag/.nycrc +9 -0
  297. package/node_modules/es-set-tostringtag/CHANGELOG.md +67 -0
  298. package/node_modules/es-set-tostringtag/LICENSE +21 -0
  299. package/node_modules/es-set-tostringtag/README.md +53 -0
  300. package/node_modules/es-set-tostringtag/index.d.ts +10 -0
  301. package/node_modules/es-set-tostringtag/index.js +35 -0
  302. package/node_modules/es-set-tostringtag/package.json +78 -0
  303. package/node_modules/es-set-tostringtag/test/index.js +85 -0
  304. package/node_modules/es-set-tostringtag/tsconfig.json +9 -0
  305. package/node_modules/eventemitter3/LICENSE +21 -0
  306. package/node_modules/eventemitter3/README.md +85 -0
  307. package/node_modules/eventemitter3/dist/eventemitter3.esm.js +355 -0
  308. package/node_modules/eventemitter3/dist/eventemitter3.esm.min.js +1 -0
  309. package/node_modules/eventemitter3/dist/eventemitter3.esm.min.js.map +1 -0
  310. package/node_modules/eventemitter3/dist/eventemitter3.umd.js +363 -0
  311. package/node_modules/eventemitter3/dist/eventemitter3.umd.min.js +1 -0
  312. package/node_modules/eventemitter3/dist/eventemitter3.umd.min.js.map +1 -0
  313. package/node_modules/eventemitter3/index.d.ts +135 -0
  314. package/node_modules/eventemitter3/index.js +336 -0
  315. package/node_modules/eventemitter3/index.mjs +4 -0
  316. package/node_modules/eventemitter3/package.json +62 -0
  317. package/node_modules/follow-redirects/LICENSE +18 -0
  318. package/node_modules/follow-redirects/README.md +183 -0
  319. package/node_modules/follow-redirects/debug.js +15 -0
  320. package/node_modules/follow-redirects/http.js +1 -0
  321. package/node_modules/follow-redirects/https.js +1 -0
  322. package/node_modules/follow-redirects/index.js +714 -0
  323. package/node_modules/follow-redirects/package.json +58 -0
  324. package/node_modules/form-data/CHANGELOG.md +686 -0
  325. package/node_modules/form-data/License +19 -0
  326. package/node_modules/form-data/README.md +355 -0
  327. package/node_modules/form-data/index.d.ts +62 -0
  328. package/node_modules/form-data/lib/browser.js +4 -0
  329. package/node_modules/form-data/lib/form_data.js +506 -0
  330. package/node_modules/form-data/lib/populate.js +10 -0
  331. package/node_modules/form-data/package.json +82 -0
  332. package/node_modules/function-bind/.eslintrc +21 -0
  333. package/node_modules/function-bind/.github/FUNDING.yml +12 -0
  334. package/node_modules/function-bind/.github/SECURITY.md +3 -0
  335. package/node_modules/function-bind/.nycrc +13 -0
  336. package/node_modules/function-bind/CHANGELOG.md +136 -0
  337. package/node_modules/function-bind/LICENSE +20 -0
  338. package/node_modules/function-bind/README.md +46 -0
  339. package/node_modules/function-bind/implementation.js +84 -0
  340. package/node_modules/function-bind/index.js +5 -0
  341. package/node_modules/function-bind/package.json +87 -0
  342. package/node_modules/function-bind/test/.eslintrc +9 -0
  343. package/node_modules/function-bind/test/index.js +252 -0
  344. package/node_modules/get-intrinsic/.eslintrc +42 -0
  345. package/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
  346. package/node_modules/get-intrinsic/.nycrc +9 -0
  347. package/node_modules/get-intrinsic/CHANGELOG.md +186 -0
  348. package/node_modules/get-intrinsic/LICENSE +21 -0
  349. package/node_modules/get-intrinsic/README.md +71 -0
  350. package/node_modules/get-intrinsic/index.js +378 -0
  351. package/node_modules/get-intrinsic/package.json +97 -0
  352. package/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
  353. package/node_modules/get-proto/.eslintrc +10 -0
  354. package/node_modules/get-proto/.github/FUNDING.yml +12 -0
  355. package/node_modules/get-proto/.nycrc +9 -0
  356. package/node_modules/get-proto/CHANGELOG.md +21 -0
  357. package/node_modules/get-proto/LICENSE +21 -0
  358. package/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
  359. package/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
  360. package/node_modules/get-proto/README.md +50 -0
  361. package/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
  362. package/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
  363. package/node_modules/get-proto/index.d.ts +5 -0
  364. package/node_modules/get-proto/index.js +27 -0
  365. package/node_modules/get-proto/package.json +81 -0
  366. package/node_modules/get-proto/test/index.js +68 -0
  367. package/node_modules/get-proto/tsconfig.json +9 -0
  368. package/node_modules/glob/README.md +388 -214
  369. package/node_modules/glob/dist/commonjs/glob.d.ts +20 -11
  370. package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -1
  371. package/node_modules/glob/dist/commonjs/glob.js +22 -29
  372. package/node_modules/glob/dist/commonjs/glob.js.map +1 -1
  373. package/node_modules/glob/dist/commonjs/has-magic.d.ts +1 -1
  374. package/node_modules/glob/dist/commonjs/has-magic.d.ts.map +1 -1
  375. package/node_modules/glob/dist/commonjs/has-magic.js +1 -4
  376. package/node_modules/glob/dist/commonjs/has-magic.js.map +1 -1
  377. package/node_modules/glob/dist/commonjs/ignore.d.ts +16 -4
  378. package/node_modules/glob/dist/commonjs/ignore.d.ts.map +1 -1
  379. package/node_modules/glob/dist/commonjs/ignore.js +24 -4
  380. package/node_modules/glob/dist/commonjs/ignore.js.map +1 -1
  381. package/node_modules/glob/dist/commonjs/index.d.ts +3 -2
  382. package/node_modules/glob/dist/commonjs/index.d.ts.map +1 -1
  383. package/node_modules/glob/dist/commonjs/index.js.map +1 -1
  384. package/node_modules/glob/dist/commonjs/index.min.js +2 -3
  385. package/node_modules/glob/dist/commonjs/index.min.js.map +4 -4
  386. package/node_modules/glob/dist/commonjs/pattern.d.ts +10 -3
  387. package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -1
  388. package/node_modules/glob/dist/commonjs/pattern.js +27 -15
  389. package/node_modules/glob/dist/commonjs/pattern.js.map +1 -1
  390. package/node_modules/glob/dist/commonjs/processor.d.ts +23 -10
  391. package/node_modules/glob/dist/commonjs/processor.d.ts.map +1 -1
  392. package/node_modules/glob/dist/commonjs/processor.js +36 -23
  393. package/node_modules/glob/dist/commonjs/processor.js.map +1 -1
  394. package/node_modules/glob/dist/commonjs/walker.d.ts +19 -17
  395. package/node_modules/glob/dist/commonjs/walker.d.ts.map +1 -1
  396. package/node_modules/glob/dist/commonjs/walker.js +50 -35
  397. package/node_modules/glob/dist/commonjs/walker.js.map +1 -1
  398. package/node_modules/glob/dist/esm/glob.d.ts +20 -11
  399. package/node_modules/glob/dist/esm/glob.d.ts.map +1 -1
  400. package/node_modules/glob/dist/esm/glob.js +22 -29
  401. package/node_modules/glob/dist/esm/glob.js.map +1 -1
  402. package/node_modules/glob/dist/esm/has-magic.d.ts +1 -1
  403. package/node_modules/glob/dist/esm/has-magic.d.ts.map +1 -1
  404. package/node_modules/glob/dist/esm/has-magic.js +1 -4
  405. package/node_modules/glob/dist/esm/has-magic.js.map +1 -1
  406. package/node_modules/glob/dist/esm/ignore.d.ts +16 -4
  407. package/node_modules/glob/dist/esm/ignore.d.ts.map +1 -1
  408. package/node_modules/glob/dist/esm/ignore.js +25 -5
  409. package/node_modules/glob/dist/esm/ignore.js.map +1 -1
  410. package/node_modules/glob/dist/esm/index.d.ts +3 -2
  411. package/node_modules/glob/dist/esm/index.d.ts.map +1 -1
  412. package/node_modules/glob/dist/esm/index.js.map +1 -1
  413. package/node_modules/glob/dist/esm/index.min.js +2 -3
  414. package/node_modules/glob/dist/esm/index.min.js.map +4 -4
  415. package/node_modules/glob/dist/esm/pattern.d.ts +10 -3
  416. package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -1
  417. package/node_modules/glob/dist/esm/pattern.js +27 -15
  418. package/node_modules/glob/dist/esm/pattern.js.map +1 -1
  419. package/node_modules/glob/dist/esm/processor.d.ts +23 -10
  420. package/node_modules/glob/dist/esm/processor.d.ts.map +1 -1
  421. package/node_modules/glob/dist/esm/processor.js +36 -23
  422. package/node_modules/glob/dist/esm/processor.js.map +1 -1
  423. package/node_modules/glob/dist/esm/walker.d.ts +19 -17
  424. package/node_modules/glob/dist/esm/walker.d.ts.map +1 -1
  425. package/node_modules/glob/dist/esm/walker.js +51 -36
  426. package/node_modules/glob/dist/esm/walker.js.map +1 -1
  427. package/node_modules/glob/package.json +28 -12
  428. package/node_modules/glob/src/glob.ts +655 -0
  429. package/node_modules/glob/src/has-magic.ts +23 -0
  430. package/node_modules/glob/src/ignore.ts +162 -0
  431. package/node_modules/glob/src/index.ts +225 -0
  432. package/node_modules/glob/src/pattern.ts +286 -0
  433. package/node_modules/glob/src/processor.ts +333 -0
  434. package/node_modules/glob/src/walker.ts +523 -0
  435. package/node_modules/gopd/.eslintrc +16 -0
  436. package/node_modules/gopd/.github/FUNDING.yml +12 -0
  437. package/node_modules/gopd/CHANGELOG.md +45 -0
  438. package/node_modules/gopd/LICENSE +21 -0
  439. package/node_modules/gopd/README.md +40 -0
  440. package/node_modules/gopd/gOPD.d.ts +1 -0
  441. package/node_modules/gopd/gOPD.js +4 -0
  442. package/node_modules/gopd/index.d.ts +5 -0
  443. package/node_modules/gopd/index.js +15 -0
  444. package/node_modules/gopd/package.json +77 -0
  445. package/node_modules/gopd/test/index.js +36 -0
  446. package/node_modules/gopd/tsconfig.json +9 -0
  447. package/node_modules/has-symbols/.eslintrc +11 -0
  448. package/node_modules/has-symbols/.github/FUNDING.yml +12 -0
  449. package/node_modules/has-symbols/.nycrc +9 -0
  450. package/node_modules/has-symbols/CHANGELOG.md +91 -0
  451. package/node_modules/has-symbols/LICENSE +21 -0
  452. package/node_modules/has-symbols/README.md +46 -0
  453. package/node_modules/has-symbols/index.d.ts +3 -0
  454. package/node_modules/has-symbols/index.js +14 -0
  455. package/node_modules/has-symbols/package.json +111 -0
  456. package/node_modules/has-symbols/shams.d.ts +3 -0
  457. package/node_modules/has-symbols/shams.js +45 -0
  458. package/node_modules/has-symbols/test/index.js +22 -0
  459. package/node_modules/has-symbols/test/shams/core-js.js +29 -0
  460. package/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
  461. package/node_modules/has-symbols/test/tests.js +58 -0
  462. package/node_modules/has-symbols/tsconfig.json +10 -0
  463. package/node_modules/has-tostringtag/.eslintrc +5 -0
  464. package/node_modules/has-tostringtag/.github/FUNDING.yml +12 -0
  465. package/node_modules/has-tostringtag/.nycrc +13 -0
  466. package/node_modules/has-tostringtag/CHANGELOG.md +42 -0
  467. package/node_modules/has-tostringtag/LICENSE +21 -0
  468. package/node_modules/has-tostringtag/README.md +46 -0
  469. package/node_modules/has-tostringtag/index.d.ts +3 -0
  470. package/node_modules/has-tostringtag/index.js +8 -0
  471. package/node_modules/has-tostringtag/package.json +108 -0
  472. package/node_modules/has-tostringtag/shams.d.ts +3 -0
  473. package/node_modules/has-tostringtag/shams.js +8 -0
  474. package/node_modules/has-tostringtag/test/index.js +21 -0
  475. package/node_modules/has-tostringtag/test/shams/core-js.js +31 -0
  476. package/node_modules/has-tostringtag/test/shams/get-own-property-symbols.js +30 -0
  477. package/node_modules/has-tostringtag/test/tests.js +15 -0
  478. package/node_modules/has-tostringtag/tsconfig.json +49 -0
  479. package/node_modules/hasown/.github/FUNDING.yml +12 -0
  480. package/node_modules/hasown/.nycrc +13 -0
  481. package/node_modules/hasown/CHANGELOG.md +58 -0
  482. package/node_modules/hasown/LICENSE +21 -0
  483. package/node_modules/hasown/README.md +40 -0
  484. package/node_modules/hasown/eslint.config.mjs +6 -0
  485. package/node_modules/hasown/index.d.ts +3 -0
  486. package/node_modules/hasown/index.js +8 -0
  487. package/node_modules/hasown/package.json +91 -0
  488. package/node_modules/hasown/tsconfig.json +6 -0
  489. package/node_modules/math-intrinsics/.eslintrc +16 -0
  490. package/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
  491. package/node_modules/math-intrinsics/CHANGELOG.md +24 -0
  492. package/node_modules/math-intrinsics/LICENSE +21 -0
  493. package/node_modules/math-intrinsics/README.md +50 -0
  494. package/node_modules/math-intrinsics/abs.d.ts +1 -0
  495. package/node_modules/math-intrinsics/abs.js +4 -0
  496. package/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
  497. package/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
  498. package/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
  499. package/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
  500. package/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
  501. package/node_modules/math-intrinsics/constants/maxValue.js +5 -0
  502. package/node_modules/math-intrinsics/floor.d.ts +1 -0
  503. package/node_modules/math-intrinsics/floor.js +4 -0
  504. package/node_modules/math-intrinsics/isFinite.d.ts +3 -0
  505. package/node_modules/math-intrinsics/isFinite.js +12 -0
  506. package/node_modules/math-intrinsics/isInteger.d.ts +3 -0
  507. package/node_modules/math-intrinsics/isInteger.js +16 -0
  508. package/node_modules/math-intrinsics/isNaN.d.ts +1 -0
  509. package/node_modules/math-intrinsics/isNaN.js +6 -0
  510. package/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
  511. package/node_modules/math-intrinsics/isNegativeZero.js +6 -0
  512. package/node_modules/math-intrinsics/max.d.ts +1 -0
  513. package/node_modules/math-intrinsics/max.js +4 -0
  514. package/node_modules/math-intrinsics/min.d.ts +1 -0
  515. package/node_modules/math-intrinsics/min.js +4 -0
  516. package/node_modules/math-intrinsics/mod.d.ts +3 -0
  517. package/node_modules/math-intrinsics/mod.js +9 -0
  518. package/node_modules/math-intrinsics/package.json +86 -0
  519. package/node_modules/math-intrinsics/pow.d.ts +1 -0
  520. package/node_modules/math-intrinsics/pow.js +4 -0
  521. package/node_modules/math-intrinsics/round.d.ts +1 -0
  522. package/node_modules/math-intrinsics/round.js +4 -0
  523. package/node_modules/math-intrinsics/sign.d.ts +3 -0
  524. package/node_modules/math-intrinsics/sign.js +11 -0
  525. package/node_modules/math-intrinsics/test/index.js +192 -0
  526. package/node_modules/math-intrinsics/tsconfig.json +3 -0
  527. package/node_modules/mime-db/HISTORY.md +507 -0
  528. package/node_modules/mime-db/LICENSE +23 -0
  529. package/node_modules/mime-db/README.md +100 -0
  530. package/node_modules/mime-db/db.json +8519 -0
  531. package/node_modules/mime-db/index.js +12 -0
  532. package/node_modules/mime-db/package.json +60 -0
  533. package/node_modules/mime-types/HISTORY.md +397 -0
  534. package/node_modules/mime-types/LICENSE +23 -0
  535. package/node_modules/mime-types/README.md +113 -0
  536. package/node_modules/mime-types/index.js +188 -0
  537. package/node_modules/mime-types/package.json +44 -0
  538. package/node_modules/minimatch/README.md +125 -107
  539. package/node_modules/minimatch/dist/commonjs/index.d.ts +49 -38
  540. package/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -1
  541. package/node_modules/minimatch/dist/commonjs/index.js +782 -359
  542. package/node_modules/minimatch/dist/commonjs/index.js.map +1 -1
  543. package/node_modules/minimatch/dist/esm/index.d.ts +49 -38
  544. package/node_modules/minimatch/dist/esm/index.d.ts.map +1 -1
  545. package/node_modules/minimatch/dist/esm/index.js +781 -356
  546. package/node_modules/minimatch/dist/esm/index.js.map +1 -1
  547. package/node_modules/minimatch/package.json +5 -4
  548. package/node_modules/path-scurry/README.md +0 -1
  549. package/node_modules/path-scurry/dist/commonjs/index.d.ts +7 -0
  550. package/node_modules/path-scurry/dist/commonjs/index.d.ts.map +1 -1
  551. package/node_modules/path-scurry/dist/commonjs/index.js +59 -21
  552. package/node_modules/path-scurry/dist/commonjs/index.js.map +1 -1
  553. package/node_modules/path-scurry/dist/esm/index.d.ts +7 -0
  554. package/node_modules/path-scurry/dist/esm/index.d.ts.map +1 -1
  555. package/node_modules/path-scurry/dist/esm/index.js +42 -14
  556. package/node_modules/path-scurry/dist/esm/index.js.map +1 -1
  557. package/node_modules/path-scurry/package.json +4 -4
  558. package/node_modules/proxy-from-env/LICENSE +20 -0
  559. package/node_modules/proxy-from-env/README.md +163 -0
  560. package/node_modules/proxy-from-env/index.cjs +105 -0
  561. package/node_modules/proxy-from-env/index.js +103 -0
  562. package/node_modules/proxy-from-env/package.json +43 -0
  563. package/package.json +3 -1
  564. package/dist/web/assets/Assistant-DSQAdSiW.js +0 -1
  565. package/dist/web/assets/Dashboard-dCu2Cdxd.js +0 -1
  566. package/dist/web/assets/Files-cRhoWviM.js +0 -1
  567. package/dist/web/assets/Sessions-BxHsX1C5.js +0 -1
  568. package/dist/web/assets/WorkspaceTree-CD94JsaJ.js +0 -1
  569. package/dist/web/assets/index-BXpTaAUz.js +0 -66
  570. package/node_modules/minimatch/dist/commonjs/ast.d.ts +0 -22
  571. package/node_modules/minimatch/dist/commonjs/ast.d.ts.map +0 -1
  572. package/node_modules/minimatch/dist/commonjs/ast.js +0 -845
  573. package/node_modules/minimatch/dist/commonjs/ast.js.map +0 -1
  574. package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +0 -8
  575. package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +0 -1
  576. package/node_modules/minimatch/dist/commonjs/brace-expressions.js +0 -150
  577. package/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +0 -1
  578. package/node_modules/minimatch/dist/esm/ast.d.ts +0 -22
  579. package/node_modules/minimatch/dist/esm/ast.d.ts.map +0 -1
  580. package/node_modules/minimatch/dist/esm/ast.js +0 -841
  581. package/node_modules/minimatch/dist/esm/ast.js.map +0 -1
  582. package/node_modules/minimatch/dist/esm/brace-expressions.d.ts +0 -8
  583. package/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +0 -1
  584. package/node_modules/minimatch/dist/esm/brace-expressions.js +0 -146
  585. package/node_modules/minimatch/dist/esm/brace-expressions.js.map +0 -1
@@ -0,0 +1,786 @@
1
+ # @wecom/aibot-node-sdk
2
+
3
+ 企业微信智能机器人 Node.js SDK —— 基于 WebSocket 长连接通道,提供消息收发、流式回复、模板卡片、事件回调、文件下载解密、媒体素材上传等核心能力。
4
+
5
+ ## ✨ 特性
6
+
7
+ - 🔗 **WebSocket 长连接** — 基于 `wss://openws.work.weixin.qq.com` 内置默认地址,开箱即用【注: 私有部署企业需要在企业管理端查看该长连接地址】
8
+ - 🔐 **自动认证** — 连接建立后自动发送认证帧(botId + secret)
9
+ - 💓 **心跳保活** — 自动维护心跳,连续未收到 ack 时自动判定连接异常
10
+ - 🔄 **断线重连** — 指数退避重连策略(1s → 2s → 4s → ... → 30s 上限),支持自定义最大重连次数
11
+ - 📨 **消息分发** — 自动解析消息类型并触发对应事件(text / image / mixed / voice / file)
12
+ - 🌊 **流式回复** — 内置流式回复方法,支持 Markdown 和图文混排
13
+ - 🃏 **模板卡片** — 支持回复模板卡片消息、流式+卡片组合回复、更新卡片
14
+ - 📤 **主动推送** — 支持向指定会话主动发送 Markdown、模板卡片或媒体消息,无需依赖回调帧
15
+ - 📡 **事件回调** — 支持进入会话、模板卡片按钮点击、用户反馈等事件
16
+ - ⏩ **串行回复队列** — 同一 req_id 的回复消息串行发送,自动等待回执
17
+ - 🔒 **文件下载解密** — 内置 AES-256-CBC 文件解密,每个图片/文件消息自带独立的 aeskey
18
+ - 📎 **媒体素材上传** — 支持分片上传临时素材(file/image/voice/video),自动管理并发与重试
19
+ - 🪵 **可插拔日志** — 支持自定义 Logger,内置带时间戳的 DefaultLogger
20
+ - 📦 **双模块格式** — 同时输出 CJS / ESM,附带完整 TypeScript 类型声明
21
+
22
+ ## 📦 安装
23
+
24
+ ```bash
25
+ npm install @wecom/aibot-node-sdk
26
+ # 或
27
+ yarn add @wecom/aibot-node-sdk
28
+ ```
29
+
30
+ ## 🚀 快速开始
31
+
32
+ ```ts
33
+ import AiBot from '@wecom/aibot-node-sdk';
34
+ import type { WsFrame } from '@wecom/aibot-node-sdk';
35
+ import { generateReqId } from '@wecom/aibot-node-sdk';
36
+
37
+ // 1. 创建客户端实例
38
+ const wsClient = new AiBot.WSClient({
39
+ botId: 'your-bot-id', // 企业微信后台获取的机器人 ID
40
+ secret: 'your-bot-secret', // 企业微信后台获取的机器人 Secret
41
+ });
42
+
43
+ // 2. 建立连接(支持链式调用)
44
+ wsClient.connect();
45
+
46
+ // 3. 监听认证成功
47
+ wsClient.on('authenticated', () => {
48
+ console.log('🔐 认证成功');
49
+ });
50
+
51
+ // 4. 监听文本消息并进行流式回复
52
+ wsClient.on('message.text', (frame: WsFrame) => {
53
+ const content = frame.body.text?.content;
54
+ console.log(`收到文本: ${content}`);
55
+
56
+ const streamId = generateReqId('stream');
57
+
58
+ // 发送流式中间内容
59
+ wsClient.replyStream(frame, streamId, '正在思考中...', false);
60
+
61
+ // 发送最终结果
62
+ setTimeout(() => {
63
+ wsClient.replyStream(frame, streamId, `你好!你说的是: "${content}"`, true);
64
+ }, 1000);
65
+ });
66
+
67
+ // 5. 监听进入会话事件(发送欢迎语)
68
+ wsClient.on('event.enter_chat', (frame: WsFrame) => {
69
+ wsClient.replyWelcome(frame, {
70
+ msgtype: 'text',
71
+ text: { content: '您好!我是智能助手,有什么可以帮您的吗?' },
72
+ });
73
+ });
74
+
75
+ // 6. 优雅退出
76
+ process.on('SIGINT', () => {
77
+ wsClient.disconnect();
78
+ process.exit(0);
79
+ });
80
+ ```
81
+
82
+ ---
83
+
84
+ ## 📖 API 文档
85
+
86
+ ### `WSClient`
87
+
88
+ 核心客户端类,继承自 `EventEmitter`,提供连接管理、消息收发等功能。
89
+
90
+ #### 构造函数
91
+
92
+ ```ts
93
+ const wsClient = new WSClient(options: WSClientOptions);
94
+ ```
95
+
96
+ #### 方法一览
97
+
98
+ | 方法 | 说明 | 返回值 |
99
+ | --------------------------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------ |
100
+ | `connect()` | 建立 WebSocket 连接,连接后自动认证 | `this`(支持链式调用) |
101
+ | `disconnect()` | 主动断开连接 | `void` |
102
+ | `reply(frame, body, cmd?)` | 通过 WebSocket 通道发送回复消息(通用方法) | `Promise<WsFrame>` |
103
+ | `replyStream(frame, streamId, content, finish?, msgItem?, feedback?)` | 发送流式文本回复(支持 Markdown) | `Promise<WsFrame>` |
104
+ | `replyWelcome(frame, body)` | 发送欢迎语回复(文本或模板卡片),需 5s 内调用 | `Promise<WsFrame>` |
105
+ | `replyTemplateCard(frame, templateCard, feedback?)` | 回复模板卡片消息 | `Promise<WsFrame>` |
106
+ | `replyStreamWithCard(frame, streamId, content, finish?, options?)` | 流式消息 + 模板卡片组合回复 | `Promise<WsFrame>` |
107
+ | `updateTemplateCard(frame, templateCard, userids?)` | 更新模板卡片(响应 template_card_event),需 5s 内调用 | `Promise<WsFrame>` |
108
+ | `sendMessage(chatid, body)` | 主动发送消息(Markdown / 模板卡片 / 媒体),无需回调帧 | `Promise<WsFrame>` |
109
+ | `uploadMedia(fileBuffer, options)` | 上传临时素材(三步分片上传),返回 `media_id` | `Promise<UploadMediaFinishResult>` |
110
+ | `replyMedia(frame, mediaType, mediaId, videoOptions?)` | 被动回复媒体消息(file/image/voice/video) | `Promise<WsFrame>` |
111
+ | `sendMediaMessage(chatid, mediaType, mediaId, videoOptions?)` | 主动发送媒体消息 | `Promise<WsFrame>` |
112
+ | `downloadFile(url, aesKey)` | 下载文件并 AES 解密,返回 Buffer 及文件名 | `Promise<{ buffer: Buffer; filename?: string }>` |
113
+
114
+ #### 属性
115
+
116
+ | 属性 | 说明 | 类型 |
117
+ | ------------- | ------------------------------- | ---------------- |
118
+ | `isConnected` | 当前 WebSocket 连接状态 | `boolean` |
119
+ | `api` | 内部 API 客户端实例(高级用途) | `WeComApiClient` |
120
+
121
+ ---
122
+
123
+ ### `replyStream` 详细说明
124
+
125
+ 发送流式文本回复(便捷方法,支持 Markdown)。
126
+
127
+ ```ts
128
+ wsClient.replyStream(
129
+ frame: WsFrameHeaders, // 收到的原始 WebSocket 帧(透传 req_id),也可直接传完整 WsFrame 对象
130
+ streamId: string, // 流式消息 ID(使用 generateReqId('stream') 生成)
131
+ content: string, // 回复内容(支持 Markdown),最长 20480 字节
132
+ finish?: boolean, // 是否结束流式消息,默认 false
133
+ msgItem?: ReplyMsgItem[], // 图文混排项(仅 finish=true 时有效,最多 10 个)
134
+ feedback?: ReplyFeedback, // 反馈信息(仅首次回复时设置)
135
+ );
136
+ ```
137
+
138
+ 使用示例:
139
+
140
+ ```ts
141
+ const streamId = generateReqId('stream');
142
+
143
+ // 发送流式中间内容
144
+ await wsClient.replyStream(frame, streamId, '正在处理中...', false);
145
+
146
+ // 发送最终结果(finish=true 表示结束流)
147
+ await wsClient.replyStream(frame, streamId, '处理完成!结果是...', true);
148
+ ```
149
+
150
+ ---
151
+
152
+ ### `replyWelcome` 详细说明
153
+
154
+ 发送欢迎语回复,需在收到 `event.enter_chat` 事件 **5 秒内**调用,超时将无法发送。
155
+
156
+ ```ts
157
+ // 文本欢迎语
158
+ wsClient.replyWelcome(frame, {
159
+ msgtype: 'text',
160
+ text: { content: '欢迎!' },
161
+ });
162
+
163
+ // 模板卡片欢迎语
164
+ wsClient.replyWelcome(frame, {
165
+ msgtype: 'template_card',
166
+ template_card: { card_type: 'text_notice', main_title: { title: '欢迎' } },
167
+ });
168
+ ```
169
+
170
+ ---
171
+
172
+ ### `replyTemplateCard` 详细说明
173
+
174
+ 回复模板卡片消息。收到消息回调或进入会话事件后使用。
175
+
176
+ ```ts
177
+ wsClient.replyTemplateCard(
178
+ frame: WsFrameHeaders, // 收到的原始 WebSocket 帧
179
+ templateCard: TemplateCard, // 模板卡片内容
180
+ feedback?: ReplyFeedback, // 反馈信息(可选)
181
+ );
182
+ ```
183
+
184
+ ---
185
+
186
+ ### `replyStreamWithCard` 详细说明
187
+
188
+ 发送流式消息 + 模板卡片组合回复。首次回复时必须返回 stream 的 id;`template_card` 同一消息只能回复一次。
189
+
190
+ ```ts
191
+ wsClient.replyStreamWithCard(
192
+ frame: WsFrameHeaders, // 收到的原始 WebSocket 帧
193
+ streamId: string, // 流式消息 ID
194
+ content: string, // 回复内容(支持 Markdown)
195
+ finish?: boolean, // 是否结束流式消息,默认 false
196
+ options?: {
197
+ msgItem?: ReplyMsgItem[]; // 图文混排项(仅 finish=true 时有效)
198
+ streamFeedback?: ReplyFeedback; // 流式消息反馈信息(首次回复时设置)
199
+ templateCard?: TemplateCard; // 模板卡片内容(同一消息只能回复一次)
200
+ cardFeedback?: ReplyFeedback; // 模板卡片反馈信息
201
+ },
202
+ );
203
+ ```
204
+
205
+ 使用示例:
206
+
207
+ ```ts
208
+ const streamId = generateReqId('stream');
209
+
210
+ // 首次回复:带卡片
211
+ await wsClient.replyStreamWithCard(frame, streamId, '正在处理...', false, {
212
+ templateCard: {
213
+ card_type: 'button_interaction',
214
+ main_title: { title: '操作面板' },
215
+ button_list: [{ text: '确认', key: 'confirm' }],
216
+ task_id: `task_${Date.now()}`,
217
+ },
218
+ });
219
+
220
+ // 流式结束
221
+ await wsClient.replyStreamWithCard(frame, streamId, '处理完成!', true);
222
+ ```
223
+
224
+ ---
225
+
226
+ ### `updateTemplateCard` 详细说明
227
+
228
+ 更新模板卡片,需在收到 `event.template_card_event` 事件 **5 秒内**调用。
229
+
230
+ ```ts
231
+ wsClient.updateTemplateCard(
232
+ frame: WsFrameHeaders, // 对应事件的 WebSocket 帧(需包含该事件的 req_id)
233
+ templateCard: TemplateCard, // 模板卡片内容(task_id 需与回调收到的 task_id 一致)
234
+ userids?: string[], // 要替换模版卡片消息的 userid 列表,不填则替换所有用户
235
+ );
236
+ ```
237
+
238
+ ---
239
+
240
+ ### `sendMessage` 详细说明
241
+
242
+ 主动向指定会话推送消息,无需依赖收到的回调帧。
243
+
244
+ ```ts
245
+ wsClient.sendMessage(
246
+ chatid: string, // 会话 ID,单聊填用户的 userid,群聊填对应群聊的 chatid
247
+ body: SendMarkdownMsgBody | SendTemplateCardMsgBody | SendMediaMsgBody,
248
+ );
249
+ ```
250
+
251
+ 使用示例:
252
+
253
+ ```ts
254
+ // 发送 Markdown 消息
255
+ await wsClient.sendMessage('userid_or_chatid', {
256
+ msgtype: 'markdown',
257
+ markdown: { content: '这是一条**主动推送**的消息' },
258
+ });
259
+
260
+ // 发送模板卡片消息
261
+ await wsClient.sendMessage('userid_or_chatid', {
262
+ msgtype: 'template_card',
263
+ template_card: { card_type: 'text_notice', main_title: { title: '通知' } },
264
+ });
265
+ ```
266
+
267
+ ---
268
+
269
+ ### `uploadMedia` 详细说明
270
+
271
+ 通过 WebSocket 长连接执行三步分片上传:`init → chunk × N → finish`。
272
+
273
+ - 单个分片不超过 **512KB**(Base64 编码前),最多 **100 个**分片(约 50MB 上限)
274
+ - 自动根据分片数调整并发数(1\~4 分片全并发;5\~10 分片并发 3;>10 分片并发 2)
275
+ - 单分片上传失败自动重试(最多 2 次)
276
+
277
+ ```ts
278
+ wsClient.uploadMedia(
279
+ fileBuffer: Buffer, // 文件 Buffer
280
+ options: UploadMediaOptions, // { type: WeComMediaType, filename: string }
281
+ ): Promise<UploadMediaFinishResult>; // { type, media_id, created_at }
282
+ ```
283
+
284
+ 使用示例:
285
+
286
+ ```ts
287
+ import fs from 'fs';
288
+
289
+ // 上传图片
290
+ const imageBuffer = fs.readFileSync('/path/to/image.png');
291
+ const result = await wsClient.uploadMedia(imageBuffer, {
292
+ type: 'image',
293
+ filename: 'image.png',
294
+ });
295
+ console.log(`上传成功,media_id: ${result.media_id}`);
296
+
297
+ // 使用 media_id 回复图片消息
298
+ await wsClient.replyMedia(frame, 'image', result.media_id);
299
+ ```
300
+
301
+ ---
302
+
303
+ ### `replyMedia` 详细说明
304
+
305
+ 被动回复媒体消息(通过 `aibot_respond_msg` 通道)。
306
+
307
+ ```ts
308
+ wsClient.replyMedia(
309
+ frame: WsFrameHeaders, // 收到的原始 WebSocket 帧
310
+ mediaType: WeComMediaType, // 媒体类型:'file' | 'image' | 'voice' | 'video'
311
+ mediaId: string, // 临时素材 media_id(通过 uploadMedia 获取)
312
+ videoOptions?: { // 视频消息可选参数(仅 mediaType='video' 时生效)
313
+ title?: string;
314
+ description?: string;
315
+ },
316
+ );
317
+ ```
318
+
319
+ ---
320
+
321
+ ### `sendMediaMessage` 详细说明
322
+
323
+ 主动发送媒体消息(通过 `aibot_send_msg` 通道推送)。
324
+
325
+ ```ts
326
+ wsClient.sendMediaMessage(
327
+ chatid: string, // 会话 ID
328
+ mediaType: WeComMediaType, // 媒体类型:'file' | 'image' | 'voice' | 'video'
329
+ mediaId: string, // 临时素材 media_id
330
+ videoOptions?: { // 视频消息可选参数(仅 mediaType='video' 时生效)
331
+ title?: string;
332
+ description?: string;
333
+ },
334
+ );
335
+ ```
336
+
337
+ ---
338
+
339
+ ### `downloadFile` 使用示例
340
+
341
+ ```ts
342
+ // aesKey 取自消息体中的 image.aeskey 或 file.aeskey
343
+ wsClient.on('message.image', async (frame: WsFrame) => {
344
+ const body = frame.body;
345
+ const { buffer, filename } = await wsClient.downloadFile(body.image?.url, body.image?.aeskey);
346
+ console.log(`文件名: ${filename}, 大小: ${buffer.length} bytes`);
347
+ });
348
+ ```
349
+
350
+ ---
351
+
352
+ ## ⚙️ 配置选项
353
+
354
+ `WSClientOptions` 完整配置:
355
+
356
+ | 参数 | 类型 | 必填 | 默认值 | 说明 |
357
+ | --- | --- | --- | --- | --- |
358
+ | `botId` | `string` | ✅ | — | 机器人 ID(企业微信后台获取) |
359
+ | `secret` | `string` | ✅ | — | 机器人 Secret(企业微信后台获取) |
360
+ | `reconnectInterval` | `number` | — | `1000` | 重连基础延迟(毫秒),实际延迟按指数退避递增(1s → 2s → 4s → ... → 30s 上限) |
361
+ | `maxReconnectAttempts` | `number` | — | `10` | 最大重连次数(`-1` 表示无限重连) |
362
+ | `heartbeatInterval` | `number` | — | `30000` | 心跳间隔(毫秒) |
363
+ | `requestTimeout` | `number` | — | `10000` | HTTP 请求超时时间(毫秒) |
364
+ | `wsUrl` | `string` | — | `wss://openws.work.weixin.qq.com` | 自定义 WebSocket 连接地址 |
365
+ | `wsOptions` | `string` | — | `string` | 自签证书地址 |
366
+ | `logger` | `Logger` | — | `DefaultLogger` | 自定义日志实例 |
367
+
368
+ ---
369
+
370
+ ## 📡 事件列表
371
+
372
+ 所有事件均通过 `wsClient.on(event, handler)` 监听:
373
+
374
+ | 事件 | 回调参数 | 说明 |
375
+ | --------------------------- | ------------------------------ | -------------------------------------------- |
376
+ | `connected` | — | WebSocket 连接建立 |
377
+ | `authenticated` | — | 认证成功 |
378
+ | `disconnected` | `reason: string` | 连接断开 |
379
+ | `reconnecting` | `attempt: number` | 正在重连(第 N 次) |
380
+ | `error` | `error: Error` | 发生错误 |
381
+ | `message` | `frame: WsFrame<BaseMessage>` | 收到消息(所有类型) |
382
+ | `message.text` | `frame: WsFrame<TextMessage>` | 收到文本消息 |
383
+ | `message.image` | `frame: WsFrame<ImageMessage>` | 收到图片消息 |
384
+ | `message.mixed` | `frame: WsFrame<MixedMessage>` | 收到图文混排消息 |
385
+ | `message.voice` | `frame: WsFrame<VoiceMessage>` | 收到语音消息 |
386
+ | `message.file` | `frame: WsFrame<FileMessage>` | 收到文件消息 |
387
+ | `message.video` | `frame: WsFrame<VideoMessage>` | 收到视频消息 |
388
+ | `event` | `frame: WsFrame<EventMessage>` | 收到事件回调(所有事件类型) |
389
+ | `event.enter_chat` | `frame: WsFrame<EventMessage>` | 收到进入会话事件(用户当天首次进入单聊会话) |
390
+ | `event.template_card_event` | `frame: WsFrame<EventMessage>` | 收到模板卡片事件(用户点击卡片按钮) |
391
+ | `event.feedback_event` | `frame: WsFrame<EventMessage>` | 收到用户反馈事件 |
392
+
393
+ ---
394
+
395
+ ## 📋 消息类型
396
+
397
+ SDK 支持以下消息类型(`MessageType` 枚举):
398
+
399
+ | 类型 | 值 | 说明 |
400
+ | ------- | --------- | -------------------------------------------------------- |
401
+ | `Text` | `'text'` | 文本消息 |
402
+ | `Image` | `'image'` | 图片消息(URL 已加密,使用消息中的 `image.aeskey` 解密) |
403
+ | `Mixed` | `'mixed'` | 图文混排消息(包含 text / image 子项) |
404
+ | `Voice` | `'voice'` | 语音消息(已转文本) |
405
+ | `File` | `'file'` | 文件消息(URL 已加密,使用消息中的 `file.aeskey` 解密) |
406
+ | `Video` | `'video'` | 视频消息(URL 已加密,使用消息中的 `video.aeskey` 解密) |
407
+
408
+ SDK 支持以下事件类型(`EventType` 枚举):
409
+
410
+ | 类型 | 值 | 说明 |
411
+ | ------------------- | ----------------------- | -------------------------------------------- |
412
+ | `EnterChat` | `'enter_chat'` | 进入会话事件:用户当天首次进入机器人单聊会话 |
413
+ | `TemplateCardEvent` | `'template_card_event'` | 模板卡片事件:用户点击模板卡片按钮 |
414
+ | `FeedbackEvent` | `'feedback_event'` | 用户反馈事件:用户对机器人回复进行反馈 |
415
+
416
+ SDK 支持以下媒体类型(`WeComMediaType` 类型):
417
+
418
+ | 类型 | 值 | 说明 |
419
+ | ---- | --------- | ---- |
420
+ | — | `'file'` | 文件 |
421
+ | — | `'image'` | 图片 |
422
+ | — | `'voice'` | 语音 |
423
+ | — | `'video'` | 视频 |
424
+
425
+ ---
426
+
427
+ ## 🃏 模板卡片类型
428
+
429
+ SDK 支持以下模板卡片类型(`TemplateCardType` 枚举):
430
+
431
+ | 类型 | 值 | 说明 |
432
+ | --------------------- | ------------------------ | ---------------- |
433
+ | `TextNotice` | `'text_notice'` | 文本通知模版卡片 |
434
+ | `NewsNotice` | `'news_notice'` | 图文展示模版卡片 |
435
+ | `ButtonInteraction` | `'button_interaction'` | 按钮交互模版卡片 |
436
+ | `VoteInteraction` | `'vote_interaction'` | 投票选择模版卡片 |
437
+ | `MultipleInteraction` | `'multiple_interaction'` | 多项选择模版卡片 |
438
+
439
+ ---
440
+
441
+ ## 🔀 消息帧结构
442
+
443
+ ### `WsFrame<T>`
444
+
445
+ ```ts
446
+ interface WsFrame<T = any> {
447
+ cmd?: string; // 命令类型
448
+ headers: {
449
+ req_id: string; // 请求 ID(回复时需透传)
450
+ [key: string]: any;
451
+ };
452
+ body?: T; // 消息体(泛型,默认 any)
453
+ errcode?: number; // 响应错误码
454
+ errmsg?: string; // 响应错误信息
455
+ }
456
+ ```
457
+
458
+ ### `BaseMessage`(消息体基础结构)
459
+
460
+ ```ts
461
+ interface BaseMessage {
462
+ msgid: string; // 消息唯一标识
463
+ aibotid: string; // 机器人 ID
464
+ chatid?: string; // 群聊 ID(群聊时返回)
465
+ chattype: 'single' | 'group'; // 会话类型
466
+ from: { userid: string }; // 发送者信息
467
+ create_time?: number; // 事件产生的时间戳
468
+ response_url?: string; // 支持主动回复消息的临时 url
469
+ msgtype: string; // 消息类型
470
+ quote?: QuoteContent; // 引用消息内容
471
+ }
472
+ ```
473
+
474
+ ### `EventMessage`(事件消息结构)
475
+
476
+ ```ts
477
+ interface EventMessage {
478
+ msgid: string; // 本次回调的唯一性标志
479
+ create_time: number; // 事件产生的时间戳
480
+ aibotid: string; // 智能机器人 ID
481
+ chatid?: string; // 会话 ID(仅群聊时返回)
482
+ chattype?: 'single' | 'group'; // 会话类型
483
+ from: EventFrom; // 事件触发者信息(含 userid、corpid?)
484
+ msgtype: 'event'; // 消息类型,固定为 event
485
+ event: EventContent; // 事件内容
486
+ }
487
+ ```
488
+
489
+ ---
490
+
491
+ ## 🪵 自定义日志
492
+
493
+ 实现 `Logger` 接口即可自定义日志输出:
494
+
495
+ ```ts
496
+ interface Logger {
497
+ debug(message: string, ...args: any[]): void;
498
+ info(message: string, ...args: any[]): void;
499
+ warn(message: string, ...args: any[]): void;
500
+ error(message: string, ...args: any[]): void;
501
+ }
502
+ ```
503
+
504
+ 使用示例:
505
+
506
+ ```ts
507
+ const wsClient = new AiBot.WSClient({
508
+ botId: 'your-bot-id',
509
+ secret: 'your-bot-secret',
510
+ logger: {
511
+ debug: () => {}, // 静默 debug 日志
512
+ info: console.log,
513
+ warn: console.warn,
514
+ error: console.error,
515
+ },
516
+ });
517
+ ```
518
+
519
+ 私有部署企业使用示例:
520
+ ```ts
521
+ const wsClient = new AiBot.WSClient({
522
+ botId: 'your-bot-id',
523
+ secret: 'your-bot-secret',
524
+ wsUrl: 'your-wsUrl',
525
+ wsOptions: {
526
+ ca: fs.readFileSync('your-ca-path'),
527
+ },
528
+ logger: {
529
+ debug: () => {}, // 静默 debug 日志
530
+ info: console.log,
531
+ warn: console.warn,
532
+ error: console.error,
533
+ },
534
+ });
535
+ ```
536
+
537
+ ---
538
+
539
+ ## 🔧 WebSocket 命令协议
540
+
541
+ 以下为 SDK 内部使用的 WebSocket 命令常量(`WsCmd`),了解底层协议有助于高级调试:
542
+
543
+ | 方向 | 常量 | 值 | 说明 |
544
+ | ------------- | --------------------- | --------------------------- | ----------------- |
545
+ | 开发者 → 企微 | `SUBSCRIBE` | `aibot_subscribe` | 认证订阅 |
546
+ | 开发者 → 企微 | `HEARTBEAT` | `ping` | 心跳 |
547
+ | 开发者 → 企微 | `RESPONSE` | `aibot_respond_msg` | 回复消息 |
548
+ | 开发者 → 企微 | `RESPONSE_WELCOME` | `aibot_respond_welcome_msg` | 回复欢迎语 |
549
+ | 开发者 → 企微 | `RESPONSE_UPDATE` | `aibot_respond_update_msg` | 更新模板卡片 |
550
+ | 开发者 → 企微 | `SEND_MSG` | `aibot_send_msg` | 主动发送消息 |
551
+ | 开发者 → 企微 | `UPLOAD_MEDIA_INIT` | `aibot_upload_media_init` | 上传素材 - 初始化 |
552
+ | 开发者 → 企微 | `UPLOAD_MEDIA_CHUNK` | `aibot_upload_media_chunk` | 上传素材 - 分片 |
553
+ | 开发者 → 企微 | `UPLOAD_MEDIA_FINISH` | `aibot_upload_media_finish` | 上传素材 - 完成 |
554
+ | 企微 → 开发者 | `CALLBACK` | `aibot_msg_callback` | 消息推送回调 |
555
+ | 企微 → 开发者 | `EVENT_CALLBACK` | `aibot_event_callback` | 事件推送回调 |
556
+
557
+ ---
558
+
559
+ ## 📂 项目结构
560
+
561
+ ```
562
+ aibot-node-sdk/
563
+ ├── src/
564
+ │ ├── index.ts # 入口文件,统一导出
565
+ │ ├── client.ts # WSClient 核心客户端
566
+ │ ├── ws.ts # WebSocket 长连接管理器
567
+ │ ├── message-handler.ts # 消息解析与事件分发
568
+ │ ├── api.ts # HTTP API 客户端(文件下载)
569
+ │ ├── crypto.ts # AES-256-CBC 文件解密
570
+ │ ├── logger.ts # 默认日志实现
571
+ │ ├── utils.ts # 工具方法(generateReqId 等)
572
+ │ └── types/
573
+ │ ├── index.ts # 类型统一导出
574
+ │ ├── config.ts # 配置选项类型
575
+ │ ├── event.ts # 事件映射类型
576
+ │ ├── message.ts # 消息相关类型
577
+ │ ├── api.ts # API/WebSocket 帧/模板卡片类型
578
+ │ └── common.ts # 通用类型(Logger)
579
+ ├── examples/
580
+ │ └── basic.ts # 基础使用示例
581
+ ├── package.json
582
+ ├── tsconfig.json
583
+ ├── rollup.config.mjs # Rollup 构建配置
584
+ └── yarn.lock
585
+ ```
586
+
587
+ ---
588
+
589
+ ## 🧩 完整使用示例
590
+
591
+ ### 流式回复 + 图文混排
592
+
593
+ ```ts
594
+ import AiBot from '@wecom/aibot-node-sdk';
595
+ import type { WsFrame, ReplyMsgItem } from '@wecom/aibot-node-sdk';
596
+ import { generateReqId } from '@wecom/aibot-node-sdk';
597
+ import { createHash } from 'crypto';
598
+ import fs from 'fs';
599
+
600
+ const wsClient = new AiBot.WSClient({
601
+ botId: 'your-bot-id',
602
+ secret: 'your-bot-secret',
603
+ });
604
+
605
+ wsClient.connect();
606
+
607
+ wsClient.on('message.text', async (frame: WsFrame) => {
608
+ const streamId = generateReqId('stream');
609
+
610
+ // 流式中间内容
611
+ await wsClient.replyStream(frame, streamId, '正在生成图文内容...', false);
612
+
613
+ // 准备图文混排项(仅 finish=true 时有效)
614
+ const imageData = fs.readFileSync('/path/to/image.jpg');
615
+ const base64 = imageData.toString('base64');
616
+ const md5 = createHash('md5').update(imageData).digest('hex');
617
+
618
+ const msgItem: ReplyMsgItem[] = [
619
+ { msgtype: 'image', image: { base64, md5 } },
620
+ ];
621
+
622
+ // 流式结束,附带图片
623
+ await wsClient.replyStream(frame, streamId, '这是最终结果', true, msgItem);
624
+ });
625
+ ```
626
+
627
+ ### 上传素材 + 回复媒体消息
628
+
629
+ ```ts
630
+ import AiBot from '@wecom/aibot-node-sdk';
631
+ import type { WsFrame } from '@wecom/aibot-node-sdk';
632
+ import fs from 'fs';
633
+
634
+ const wsClient = new AiBot.WSClient({
635
+ botId: 'your-bot-id',
636
+ secret: 'your-bot-secret',
637
+ });
638
+
639
+ wsClient.connect();
640
+
641
+ wsClient.on('message.text', async (frame: WsFrame) => {
642
+ // 上传文件
643
+ const fileBuffer = fs.readFileSync('/path/to/document.pdf');
644
+ const result = await wsClient.uploadMedia(fileBuffer, {
645
+ type: 'file',
646
+ filename: 'document.pdf',
647
+ });
648
+
649
+ // 使用 media_id 被动回复文件消息
650
+ await wsClient.replyMedia(frame, 'file', result.media_id);
651
+ });
652
+ ```
653
+
654
+ ### 主动推送消息
655
+
656
+ ```ts
657
+ // 在认证成功后,可以随时主动推送消息
658
+ wsClient.on('authenticated', async () => {
659
+ // 向指定用户推送 Markdown 消息
660
+ await wsClient.sendMessage('target_userid', {
661
+ msgtype: 'markdown',
662
+ markdown: { content: '# 通知\n\n这是一条**主动推送**的消息。' },
663
+ });
664
+
665
+ // 主动推送媒体消息
666
+ const imageBuffer = fs.readFileSync('/path/to/photo.jpg');
667
+ const result = await wsClient.uploadMedia(imageBuffer, {
668
+ type: 'image',
669
+ filename: 'photo.jpg',
670
+ });
671
+ await wsClient.sendMediaMessage('target_userid', 'image', result.media_id);
672
+ });
673
+ ```
674
+
675
+ ### 模板卡片交互
676
+
677
+ ```ts
678
+ // 回复带按钮的模板卡片
679
+ wsClient.on('message.text', async (frame: WsFrame) => {
680
+ await wsClient.replyTemplateCard(frame, {
681
+ card_type: 'button_interaction',
682
+ main_title: { title: '请选择操作', desc: '点击下方按钮进行操作' },
683
+ button_list: [
684
+ { text: '确认', key: 'btn_confirm', style: 1 },
685
+ { text: '取消', key: 'btn_cancel', style: 2 },
686
+ ],
687
+ task_id: `task_${Date.now()}`,
688
+ });
689
+ });
690
+
691
+ // 监听卡片按钮点击事件并更新卡片
692
+ wsClient.on('event.template_card_event', async (frame: WsFrame) => {
693
+ const eventKey = frame.body.event?.event_key;
694
+ const taskId = frame.body.event?.task_id;
695
+
696
+ await wsClient.updateTemplateCard(frame, {
697
+ card_type: 'text_notice',
698
+ main_title: { title: eventKey === 'btn_confirm' ? '已确认 ✅' : '已取消 ❌' },
699
+ task_id: taskId,
700
+ });
701
+ });
702
+ ```
703
+
704
+ ### 文件下载解密
705
+
706
+ ```ts
707
+ import fs from 'fs';
708
+ import path from 'path';
709
+
710
+ // 处理图片消息
711
+ wsClient.on('message.image', async (frame: WsFrame) => {
712
+ const body = frame.body;
713
+ const imageUrl = body.image?.url;
714
+ if (!imageUrl) return;
715
+
716
+ // 使用消息中独立的 aeskey 下载并解密
717
+ const { buffer, filename } = await wsClient.downloadFile(imageUrl, body.image?.aeskey);
718
+ const savePath = path.join(__dirname, filename || `image_${Date.now()}.jpg`);
719
+ fs.writeFileSync(savePath, buffer);
720
+ console.log(`图片已保存: ${savePath} (${buffer.length} bytes)`);
721
+ });
722
+
723
+ // 处理文件消息
724
+ wsClient.on('message.file', async (frame: WsFrame) => {
725
+ const body = frame.body;
726
+ const fileUrl = body.file?.url;
727
+ if (!fileUrl) return;
728
+
729
+ const { buffer, filename } = await wsClient.downloadFile(fileUrl, body.file?.aeskey);
730
+ const savePath = path.join(__dirname, filename || `file_${Date.now()}`);
731
+ fs.writeFileSync(savePath, buffer);
732
+ console.log(`文件已保存: ${savePath} (${buffer.length} bytes)`);
733
+ });
734
+ ```
735
+
736
+ ---
737
+
738
+ ## 🔧 开发
739
+
740
+ ```bash
741
+ # 安装依赖
742
+ yarn install
743
+
744
+ # 开发模式(监听文件变化)
745
+ yarn dev
746
+
747
+ # 构建
748
+ yarn build
749
+
750
+ # 运行示例
751
+ yarn example
752
+ ```
753
+
754
+ ---
755
+
756
+ ## 🔗 导出说明
757
+
758
+ SDK 同时支持默认导出和具名导出:
759
+
760
+ ```ts
761
+ // 默认导出
762
+ import AiBot from '@wecom/aibot-node-sdk';
763
+ const wsClient = new AiBot.WSClient({ ... });
764
+
765
+ // 具名导出
766
+ import { WSClient, generateReqId } from '@wecom/aibot-node-sdk';
767
+ const wsClient = new WSClient({ ... });
768
+
769
+ // 类型导入
770
+ import type { WsFrame, BaseMessage, TextMessage, TemplateCard } from '@wecom/aibot-node-sdk';
771
+ ```
772
+
773
+ 完整导出列表:
774
+
775
+ | 类别 | 导出项 |
776
+ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
777
+ | **类** | `WSClient`、`WeComApiClient`、`WsConnectionManager`、`MessageHandler`、`DefaultLogger` |
778
+ | **函数** | `generateReqId`、`generateRandomString`、`decryptFile` |
779
+ | **枚举** | `MessageType`、`EventType`、`TemplateCardType`、`WsCmd` |
780
+ | **类型** | `WSClientOptions`、`WSClientEventMap`、`WsFrame`、`WsFrameHeaders`、`BaseMessage`、`TextMessage`、`ImageMessage`、`MixedMessage`、`VoiceMessage`、`FileMessage`、`VideoMessage`、`EventMessage`、`TemplateCard`、`StreamReplyBody`、`ReplyMsgItem`、`ReplyFeedback`、`Logger` 等 |
781
+
782
+ ---
783
+
784
+ ## 📄 License
785
+
786
+ MIT