不只服务飞书,也服务 Discord。通过"平台适配层 + 根路由器 + OpenCode 事件中枢 + 领域处理器",重点解决跨平台扩展、权限闭环稳定性、目录实例一致性和线上可维护性。
随着运行时 Cron(API + /cron + ///cron + 自然语言语义解析)与本地可靠性治理落地,本项目和 OpenClaw 在"自动化调度 + 运维可用性"上的能力差距进一步缩小,同时保留本项目在多平台路由与权限闭环上的工程优势。
这个项目解决的不是"能不能回复消息",而是"跨平台 AI 任务能否长期稳定闭环"。
- 对使用者友好:权限确认、question 作答、会话操作都在飞书里完成,不强依赖本地终端。
- 对协作友好:支持绑定已有会话与迁移绑定,跨设备、跨群接力时上下文不断裂。
- 对稳定性友好:会话映射持久化 + 双端撤回 + 同规则清理,避免"表面正常、状态错位"。
- 对运维友好:内置部署、升级、状态检查与后台管理流程,适合持续托管运行。
- 对监控友好:内置cron定时任务与主动心跳,可以做到像OpenClaw类似的能力。
- 对未来版本友好:已兼容 OpenCode Server Basic Auth,服务端启用密码后仍可直接接入。
| 能力 | 你能得到什么 | 相关命令/配置 |
|---|---|---|
| 群聊/私聊统一路由 | 同一套入口支持私聊和群聊,按映射路由到正确会话 | 群聊 @ 机器人;私聊直接发消息 |
| 私聊建群会话选择 | 建群时可选"新建会话/绑定已有会话",提交时按选择生效 | /create_chat、/建群 |
| 手动会话绑定 | 不中断旧上下文,直接把指定 session 接入当前群 | /session <sessionId>、ENABLE_MANUAL_SESSION_BIND |
| 迁移绑定与删除保护 | 绑定已有会话时自动迁移旧群映射,并保护会话不被误删 | 自动生效(手动绑定场景) |
| 生命周期清理兜底 | 启动清理与手动清理共用同一规则,降低误清理概率 | /clear free session |
| 权限卡片闭环 | OpenCode 权限请求在飞书内完成确认并回传结果 | permission.asked |
| question 卡片闭环 | OpenCode question 在飞书内回答/跳过并继续任务 | question.asked |
| 流式多卡防溢出 | 超过组件预算自动分页拆卡,旧页持续更新 | 流式卡片分页(预算 180) |
| 双端撤回一致性 | 撤回时同时回滚飞书消息与 OpenCode 会话状态 | /undo |
| 模型/角色/强度可视化控制 | 按会话切换模型、角色与推理强度,支持面板查看与命令操作 | /panel、/model、/agent、/effort |
| 上下文压缩 | 在飞书直接触发会话 summarize,释放上下文窗口 | /compact |
| Shell 命令透传 | 白名单 ! 命令通过 OpenCode shell 执行并回显输出 |
!ls、!pwd、!git status |
| 服务端鉴权兼容 | 支持 OpenCode Server Basic Auth,不怕后续默认强制密码 | OPENCODE_SERVER_USERNAME、OPENCODE_SERVER_PASSWORD |
| 文件发送到飞书 | AI 可将电脑上的文件/截图直接发送到当前飞书群聊 | /send、发送文件 |
| 工作目录/项目管理 | 创建会话时指定工作目录,支持项目别名、群默认项目、9 阶段安全校验 | /project list、/session new <别名>、ALLOWED_DIRECTORIES |
| OpenCode 本地可靠性治理 | 运行时 Cron(API/命令/自然语言)+ 本地宕机自动救援(含配置备份/两级回退)+ 可选主动心跳 | HEARTBEAT.md、RELIABILITY_*、logs/reliability-audit.jsonl |
| 部署运维闭环 | 提供部署/升级/检查/后台/systemd 的一体化入口 | scripts/deploy.*、scripts/start.* |
详见 项目架构文档。
核心分层:
- 平台接入层:Feishu Adapter / Discord Adapter
- 入口与路由层:RootRouter / DiscordHandler
- 领域服务层:PermissionHandler / QuestionHandler / OutputBuffer / ChatSessionStore
- OpenCode 集成层:OpencodeClientWrapper / OpenCodeEventHub
Linux/macOS:
git clone https://github.com/HNGM-HP/opencode-bridge.git
cd opencode-bridge
chmod +x ./scripts/deploy.sh
./scripts/deploy.sh guideWindows PowerShell:
git clone https://github.com/HNGM-HP/opencode-bridge.git
cd opencode-bridge
.\scripts\deploy.ps1 guide这条命令会自动完成:
- 检测 Node.js / npm(缺失时给安装引导)
- 检测 OpenCode 安装与端口状态
- 可一键安装 OpenCode(
npm i -g opencode-ai) - 安装项目依赖并编译桥接服务
- 若
.env不存在,会自动由.env.example复制生成(不会覆盖已有.env) - 可在交互阶段直接输入
FEISHU_APP_ID/FEISHU_APP_SECRET并写入.env(支持回撤/跳过)
提醒:
- 不添加
guide后缀执行命令为菜单。 - 这一条命令可以完成"部署与环境准备"。
- 但飞书密钥需要你自己填,脚本不会替你写入真实凭据;未填写时服务无法正常接收飞书消息。
cp .env.example .env至少填写:
FEISHU_APP_IDFEISHU_APP_SECRET
opencodeLinux/macOS:
./scripts/start.shWindows PowerShell:
.\scripts\start.ps1开发调试可用:
npm run devnpm install -g opencode-bridge
opencode-bridge配置的详细说明见 部署与运维文档。
| 目标 | 命令 | 说明 |
|---|---|---|
| 一键部署 | node scripts/deploy.mjs deploy |
默认清洁安装后再安装依赖并编译 |
| 一键更新升级 | node scripts/deploy.mjs upgrade |
默认清洁升级:先拆卸清理,再拉取并重新部署 |
| 安装/升级 OpenCode | node scripts/deploy.mjs opencode-install |
执行 npm i -g opencode-ai |
| 检查 OpenCode 环境 | node scripts/deploy.mjs opencode-check |
检查 opencode 命令与端口监听 |
| 启动 OpenCode CLI | node scripts/deploy.mjs opencode-start |
自动写入 opencode.json 后前台执行 opencode |
| 首次引导 | node scripts/deploy.mjs guide |
安装/部署/引导启动的一体化流程 |
| 管理菜单 | npm run manage:bridge |
交互式菜单(默认入口) |
| 启动后台 | npm run start |
后台启动(自动检测/补构建) |
| 停止后台 | node scripts/stop.mjs |
按 PID 停止后台进程 |
详细部署说明见 部署与运维文档。
核心配置:
| 变量 | 必填 | 默认值 | 说明 |
|---|---|---|---|
FEISHU_APP_ID |
是 | - | 飞书应用 App ID |
FEISHU_APP_SECRET |
是 | - | 飞书应用 App Secret |
OPENCODE_HOST |
否 | localhost |
OpenCode 地址 |
OPENCODE_PORT |
否 | 4096 |
OpenCode 端口 |
DISCORD_ENABLED |
否 | false |
是否启用 Discord 适配器 |
DISCORD_TOKEN |
否 | - | Discord Bot Token |
完整配置详见 环境变量配置文档。
详见 可靠性指南。
- 内置 Cron 任务:
watchdog-probe(30 秒)、process-consistency-check(60 秒)、budget-reset(每天 0 点) - 三种管理入口:HTTP API(
/cron/*)、Feishu(/cron ...)、Discord(///cron ...) - 主动心跳:可配置定时器向 Agent Session 发送检查提示
- 自动救援:连续失败达到阈值后自动修复本地 OpenCode(仅 loopback)
RELIABILITY_CRON_ENABLED=true
RELIABILITY_CRON_API_ENABLED=true
RELIABILITY_PROACTIVE_HEARTBEAT_ENABLED=false
RELIABILITY_LOOPBACK_ONLY=true详见 飞书后台配置文档。
| 事件 | 必需 | 用途 |
|---|---|---|
im.message.receive_v1 |
是 | 接收群聊/私聊消息 |
im.message.recalled_v1 |
是 | 用户撤回触发 /undo 回滚 |
im.chat.member.user.deleted_v1 |
是 | 成员退群后触发生命周期清理 |
im.chat.disbanded_v1 |
是 | 群解散后清理本地会话映射 |
card.action.trigger |
是 | 处理控制面板、权限确认、提问卡片回调 |
批量导入权限配置(保存至 acc.json 后在开发者后台导入):
{
"scopes": {
"tenant": [
"im:message.p2p_msg:readonly",
"im:chat",
"im:chat.members:read",
"im:chat.members:write_only",
"im:message",
"im:message.group_at_msg:readonly",
"im:message.group_msg",
"im:message.reactions:read",
"im:message.reactions:write_only",
"im:resource"
],
"user": []
}
}详见 命令速查文档。
| 命令 | 说明 |
|---|---|
/help |
查看帮助 |
/panel |
打开控制面板 |
/model <provider:model> |
切换模型 |
/agent <name> |
切换 Agent |
/session new |
开启新话题 |
/undo |
撤回上一轮交互 |
/compact |
压缩上下文 |
!<shell 命令> |
透传 shell 命令 |
| 命令 | 说明 |
|---|---|
///session |
查看绑定的会话 |
///new |
新建并绑定会话 |
///bind <sessionId> |
绑定已有会话 |
///undo |
回撤上一轮 |
///compact |
压缩上下文 |
详见 Agent 使用文档。
- 查看当前 Agent:
/agent - 切换 Agent:
/agent <name> - 回到默认:
/agent off
创建角色 名称=旅行助手; 描述=擅长制定旅行计划; 类型=主; 工具=webfetch
详见 实现细节文档。
- 权限请求回传:
response为once | always | reject - question 工具交互:答案通过用户文字回复解析
- 流式与思考卡片:文本与思考分流写入输出缓冲
/undo一致性:同时删除飞书侧消息并对 OpenCode 执行revert
详见 故障排查文档。
| 现象 | 优先检查 |
|---|---|
| 飞书发送消息后 OpenCode 无反应 | 检查飞书权限配置 |
| 点权限卡片后 OpenCode 无反应 | 确认回传值是 once/always/reject |
/compact 失败 |
检查 OpenCode 可用模型 |
| 后台模式无法停止 | logs/bridge.pid 是否残留 |
| 文档 | 说明 |
|---|---|
| 架构文档 | 项目分层设计与平台能力矩阵 |
| 环境变量 | 完整环境变量配置说明 |
| 可靠性指南 | 心跳、Cron 与宕机救援配置 |
| 飞书后台配置 | 事件订阅与权限配置 |
| 命令速查 | 完整命令列表与使用说明 |
| 实现细节 | 关键功能实现说明 |
| 故障排查 | 常见问题与解决方案 |
| 部署运维 | 部署、升级与 systemd 配置 |
| Agent 使用 | 角色配置与自定义 Agent |
| 灰度部署 | 路由器模式灰度与回滚 SOP |
| SDK API | OpenCode SDK 集成指南 |
| 工作目录指南 | 工作目录策略与项目配置 |
本项目采用 GNU General Public License v3.0
GPL v3 意味着:
- ✅ 可自由使用、修改和分发
- ✅ 可用于商业目的
- 📝 必须开源修改版本
- 📝 必须保留原作者版权
- 📝 衍生作品必须使用 GPL v3 协议
如果这个项目对你有帮助,请给个 ⭐️ Star!


















