@openclaw-china/wecom 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../../../node_modules/.pnpm/@openclaw-china+shared@0.1.5/node_modules/@openclaw-china/shared/src/logger/logger.ts","../../../node_modules/.pnpm/@openclaw-china+shared@0.1.5/node_modules/@openclaw-china/shared/src/policy/dm-policy.ts","../../../node_modules/.pnpm/@openclaw-china+shared@0.1.5/node_modules/@openclaw-china/shared/src/policy/group-policy.ts","../src/crypto.ts","../src/bot.ts","../src/runtime.ts","../src/monitor.ts","../src/channel.ts","../index.ts"],"names":["crypto","target","plain","msg","streamId","state"],"mappings":"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","file":"index.js","sourcesContent":["// 企业微信配置 schema\nimport { z } from \"zod\";\n\nimport type { ResolvedWecomAccount, WecomAccountConfig, WecomConfig, WecomDmPolicy, WecomGroupPolicy } from \"./types.js\";\n\n/** 默认账户 ID */\nexport const DEFAULT_ACCOUNT_ID = \"default\";\n\nconst WecomAccountSchema = z.object({\n name: z.string().optional(),\n enabled: z.boolean().optional(),\n webhookPath: z.string().optional(),\n token: z.string().optional(),\n encodingAESKey: z.string().optional(),\n receiveId: z.string().optional(),\n welcomeText: z.string().optional(),\n dmPolicy: z.enum([\"open\", \"pairing\", \"allowlist\", \"disabled\"]).optional(),\n allowFrom: z.array(z.string()).optional(),\n groupPolicy: z.enum([\"open\", \"allowlist\", \"disabled\"]).optional(),\n groupAllowFrom: z.array(z.string()).optional(),\n requireMention: z.boolean().optional(),\n});\n\nexport const WecomConfigSchema = WecomAccountSchema.extend({\n defaultAccount: z.string().optional(),\n accounts: z.record(WecomAccountSchema).optional(),\n});\n\nexport type ParsedWecomConfig = z.infer<typeof WecomConfigSchema>;\n\nexport const WecomConfigJsonSchema = {\n schema: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n name: { type: \"string\" },\n enabled: { type: \"boolean\" },\n webhookPath: { type: \"string\" },\n token: { type: \"string\" },\n encodingAESKey: { type: \"string\" },\n receiveId: { type: \"string\" },\n welcomeText: { type: \"string\" },\n dmPolicy: { type: \"string\", enum: [\"open\", \"pairing\", \"allowlist\", \"disabled\"] },\n allowFrom: { type: \"array\", items: { type: \"string\" } },\n groupPolicy: { type: \"string\", enum: [\"open\", \"allowlist\", \"disabled\"] },\n groupAllowFrom: { type: \"array\", items: { type: \"string\" } },\n requireMention: { type: \"boolean\" },\n defaultAccount: { type: \"string\" },\n accounts: {\n type: \"object\",\n additionalProperties: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n name: { type: \"string\" },\n enabled: { type: \"boolean\" },\n webhookPath: { type: \"string\" },\n token: { type: \"string\" },\n encodingAESKey: { type: \"string\" },\n receiveId: { type: \"string\" },\n welcomeText: { type: \"string\" },\n dmPolicy: { type: \"string\", enum: [\"open\", \"pairing\", \"allowlist\", \"disabled\"] },\n allowFrom: { type: \"array\", items: { type: \"string\" } },\n groupPolicy: { type: \"string\", enum: [\"open\", \"allowlist\", \"disabled\"] },\n groupAllowFrom: { type: \"array\", items: { type: \"string\" } },\n requireMention: { type: \"boolean\" }\n }\n }\n }\n }\n }\n};\n\nexport interface PluginConfig {\n session?: {\n store?: unknown;\n };\n channels?: {\n wecom?: WecomConfig;\n };\n}\n\nexport function parseWecomConfig(raw: unknown): WecomConfig | undefined {\n const parsed = WecomConfigSchema.safeParse(raw);\n if (!parsed.success) return undefined;\n return parsed.data as WecomConfig;\n}\n\nexport function normalizeAccountId(raw?: string | null): string {\n const trimmed = String(raw ?? \"\").trim();\n return trimmed || DEFAULT_ACCOUNT_ID;\n}\n\nfunction listConfiguredAccountIds(cfg: PluginConfig): string[] {\n const accounts = cfg.channels?.wecom?.accounts;\n if (!accounts || typeof accounts !== \"object\") return [];\n return Object.keys(accounts).filter(Boolean);\n}\n\nexport function listWecomAccountIds(cfg: PluginConfig): string[] {\n const ids = listConfiguredAccountIds(cfg);\n if (ids.length === 0) return [DEFAULT_ACCOUNT_ID];\n return ids.sort((a, b) => a.localeCompare(b));\n}\n\nexport function resolveDefaultWecomAccountId(cfg: PluginConfig): string {\n const wecomConfig = cfg.channels?.wecom;\n if (wecomConfig?.defaultAccount?.trim()) return wecomConfig.defaultAccount.trim();\n const ids = listWecomAccountIds(cfg);\n if (ids.includes(DEFAULT_ACCOUNT_ID)) return DEFAULT_ACCOUNT_ID;\n return ids[0] ?? DEFAULT_ACCOUNT_ID;\n}\n\nfunction resolveAccountConfig(cfg: PluginConfig, accountId: string): WecomAccountConfig | undefined {\n const accounts = cfg.channels?.wecom?.accounts;\n if (!accounts || typeof accounts !== \"object\") return undefined;\n return accounts[accountId] as WecomAccountConfig | undefined;\n}\n\nfunction mergeWecomAccountConfig(cfg: PluginConfig, accountId: string): WecomAccountConfig {\n const base = (cfg.channels?.wecom ?? {}) as WecomConfig;\n const { accounts: _ignored, defaultAccount: _ignored2, ...baseConfig } = base;\n const account = resolveAccountConfig(cfg, accountId) ?? {};\n return { ...baseConfig, ...account };\n}\n\nexport function resolveWecomAccount(params: { cfg: PluginConfig; accountId?: string | null }): ResolvedWecomAccount {\n const accountId = normalizeAccountId(params.accountId);\n const baseEnabled = params.cfg.channels?.wecom?.enabled !== false;\n const merged = mergeWecomAccountConfig(params.cfg, accountId);\n const enabled = baseEnabled && merged.enabled !== false;\n\n const isDefaultAccount = accountId === DEFAULT_ACCOUNT_ID;\n const token = merged.token?.trim() || (isDefaultAccount ? process.env.WECOM_TOKEN?.trim() : undefined) || undefined;\n const encodingAESKey =\n merged.encodingAESKey?.trim() || (isDefaultAccount ? process.env.WECOM_ENCODING_AES_KEY?.trim() : undefined) || undefined;\n const receiveId = merged.receiveId?.trim() ?? \"\";\n const configured = Boolean(token && encodingAESKey);\n\n return {\n accountId,\n name: merged.name?.trim() || undefined,\n enabled,\n configured,\n token,\n encodingAESKey,\n receiveId,\n config: merged,\n };\n}\n\nexport function listEnabledWecomAccounts(cfg: PluginConfig): ResolvedWecomAccount[] {\n return listWecomAccountIds(cfg)\n .map((accountId) => resolveWecomAccount({ cfg, accountId }))\n .filter((account) => account.enabled);\n}\n\nexport function resolveDmPolicy(config: WecomAccountConfig): WecomDmPolicy {\n return (config.dmPolicy ?? \"pairing\") as WecomDmPolicy;\n}\n\nexport function resolveGroupPolicy(config: WecomAccountConfig): WecomGroupPolicy {\n return (config.groupPolicy ?? \"open\") as WecomGroupPolicy;\n}\n\nexport function resolveRequireMention(config: WecomAccountConfig): boolean {\n if (typeof config.requireMention === \"boolean\") return config.requireMention;\n return true;\n}\n\nexport function resolveAllowFrom(config: WecomAccountConfig): string[] {\n return config.allowFrom ?? [];\n}\n\nexport function resolveGroupAllowFrom(config: WecomAccountConfig): string[] {\n return config.groupAllowFrom ?? [];\n}\r\n","/**\n * 通用日志工具\n *\n * 提供分级日志功能:\n * - info: 关键业务日志(默认显示)\n * - debug: 调试日志(带 [DEBUG] 标记)\n * - error: 错误日志\n * - warn: 警告日志\n */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface Logger {\n debug: (msg: string) => void;\n info: (msg: string) => void;\n warn: (msg: string) => void;\n error: (msg: string) => void;\n}\n\nexport interface LoggerOptions {\n log?: (msg: string) => void;\n error?: (msg: string) => void;\n}\n\n/**\n * 创建带前缀的日志器\n *\n * @param prefix 日志前缀(如 \"dingtalk\", \"feishu\")\n * @param opts 可选的日志输出函数\n * @returns Logger 实例\n *\n * @example\n * ```ts\n * const logger = createLogger(\"dingtalk\");\n * logger.debug(\"connecting...\"); // [dingtalk] [DEBUG] connecting...\n * logger.info(\"connected\"); // [dingtalk] connected\n * logger.warn(\"slow response\"); // [dingtalk] [WARN] slow response\n * logger.error(\"failed\"); // [dingtalk] [ERROR] failed\n * ```\n */\nexport function createLogger(prefix: string, opts?: LoggerOptions): Logger {\n const logFn = opts?.log ?? console.log;\n const errorFn = opts?.error ?? console.error;\n\n return {\n debug: (msg: string) => logFn(`[${prefix}] [DEBUG] ${msg}`),\n info: (msg: string) => logFn(`[${prefix}] ${msg}`),\n warn: (msg: string) => logFn(`[${prefix}] [WARN] ${msg}`),\n error: (msg: string) => errorFn(`[${prefix}] [ERROR] ${msg}`),\n };\n}\n","/**\r\n * DM 策略引擎\r\n *\r\n * 实现 open/pairing/allowlist 策略检查\r\n */\r\n\r\n/**\r\n * DM 策略类型\r\n * - open: 允许所有单聊消息\r\n * - pairing: 配对模式(允许所有,配对逻辑由上层处理)\r\n * - allowlist: 仅允许白名单中的发送者\r\n */\r\nexport type DmPolicyType = \"open\" | \"pairing\" | \"allowlist\";\r\n\r\n/**\r\n * 策略检查结果\r\n */\r\nexport interface PolicyCheckResult {\r\n /** 是否允许处理该消息 */\r\n allowed: boolean;\r\n /** 拒绝原因(如果被拒绝) */\r\n reason?: string;\r\n}\r\n\r\n/**\r\n * DM 策略检查参数\r\n */\r\nexport interface DmPolicyCheckParams {\r\n /** DM 策略类型 */\r\n dmPolicy: DmPolicyType;\r\n /** 发送者 ID */\r\n senderId: string;\r\n /** 白名单(allowlist 策略时使用) */\r\n allowFrom?: string[];\r\n}\r\n\r\n/**\r\n * 检查单聊策略\r\n *\r\n * @param params 检查参数\r\n * @returns 策略检查结果\r\n *\r\n * @example\r\n * ```ts\r\n * // 开放策略\r\n * checkDmPolicy({ dmPolicy: \"open\", senderId: \"user1\" });\r\n * // => { allowed: true }\r\n *\r\n * // 白名单策略\r\n * checkDmPolicy({ dmPolicy: \"allowlist\", senderId: \"user1\", allowFrom: [\"user1\", \"user2\"] });\r\n * // => { allowed: true }\r\n *\r\n * checkDmPolicy({ dmPolicy: \"allowlist\", senderId: \"user3\", allowFrom: [\"user1\", \"user2\"] });\r\n * // => { allowed: false, reason: \"sender user3 not in DM allowlist\" }\r\n * ```\r\n */\r\nexport function checkDmPolicy(params: DmPolicyCheckParams): PolicyCheckResult {\r\n const { dmPolicy, senderId, allowFrom = [] } = params;\r\n\r\n switch (dmPolicy) {\r\n case \"open\":\r\n // 开放策略:允许所有单聊消息\r\n return { allowed: true };\r\n\r\n case \"pairing\":\r\n // 配对策略:允许所有单聊消息(配对逻辑由上层处理)\r\n return { allowed: true };\r\n\r\n case \"allowlist\":\r\n // 白名单策略:仅允许 allowFrom 中的发送者\r\n if (allowFrom.includes(senderId)) {\r\n return { allowed: true };\r\n }\r\n return {\r\n allowed: false,\r\n reason: `sender ${senderId} not in DM allowlist`,\r\n };\r\n\r\n default:\r\n return { allowed: true };\r\n }\r\n}\r\n","/**\r\n * 群组策略引擎\r\n *\r\n * 实现 open/allowlist/disabled 策略检查\r\n */\r\n\r\nimport type { PolicyCheckResult } from \"./dm-policy.js\";\r\n\r\n/**\r\n * 群组策略类型\r\n * - open: 允许所有群聊消息\r\n * - allowlist: 仅允许白名单中的群组\r\n * - disabled: 禁用所有群聊消息\r\n */\r\nexport type GroupPolicyType = \"open\" | \"allowlist\" | \"disabled\";\r\n\r\n/**\r\n * 群组策略检查参数\r\n */\r\nexport interface GroupPolicyCheckParams {\r\n /** 群组策略类型 */\r\n groupPolicy: GroupPolicyType;\r\n /** 会话 ID(群组 ID) */\r\n conversationId: string;\r\n /** 群组白名单(allowlist 策略时使用) */\r\n groupAllowFrom?: string[];\r\n /** 是否要求 @提及机器人 */\r\n requireMention: boolean;\r\n /** 是否 @提及了机器人 */\r\n mentionedBot: boolean;\r\n}\r\n\r\n/**\r\n * 检查群聊策略\r\n *\r\n * @param params 检查参数\r\n * @returns 策略检查结果\r\n *\r\n * @example\r\n * ```ts\r\n * // 禁用策略\r\n * checkGroupPolicy({ groupPolicy: \"disabled\", conversationId: \"g1\", requireMention: false, mentionedBot: false });\r\n * // => { allowed: false, reason: \"group messages disabled\" }\r\n *\r\n * // 开放策略 + 要求 @提及\r\n * checkGroupPolicy({ groupPolicy: \"open\", conversationId: \"g1\", requireMention: true, mentionedBot: false });\r\n * // => { allowed: false, reason: \"message did not mention bot\" }\r\n *\r\n * // 白名单策略\r\n * checkGroupPolicy({ groupPolicy: \"allowlist\", conversationId: \"g1\", groupAllowFrom: [\"g1\"], requireMention: false, mentionedBot: false });\r\n * // => { allowed: true }\r\n * ```\r\n */\r\nexport function checkGroupPolicy(params: GroupPolicyCheckParams): PolicyCheckResult {\r\n const { groupPolicy, conversationId, groupAllowFrom = [], requireMention, mentionedBot } = params;\r\n\r\n // 首先检查群聊策略\r\n switch (groupPolicy) {\r\n case \"disabled\":\r\n // 禁用策略:拒绝所有群聊消息\r\n return {\r\n allowed: false,\r\n reason: \"group messages disabled\",\r\n };\r\n\r\n case \"allowlist\":\r\n // 白名单策略:仅允许 groupAllowFrom 中的群组\r\n if (!groupAllowFrom.includes(conversationId)) {\r\n return {\r\n allowed: false,\r\n reason: `group ${conversationId} not in allowlist`,\r\n };\r\n }\r\n break;\r\n\r\n case \"open\":\r\n // 开放策略:允许所有群聊\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n // 然后检查 @提及要求\r\n if (requireMention && !mentionedBot) {\r\n return {\r\n allowed: false,\r\n reason: \"message did not mention bot\",\r\n };\r\n }\r\n\r\n return { allowed: true };\r\n}\r\n","import crypto from \"node:crypto\";\n\nfunction decodeEncodingAESKey(encodingAESKey: string): Buffer {\n const trimmed = encodingAESKey.trim();\n if (!trimmed) throw new Error(\"encodingAESKey missing\");\n const withPadding = trimmed.endsWith(\"=\") ? trimmed : `${trimmed}=`;\n const key = Buffer.from(withPadding, \"base64\");\n if (key.length !== 32) {\n throw new Error(`invalid encodingAESKey (expected 32 bytes after base64 decode, got ${key.length})`);\n }\n return key;\n}\n\nconst WECOM_PKCS7_BLOCK_SIZE = 32;\n\nfunction pkcs7Pad(buf: Buffer, blockSize: number): Buffer {\n const mod = buf.length % blockSize;\n const pad = mod === 0 ? blockSize : blockSize - mod;\n return Buffer.concat([buf, Buffer.alloc(pad, pad)]);\n}\n\nfunction pkcs7Unpad(buf: Buffer, blockSize: number): Buffer {\n if (buf.length === 0) throw new Error(\"invalid pkcs7 payload\");\n const pad = buf[buf.length - 1];\n if (!pad || pad < 1 || pad > blockSize || pad > buf.length) {\n throw new Error(\"invalid pkcs7 padding\");\n }\n for (let i = 1; i <= pad; i += 1) {\n if (buf[buf.length - i] !== pad) {\n throw new Error(\"invalid pkcs7 padding\");\n }\n }\n return buf.subarray(0, buf.length - pad);\n}\n\nfunction sha1Hex(input: string): string {\n return crypto.createHash(\"sha1\").update(input).digest(\"hex\");\n}\n\nexport function computeWecomMsgSignature(params: {\n token: string;\n timestamp: string;\n nonce: string;\n encrypt: string;\n}): string {\n const parts = [params.token, params.timestamp, params.nonce, params.encrypt]\n .map((value) => String(value ?? \"\"))\n .sort();\n return sha1Hex(parts.join(\"\"));\n}\n\nexport function verifyWecomSignature(params: {\n token: string;\n timestamp: string;\n nonce: string;\n encrypt: string;\n signature: string;\n}): boolean {\n const expected = computeWecomMsgSignature({\n token: params.token,\n timestamp: params.timestamp,\n nonce: params.nonce,\n encrypt: params.encrypt,\n });\n return expected === params.signature;\n}\n\nexport function decryptWecomEncrypted(params: {\n encodingAESKey: string;\n receiveId?: string;\n encrypt: string;\n}): string {\n const aesKey = decodeEncodingAESKey(params.encodingAESKey);\n const iv = aesKey.subarray(0, 16);\n const decipher = crypto.createDecipheriv(\"aes-256-cbc\", aesKey, iv);\n decipher.setAutoPadding(false);\n const decryptedPadded = Buffer.concat([\n decipher.update(Buffer.from(params.encrypt, \"base64\")),\n decipher.final(),\n ]);\n const decrypted = pkcs7Unpad(decryptedPadded, WECOM_PKCS7_BLOCK_SIZE);\n\n if (decrypted.length < 20) {\n throw new Error(`invalid decrypted payload (expected at least 20 bytes, got ${decrypted.length})`);\n }\n\n const msgLen = decrypted.readUInt32BE(16);\n const msgStart = 20;\n const msgEnd = msgStart + msgLen;\n if (msgEnd > decrypted.length) {\n throw new Error(`invalid decrypted msg length (msgEnd=${msgEnd}, payloadLength=${decrypted.length})`);\n }\n\n const msg = decrypted.subarray(msgStart, msgEnd).toString(\"utf8\");\n\n const receiveId = params.receiveId ?? \"\";\n if (receiveId) {\n const trailing = decrypted.subarray(msgEnd).toString(\"utf8\");\n if (trailing !== receiveId) {\n throw new Error(`receiveId mismatch (expected \"${receiveId}\", got \"${trailing}\")`);\n }\n }\n\n return msg;\n}\n\nexport function encryptWecomPlaintext(params: {\n encodingAESKey: string;\n receiveId?: string;\n plaintext: string;\n}): string {\n const aesKey = decodeEncodingAESKey(params.encodingAESKey);\n const iv = aesKey.subarray(0, 16);\n const random16 = crypto.randomBytes(16);\n const msg = Buffer.from(params.plaintext ?? \"\", \"utf8\");\n const msgLen = Buffer.alloc(4);\n msgLen.writeUInt32BE(msg.length, 0);\n const receiveId = Buffer.from(params.receiveId ?? \"\", \"utf8\");\n\n const raw = Buffer.concat([random16, msgLen, msg, receiveId]);\n const padded = pkcs7Pad(raw, WECOM_PKCS7_BLOCK_SIZE);\n const cipher = crypto.createCipheriv(\"aes-256-cbc\", aesKey, iv);\n cipher.setAutoPadding(false);\n const encrypted = Buffer.concat([cipher.update(padded), cipher.final()]);\n return encrypted.toString(\"base64\");\n}\r\n","/**\n * 企业微信消息处理\n *\n * 按参考实现的 session/envelope + buffered dispatcher 方式分发\n */\n\nimport {\n checkDmPolicy,\n checkGroupPolicy,\n createLogger,\n type Logger,\n} from \"@openclaw-china/shared\";\n\nimport type { PluginRuntime } from \"./runtime.js\";\nimport type { ResolvedWecomAccount, WecomInboundMessage, WecomDmPolicy } from \"./types.js\";\nimport {\n resolveAllowFrom,\n resolveGroupAllowFrom,\n resolveGroupPolicy,\n resolveRequireMention,\n type PluginConfig,\n} from \"./config.js\";\n\nexport type WecomDispatchHooks = {\n onChunk: (text: string) => void;\n onError?: (err: unknown) => void;\n};\n\nexport function extractWecomContent(msg: WecomInboundMessage): string {\n const msgtype = String(msg.msgtype ?? \"\").toLowerCase();\n if (msgtype === \"text\") {\n const content = (msg as { text?: { content?: string } }).text?.content;\n return typeof content === \"string\" ? content : \"\";\n }\n if (msgtype === \"voice\") {\n const content = (msg as { voice?: { content?: string } }).voice?.content;\n return typeof content === \"string\" ? content : \"[voice]\";\n }\n if (msgtype === \"mixed\") {\n const items = (msg as { mixed?: { msg_item?: unknown } }).mixed?.msg_item;\n if (Array.isArray(items)) {\n return items\n .map((item: unknown) => {\n if (!item || typeof item !== \"object\") return \"\";\n const typed = item as { msgtype?: string; text?: { content?: string }; image?: { url?: string } };\n const t = String(typed.msgtype ?? \"\").toLowerCase();\n if (t === \"text\") return String(typed.text?.content ?? \"\");\n if (t === \"image\") return `[image] ${String(typed.image?.url ?? \"\").trim()}`.trim();\n return t ? `[${t}]` : \"\";\n })\n .filter((part) => Boolean(part && part.trim()))\n .join(\"\\n\");\n }\n return \"[mixed]\";\n }\n if (msgtype === \"image\") {\n const url = String((msg as { image?: { url?: string } }).image?.url ?? \"\").trim();\n return url ? `[image] ${url}` : \"[image]\";\n }\n if (msgtype === \"file\") {\n const url = String((msg as { file?: { url?: string } }).file?.url ?? \"\").trim();\n return url ? `[file] ${url}` : \"[file]\";\n }\n if (msgtype === \"event\") {\n const eventtype = String((msg as { event?: { eventtype?: string } }).event?.eventtype ?? \"\").trim();\n return eventtype ? `[event] ${eventtype}` : \"[event]\";\n }\n if (msgtype === \"stream\") {\n const id = String((msg as { stream?: { id?: string } }).stream?.id ?? \"\").trim();\n return id ? `[stream_refresh] ${id}` : \"[stream_refresh]\";\n }\n return msgtype ? `[${msgtype}]` : \"\";\n}\n\nfunction resolveSenderId(msg: WecomInboundMessage): string {\n const userid = msg.from?.userid?.trim();\n return userid || \"unknown\";\n}\n\nfunction resolveChatType(msg: WecomInboundMessage): \"direct\" | \"group\" {\n return msg.chattype === \"group\" ? \"group\" : \"direct\";\n}\n\nfunction resolveChatId(msg: WecomInboundMessage, senderId: string, chatType: \"direct\" | \"group\"): string {\n if (chatType === \"group\") {\n return msg.chatid?.trim() || \"unknown\";\n }\n return senderId;\n}\n\nfunction buildInboundBody(msg: WecomInboundMessage): string {\n const msgtype = String(msg.msgtype ?? \"\").toLowerCase();\n if (msgtype === \"text\") {\n const content = (msg as { text?: { content?: string } }).text?.content;\n return typeof content === \"string\" ? content : \"\";\n }\n if (msgtype === \"voice\") {\n const content = (msg as { voice?: { content?: string } }).voice?.content;\n return typeof content === \"string\" ? content : \"[voice]\";\n }\n if (msgtype === \"mixed\") {\n const items = (msg as { mixed?: { msg_item?: unknown } }).mixed?.msg_item;\n if (Array.isArray(items)) {\n return items\n .map((item: unknown) => {\n if (!item || typeof item !== \"object\") return \"\";\n const typed = item as { msgtype?: string; text?: { content?: string }; image?: { url?: string } };\n const t = String(typed.msgtype ?? \"\").toLowerCase();\n if (t === \"text\") return String(typed.text?.content ?? \"\");\n if (t === \"image\") return `[image] ${String(typed.image?.url ?? \"\").trim()}`.trim();\n return t ? `[${t}]` : \"\";\n })\n .filter((part) => Boolean(part && part.trim()))\n .join(\"\\n\");\n }\n return \"[mixed]\";\n }\n if (msgtype === \"image\") {\n const url = String((msg as { image?: { url?: string } }).image?.url ?? \"\").trim();\n return url ? `[image] ${url}` : \"[image]\";\n }\n if (msgtype === \"file\") {\n const url = String((msg as { file?: { url?: string } }).file?.url ?? \"\").trim();\n return url ? `[file] ${url}` : \"[file]\";\n }\n if (msgtype === \"event\") {\n const eventtype = String((msg as { event?: { eventtype?: string } }).event?.eventtype ?? \"\").trim();\n return eventtype ? `[event] ${eventtype}` : \"[event]\";\n }\n if (msgtype === \"stream\") {\n const id = String((msg as { stream?: { id?: string } }).stream?.id ?? \"\").trim();\n return id ? `[stream_refresh] ${id}` : \"[stream_refresh]\";\n }\n return msgtype ? `[${msgtype}]` : \"\";\n}\n\nexport async function dispatchWecomMessage(params: {\n cfg?: PluginConfig;\n account: ResolvedWecomAccount;\n msg: WecomInboundMessage;\n core: PluginRuntime;\n hooks: WecomDispatchHooks;\n log?: (msg: string) => void;\n error?: (msg: string) => void;\n}): Promise<void> {\n const { cfg, account, msg, core, hooks } = params;\n const safeCfg = (cfg ?? {}) as PluginConfig;\n\n const logger: Logger = createLogger(\"wecom\", { log: params.log, error: params.error });\n\n const chatType = resolveChatType(msg);\n const senderId = resolveSenderId(msg);\n const chatId = resolveChatId(msg, senderId, chatType);\n\n const accountConfig = account?.config ?? {};\n\n if (chatType === \"group\") {\n const groupPolicy = resolveGroupPolicy(accountConfig);\n const groupAllowFrom = resolveGroupAllowFrom(accountConfig);\n const requireMention = resolveRequireMention(accountConfig);\n\n const policyResult = checkGroupPolicy({\n groupPolicy,\n conversationId: chatId,\n groupAllowFrom,\n requireMention,\n mentionedBot: true,\n });\n\n if (!policyResult.allowed) {\n logger.debug(`policy rejected: ${policyResult.reason}`);\n return;\n }\n } else {\n const dmPolicyRaw: WecomDmPolicy = accountConfig.dmPolicy ?? \"pairing\";\n if (dmPolicyRaw === \"disabled\") {\n logger.debug(\"dmPolicy=disabled, skipping dispatch\");\n return;\n }\n\n const allowFrom = resolveAllowFrom(accountConfig);\n const policyResult = checkDmPolicy({\n dmPolicy: dmPolicyRaw,\n senderId,\n allowFrom,\n });\n\n if (!policyResult.allowed) {\n logger.debug(`policy rejected: ${policyResult.reason}`);\n return;\n }\n }\n\n const channel = core.channel;\n if (!channel?.routing?.resolveAgentRoute || !channel.reply?.dispatchReplyWithBufferedBlockDispatcher) {\n logger.debug(\"core routing or buffered dispatcher missing, skipping dispatch\");\n return;\n }\n\n const route = channel.routing.resolveAgentRoute({\n cfg: safeCfg,\n channel: \"wecom\",\n peer: { kind: chatType === \"group\" ? \"group\" : \"dm\", id: chatId },\n });\n\n const rawBody = buildInboundBody(msg);\n const fromLabel = chatType === \"group\" ? `group:${chatId}` : `user:${senderId}`;\n\n const storePath = channel.session?.resolveStorePath?.(safeCfg.session?.store, {\n agentId: route.agentId,\n });\n\n const previousTimestamp = channel.session?.readSessionUpdatedAt\n ? channel.session.readSessionUpdatedAt({\n storePath,\n sessionKey: route.sessionKey,\n }) ?? undefined\n : undefined;\n\n const envelopeOptions = channel.reply?.resolveEnvelopeFormatOptions\n ? channel.reply.resolveEnvelopeFormatOptions(safeCfg)\n : undefined;\n\n const body = channel.reply?.formatAgentEnvelope\n ? channel.reply.formatAgentEnvelope({\n channel: \"WeCom\",\n from: fromLabel,\n previousTimestamp,\n envelope: envelopeOptions,\n body: rawBody,\n })\n : rawBody;\n\n const ctxPayload = (channel.reply?.finalizeInboundContext\n ? channel.reply.finalizeInboundContext({\n Body: body,\n RawBody: rawBody,\n CommandBody: rawBody,\n From: chatType === \"group\" ? `wecom:group:${chatId}` : `wecom:${senderId}`,\n To: `wecom:${chatId}`,\n SessionKey: route.sessionKey,\n AccountId: route.accountId,\n ChatType: chatType,\n ConversationLabel: fromLabel,\n SenderName: senderId,\n SenderId: senderId,\n Provider: \"wecom\",\n Surface: \"wecom\",\n MessageSid: msg.msgid,\n OriginatingChannel: \"wecom\",\n OriginatingTo: `wecom:${chatId}`,\n })\n : {\n Body: body,\n RawBody: rawBody,\n CommandBody: rawBody,\n From: chatType === \"group\" ? `wecom:group:${chatId}` : `wecom:${senderId}`,\n To: `wecom:${chatId}`,\n SessionKey: route.sessionKey,\n AccountId: route.accountId,\n ChatType: chatType,\n ConversationLabel: fromLabel,\n SenderName: senderId,\n SenderId: senderId,\n Provider: \"wecom\",\n Surface: \"wecom\",\n MessageSid: msg.msgid,\n OriginatingChannel: \"wecom\",\n OriginatingTo: `wecom:${chatId}`,\n }) as {\n SessionKey?: string;\n [key: string]: unknown;\n };\n\n if (channel.session?.recordInboundSession && storePath) {\n await channel.session.recordInboundSession({\n storePath,\n sessionKey: ctxPayload.SessionKey ?? route.sessionKey,\n ctx: ctxPayload,\n onRecordError: (err: unknown) => {\n logger.error(`wecom: failed updating session meta: ${String(err)}`);\n },\n });\n }\n\n const tableMode = channel.text?.resolveMarkdownTableMode\n ? channel.text.resolveMarkdownTableMode({ cfg: safeCfg, channel: \"wecom\", accountId: account.accountId })\n : undefined;\n\n await channel.reply.dispatchReplyWithBufferedBlockDispatcher({\n ctx: ctxPayload,\n cfg: safeCfg,\n dispatcherOptions: {\n deliver: async (payload: { text?: string }) => {\n const rawText = payload.text ?? \"\";\n if (!rawText.trim()) return;\n const converted = channel.text?.convertMarkdownTables && tableMode\n ? channel.text.convertMarkdownTables(rawText, tableMode)\n : rawText;\n hooks.onChunk(converted);\n },\n onError: (err: unknown, info: { kind: string }) => {\n hooks.onError?.(err);\n logger.error(`${info.kind} reply failed: ${String(err)}`);\n },\n },\n });\n}\r\n","/**\n * 企业微信插件运行时管理\n */\n\nexport interface PluginRuntime {\n log?: (msg: string) => void;\n error?: (msg: string) => void;\n channel?: {\n routing?: {\n resolveAgentRoute?: (params: {\n cfg: unknown;\n channel: string;\n peer: { kind: string; id: string };\n }) => { sessionKey: string; accountId: string; agentId?: string };\n };\n reply?: {\n dispatchReplyFromConfig?: (params: {\n ctx: unknown;\n cfg: unknown;\n dispatcher?: unknown;\n replyOptions?: unknown;\n }) => Promise<{ queuedFinal: boolean; counts: { final: number } }>;\n dispatchReplyWithBufferedBlockDispatcher?: (params: {\n ctx: unknown;\n cfg: unknown;\n dispatcherOptions: {\n deliver: (payload: { text?: string }) => Promise<void>;\n onError?: (err: unknown, info: { kind: string }) => void;\n };\n }) => Promise<void>;\n finalizeInboundContext?: (ctx: unknown) => unknown;\n createReplyDispatcher?: (params: unknown) => unknown;\n createReplyDispatcherWithTyping?: (params: unknown) => {\n dispatcher: unknown;\n replyOptions?: unknown;\n markDispatchIdle?: () => void;\n };\n resolveHumanDelayConfig?: (cfg: unknown, agentId?: string) => unknown;\n resolveEnvelopeFormatOptions?: (cfg: unknown) => unknown;\n formatAgentEnvelope?: (params: {\n channel: string;\n from: string;\n previousTimestamp?: number;\n envelope?: unknown;\n body: string;\n }) => string;\n };\n session?: {\n resolveStorePath?: (store: unknown, params: { agentId?: string }) => string | undefined;\n readSessionUpdatedAt?: (params: { storePath?: string; sessionKey: string }) => number | null;\n recordInboundSession?: (params: {\n storePath: string;\n sessionKey: string;\n ctx: unknown;\n onRecordError?: (err: unknown) => void;\n }) => Promise<void>;\n };\n text?: {\n resolveMarkdownTableMode?: (params: { cfg: unknown; channel: string; accountId?: string }) => unknown;\n convertMarkdownTables?: (text: string, mode: unknown) => string;\n };\n };\n system?: {\n enqueueSystemEvent?: (message: string, options?: unknown) => void;\n };\n [key: string]: unknown;\n}\n\nlet runtime: PluginRuntime | null = null;\n\nexport function setWecomRuntime(next: PluginRuntime): void {\n runtime = next;\n}\n\nexport function getWecomRuntime(): PluginRuntime {\n if (!runtime) {\n throw new Error(\"WeCom runtime not initialized. Make sure the plugin is properly registered with Moltbot.\");\n }\n return runtime;\n}\n\nexport function tryGetWecomRuntime(): PluginRuntime | null {\n return runtime;\n}\n\nexport function isWecomRuntimeInitialized(): boolean {\n return runtime !== null;\n}\n\nexport function clearWecomRuntime(): void {\n runtime = null;\n}\r\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport crypto from \"node:crypto\";\n\nimport { createLogger, type Logger } from \"@openclaw-china/shared\";\n\nimport type { ResolvedWecomAccount, WecomInboundMessage } from \"./types.js\";\nimport type { PluginConfig } from \"./config.js\";\nimport { decryptWecomEncrypted, encryptWecomPlaintext, verifyWecomSignature, computeWecomMsgSignature } from \"./crypto.js\";\nimport { dispatchWecomMessage } from \"./bot.js\";\nimport { tryGetWecomRuntime } from \"./runtime.js\";\n\nexport type WecomRuntimeEnv = {\n log?: (message: string) => void;\n error?: (message: string) => void;\n};\n\ntype WecomWebhookTarget = {\n account: ResolvedWecomAccount;\n config: PluginConfig;\n runtime: WecomRuntimeEnv;\n path: string;\n statusSink?: (patch: { lastInboundAt?: number; lastOutboundAt?: number }) => void;\n};\n\ntype StreamState = {\n streamId: string;\n msgid?: string;\n createdAt: number;\n updatedAt: number;\n started: boolean;\n finished: boolean;\n error?: string;\n content: string;\n};\n\nconst webhookTargets = new Map<string, WecomWebhookTarget[]>();\nconst streams = new Map<string, StreamState>();\nconst msgidToStreamId = new Map<string, string>();\n\nconst STREAM_TTL_MS = 10 * 60 * 1000;\nconst STREAM_MAX_BYTES = 20_480;\nconst INITIAL_STREAM_WAIT_MS = 800;\n\nfunction normalizeWebhookPath(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return \"/\";\n const withSlash = trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`;\n if (withSlash.length > 1 && withSlash.endsWith(\"/\")) return withSlash.slice(0, -1);\n return withSlash;\n}\n\nfunction pruneStreams(): void {\n const cutoff = Date.now() - STREAM_TTL_MS;\n for (const [id, state] of streams.entries()) {\n if (state.updatedAt < cutoff) {\n streams.delete(id);\n }\n }\n for (const [msgid, id] of msgidToStreamId.entries()) {\n if (!streams.has(id)) {\n msgidToStreamId.delete(msgid);\n }\n }\n}\n\nfunction truncateUtf8Bytes(text: string, maxBytes: number): string {\n const buf = Buffer.from(text, \"utf8\");\n if (buf.length <= maxBytes) return text;\n const slice = buf.subarray(buf.length - maxBytes);\n return slice.toString(\"utf8\");\n}\n\nfunction jsonOk(res: ServerResponse, body: unknown): void {\n res.statusCode = 200;\n res.setHeader(\"Content-Type\", \"text/plain; charset=utf-8\");\n res.end(JSON.stringify(body));\n}\n\nasync function readJsonBody(req: IncomingMessage, maxBytes: number) {\n const chunks: Buffer[] = [];\n let total = 0;\n return await new Promise<{ ok: boolean; value?: unknown; error?: string }>((resolve) => {\n req.on(\"data\", (chunk: Buffer) => {\n total += chunk.length;\n if (total > maxBytes) {\n resolve({ ok: false, error: \"payload too large\" });\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => {\n try {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (!raw.trim()) {\n resolve({ ok: false, error: \"empty payload\" });\n return;\n }\n resolve({ ok: true, value: JSON.parse(raw) as unknown });\n } catch (err) {\n resolve({ ok: false, error: err instanceof Error ? err.message : String(err) });\n }\n });\n req.on(\"error\", (err) => {\n resolve({ ok: false, error: err instanceof Error ? err.message : String(err) });\n });\n });\n}\n\nfunction buildEncryptedJsonReply(params: {\n account: ResolvedWecomAccount;\n plaintextJson: unknown;\n nonce: string;\n timestamp: string;\n}): { encrypt: string; msgsignature: string; timestamp: string; nonce: string } {\n const plaintext = JSON.stringify(params.plaintextJson ?? {});\n const encrypt = encryptWecomPlaintext({\n encodingAESKey: params.account.encodingAESKey ?? \"\",\n receiveId: params.account.receiveId ?? \"\",\n plaintext,\n });\n const msgsignature = computeWecomMsgSignature({\n token: params.account.token ?? \"\",\n timestamp: params.timestamp,\n nonce: params.nonce,\n encrypt,\n });\n return {\n encrypt,\n msgsignature,\n timestamp: params.timestamp,\n nonce: params.nonce,\n };\n}\n\nfunction resolveQueryParams(req: IncomingMessage): URLSearchParams {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n return url.searchParams;\n}\n\nfunction resolvePath(req: IncomingMessage): string {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n return normalizeWebhookPath(url.pathname || \"/\");\n}\n\nfunction resolveSignatureParam(params: URLSearchParams): string {\n return params.get(\"msg_signature\") ?? params.get(\"msgsignature\") ?? params.get(\"signature\") ?? \"\";\n}\n\nfunction buildStreamPlaceholderReply(streamId: string): { msgtype: \"stream\"; stream: { id: string; finish: boolean; content: string } } {\n return {\n msgtype: \"stream\",\n stream: {\n id: streamId,\n finish: false,\n content: \"稍等~\",\n },\n };\n}\n\nfunction buildStreamReplyFromState(state: StreamState): { msgtype: \"stream\"; stream: { id: string; finish: boolean; content: string } } {\n const content = truncateUtf8Bytes(state.content, STREAM_MAX_BYTES);\n return {\n msgtype: \"stream\",\n stream: {\n id: state.streamId,\n finish: state.finished,\n content,\n },\n };\n}\n\nfunction createStreamId(): string {\n return crypto.randomBytes(16).toString(\"hex\");\n}\n\nfunction parseWecomPlainMessage(raw: string): WecomInboundMessage {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\") {\n return {};\n }\n return parsed as WecomInboundMessage;\n}\n\nasync function waitForStreamContent(streamId: string, maxWaitMs: number): Promise<void> {\n if (maxWaitMs <= 0) return;\n const startedAt = Date.now();\n await new Promise<void>((resolve) => {\n const tick = () => {\n const state = streams.get(streamId);\n if (!state) return resolve();\n if (state.error || state.finished || state.content.trim()) return resolve();\n if (Date.now() - startedAt >= maxWaitMs) return resolve();\n setTimeout(tick, 25);\n };\n tick();\n });\n}\n\nfunction appendStreamContent(state: StreamState, nextText: string): void {\n const content = state.content ? `${state.content}\\n\\n${nextText}`.trim() : nextText.trim();\n state.content = truncateUtf8Bytes(content, STREAM_MAX_BYTES);\n state.updatedAt = Date.now();\n}\n\nfunction buildLogger(target: WecomWebhookTarget): Logger {\n return createLogger(\"wecom\", {\n log: target.runtime.log,\n error: target.runtime.error,\n });\n}\n\nexport function registerWecomWebhookTarget(target: WecomWebhookTarget): () => void {\n const key = normalizeWebhookPath(target.path);\n const normalizedTarget = { ...target, path: key };\n const existing = webhookTargets.get(key) ?? [];\n const next = [...existing, normalizedTarget];\n webhookTargets.set(key, next);\n return () => {\n const updated = (webhookTargets.get(key) ?? []).filter((entry) => entry !== normalizedTarget);\n if (updated.length > 0) webhookTargets.set(key, updated);\n else webhookTargets.delete(key);\n };\n}\n\nexport async function handleWecomWebhookRequest(req: IncomingMessage, res: ServerResponse): Promise<boolean> {\n pruneStreams();\n\n const path = resolvePath(req);\n const targets = webhookTargets.get(path);\n if (!targets || targets.length === 0) return false;\n\n const query = resolveQueryParams(req);\n const timestamp = query.get(\"timestamp\") ?? \"\";\n const nonce = query.get(\"nonce\") ?? \"\";\n const signature = resolveSignatureParam(query);\n\n const primary = targets[0]!;\n const logger = buildLogger(primary);\n logger.debug(`incoming ${req.method} request on ${path} (timestamp=${timestamp}, nonce=${nonce})`);\n\n if (req.method === \"GET\") {\n const echostr = query.get(\"echostr\") ?? \"\";\n if (!timestamp || !nonce || !signature || !echostr) {\n res.statusCode = 400;\n res.end(\"missing query params\");\n return true;\n }\n\n const target = targets.find((candidate) => {\n if (!candidate.account.configured || !candidate.account.token) return false;\n return verifyWecomSignature({\n token: candidate.account.token,\n timestamp,\n nonce,\n encrypt: echostr,\n signature,\n });\n });\n\n if (!target || !target.account.encodingAESKey) {\n res.statusCode = 401;\n res.end(\"unauthorized\");\n return true;\n }\n\n try {\n const plain = decryptWecomEncrypted({\n encodingAESKey: target.account.encodingAESKey,\n receiveId: target.account.receiveId,\n encrypt: echostr,\n });\n res.statusCode = 200;\n res.setHeader(\"Content-Type\", \"text/plain; charset=utf-8\");\n res.end(plain);\n return true;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n res.statusCode = 400;\n res.end(msg || \"decrypt failed\");\n return true;\n }\n }\n\n if (req.method !== \"POST\") {\n res.statusCode = 405;\n res.setHeader(\"Allow\", \"GET, POST\");\n res.end(\"Method Not Allowed\");\n return true;\n }\n\n if (!timestamp || !nonce || !signature) {\n res.statusCode = 400;\n res.end(\"missing query params\");\n return true;\n }\n\n const body = await readJsonBody(req, 1024 * 1024);\n if (!body.ok) {\n res.statusCode = body.error === \"payload too large\" ? 413 : 400;\n res.end(body.error ?? \"invalid payload\");\n return true;\n }\n\n const record = body.value && typeof body.value === \"object\" ? (body.value as Record<string, unknown>) : null;\n const encrypt = record ? String(record.encrypt ?? record.Encrypt ?? \"\") : \"\";\n if (!encrypt) {\n res.statusCode = 400;\n res.end(\"missing encrypt\");\n return true;\n }\n\n const target = targets.find((candidate) => {\n if (!candidate.account.token) return false;\n return verifyWecomSignature({\n token: candidate.account.token,\n timestamp,\n nonce,\n encrypt,\n signature,\n });\n });\n\n if (!target) {\n res.statusCode = 401;\n res.end(\"unauthorized\");\n return true;\n }\n\n if (!target.account.configured || !target.account.token || !target.account.encodingAESKey) {\n res.statusCode = 500;\n res.end(\"wecom not configured\");\n return true;\n }\n\n let plain: string;\n try {\n plain = decryptWecomEncrypted({\n encodingAESKey: target.account.encodingAESKey,\n receiveId: target.account.receiveId,\n encrypt,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n res.statusCode = 400;\n res.end(msg || \"decrypt failed\");\n return true;\n }\n\n const msg = parseWecomPlainMessage(plain);\n target.statusSink?.({ lastInboundAt: Date.now() });\n\n const msgtype = String(msg.msgtype ?? \"\").toLowerCase();\n const msgid = msg.msgid ? String(msg.msgid) : undefined;\n\n if (msgtype === \"stream\") {\n const streamId = String((msg as { stream?: { id?: string } }).stream?.id ?? \"\").trim();\n const state = streamId ? streams.get(streamId) : undefined;\n const reply = state\n ? buildStreamReplyFromState(state)\n : buildStreamReplyFromState({\n streamId: streamId || \"unknown\",\n createdAt: Date.now(),\n updatedAt: Date.now(),\n started: true,\n finished: true,\n content: \"\",\n });\n jsonOk(\n res,\n buildEncryptedJsonReply({\n account: target.account,\n plaintextJson: reply,\n nonce,\n timestamp,\n })\n );\n return true;\n }\n\n if (msgid && msgidToStreamId.has(msgid)) {\n const streamId = msgidToStreamId.get(msgid) ?? \"\";\n const reply = buildStreamPlaceholderReply(streamId);\n jsonOk(\n res,\n buildEncryptedJsonReply({\n account: target.account,\n plaintextJson: reply,\n nonce,\n timestamp,\n })\n );\n return true;\n }\n\n if (msgtype === \"event\") {\n const eventtype = String((msg as { event?: { eventtype?: string } }).event?.eventtype ?? \"\").toLowerCase();\n if (eventtype === \"enter_chat\") {\n const welcome = target.account.config.welcomeText?.trim();\n const reply = welcome ? { msgtype: \"text\", text: { content: welcome } } : {};\n jsonOk(\n res,\n buildEncryptedJsonReply({\n account: target.account,\n plaintextJson: reply,\n nonce,\n timestamp,\n })\n );\n return true;\n }\n\n jsonOk(\n res,\n buildEncryptedJsonReply({\n account: target.account,\n plaintextJson: {},\n nonce,\n timestamp,\n })\n );\n return true;\n }\n\n const streamId = createStreamId();\n if (msgid) msgidToStreamId.set(msgid, streamId);\n streams.set(streamId, {\n streamId,\n msgid,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n started: false,\n finished: false,\n content: \"\",\n });\n\n const core = tryGetWecomRuntime();\n\n if (core) {\n const state = streams.get(streamId);\n if (state) state.started = true;\n\n const hooks = {\n onChunk: (text: string) => {\n const current = streams.get(streamId);\n if (!current) return;\n appendStreamContent(current, text);\n target.statusSink?.({ lastOutboundAt: Date.now() });\n },\n onError: (err: unknown) => {\n const current = streams.get(streamId);\n if (current) {\n current.error = err instanceof Error ? err.message : String(err);\n current.content = current.content || `Error: ${current.error}`;\n current.finished = true;\n current.updatedAt = Date.now();\n }\n logger.error(`wecom agent failed: ${String(err)}`);\n },\n };\n\n dispatchWecomMessage({\n cfg: target.config,\n account: target.account,\n msg,\n core,\n hooks,\n log: target.runtime.log,\n error: target.runtime.error,\n })\n .then(() => {\n const current = streams.get(streamId);\n if (current) {\n current.finished = true;\n current.updatedAt = Date.now();\n }\n })\n .catch((err) => {\n const current = streams.get(streamId);\n if (current) {\n current.error = err instanceof Error ? err.message : String(err);\n current.content = current.content || `Error: ${current.error}`;\n current.finished = true;\n current.updatedAt = Date.now();\n }\n logger.error(`wecom agent failed: ${String(err)}`);\n });\n } else {\n const state = streams.get(streamId);\n if (state) {\n state.finished = true;\n state.updatedAt = Date.now();\n }\n }\n\n await waitForStreamContent(streamId, INITIAL_STREAM_WAIT_MS);\n const state = streams.get(streamId);\n const initialReply = state && (state.content.trim() || state.error)\n ? buildStreamReplyFromState(state)\n : buildStreamPlaceholderReply(streamId);\n\n jsonOk(\n res,\n buildEncryptedJsonReply({\n account: target.account,\n plaintextJson: initialReply,\n nonce,\n timestamp,\n })\n );\n\n return true;\n}\r\n","/**\n * 企业微信 ChannelPlugin 实现\n */\n\nimport type { ResolvedWecomAccount, WecomConfig } from \"./types.js\";\nimport {\n DEFAULT_ACCOUNT_ID,\n listWecomAccountIds,\n resolveDefaultWecomAccountId,\n resolveWecomAccount,\n resolveAllowFrom,\n resolveGroupAllowFrom,\n resolveRequireMention,\n WecomConfigJsonSchema,\n type PluginConfig,\n} from \"./config.js\";\nimport { registerWecomWebhookTarget } from \"./monitor.js\";\nimport { setWecomRuntime } from \"./runtime.js\";\n\nconst meta = {\n id: \"wecom\",\n label: \"WeCom\",\n selectionLabel: \"WeCom (企业微信)\",\n docsPath: \"/channels/wecom\",\n docsLabel: \"wecom\",\n blurb: \"企业微信智能机器人回调\",\n aliases: [\"wechatwork\", \"wework\", \"qywx\", \"企微\", \"企业微信\"],\n order: 85,\n} as const;\n\nconst unregisterHooks = new Map<string, () => void>();\n\nexport const wecomPlugin = {\n id: \"wecom\",\n\n meta: {\n ...meta,\n },\n\n capabilities: {\n chatTypes: [\"direct\", \"group\"] as const,\n media: false,\n reactions: false,\n threads: false,\n edit: false,\n reply: true,\n polls: false,\n },\n\n configSchema: WecomConfigJsonSchema,\n\n reload: { configPrefixes: [\"channels.wecom\"] },\n\n config: {\n listAccountIds: (cfg: PluginConfig): string[] => listWecomAccountIds(cfg),\n\n resolveAccount: (cfg: PluginConfig, accountId?: string): ResolvedWecomAccount =>\n resolveWecomAccount({ cfg, accountId }),\n\n defaultAccountId: (cfg: PluginConfig): string => resolveDefaultWecomAccountId(cfg),\n\n setAccountEnabled: (params: { cfg: PluginConfig; accountId?: string; enabled: boolean }): PluginConfig => {\n const accountId = params.accountId ?? DEFAULT_ACCOUNT_ID;\n const useAccount = Boolean(params.cfg.channels?.wecom?.accounts?.[accountId]);\n if (!useAccount) {\n return {\n ...params.cfg,\n channels: {\n ...params.cfg.channels,\n wecom: {\n ...(params.cfg.channels?.wecom ?? {}),\n enabled: params.enabled,\n } as WecomConfig,\n },\n };\n }\n\n return {\n ...params.cfg,\n channels: {\n ...params.cfg.channels,\n wecom: {\n ...(params.cfg.channels?.wecom ?? {}),\n accounts: {\n ...(params.cfg.channels?.wecom?.accounts ?? {}),\n [accountId]: {\n ...(params.cfg.channels?.wecom?.accounts?.[accountId] ?? {}),\n enabled: params.enabled,\n },\n },\n } as WecomConfig,\n },\n };\n },\n\n deleteAccount: (params: { cfg: PluginConfig; accountId?: string }): PluginConfig => {\n const accountId = params.accountId ?? DEFAULT_ACCOUNT_ID;\n const next = { ...params.cfg };\n const current = next.channels?.wecom;\n if (!current) return next;\n\n if (accountId === DEFAULT_ACCOUNT_ID) {\n const { accounts: _ignored, defaultAccount: _ignored2, ...rest } = current as WecomConfig;\n next.channels = {\n ...next.channels,\n wecom: { ...(rest as WecomConfig), enabled: false },\n };\n return next;\n }\n\n const accounts = { ...(current.accounts ?? {}) };\n delete accounts[accountId];\n\n next.channels = {\n ...next.channels,\n wecom: {\n ...(current as WecomConfig),\n accounts: Object.keys(accounts).length > 0 ? accounts : undefined,\n },\n };\n\n return next;\n },\n\n isConfigured: (account: ResolvedWecomAccount): boolean => account.configured,\n\n describeAccount: (account: ResolvedWecomAccount) => ({\n accountId: account.accountId,\n name: account.name,\n enabled: account.enabled,\n configured: account.configured,\n webhookPath: account.config.webhookPath ?? \"/wecom\",\n }),\n\n resolveAllowFrom: (params: { cfg: PluginConfig; accountId?: string }): string[] => {\n const account = resolveWecomAccount({ cfg: params.cfg, accountId: params.accountId });\n return resolveAllowFrom(account.config);\n },\n\n formatAllowFrom: (params: { allowFrom: (string | number)[] }): string[] =>\n params.allowFrom\n .map((entry) => String(entry).trim())\n .filter(Boolean)\n .map((entry) => entry.toLowerCase()),\n },\n\n groups: {\n resolveRequireMention: (params: { cfg: PluginConfig; accountId?: string; account?: ResolvedWecomAccount }): boolean => {\n const account = params.account ?? resolveWecomAccount({ cfg: params.cfg ?? {}, accountId: params.accountId });\n return resolveRequireMention(account.config);\n },\n },\n\n outbound: {\n deliveryMode: \"direct\",\n sendText: async () => {\n return {\n channel: \"wecom\",\n ok: false,\n messageId: \"\",\n error: new Error(\"WeCom intelligent bot only supports replying within callbacks (no standalone sendText).\"),\n };\n },\n },\n\n gateway: {\n startAccount: async (ctx: {\n cfg: PluginConfig;\n runtime?: unknown;\n abortSignal?: AbortSignal;\n accountId: string;\n setStatus?: (status: Record<string, unknown>) => void;\n log?: { info: (msg: string) => void; error: (msg: string) => void };\n }): Promise<void> => {\n ctx.setStatus?.({ accountId: ctx.accountId });\n\n if (ctx.runtime) {\n const candidate = ctx.runtime as {\n channel?: {\n routing?: { resolveAgentRoute?: unknown };\n reply?: { dispatchReplyFromConfig?: unknown };\n };\n };\n if (candidate.channel?.routing?.resolveAgentRoute && candidate.channel?.reply?.dispatchReplyFromConfig) {\n setWecomRuntime(ctx.runtime as Record<string, unknown>);\n }\n }\n\n const account = resolveWecomAccount({ cfg: ctx.cfg, accountId: ctx.accountId });\n if (!account.configured) {\n ctx.log?.info(`[wecom] account ${ctx.accountId} not configured; webhook not registered`);\n ctx.setStatus?.({ accountId: ctx.accountId, running: false, configured: false });\n return;\n }\n\n const path = (account.config.webhookPath ?? \"/wecom\").trim();\n const unregister = registerWecomWebhookTarget({\n account,\n config: (ctx.cfg ?? {}) as PluginConfig,\n runtime: {\n log: ctx.log?.info ?? console.log,\n error: ctx.log?.error ?? console.error,\n },\n path,\n statusSink: (patch) => ctx.setStatus?.({ accountId: ctx.accountId, ...patch }),\n });\n\n const existing = unregisterHooks.get(ctx.accountId);\n if (existing) existing();\n unregisterHooks.set(ctx.accountId, unregister);\n\n ctx.log?.info(`[wecom] webhook registered at ${path} for account ${ctx.accountId}`);\n ctx.setStatus?.({\n accountId: ctx.accountId,\n running: true,\n configured: true,\n webhookPath: path,\n lastStartAt: Date.now(),\n });\n },\n\n stopAccount: async (ctx: { accountId: string; setStatus?: (status: Record<string, unknown>) => void }): Promise<void> => {\n const unregister = unregisterHooks.get(ctx.accountId);\n if (unregister) {\n unregister();\n unregisterHooks.delete(ctx.accountId);\n }\n ctx.setStatus?.({ accountId: ctx.accountId, running: false, lastStopAt: Date.now() });\n },\n },\n};\n\nexport { DEFAULT_ACCOUNT_ID } from \"./config.js\";\r\n","/**\n * @openclaw-china/wecom\n * 企业微信渠道插件入口\n *\n * 导出:\n * - wecomPlugin: ChannelPlugin 实现\n * - DEFAULT_ACCOUNT_ID: 默认账户 ID\n * - setWecomRuntime: 设置 Moltbot 运行时\n */\n\nimport type { IncomingMessage, ServerResponse } from \"http\";\n\nimport { wecomPlugin, DEFAULT_ACCOUNT_ID } from \"./src/channel.js\";\nimport { setWecomRuntime, getWecomRuntime } from \"./src/runtime.js\";\nimport { handleWecomWebhookRequest } from \"./src/monitor.js\";\n\n/**\n * Moltbot 插件 API 接口\n */\nexport interface MoltbotPluginApi {\n registerChannel: (opts: { plugin: unknown }) => void;\n registerHttpHandler?: (handler: (req: IncomingMessage, res: ServerResponse) => Promise<boolean> | boolean) => void;\n runtime?: unknown;\n [key: string]: unknown;\n}\n\n// 导出 ChannelPlugin\nexport { wecomPlugin, DEFAULT_ACCOUNT_ID } from \"./src/channel.js\";\n\n// 导出 runtime 管理函数\nexport { setWecomRuntime, getWecomRuntime } from \"./src/runtime.js\";\n\n// 导出类型\nexport type { WecomConfig, ResolvedWecomAccount, WecomInboundMessage } from \"./src/types.js\";\n\nconst plugin = {\n id: \"wecom\",\n name: \"WeCom\",\n description: \"企业微信智能机器人回调插件\",\n configSchema: {\n type: \"object\",\n additionalProperties: false,\n properties: {},\n },\n register(api: MoltbotPluginApi) {\n if (api.runtime) {\n setWecomRuntime(api.runtime as Record<string, unknown>);\n }\n\n api.registerChannel({ plugin: wecomPlugin });\n\n if (api.registerHttpHandler) {\n api.registerHttpHandler(handleWecomWebhookRequest);\n }\n },\n};\n\nexport default plugin;\r\n"]}
@@ -0,0 +1,52 @@
1
+ {
2
+ "id": "wecom",
3
+ "name": "WeCom",
4
+ "description": "企业微信消息渠道插件",
5
+ "version": "0.1.0",
6
+ "channels": ["wecom"],
7
+ "configSchema": {
8
+ "type": "object",
9
+ "additionalProperties": false,
10
+ "properties": {
11
+ "enabled": { "type": "boolean" },
12
+ "name": { "type": "string" },
13
+ "webhookPath": { "type": "string" },
14
+ "token": { "type": "string" },
15
+ "encodingAESKey": { "type": "string" },
16
+ "receiveId": { "type": "string" },
17
+ "welcomeText": { "type": "string" },
18
+ "dmPolicy": { "type": "string", "enum": ["open", "pairing", "allowlist", "disabled"] },
19
+ "allowFrom": { "type": "array", "items": { "type": "string" } },
20
+ "groupPolicy": { "type": "string", "enum": ["open", "allowlist", "disabled"] },
21
+ "groupAllowFrom": { "type": "array", "items": { "type": "string" } },
22
+ "requireMention": { "type": "boolean" },
23
+ "defaultAccount": { "type": "string" },
24
+ "accounts": {
25
+ "type": "object",
26
+ "additionalProperties": {
27
+ "type": "object",
28
+ "additionalProperties": false,
29
+ "properties": {
30
+ "name": { "type": "string" },
31
+ "enabled": { "type": "boolean" },
32
+ "webhookPath": { "type": "string" },
33
+ "token": { "type": "string" },
34
+ "encodingAESKey": { "type": "string" },
35
+ "receiveId": { "type": "string" },
36
+ "welcomeText": { "type": "string" },
37
+ "dmPolicy": { "type": "string", "enum": ["open", "pairing", "allowlist", "disabled"] },
38
+ "allowFrom": { "type": "array", "items": { "type": "string" } },
39
+ "groupPolicy": { "type": "string", "enum": ["open", "allowlist", "disabled"] },
40
+ "groupAllowFrom": { "type": "array", "items": { "type": "string" } },
41
+ "requireMention": { "type": "boolean" }
42
+ }
43
+ }
44
+ }
45
+ }
46
+ },
47
+ "uiHints": {
48
+ "token": { "label": "Token", "sensitive": true },
49
+ "encodingAESKey": { "label": "EncodingAESKey", "sensitive": true },
50
+ "webhookPath": { "label": "Webhook Path" }
51
+ }
52
+ }
package/package.json ADDED
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "@openclaw-china/wecom",
3
+ "version": "0.1.1",
4
+ "type": "module",
5
+ "description": "Moltbot WeCom (WeChat Work) channel plugin",
6
+ "license": "MIT",
7
+ "files": [
8
+ "dist",
9
+ "moltbot.plugin.json",
10
+ "clawdbot.plugin.json"
11
+ ],
12
+ "moltbot": {
13
+ "extensions": [
14
+ "./dist/index.js"
15
+ ],
16
+ "channel": {
17
+ "id": "wecom",
18
+ "label": "WeCom",
19
+ "selectionLabel": "WeCom (企业微信)",
20
+ "docsPath": "/channels/wecom",
21
+ "blurb": "企业微信智能机器人回调",
22
+ "aliases": [
23
+ "wechatwork",
24
+ "wework",
25
+ "qywx"
26
+ ],
27
+ "order": 85
28
+ },
29
+ "install": {
30
+ "npmSpec": "@openclaw-china/wecom",
31
+ "localPath": ".",
32
+ "defaultChoice": "npm"
33
+ }
34
+ },
35
+ "clawdbot": {
36
+ "extensions": [
37
+ "./dist/index.js"
38
+ ],
39
+ "channel": {
40
+ "id": "wecom",
41
+ "label": "WeCom",
42
+ "selectionLabel": "WeCom (企业微信)",
43
+ "docsPath": "/channels/wecom",
44
+ "blurb": "企业微信智能机器人回调",
45
+ "aliases": [
46
+ "wechatwork",
47
+ "wework",
48
+ "qywx"
49
+ ],
50
+ "order": 85
51
+ },
52
+ "install": {
53
+ "npmSpec": "@openclaw-china/wecom",
54
+ "localPath": ".",
55
+ "defaultChoice": "npm"
56
+ }
57
+ },
58
+ "main": "./dist/index.js",
59
+ "types": "./dist/index.d.ts",
60
+ "exports": {
61
+ ".": {
62
+ "types": "./dist/index.d.ts",
63
+ "default": "./dist/index.js"
64
+ }
65
+ },
66
+ "scripts": {
67
+ "build": "tsup",
68
+ "dev": "tsup --watch",
69
+ "test": "vitest --run",
70
+ "test:watch": "vitest",
71
+ "release": "npm run build && npm publish",
72
+ "release:patch": "npm run build && npm version patch && npm publish",
73
+ "release:minor": "npm run build && npm version minor && npm publish",
74
+ "release:major": "npm run build && npm version major && npm publish"
75
+ },
76
+ "dependencies": {
77
+ "@openclaw-china/shared": "0.1.11"
78
+ },
79
+ "devDependencies": {
80
+ "@types/node": "^22.0.0",
81
+ "fast-check": "^3.22.0",
82
+ "tsup": "^8.2.0",
83
+ "typescript": "^5.7.0",
84
+ "vitest": "^2.1.0",
85
+ "zod": "^3.23.0"
86
+ },
87
+ "peerDependencies": {
88
+ "moltbot": ">=0.1.0"
89
+ },
90
+ "peerDependenciesMeta": {
91
+ "moltbot": {
92
+ "optional": true
93
+ }
94
+ },
95
+ "private": false
96
+ }