Skip to content

Latest commit

 

History

History
209 lines (182 loc) · 13.5 KB

File metadata and controls

209 lines (182 loc) · 13.5 KB

虾群平台版(feishu-cursor-claw)— 系统架构

飞书 → Cursor AI 远程遥控桥接服务。用户通过飞书即时通讯发送消息(文字、语音、图片、文件),服务自动转发给本地 Cursor Agent CLI 执行,结果通过飞书卡片实时回传。


业务域划分

业务域 子系统 职责 说明
消息桥接 server.ts 飞书消息接收 → 指令解析 → Cursor Agent 调度 → 结果回传 核心主链路,单进程常驻服务
API 桥接 bridge.ts OpenAI 兼容 API → Cursor Agent CLI → OpenAI 格式响应 供 OpenClaw 等外部系统以标准 API 方式调用
飞书集成 feishu/ 飞书 SDK 封装、消息收发、流式卡片、@提及、表情回应、策略管控 17 个文件,完整封装飞书开放平台交互细节
记忆系统 memory.ts, memory-tool.ts 向量嵌入 + BM25 混合搜索、增量索引、嵌入缓存 SQLite 存储,Cursor Agent 通过 CLI 工具调用
自动化调度 scheduler.ts 定时任务执行(at / every / cron 三种调度模式) 读取工作区 cron-jobs.json,自动触发 Cursor Agent
心跳巡检 heartbeat.ts 定期触发 Cursor Agent 执行心跳检查清单 按协议决定是否通过飞书汇报异常
语音处理 server.ts 内置 语音消息 → STT 转文字 → 作为文本指令执行 火山引擎豆包 STT 为主,本地 whisper-cpp 兜底
工作区模板 templates/ 新工作区初始化模板:人格、身份、记忆、规则、技能 Cursor Agent 自动加载的完整配置体系
AI 编程辅助 瑞小美-harness/ 专家 Agent、命令、技能、编码规范的可分发配置包 独立于主服务,可复制到任意项目使用
桌面操控 plugins/turix-cua/ AI 视觉理解 + 鼠标键盘操控,自然语言驱动 macOS 桌面自动化 Python(Conda),截屏→AI→操控循环
运维部署 service.sh, setup.sh macOS launchd 服务管理、开机自启、崩溃恢复 纯 Shell 脚本,零外部依赖

代码包结构

