@wecom/wecom-openclaw-plugin 2026.3.31-beta.0 → 2026.4.1-beta.1

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 (209) hide show
  1. package/README.md +4 -251
  2. package/dist/cjs/index.js +45 -0
  3. package/dist/cjs/index.js.map +1 -0
  4. package/dist/cjs/src/channel.js +339 -0
  5. package/dist/cjs/src/channel.js.map +1 -0
  6. package/dist/cjs/src/const.js +137 -0
  7. package/dist/cjs/src/const.js.map +1 -0
  8. package/dist/cjs/src/dm-policy.js +89 -0
  9. package/dist/cjs/src/dm-policy.js.map +1 -0
  10. package/dist/cjs/src/group-policy.js +133 -0
  11. package/dist/cjs/src/group-policy.js.map +1 -0
  12. package/dist/cjs/src/mcp/interceptors/biz-error.js +70 -0
  13. package/dist/cjs/src/mcp/interceptors/biz-error.js.map +1 -0
  14. package/dist/cjs/src/mcp/interceptors/index.js +73 -0
  15. package/dist/cjs/src/mcp/interceptors/index.js.map +1 -0
  16. package/dist/cjs/src/mcp/interceptors/msg-media.js +159 -0
  17. package/dist/cjs/src/mcp/interceptors/msg-media.js.map +1 -0
  18. package/dist/cjs/src/mcp/interceptors/smartpage-create.js +157 -0
  19. package/dist/cjs/src/mcp/interceptors/smartpage-create.js.map +1 -0
  20. package/dist/cjs/src/mcp/interceptors/smartpage-export.js +93 -0
  21. package/dist/cjs/src/mcp/interceptors/smartpage-export.js.map +1 -0
  22. package/dist/cjs/src/mcp/schema.js +104 -0
  23. package/dist/cjs/src/mcp/schema.js.map +1 -0
  24. package/dist/cjs/src/mcp/tool.js +208 -0
  25. package/dist/cjs/src/mcp/tool.js.map +1 -0
  26. package/dist/cjs/src/mcp/transport.js +417 -0
  27. package/dist/cjs/src/mcp/transport.js.map +1 -0
  28. package/dist/cjs/src/media-handler.js +129 -0
  29. package/dist/cjs/src/media-handler.js.map +1 -0
  30. package/dist/cjs/src/media-uploader.js +284 -0
  31. package/dist/cjs/src/media-uploader.js.map +1 -0
  32. package/dist/cjs/src/message-parser.js +134 -0
  33. package/dist/cjs/src/message-parser.js.map +1 -0
  34. package/dist/cjs/src/message-sender.js +89 -0
  35. package/dist/cjs/src/message-sender.js.map +1 -0
  36. package/dist/cjs/src/monitor.js +991 -0
  37. package/dist/cjs/src/monitor.js.map +1 -0
  38. package/dist/cjs/src/onboarding.js +182 -0
  39. package/dist/cjs/src/onboarding.js.map +1 -0
  40. package/dist/cjs/src/openclaw-compat.js +400 -0
  41. package/dist/cjs/src/openclaw-compat.js.map +1 -0
  42. package/dist/cjs/src/reqid-store.js +88 -0
  43. package/dist/cjs/src/reqid-store.js.map +1 -0
  44. package/dist/cjs/src/runtime.js +16 -0
  45. package/dist/cjs/src/runtime.js.map +1 -0
  46. package/dist/cjs/src/state-dir-resolve.js +35 -0
  47. package/dist/cjs/src/state-dir-resolve.js.map +1 -0
  48. package/dist/cjs/src/state-manager.js +158 -0
  49. package/dist/cjs/src/state-manager.js.map +1 -0
  50. package/dist/cjs/src/template-card-parser.js +641 -0
  51. package/dist/cjs/src/template-card-parser.js.map +1 -0
  52. package/dist/cjs/src/timeout.js +42 -0
  53. package/dist/cjs/src/timeout.js.map +1 -0
  54. package/dist/cjs/src/utils.js +60 -0
  55. package/dist/cjs/src/utils.js.map +1 -0
  56. package/dist/cjs/src/version.js +26 -0
  57. package/dist/cjs/src/version.js.map +1 -0
  58. package/dist/esm/index.js +41 -0
  59. package/dist/esm/index.js.map +1 -0
  60. package/dist/esm/src/channel.js +337 -0
  61. package/dist/esm/src/channel.js.map +1 -0
  62. package/dist/{src → esm/src}/const.js +30 -77
  63. package/dist/esm/src/const.js.map +1 -0
  64. package/dist/{src → esm/src}/dm-policy.js +9 -6
  65. package/dist/esm/src/dm-policy.js.map +1 -0
  66. package/dist/{src → esm/src}/group-policy.js +7 -3
  67. package/dist/esm/src/group-policy.js.map +1 -0
  68. package/dist/{src → esm/src}/mcp/interceptors/biz-error.js +6 -2
  69. package/dist/esm/src/mcp/interceptors/biz-error.js.map +1 -0
  70. package/dist/{src → esm/src}/mcp/interceptors/index.js +10 -6
  71. package/dist/esm/src/mcp/interceptors/index.js.map +1 -0
  72. package/dist/{src → esm/src}/mcp/interceptors/msg-media.js +10 -6
  73. package/dist/esm/src/mcp/interceptors/msg-media.js.map +1 -0
  74. package/dist/{src → esm/src}/mcp/interceptors/smartpage-create.js +6 -2
  75. package/dist/esm/src/mcp/interceptors/smartpage-create.js.map +1 -0
  76. package/dist/{src → esm/src}/mcp/interceptors/smartpage-export.js +6 -2
  77. package/dist/esm/src/mcp/interceptors/smartpage-export.js.map +1 -0
  78. package/dist/{src → esm/src}/mcp/schema.js +4 -1
  79. package/dist/esm/src/mcp/schema.js.map +1 -0
  80. package/dist/{src → esm/src}/mcp/tool.js +8 -4
  81. package/dist/esm/src/mcp/tool.js.map +1 -0
  82. package/dist/{src → esm/src}/mcp/transport.js +16 -15
  83. package/dist/esm/src/mcp/transport.js.map +1 -0
  84. package/dist/{src → esm/src}/media-handler.js +10 -6
  85. package/dist/esm/src/media-handler.js.map +1 -0
  86. package/dist/{src → esm/src}/media-uploader.js +10 -64
  87. package/dist/esm/src/media-uploader.js.map +1 -0
  88. package/dist/{src → esm/src}/message-parser.js +4 -1
  89. package/dist/esm/src/message-parser.js.map +1 -0
  90. package/dist/{src → esm/src}/message-sender.js +11 -46
  91. package/dist/esm/src/message-sender.js.map +1 -0
  92. package/dist/{src → esm/src}/monitor.js +282 -151
  93. package/dist/esm/src/monitor.js.map +1 -0
  94. package/dist/{src → esm/src}/onboarding.js +26 -22
  95. package/dist/esm/src/onboarding.js.map +1 -0
  96. package/dist/{src → esm/src}/openclaw-compat.js +27 -143
  97. package/dist/esm/src/openclaw-compat.js.map +1 -0
  98. package/dist/{src → esm/src}/reqid-store.js +7 -4
  99. package/dist/esm/src/reqid-store.js.map +1 -0
  100. package/dist/{src → esm/src}/runtime.js +5 -2
  101. package/dist/esm/src/runtime.js.map +1 -0
  102. package/dist/esm/src/state-dir-resolve.js +13 -0
  103. package/dist/esm/src/state-dir-resolve.js.map +1 -0
  104. package/dist/{src → esm/src}/state-manager.js +16 -84
  105. package/dist/esm/src/state-manager.js.map +1 -0
  106. package/dist/{src → esm/src}/template-card-parser.js +8 -17
  107. package/dist/esm/src/template-card-parser.js.map +1 -0
  108. package/dist/{src → esm/src}/timeout.js +5 -2
  109. package/dist/esm/src/timeout.js.map +1 -0
  110. package/dist/{src → esm/src}/utils.js +10 -24
  111. package/dist/esm/src/utils.js.map +1 -0
  112. package/dist/esm/src/version.js +23 -0
  113. package/dist/esm/src/version.js.map +1 -0
  114. package/dist/esm/types/index.d.ts +9 -0
  115. package/dist/{src → esm/types/src}/const.d.ts +0 -46
  116. package/dist/{src → esm/types/src}/interface.d.ts +2 -0
  117. package/dist/{src → esm/types/src}/message-sender.d.ts +0 -18
  118. package/dist/{src → esm/types/src}/openclaw-compat.d.ts +0 -49
  119. package/dist/esm/types/src/state-dir-resolve.d.ts +2 -0
  120. package/dist/{src → esm/types/src}/utils.d.ts +0 -39
  121. package/dist/esm/types/src/version.d.ts +2 -0
  122. package/dist/index.d.ts +4 -2
  123. package/package.json +7 -15
  124. package/dist/index.js +0 -113
  125. package/dist/src/accounts.d.ts +0 -57
  126. package/dist/src/accounts.js +0 -222
  127. package/dist/src/agent/api-client.d.ts +0 -94
  128. package/dist/src/agent/api-client.js +0 -292
  129. package/dist/src/agent/handler.d.ts +0 -63
  130. package/dist/src/agent/handler.js +0 -532
  131. package/dist/src/agent/index.d.ts +0 -5
  132. package/dist/src/agent/index.js +0 -5
  133. package/dist/src/agent/webhook.d.ts +0 -23
  134. package/dist/src/agent/webhook.js +0 -226
  135. package/dist/src/agent/xml.d.ts +0 -21
  136. package/dist/src/agent/xml.js +0 -41
  137. package/dist/src/channel.js +0 -564
  138. package/dist/src/chat-queue.d.ts +0 -31
  139. package/dist/src/chat-queue.js +0 -45
  140. package/dist/src/http.d.ts +0 -26
  141. package/dist/src/http.js +0 -93
  142. package/dist/src/interface.js +0 -4
  143. package/dist/src/mcp/index.js +0 -6
  144. package/dist/src/mcp/interceptors/types.js +0 -7
  145. package/dist/src/shared/command-auth.d.ts +0 -23
  146. package/dist/src/shared/command-auth.js +0 -73
  147. package/dist/src/shared/xml-parser.d.ts +0 -46
  148. package/dist/src/shared/xml-parser.js +0 -210
  149. package/dist/src/target.d.ts +0 -35
  150. package/dist/src/target.js +0 -67
  151. package/dist/src/template-card-manager.d.ts +0 -55
  152. package/dist/src/template-card-manager.js +0 -205
  153. package/dist/src/types/account.d.ts +0 -29
  154. package/dist/src/types/account.js +0 -4
  155. package/dist/src/types/config.d.ts +0 -80
  156. package/dist/src/types/config.js +0 -7
  157. package/dist/src/types/constants.d.ts +0 -42
  158. package/dist/src/types/constants.js +0 -42
  159. package/dist/src/types/index.d.ts +0 -7
  160. package/dist/src/types/index.js +0 -5
  161. package/dist/src/types/message.d.ts +0 -238
  162. package/dist/src/types/message.js +0 -5
  163. package/dist/src/version.d.ts +0 -2
  164. package/dist/src/version.js +0 -24
  165. package/dist/src/webhook/command-auth.d.ts +0 -47
  166. package/dist/src/webhook/command-auth.js +0 -96
  167. package/dist/src/webhook/gateway.d.ts +0 -36
  168. package/dist/src/webhook/gateway.js +0 -227
  169. package/dist/src/webhook/handler.d.ts +0 -18
  170. package/dist/src/webhook/handler.js +0 -420
  171. package/dist/src/webhook/helpers.d.ts +0 -156
  172. package/dist/src/webhook/helpers.js +0 -833
  173. package/dist/src/webhook/http.d.ts +0 -26
  174. package/dist/src/webhook/http.js +0 -94
  175. package/dist/src/webhook/index.d.ts +0 -11
  176. package/dist/src/webhook/index.js +0 -14
  177. package/dist/src/webhook/media.d.ts +0 -29
  178. package/dist/src/webhook/media.js +0 -88
  179. package/dist/src/webhook/monitor.d.ts +0 -59
  180. package/dist/src/webhook/monitor.js +0 -1147
  181. package/dist/src/webhook/state.d.ts +0 -220
  182. package/dist/src/webhook/state.js +0 -491
  183. package/dist/src/webhook/target.d.ts +0 -41
  184. package/dist/src/webhook/target.js +0 -132
  185. package/dist/src/webhook/types.d.ts +0 -347
  186. package/dist/src/webhook/types.js +0 -33
  187. /package/dist/{src → esm/types/src}/channel.d.ts +0 -0
  188. /package/dist/{src → esm/types/src}/dm-policy.d.ts +0 -0
  189. /package/dist/{src → esm/types/src}/group-policy.d.ts +0 -0
  190. /package/dist/{src → esm/types/src}/mcp/index.d.ts +0 -0
  191. /package/dist/{src → esm/types/src}/mcp/interceptors/biz-error.d.ts +0 -0
  192. /package/dist/{src → esm/types/src}/mcp/interceptors/index.d.ts +0 -0
  193. /package/dist/{src → esm/types/src}/mcp/interceptors/msg-media.d.ts +0 -0
  194. /package/dist/{src → esm/types/src}/mcp/interceptors/smartpage-create.d.ts +0 -0
  195. /package/dist/{src → esm/types/src}/mcp/interceptors/smartpage-export.d.ts +0 -0
  196. /package/dist/{src → esm/types/src}/mcp/interceptors/types.d.ts +0 -0
  197. /package/dist/{src → esm/types/src}/mcp/schema.d.ts +0 -0
  198. /package/dist/{src → esm/types/src}/mcp/tool.d.ts +0 -0
  199. /package/dist/{src → esm/types/src}/mcp/transport.d.ts +0 -0
  200. /package/dist/{src → esm/types/src}/media-handler.d.ts +0 -0
  201. /package/dist/{src → esm/types/src}/media-uploader.d.ts +0 -0
  202. /package/dist/{src → esm/types/src}/message-parser.d.ts +0 -0
  203. /package/dist/{src → esm/types/src}/monitor.d.ts +0 -0
  204. /package/dist/{src → esm/types/src}/onboarding.d.ts +0 -0
  205. /package/dist/{src → esm/types/src}/reqid-store.d.ts +0 -0
  206. /package/dist/{src → esm/types/src}/runtime.d.ts +0 -0
  207. /package/dist/{src → esm/types/src}/state-manager.d.ts +0 -0
  208. /package/dist/{src → esm/types/src}/template-card-parser.d.ts +0 -0
  209. /package/dist/{src → esm/types/src}/timeout.d.ts +0 -0
