ylib-wecom-openclaw-plugin 2026.4.29

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 (180) hide show
  1. package/README.md +596 -0
  2. package/dist/index.d.ts +10 -0
  3. package/dist/index.js +99 -0
  4. package/dist/src/accounts.d.ts +57 -0
  5. package/dist/src/accounts.js +247 -0
  6. package/dist/src/agent/api-client.d.ts +95 -0
  7. package/dist/src/agent/api-client.js +425 -0
  8. package/dist/src/agent/handler.d.ts +64 -0
  9. package/dist/src/agent/handler.js +731 -0
  10. package/dist/src/agent/index.d.ts +5 -0
  11. package/dist/src/agent/index.js +21 -0
  12. package/dist/src/agent/webhook.d.ts +25 -0
  13. package/dist/src/agent/webhook.js +294 -0
  14. package/dist/src/agent/xml.d.ts +21 -0
  15. package/dist/src/agent/xml.js +43 -0
  16. package/dist/src/channel.d.ts +5 -0
  17. package/dist/src/channel.js +815 -0
  18. package/dist/src/chat-queue.d.ts +31 -0
  19. package/dist/src/chat-queue.js +53 -0
  20. package/dist/src/config-schema.d.ts +587 -0
  21. package/dist/src/config-schema.js +146 -0
  22. package/dist/src/const.d.ts +128 -0
  23. package/dist/src/const.js +168 -0
  24. package/dist/src/dm-policy.d.ts +29 -0
  25. package/dist/src/dm-policy.js +146 -0
  26. package/dist/src/dynamic-agent.d.ts +37 -0
  27. package/dist/src/dynamic-agent.js +67 -0
  28. package/dist/src/dynamic-routing.d.ts +65 -0
  29. package/dist/src/dynamic-routing.js +62 -0
  30. package/dist/src/endpoint-dispatch.d.ts +54 -0
  31. package/dist/src/endpoint-dispatch.js +967 -0
  32. package/dist/src/endpoint-event-adapter.d.ts +15 -0
  33. package/dist/src/endpoint-event-adapter.js +427 -0
  34. package/dist/src/group-policy.d.ts +30 -0
  35. package/dist/src/group-policy.js +126 -0
  36. package/dist/src/http.d.ts +27 -0
  37. package/dist/src/http.js +168 -0
  38. package/dist/src/im-runtime-telemetry.d.ts +25 -0
  39. package/dist/src/im-runtime-telemetry.js +68 -0
  40. package/dist/src/interface.d.ts +192 -0
  41. package/dist/src/interface.js +5 -0
  42. package/dist/src/markdown-chunk.d.ts +1 -0
  43. package/dist/src/markdown-chunk.js +396 -0
  44. package/dist/src/mcp/index.d.ts +6 -0
  45. package/dist/src/mcp/index.js +28 -0
  46. package/dist/src/mcp/interceptors/biz-error.d.ts +11 -0
  47. package/dist/src/mcp/interceptors/biz-error.js +73 -0
  48. package/dist/src/mcp/interceptors/doc-auth-error.d.ts +10 -0
  49. package/dist/src/mcp/interceptors/doc-auth-error.js +235 -0
  50. package/dist/src/mcp/interceptors/index.d.ts +35 -0
  51. package/dist/src/mcp/interceptors/index.js +143 -0
  52. package/dist/src/mcp/interceptors/msg-media.d.ts +11 -0
  53. package/dist/src/mcp/interceptors/msg-media.js +201 -0
  54. package/dist/src/mcp/interceptors/smartpage-create.d.ts +30 -0
  55. package/dist/src/mcp/interceptors/smartpage-create.js +252 -0
  56. package/dist/src/mcp/interceptors/smartpage-export.d.ts +17 -0
  57. package/dist/src/mcp/interceptors/smartpage-export.js +135 -0
  58. package/dist/src/mcp/interceptors/smartsheet-upload.d.ts +22 -0
  59. package/dist/src/mcp/interceptors/smartsheet-upload.js +388 -0
  60. package/dist/src/mcp/interceptors/types.d.ts +64 -0
  61. package/dist/src/mcp/interceptors/types.js +8 -0
  62. package/dist/src/mcp/schema.d.ts +11 -0
  63. package/dist/src/mcp/schema.js +115 -0
  64. package/dist/src/mcp/tool.d.ts +63 -0
  65. package/dist/src/mcp/tool.js +318 -0
  66. package/dist/src/mcp/transport.d.ts +94 -0
  67. package/dist/src/mcp/transport.js +702 -0
  68. package/dist/src/media-handler.d.ts +55 -0
  69. package/dist/src/media-handler.js +306 -0
  70. package/dist/src/media-uploader.d.ts +142 -0
  71. package/dist/src/media-uploader.js +446 -0
  72. package/dist/src/message-parser.d.ts +104 -0
  73. package/dist/src/message-parser.js +232 -0
  74. package/dist/src/message-sender.d.ts +54 -0
  75. package/dist/src/message-sender.js +210 -0
  76. package/dist/src/monitor.d.ts +69 -0
  77. package/dist/src/monitor.js +1846 -0
  78. package/dist/src/onboarding.d.ts +8 -0
  79. package/dist/src/onboarding.js +248 -0
  80. package/dist/src/openclaw-compat.d.ts +148 -0
  81. package/dist/src/openclaw-compat.js +839 -0
  82. package/dist/src/proactive-markdown-send.d.ts +14 -0
  83. package/dist/src/proactive-markdown-send.js +205 -0
  84. package/dist/src/reqid-store.d.ts +23 -0
  85. package/dist/src/reqid-store.js +136 -0
  86. package/dist/src/runtime.d.ts +2 -0
  87. package/dist/src/runtime.js +7 -0
  88. package/dist/src/shared/command-auth.d.ts +23 -0
  89. package/dist/src/shared/command-auth.js +112 -0
  90. package/dist/src/shared/xml-parser.d.ts +46 -0
  91. package/dist/src/shared/xml-parser.js +228 -0
  92. package/dist/src/state-dir-resolve.d.ts +2 -0
  93. package/dist/src/state-dir-resolve.js +33 -0
  94. package/dist/src/state-manager.d.ts +115 -0
  95. package/dist/src/state-manager.js +413 -0
  96. package/dist/src/target.d.ts +35 -0
  97. package/dist/src/target.js +71 -0
  98. package/dist/src/template-card-manager.d.ts +55 -0
  99. package/dist/src/template-card-manager.js +316 -0
  100. package/dist/src/template-card-parser.d.ts +37 -0
  101. package/dist/src/template-card-parser.js +672 -0
  102. package/dist/src/timeout.d.ts +20 -0
  103. package/dist/src/timeout.js +57 -0
  104. package/dist/src/types/account.d.ts +29 -0
  105. package/dist/src/types/account.js +5 -0
  106. package/dist/src/types/config.d.ts +98 -0
  107. package/dist/src/types/config.js +8 -0
  108. package/dist/src/types/constants.d.ts +42 -0
  109. package/dist/src/types/constants.js +45 -0
  110. package/dist/src/types/index.d.ts +7 -0
  111. package/dist/src/types/index.js +17 -0
  112. package/dist/src/types/message.d.ts +238 -0
  113. package/dist/src/types/message.js +6 -0
  114. package/dist/src/utils.d.ts +148 -0
  115. package/dist/src/utils.js +92 -0
  116. package/dist/src/version.d.ts +2 -0
  117. package/dist/src/version.js +28 -0
  118. package/dist/src/webhook/command-auth.d.ts +47 -0
  119. package/dist/src/webhook/command-auth.js +137 -0
  120. package/dist/src/webhook/gateway.d.ts +36 -0
  121. package/dist/src/webhook/gateway.js +297 -0
  122. package/dist/src/webhook/handler.d.ts +19 -0
  123. package/dist/src/webhook/handler.js +481 -0
  124. package/dist/src/webhook/helpers.d.ts +157 -0
  125. package/dist/src/webhook/helpers.js +936 -0
  126. package/dist/src/webhook/http.d.ts +27 -0
  127. package/dist/src/webhook/http.js +168 -0
  128. package/dist/src/webhook/index.d.ts +11 -0
  129. package/dist/src/webhook/index.js +43 -0
  130. package/dist/src/webhook/media.d.ts +30 -0
  131. package/dist/src/webhook/media.js +152 -0
  132. package/dist/src/webhook/monitor.d.ts +59 -0
  133. package/dist/src/webhook/monitor.js +1672 -0
  134. package/dist/src/webhook/state.d.ts +220 -0
  135. package/dist/src/webhook/state.js +568 -0
  136. package/dist/src/webhook/target.d.ts +41 -0
  137. package/dist/src/webhook/target.js +165 -0
  138. package/dist/src/webhook/types.d.ts +348 -0
  139. package/dist/src/webhook/types.js +36 -0
  140. package/dist/src/webhook/video-frame.d.ts +13 -0
  141. package/dist/src/webhook/video-frame.js +108 -0
  142. package/openclaw.plugin.json +19 -0
  143. package/package.json +96 -0
  144. package/schema.json +534 -0
  145. package/scripts/generate-schema.mjs +33 -0
  146. package/skills/wecom-contact/SKILL.md +162 -0
  147. package/skills/wecom-doc/SKILL.md +162 -0
  148. package/skills/wecom-doc/references/create-doc.md +56 -0
  149. package/skills/wecom-doc/references/edit-doc-content.md +68 -0
  150. package/skills/wecom-doc/references/get-doc-content.md +88 -0
  151. package/skills/wecom-doc/references/smartpage-create.md +125 -0
  152. package/skills/wecom-doc/references/smartpage-export.md +160 -0
  153. package/skills/wecom-meeting/SKILL.md +441 -0
  154. package/skills/wecom-meeting/references/example-full.md +30 -0
  155. package/skills/wecom-meeting/references/example-reminder.md +46 -0
  156. package/skills/wecom-meeting/references/example-security.md +22 -0
  157. package/skills/wecom-meeting/references/response-get-meeting-info.md +148 -0
  158. package/skills/wecom-msg/SKILL.md +157 -0
  159. package/skills/wecom-msg/references/api-get-messages.md +93 -0
  160. package/skills/wecom-msg/references/api-get-msg-chat-list.md +58 -0
  161. package/skills/wecom-msg/references/api-get-msg-media.md +44 -0
  162. package/skills/wecom-msg/references/api-send-message.md +39 -0
  163. package/skills/wecom-preflight/SKILL.md +141 -0
  164. package/skills/wecom-schedule/SKILL.md +161 -0
  165. package/skills/wecom-schedule/references/api-check-availability.md +56 -0
  166. package/skills/wecom-schedule/references/api-create-schedule.md +38 -0
  167. package/skills/wecom-schedule/references/api-get-schedule-detail.md +81 -0
  168. package/skills/wecom-schedule/references/api-update-schedule.md +32 -0
  169. package/skills/wecom-schedule/references/ref-reminders.md +24 -0
  170. package/skills/wecom-send-media/SKILL.md +68 -0
  171. package/skills/wecom-send-template-card/SKILL.md +157 -0
  172. package/skills/wecom-send-template-card/references/api-template-card-types.md +358 -0
  173. package/skills/wecom-smartsheet/SKILL.md +164 -0
  174. package/skills/wecom-smartsheet/references/smartsheet-cell-value-formats.md +163 -0
  175. package/skills/wecom-smartsheet/references/smartsheet-field-types.md +44 -0
  176. package/skills/wecom-smartsheet/references/smartsheet-get-records.md +96 -0
  177. package/skills/wecom-smartsheet/references/webhook-examples.md +185 -0
  178. package/skills/wecom-smartsheet/references/webhook-fallback.md +184 -0
  179. package/skills/wecom-todo/SKILL.md +392 -0
  180. package/skills/wecom-todo/examples/workflows.md +163 -0
