@wecom/wecom-openclaw-plugin 2026.4.2-beta.0 → 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
@@ -0,0 +1,238 @@
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
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * WeCom 消息类型定义
3
+ * Bot 和 Agent 模式共用
4
+ */
5
+ export {};
@@ -2,6 +2,8 @@
2
2
  * 企业微信公共工具函数
3
3
  */
4
4
  import type { OpenClawConfig } from "openclaw/plugin-sdk/core";
5
+ import type { ResolvedAgentAccount } from "./types/account.js";
6
+ import type { WecomAgentConfig, WecomNetworkConfig, WecomMediaConfig, WecomDynamicAgentsConfig } from "./types/config.js";
5
7
  /**
6
8
  * 企业微信群组配置
7
9
  */
@@ -30,7 +32,32 @@ export interface WeComConfig {
30
32
  sendThinkingMessage?: boolean;
31
33
  /** 额外允许访问的本地媒体路径白名单(支持 ~ 表示 home 目录),如 ["~/Downloads", "~/Documents"] */
32
34
  mediaLocalRoots?: string[];
35
+ /** Agent 模式配置(自建应用) */
36
+ agent?: WecomAgentConfig;
37
+ /** 网络配置 */
38
+ network?: WecomNetworkConfig;
39
+ /** 媒体处理配置 */
40
+ media?: WecomMediaConfig;
41
+ /** 动态 Agent 配置 */
42
+ dynamicAgents?: WecomDynamicAgentsConfig;
43
+ /** 连接模式:webhook | websocket(默认 websocket) */
44
+ connectionMode?: "webhook" | "websocket";
45
+ /** Webhook 验证 token */
46
+ token?: string;
47
+ /** AES 加密密钥(43 字符 Base64) */
48
+ encodingAESKey?: string;
49
+ /** 接收方 ID */
50
+ receiveId?: string;
51
+ /** enter_chat 欢迎消息 */
52
+ welcomeText?: string;
53
+ /** 流式占位符提示内容 */
54
+ streamPlaceholderContent?: string;
33
55
  }
56
+ /**
57
+ * 单个企业微信账号的配置类型(用于 accounts 字段下的每个账号)。
58
+ * 与 WeComConfig 字段完全一致,账号级字段会覆盖顶层同名字段。
59
+ */
60
+ export type WeComAccountConfig = Partial<WeComConfig>;
34
61
  export declare const DefaultWsUrl = "wss://openws.work.weixin.qq.com";