@@ -1,205 +0,0 @@
1
- /**
2
- * 模板卡片管理器
3
- *
4
- * 负责:
5
- * - 模板卡片缓存管理(内存级,带 TTL 和大小限制)
6
- * - 卡片交互事件处理(更新卡片 UI 状态)
7
- * - 模板卡片发送(通过 wsClient.sendMessage 主动推送)
8
- * - 从 LLM 回复中检测并处理模板卡片
9
- */
10
- import { extractTemplateCards } from "./template-card-parser.js";
11
- import { TEMPLATE_CARD_CACHE_TTL_MS, TEMPLATE_CARD_CACHE_MAX_SIZE, } from "./const.js";
12
- const sentTemplateCardByTaskId = new Map();
13
- function getTemplateCardCacheKey(accountId, taskId) {
14
- return `${accountId}:${taskId}`;
15
- }
16
- function pruneTemplateCardCache() {
17
- const now = Date.now();
18
- for (const [key, entry] of sentTemplateCardByTaskId) {
19
- if (now - entry.createdAt >= TEMPLATE_CARD_CACHE_TTL_MS) {
20
- sentTemplateCardByTaskId.delete(key);
21
- }
22
- }
23
- if (sentTemplateCardByTaskId.size <= TEMPLATE_CARD_CACHE_MAX_SIZE) {
24
- return;
25
- }
26
- const sortedEntries = [...sentTemplateCardByTaskId.entries()].sort((a, b) => a[1].createdAt - b[1].createdAt);
27
- const removeCount = sentTemplateCardByTaskId.size - TEMPLATE_CARD_CACHE_MAX_SIZE;
28
- for (const [key] of sortedEntries.slice(0, removeCount)) {
29
- sentTemplateCardByTaskId.delete(key);
30
- }
31
- }
32
- function cloneTemplateCard(card) {
33
- return JSON.parse(JSON.stringify(card));
34
- }
35
- export function saveTemplateCardToCache(params) {
36
- const { accountId, templateCard, runtime } = params;
37
- const taskId = templateCard.task_id;
38
- if (!taskId) {
39
- runtime.log?.("[wecom][template-card] Skip cache: template card has no task_id");
40
- return;
41
- }
42
- sentTemplateCardByTaskId.set(getTemplateCardCacheKey(accountId, taskId), {
43
- templateCard: cloneTemplateCard(templateCard),
44
- createdAt: Date.now(),
45
- });
46
- pruneTemplateCardCache();
47
- }
48
- export function getTemplateCardFromCache(accountId, taskId) {
49
- pruneTemplateCardCache();
50
- const cached = sentTemplateCardByTaskId.get(getTemplateCardCacheKey(accountId, taskId));
51
- if (!cached) {
52
- return undefined;
53
- }
54
- return cloneTemplateCard(cached.templateCard);
55
- }
56
- function buildSelectedOptionMap(templateCardEvent) {
57
- const selectedMap = new Map();
58
- const selectedItems = templateCardEvent?.selected_items?.selected_item ?? [];
59
- for (const item of selectedItems) {
60
- const questionKey = item.question_key?.trim();
61
- if (!questionKey) {
62
- continue;
63
- }
64
- const optionIds = item.option_ids?.option_id?.filter(Boolean) ?? [];
65
- selectedMap.set(questionKey, optionIds);
66
- }
67
- return selectedMap;
68
- }
69
- function applySelectedStateToTemplateCard(params) {
70
- const { templateCard, selectedMap, templateCardEvent } = params;
71
- const nextCard = cloneTemplateCard(templateCard);
72
- if (templateCardEvent?.task_id) {
73
- nextCard.task_id = templateCardEvent.task_id;
74
- }
75
- if (templateCardEvent?.card_type) {
76
- nextCard.card_type = templateCardEvent.card_type;
77
- }
78
- if (nextCard.submit_button?.text) {
79
- nextCard.submit_button.text = "已提交";
80
- }
81
- if (nextCard.checkbox?.question_key) {
82
- const selectedIds = selectedMap.get(nextCard.checkbox.question_key) ?? [];
83
- nextCard.checkbox.disable = true;
84
- if (Array.isArray(nextCard.checkbox.option_list)) {
85
- nextCard.checkbox.option_list = nextCard.checkbox.option_list.map((option) => ({
86
- ...option,
87
- is_checked: selectedIds.includes(option.id),
88
- }));
89
- }
90
- }
91
- if (Array.isArray(nextCard.select_list)) {
92
- nextCard.select_list = nextCard.select_list.map((selection) => {
93
- const selectedIds = selectedMap.get(selection.question_key) ?? [];
94
- return {
95
- ...selection,
96
- disable: true,
97
- selected_id: selectedIds[0] ?? selection.selected_id,
98
- };
99
- });
100
- }
101
- if (nextCard.button_selection?.question_key) {
102
- const selectedIds = selectedMap.get(nextCard.button_selection.question_key) ?? [];
103
- nextCard.button_selection.disable = true;
104
- if (selectedIds[0]) {
105
- nextCard.button_selection.selected_id = selectedIds[0];
106
- }
107
- }
108
- return nextCard;
109
- }
110
- export async function updateTemplateCardOnEvent(params) {
111
- const { frame, accountId, runtime, wsClient } = params;
112
- const body = frame.body;
113
- const templateCardEvent = body.event?.template_card_event;
114
- const taskId = templateCardEvent?.task_id;
115
- if (!taskId) {
116
- runtime.log?.(`[${accountId}] [template-card-update] Skip update: missing task_id in callback`);
117
- return;
118
- }
119
- const cachedCard = getTemplateCardFromCache(accountId, taskId);
120
- if (!cachedCard) {
121
- runtime.log?.(`[${accountId}] [template-card-update] Skip update: task_id=${taskId} not found in cache (cache is in-memory only, may have been cleared after restart)`);
122
- return;
123
- }
124
- const selectedMap = buildSelectedOptionMap(templateCardEvent);
125
- const updatedCard = applySelectedStateToTemplateCard({
126
- templateCard: cachedCard,
127
- selectedMap,
128
- templateCardEvent,
129
- });
130
- await wsClient.updateTemplateCard(frame, updatedCard, [body.from.userid]);
131
- runtime.log?.(`[${accountId}] [template-card-update] Updated card by task_id=${taskId}`);
132
- saveTemplateCardToCache({
133
- accountId,
134
- templateCard: updatedCard,
135
- runtime,
136
- });
137
- }
138
- // ============================================================================
139
- // 模板卡片发送
140
- // ============================================================================
141
- /**
142
- * 逐个发送已提取的模板卡片(通过 wsClient.sendMessage 主动推送)
143
- *
144
- * 发送失败不阻塞流程,仅记录错误日志。
145
- */
146
- export async function sendTemplateCards(params) {
147
- const { wsClient, frame, state, runtime, account, cards } = params;
148
- const body = frame.body;
149
- const chatId = body.chatid || body.from.userid;
150
- for (const card of cards) {
151
- try {
152
- runtime.log?.(`[wecom][template-card] Sending card_type=${card.cardType} to chatId=${chatId}`);
153
- const rawTemplateCard = card.cardJson;
154
- if (typeof rawTemplateCard.card_type !== "string") {
155
- runtime.error?.("[wecom][template-card] Skip sending invalid card: missing card_type");
156
- continue;
157
- }
158
- const templateCard = rawTemplateCard;
159
- await wsClient.sendMessage(chatId, {
160
- msgtype: "template_card",
161
- template_card: templateCard,
162
- });
163
- state.hasTemplateCard = true;
164
- saveTemplateCardToCache({
165
- accountId: account.accountId,
166
- templateCard,
167
- runtime,
168
- });
169
- runtime.log?.(`[wecom][template-card] Card sent successfully: card_type=${card.cardType}`);
170
- }
171
- catch (err) {
172
- runtime.error?.(`[wecom][template-card] Failed to send card: card_type=${card.cardType}, error=${JSON.stringify(err)}`);
173
- }
174
- }
175
- }
176
- // ============================================================================
177
- // 模板卡片检测与处理(从 finishThinkingStream 中分离)
178
- // ============================================================================
179
- /**
180
- * 从累积文本中检测并发送模板卡片。
181
- *
182
- * 在 finishThinkingStream 之前调用,将卡片处理和流关闭解耦。
183
- *
184
- * @returns 移除卡片代码块后的剩余文本(如果没有卡片则返回 null,表示无需修改)
185
- */
186
- export async function processTemplateCardsIfNeeded(params) {
187
- const { state, runtime } = params;
188
- const visibleText = state.accumulatedText?.trim();
189
- if (!visibleText) {
190
- runtime.log?.(`[wecom][template-card] processTemplateCardsIfNeeded: no visibleText, skipping`);
191
- return null;
192
- }
193
- runtime.log?.(`[wecom][template-card] processTemplateCardsIfNeeded: visibleText exists, length=${visibleText.length}, running extractTemplateCards...`);
194
- const logFn = (...args) => {
195
- runtime.log?.(...args);
196
- };
197
- const { cards, remainingText } = extractTemplateCards(state.accumulatedText, logFn);
198
- runtime.log?.(`[wecom][template-card] processTemplateCardsIfNeeded: extractTemplateCards result — cards=${cards.length}, remainingTextLength=${remainingText.length}`);
199
- if (cards.length === 0) {
200
- return null;
201
- }
202
- runtime.log?.(`[wecom][template-card] processTemplateCardsIfNeeded: ${cards.length} card(s) detected, card_types=[${cards.map(c => c.cardType).join(", ")}]`);
203
- await sendTemplateCards({ ...params, cards });
204
- return { remainingText, cardsDetected: true };
205
- }
@@ -1,29 +0,0 @@
1
- /**
2
- * WeCom 账号类型定义
3
- */
4
- import type { WecomAgentConfig, WecomNetworkConfig } from "./config.js";
5
- /**
6
- * 解析后的 Agent 账号
7
- */
8
- export type ResolvedAgentAccount = {
9
- /** 账号 ID */
10
- accountId: string;
11
- /** 是否启用 */
12
- enabled: boolean;
13
- /** 是否配置完整 */
14
- configured: boolean;
15
- /** 企业 ID */
16
- corpId: string;
17
- /** 应用 Secret */
18
- corpSecret: string;
19
- /** 应用 ID (数字,可选) */
20
- agentId?: number;
21
- /** 回调 Token */
22
- token: string;
23
- /** 回调加密密钥 */
24
- encodingAESKey: string;
25
- /** 原始配置 */
26
- config: WecomAgentConfig;
27
- /** 网络配置(来自 channels.wecom.network) */
28
- network?: WecomNetworkConfig;
29
- };
@@ -1,4 +0,0 @@
1
- /**
2
- * WeCom 账号类型定义
3
- */
4
- export {};
@@ -1,80 +0,0 @@
1
- /**
2
- * WeCom 子模块配置类型定义
3
- *
4
- * 注意:顶层配置类型 WeComConfig 定义在 src/utils.ts 中,以平铺结构为准。
5
- * 本文件仅定义 Agent/Bot/DM/Network/Media 等子模块的配置类型。
6
- */
7
- /** 媒体处理配置 */
8
- export type WecomMediaConfig = {
9
- tempDir?: string;
10
- retentionHours?: number;
11
- cleanupOnStart?: boolean;
12
- maxBytes?: number;
13
- };
14
- /** 网络配置 */
15
- export type WecomNetworkConfig = {
16
- timeoutMs?: number;
17
- retries?: number;
18
- retryDelayMs?: number;
19
- /**
20
- * 出口代理(用于企业可信 IP 固定出口场景)。
21
- * 示例: "http://proxy.company.local:3128"
22
- */
23
- egressProxyUrl?: string;
24
- };
25
- /**
26
- * Bot 模式配置 (智能体)
27
- * 用于接收 JSON 格式回调 + 流式回复
28
- */
29
- export type WecomBotConfig = {
30
- /** 智能机器人 ID(用于 Matrix 模式二次身份确认,webhook 模式) */
31
- aibotid?: string;
32
- /** 回调 Token (企微后台生成,webhook 模式必填) */
33
- token?: string;
34
- /** 回调加密密钥 (企微后台生成,webhook 模式必填) */
35
- encodingAESKey?: string;
36
- /**
37
- * BotId 列表(可选,用于审计与告警)。
38
- * - 回调路由优先由 URL + 签名决定;botIds 不参与强制拦截。
39
- * - 当解密后的 aibotid 不在 botIds 中时,仅记录告警日志。
40
- */
41
- botIds?: string[];
42
- /** 接收者 ID (可选,用于解密校验) */
43
- receiveId?: string;
44
- /** 流式消息占位符 */
45
- streamPlaceholderContent?: string;
46
- /** 欢迎语 */
47
- welcomeText?: string;
48
- /** DM 策略: 'open' 允许所有人, 'pairing' 需要配对, 'allowlist' 仅允许列表, 'disabled' 禁用 */
49
- dmPolicy?: 'open' | 'pairing' | 'allowlist' | 'disabled';
50
- /** 允许的用户列表,为空表示允许所有人 */
51
- allowFrom?: Array<string | number>;
52
- /** 连接模式:webhook(默认)或 websocket */
53
- connectionMode?: 'webhook' | 'websocket';
54
- /** 机器人 BotID(websocket 模式必填,企微后台获取) */
55
- botId?: string;
56
- /** 机器人 Secret(websocket 模式必填,企微后台获取) */
57
- secret?: string;
58
- };
59
- /**
60
- * Agent 模式配置 (自建应用)
61
- * 用于接收 XML 格式回调 + API 主动发送
62
- */
63
- export type WecomAgentConfig = {
64
- /** 企业 ID */
65
- corpId: string;
66
- /** 应用 Secret */
67
- corpSecret: string;
68
- /** 应用 ID(可选;不填时可接收回调,但主动发送需具备该字段) */
69
- agentId?: number | string;
70
- /** 回调 Token (企微后台「设置API接收」) */
71
- token: string;
72
- /** 回调加密密钥 (企微后台「设置API接收」) */
73
- encodingAESKey: string;
74
- /** 欢迎语 */
75
- welcomeText?: string;
76
- /** DM 策略: 'open' 允许所有人, 'pairing' 需要配对, 'allowlist' 仅允许列表, 'disabled' 禁用 */
77
- dmPolicy?: 'open' | 'pairing' | 'allowlist' | 'disabled';
78
- /** 允许的用户列表,为空表示允许所有人 */
79
- allowFrom?: Array<string | number>;
80
- };
@@ -1,7 +0,0 @@
1
- /**
2
- * WeCom 子模块配置类型定义
3
- *
4
- * 注意:顶层配置类型 WeComConfig 定义在 src/utils.ts 中,以平铺结构为准。
5
- * 本文件仅定义 Agent/Bot/DM/Network/Media 等子模块的配置类型。
6
- */
7
- export {};
@@ -1,42 +0,0 @@
1
- /**
2
- * WeCom 双模式常量定义
3
- */
4
- /** 固定 Webhook 路径 */
5
- export declare const WEBHOOK_PATHS: {
6
- /** Bot 模式历史兼容路径(不再维护) */
7
- readonly BOT: "/wecom";
8
- /** Bot 模式历史备用兼容路径(不再维护) */
9
- readonly BOT_ALT: "/wecom/bot";
10
- /** Agent 模式历史兼容路径(不再维护) */
11
- readonly AGENT: "/wecom/agent";
12
- /** Bot 模式推荐路径前缀 */
13
- readonly BOT_PLUGIN: "/plugins/wecom/bot";
14
- /** Agent 模式推荐路径前缀 */
15
- readonly AGENT_PLUGIN: "/plugins/wecom/agent";
16
- };
17
- /** 企业微信 API 端点 */
18
- export declare const API_ENDPOINTS: {
19
- readonly GET_TOKEN: "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
20
- readonly SEND_MESSAGE: "https://qyapi.weixin.qq.com/cgi-bin/message/send";
21
- readonly SEND_APPCHAT: "https://qyapi.weixin.qq.com/cgi-bin/appchat/send";
22
- readonly UPLOAD_MEDIA: "https://qyapi.weixin.qq.com/cgi-bin/media/upload";
23
- readonly DOWNLOAD_MEDIA: "https://qyapi.weixin.qq.com/cgi-bin/media/get";
24
- };
25
- /** 各类限制常量 */
26
- export declare const LIMITS: {
27
- /** 文本消息最大字节数 */
28
- readonly TEXT_MAX_BYTES: 2048;
29
- /** Token 刷新缓冲时间 (提前刷新) */
30
- readonly TOKEN_REFRESH_BUFFER_MS: 60000;
31
- /** HTTP 请求超时 */
32
- readonly REQUEST_TIMEOUT_MS: 15000;
33
- /** 最大请求体大小 */
34
- readonly MAX_REQUEST_BODY_SIZE: number;
35
- };
36
- /** AES 加密常量 */
37
- export declare const CRYPTO: {
38
- /** PKCS#7 块大小 */
39
- readonly PKCS7_BLOCK_SIZE: 32;
40
- /** AES Key 长度 */
41
- readonly AES_KEY_LENGTH: 32;
42
- };
@@ -1,42 +0,0 @@
1
- /**
2
- * WeCom 双模式常量定义
3
- */
4
- /** 固定 Webhook 路径 */
5
- export const WEBHOOK_PATHS = {
6
- /** Bot 模式历史兼容路径(不再维护) */
7
- BOT: "/wecom",
8
- /** Bot 模式历史备用兼容路径(不再维护) */
9
- BOT_ALT: "/wecom/bot",
10
- /** Agent 模式历史兼容路径(不再维护) */
11
- AGENT: "/wecom/agent",
12
- /** Bot 模式推荐路径前缀 */
13
- BOT_PLUGIN: "/plugins/wecom/bot",
14
- /** Agent 模式推荐路径前缀 */
15
- AGENT_PLUGIN: "/plugins/wecom/agent",
16
- };
17
- /** 企业微信 API 端点 */
18
- export const API_ENDPOINTS = {
19
- GET_TOKEN: "https://qyapi.weixin.qq.com/cgi-bin/gettoken",
20
- SEND_MESSAGE: "https://qyapi.weixin.qq.com/cgi-bin/message/send",
21
- SEND_APPCHAT: "https://qyapi.weixin.qq.com/cgi-bin/appchat/send",
22
- UPLOAD_MEDIA: "https://qyapi.weixin.qq.com/cgi-bin/media/upload",
23
- DOWNLOAD_MEDIA: "https://qyapi.weixin.qq.com/cgi-bin/media/get",
24
- };
25
- /** 各类限制常量 */
26
- export const LIMITS = {
27
- /** 文本消息最大字节数 */
28
- TEXT_MAX_BYTES: 2048,
29
- /** Token 刷新缓冲时间 (提前刷新) */
30
- TOKEN_REFRESH_BUFFER_MS: 60_000,
31
- /** HTTP 请求超时 */
32
- REQUEST_TIMEOUT_MS: 15_000,
33
- /** 最大请求体大小 */
34
- MAX_REQUEST_BODY_SIZE: 1024 * 1024,
35
- };
36
- /** AES 加密常量 */
37
- export const CRYPTO = {
38
- /** PKCS#7 块大小 */
39
- PKCS7_BLOCK_SIZE: 32,
40
- /** AES Key 长度 */
41
- AES_KEY_LENGTH: 32,
42
- };
@@ -1,7 +0,0 @@
1
- /**
2
- * WeCom 类型统一导出
3
- */
4
- export * from "./constants.js";
5
- export type { WecomMediaConfig, WecomNetworkConfig, WecomBotConfig, WecomAgentConfig, } from "./config.js";
6
- export type { ResolvedAgentAccount, } from "./account.js";
7
- export type { WecomBotInboundBase, WecomBotInboundText, WecomBotInboundVoice, WecomBotInboundVideo, WecomBotInboundStreamRefresh, WecomBotInboundEvent, WecomBotInboundMessage, WecomAgentInboundMessage, WecomInboundQuote, WecomTemplateCard, WecomOutboundMessage, } from "./message.js";
@@ -1,5 +0,0 @@
1
- /**
2
- * WeCom 类型统一导出
3
- */
4
- // 常量
5
- export * from "./constants.js";
@@ -1,238 +0,0 @@
1
- /**
2
- * WeCom 消息类型定义
3
- * Bot 和 Agent 模式共用
4
- */
5
- /**
6
- * Bot 模式入站消息基础结构 (JSON)
7
- */
8
- /**
9
- * **WecomBotInboundBase (Bot 入站消息基类)**
10
- *
11
- * Bot 模式下 JSON 格式回调的基础字段。
12
- * @property msgid 消息 ID
13
- * @property aibotid 机器人 ID
14
- * @property chattype 会话类型: "single" | "group"
15
- * @property chatid 群聊 ID (仅群组时存在)
16
- * @property response_url 下行回复 URL (用于被动响应转主动推送)
17
- * @property from 发送者信息
18
- */
19
- export type WecomBotInboundBase = {
20
- msgid?: string;
21
- aibotid?: string;
22
- chattype?: "single" | "group";
23
- chatid?: string;
24
- response_url?: string;
25
- from?: {
26
- userid?: string;
27
- corpid?: string;
28
- };
29
- msgtype?: string;
30
- /** 附件数量 (部分消息存在) */
31
- attachment_count?: number;
32
- };
33
- export type WecomBotInboundText = WecomBotInboundBase & {
34
- msgtype: "text";
35
- text?: {
36
- content?: string;
37
- };
38
- quote?: WecomInboundQuote;
39
- };
40
- export type WecomBotInboundVoice = WecomBotInboundBase & {
41
- msgtype: "voice";
42
- voice?: {
43
- content?: string;
44
- };
45
- quote?: WecomInboundQuote;
46
- };
47
- export type WecomBotInboundVideo = WecomBotInboundBase & {
48
- msgtype: "video";
49
- video?: {
50
- url?: string;
51
- aeskey?: string;
52
- };
53
- quote?: WecomInboundQuote;
54
- };
55
- export type WecomBotInboundStreamRefresh = WecomBotInboundBase & {
56
- msgtype: "stream";
57
- stream?: {
58
- id?: string;
59
- };
60
- };
61
- export type WecomBotInboundEvent = WecomBotInboundBase & {
62
- msgtype: "event";
63
- create_time?: number;
64
- event?: {
65
- eventtype?: string;
66
- [key: string]: unknown;
67
- };
68
- };
69
- /**
70
- * **WecomInboundQuote (引用消息)**
71
- *
72
- * 消息中引用的原始内容(如回复某条消息)。
73
- * 支持引用文本、图片、混合类型、语音、文件等。
74
- */
75
- export type WecomInboundQuote = {
76
- msgtype?: "text" | "image" | "mixed" | "voice" | "file" | "video";
77
- /** 引用文本内容 */
78
- text?: {
79
- content?: string;
80
- };
81
- /** 引用图片 URL */
82
- image?: {
83
- url?: string;
84
- };
85
- /** 引用混合消息 (图文) */
86
- mixed?: {
87
- msg_item?: Array<{
88
- msgtype: "text" | "image";
89
- text?: {
90
- content?: string;
91
- };
92
- image?: {
93
- url?: string;
94
- };
95
- }>;
96
- };
97
- /** 引用语音 */
98
- voice?: {
99
- content?: string;
100
- };
101
- /** 引用文件 */
102
- file?: {
103
- url?: string;
104
- };
105
- /** 引用视频 */
106
- video?: {
107
- url?: string;
108
- };
109
- };
110
- export type WecomBotInboundMessage = WecomBotInboundText | WecomBotInboundVoice | WecomBotInboundVideo | WecomBotInboundStreamRefresh | WecomBotInboundEvent | (WecomBotInboundBase & {
111
- quote?: WecomInboundQuote;
112
- } & Record<string, unknown>);
113
- /**
114
- * Agent 模式入站消息结构 (解析自 XML)
115
- */
116
- /**
117
- * **WecomAgentInboundMessage (Agent 入站消息)**
118
- *
119
- * Agent 模式下解析自 XML 的扁平化消息结构。
120
- * 键名保持 PascalCase (如 `ToUserName`)。
121
- */
122
- export type WecomAgentInboundMessage = {
123
- ToUserName?: string;
124
- FromUserName?: string;
125
- CreateTime?: number;
126
- MsgType?: string;
127
- MsgId?: string;
128
- AgentID?: number;
129
- Content?: string;
130
- PicUrl?: string;
131
- MediaId?: string;
132
- FileName?: string;
133
- Format?: string;
134
- Recognition?: string;
135
- ThumbMediaId?: string;
136
- Location_X?: number;
137
- Location_Y?: number;
138
- Scale?: number;
139
- Label?: string;
140
- Title?: string;
141
- Description?: string;
142
- Url?: string;
143
- Event?: string;
144
- EventKey?: string;
145
- ChatId?: string;
146
- };
147
- /**
148
- * 模板卡片类型
149
- */
150
- /**
151
- * **WecomTemplateCard (模板卡片)**
152
- *
153
- * 复杂的交互式卡片结构。
154
- * @property card_type 卡片类型: "text_notice" | "news_notice" | "button_interaction" ...
155
- * @property source 来源信息
156
- * @property main_title 主标题
157
- * @property sub_title_text 副标题
158
- * @property horizontal_content_list 水平排列的键值列表
159
- * @property button_list 按钮列表
160
- */
161
- export type WecomTemplateCard = {
162
- card_type: "text_notice" | "news_notice" | "button_interaction" | "vote_interaction" | "multiple_interaction";
163
- source?: {
164
- icon_url?: string;
165
- desc?: string;
166
- desc_color?: number;
167
- };
168
- main_title?: {
169
- title?: string;
170
- desc?: string;
171
- };
172
- task_id?: string;
173
- button_list?: Array<{
174
- text: string;
175
- style?: number;
176
- key: string;
177
- }>;
178
- sub_title_text?: string;
179
- horizontal_content_list?: Array<{
180
- keyname: string;
181
- value?: string;
182
- type?: number;
183
- url?: string;
184
- userid?: string;
185
- }>;
186
- card_action?: {
187
- type: number;
188
- url?: string;
189
- appid?: string;
190
- pagepath?: string;
191
- };
192
- action_menu?: {
193
- desc: string;
194
- action_list: Array<{
195
- text: string;
196
- key: string;
197
- }>;
198
- };
199
- select_list?: Array<{
200
- question_key: string;
201
- title?: string;
202
- selected_id?: string;
203
- option_list: Array<{
204
- id: string;
205
- text: string;
206
- }>;
207
- }>;
208
- submit_button?: {
209
- text: string;
210
- key: string;
211
- };
212
- checkbox?: {
213
- question_key: string;
214
- option_list: Array<{
215
- id: string;
216
- text: string;
217
- is_checked?: boolean;
218
- }>;
219
- mode?: number;
220
- };
221
- };
222
- /**
223
- * 出站消息类型
224
- */
225
- export type WecomOutboundMessage = {
226
- msgtype: "text";
227
- text: {
228
- content: string;
229
- };
230
- } | {
231
- msgtype: "markdown";
232
- markdown: {
233
- content: string;
234
- };
235
- } | {
236
- msgtype: "template_card";
237
- template_card: WecomTemplateCard;
238
- };
@@ -1,5 +0,0 @@
1
- /**
2
- * WeCom 消息类型定义
3
- * Bot 和 Agent 模式共用
4
- */
5
- export {};
@@ -1,2 +0,0 @@
1
- /** 插件版本号,运行时从 package.json 读取 */
2
- export declare const PLUGIN_VERSION: string;