@@ -0,0 +1,148 @@
1
+ /**
2
+ * 企业微信公共工具函数
3
+ */
4
+ import type { OpenClawConfig } from "ylib-openclaw/plugin-sdk";
5
+ import type { ResolvedAgentAccount } from "./types/account.js";
6
+ import type { WecomAgentConfig, WecomNetworkConfig, WecomMediaConfig, WecomDynamicAgentsConfig } from "./types/config.js";
7
+ /**
8
+ * 企业微信群组配置
9
+ */
10
+ export interface WeComGroupConfig {
11
+ /** 群组内发送者白名单(仅列表中的成员消息会被处理) */
12
+ allowFrom?: Array<string | number>;
13
+ }
14
+ /**
15
+ * 企业微信配置类型
16
+ */
17
+ export interface WeComConfig {
18
+ /** 是否启用该账号。false 时账号不会启动连接与收发。 */
19
+ enabled?: boolean;
20
+ /** Bot WebSocket 地址。默认官方 `wss://openws.work.weixin.qq.com`。 */
21
+ websocketUrl?: string;
22
+ /** Bot 模式凭证:机器人 ID。 */
23
+ botId?: string;
24
+ /** Bot 模式凭证:机器人 Secret。 */
25
+ secret?: string;
26
+ /** Python/Gateway 基础地址(例如 `http://127.0.0.1:8000`)。 */
27
+ gatewayBaseUrl?: string;
28
+ /** Gateway 鉴权令牌;用于 endpoint 请求与媒体上传下载鉴权。 */
29
+ gatewayToken?: string;
30
+ /** 调用 Python endpoint 时使用的模型名(默认 `main`)。 */
31
+ modelName?: string;
32
+ /** 调用 Python endpoint 时使用的 agentId(默认 `main`)。 */
33
+ agentId?: string;
34
+ /** 媒体上传基址;入站附件上传到 `{uploadHost}/api/media/upload`。 */
35
+ uploadHost?: string;
36
+ /** 作用域类型(camelCase,只读,运行时注入)。 */
37
+ scopeType?: string;
38
+ /** 作用域类型(snake/camel 历史兼容字段,只读,运行时注入)。 */
39
+ scope_kind?: string;
40
+ /** 作用域类型(snake/camel 历史兼容字段,只读,运行时注入)。 */
41
+ scopeKind?: string;
42
+ /** 作用域类型(snake/camel 历史兼容字段,只读,运行时注入)。 */
43
+ scope_type?: string;
44
+ /** 是否按单聊/群聊区分 session(固定值,默认 true) */
45
+ separateSessionByConversation?: boolean;
46
+ /** 群聊会话隔离策略(固定值,默认 group_sender) */
47
+ groupSessionScope?: "group" | "group_sender";
48
+ /** Workspace ID(camelCase,只读,运行时注入)。 */
49
+ workspaceId?: string;
50
+ /** Workspace ID(snake_case 兼容字段,只读,运行时注入)。 */
51
+ workspace_id?: string;
52
+ /** 项目 ID(camelCase 兼容字段,只读,运行时注入)。 */
53
+ projectId?: string;
54
+ /** 项目 ID(snake_case 兼容字段,只读,运行时注入)。 */
55
+ project_id?: string;
56
+ /** 账号展示名称(用于列表显示与日志标识)。 */
57
+ name?: string;
58
+ /** 私聊发送者白名单(与 dmPolicy 联动)。 */
59
+ allowFrom?: Array<string | number>;
60
+ /** 私聊访问策略。 */
61
+ dmPolicy?: "open" | "allowlist" | "pairing" | "disabled";
62
+ /** 群组访问策略:"open" = 允许所有群组(默认),"allowlist" = 仅允许 groupAllowFrom 中的群组,"disabled" = 禁用群组消息 */
63
+ groupPolicy?: "open" | "allowlist" | "disabled";
64
+ /** 群组白名单(仅 groupPolicy="allowlist" 时生效) */
65
+ groupAllowFrom?: Array<string | number>;
66
+ /** 每个群组的详细配置(如群组内发送者白名单) */
67
+ groups?: Record<string, WeComGroupConfig>;
68
+ /** 是否发送"思考中"消息,默认为 true */
69
+ sendThinkingMessage?: boolean;
70
+ /**
71
+ * 默认 false,保持完整过程输出;开启后只展示 final_answer,
72
+ * error 和主流程确认兜底仍保留,避免失败信息丢失或确认流程卡住。
73
+ */
74
+ showFinalAnswerOnly?: boolean;
75
+ /** 额外允许访问的本地媒体路径白名单(支持 ~ 表示 home 目录),如 ["~/Downloads", "~/Documents"] */
76
+ mediaLocalRoots?: string[];
77
+ /** Agent 模式配置(自建应用) */
78
+ agent?: WecomAgentConfig;
79
+ /** 网络配置 */
80
+ network?: WecomNetworkConfig;
81
+ /** 媒体处理配置 */
82
+ media?: WecomMediaConfig;
83
+ /** 动态 Agent 配置 */
84
+ dynamicAgents?: WecomDynamicAgentsConfig;
85
+ /** 连接模式:固定 websocket(管理端只读;保留 webhook 仅用于历史兼容数据解析)。 */
86
+ connectionMode?: "webhook" | "websocket";
87
+ /** Bot Webhook 验证 token(connectionMode=webhook 时使用)。 */
88
+ token?: string;
89
+ /** Bot Webhook AES Key(43 字符 Base64,connectionMode=webhook 时使用)。 */
90
+ encodingAESKey?: string;
91
+ /** Bot Webhook 接收方 ID(receive_id)。 */
92
+ receiveId?: string;
93
+ /** `enter_chat` 事件欢迎语。 */
94
+ welcomeText?: string;
95
+ /** 流式占位提示文案(用于 stream 首帧前占位)。 */
96
+ streamPlaceholderContent?: string;
97
+ }
98
+ export declare type WecomChatType = "direct" | "group";
99
+ export declare type WecomGroupSessionScope = "group" | "group_sender";
100
+ export declare function resolveWecomSessionPeerId(params: {
101
+ chatType: WecomChatType;
102
+ chatId: string;
103
+ senderId: string;
104
+ separateSessionByConversation?: boolean;
105
+ groupSessionScope?: WecomGroupSessionScope;
106
+ }): string;
107
+ /**
108
+ * 单个企业微信账号的配置类型(用于 accounts 字段下的每个账号)。
109
+ * 与 WeComConfig 字段完全一致,账号级字段会覆盖顶层同名字段。
110
+ */
111
+ export declare type WeComAccountConfig = Partial<WeComConfig>;
112
+ export declare const DefaultWsUrl = "wss://openws.work.weixin.qq.com";
113
+ export interface ResolvedWeComAccount {
114
+ accountId: string;
115
+ name: string;
116
+ enabled: boolean;
117
+ websocketUrl: string;
118
+ botId: string;
119
+ secret: string;
120
+ /** 是否发送"思考中"消息,默认为 true */
121
+ sendThinkingMessage: boolean;
122
+ /** 运行时解析后的 final-only 开关,false 时保持完整过程输出。 */
123
+ showFinalAnswerOnly: boolean;
124
+ config: WeComConfig;
125
+ /** Agent 模式能力(自建应用) */
126
+ agent?: ResolvedAgentAccount;
127
+ /** Webhook 模式配置 */
128
+ token?: string;
129
+ encodingAESKey?: string;
130
+ receiveId?: string;
131
+ setupWizard?: any;
132
+ }
133
+ /**
134
+ * 解析企业微信账户配置
135
+ */
136
+ export declare function resolveWeComAccount(cfg: OpenClawConfig): ResolvedWeComAccount;
137
+ /**
138
+ * 设置企业微信账户配置
139
+ */
140
+ export declare function setWeComAccount(cfg: OpenClawConfig, account: Partial<WeComConfig>): OpenClawConfig;
141
+ /**
142
+ * 解析出口代理 URL(对齐原版 resolveWecomEgressProxyUrl)
143
+ *
144
+ * 优先级:
145
+ * 1. config.channels.wecom.network.egressProxyUrl
146
+ * 2. 环境变量:OPENCLAW_WECOM_EGRESS_PROXY_URL → WECOM_EGRESS_PROXY_URL → HTTPS_PROXY → ALL_PROXY → HTTP_PROXY
147
+ */
148
+ export declare function resolveWecomEgressProxyUrl(cfg: OpenClawConfig): string | undefined;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ /**
3
+ * 企业微信公共工具函数
4
+ */
5
+ var __assign = (this && this.__assign) || function () {
6
+ __assign = Object.assign || function(t) {
7
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
8
+ s = arguments[i];
9
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
10
+ t[p] = s[p];
11
+ }
12
+ return t;
13
+ };
14
+ return __assign.apply(this, arguments);
15
+ };
16
+ exports.__esModule = true;
17
+ exports.resolveWecomEgressProxyUrl = exports.setWeComAccount = exports.resolveWeComAccount = exports.DefaultWsUrl = exports.resolveWecomSessionPeerId = void 0;
18
+ var openclaw_compat_js_1 = require("./openclaw-compat.js");
19
+ var const_js_1 = require("./const.js");
20
+ function resolveWecomSessionPeerId(params) {
21
+ var chatType = params.chatType;
22
+ var chatId = String(params.chatId || "").trim();
23
+ var senderId = String(params.senderId || "").trim();
24
+ var separateSessionByConversation = params.separateSessionByConversation !== false;
25
+ var groupSessionScope = params.groupSessionScope === "group" ? "group" : "group_sender";
26
+ if (!separateSessionByConversation) {
27
+ return senderId || chatId;
28
+ }
29
+ if (chatType !== "group") {
30
+ return senderId || chatId;
31
+ }
32
+ if (groupSessionScope === "group_sender") {
33
+ if (chatId && senderId)
34
+ return chatId + ":" + senderId;
35
+ return chatId || senderId;
36
+ }
37
+ return chatId || senderId;
38
+ }
39
+ exports.resolveWecomSessionPeerId = resolveWecomSessionPeerId;
40
+ exports.DefaultWsUrl = "wss://openws.work.weixin.qq.com";
41
+ /**
42
+ * 解析企业微信账户配置
43
+ */
44
+ function resolveWeComAccount(cfg) {
45
+ var _a, _b, _c, _d, _e, _f;
46
+ var wecomConfig = ((_b = (_a = cfg.channels) === null || _a === void 0 ? void 0 : _a[const_js_1.CHANNEL_ID]) !== null && _b !== void 0 ? _b : {});
47
+ return {
48
+ accountId: openclaw_compat_js_1.DEFAULT_ACCOUNT_ID,
49
+ name: (_c = wecomConfig.name) !== null && _c !== void 0 ? _c : "企业微信",
50
+ enabled: wecomConfig.enabled !== false,
51
+ websocketUrl: wecomConfig.websocketUrl || exports.DefaultWsUrl,
52
+ botId: (_d = wecomConfig.botId) !== null && _d !== void 0 ? _d : "",
53
+ secret: (_e = wecomConfig.secret) !== null && _e !== void 0 ? _e : "",
54
+ sendThinkingMessage: (_f = wecomConfig.sendThinkingMessage) !== null && _f !== void 0 ? _f : true,
55
+ showFinalAnswerOnly: wecomConfig.showFinalAnswerOnly === true,
56
+ config: wecomConfig
57
+ };
58
+ }
59
+ exports.resolveWeComAccount = resolveWeComAccount;
60
+ /**
61
+ * 设置企业微信账户配置
62
+ */
63
+ function setWeComAccount(cfg, account) {
64
+ var _a;
65
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
66
+ var existing = ((_c = (_b = cfg.channels) === null || _b === void 0 ? void 0 : _b[const_js_1.CHANNEL_ID]) !== null && _c !== void 0 ? _c : {});
67
+ var merged = __assign(__assign(__assign(__assign({ enabled: (_e = (_d = account.enabled) !== null && _d !== void 0 ? _d : existing === null || existing === void 0 ? void 0 : existing.enabled) !== null && _e !== void 0 ? _e : true, botId: (_g = (_f = account.botId) !== null && _f !== void 0 ? _f : existing === null || existing === void 0 ? void 0 : existing.botId) !== null && _g !== void 0 ? _g : "", secret: (_j = (_h = account.secret) !== null && _h !== void 0 ? _h : existing === null || existing === void 0 ? void 0 : existing.secret) !== null && _j !== void 0 ? _j : "", allowFrom: (_k = account.allowFrom) !== null && _k !== void 0 ? _k : existing === null || existing === void 0 ? void 0 : existing.allowFrom, dmPolicy: (_l = account.dmPolicy) !== null && _l !== void 0 ? _l : existing === null || existing === void 0 ? void 0 : existing.dmPolicy }, (account.websocketUrl || (existing === null || existing === void 0 ? void 0 : existing.websocketUrl)
68
+ ? { websocketUrl: (_m = account.websocketUrl) !== null && _m !== void 0 ? _m : existing === null || existing === void 0 ? void 0 : existing.websocketUrl }
69
+ : {})), (account.name || (existing === null || existing === void 0 ? void 0 : existing.name)
70
+ ? { name: (_o = account.name) !== null && _o !== void 0 ? _o : existing === null || existing === void 0 ? void 0 : existing.name }
71
+ : {})), (account.sendThinkingMessage !== undefined || (existing === null || existing === void 0 ? void 0 : existing.sendThinkingMessage) !== undefined
72
+ ? { sendThinkingMessage: (_p = account.sendThinkingMessage) !== null && _p !== void 0 ? _p : existing === null || existing === void 0 ? void 0 : existing.sendThinkingMessage }
73
+ : {})), (account.showFinalAnswerOnly !== undefined || (existing === null || existing === void 0 ? void 0 : existing.showFinalAnswerOnly) !== undefined
74
+ ? { showFinalAnswerOnly: (_q = account.showFinalAnswerOnly) !== null && _q !== void 0 ? _q : existing === null || existing === void 0 ? void 0 : existing.showFinalAnswerOnly }
75
+ : {}));
76
+ return __assign(__assign({}, cfg), { channels: __assign(__assign({}, cfg.channels), (_a = {}, _a[const_js_1.CHANNEL_ID] = merged, _a)) });
77
+ }
78
+ exports.setWeComAccount = setWeComAccount;
79
+ /**
80
+ * 解析出口代理 URL(对齐原版 resolveWecomEgressProxyUrl)
81
+ *
82
+ * 优先级:
83
+ * 1. config.channels.wecom.network.egressProxyUrl
84
+ * 2. 环境变量:OPENCLAW_WECOM_EGRESS_PROXY_URL → WECOM_EGRESS_PROXY_URL → HTTPS_PROXY → ALL_PROXY → HTTP_PROXY
85
+ */
86
+ function resolveWecomEgressProxyUrl(cfg) {
87
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
88
+ var wecom = ((_b = (_a = cfg.channels) === null || _a === void 0 ? void 0 : _a[const_js_1.CHANNEL_ID]) !== null && _b !== void 0 ? _b : {});
89
+ var proxyUrl = (_j = (_h = (_g = (_f = (_e = (_d = (_c = wecom.network) === null || _c === void 0 ? void 0 : _c.egressProxyUrl) !== null && _d !== void 0 ? _d : process.env.OPENCLAW_WECOM_EGRESS_PROXY_URL) !== null && _e !== void 0 ? _e : process.env.WECOM_EGRESS_PROXY_URL) !== null && _f !== void 0 ? _f : process.env.HTTPS_PROXY) !== null && _g !== void 0 ? _g : process.env.ALL_PROXY) !== null && _h !== void 0 ? _h : process.env.HTTP_PROXY) !== null && _j !== void 0 ? _j : "";
90
+ return proxyUrl.trim() || undefined;
91
+ }
92
+ exports.resolveWecomEgressProxyUrl = resolveWecomEgressProxyUrl;
@@ -0,0 +1,2 @@
1
+ /** 插件版本号,运行时从 package.json 读取 */
2
+ export declare const PLUGIN_VERSION: string;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var _a;
3
+ exports.__esModule = true;
4
+ exports.PLUGIN_VERSION = void 0;
5
+ var node_fs_1 = require("node:fs");
6
+ var node_path_1 = require("node:path");
7
+ var node_url_1 = require("node:url");
8
+ /**
9
+ * 从当前文件位置向上逐级查找 package.json
10
+ * - ts 源码直接运行时(tsx/ts-node):src/version.ts → 向上 1 级
11
+ * - tsc 编译后运行时:dist/src/version.js → 向上 2 级
12
+ */
13
+ var findPackageJson = function () {
14
+ var dir = node_path_1.dirname(node_url_1.fileURLToPath(import.meta.url));
15
+ while (true) {
16
+ var candidate = node_path_1.resolve(dir, "package.json");
17
+ if (node_fs_1.existsSync(candidate))
18
+ return candidate;
19
+ var parent = node_path_1.dirname(dir);
20
+ if (parent === dir)
21
+ break; // 已到文件系统根目录
22
+ dir = parent;
23
+ }
24
+ throw new Error("找不到 package.json");
25
+ };
26
+ var pkg = JSON.parse(node_fs_1.readFileSync(findPackageJson(), "utf-8"));
27
+ /** 插件版本号,运行时从 package.json 读取 */
28
+ exports.PLUGIN_VERSION = (_a = pkg.version) !== null && _a !== void 0 ? _a : "";
@@ -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 "ylib-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,137 @@
1
+ "use strict";
2
+ /**
3
+ * 命令授权(Command Authorization)
4
+ *
5
+ * 从 lh 版 shared/command-auth.ts 迁移。
6
+ * 适配新版 WeComConfig(dmPolicy / allowFrom 扁平化在顶层)。
7
+ */
8
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10
+ return new (P || (P = Promise))(function (resolve, reject) {
11
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
12
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15
+ });
16
+ };
17
+ var __generator = (this && this.__generator) || function (thisArg, body) {
18
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
19
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
20
+ function verb(n) { return function (v) { return step([n, v]); }; }
21
+ function step(op) {
22
+ if (f) throw new TypeError("Generator is already executing.");
23
+ while (_) try {
24
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
25
+ if (y = 0, t) op = [op[0] & 2, t.value];
26
+ switch (op[0]) {
27
+ case 0: case 1: t = op; break;
28
+ case 4: _.label++; return { value: op[1], done: false };
29
+ case 5: _.label++; y = op[1]; op = [0]; continue;
30
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
31
+ default:
32
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
33
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
34
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
35
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
36
+ if (t[2]) _.ops.pop();
37
+ _.trys.pop(); continue;
38
+ }
39
+ op = body.call(thisArg, _);
40
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
41
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
42
+ }
43
+ };
44
+ exports.__esModule = true;
45
+ exports.buildWecomUnauthorizedCommandPrompt = exports.resolveWecomCommandAuthorization = void 0;
46
+ // ============================================================================
47
+ // 内部工具函数
48
+ // ============================================================================
49
+ /** 归一化白名单条目:去除空格、统一小写、去掉 wecom:/user:/userid: 前缀 */
50
+ function normalizeWecomAllowFromEntry(raw) {
51
+ return raw
52
+ .trim()
53
+ .toLowerCase()
54
+ .replace(/^wecom:/, "")
55
+ .replace(/^user:/, "")
56
+ .replace(/^userid:/, "");
57
+ }
58
+ /** 判断发送者是否在白名单中 */
59
+ function isWecomSenderAllowed(senderUserId, allowFrom) {
60
+ var list = allowFrom.map(function (entry) { return normalizeWecomAllowFromEntry(entry); }).filter(Boolean);
61
+ if (list.includes("*"))
62
+ return true;
63
+ var normalizedSender = normalizeWecomAllowFromEntry(senderUserId);
64
+ if (!normalizedSender)
65
+ return false;
66
+ return list.includes(normalizedSender);
67
+ }
68
+ /**
69
+ * 解析命令授权状态
70
+ *
71
+ * 适配新版 WeComConfig 的扁平化字段:
72
+ * - dmPolicy → accountConfig.dmPolicy
73
+ * - allowFrom → accountConfig.allowFrom
74
+ */
75
+ function resolveWecomCommandAuthorization(params) {
76
+ var _a, _b, _c;
77
+ return __awaiter(this, void 0, void 0, function () {
78
+ var core, cfg, accountConfig, rawBody, senderUserId, dmPolicy, configAllowFrom, shouldComputeAuth, effectiveAllowFrom, senderAllowed, allowAllConfigured, authorizerConfigured, useAccessGroups, commandAuthorized;
79
+ return __generator(this, function (_d) {
80
+ core = params.core, cfg = params.cfg, accountConfig = params.accountConfig, rawBody = params.rawBody, senderUserId = params.senderUserId;
81
+ dmPolicy = ((_a = accountConfig.dmPolicy) !== null && _a !== void 0 ? _a : "pairing");
82
+ configAllowFrom = ((_b = accountConfig.allowFrom) !== null && _b !== void 0 ? _b : []).map(function (v) { return String(v); });
83
+ shouldComputeAuth = core.channel.commands.shouldComputeCommandAuthorized(rawBody, cfg);
84
+ effectiveAllowFrom = dmPolicy === "open" ? ["*"] : configAllowFrom;
85
+ senderAllowed = isWecomSenderAllowed(senderUserId, effectiveAllowFrom);
86
+ allowAllConfigured = effectiveAllowFrom.some(function (entry) { return normalizeWecomAllowFromEntry(entry) === "*"; });
87
+ authorizerConfigured = allowAllConfigured || effectiveAllowFrom.length > 0;
88
+ useAccessGroups = ((_c = cfg.commands) === null || _c === void 0 ? void 0 : _c.useAccessGroups) !== false;
89
+ commandAuthorized = shouldComputeAuth
90
+ ? core.channel.commands.resolveCommandAuthorizedFromAuthorizers({
91
+ useAccessGroups: useAccessGroups,
92
+ authorizers: [{ configured: authorizerConfigured, allowed: senderAllowed }]
93
+ })
94
+ : undefined;
95
+ return [2 /*return*/, {
96
+ shouldComputeAuth: shouldComputeAuth,
97
+ dmPolicy: dmPolicy,
98
+ senderAllowed: senderAllowed,
99
+ authorizerConfigured: authorizerConfigured,
100
+ commandAuthorized: commandAuthorized,
101
+ effectiveAllowFrom: effectiveAllowFrom
102
+ }];
103
+ });
104
+ });
105
+ }
106
+ exports.resolveWecomCommandAuthorization = resolveWecomCommandAuthorization;
107
+ // ============================================================================
108
+ // 未授权提示文案构建
109
+ // ============================================================================
110
+ /**
111
+ * 构建未授权命令的中文提示文案
112
+ *
113
+ * @param scope - "bot"(智能机器人)或 "agent"(自建应用)
114
+ */
115
+ function buildWecomUnauthorizedCommandPrompt(params) {
116
+ var user = params.senderUserId || "unknown";
117
+ var policy = params.dmPolicy;
118
+ var scopeLabel = params.scope === "bot" ? "Bot(智能机器人)" : "Agent(自建应用)";
119
+ var dmPrefix = params.scope === "bot" ? "channels.wecom.bot" : "channels.wecom.agent";
120
+ var allowCmd = function (value) { return "openclaw config set " + dmPrefix + ".allowFrom '" + value + "'"; };
121
+ var policyCmd = function (value) { return "openclaw config set " + dmPrefix + ".dmPolicy \"" + value + "\""; };
122
+ if (policy === "disabled") {
123
+ return [
124
+ "\u65E0\u6743\u9650\u6267\u884C\u547D\u4EE4\uFF08" + scopeLabel + " \u5DF2\u7981\u7528\uFF1AdmPolicy=disabled\uFF09",
125
+ "\u89E6\u53D1\u8005\uFF1A" + user,
126
+ "\u7BA1\u7406\u5458\uFF1A" + policyCmd("open") + "\uFF08\u5168\u653E\u5F00\uFF09\u6216 " + policyCmd("allowlist") + "\uFF08\u767D\u540D\u5355\uFF09",
127
+ ].join("\n");
128
+ }
129
+ return [
130
+ "\u65E0\u6743\u9650\u6267\u884C\u547D\u4EE4\uFF08\u5165\u53E3\uFF1A" + scopeLabel + "\uFF0Cuserid\uFF1A" + user + "\uFF09",
131
+ "\u7BA1\u7406\u5458\u5168\u653E\u5F00\uFF1A" + policyCmd("open"),
132
+ "\u7BA1\u7406\u5458\u653E\u884C\u8BE5\u7528\u6237\uFF1A" + policyCmd("allowlist"),
133
+ "\u7136\u540E\u8BBE\u7F6E\u767D\u540D\u5355\uFF1A" + allowCmd(JSON.stringify([user])),
134
+ "\u5982\u679C\u4ECD\u88AB\u62E6\u622A\uFF1A\u68C0\u67E5 commands.useAccessGroups/\u8BBF\u95EE\u7EC4",
135
+ ].join("\n");
136
+ }
137
+ exports.buildWecomUnauthorizedCommandPrompt = buildWecomUnauthorizedCommandPrompt;
@@ -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;