feat(wecom): 新增企业微信 IM 与群通知 - #1107
Conversation
There was a problem hiding this comment.
🟡 Not ready to approve
schedulePatchToRow 当前会在旧调用方漏传 wecomGroup 时误清空该列,属于会导致用户配置被意外覆盖的逻辑问题。
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Pull request overview
本 PR 为 Desktop 增加企业微信(WeCom)两条能力:智能机器人双向 IM(WebSocket 长连接)以及企业微信群机器人 Webhook 通知,并把该通知能力接入普通会话通知与 scheduler 的 per-schedule 通知开关,同时补齐本地安全存储、IPC 边界、DB migration、i18n/术语与 SBOM 记录。
Changes:
- 在
@cindy/im新增 WeCom transport:消息编解码、媒体落盘/缓存、owner TOFU 绑定、lane 路由与去重,并导出公共 codec。 - 在 Desktop main/renderer 接入 WeCom:设置页配置与状态同步、群 Webhook 的安全存储与严格 URL 校验、通知服务与 scheduler notifier 的通道分发。
- 为 scheduler 增加
notify.wecomGroup开关,并通过 SQLite migration 0084 落库(默认关闭)。
File summaries
| File | Description |
|---|---|
| pnpm-lock.yaml | 锁定新增 @wecom/aibot-node-sdk@1.0.7 依赖版本。 |
| packages/maker-shared/src/scheduleTypes.ts | 扩展远端 schedule notify config:新增 wecomGroup 字段。 |
| packages/maker-shared/src/scheduleForm.ts | 移动端草稿/模板/输入构建支持 wecomGroup。 |
| packages/maker-scheduler/src/types.ts | scheduler 类型新增 wecomGroup 通知字段。 |
| packages/maker-core/src/agents/base-agent.ts | permission origin 的 IM channel 值域加入 wecom。 |
| packages/lizi-im/src/wecom/media.ts | WeCom 媒体文件名净化、落盘与出站文件读取/类型推断。 |
| packages/lizi-im/src/wecom/index.ts | WeCom IM 主实现:连接管理、收发、owner 绑定、lane 队列与去重。 |
| packages/lizi-im/src/wecom/codec.ts | group lane 编解码、markdown 分块与转义。 |
| packages/lizi-im/src/wecom/tests/media.test.ts | media helpers 的单测覆盖。 |
| packages/lizi-im/src/wecom/tests/index.test.ts | owner TOFU、lane 路由、去重、同步启动失败与消息串行的单测。 |
| packages/lizi-im/src/wecom/tests/codec.test.ts | lane codec 与 markdown chunking/escape 的单测。 |
| packages/lizi-im/src/types.ts | IMHost 增加 wecomMediaDir,host media cache integration 增加 wecom。 |
| packages/lizi-im/src/index.ts | 导出 WeCom IM 与 codec API。 |
| packages/lizi-im/package.json | 增加 @wecom/aibot-node-sdk 运行依赖。 |
| i18n/GLOSSARY.md | 增加 WeCom 相关术语条目(proposed)。 |
| i18n/glossary.json | 增加 WeCom/WeCom bot 相关术语(proposed,多语)。 |
| docs/legal/notices/sbom/desktop-win.spdx.json | Windows SBOM 记录新增依赖与生成时间/namespace 更新。 |
| docs/legal/notices/sbom/desktop-macos.spdx.json | macOS SBOM 记录新增依赖与生成时间/namespace 更新。 |
| docs/legal/notices/sbom/desktop-linux.spdx.json | Linux SBOM 记录新增依赖与生成时间/namespace 更新。 |
| apps/desktop/src/shared/sessionSource.ts | session source 值域加入 wecom。 |
| apps/desktop/src/shared/imDefaultSettings.ts | IM 默认设置 channel 加入 wecom,并引入“remote IM 权限模式限制”判定。 |
| apps/desktop/src/renderer/vite-env.d.ts | renderer 侧 ElectronAPI 类型新增 wecomBot 与 wecomGroupNotification。 |
| apps/desktop/src/renderer/i18n/locales/zh-CN/common.json | 增加 WeCom bot 与企微群通知相关文案(中文)。 |
| apps/desktop/src/renderer/i18n/locales/ko/common.json | 增加 WeCom bot 与企微群通知相关文案(韩文)。 |
| apps/desktop/src/renderer/i18n/locales/ja/common.json | 增加 WeCom bot 与企微群通知相关文案(日文)。 |
| apps/desktop/src/renderer/i18n/locales/en/common.json | 增加 WeCom bot 与企微群通知相关文案(英文)。 |
| apps/desktop/src/renderer/hooks/useWecomGroupNotificationSettings.ts | renderer 侧企微群通知开关(localStorage)+ main 状态读取/操作封装。 |
| apps/desktop/src/renderer/hooks/useWecomBot.ts | renderer 侧 WeCom bot 状态同步、配置/重连/解绑操作封装。 |
| apps/desktop/src/renderer/features/scheduler/lib/scheduleFormLogic.ts | schedule 表单输入构建加入 notify.wecomGroup。 |
| apps/desktop/src/renderer/features/scheduler/lib/projectAutomationConfig.ts | project automation config 的 notify shape 加入 wecomGroup。 |
| apps/desktop/src/renderer/features/scheduler/hooks/useScheduleForm.ts | schedule 表单默认值与回填支持 notifyWecomGroup。 |
| apps/desktop/src/renderer/features/scheduler/components/ScheduleFormDialog.tsx | scheduler 表单 UI 增加企微群通知开关与跳转配置入口。 |
| apps/desktop/src/renderer/features/cc-agent/CCAgentSidebarUpper.tsx | 会话完成通知 payload 增加 wecomGroup channel。 |
| apps/desktop/src/renderer/components/settings/WecomBotSection.tsx | Settings 增加 WeCom Intelligent Bot 配置卡片与交互。 |
| apps/desktop/src/renderer/components/settings/NotificationSection.tsx | Settings 通知页增加企微群 Webhook 保存/测试/清除与开关。 |
| apps/desktop/src/renderer/components/settings/ImDefaultSettingsSection.tsx | WeChat/WeCom 统一走 remote IM 权限模式限制提示与禁用逻辑。 |
| apps/desktop/src/renderer/components/settings/ImBotSection.tsx | Personal IM 列表加入 WeCom bot 配置入口。 |
| apps/desktop/src/renderer/tests/schedulerTemplateEntry.test.ts | scheduler template 入口测试适配 wecomGroup 通知与 API mock。 |
| apps/desktop/src/renderer/tests/makerSharedFixtureParity.test.ts | shared fixture parity 测试覆盖 wecomGroup 草稿映射。 |
| apps/desktop/src/renderer/tests/automationGeneratedSessions.test.ts | session source 测试加入 wecom。 |
| apps/desktop/src/preload/preload.ts | preload 暴露 wecomBot 与 wecomGroupNotification IPC API。 |
| apps/desktop/src/main/wecomGroupNotification.ts | main:企微群 Webhook 服务(严格 URL 校验、序列化发送、owner-scope secrets、IPC)。 |
| apps/desktop/src/main/scheduler-host/project-automation-loader.ts | project automation reconcile 支持 notify.wecomGroup。 |
| apps/desktop/src/main/scheduler-host/notifier.ts | scheduler notifier 新增企微群发布通道,并把文本渲染函数抽象为 external。 |
| apps/desktop/src/main/scheduler-host/index.ts | scheduler wiring 注入 wecomGroupNotification publisher。 |
| apps/desktop/src/main/scheduler-host/tests/storage.db.test.ts | scheduler storage DDL 测试加入 notify_wecom_group 列。 |
| apps/desktop/src/main/scheduler-host/tests/notifier.test.ts | notifier 单测覆盖企微群通知发送与失败非致命。 |
| apps/desktop/src/main/notificationService.ts | 普通会话通知分发加入 wecomGroup channel,并复用 external 文案构建。 |
| apps/desktop/src/main/localDb/schema.ts | schedules 表新增 notify_wecom_group 列映射。 |
| apps/desktop/src/main/localDb/mapper.ts | schedule row 映射/patch 映射支持 notifyWecomGroup。 |
| apps/desktop/src/main/im/wecom/uiText.ts | WeCom 渠道 UI 文案包(slash 命令、交互卡文本等)。 |
| apps/desktop/src/main/im/wecom/textInteractions.ts | WeCom 文本交互:权限/计划/提问的 pending 管理与超时。 |
| apps/desktop/src/main/im/wecom/index.ts | WeCom orchestrator wiring(adapter + interactions)。 |
| apps/desktop/src/main/im/wecom/adapter.ts | WeCom adapter:sessionId/title/workdir/vendorOptions 等落地。 |
| apps/desktop/src/main/im/shared/types.ts | IM channel 值域加入 wecom。 |
| apps/desktop/src/main/im/index.ts | 启动 orchestrators 时接入 wecomIm 并导出。 |
| apps/desktop/src/main/im/host.ts | IMHost wiring:创建 wecomIm,配置 wecomMediaDir,并加入 IM 聚合。 |
| apps/desktop/src/main/im/defaultSettingsStore.ts | 默认设置写入时对 remote IM(含 wecom)限制部分 permissionMode。 |
| apps/desktop/src/main/im/tests/defaultSettingsStore.test.ts | 单测覆盖 wechat/wecom 的 permissionMode 限制。 |
| apps/desktop/src/main/bootstrap-electron.ts | bootstrap:注册企微群通知 IPC、notificationService 注入 publisher、remote IM 校验更新。 |
| apps/desktop/src/main/tests/wecomGroupNotification.test.ts | WeCom 群通知安全边界与串行发送单测。 |
| apps/desktop/src/main/tests/notificationService.test.ts | notificationService 覆盖企微群通道失败不影响其它通道。 |
| apps/desktop/drizzle/meta/_journal.json | drizzle journal 新增 migration 0084 记录。 |
| apps/desktop/drizzle/0084_small_gwen_stacy.sql | migration:为 schedules 增加 notify_wecom_group(默认 false)。 |
Review details
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
- Files reviewed: 66/70 changed files
- Comments generated: 3
- Review effort level: Low
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
There was a problem hiding this comment.
🟡 Not ready to approve
WeCom 媒体文件名消毒未规避 Windows 保留设备名(如 CON/PRN/NUL 等),会导致在 Windows 上特定附件名必现写入失败。
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
- Files reviewed: 67/71 changed files
- Comments generated: 1
- Review effort level: Low
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
反馈已处理已处理:
变更:
验证:
备注:
|
There was a problem hiding this comment.
🟡 Not ready to approve
wecomGroupNotification 的 save-and-test 存在“发送测试成功到落盘写入之间”的队列竞态窗口,可能导致并发通知读取到未配置并失败。
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
Comments suppressed due to low confidence (1)
apps/desktop/src/main/wecomGroupNotification.ts:148
- 这里
saveAndTest先通过enqueue()发送测试消息,但把secrets.write()放在队列外执行;当测试发送完成到写入之间有并发publishMarkdown()/test()入队时,会在 URL 尚未落盘的窗口期读取到“未配置”并失败(随后又立刻配置成功),属于可复现的竞态。建议把“测试成功后的落盘写入”也放进同一个enqueue操作里,使队列在写入完成前不释放,从而消除竞态,并保持“测试失败不落盘”的安全属性。
const url = parseWebhookUrl(rawUrl);
await this.enqueue(() => {
if (!isAccountCurrent()) throw new ImAccountScopeClosedError();
return this.send(url, 'Cindy 企业微信群通知测试成功');
});
- Files reviewed: 67/71 changed files
- Comments generated: 0 new
- Review effort level: Low
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
反馈已处理已处理:
变更:
验证:
备注:
|
There was a problem hiding this comment.
🟡 Not ready to approve
发现确定性错误码匹配缺陷会导致 WeCom 出站附件失败原因被错误归类,且有一处已更新逻辑对应注释未同步。
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
Comments suppressed due to low confidence (2)
packages/lizi-im/src/wecom/index.ts:271
- 这里用 errorCode(error)(只读 error.code)来判断 WECOM_FILE_EMPTY / WECOM_FILE_TOO_LARGE / WECOM_FILE_NOT_FOUND,但 readWecomOutboundFile 抛的是 new Error("WECOM_FILE_…")(错误码在 message 里而不是 code)。结果这些分支永远匹配不到,会把“空文件/超大”等确定性错误误报为 UPLOAD_FAIL/SEND_FAIL。建议把判断逻辑同时覆盖 Error.message(或在抛错时设置 err.code)。
apps/desktop/src/main/scheduler-host/notifier.ts:64 - 这里的注释仍写“desktop / feishu 全关”,但实际判定条件已经包含 wecomGroup(下面 if 条件也已更新)。建议同步更新注释,避免后续维护误判 mobile 推送门槛。
// 手机推送随 schedule 的通知意愿走:desktop / feishu 全关表示用户不想被这个
// 调度打扰,mobile 不得绕过(schedule 级暂无独立 mobile 开关,任一通道开启即
// 视为允许提醒);是否真的收到仍由手机端注册 token 决定,发送侧防打扰在
// device-link 模块收口,失败静默。
- Files reviewed: 67/71 changed files
- Comments generated: 0 new
- Review effort level: Low
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
反馈已处理已处理:
变更:
验证:
备注:
|
反馈已处理已处理:
变更:
验证:
备注:
|
反馈已处理已处理:
变更:
验证:
备注:
|
反馈已处理已处理:
变更:
验证:
备注:
|
反馈已处理已处理:
变更:
验证:
备注:
|
反馈已处理已处理:
变更:
验证:
备注:
|
反馈已处理已处理:
变更:
验证:
备注:
|
反馈已处理已处理:
变更:
验证:
备注:
|
There was a problem hiding this comment.
🟡 Not ready to approve
wecomGroupNotification 的 publishMarkdown() 在未配置 webhook 时会抛出“disabled”错误,错误语义不一致且可能误导上层处理。
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Review details
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
Suppressed comments (1)
apps/desktop/src/main/wecomGroupNotification.ts:202
publishMarkdown()目前只检查getState().enabled,在「未配置 webhook」或「存量 webhook 无效」时也会抛WECOM_GROUP_NOTIFICATIONS_DISABLED,与requireStoredUrl()的WECOM_GROUP_WEBHOOK_NOT_CONFIGURED语义不一致,容易让上层误判配置状态。建议先区分 configured/enabled:未配置时抛 NOT_CONFIGURED,已配置但总开关关闭时再抛 DISABLED。
- Files reviewed: 75/79 changed files
- Comments generated: 0 new
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
|
| Filename | Overview |
|---|---|
| packages/lizi-im/src/wecom/index.ts | 新增企业微信 WebSocket transport、owner TOFU、入站队列、去重、媒体及回复处理;先前报告的 owner 首绑竞争不成立。 |
| apps/desktop/src/main/im/wecom/adapter.ts | 将企业微信 transport 接入 Desktop 共享 IM 编排和安全存储边界。 |
| apps/desktop/src/main/wecomGroupNotification.ts | 新增企业微信群 Webhook 配置校验、安全存储、消息分块与发送服务。 |
| apps/desktop/src/main/scheduler-host/notifier.ts | 接入独立的企微群通知发布路径,并已避免企微单独启用时误触发移动推送。 |
| apps/desktop/drizzle/0084_small_gwen_stacy.sql | 为 schedules 表新增默认关闭且非空的 notify_wecom_group 字段。 |
| apps/desktop/src/renderer/components/settings/WecomBotSection.tsx | 新增企业微信智能机器人凭据配置与连接状态界面。 |
| apps/desktop/src/renderer/components/settings/NotificationSection.tsx | 新增企微群通知的启用、保存、测试和清除界面。 |
| apps/desktop/src/renderer/features/scheduler/components/ScheduleFormDialog.tsx | 在定时任务表单中新增按任务控制的企微群通知开关。 |
Sequence Diagram
sequenceDiagram
participant User as 企业微信用户
participant Bot as 企业微信智能机器人
participant IM as Cindy IM 编排
participant Agent as Cindy Agent
participant Scheduler as Scheduler
participant Group as 企业微信群机器人
User->>Bot: 文本或媒体消息
Bot->>IM: WebSocket 入站事件
IM->>IM: owner 校验与会话路由
IM->>Agent: 启动或继续 Agent 回合
Agent-->>IM: 回复与附件
IM-->>Bot: 主动或被动回复
Scheduler->>Scheduler: 检查总开关与 notify.wecomGroup
Scheduler->>Group: Webhook 推送任务结果
Reviews (30): Last reviewed commit: "fix(wecom): close queued notification ra..." | Re-trigger Greptile
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
Signed-off-by: david <david@xd.com>
反馈已处理已处理:
变更:
验证:
备注:
|
There was a problem hiding this comment.
🟡 Human review recommended
引入新的远程 IM 通道与 Webhook 出站通知、涉及安全存储/IPC 边界与数据库迁移,风险面较大需要人工最终把关。
Review details
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
Suppressed comments (1)
apps/desktop/src/main/im/wecom/uiText.ts:17
- WeCom 渠道已在 slashCommands 中为文本通道放行了
/permission(用于切换权限模式),但这里的/help文案与 unknownCommand 提示未包含该命令,容易导致用户不知道该入口或被误导为不支持。建议把/permission加入命令列表与提示中。
- Files reviewed: 94/103 changed files
- Comments generated: 0 new
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: eddbe88f9c
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
Signed-off-by: david <david@xd.com>
|
@DavidShenXD 👋 这个 PR 还有 1 条 review conversation 没 resolve(packages/lizi-im/src/wecom/index.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
There was a problem hiding this comment.
🟡 Human review recommended
变更跨越 IM 通道/IPC/安全存储/DB migration/通知链路等多个高风险边界,需人工重点复核安全与兼容性(并处理已指出的细节问题)后再合入。
Review details
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
Suppressed comments (2)
apps/desktop/src/renderer/tests/schedulerTemplateEntry.test.ts:204
- 这里对
window.electronAPI.wecomGroupNotification.getState的 mock 只返回了{ configured: false },缺少enabled字段(以及setEnabled/clear的返回形状也与ElectronAPI契约不一致)。这会让useWecomGroupNotificationSettings把enabled设成undefined,从而掩盖契约回归。建议 mock 返回完整字段并补齐必要方法。
apps/desktop/src/main/wecomGroupNotification.ts:306 wecomGroupNotification:save-and-test的 IPC handler 里先parseTestMessage(testMessage),但WecomGroupNotificationService.saveAndTest()内部又会再次parseTestMessage(),导致重复 trim/字节上限校验并增加维护成本。建议 IPC 层只做类型校验,然后把原始字符串交给 service 统一校验。
- Files reviewed: 96/105 changed files
- Comments generated: 0 new
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d6618d745d
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
@DavidShenXD 👋 这个 PR 还有 2 条 review conversation 没 resolve(packages/lizi-im/src/wecom/index.ts / apps/desktop/src/main/wecomGroupNotification.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
Signed-off-by: david <david@xd.com>
反馈已处理已处理:
变更:
验证:
备注:
|
There was a problem hiding this comment.
🟡 Human review recommended
It introduces new WeCom IM + webhook networking, secure storage/IPC boundaries, scheduler wiring, and a DB migration, which warrants careful human security and cross-platform review.
Review details
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
Suppressed comments (2)
packages/lizi-im/src/wecom/codec.ts:54
chunkWecomMarkdown在循环中每次用Buffer.byteLength(current + point)重新计算整段字符串字节数,长文本会退化为 O(n²)(每次都扫描更长的 candidate),在 IM 输出较长时可能造成明显 CPU 开销。建议像本文件其它分块逻辑一样维护累计字节数,按字符增量计算并在超限时切块。
apps/desktop/src/renderer/tests/schedulerTemplateEntry.test.ts:204- 这里的
wecomGroupNotification.getState()mock 返回值缺少enabled字段,但 hook 会读取state.enabled并写入 React state;这会把enabled置为undefined(与运行时契约不一致),也容易在后续改动中导致测试出现隐性失败。建议 mock 返回完整的 state 形状。
- Files reviewed: 96/105 changed files
- Comments generated: 0 new
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e3d2b3db4c
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
@DavidShenXD 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/renderer/i18n/locales/zh-CN/common.json),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
反馈已处理已处理:
变更:
验证:
备注:
|
这次改了什么
摘要
为 Desktop 新增两条独立的企业微信能力:
智能机器人接入复用 Cindy 现有共享 IM 编排,支持文本交互、图片/文件/视频/语音入站、主动与被动回复、会话路由、权限交互和附件发送。首位完成单聊的企业微信用户会被绑定为本机 owner,后续仅接受该 owner 的单聊和群聊触发,避免企业内其他成员直接操作本机 Agent。
群通知配置使用本地安全存储,Renderer 只读取掩码状态;Webhook URL 限定为企业微信官方 HTTPS 地址。发送失败不会改变 Agent 回合或定时任务的终态。
变更类型
feat新功能fix缺陷修复refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
@cindy/im企业微信 transport、消息编解码、媒体下载与有界去重notify.wecomGroup单任务开关notify_wecom_group字段UI 变化
docs/design-rules/DESIGN.md§2 Color Palette & Roles、§4 Component Stylings、§5 Layout Principles、§10 Theme System & Token Reference(含 Light / Dark Dual-Mode Delivery Gate)、§11 Voice & Content、§14 Interaction Conventions。新增 UI 复用现有 Settings/Form 组件与语义 token,同时提供 zh-CN / en / ja / ko 文案。怎么验证的
自动验证
手工验证
已使用真实企业微信 Bot ID / Secret 完成智能机器人连接与消息黑盒验收,并完成企业微信群机器人通知测试。
未执行的验证
风险
风险分类
影响与回滚
apps/mobile原生配置、原生依赖或 config plugin。wecomchannel 与通知 wiring;历史 migration 保留,新增布尔字段可继续保持默认关闭,不需要破坏性回滚数据库。提交前检查
git commit -s,见 DCO)