@wecom/wecom-openclaw-plugin 2026.4.2 → 2026.4.3-beta.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 (215) hide show
  1. package/README.md +395 -10
  2. package/dist/index.d.ts +2 -4
  3. package/dist/index.js +58 -0
  4. package/dist/src/accounts.d.ts +57 -0
  5. package/dist/src/accounts.js +222 -0
  6. package/dist/src/agent/api-client.d.ts +94 -0
  7. package/dist/src/agent/api-client.js +292 -0
  8. package/dist/src/agent/handler.d.ts +63 -0
  9. package/dist/src/agent/handler.js +551 -0
  10. package/dist/src/agent/index.d.ts +5 -0
  11. package/dist/src/agent/index.js +5 -0
  12. package/dist/src/agent/webhook.d.ts +24 -0
  13. package/dist/src/agent/webhook.js +228 -0
  14. package/dist/src/agent/xml.d.ts +21 -0
  15. package/dist/src/agent/xml.js +41 -0
  16. package/dist/src/channel.js +579 -0
  17. package/dist/src/chat-queue.d.ts +31 -0
  18. package/dist/src/chat-queue.js +45 -0
  19. package/dist/{esm/types/src → src}/const.d.ts +46 -0
  20. package/dist/{esm/src → src}/const.js +77 -30
  21. package/dist/{esm/src → src}/dm-policy.js +6 -9
  22. package/dist/src/dynamic-agent.d.ts +37 -0
  23. package/dist/src/dynamic-agent.js +60 -0
  24. package/dist/src/dynamic-routing.d.ts +65 -0
  25. package/dist/src/dynamic-routing.js +58 -0
  26. package/dist/{esm/src → src}/group-policy.js +8 -22
  27. package/dist/src/http.d.ts +26 -0
  28. package/dist/src/http.js +93 -0
  29. package/dist/{esm/types/src → src}/interface.d.ts +0 -2
  30. package/dist/src/interface.js +4 -0
  31. package/dist/src/mcp/index.js +6 -0
  32. package/dist/{esm/src → src}/mcp/interceptors/biz-error.js +2 -6
  33. package/dist/{esm/src → src}/mcp/interceptors/index.js +6 -10
  34. package/dist/{esm/src → src}/mcp/interceptors/msg-media.js +6 -10
  35. package/dist/{esm/src → src}/mcp/interceptors/smartpage-create.js +2 -6
  36. package/dist/{esm/src → src}/mcp/interceptors/smartpage-export.js +2 -6
  37. package/dist/src/mcp/interceptors/types.js +7 -0
  38. package/dist/{esm/src → src}/mcp/schema.js +1 -4
  39. package/dist/{esm/src → src}/mcp/tool.js +4 -8
  40. package/dist/{esm/src → src}/mcp/transport.js +15 -16
  41. package/dist/{esm/src → src}/media-handler.js +6 -10
  42. package/dist/{esm/src → src}/media-uploader.js +64 -10
  43. package/dist/{esm/src → src}/message-parser.js +1 -4
  44. package/dist/{esm/types/src → src}/message-sender.d.ts +18 -0
  45. package/dist/{esm/src → src}/message-sender.js +45 -11
  46. package/dist/{esm/src → src}/monitor.js +145 -292
  47. package/dist/{esm/src → src}/onboarding.js +22 -26
  48. package/dist/{esm/types/src → src}/openclaw-compat.d.ts +49 -0
  49. package/dist/{esm/src → src}/openclaw-compat.js +133 -27
  50. package/dist/{esm/src → src}/reqid-store.js +4 -7
  51. package/dist/{esm/src → src}/runtime.js +2 -5
  52. package/dist/src/shared/command-auth.d.ts +23 -0
  53. package/dist/src/shared/command-auth.js +73 -0
  54. package/dist/src/shared/xml-parser.d.ts +46 -0
  55. package/dist/src/shared/xml-parser.js +210 -0
  56. package/dist/{esm/src → src}/state-dir-resolve.js +3 -7
  57. package/dist/{esm/src → src}/state-manager.js +84 -16
  58. package/dist/src/target.d.ts +35 -0
  59. package/dist/src/target.js +67 -0
  60. package/dist/src/template-card-manager.d.ts +55 -0
  61. package/dist/src/template-card-manager.js +205 -0
  62. package/dist/{esm/src → src}/template-card-parser.js +17 -8
  63. package/dist/{esm/src → src}/timeout.js +2 -5
  64. package/dist/src/types/account.d.ts +29 -0
  65. package/dist/src/types/account.js +4 -0
  66. package/dist/src/types/config.d.ts +91 -0
  67. package/dist/src/types/config.js +7 -0
  68. package/dist/src/types/constants.d.ts +42 -0
  69. package/dist/src/types/constants.js +42 -0
  70. package/dist/src/types/index.d.ts +7 -0
  71. package/dist/src/types/index.js +5 -0
  72. package/dist/src/types/message.d.ts +238 -0
  73. package/dist/src/types/message.js +5 -0
  74. package/dist/{esm/types/src → src}/utils.d.ts +41 -0
  75. package/dist/{esm/src → src}/utils.js +24 -10
  76. package/dist/src/version.d.ts +2 -0
  77. package/dist/src/version.js +24 -0
  78. package/dist/src/webhook/command-auth.d.ts +47 -0
  79. package/dist/src/webhook/command-auth.js +96 -0
  80. package/dist/src/webhook/gateway.d.ts +36 -0
  81. package/dist/src/webhook/gateway.js +235 -0
  82. package/dist/src/webhook/handler.d.ts +18 -0
  83. package/dist/src/webhook/handler.js +420 -0
  84. package/dist/src/webhook/helpers.d.ts +156 -0
  85. package/dist/src/webhook/helpers.js +833 -0
  86. package/dist/src/webhook/http.d.ts +26 -0
  87. package/dist/src/webhook/http.js +94 -0
  88. package/dist/src/webhook/index.d.ts +11 -0
  89. package/dist/src/webhook/index.js +14 -0
  90. package/dist/src/webhook/media.d.ts +29 -0
  91. package/dist/src/webhook/media.js +88 -0
  92. package/dist/src/webhook/monitor.d.ts +59 -0
  93. package/dist/src/webhook/monitor.js +1161 -0
  94. package/dist/src/webhook/state.d.ts +220 -0
  95. package/dist/src/webhook/state.js +491 -0
  96. package/dist/src/webhook/target.d.ts +41 -0
  97. package/dist/src/webhook/target.js +132 -0
  98. package/dist/src/webhook/types.d.ts +347 -0
  99. package/dist/src/webhook/types.js +33 -0
  100. package/dist/src/webhook/video-frame.d.ts +13 -0
  101. package/dist/src/webhook/video-frame.js +30 -0
  102. package/package.json +15 -7
  103. package/dist/cjs/index.js +0 -45
  104. package/dist/cjs/index.js.map +0 -1
  105. package/dist/cjs/src/channel.js +0 -339
  106. package/dist/cjs/src/channel.js.map +0 -1
  107. package/dist/cjs/src/const.js +0 -137
  108. package/dist/cjs/src/const.js.map +0 -1
  109. package/dist/cjs/src/dm-policy.js +0 -89
  110. package/dist/cjs/src/dm-policy.js.map +0 -1
  111. package/dist/cjs/src/group-policy.js +0 -133
  112. package/dist/cjs/src/group-policy.js.map +0 -1
  113. package/dist/cjs/src/mcp/interceptors/biz-error.js +0 -70
  114. package/dist/cjs/src/mcp/interceptors/biz-error.js.map +0 -1
  115. package/dist/cjs/src/mcp/interceptors/index.js +0 -73
  116. package/dist/cjs/src/mcp/interceptors/index.js.map +0 -1
  117. package/dist/cjs/src/mcp/interceptors/msg-media.js +0 -159
  118. package/dist/cjs/src/mcp/interceptors/msg-media.js.map +0 -1
  119. package/dist/cjs/src/mcp/interceptors/smartpage-create.js +0 -157
  120. package/dist/cjs/src/mcp/interceptors/smartpage-create.js.map +0 -1
  121. package/dist/cjs/src/mcp/interceptors/smartpage-export.js +0 -93
  122. package/dist/cjs/src/mcp/interceptors/smartpage-export.js.map +0 -1
  123. package/dist/cjs/src/mcp/schema.js +0 -104
  124. package/dist/cjs/src/mcp/schema.js.map +0 -1
  125. package/dist/cjs/src/mcp/tool.js +0 -208
  126. package/dist/cjs/src/mcp/tool.js.map +0 -1
  127. package/dist/cjs/src/mcp/transport.js +0 -417
  128. package/dist/cjs/src/mcp/transport.js.map +0 -1
  129. package/dist/cjs/src/media-handler.js +0 -129
  130. package/dist/cjs/src/media-handler.js.map +0 -1
  131. package/dist/cjs/src/media-uploader.js +0 -284
  132. package/dist/cjs/src/media-uploader.js.map +0 -1
  133. package/dist/cjs/src/message-parser.js +0 -134
  134. package/dist/cjs/src/message-parser.js.map +0 -1
  135. package/dist/cjs/src/message-sender.js +0 -89
  136. package/dist/cjs/src/message-sender.js.map +0 -1
  137. package/dist/cjs/src/monitor.js +0 -991
  138. package/dist/cjs/src/monitor.js.map +0 -1
  139. package/dist/cjs/src/onboarding.js +0 -182
  140. package/dist/cjs/src/onboarding.js.map +0 -1
  141. package/dist/cjs/src/openclaw-compat.js +0 -400
  142. package/dist/cjs/src/openclaw-compat.js.map +0 -1
  143. package/dist/cjs/src/reqid-store.js +0 -88
  144. package/dist/cjs/src/reqid-store.js.map +0 -1
  145. package/dist/cjs/src/runtime.js +0 -16
  146. package/dist/cjs/src/runtime.js.map +0 -1
  147. package/dist/cjs/src/state-dir-resolve.js +0 -35
  148. package/dist/cjs/src/state-dir-resolve.js.map +0 -1
  149. package/dist/cjs/src/state-manager.js +0 -158
  150. package/dist/cjs/src/state-manager.js.map +0 -1
  151. package/dist/cjs/src/template-card-parser.js +0 -641
  152. package/dist/cjs/src/template-card-parser.js.map +0 -1
  153. package/dist/cjs/src/timeout.js +0 -42
  154. package/dist/cjs/src/timeout.js.map +0 -1
  155. package/dist/cjs/src/utils.js +0 -60
  156. package/dist/cjs/src/utils.js.map +0 -1
  157. package/dist/cjs/src/version.js +0 -26
  158. package/dist/cjs/src/version.js.map +0 -1
  159. package/dist/esm/index.js +0 -41
  160. package/dist/esm/index.js.map +0 -1
  161. package/dist/esm/src/channel.js +0 -337
  162. package/dist/esm/src/channel.js.map +0 -1
  163. package/dist/esm/src/const.js.map +0 -1
  164. package/dist/esm/src/dm-policy.js.map +0 -1
  165. package/dist/esm/src/group-policy.js.map +0 -1
  166. package/dist/esm/src/mcp/interceptors/biz-error.js.map +0 -1
  167. package/dist/esm/src/mcp/interceptors/index.js.map +0 -1
  168. package/dist/esm/src/mcp/interceptors/msg-media.js.map +0 -1
  169. package/dist/esm/src/mcp/interceptors/smartpage-create.js.map +0 -1
  170. package/dist/esm/src/mcp/interceptors/smartpage-export.js.map +0 -1
  171. package/dist/esm/src/mcp/schema.js.map +0 -1
  172. package/dist/esm/src/mcp/tool.js.map +0 -1
  173. package/dist/esm/src/mcp/transport.js.map +0 -1
  174. package/dist/esm/src/media-handler.js.map +0 -1
  175. package/dist/esm/src/media-uploader.js.map +0 -1
  176. package/dist/esm/src/message-parser.js.map +0 -1
  177. package/dist/esm/src/message-sender.js.map +0 -1
  178. package/dist/esm/src/monitor.js.map +0 -1
  179. package/dist/esm/src/onboarding.js.map +0 -1
  180. package/dist/esm/src/openclaw-compat.js.map +0 -1
  181. package/dist/esm/src/reqid-store.js.map +0 -1
  182. package/dist/esm/src/runtime.js.map +0 -1
  183. package/dist/esm/src/state-dir-resolve.js.map +0 -1
  184. package/dist/esm/src/state-manager.js.map +0 -1
  185. package/dist/esm/src/template-card-parser.js.map +0 -1
  186. package/dist/esm/src/timeout.js.map +0 -1
  187. package/dist/esm/src/utils.js.map +0 -1
  188. package/dist/esm/src/version.js +0 -23
  189. package/dist/esm/src/version.js.map +0 -1
  190. package/dist/esm/types/index.d.ts +0 -9
  191. package/dist/esm/types/src/version.d.ts +0 -2
  192. /package/dist/{esm/types/src → src}/channel.d.ts +0 -0
  193. /package/dist/{esm/types/src → src}/dm-policy.d.ts +0 -0
  194. /package/dist/{esm/types/src → src}/group-policy.d.ts +0 -0
  195. /package/dist/{esm/types/src → src}/mcp/index.d.ts +0 -0
  196. /package/dist/{esm/types/src → src}/mcp/interceptors/biz-error.d.ts +0 -0
  197. /package/dist/{esm/types/src → src}/mcp/interceptors/index.d.ts +0 -0
  198. /package/dist/{esm/types/src → src}/mcp/interceptors/msg-media.d.ts +0 -0
  199. /package/dist/{esm/types/src → src}/mcp/interceptors/smartpage-create.d.ts +0 -0
  200. /package/dist/{esm/types/src → src}/mcp/interceptors/smartpage-export.d.ts +0 -0
  201. /package/dist/{esm/types/src → src}/mcp/interceptors/types.d.ts +0 -0
  202. /package/dist/{esm/types/src → src}/mcp/schema.d.ts +0 -0
  203. /package/dist/{esm/types/src → src}/mcp/tool.d.ts +0 -0
  204. /package/dist/{esm/types/src → src}/mcp/transport.d.ts +0 -0
  205. /package/dist/{esm/types/src → src}/media-handler.d.ts +0 -0
  206. /package/dist/{esm/types/src → src}/media-uploader.d.ts +0 -0
  207. /package/dist/{esm/types/src → src}/message-parser.d.ts +0 -0
  208. /package/dist/{esm/types/src → src}/monitor.d.ts +0 -0
  209. /package/dist/{esm/types/src → src}/onboarding.d.ts +0 -0
  210. /package/dist/{esm/types/src → src}/reqid-store.d.ts +0 -0
  211. /package/dist/{esm/types/src → src}/runtime.d.ts +0 -0
  212. /package/dist/{esm/types/src → src}/state-dir-resolve.d.ts +0 -0
  213. /package/dist/{esm/types/src → src}/state-manager.d.ts +0 -0
  214. /package/dist/{esm/types/src → src}/template-card-parser.d.ts +0 -0
  215. /package/dist/{esm/types/src → src}/timeout.d.ts +0 -0