虾群平台版/
├── server.ts                 # 主服务入口:飞书 WebSocket → 消息解析 → Cursor Agent 调度 → 流式回传
├── start.ts                  # 启动引导
├── bridge.ts                 # OpenAI 兼容 API 桥接层
├── memory.ts                 # 记忆管理器 v2(SQLite + 向量 + BM25 混合搜索)
├── memory-tool.ts            # 记忆 CLI 工具(供 Cursor Agent shell 调用)
├── scheduler.ts              # 定时任务调度器(at / every / cron)
├── heartbeat.ts              # 心跳巡检系统
├── sync-apple-notes.ts       # Apple Notes → 工作区同步
├── backfill-embeddings.ts    # 向量嵌入批量回填工具
├── agent-run.exp             # Expect 脚本:Cursor Agent CLI 交互控制
├── agent-session.exp         # Expect 脚本:Agent 会话管理
│
├── feishu/                   # 飞书集成模块(17 个文件)
│   ├── client.ts             #   飞书 SDK 客户端初始化
│   ├── send.ts               #   消息发送(文本、富文本、文件)
│   ├── streaming-card.ts     #   流式交互卡片(实时进度推送)
│   ├── mention.ts            #   @提及 解析与处理
│   ├── media.ts              #   媒体文件下载与处理
│   ├── accounts.ts           #   多账号/多应用管理
│   ├── external-keys.ts      #   外部密钥管理
│   ├── policy.ts             #   消息策略(过滤、限流、权限)
│   ├── reactions.ts          #   表情回应
│   ├── typing.ts             #   正在输入状态
│   ├── dedup.ts              #   消息去重
│   ├── runtime.ts            #   运行时上下文
│   ├── sdk-shim.ts           #   SDK 兼容层
│   ├── send-result.ts        #   发送结果封装
│   ├── send-target.ts        #   发送目标解析
│   ├── targets.ts            #   目标管理
│   └── types.ts              #   类型定义
│
├── templates/                # 工作区初始化模板
│   ├── AGENTS.md             #   Cursor 自动加载的工作区指南
│   ├── README.md             #   工作区说明
│   └── .cursor/
│       ├── SOUL.md           #   AI 人格 / 灵魂
│       ├── IDENTITY.md       #   身份元数据
│       ├── USER.md           #   主人信息
│       ├── MEMORY.md         #   长期记忆
│       ├── BOOT.md           #   启动自检清单
│       ├── BOOTSTRAP.md      #   首次启动仪式(运行后删除)
│       ├── HEARTBEAT.md      #   心跳检查清单
│       ├── TASKS.md          #   定时任务文档
│       ├── TOOLS.md          #   工具能力清单
│       ├── rules/            #   9 个规则文件
│       │   ├── soul.mdc
│       │   ├── agent-identity.mdc
│       │   ├── user-context.mdc
│       │   ├── workspace-rules.mdc
│       │   ├── tools.mdc
│       │   ├── memory-protocol.mdc
│       │   ├── scheduler-protocol.mdc
│       │   ├── heartbeat-protocol.mdc
│       │   └── cursor-capabilities.mdc
│       └── skills/           #   技能模板
│           ├── create-skill/
│           └── apple-notes-sync/
│
├── 瑞小美-harness/            # AI 编程辅助配置工具包(可分发)
│   ├── agents/               #   5 个专家 Agent
│   ├── commands/             #   21 个命令
│   ├── skills/               #   9 个技能
│   ├── hooks/                #   钩子脚本
│   ├── rules/                #   编码规范和安全规则
│   └── 项目模板/
│       └── 瑞小美AiOS/       #   含 12 个业务技能的项目模板
│
├── 文档/                      # 项目文档
├── plugins/                    # 插件系统
│   └── turix-cua/             #   桌面操控代理(AI 截屏 → 理解 → 操控鼠标键盘)
│       ├── turix.sh           #     一键启动脚本
│       ├── config.json        #     AI 模型配置
│       ├── examples/main.py   #     Python 入口
│       ├── src/               #     核心代码(agent/controller/mac/utils)
│       └── skills/            #     AI 技能手册
│
├── 参考代码/                   # 第三方参考代码
│
├── service.sh                # launchd 服务管理脚本
├── setup.sh                  # 环境初始化脚本
├── package.json              # Bun 依赖管理
├── tsconfig.json             # TypeScript 配置
├── bun.lock                  # 依赖锁定
├── .env                      # 凭据和配置(不提交)
├── .env.example              # 环境变量模板
├── .sessions.json            # 会话历史
└── .gitignore

模块依赖关系

主链路(飞书消息桥接)

  1. 飞书 → server.ts:飞书开放平台通过 WebSocket 长连接推送消息事件,server.ts 作为唯一入口接收全部消息类型(文字、语音、图片、文件)
  2. server.ts → feishu/:调用 feishu/media.ts 下载附件,feishu/mention.ts 解析 @提及,feishu/dedup.ts 去重,feishu/policy.ts 执行策略管控
  3. server.ts → 语音处理:语音消息先发往火山引擎豆包 STT(WebSocket 二进制协议),失败时回退到本地 whisper-cpp,转写结果作为文本指令继续处理
  4. server.ts → Cursor Agent CLI:通过 spawn 调用本地 ~/.local/bin/agent,使用 --resume 保持会话连续性
  5. server.ts → feishu/streaming-card.ts:Cursor Agent 的输出通过流式卡片实时推送回飞书,用户能看到执行进度

API 桥接链路

  • 外部系统 → bridge.ts → Cursor Agent CLI:接收 OpenAI Chat Completions 格式的 HTTP 请求,转发给 Cursor Agent 执行,返回 OpenAI 格式响应