35
62
  export interface ResolvedWeComAccount {
36
63
  accountId: string;
@@ -42,6 +69,12 @@ export interface ResolvedWeComAccount {
42
69
  /** 是否发送"思考中"消息,默认为 true */
43
70
  sendThinkingMessage: boolean;
44
71
  config: WeComConfig;
72
+ /** Agent 模式能力(自建应用) */
73
+ agent?: ResolvedAgentAccount;
74
+ /** Webhook 模式配置 */
75
+ token?: string;
76
+ encodingAESKey?: string;
77
+ receiveId?: string;
45
78
  }
46
79
  /**
47
80
  * 解析企业微信账户配置
@@ -51,3 +84,11 @@ export declare function resolveWeComAccount(cfg: OpenClawConfig): ResolvedWeComA
51
84
  * 设置企业微信账户配置
52
85
  */
53
86
  export declare function setWeComAccount(cfg: OpenClawConfig, account: Partial<WeComConfig>): OpenClawConfig;
87
+ /**
88
+ * 解析出口代理 URL(对齐原版 resolveWecomEgressProxyUrl)
89
+ *
90
+ * 优先级:
91
+ * 1. config.channels.wecom.network.egressProxyUrl
92
+ * 2. 环境变量:OPENCLAW_WECOM_EGRESS_PROXY_URL → WECOM_EGRESS_PROXY_URL → HTTPS_PROXY → ALL_PROXY → HTTP_PROXY
93
+ */
94
+ export declare function resolveWecomEgressProxyUrl(cfg: OpenClawConfig): string | undefined;
@@ -1,19 +1,18 @@
1
- import { DEFAULT_ACCOUNT_ID } from './openclaw-compat.js';
2
- import { CHANNEL_ID } from './const.js';
3
-
4
1
  /**
5
2
  * 企业微信公共工具函数
6
3
  */
7
- const DefaultWsUrl = "wss://openws.work.weixin.qq.com";
4
+ import { DEFAULT_ACCOUNT_ID } from "./openclaw-compat.js";
5
+ import { CHANNEL_ID } from "./const.js";
6
+ export const DefaultWsUrl = "wss://openws.work.weixin.qq.com";
8
7
  /**
9
8
  * 解析企业微信账户配置
10
9
  */
11
- function resolveWeComAccount(cfg) {
10
+ export function resolveWeComAccount(cfg) {
12
11
  const wecomConfig = (cfg.channels?.[CHANNEL_ID] ?? {});
13
12
  return {
14
13
  accountId: DEFAULT_ACCOUNT_ID,
15
14
  name: wecomConfig.name ?? "企业微信",
16
- enabled: wecomConfig.enabled ?? false,
15
+ enabled: wecomConfig.enabled !== false,
17
16
  websocketUrl: wecomConfig.websocketUrl || DefaultWsUrl,
18
17
  botId: wecomConfig.botId ?? "",
19
18
  secret: wecomConfig.secret ?? "",
@@ -24,7 +23,7 @@ function resolveWeComAccount(cfg) {
24
23
  /**
25
24
  * 设置企业微信账户配置
26
25
  */
27
- function setWeComAccount(cfg, account) {
26
+ export function setWeComAccount(cfg, account) {
28
27
  const existing = (cfg.channels?.[CHANNEL_ID] ?? {});
29
28
  const merged = {
30
29
  enabled: account.enabled ?? existing?.enabled ?? true,
@@ -51,6 +50,21 @@ function setWeComAccount(cfg, account) {
51
50
  },
52
51
  };
53
52
  }
54
-
55
- export { DefaultWsUrl, resolveWeComAccount, setWeComAccount };
56
- //# sourceMappingURL=utils.js.map
53
+ /**
54
+ * 解析出口代理 URL(对齐原版 resolveWecomEgressProxyUrl)
55
+ *
56
+ * 优先级:
57
+ * 1. config.channels.wecom.network.egressProxyUrl
58
+ * 2. 环境变量:OPENCLAW_WECOM_EGRESS_PROXY_URL → WECOM_EGRESS_PROXY_URL → HTTPS_PROXY → ALL_PROXY → HTTP_PROXY
59
+ */
60
+ export function resolveWecomEgressProxyUrl(cfg) {
61
+ const wecom = (cfg.channels?.[CHANNEL_ID] ?? {});
62
+ const proxyUrl = wecom.network?.egressProxyUrl ??
63
+ process.env.OPENCLAW_WECOM_EGRESS_PROXY_URL ??
64
+ process.env.WECOM_EGRESS_PROXY_URL ??
65
+ process.env.HTTPS_PROXY ??
66
+ process.env.ALL_PROXY ??
67
+ process.env.HTTP_PROXY ??
68
+ "";
69
+ return proxyUrl.trim() || undefined;
70
+ }
@@ -0,0 +1,2 @@
1
+ /** 插件版本号,运行时从 package.json 读取 */
2
+ export declare const PLUGIN_VERSION: string;
@@ -0,0 +1,24 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ /**
5
+ * 从当前文件位置向上逐级查找 package.json
6
+ * - ts 源码直接运行时(tsx/ts-node):src/version.ts → 向上 1 级
7
+ * - tsc 编译后运行时:dist/src/version.js → 向上 2 级
8
+ */
9
+ const findPackageJson = () => {
10
+ let dir = dirname(fileURLToPath(import.meta.url));
11
+ while (true) {
12
+ const candidate = resolve(dir, "package.json");
13
+ if (existsSync(candidate))
14
+ return candidate;
15
+ const parent = dirname(dir);
16
+ if (parent === dir)
17
+ break; // 已到文件系统根目录
18
+ dir = parent;
19
+ }
20
+ throw new Error("找不到 package.json");
21
+ };
22
+ const pkg = JSON.parse(readFileSync(findPackageJson(), "utf-8"));
23
+ /** 插件版本号,运行时从 package.json 读取 */
24
+ export const PLUGIN_VERSION = pkg.version ?? "";
@@ -0,0 +1,47 @@
1
+ /**
2
+ * 命令授权(Command Authorization)
3
+ *
4
+ * 从 lh 版 shared/command-auth.ts 迁移。
5
+ * 适配新版 WeComConfig(dmPolicy / allowFrom 扁平化在顶层)。
6
+ */
7
+ import type { OpenClawConfig, PluginRuntime } from "openclaw/plugin-sdk";
8
+ import type { WeComConfig } from "../utils.js";
9
+ /** 命令授权结果 */
10
+ export interface WecomCommandAuthResult {
11
+ /** 当前消息是否是需要鉴权的命令 */
12
+ shouldComputeAuth: boolean;
13
+ /** 账号配置的私信策略 */
14
+ dmPolicy: "pairing" | "allowlist" | "open" | "disabled";
15
+ /** 当前发送者是否在白名单中 */
16
+ senderAllowed: boolean;
17
+ /** 是否配置了授权器 */
18
+ authorizerConfigured: boolean;
19
+ /** 最终授权结果:true=放行,false=拒绝,undefined=不需要鉴权 */
20
+ commandAuthorized: boolean | undefined;
21
+ /** 生效的白名单列表 */
22
+ effectiveAllowFrom: string[];
23
+ }
24
+ /**
25
+ * 解析命令授权状态
26
+ *
27
+ * 适配新版 WeComConfig 的扁平化字段:
28
+ * - dmPolicy → accountConfig.dmPolicy
29
+ * - allowFrom → accountConfig.allowFrom
30
+ */
31
+ export declare function resolveWecomCommandAuthorization(params: {
32
+ core: PluginRuntime;
33
+ cfg: OpenClawConfig;
34
+ accountConfig: WeComConfig;
35
+ rawBody: string;
36
+ senderUserId: string;
37
+ }): Promise<WecomCommandAuthResult>;
38
+ /**
39
+ * 构建未授权命令的中文提示文案
40
+ *
41
+ * @param scope - "bot"(智能机器人)或 "agent"(自建应用)
42
+ */
43
+ export declare function buildWecomUnauthorizedCommandPrompt(params: {
44
+ senderUserId: string;
45
+ dmPolicy: "pairing" | "allowlist" | "open" | "disabled";
46
+ scope: "bot" | "agent";
47
+ }): string;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * 命令授权(Command Authorization)
3
+ *
4
+ * 从 lh 版 shared/command-auth.ts 迁移。
5
+ * 适配新版 WeComConfig(dmPolicy / allowFrom 扁平化在顶层)。
6
+ */
7
+ // ============================================================================
8
+ // 内部工具函数
9
+ // ============================================================================
10
+ /** 归一化白名单条目:去除空格、统一小写、去掉 wecom:/user:/userid: 前缀 */
11
+ function normalizeWecomAllowFromEntry(raw) {
12
+ return raw
13
+ .trim()
14
+ .toLowerCase()
15
+ .replace(/^wecom:/, "")
16
+ .replace(/^user:/, "")
17
+ .replace(/^userid:/, "");
18
+ }
19
+ /** 判断发送者是否在白名单中 */
20
+ function isWecomSenderAllowed(senderUserId, allowFrom) {
21
+ const list = allowFrom.map((entry) => normalizeWecomAllowFromEntry(entry)).filter(Boolean);
22
+ if (list.includes("*"))
23
+ return true;
24
+ const normalizedSender = normalizeWecomAllowFromEntry(senderUserId);
25
+ if (!normalizedSender)
26
+ return false;
27
+ return list.includes(normalizedSender);
28
+ }
29
+ /**
30
+ * 解析命令授权状态
31
+ *
32
+ * 适配新版 WeComConfig 的扁平化字段:
33
+ * - dmPolicy → accountConfig.dmPolicy
34
+ * - allowFrom → accountConfig.allowFrom
35
+ */
36
+ export async function resolveWecomCommandAuthorization(params) {
37
+ const { core, cfg, accountConfig, rawBody, senderUserId } = params;
38
+ const dmPolicy = (accountConfig.dmPolicy ?? "pairing");
39
+ const configAllowFrom = (accountConfig.allowFrom ?? []).map((v) => String(v));
40
+ const shouldComputeAuth = core.channel.commands.shouldComputeCommandAuthorized(rawBody, cfg);
41
+ // WeCom channel 不支持 pairing CLI("Channel wecom does not support pairing"),
42
+ // 因此 pairing 策略等同于 allowlist。
43
+ // Policy 语义:
44
+ // - open: 命令对所有人放行(除非更高层级的 access-groups 拒绝)
45
+ // - allowlist: 命令需要 allowFrom 白名单
46
+ // - pairing: 等同 allowlist(因 WeCom 不支持 pairing CLI)
47
+ const effectiveAllowFrom = dmPolicy === "open" ? ["*"] : configAllowFrom;
48
+ const senderAllowed = isWecomSenderAllowed(senderUserId, effectiveAllowFrom);
49
+ const allowAllConfigured = effectiveAllowFrom.some((entry) => normalizeWecomAllowFromEntry(entry) === "*");
50
+ const authorizerConfigured = allowAllConfigured || effectiveAllowFrom.length > 0;
51
+ const useAccessGroups = cfg.commands?.useAccessGroups !== false;
52
+ const commandAuthorized = shouldComputeAuth
53
+ ? core.channel.commands.resolveCommandAuthorizedFromAuthorizers({
54
+ useAccessGroups,
55
+ authorizers: [{ configured: authorizerConfigured, allowed: senderAllowed }],
56
+ })
57
+ : undefined;
58
+ return {
59
+ shouldComputeAuth,
60
+ dmPolicy,
61
+ senderAllowed,
62
+ authorizerConfigured,
63
+ commandAuthorized,
64
+ effectiveAllowFrom,
65
+ };
66
+ }
67
+ // ============================================================================
68
+ // 未授权提示文案构建
69
+ // ============================================================================
70
+ /**
71
+ * 构建未授权命令的中文提示文案
72
+ *
73
+ * @param scope - "bot"(智能机器人)或 "agent"(自建应用)
74
+ */
75
+ export function buildWecomUnauthorizedCommandPrompt(params) {
76
+ const user = params.senderUserId || "unknown";
77
+ const policy = params.dmPolicy;
78
+ const scopeLabel = params.scope === "bot" ? "Bot(智能机器人)" : "Agent(自建应用)";
79
+ const dmPrefix = params.scope === "bot" ? "channels.wecom.bot" : "channels.wecom.agent";
80
+ const allowCmd = (value) => `openclaw config set ${dmPrefix}.allowFrom '${value}'`;
81
+ const policyCmd = (value) => `openclaw config set ${dmPrefix}.dmPolicy "${value}"`;
82
+ if (policy === "disabled") {
83
+ return [
84
+ `无权限执行命令(${scopeLabel} 已禁用:dmPolicy=disabled)`,
85
+ `触发者:${user}`,
86
+ `管理员:${policyCmd("open")}(全放开)或 ${policyCmd("allowlist")}(白名单)`,
87
+ ].join("\n");
88
+ }
89
+ return [
90
+ `无权限执行命令(入口:${scopeLabel},userid:${user})`,
91
+ `管理员全放开:${policyCmd("open")}`,
92
+ `管理员放行该用户:${policyCmd("allowlist")}`,
93
+ `然后设置白名单:${allowCmd(JSON.stringify([user]))}`,
94
+ `如果仍被拦截:检查 commands.useAccessGroups/访问组`,
95
+ ].join("\n");
96
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Webhook Gateway 生命周期管理
3
+ *
4
+ * 从 @mocrane/wecom gateway-monitor.ts 部分迁移(仅 Webhook 部分)。
5
+ * 负责:初始化状态、注册 Target、启停管理。
6
+ *
7
+ * 关键设计:
8
+ * - MonitorState 是全局单例(monitorState),所有账号共享同一个 StreamStore 和 ActiveReplyStore
9
+ * - Target 注册/注销不影响 monitorState 生命周期,只控制 pruneTimer 的启停
10
+ * - 每个账号注册多条路径(兼容历史路径 + 推荐路径 + 多账号路径)
11
+ * - 按 accountId 管理各自的 unregister,stop 时只注销该账号的 Target
12
+ */
13
+ import type { WebhookGatewayContext } from "./types.js";
14
+ import { WebhookMonitorState } from "./state.js";
15
+ /**
16
+ * 获取当前的 MonitorState 实例(全局单例)
17
+ *
18
+ * 供 monitor.ts 等内部模块调用以访问 StreamStore 和 ActiveReplyStore。
19
+ */
20
+ export declare function getMonitorState(): WebhookMonitorState;
21
+ /**
22
+ * 启动 Webhook Gateway
23
+ *
24
+ * 1. 验证 Webhook 配置
25
+ * 2. 确保 pruneTimer 启动
26
+ * 3. 设置 FlushHandler(仅首次)
27
+ * 4. 解析并注册多条 Webhook 路径
28
+ */
29
+ export declare function startWebhookGateway(ctx: WebhookGatewayContext): void;
30
+ /**
31
+ * 停止 Webhook Gateway
32
+ *
33
+ * 1. 注销该账号的 Target(不影响其他账号)
34
+ * 2. 如果没有任何活跃 Target,停止清理定时器
35
+ */
36
+ export declare function stopWebhookGateway(ctx: WebhookGatewayContext): void;