@@ -1,158 +0,0 @@
1
- 'use strict';
2
-
3
- var reqidStore = require('./reqid-store.js');
4
- var _const = require('./const.js');
5
-
6
- /**
7
- * 企业微信全局状态管理模块
8
- *
9
- * 负责管理 WSClient 实例、消息状态(带 TTL 清理)、ReqId 存储
10
- * 解决全局 Map 的内存泄漏问题
11
- */
12
- // ============================================================================
13
- // WSClient 实例管理
14
- // ============================================================================
15
- /** WSClient 实例管理 */
16
- const wsClientInstances = new Map();
17
- /**
18
- * 获取指定账户的 WSClient 实例
19
- */
20
- function getWeComWebSocket(accountId) {
21
- return wsClientInstances.get(accountId) ?? null;
22
- }
23
- /**
24
- * 设置指定账户的 WSClient 实例
25
- */
26
- function setWeComWebSocket(accountId, client) {
27
- wsClientInstances.set(accountId, client);
28
- }
29
- /** 消息状态管理 */
30
- const messageStates = new Map();
31
- /** 定期清理定时器 */
32
- let cleanupTimer = null;
33
- /**
34
- * 启动消息状态定期清理(自动 TTL 清理 + 容量限制)
35
- */
36
- function startMessageStateCleanup() {
37
- if (cleanupTimer)
38
- return;
39
- cleanupTimer = setInterval(() => {
40
- pruneMessageStates();
41
- }, _const.MESSAGE_STATE_CLEANUP_INTERVAL_MS);
42
- // 允许进程退出时不阻塞
43
- if (cleanupTimer && typeof cleanupTimer === "object" && "unref" in cleanupTimer) {
44
- cleanupTimer.unref();
45
- }
46
- }
47
- /**
48
- * 停止消息状态定期清理
49
- */
50
- function stopMessageStateCleanup() {
51
- if (cleanupTimer) {
52
- clearInterval(cleanupTimer);
53
- cleanupTimer = null;
54
- }
55
- }
56
- /**
57
- * 清理过期和超量的消息状态条目
58
- */
59
- function pruneMessageStates() {
60
- const now = Date.now();
61
- // 1. 清理过期条目
62
- for (const [key, entry] of messageStates) {
63
- if (now - entry.createdAt >= _const.MESSAGE_STATE_TTL_MS) {
64
- messageStates.delete(key);
65
- }
66
- }
67
- // 2. 容量限制:如果仍超过最大条目数,按时间淘汰最旧的
68
- if (messageStates.size > _const.MESSAGE_STATE_MAX_SIZE) {
69
- const sorted = [...messageStates.entries()].sort((a, b) => a[1].createdAt - b[1].createdAt);
70
- const toRemove = sorted.slice(0, messageStates.size - _const.MESSAGE_STATE_MAX_SIZE);
71
- for (const [key] of toRemove) {
72
- messageStates.delete(key);
73
- }
74
- }
75
- }
76
- /**
77
- * 设置消息状态
78
- */
79
- function setMessageState(messageId, state) {
80
- messageStates.set(messageId, {
81
- state,
82
- createdAt: Date.now(),
83
- });
84
- }
85
- /**
86
- * 删除消息状态
87
- */
88
- function deleteMessageState(messageId) {
89
- messageStates.delete(messageId);
90
- }
91
- // ============================================================================
92
- // ReqId 持久化存储管理(按 accountId 隔离)
93
- // ============================================================================
94
- /**
95
- * ReqId 持久化存储管理
96
- * 参考 createPersistentDedupe 模式:内存 + 磁盘双层、文件锁、原子写入、TTL 过期、防抖写入
97
- * 重启后可从磁盘恢复,确保主动推送消息时能获取到 reqId
98
- */
99
- const reqIdStores = new Map();
100
- function getOrCreateReqIdStore(accountId) {
101
- let store = reqIdStores.get(accountId);
102
- if (!store) {
103
- store = reqidStore.createPersistentReqIdStore();
104
- reqIdStores.set(accountId, store);
105
- }
106
- return store;
107
- }
108
- // ============================================================================
109
- // ReqId 操作函数
110
- // ============================================================================
111
- /**
112
- * 设置 chatId 对应的 reqId(写入内存 + 防抖写磁盘)
113
- */
114
- function setReqIdForChat(chatId, reqId, accountId = "default") {
115
- getOrCreateReqIdStore(accountId).set(chatId, reqId);
116
- }
117
- /**
118
- * 启动时预热 reqId 缓存(从磁盘加载到内存)
119
- *
120
- * 注意:由于移除了磁盘存储,此函数现在只返回 0(无预热条目)
121
- */
122
- async function warmupReqIdStore(accountId = "default", log) {
123
- // 由于移除了磁盘存储,不再需要预热过程
124
- log?.("[WeCom] reqid-store warmup: no-op (disk storage removed)");
125
- return 0;
126
- }
127
- // ============================================================================
128
- // 全局 cleanup(断开连接时释放所有资源)
129
- // ============================================================================
130
- /**
131
- * 清理指定账户的所有资源
132
- */
133
- async function cleanupAccount(accountId) {
134
- // 1. 断开 WSClient
135
- const wsClient = wsClientInstances.get(accountId);
136
- if (wsClient) {
137
- try {
138
- wsClient.disconnect();
139
- }
140
- catch {
141
- // 忽略断开连接时的错误
142
- }
143
- wsClientInstances.delete(accountId);
144
- }
145
- // 2. 由于移除了磁盘存储,不再需要 flush reqId 存储
146
- // 注意:不删除 store,因为重连后可能还需要
147
- }
148
-
149
- exports.cleanupAccount = cleanupAccount;
150
- exports.deleteMessageState = deleteMessageState;
151
- exports.getWeComWebSocket = getWeComWebSocket;
152
- exports.setMessageState = setMessageState;
153
- exports.setReqIdForChat = setReqIdForChat;
154
- exports.setWeComWebSocket = setWeComWebSocket;
155
- exports.startMessageStateCleanup = startMessageStateCleanup;
156
- exports.stopMessageStateCleanup = stopMessageStateCleanup;
157
- exports.warmupReqIdStore = warmupReqIdStore;
158
- //# sourceMappingURL=state-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state-manager.js","sources":["../../../../../src/state-manager.ts"],"sourcesContent":["/**\n * 企业微信全局状态管理模块\n *\n * 负责管理 WSClient 实例、消息状态(带 TTL 清理)、ReqId 存储\n * 解决全局 Map 的内存泄漏问题\n */\n\nimport type { WSClient } from \"@wecom/aibot-node-sdk\";\nimport type { MessageState } from \"./interface.js\";\nimport { createPersistentReqIdStore, type PersistentReqIdStore } from \"./reqid-store.js\";\nimport {\n MESSAGE_STATE_TTL_MS,\n MESSAGE_STATE_CLEANUP_INTERVAL_MS,\n MESSAGE_STATE_MAX_SIZE,\n} from \"./const.js\";\n\n// ============================================================================\n// WSClient 实例管理\n// ============================================================================\n\n/** WSClient 实例管理 */\nconst wsClientInstances = new Map<string, WSClient>();\n\n/**\n * 获取指定账户的 WSClient 实例\n */\nexport function getWeComWebSocket(accountId: string): WSClient | null {\n return wsClientInstances.get(accountId) ?? null;\n}\n\n/**\n * 设置指定账户的 WSClient 实例\n */\nexport function setWeComWebSocket(accountId: string, client: WSClient): void {\n wsClientInstances.set(accountId, client);\n}\n\n/**\n * 删除指定账户的 WSClient 实例\n */\nexport function deleteWeComWebSocket(accountId: string): void {\n wsClientInstances.delete(accountId);\n}\n\n// ============================================================================\n// 消息状态管理(带 TTL 清理,防止内存泄漏)\n// ============================================================================\n\n/** 消息状态条目(带创建时间戳,用于 TTL 清理) */\ninterface MessageStateEntry {\n state: MessageState;\n createdAt: number;\n}\n\n/** 消息状态管理 */\nconst messageStates = new Map<string, MessageStateEntry>();\n\n/** 定期清理定时器 */\nlet cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n/**\n * 启动消息状态定期清理(自动 TTL 清理 + 容量限制)\n */\nexport function startMessageStateCleanup(): void {\n if (cleanupTimer) return;\n\n cleanupTimer = setInterval(() => {\n pruneMessageStates();\n }, MESSAGE_STATE_CLEANUP_INTERVAL_MS);\n\n // 允许进程退出时不阻塞\n if (cleanupTimer && typeof cleanupTimer === \"object\" && \"unref\" in cleanupTimer) {\n cleanupTimer.unref();\n }\n}\n\n/**\n * 停止消息状态定期清理\n */\nexport function stopMessageStateCleanup(): void {\n if (cleanupTimer) {\n clearInterval(cleanupTimer);\n cleanupTimer = null;\n }\n}\n\n/**\n * 清理过期和超量的消息状态条目\n */\nfunction pruneMessageStates(): void {\n const now = Date.now();\n\n // 1. 清理过期条目\n for (const [key, entry] of messageStates) {\n if (now - entry.createdAt >= MESSAGE_STATE_TTL_MS) {\n messageStates.delete(key);\n }\n }\n\n // 2. 容量限制:如果仍超过最大条目数,按时间淘汰最旧的\n if (messageStates.size > MESSAGE_STATE_MAX_SIZE) {\n const sorted = [...messageStates.entries()].sort((a, b) => a[1].createdAt - b[1].createdAt);\n const toRemove = sorted.slice(0, messageStates.size - MESSAGE_STATE_MAX_SIZE);\n for (const [key] of toRemove) {\n messageStates.delete(key);\n }\n }\n}\n\n/**\n * 设置消息状态\n */\nexport function setMessageState(messageId: string, state: MessageState): void {\n messageStates.set(messageId, {\n state,\n createdAt: Date.now(),\n });\n}\n\n/**\n * 获取消息状态\n */\nexport function getMessageState(messageId: string): MessageState | undefined {\n const entry = messageStates.get(messageId);\n if (!entry) return undefined;\n\n // 检查 TTL\n if (Date.now() - entry.createdAt >= MESSAGE_STATE_TTL_MS) {\n messageStates.delete(messageId);\n return undefined;\n }\n return entry.state;\n}\n\n/**\n * 删除消息状态\n */\nexport function deleteMessageState(messageId: string): void {\n messageStates.delete(messageId);\n}\n\n/**\n * 清空所有消息状态\n */\nexport function clearAllMessageStates(): void {\n messageStates.clear();\n}\n\n// ============================================================================\n// ReqId 持久化存储管理(按 accountId 隔离)\n// ============================================================================\n\n/**\n * ReqId 持久化存储管理\n * 参考 createPersistentDedupe 模式:内存 + 磁盘双层、文件锁、原子写入、TTL 过期、防抖写入\n * 重启后可从磁盘恢复,确保主动推送消息时能获取到 reqId\n */\nconst reqIdStores = new Map<string, PersistentReqIdStore>();\n\nfunction getOrCreateReqIdStore(accountId: string): PersistentReqIdStore {\n let store = reqIdStores.get(accountId);\n if (!store) {\n store = createPersistentReqIdStore(accountId);\n reqIdStores.set(accountId, store);\n }\n return store;\n}\n\n// ============================================================================\n// ReqId 操作函数\n// ============================================================================\n\n/**\n * 设置 chatId 对应的 reqId(写入内存 + 防抖写磁盘)\n */\nexport function setReqIdForChat(chatId: string, reqId: string, accountId = \"default\"): void {\n getOrCreateReqIdStore(accountId).set(chatId, reqId);\n}\n\n/**\n * 获取 chatId 对应的 reqId(异步:优先内存,miss 时查磁盘并回填内存)\n */\nexport async function getReqIdForChatAsync(chatId: string, accountId = \"default\"): Promise<string | undefined> {\n return getOrCreateReqIdStore(accountId).get(chatId);\n}\n\n/**\n * 获取 chatId 对应的 reqId(同步:仅内存,保留向后兼容)\n */\nexport function getReqIdForChat(chatId: string, accountId = \"default\"): string | undefined {\n return getOrCreateReqIdStore(accountId).getSync(chatId);\n}\n\n/**\n * 删除 chatId 对应的 reqId\n */\nexport function deleteReqIdForChat(chatId: string, accountId = \"default\"): void {\n getOrCreateReqIdStore(accountId).delete(chatId);\n}\n\n/**\n * 启动时预热 reqId 缓存(从磁盘加载到内存)\n * \n * 注意:由于移除了磁盘存储,此函数现在只返回 0(无预热条目)\n */\nexport async function warmupReqIdStore(\n accountId = \"default\",\n log?: (...args: unknown[]) => void,\n): Promise<number> {\n // 由于移除了磁盘存储,不再需要预热过程\n log?.(\"[WeCom] reqid-store warmup: no-op (disk storage removed)\");\n return 0;\n}\n\n/**\n * 立即将 reqId 数据刷写到磁盘(用于优雅退出)\n * \n * 注意:由于移除了磁盘存储,此函数现在是无操作\n */\nexport async function flushReqIdStore(accountId = \"default\"): Promise<void> {\n // 由于移除了磁盘存储,不再需要刷写操作\n}\n\n// ============================================================================\n// 全局 cleanup(断开连接时释放所有资源)\n// ============================================================================\n\n/**\n * 清理指定账户的所有资源\n */\nexport async function cleanupAccount(accountId: string): Promise<void> {\n // 1. 断开 WSClient\n const wsClient = wsClientInstances.get(accountId);\n if (wsClient) {\n try {\n wsClient.disconnect();\n } catch {\n // 忽略断开连接时的错误\n }\n wsClientInstances.delete(accountId);\n }\n\n // 2. 由于移除了磁盘存储,不再需要 flush reqId 存储\n // 注意:不删除 store,因为重连后可能还需要\n}\n\n/**\n * 清理所有资源(用于进程退出)\n */\nexport async function cleanupAll(): Promise<void> {\n // 停止定期清理\n stopMessageStateCleanup();\n\n // 清理所有 WSClient\n for (const [accountId, wsClient] of wsClientInstances) {\n try {\n wsClient.disconnect();\n } catch {\n // 忽略\n }\n }\n wsClientInstances.clear();\n\n // 由于移除了磁盘存储,不再需要 flush 所有 reqId 存储\n\n // 清空消息状态\n clearAllMessageStates();\n}\n"],"names":["MESSAGE_STATE_CLEANUP_INTERVAL_MS","MESSAGE_STATE_TTL_MS","MESSAGE_STATE_MAX_SIZE","createPersistentReqIdStore"],"mappings":"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"}