Imported from keunsy/cursor-remote-control (
wecom/AGENTS.md). Install upstream withnpx skills add keunsy/cursor-remote-control --skill wecom. Copyright stays with the author.
AGENTS.md — 企业微信远程控制
企业微信 → Cursor Agent 中继服务(MVP 版本)
项目定位
企业微信 → Cursor AI 远程遥控桥接服务。用户在企业微信发消息,server 自动转发给本地 Cursor Agent CLI 执行,执行结果通过企业微信 Markdown 消息回传。
技术栈
| 层 | 技术 |
|---|---|
| 运行时 | Bun 1.x + TypeScript(直接运行,无需编译) |
| 企业微信 SDK | @wecom/aibot-node-sdk(WebSocket 长连接) |
| 数据库 | SQLite(与飞书/钉钉共享,记忆向量索引) |
| 语音 | 火山引擎豆包 STT → 本地 whisper-cpp 兜底 |
| 部署 | macOS launchd(service.sh 管理) |
目录结构
wecom/
├── server.ts # 主服务入口:WebSocket → Cursor Agent CLI
├── wecom-helper.ts # 企业微信工具函数(会话管理、路由等)
├── start.ts # 启动脚本
├── start-with-keepawake.ts # 带防休眠的启动脚本
├── service.sh # 服务管理脚本
├── .env.example # 环境变量模板
├── package.json # 依赖配置
└── .cursor/ # 本项目 Cursor 配置(如有)
共享模块(通过相对路径导入)
以下模块与飞书/钉钉共享:
../shared/bridge.ts→ OpenAI API 桥接../shared/memory.ts→ 记忆管理器../shared/scheduler.ts→ 定时任务调度器../shared/heartbeat.ts→ 心跳系统../shared/feilian-control.ts→ 飞连 VPN 控制../shared/news-fetcher.ts→ 新闻抓取器
当前状态(v1.2 - 与飞书功能对齐)
已实现:
- ✅ 企业微信 WebSocket 长连接接收消息
- ✅ 调用 Cursor Agent CLI 执行任务
- ✅ 会话管理(历史查看/切换/归档)
- ✅ 项目路由(传统 + 对话式 + 持久切换)
- ✅ 流式回复(主动推送,优于飞书)⭐
- ✅ Markdown 回复
- ✅ 工具调用摘要
- ✅ 记忆系统集成(查询/搜索/索引/日记)
- ✅ 定时任务系统(查看/暂停/恢复/删除)
- ✅ 心跳系统(开启/关闭/执行/间隔设置)
- ✅ 启动自检(.cursor/BOOT.md 自动执行)
- ✅ 完整命令系统(17+ 核心命令)
- ✅ 模型切换(支持 7 个常用模型 + 自定义)
- ✅ API Key 管理(查看/更换)
- ✅ 任务终止(单个/多个任务管理)
- ✅ 热点新闻推送(/新闻、/新闻状态、自然语言定时)⭐
- ✅ 飞连 VPN 控制(/飞连、远程开关 VPN)⭐
- ✅ 文件发送(/发送文件、/apk)⭐
暂不支持(低优先级):
- ❌ 语音识别
- ❌ 图片处理
- ❌ 模板卡片(交互式卡片)
注: 企业微信版本已与飞书功能对齐,主动推送流式回复体验更优
关键设计决策
- MVP 优先 — 先实现核心功能,扩展功能按需添加
- 代码复用 — 通过相对路径导入共享飞书/钉钉的核心模块
- 独立部署 — 与飞书/钉钉服务并行运行,互不干扰
- 简化设计 — server.ts 保留核心逻辑,辅助功能抽离到 wecom-helper.ts
企业微信技术特点
1. WebSocket 长连接
- 连接地址:
wss://openws.work.weixin.qq.com - 自动认证:连接后自动发送 botId + secret
- 心跳保活:SDK 自动维护心跳
- 断线重连:指数退避重连策略
2. 流式回复(主动推送)
企业微信的流式回复比飞书更优:
| 平台 | 刷新方式 | 说明 |
|---|---|---|
| 飞书 | 轮询回调 | 企业微信通过轮询回调获取刷新内容(被动) |
| 企业微信 | 主动推送 | 开发者主动推送刷新消息(主动,延迟更低) |
// 首次发送(finish=false)
await wsClient.replyStream(frame, streamId, '正在思考...', false);
// 中间更新
await wsClient.replyStream(frame, streamId, '正在查询数据...', false);
// 最终结果(finish=true)
await wsClient.replyStream(frame, streamId, finalResult, true);
3. 事件系统
企业微信支持丰富的事件回调:
event.enter_chat— 用户进入会话(发送欢迎语)message.text— 文本消息message.image— 图片消息message.voice— 语音消息message.file— 文件消息event.template_card— 模板卡片按钮点击
部署与管理
# 启动服务
./service.sh install # 安装自启动并立即启动
# 停止服务
./service.sh stop
# 重启服务
./service.sh restart
# 查看状态
./service.sh status
# 查看日志
tail -f /tmp/wecom-cursor.log
核心功能
✅ 已实现(v1.2 - 与飞书功能对齐)
| 功能 | 支持度 | 说明 |
|---|---|---|
| 消息处理 | 完整 | 文本消息 + 文件发送 |
| 项目路由 | 完整 | 传统 + 对话式 + 持久切换 |
| 会话管理 | 完整 | 历史、切换、归档 |
| 流式回复 | 完整 | 主动推送,延迟低 ⭐ |
| 记忆系统 | 完整 | 与飞书/钉钉共享 |
| 定时任务 | 完整 | 独立配置(项目根目录/cron-jobs-wecom.json) |
| 心跳系统 | 完整 | 定期检查 + 主动推送 |
| 新闻推送 | 完整 | 立即推送 + 定时任务 + 自然语言创建 ⭐ |
| 飞连 VPN | 完整 | 远程控制 VPN 开关/查询 ⭐ |
| 文件发送 | 完整 | 发送本地文件 + APK 快捷发送 ⭐ |
⏳ 后续版本可选功能
- 语音识别: 火山引擎 STT / whisper-cpp(低优先级)
- 图片处理: 下载 + AES 解密 + OCR(低优先级)
- 模板卡片: 丰富的交互卡片(低优先级)
与飞书/钉钉对比
| 特性 | 飞书 | 钉钉 | 企业微信 |
|---|---|---|---|
| 连接方式 | WebSocket | Stream | WebSocket |
| 流式回复 | 轮询刷新 | ❌ | 主动推送 ⭐ |
| 模板卡片 | ✅ | ❌ | ✅ |
| 视频消息 | ✅ | ❌ | ✅ |
| 事件系统 | 丰富 | 基础 | 丰富 ⭐ |
| 新闻推送 | ✅ | ✅ | ✅ |
| 飞连 VPN | ✅ | ✅ | ✅ |
| 文件发送 | ✅ (30MB) | ❌ | ✅ (20MB) |
企业微信优势:
- ✨ 流式体验更好(主动推送 vs 被动轮询)
- ✨ 支持视频消息
- ✨ 丰富的事件回调和模板卡片
- ✨ 功能完整,已与飞书对齐
总结
企业微信版本已完成功能对齐(v1.2),核心功能完整:
- ✅ 消息收发正常
- ✅ Cursor Agent 集成完整
- ✅ 流式回复体验优秀
- ✅ 与飞书/钉钉无缝共存
- ✅ 完整命令系统(17+ 命令)
- ✅ 热点新闻推送(立即 + 定时)
- ✅ 飞连 VPN 远程控制
- ✅ 文件发送功能
企业微信版本已与飞书功能对齐,可作为生产环境首选(流式体验更优)。