记忆系统

  • Cursor Agent → memory-tool.ts → memory.ts → SQLite:Agent 在执行过程中通过 shell 调用 memory-tool.ts,实现记忆的写入、搜索和索引管理
  • memory.ts → 火山引擎嵌入 API:文本转向量时调用豆包 Embedding API,结果缓存在 SQLite 中避免重复计算

自动化系统

  • scheduler.ts → cron-jobs.json → Cursor Agent CLI → feishu/send.ts:定时读取工作区的任务配置,到期时 spawn Cursor Agent 执行,结果通过飞书推送
  • heartbeat.ts → Cursor Agent CLI → HEARTBEAT.md → feishu/send.ts:定期触发 Agent 执行心跳检查清单,Agent 按协议判断是否需要汇报

模块间无循环依赖

所有模块单向依赖,server.tsbridge.ts 是两个独立入口,共享 feishu/memory.ts 等底层模块。


部署拓扑

┌─────────────────────────────────────────────────────────┐
│                macOS(Apple Silicon)本机                  │
│                                                         │
│  ┌──────────────┐    spawn    ┌──────────────────────┐  │
│  │  Bun 进程     │ ────────→  │  Cursor Agent CLI    │  │
│  │  (server.ts)  │ ←────────  │  (~/.local/bin/agent)│  │
│  │              │   stdout    │                      │  │
│  │  ┌─────────┐ │            │  ┌──────────────────┐│  │
│  │  │scheduler│ │            │  │  Cursor IDE      ││  │
│  │  │heartbeat│ │            │  │  (本地工作区)      ││  │
│  │  └─────────┘ │            │  └──────────────────┘│  │
│  └──────┬───────┘            └──────────────────────┘  │
│         │                                               │
│  ┌──────┴───────┐    ┌──────────────┐                   │
│  │  SQLite      │    │  .env        │                   │
│  │ (.memory.sqlite)  │  .sessions   │                   │
│  │              │    │  cron-jobs   │                   │
│  └──────────────┘    └──────────────┘                   │
│                                                         │
│  launchd 守护(service.sh 管理)                           │
│  · 开机自动启动                                           │
│  · 崩溃自动恢复                                           │
│  · .env 热更换(无需重启)                                  │
│  · projects.json 热更换                                   │
└────────────┬────────────────────────────────────────────┘
             │ WebSocket 长连接(无需公网地址)
             ▼
┌──────────────────────┐     ┌──────────────────────┐
│  飞书开放平台          │     │  火山引擎             │
│  · 消息推送            │     │  · 豆包 STT(语音)   │
│  · 卡片更新            │     │  · 豆包 Embedding     │
│  · 媒体下载            │     │    (向量嵌入)        │
└──────────────────────┘     └──────────────────────┘

部署要点

  • 单进程架构:整个服务运行在一个 Bun 进程中,server.ts 为主入口,scheduler 和 heartbeat 作为内部模块共存
  • 无公网依赖:飞书通过 WebSocket 长连接主动推送,不需要公网 IP 或域名
  • 本地 AI 能力:Cursor Agent CLI 和 Cursor IDE 运行在同一台 macOS 机器上,通过进程 spawn 通信
  • projects.json 路由:上层目录的 projects.json 定义工作区映射,决定消息转发到哪个 Cursor 工作区

数据存储

存储 类型 用途 路径
.env 环境变量文件 飞书凭据、火山引擎密钥、各项配置 项目根目录
.sessions.json JSON 文件 Cursor Agent 会话历史(用于 --resume 连续对话) 项目根目录
.memory.sqlite SQLite 数据库 向量嵌入索引 + FTS5 全文搜索 + 嵌入缓存 工作区目录
cron-jobs.json JSON 文件 定时任务配置(at / every / cron 三种格式) 工作区目录
projects.json JSON 文件 工作区路由映射(消息 → 工作区) 上层目录
inbox/ 临时目录 飞书下载的媒体文件(图片、文件等),24 小时自动清理 工作区目录
HEARTBEAT.md Markdown 心跳检查清单,Agent 按此执行巡检 工作区 .cursor/
MEMORY.md Markdown Agent 可读写的长期记忆文件 工作区 .cursor/
TASKS.md Markdown 定时任务的人类可读文档 工作区 .cursor/