@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
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-card-parser.js","sources":["../../../../../src/template-card-parser.ts"],"sourcesContent":["/**\n * 模板卡片解析器\n *\n * 从 LLM 回复文本中提取 markdown JSON 代码块,验证其是否为合法的企业微信模板卡片,\n * 返回提取到的卡片列表和剩余文本。\n *\n * 同时提供 maskTemplateCardBlocks 函数,用于在流式中间帧中隐藏正在构建的卡片代码块,\n * 避免 JSON 源码暴露给终端用户。\n */\n\nimport { VALID_CARD_TYPES } from \"./const.js\";\nimport type { ExtractedTemplateCard, TemplateCardExtractionResult } from \"./interface.js\";\n\n// ============================================================================\n// LLM 输出字段类型修正\n// ============================================================================\n\n/**\n * 将 LLM 可能输出的字符串/非法值修正为企业微信 API 要求的整数。\n * 返回修正后的整数,若无法识别则返回 undefined(由调用方决定是否删除该字段)。\n */\nfunction coerceToInt(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.round(value);\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim().toLowerCase();\n // 纯数字字符串\n const num = Number(trimmed);\n if (!Number.isNaN(num) && Number.isFinite(num)) {\n return Math.round(num);\n }\n }\n return undefined;\n}\n\n/** 将 LLM 可能输出的字符串/非法值修正为布尔值 */\nfunction coerceToBool(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const t = value.trim().toLowerCase();\n if (t === \"true\" || t === \"1\" || t === \"yes\") return true;\n if (t === \"false\" || t === \"0\" || t === \"no\") return false;\n }\n if (typeof value === \"number\") return value !== 0;\n return undefined;\n}\n\n/** checkbox.mode 的语义别名映射 */\nconst MODE_ALIASES: Record<string, number> = {\n single: 0,\n radio: 0,\n \"单选\": 0,\n multi: 1,\n multiple: 1,\n \"多选\": 1,\n};\n\n/**\n * 修正 checkbox.mode:\n * - 0 → 单选,1 → 多选,仅允许这两个值\n * - 字符串数字 \"0\"/\"1\" → 整数\n * - 语义别名 \"multi\"/\"single\" 等 → 对应整数\n * - 其他正整数(如 2)→ clamp 到 1(多选)\n * - 无法识别 → 删除(让服务端使用默认值 0)\n */\nfunction coerceCheckboxMode(value: unknown): number | undefined {\n let num: number | undefined;\n if (typeof value === \"number\" && Number.isFinite(value)) {\n num = Math.round(value);\n } else if (typeof value === \"string\") {\n const trimmed = value.trim().toLowerCase();\n if (trimmed in MODE_ALIASES) return MODE_ALIASES[trimmed];\n const parsed = Number(trimmed);\n if (!Number.isNaN(parsed)) num = Math.round(parsed);\n }\n if (num === undefined) return undefined;\n // mode 只允许 0(单选)或 1(多选),超出范围 clamp\n if (num <= 0) return 0;\n return 1;\n}\n\n/**\n * 对 LLM 生成的模板卡片 JSON 做字段类型修正,确保符合企业微信 API 的类型要求。\n *\n * 修正范围:\n * - checkbox.mode: uint32(0=单选,1=多选)\n * - checkbox.disable: bool\n * - checkbox.option_list[].is_checked: bool\n * - source.desc_color: int\n * - quote_area.type: int\n * - card_action.type: int\n * - image_text_area.type: int\n * - horizontal_content_list[].type: int\n * - jump_list[].type: int\n * - button_list[].style: int\n * - button_selection.disable: bool\n * - select_list[].disable: bool\n *\n * 原则:能修就修,修不了就删(让服务端走默认值),绝不阻塞发送。\n */\nfunction normalizeTemplateCardFields(\n card: Record<string, unknown>,\n log?: (...args: any[]) => void,\n): Record<string, unknown> {\n const fixes: string[] = [];\n\n // ── checkbox ──────────────────────────────────────────────────────────\n const checkbox = card.checkbox as Record<string, unknown> | undefined;\n if (checkbox && typeof checkbox === \"object\") {\n // mode\n if (\"mode\" in checkbox) {\n const fixed = coerceCheckboxMode(checkbox.mode);\n if (fixed !== undefined) {\n if (checkbox.mode !== fixed) {\n fixes.push(`checkbox.mode: ${JSON.stringify(checkbox.mode)} → ${fixed}`);\n }\n checkbox.mode = fixed;\n } else {\n fixes.push(`checkbox.mode: ${JSON.stringify(checkbox.mode)} → (deleted, invalid)`);\n delete checkbox.mode;\n }\n }\n // disable\n if (\"disable\" in checkbox) {\n const fixed = coerceToBool(checkbox.disable);\n if (fixed !== undefined && checkbox.disable !== fixed) {\n fixes.push(`checkbox.disable: ${JSON.stringify(checkbox.disable)} → ${fixed}`);\n checkbox.disable = fixed;\n }\n }\n // option_list[].is_checked\n if (Array.isArray(checkbox.option_list)) {\n for (const opt of checkbox.option_list as Record<string, unknown>[]) {\n if (opt && typeof opt === \"object\" && \"is_checked\" in opt) {\n const fixed = coerceToBool(opt.is_checked);\n if (fixed !== undefined && opt.is_checked !== fixed) {\n fixes.push(`checkbox.option_list.is_checked: ${JSON.stringify(opt.is_checked)} → ${fixed}`);\n opt.is_checked = fixed;\n }\n }\n }\n }\n }\n\n // ── source.desc_color ────────────────────────────────────────────────\n const source = card.source as Record<string, unknown> | undefined;\n if (source && typeof source === \"object\" && \"desc_color\" in source) {\n const fixed = coerceToInt(source.desc_color);\n if (fixed !== undefined && source.desc_color !== fixed) {\n fixes.push(`source.desc_color: ${JSON.stringify(source.desc_color)} → ${fixed}`);\n source.desc_color = fixed;\n }\n }\n\n // ── card_action.type ─────────────────────────────────────────────────\n const cardAction = card.card_action as Record<string, unknown> | undefined;\n if (cardAction && typeof cardAction === \"object\" && \"type\" in cardAction) {\n const fixed = coerceToInt(cardAction.type);\n if (fixed !== undefined && cardAction.type !== fixed) {\n fixes.push(`card_action.type: ${JSON.stringify(cardAction.type)} → ${fixed}`);\n cardAction.type = fixed;\n }\n }\n\n // ── quote_area.type ──────────────────────────────────────────────────\n const quoteArea = card.quote_area as Record<string, unknown> | undefined;\n if (quoteArea && typeof quoteArea === \"object\" && \"type\" in quoteArea) {\n const fixed = coerceToInt(quoteArea.type);\n if (fixed !== undefined && quoteArea.type !== fixed) {\n fixes.push(`quote_area.type: ${JSON.stringify(quoteArea.type)} → ${fixed}`);\n quoteArea.type = fixed;\n }\n }\n\n // ── image_text_area.type ─────────────────────────────────────────────\n const imageTextArea = card.image_text_area as Record<string, unknown> | undefined;\n if (imageTextArea && typeof imageTextArea === \"object\" && \"type\" in imageTextArea) {\n const fixed = coerceToInt(imageTextArea.type);\n if (fixed !== undefined && imageTextArea.type !== fixed) {\n fixes.push(`image_text_area.type: ${JSON.stringify(imageTextArea.type)} → ${fixed}`);\n imageTextArea.type = fixed;\n }\n }\n\n // ── horizontal_content_list[].type ───────────────────────────────────\n if (Array.isArray(card.horizontal_content_list)) {\n for (const item of card.horizontal_content_list as Record<string, unknown>[]) {\n if (item && typeof item === \"object\" && \"type\" in item) {\n const fixed = coerceToInt(item.type);\n if (fixed !== undefined && item.type !== fixed) {\n fixes.push(`horizontal_content_list.type: ${JSON.stringify(item.type)} → ${fixed}`);\n item.type = fixed;\n }\n }\n }\n }\n\n // ── jump_list[].type ─────────────────────────────────────────────────\n if (Array.isArray(card.jump_list)) {\n for (const item of card.jump_list as Record<string, unknown>[]) {\n if (item && typeof item === \"object\" && \"type\" in item) {\n const fixed = coerceToInt(item.type);\n if (fixed !== undefined && item.type !== fixed) {\n fixes.push(`jump_list.type: ${JSON.stringify(item.type)} → ${fixed}`);\n item.type = fixed;\n }\n }\n }\n }\n\n // ── button_list[].style ──────────────────────────────────────────────\n if (Array.isArray(card.button_list)) {\n for (const btn of card.button_list as Record<string, unknown>[]) {\n if (btn && typeof btn === \"object\" && \"style\" in btn) {\n const fixed = coerceToInt(btn.style);\n if (fixed !== undefined && btn.style !== fixed) {\n fixes.push(`button_list.style: ${JSON.stringify(btn.style)} → ${fixed}`);\n btn.style = fixed;\n }\n }\n }\n }\n\n // ── button_selection.disable ─────────────────────────────────────────\n const buttonSelection = card.button_selection as Record<string, unknown> | undefined;\n if (buttonSelection && typeof buttonSelection === \"object\" && \"disable\" in buttonSelection) {\n const fixed = coerceToBool(buttonSelection.disable);\n if (fixed !== undefined && buttonSelection.disable !== fixed) {\n fixes.push(`button_selection.disable: ${JSON.stringify(buttonSelection.disable)} → ${fixed}`);\n buttonSelection.disable = fixed;\n }\n }\n\n // ── select_list[].disable ────────────────────────────────────────────\n if (Array.isArray(card.select_list)) {\n for (const sel of card.select_list as Record<string, unknown>[]) {\n if (sel && typeof sel === \"object\" && \"disable\" in sel) {\n const fixed = coerceToBool(sel.disable);\n if (fixed !== undefined && sel.disable !== fixed) {\n fixes.push(`select_list.disable: ${JSON.stringify(sel.disable)} → ${fixed}`);\n sel.disable = fixed;\n }\n }\n }\n }\n\n if (fixes.length > 0) {\n log?.(`[template-card-parser] normalizeTemplateCardFields: ${fixes.length} fix(es) applied: ${fixes.join(\"; \")}`);\n }\n\n return card;\n}\n\n// ============================================================================\n// 必填字段校验与自动补全\n// ============================================================================\n\n/** task_id 合法字符:数字、字母、_-@ */\nconst TASK_ID_RE = /^[a-zA-Z0-9_\\-@]+$/;\n\n/**\n * 生成一个合法的 task_id。\n * 格式:task_{cardType}_{timestamp}_{随机4位},确保唯一且符合 API 要求。\n */\nfunction generateTaskId(cardType: string): string {\n const rand = Math.random().toString(36).slice(2, 6);\n return `task_${cardType}_${Date.now()}_${rand}`;\n}\n\n/**\n * 校验并补全模板卡片的必填字段。\n *\n * 在 normalizeTemplateCardFields(类型修正)之后调用,确保卡片结构满足企业微信 API 的必填要求。\n *\n * 补全策略:\n * - task_id:所有卡片统一自动补全(交互型 API 必填,通知型插件也需要用于缓存回写)\n * - main_title:除 text_notice 外的 4 种卡片 API 必填,自动补 { title: \"通知\" }\n * text_notice 要求 main_title.title 与 sub_title_text 至少填一个,缺两个时补 sub_title_text\n * - card_action:text_notice / news_notice API 必填,自动补 { type: 1, url: \"https://work.weixin.qq.com\" }\n * - checkbox:vote_interaction API 必填,无法凭空补全,仅记告警\n * - submit_button:vote_interaction / multiple_interaction API 必填,自动补 { text: \"提交\", key: \"submit_default\" }\n * - button_list:button_interaction API 必填,无法凭空补全,仅记告警\n * - select_list:multiple_interaction API 必填,无法凭空补全,仅记告警\n */\nfunction validateAndFixRequiredFields(\n card: Record<string, unknown>,\n log?: (...args: any[]) => void,\n): Record<string, unknown> {\n const cardType = card.card_type as string;\n const fixes: string[] = [];\n const warnings: string[] = [];\n\n // ── task_id(所有卡片:始终确保唯一性) ─────────────────────────────\n // LLM 可能编造时间戳导致重复,因此无论是否提供了 task_id,\n // 都提取语义前缀 + 代码追加真实时间戳和随机后缀来保证唯一。\n const rawTid = (typeof card.task_id === \"string\" && card.task_id.trim()) ? card.task_id.trim() : \"\";\n const rand = Math.random().toString(36).slice(2, 6);\n const ts = Date.now();\n\n let finalTid: string;\n if (rawTid) {\n // 提取 LLM 的语义前缀:去掉尾部的数字串(LLM 编造的假时间戳)\n const prefix = rawTid.replace(/_\\d{8,}$/, \"\").replace(/[^a-zA-Z0-9_\\-@]/g, \"_\").slice(0, 80);\n finalTid = prefix ? `${prefix}_${ts}_${rand}` : `task_${cardType}_${ts}_${rand}`;\n } else {\n finalTid = `task_${cardType}_${ts}_${rand}`;\n }\n\n if (finalTid !== rawTid) {\n fixes.push(`task_id: \"${rawTid || \"(missing)\"}\" → \"${finalTid}\"`);\n }\n card.task_id = finalTid;\n\n // ── main_title ────────────────────────────────────────────────────────\n const mainTitle = card.main_title as Record<string, unknown> | undefined;\n const hasMainTitle = mainTitle && typeof mainTitle === \"object\" &&\n (typeof mainTitle.title === \"string\" && mainTitle.title.trim());\n const hasSubTitleText = typeof card.sub_title_text === \"string\" && (card.sub_title_text as string).trim();\n\n switch (cardType) {\n case \"text_notice\":\n // text_notice: main_title.title 和 sub_title_text 至少一个\n if (!hasMainTitle && !hasSubTitleText) {\n card.sub_title_text = card.sub_title_text || \"通知\";\n fixes.push(`sub_title_text: (missing, no main_title either) → fallback \"通知\"`);\n }\n break;\n\n case \"news_notice\":\n case \"button_interaction\":\n case \"vote_interaction\":\n case \"multiple_interaction\":\n // 这四种 main_title 为必填\n if (!mainTitle || typeof mainTitle !== \"object\") {\n card.main_title = { title: \"通知\" };\n fixes.push(`main_title: (missing) → { title: \"通知\" }`);\n } else if (!hasMainTitle) {\n (mainTitle as Record<string, unknown>).title = \"通知\";\n fixes.push(`main_title.title: (empty) → \"通知\"`);\n }\n break;\n }\n\n // ── card_action(text_notice / news_notice 必填) ──────────────────\n if (cardType === \"text_notice\" || cardType === \"news_notice\") {\n if (!card.card_action || typeof card.card_action !== \"object\") {\n card.card_action = { type: 1, url: \"https://work.weixin.qq.com\" };\n fixes.push(`card_action: (missing) → { type: 1, url: \"https://work.weixin.qq.com\" }`);\n }\n }\n\n // ── submit_button(vote_interaction / multiple_interaction 必填) ──\n if (cardType === \"vote_interaction\" || cardType === \"multiple_interaction\") {\n if (!card.submit_button || typeof card.submit_button !== \"object\") {\n card.submit_button = { text: \"提交\", key: `submit_${cardType}_${Date.now()}` };\n fixes.push(`submit_button: (missing) → auto-generated`);\n }\n }\n\n // ── 核心业务字段(无法凭空补全,仅告警) ────────────────────────────\n if (cardType === \"button_interaction\") {\n if (!Array.isArray(card.button_list) || card.button_list.length === 0) {\n warnings.push(`button_list is missing or empty (required for button_interaction)`);\n }\n }\n\n if (cardType === \"vote_interaction\") {\n if (!card.checkbox || typeof card.checkbox !== \"object\") {\n warnings.push(`checkbox is missing (required for vote_interaction)`);\n }\n }\n\n if (cardType === \"multiple_interaction\") {\n if (!Array.isArray(card.select_list) || card.select_list.length === 0) {\n warnings.push(`select_list is missing or empty (required for multiple_interaction)`);\n }\n }\n\n if (fixes.length > 0) {\n log?.(`[template-card-parser] validateAndFixRequiredFields: ${fixes.length} fix(es): ${fixes.join(\"; \")}`);\n }\n if (warnings.length > 0) {\n log?.(`[template-card-parser] validateAndFixRequiredFields: ${warnings.length} warning(s): ${warnings.join(\"; \")}`);\n }\n\n return card;\n}\n\n// ============================================================================\n// 简化格式 → 企微 API 格式转换(vote_interaction / multiple_interaction)\n// ============================================================================\n\n/**\n * 生成唯一的 question_key / submit_button.key。\n */\nfunction generateKey(prefix: string): string {\n const rand = Math.random().toString(36).slice(2, 6);\n return `${prefix}_${Date.now()}_${rand}`;\n}\n\n/**\n * 将 vote_interaction 的简化格式转换为企微 API 格式。\n *\n * 简化格式字段:\n * title → main_title.title\n * description → main_title.desc\n * options → checkbox.option_list(每个 {id, text} 直接透传)\n * mode → checkbox.mode(0=单选 1=多选)\n * submit_text → submit_button.text\n *\n * 代码自动生成:checkbox.question_key, submit_button.key\n *\n * 如果 LLM 已输出了合法的 API 原始格式(有 checkbox.option_list),则跳过转换直接透传。\n */\nfunction transformVoteInteraction(\n card: Record<string, unknown>,\n log?: (...args: any[]) => void,\n): Record<string, unknown> {\n // 防御性:如果已经是合法 API 格式,跳过\n const existingCheckbox = card.checkbox as Record<string, unknown> | undefined;\n if (existingCheckbox && typeof existingCheckbox === \"object\" && Array.isArray(existingCheckbox.option_list)) {\n log?.(`[template-card-parser] transformVoteInteraction: already has checkbox.option_list, skipping transform`);\n return card;\n }\n\n // 提取 options(简化格式的核心字段)\n const options = card.options as Array<Record<string, unknown>> | undefined;\n if (!Array.isArray(options) || options.length === 0) {\n log?.(`[template-card-parser] transformVoteInteraction: no \"options\" array found, skipping transform`);\n return card;\n }\n\n log?.(`[template-card-parser] transformVoteInteraction: transforming simplified format → API format`);\n log?.(`[template-card-parser] transformVoteInteraction: input=${JSON.stringify(card)}`);\n\n // ── 构建 main_title ──\n const title = card.title as string | undefined;\n const description = card.description as string | undefined;\n if (title || description) {\n card.main_title = {\n ...(title ? { title } : {}),\n ...(description ? { desc: description } : {}),\n };\n delete card.title;\n delete card.description;\n }\n\n // ── 构建 checkbox(最多 20 个选项) ──\n const mode = coerceCheckboxMode(card.mode) ?? 0;\n const questionKey = generateKey(\"vote\");\n const clampedOptions = options.slice(0, 20);\n if (options.length > 20) {\n log?.(`[template-card-parser] transformVoteInteraction: options count ${options.length} exceeds max 20, clamped to 20`);\n }\n card.checkbox = {\n question_key: questionKey,\n mode,\n option_list: clampedOptions.map((opt) => ({\n id: String(opt.id ?? opt.value ?? `opt_${Math.random().toString(36).slice(2, 6)}`),\n text: String(opt.text ?? opt.label ?? opt.name ?? \"\"),\n })),\n };\n delete card.options;\n delete card.mode;\n\n // ── 构建 submit_button ──\n const submitText = (card.submit_text as string) || \"提交\";\n card.submit_button = {\n text: submitText,\n key: generateKey(\"submit_vote\"),\n };\n delete card.submit_text;\n\n // ── 清理 LLM 可能杜撰的无效字段 ──\n delete card.vote_question;\n delete card.vote_option;\n delete card.vote_options;\n\n log?.(`[template-card-parser] transformVoteInteraction: output=${JSON.stringify(card)}`);\n\n return card;\n}\n\n/**\n * 将 multiple_interaction 的简化格式转换为企微 API 格式。\n *\n * 简化格式字段:\n * title → main_title.title\n * description → main_title.desc\n * selectors → select_list(每个 {title, options: [{id, text}]} → {question_key, title, option_list})\n * submit_text → submit_button.text\n *\n * 代码自动生成:select_list[].question_key, submit_button.key\n *\n * 如果 LLM 已输出了合法的 API 原始格式(有 select_list[0].option_list),则跳过转换直接透传。\n */\nfunction transformMultipleInteraction(\n card: Record<string, unknown>,\n log?: (...args: any[]) => void,\n): Record<string, unknown> {\n // 防御性:如果已经是合法 API 格式,跳过\n const existingSelectList = card.select_list as Array<Record<string, unknown>> | undefined;\n if (\n Array.isArray(existingSelectList) &&\n existingSelectList.length > 0 &&\n Array.isArray(existingSelectList[0]?.option_list)\n ) {\n log?.(`[template-card-parser] transformMultipleInteraction: already has select_list[].option_list, skipping transform`);\n return card;\n }\n\n // 提取 selectors(简化格式的核心字段)\n const selectors = card.selectors as Array<Record<string, unknown>> | undefined;\n if (!Array.isArray(selectors) || selectors.length === 0) {\n log?.(`[template-card-parser] transformMultipleInteraction: no \"selectors\" array found, skipping transform`);\n return card;\n }\n\n log?.(`[template-card-parser] transformMultipleInteraction: transforming simplified format → API format`);\n log?.(`[template-card-parser] transformMultipleInteraction: input=${JSON.stringify(card)}`);\n\n // ── 构建 main_title ──\n const title = card.title as string | undefined;\n const description = card.description as string | undefined;\n if (title || description) {\n card.main_title = {\n ...(title ? { title } : {}),\n ...(description ? { desc: description } : {}),\n };\n delete card.title;\n delete card.description;\n }\n\n // ── 构建 select_list(最多 3 个选择器,每个最多 10 个选项) ──\n const clampedSelectors = selectors.slice(0, 3);\n if (selectors.length > 3) {\n log?.(`[template-card-parser] transformMultipleInteraction: selectors count ${selectors.length} exceeds max 3, clamped to 3`);\n }\n card.select_list = clampedSelectors.map((sel, idx) => {\n const selectorOptions = ((sel.options as Array<Record<string, unknown>>) ?? []).slice(0, 10);\n return {\n question_key: generateKey(`sel_${idx}`),\n title: String(sel.title ?? sel.label ?? `选择${idx + 1}`),\n option_list: selectorOptions.map((opt) => ({\n id: String(opt.id ?? opt.value ?? `opt_${Math.random().toString(36).slice(2, 6)}`),\n text: String(opt.text ?? opt.label ?? opt.name ?? \"\"),\n })),\n };\n });\n delete card.selectors;\n\n // ── 构建 submit_button ──\n const submitText = (card.submit_text as string) || \"提交\";\n card.submit_button = {\n text: submitText,\n key: generateKey(\"submit_multi\"),\n };\n delete card.submit_text;\n\n log?.(`[template-card-parser] transformMultipleInteraction: output=${JSON.stringify(card)}`);\n\n return card;\n}\n\n/**\n * 对 vote_interaction / multiple_interaction 执行简化格式转换。\n * 其他 card_type 直接跳过。\n */\nfunction transformSimplifiedCard(\n card: Record<string, unknown>,\n log?: (...args: any[]) => void,\n): Record<string, unknown> {\n const cardType = card.card_type as string;\n if (cardType === \"vote_interaction\") {\n return transformVoteInteraction(card, log);\n }\n if (cardType === \"multiple_interaction\") {\n return transformMultipleInteraction(card, log);\n }\n return card;\n}\n\n/**\n * 匹配 markdown 代码块的正则表达式\n * 支持 ```json ... ``` 和 ``` ... ``` 两种格式\n */\nconst CODE_BLOCK_RE = /```(?:json)?\\s*\\n([\\s\\S]*?)\\n```/g;\n\n/**\n * 匹配已闭合的代码块(含 card_type 关键词,用于中间帧遮罩)\n * 与 CODE_BLOCK_RE 相同,但用于 maskTemplateCardBlocks 中单独实例化\n */\nconst CLOSED_BLOCK_RE = /```(?:json)?\\s*\\n([\\s\\S]*?)\\n```/g;\n\n/**\n * 匹配未闭合的代码块尾部(LLM 正在输出中的代码块)\n * 以 ```json 或 ``` 开头,后面有内容但没有闭合的 ```\n */\nconst UNCLOSED_BLOCK_RE = /```(?:json)?\\s*\\n[\\s\\S]*$/;\n\n/**\n * 从文本中提取模板卡片 JSON 代码块\n *\n * 匹配规则:\n * 1. 匹配所有 ```json ... ``` 或 ``` ... ``` 格式的代码块\n * 2. 尝试 JSON.parse 解析代码块内容\n * 3. 检查解析结果中是否包含合法的 card_type 字段\n * 4. 合法的卡片从原文中移除,不合法的保留\n *\n * @param text - LLM 回复的完整文本\n * @returns 提取结果,包含卡片列表和剩余文本\n */\nexport function extractTemplateCards(text: string, log?: (...args: any[]) => void): TemplateCardExtractionResult {\n const cards: ExtractedTemplateCard[] = [];\n /** 需要从原文中移除的代码块(记录完整匹配内容) */\n const blocksToRemove: string[] = [];\n\n log?.(`[template-card-parser] extractTemplateCards called, textLength=${text.length}`);\n\n let match: RegExpExecArray | null;\n // 重置正则的 lastIndex,确保从头匹配\n CODE_BLOCK_RE.lastIndex = 0;\n\n let blockIndex = 0;\n while ((match = CODE_BLOCK_RE.exec(text)) !== null) {\n const fullMatch = match[0];\n const jsonContent = match[1].trim();\n blockIndex++;\n\n log?.(`[template-card-parser] Found code block #${blockIndex}, length=${fullMatch.length}, preview=${jsonContent.slice(0, 1000)}...`);\n\n // 尝试解析 JSON\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(jsonContent) as Record<string, unknown>;\n } catch (e) {\n // JSON 解析失败,保留在原文中\n log?.(`[template-card-parser] Code block #${blockIndex} JSON parse failed: ${String(e)}`);\n continue;\n }\n\n // 检查是否包含合法的 card_type\n const cardType = parsed.card_type;\n if (typeof cardType !== \"string\" || !VALID_CARD_TYPES.includes(cardType)) {\n // card_type 不合法,保留在原文中\n log?.(`[template-card-parser] Code block #${blockIndex} has invalid card_type=\"${String(cardType)}\", skipping`);\n continue;\n }\n\n log?.(`[template-card-parser] Code block #${blockIndex} is valid template card, card_type=\"${cardType}\"`);\n\n // vote_interaction / multiple_interaction:简化格式 → API 格式转换\n transformSimplifiedCard(parsed, log);\n\n // 修正 LLM 可能输出的错误字段类型(如 checkbox.mode: \"multi\" → 1)\n normalizeTemplateCardFields(parsed, log);\n\n // 校验并补全必填字段(如缺失的 task_id、main_title、card_action)\n validateAndFixRequiredFields(parsed, log);\n\n // 合法的模板卡片,收集并标记移除\n cards.push({\n cardJson: parsed,\n cardType,\n });\n blocksToRemove.push(fullMatch);\n }\n\n // 从原文中移除已提取的代码块,生成剩余文本\n let remainingText = text;\n for (const block of blocksToRemove) {\n remainingText = remainingText.replace(block, \"\");\n }\n // 清理多余空行(连续 3 个以上换行合并为 2 个)\n remainingText = remainingText.replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\n log?.(`[template-card-parser] Extraction done: ${cards.length} card(s) found, remainingTextLength=${remainingText.length}`);\n\n return { cards, remainingText };\n}\n\n/**\n * 遮罩文本中的模板卡片代码块(用于流式中间帧展示)\n *\n * 在 LLM 流式输出过程中,累积文本可能包含:\n * 1. 已闭合的模板卡片 JSON 代码块 → 替换为友好提示文本\n * 2. 正在构建中的未闭合代码块 → 截断隐藏,避免 JSON 源码暴露\n *\n * 此函数仅做文本替换,不做 JSON 解析验证(中间帧性能优先)。\n * 只要代码块内容中出现 \"card_type\" 关键词就认为是模板卡片并遮罩。\n *\n * @param text - 当前累积文本\n * @returns 遮罩后的展示文本\n */\nexport function maskTemplateCardBlocks(text: string, log?: (...args: any[]) => void): string {\n let masked = text;\n let closedMaskCount = 0;\n let unclosedMasked = false;\n\n // 步骤一:处理已闭合的代码块\n CLOSED_BLOCK_RE.lastIndex = 0;\n masked = masked.replace(CLOSED_BLOCK_RE, (fullMatch, content: string) => {\n // 检查代码块内容是否包含 card_type 关键词\n if (/[\"']card_type[\"']/.test(content)) {\n closedMaskCount++;\n return \"\\n\\n📋 *正在生成卡片消息...*\\n\\n\";\n }\n // 非模板卡片代码块,保留原样\n return fullMatch;\n });\n\n // 步骤二:处理未闭合的代码块尾部(LLM 仍在输出中)\n // 检查是否有以 ``` 开头但没有闭合的代码块\n const unclosedMatch = UNCLOSED_BLOCK_RE.exec(masked);\n if (unclosedMatch) {\n const unclosedContent = unclosedMatch[0];\n // 如果未闭合部分包含 card_type 关键词,说明正在构建模板卡片 → 截断\n if (/[\"']card_type[\"']/.test(unclosedContent)) {\n unclosedMasked = true;\n masked = masked.slice(0, unclosedMatch.index) + \"\\n\\n📋 *正在生成卡片消息...*\";\n }\n }\n\n // 有遮罩行为时才打日志,避免每帧都刷屏\n if (closedMaskCount > 0 || unclosedMasked) {\n log?.(`[template-card-parser] maskTemplateCardBlocks: closedMasked=${closedMaskCount}, unclosedMasked=${unclosedMasked}, textLength=${text.length}, maskedLength=${masked.length}`);\n }\n\n return masked;\n}\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeout.js","sources":["../../../../../src/timeout.ts"],"sourcesContent":["/**\n * 超时控制工具模块\n *\n * 为异步操作提供统一的超时保护机制\n */\n\n/**\n * 为 Promise 添加超时保护\n *\n * @param promise - 原始 Promise\n * @param timeoutMs - 超时时间(毫秒)\n * @param message - 超时错误消息\n * @returns 带超时保护的 Promise\n */\nexport function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n message?: string,\n): Promise<T> {\n if (timeoutMs <= 0 || !Number.isFinite(timeoutMs)) {\n return promise;\n }\n\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new TimeoutError(message ?? `Operation timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n clearTimeout(timeoutId);\n });\n}\n\n/**\n * 超时错误类型\n */\nexport class TimeoutError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TimeoutError\";\n }\n}\n"],"names":[],"mappings":"AAAA;;;;AAIG;AAEH;;;;;;;AAOG;SACa,WAAW,CACzB,OAAmB,EACnB,SAAiB,EACjB,OAAgB,EAAA;AAEhB,IAAA,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AACjD,QAAA,OAAO,OAAO;IAChB;AAEA,IAAA,IAAI,SAAwC;IAE5C,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,KAAI;AACtD,QAAA,SAAS,GAAG,UAAU,CAAC,MAAK;YAC1B,MAAM,CAAC,IAAI,YAAY,CAAC,OAAO,IAAI,CAAA,0BAAA,EAA6B,SAAS,CAAA,EAAA,CAAI,CAAC,CAAC;QACjF,CAAC,EAAE,SAAS,CAAC;AACf,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,MAAK;QAC1D,YAAY,CAAC,SAAS,CAAC;AACzB,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACG,MAAO,YAAa,SAAQ,KAAK,CAAA;AACrC,IAAA,WAAA,CAAY,OAAe,EAAA;QACzB,KAAK,CAAC,OAAO,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,cAAc;IAC5B;AACD;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../src/utils.ts"],"sourcesContent":["/**\n * 企业微信公共工具函数\n */\n\nimport type { OpenClawConfig } from \"openclaw/plugin-sdk/core\";\nimport { DEFAULT_ACCOUNT_ID } from \"./openclaw-compat.js\";\nimport { CHANNEL_ID } from \"./const.js\";\n\n// ============================================================================\n// 配置类型定义\n// ============================================================================\n\n/**\n * 企业微信群组配置\n */\nexport interface WeComGroupConfig {\n /** 群组内发送者白名单(仅列表中的成员消息会被处理) */\n allowFrom?: Array<string | number>;\n}\n\n/**\n * 企业微信配置类型\n */\nexport interface WeComConfig {\n enabled?: boolean;\n websocketUrl?: string;\n botId?: string;\n secret?: string;\n name?: string;\n allowFrom?: Array<string | number>;\n dmPolicy?: \"open\" | \"allowlist\" | \"pairing\" | \"disabled\";\n /** 群组访问策略:\"open\" = 允许所有群组(默认),\"allowlist\" = 仅允许 groupAllowFrom 中的群组,\"disabled\" = 禁用群组消息 */\n groupPolicy?: \"open\" | \"allowlist\" | \"disabled\";\n /** 群组白名单(仅 groupPolicy=\"allowlist\" 时生效) */\n groupAllowFrom?: Array<string | number>;\n /** 每个群组的详细配置(如群组内发送者白名单) */\n groups?: Record<string, WeComGroupConfig>;\n /** 是否发送\"思考中\"消息,默认为 true */\n sendThinkingMessage?: boolean;\n /** 额外允许访问的本地媒体路径白名单(支持 ~ 表示 home 目录),如 [\"~/Downloads\", \"~/Documents\"] */\n mediaLocalRoots?: string[];\n}\n\nexport const DefaultWsUrl = \"wss://openws.work.weixin.qq.com\";\n\nexport interface ResolvedWeComAccount {\n accountId: string;\n name: string;\n enabled: boolean;\n websocketUrl: string;\n botId: string;\n secret: string;\n /** 是否发送\"思考中\"消息,默认为 true */\n sendThinkingMessage: boolean;\n config: WeComConfig;\n}\n\n/**\n * 解析企业微信账户配置\n */\nexport function resolveWeComAccount(cfg: OpenClawConfig): ResolvedWeComAccount {\n const wecomConfig = (cfg.channels?.[CHANNEL_ID] ?? {}) as WeComConfig;\n\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n name: wecomConfig.name ?? \"企业微信\",\n enabled: wecomConfig.enabled ?? false,\n websocketUrl: wecomConfig.websocketUrl || DefaultWsUrl,\n botId: wecomConfig.botId ?? \"\",\n secret: wecomConfig.secret ?? \"\",\n sendThinkingMessage: wecomConfig.sendThinkingMessage ?? true,\n config: wecomConfig,\n };\n}\n\n/**\n * 设置企业微信账户配置\n */\nexport function setWeComAccount(\n cfg: OpenClawConfig,\n account: Partial<WeComConfig>,\n): OpenClawConfig {\n const existing = (cfg.channels?.[CHANNEL_ID] ?? {}) as WeComConfig;\n const merged: WeComConfig = {\n enabled: account.enabled ?? existing?.enabled ?? true,\n botId: account.botId ?? existing?.botId ?? \"\",\n secret: account.secret ?? existing?.secret ?? \"\",\n allowFrom: account.allowFrom ?? existing?.allowFrom,\n dmPolicy: account.dmPolicy ?? existing?.dmPolicy,\n // 以下字段仅在已有配置值或显式传入时才写入,onboarding 时不主动生成\n ...(account.websocketUrl || existing?.websocketUrl\n ? { websocketUrl: account.websocketUrl ?? existing?.websocketUrl }\n : {}),\n ...(account.name || existing?.name\n ? { name: account.name ?? existing?.name }\n : {}),\n ...(account.sendThinkingMessage !== undefined || existing?.sendThinkingMessage !== undefined\n ? { sendThinkingMessage: account.sendThinkingMessage ?? existing?.sendThinkingMessage }\n : {}),\n };\n\nreturn {\n ...cfg,\n channels: {\n ...cfg.channels,\n [CHANNEL_ID]: merged,\n },\n };\n}\n"],"names":[],"mappings":";;;AAAA;;AAEG;AAyCI,MAAM,YAAY,GAAG;AAc5B;;AAEG;AACG,SAAU,mBAAmB,CAAC,GAAmB,EAAA;AACrD,IAAA,MAAM,WAAW,IAAI,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,CAAgB;IAErE,OAAO;AACL,QAAA,SAAS,EAAE,kBAAkB;AAC7B,QAAA,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,MAAM;AAChC,QAAA,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,KAAK;AACrC,QAAA,YAAY,EAAE,WAAW,CAAC,YAAY,IAAI,YAAY;AACtD,QAAA,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,EAAE;AAC9B,QAAA,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,EAAE;AAChC,QAAA,mBAAmB,EAAE,WAAW,CAAC,mBAAmB,IAAI,IAAI;AAC5D,QAAA,MAAM,EAAE,WAAW;KACpB;AACH;AAEA;;AAEG;AACG,SAAU,eAAe,CAC7B,GAAmB,EACnB,OAA6B,EAAA;AAE7B,IAAA,MAAM,QAAQ,IAAI,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,CAAgB;AAClE,IAAA,MAAM,MAAM,GAAgB;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,IAAI;QACrD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,QAAQ,EAAE,MAAM,IAAI,EAAE;AAChD,QAAA,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,QAAQ,EAAE,SAAS;AACnD,QAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,QAAQ,EAAE,QAAQ;;AAEhD,QAAA,IAAI,OAAO,CAAC,YAAY,IAAI,QAAQ,EAAE;cAClC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,QAAQ,EAAE,YAAY;cAC9D,EAAE,CAAC;AACP,QAAA,IAAI,OAAO,CAAC,IAAI,IAAI,QAAQ,EAAE;cAC1B,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,QAAQ,EAAE,IAAI;cACtC,EAAE,CAAC;QACP,IAAI,OAAO,CAAC,mBAAmB,KAAK,SAAS,IAAI,QAAQ,EAAE,mBAAmB,KAAK;cAC/E,EAAE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,IAAI,QAAQ,EAAE,mBAAmB;cACnF,EAAE,CAAC;KACR;IAEH,OAAO;AACH,QAAA,GAAG,GAAG;AACN,QAAA,QAAQ,EAAE;YACR,GAAG,GAAG,CAAC,QAAQ;YACf,CAAC,UAAU,GAAG,MAAM;AACrB,SAAA;KACF;AACH;;;;"}
@@ -1,23 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import { dirname, resolve } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
-
5
- /** 从 package.json 中读取版本号,兼容打包产物和直接运行 .ts 两种场景 */
6
- const getVersion = () => {
7
- try {
8
- // ESM 环境使用 import.meta.url,CJS 环境使用全局 __dirname
9
- const currentDir = dirname(fileURLToPath(import.meta.url));
10
- // 直接运行 .ts 时在 src/ 下,打包后在 dist/ 下,都向上一级找 package.json
11
- const pkgPath = resolve(currentDir, "..", "package.json");
12
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
13
- return pkg.version ?? "";
14
- }
15
- catch {
16
- return "";
17
- }
18
- };
19
- /** 插件版本号,来源于 package.json */
20
- const PLUGIN_VERSION = getVersion();
21
-
22
- export { PLUGIN_VERSION };
23
- //# sourceMappingURL=version.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"version.js","sources":["../../../../../src/version.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/** 从 package.json 中读取版本号,兼容打包产物和直接运行 .ts 两种场景 */\nconst getVersion = (): string => {\n try {\n // ESM 环境使用 import.meta.url,CJS 环境使用全局 __dirname\n const currentDir = dirname(fileURLToPath(import.meta.url));\n\n // 直接运行 .ts 时在 src/ 下,打包后在 dist/ 下,都向上一级找 package.json\n const pkgPath = resolve(currentDir, \"..\", \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n return pkg.version ?? \"\";\n } catch {\n return \"\";\n }\n};\n\n/** 插件版本号,来源于 package.json */\nexport const PLUGIN_VERSION: string = getVersion();\n"],"names":[],"mappings":";;;;AAIA;AACA,MAAM,UAAU,GAAG,MAAa;AAC9B,IAAA,IAAI;;AAEF,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;QAG1D,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,CAAC;AACzD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACtD,QAAA,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE;IAC1B;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,EAAE;IACX;AACF,CAAC;AAED;AACO,MAAM,cAAc,GAAW,UAAU;;;;"}
@@ -1,9 +0,0 @@
1
- import type { OpenClawPluginApi } from "openclaw/plugin-sdk/core";
2
- declare const plugin: {
3
- id: string;
4
- name: string;
5
- description: string;
6
- configSchema: Record<string, unknown>;
7
- register(api: OpenClawPluginApi): void;
8
- };
9
- export default plugin;
@@ -1,2 +0,0 @@
1
- /** 插件版本号,来源于 package.json */
2
- export declare const PLUGIN_VERSION: string;
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes