Skip to content

Repository files navigation

Chaos

GitHub License GitHub last commit

多平台群聊智能助手 —— 接入飞书 / QQ 群,基于 RCM + DeepSeek 自动处理产品反馈、Bug 追踪和功能建议。

能力

  • 意图识别 — 自动分类 Bug、功能建议、使用问题、已知问题跟进
  • 历史检索 — 基于记忆、近期上下文、静态仓库证据和必要的公开检索识别已知问题
  • 代码扫描 — 自动定位相关模块和代码路径
  • 记忆系统 — 沉淀产品知识,多轮对话保持上下文
  • Synergy 开发转交 — 飞书中的新 Bug/功能请求通过 CardKit 提供三种选择:在原话题中召唤 Synergy-dev 并生成 Plan、只创建 GitHub Issue 后结束、或取消
  • 多平台 — 统一管道,飞书和 QQ 共享同一套编排逻辑和记忆

快速开始

# 1. 安装依赖
bun install

# 2. 配置环境变量
cp .env.example .env
# 编辑 .env:填写飞书、DeepSeek、AnySearch 凭证及绝对 RCM_BIN;Linux 还需配置 Bubblewrap 运行时边界
# 如需“只创建 Issue”,仅在 Linux 上额外配置 GITHUB_TOKEN 和绝对 GH_BIN

# 3. 启动
bun run bot.ts listen

环境变量

变量 必填 说明
FEISHU_APP_ID 飞书应用 App ID
FEISHU_APP_SECRET 飞书应用 App Secret
FEISHU_BOT_OPEN_ID 可选兜底;启动时会自动解析当前机器人 open_id,API 解析失败时可手动配置
SYNERGY_BOT_OPEN_ID ✓(飞书) 接收开发请求的 Synergy 机器人 open_id;用户确认授权后,在话题中真实 @该机器人
DEEPSEEK_API_KEY DeepSeek API Key
ANYSEARCH_API_KEY AnySearch MCP API Key,不含 Bearer 前缀;仅通过精确构造的子进程环境传给 assistant RCM
TARGET_REPO 目标 GitHub 仓库,默认 SII-Holos/synergy
GITHUB_TOKEN / GH_TOKEN 仅 Linux 可选;只供 bot-owned Issue writer 使用,启动后从 process.env 删除,不传给 RCM
GH_BIN GitHub 写入时 gh 可执行文件绝对路径
REPO_PATH 本地仓库绝对路径;默认 ./repo(相对 Chaos 根目录解析);assistant 沙箱内只读
RCM_BIN accelerate 可执行文件绝对路径
RCM_SANDBOX_BIN ✓(Linux) root-owned、不可被 group/world 写入的 Bubblewrap 可执行文件绝对路径
RCM_RUNTIME_ROOTS ✓(Linux) 以平台 PATH 分隔符连接的、人工审核过的运行时目录;host source 解析为 canonical path,guest 仍挂载到配置的绝对路径别名
RCM_RUNTIME_PATH RCM 沙箱内 PATH,默认 /opt/accelerate/bin:/usr/bin:/bin,每项必须由 guest runtime root 覆盖
ALLOW_UNSANDBOXED_RCM 可选 显式设为 1 时无沙箱运行 RCM(受限容器/本地开发);Linux 下仍允许配置 GitHub token,非 Linux 禁止
RCM_RUN_TIMEOUT_SECONDS 单次 RCM 超时,默认 420
MEMPALACE_BIN 可选语义检索命令,默认 mempalace
MEMPALACE_ENABLED autotruefalse;默认 auto
MEMPALACE_PALACE_PATH 可选 Palace 数据路径
PLATFORMS 启用的平台,逗号分隔,默认 feishu(可选 qq
QQ_BRIDGE_PORT QQ 桥接端口,默认 18080
CHAOS_POLL_TIMEOUT_SECONDS AstrBot 插件轮询回复超时,默认 480 秒;需配置在 AstrBot 进程环境中

运行时安全边界

生产环境必须使用 Linux。每次启动和所有触发 RCM 的 CLI 命令都会先执行 fail-closed 预检:解析并校验绝对可执行文件、确认 RCM_BIN 位于审核过的 RCM_RUNTIME_ROOTS、探测 Bubblewrap 所需特性,并拒绝伪文件系统 runtime root、会被后续 synthetic/route mount 隐藏的 guest root、覆盖服务 HOME/Chaos 私有状态的 broad REPO_PATH,以及其他受保护路径重叠。

RCM 在 Bubblewrap 空根沙箱中运行,只获得合成的 HOME/PATH 和路由所需 API Key。runtime root 的 host source 会 canonicalize 后审核,但 guest destination 保留配置路径,因此 merged-/usr 系统的 /bin 等别名仍可达。assistant 对仓库、记忆和当前 chat 的归档子目录只有只读访问,不能搜索其他 chat 的原始归档;记忆路由只可写 memory/。synthetic /proc/dev/tmp/home/run/work/workspace 在 runtime roots 之后建立,任何会与这些 guest tree 重叠的 runtime root 都会在预检阶段被拒绝。网络当前为共享命名空间,以支持 DeepSeek 和 AnySearch,因此部署侧仍应实施出站网络策略。GitHub writer 不在 RCM 中运行:它使用独立绝对 GH_BIN、隔离的 HOME/config 和显式 token。

Linux 生产环境必须使用 Bubblewrap 隔离。缺少 Bubblewrap 所需内核能力的环境(如无法挂载 /proc 的受限容器)可显式设置 ALLOW_UNSANDBOXED_RCM=1 以无沙箱运行 RCM;Linux 无沙箱模式仍允许配置 GitHub token 并使用 只创建 Issue(token 不传给 RCM 子进程)。macOS 等非 Linux 系统仅支持显式设置 ALLOW_UNSANDBOXED_RCM=1 的本地开发,且配置任何 GitHub token 都会使预检失败;只创建 Issue 需在 Linux 隔离环境验证。

架构

┌──────────────────────────────────────────────────┐
│              bot.ts(平台无关编排层)               │
│   去重 → 时效检查 → RCM → 回复 → 归档 → 记忆提炼   │
└──────┬───────────────────────┬───────────────────┘
       │                       │
  platform-feishu.ts     platform-qq.ts
   Lark WebSocket       HTTP 127.0.0.1:18080
       │                       │
       │               astrbot-plugin-chaos
    飞书群                    │
                          QQ 群
说明
lib/config.ts 运行时配置与私有状态目录
lib/platform.ts PlatformAdapter 接口定义
lib/platform-feishu.ts 飞书适配器(WS 长连接 + 消息解析 + CardKit 卡片)
lib/feishu-mention.ts 飞书机器人身份识别与 @提及过滤
lib/platform-qq.ts QQ HTTP 桥接适配器
lib/dev-handoff.ts 开发转交标记解析与校验
lib/dev-request.ts 飞书开发转交输入组装
lib/dev-card.ts 三选一卡片、回调状态机与投影恢复
lib/dev-card-state.ts 卡片请求状态持久化
lib/dev-issue.ts 确定性 GitHub Issue 创建器(去重、恢复与重试)
lib/dispatch.ts RCM 调度、安全预检、Bubblewrap 沙箱与隔离的 GitHub writer
lib/memory.ts 双层记忆系统(Archive + Memory)

CLI

命令 说明
bun run bot.ts listen 启动所有已启用的平台适配器
bun run bot.ts once "msg" 单次测试
bun run bot.ts import <file> 导入文档到知识库
bun run bot.ts consolidate 整理记忆条目

AnySearch MCP

RCM assistant 通过 Streamable HTTP 连接 https://api.anysearch.com/mcp,并暴露 anysearch__searchanysearch__batch_searchanysearch__extractanysearch__get_sub_domains。只有需要当前外部信息或本地证据不足时才搜索;专业垂直检索会先发现可用 sub-domain。

.env 中配置原始 API Key:

ANYSEARCH_API_KEY=as_sk_xxx

模板缓存只保存 ${ANYSEARCH_API_KEY} 占位符;RCM 编译时从子进程环境解析并用于 Authorization header。

平台配置

飞书

配置项
订阅方式 使用长连接接收事件
订阅事件 im.message.receive_v1card.action.trigger
权限 im:messageim:message:send_as_botim:message.group_at_msg.include_bot:readonly
群聊唤醒 启动时解析当前机器人 open_id,仅处理 @ 当前机器人的消息;其他机器人、同名机器人和 @all 均忽略
开发请求 CardKit 提供召唤 Synergy-dev 并生成 Plan、只创建 GitHub Issue 后结束、取消三种互斥操作

开发请求卡片只有原始报告者可以操作。召唤发送失败时,卡片会进入“召唤结果未知”状态;再次召唤可能重复发送,也可以直接结束。创建 Issue 和卡片终态会持久化,进程重启后自动恢复未完成的 Issue 创建与卡片投影。GitHub 创建结果若因超时、进程终止或创建后的对账失败而无法确认,卡片会进入无按钮的 issue_unknown 阻断态,禁止再次创建、召唤或取消;只有人工核对后重启触发的 reconciliation 可以恢复为已创建终态。Issue ledger 缺失视为新状态,但存在且损坏或含非法记录时会 fail-closed,绝不自动覆盖或创建第二个 Issue。

Card action chaos_dev_handoff/v1 增加了 create_issue;部署必须保持单实例并原子升级,不支持新旧服务同时处理新卡片,也不保证旧版本回滚后继续处理已创建的三选一卡片。

启用方式:.envPLATFORMS=feishu

QQ(AstrBot)

  1. .env 中设置 PLATFORMS=feishu,qq
  2. astrbot-plugin-chaos/ 复制到 AstrBot 的 plugins 目录
  3. 可在 AstrBot 进程环境中设置 CHAOS_POLL_TIMEOUT_SECONDS,默认 480
  4. 重启 Chaos 和 AstrBot
  5. 群聊中 @bot 即可触发;插件按 message_id 独立领取回复,避免并发消息互相消费

License

MIT

About

An intelligent Feishu group assistant for Synergy that connects via WebSocket and uses RCM + DeepSeek to automatically handle product feedback, bug tracking, and feature requests.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Contributors

Languages