DeepSeek Harness Hub
← 返回列表

cloveric/tarocub

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
需源码安装

TaroCub:飞书/Lark-first 的本地 AI agent 网关,支持 Codex、Claude…

暂不能直接安装(需源码编译或环境不满足):缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。 · 最近上游提交 2026/9/17 · 已提供中文文档

飞书/Lark 优先的本地 AI 代理网关,以及面向 Codex、Claude Code、Kimi Code、DeepSeek Harness 和 Antigravity 的原生 DeepSeek Harness 插件;Telegram 为可选。

综合分
41.7
GitHub 分
41.7
用户评分
★ Stars
14
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add cloveric/tarocub
缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装,改用 GitHub 源安装
数据截至 2026/9/17(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查需源码安装

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

npm 包tarocub(未发布到 npm,仅可源码安装)
Node 引擎要求 >=20.17.0 · 基线 Node 22.19 满足
dsh CLI 依赖未声明 dsh 版本约束
入口文件缺少入口声明

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/17 16:25:57

用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

English  |  中文文档  |  📖 飞书云文档版

= 20.17">

TaroCub:飞书/Lark-first 的本地 AI agent 网关,支持 Codex、Claude Code、Kimi Code、DeepSeek Harness 和 Antigravity。
在手机上续接电脑会话、双向传文件、跑定时任务、调度多个 agent worker,也可以把同一套 bridge 暴露到团队聊天里。

📖 飞书图文版  |  
先从这里开始  |  能做什么  |  产品边界  |  核心工作流  |  Search MCP  |  Agent Bus  |  运维

先从这里开始

TaroCub 不是又一个托管式 agent UI。 它在你的机器上运行真正的 Codex、Claude Code、Kimi Code、DeepSeek Harness 和 Antigravity CLI,然后给它们补上飞书/Lark 主入口、访问控制、文件投递、语音转写、定时任务、会话续接、多 bot 路由和可审计的长任务状态;Telegram 作为可选兼容通道保留。

主平台已经是飞书/Lark。 维护者本人已经很久不把 Telegram 当作日常控制面使用。Telegram 仍可用于已有部署,但新安装建议直接从飞书/Lark 开始。

这个项目原名 cc-telegram-bridge。现在的规范仓库是 cloveric/tarocub;GitHub 会把旧 URL 重定向过来,已有状态目录和 cctb 简写也会继续作为兼容层保留。

最简单的安装方式:克隆仓库,用 Codex、Claude Code、Kimi Code、DeepSeek Harness 或 Antigravity 打开它,然后直接对 agent 说:“读一下 README,帮我配置飞书/Lark bot;运行 Lark setup、检查权限并告诉我需要扫码或确认什么。” 这个项目本来就是给 CLI agent 自己安装和运维的。

npm install
npm run build
node dist/src/index.js lark setup --detached --install-cli --identity bot-only
node dist/src/index.js lark yolo unsafe

--detached 会让扫码注册在 tmux 中持续运行,完成后自动启动 Lark 服务。若 lark doctor 报缺 scope,按输出链接补权限;个人版 PersonalAgent 确认后立即生效,无需发布版本,企业自建应用才可能需要发版。随后运行 lark provision、lark doctor 和 lark slash sync。Telegram 的完整兼容部署流程见 可选:Telegram 快速开始。

权限提示: lark yolo unsafe 会绕过常规审批与部分沙箱限制,只适合你本人控制的可信机器和可信工作区。需要逐次审批时使用 lark yolo off。

安装 DeepSeek Harness 网页搜索增强插件

把独立的原生插件装进普通 Harness 和 TaroCub 私有 Host 共用的 web
profile:

dsh plugin --profile web add github:cloveric/deepseek-harness-web-search-plugin

插件会加入带来源链的 Brave/Tavily 实时搜索和 URL 正文抽取;
TaroCub 集成和 /tarocub 指引都是可选的。安装插件不会创建飞书应用或启动 bridge。
TaroCub 子目录中的唯一维护源仍可安装。检查、升级和卸载命令如下:

dsh --profile web --dump-config | grep -A18 -B2 mcp-cctb-search
dsh plugin --profile web update deepseek-harness-web-search-plugin
dsh plugin --profile web remove deepseek-harness-web-search-plugin

TaroCub 仍会识别以旧包名 tarocub-deepseek-harness-plugin 安装的版本,便于不中断 Bot 地完成迁移。

它能给你什么

| 能力 | 实际意义 |
|---|---|
| 真实 CLI 的远程控制 | 把 Codex、Claude Code、Kimi Code、DeepSeek Harness 或 Antigravity 接到飞书/Lark,不把它们改造成一个假的聊天后端。 |
| DeepSeek Harness 网页搜索插件 | 安装 github:cloveric/deepseek-harness-web-search-plugin;自包含 runtime 提供 Brave/Tavily 实时搜索和 URL 抽取,TaroCub 集成保持可选。 |
| DeepSeek 搜索 MCP | 普通 Harness 由插件提供;TaroCub 管理的 DeepSeek Bot 在插件有效时复用它,否则保留私有 fallback,始终只启用一个 mcp-cctb-search client。 |
| 引擎无关的飞书入站层 | 长语音通义听悟路由和群/话题会话边界都在进入引擎前完成,因此 DeepSeek 与 Codex、Claude、Kimi 共用 15 分钟阈值及 chat/thread 隔离规则。 |
| 会话连续性 | 在手机上续接 Claude 本地 session、绑定 Codex thread、Kimi ACP / DeepSeek Harness session 或 Antigravity conversation,回到电脑后还能继续同一件事。 |
| 飞书/Lark 原生工作面 | 交互卡片、审批、Docs 评论、Sheets/Docs/Drive、群聊与 thread 工作流都走同一套 bridge runtime。 |
| 可选 Telegram 兼容通道 | 已有个人 bot 仍可继续使用文字、文件、图片、语音、审批、cron 和多 bot 运维。 |
| 稳定的长任务运维 | cron、audit、timeline、usage tracking、访问控制和服务重启都由 bridge 管,不塞进模型记忆。 |
| 可追溯网页研究 | 可选 Brave/Tavily MCP 提供 web_search、web_extract、provider status、fallback notice 和 source log。 |
| 多 agent 编排 | Agent Bus 做实例间 delegation,Mini Bus 做 topic 间协作,Board 做持久化 Kanban 任务。 |
| 飞书/Lark 通道(推荐) | 通过官方 Lark Channel SDK 复用同一个 bridge runtime,支持 streaming card、停止按钮、审批和文件/媒体投递标签。 |
| 视频会议 Bot(实验性) | 在灰度能力与权限就绪后,可加入会议、跟随实时字幕、会中问答、邀请成员,并通过带 confirm 的命令结束 Bot 主持的会议;默认关闭。 |

飞书 / Lark 通道(推荐)

飞书/Lark 是主平台,也是主力开发通道 —— 交互卡片、审批、Docs 评论、Sheets/Docs/Drive 工作流、群/话题协作都在这一侧。维护者已经很久不把 Telegram 用作日常控制面;Telegram 仍保留兼容能力和既有测试。两个通道复用同一套 engine adapter、session、workspace、agent.md、审批模型和文件投递标签。

npm run build
node dist/src/index.js lark wizard   # 扫码创建/绑定 PersonalAgent app
node dist/src/index.js lark provision # 对现有 app 重新检查/补齐权限订阅
node dist/src/index.js lark slash sync # 同步飞书原生斜杠命令自动补全
node dist/src/index.js lark status
node dist/src/index.js lark doctor
node dist/src/index.js lark service start
node dist/src/index.js lark service logs 80
node dist/src/index.js lark service restart
node dist/src/index.js lark service restart --all
node dist/src/index.js lark service status --all
node dist/src/index.js lark timeline 20
node dist/src/index.js lark audit 20
node dist/src/index.js lark dashboard

在活跃的 Lark bot turn 里执行 lark service restart --all 时,当前 Lark 实例会自动改成延迟重启,等回复完成后再重启自己。不要在 Lark bot 里手写 shell 循环逐个 restart Lark 实例,否则容易先杀掉当前执行链。

lark wizard 会走官方 Lark SDK 的 PersonalAgent 注册流程,在终端打印二维码,把凭据保存到 ~/.cctb/lark/lark.env(或 CCTB_LARK_STATE_DIR/lark.env),然后检查 bridge 需要的能力:接收消息事件、卡片回调、bot 发消息/资源权限、飞书文档权限。如果 app 有管理权限,wizard 会补齐事件/回调订阅;如果没有,会明确告诉你缺哪个管理 scope。如果你更想手动填凭据,环境变量仍然优先:

飞书输入框里的原生 / 自动补全属于应用元数据,不等同于 bridge 已能解析命令。授权 application:app_slash_command:read 与 application:app_slash_command:write 后运行 lark slash sync;lark slash sync --all 可同步所有已配置 Bot。同步是幂等的,不删除应用中无关的自定义命令,客户端缓存通常约 5 分钟后刷新。

export LARK_APP_ID="cli_xxx"
export LARK_APP_SECRET="..."

可选环境变量:

| 变量 | 含义 |
|---|---|
| CCTB_LARK_STATE_DIR | Lark 服务的状态和 workspace 目录,默认 ~/.cctb/lark。 |
| CODEX_TELEGRAM_INSTANCE | 复用现有 engine 配置时使用的实例名,默认 lark。 |
| LARK_DOMAIN | 需要时覆盖 Lark/飞书 API domain。 |
| LARK_REQUIRE_MENTION_IN_GROUP | 默认 true;群消息必须提到 bot 才会触发,除非显式关闭。 |
| CCTB_LARK_DOC_CREATE_AS / LARK_DOC_CREATE_AS | 可选 user/bot,控制 lark.doc.create 的创建身份;默认 bot。 |

当前 Lark 通道支持:

- p2p/group 消息进入同一条 Bridge.handleAuthorizedMessage 路径,并复用 Telegram 侧同一套 pairing/allowlist 访问控制;
- 基础聊天命令:/help、/status、/usage、/model、/effort、/fast、/engine、/yolo、/goal、/btw、/ask、/reset、/detach、Claude/Kimi/DeepSeek/Antigravity /resume 扫描选择、显式 /resume thread ... / /resume session ... / /resume conversation ...、/cron、/board、/mini、/fan、/chain、/verify、/stop、Lark /q(运行中强制排队);
- 私聊主时间线使用 lark: 连续会话;私聊中的真实 thread/topic 使用 lark:: 独立会话,但访问授权仍绑定父私聊;
- 群聊是否按 thread 隔离取决于飞书“群消息形式”:话题群或 thread 形式群按 topic 独立,普通对话形式群的 reply/thread 继续共享全群会话;
- /newgroup 、/newgroup topic 、/newtopic  默认由实例 bot 创建并拉入发起人;显式用户 OAuth 模式则由 OAuth 用户创建。两条路径都会确保实例 bot 入群并自动授权新群;默认仍需 @bot,只有显式 /group all 才监听普通消息;
- streaming interactive card 和 Card 2.0 callback 停止按钮;
- 引擎权限请求审批卡片,点击审批前会按操作者重新走 bridge 访问控制;
- 收到图片/文件资源后只在当前 turn 临时下载,完成 staging/转写后清理临时输入;
- 通过 [send-file:/abs/path]、[send-image:/abs/path]、send.audio、send.video 和 send.batch tool tag 把文件/图片/音视频发回 Lark;
- 结构化与旧式标签按真实文件身份去重(含软链接/大小写别名);图片卡片只有在平台明确返回“过大”时才拆分重试,超时或断连等不确定 ACK 不会立即重发;
- 通过 lark.post tool tag 发送富文本/图文混排消息;
- 通过 lark.card tool tag 发送自定义交互卡片,按钮点击会回流到同一个 bridge session;
- 通过 lark.doc.create 创建飞书文档,适合长 specs/docs 和可评论反馈的材料;默认用 app/bot 身份创建,确实需要本机 lark-cli 用户身份时可显式 as:"user";
- 飞书云文档评论 @bot:bridge 会拉取评论上下文,跑同一套 engine,并回复到评论线程;评论里可以执行 lark.doc.create,但聊天投递/定时任务类工具会明确提示不支持,不再静默吞掉;
- 通过 /cron 创建飞书/Lark 侧定时提醒和定时任务,每条任务保存 raw Lark chat 路由,scheduler 触发后能回到正确的 Lark 会话;
- 通过 /board 管理持久 Kanban 任务,复用同一实例隔离的 kanban.sqlite 状态模型,同时 timeline 记为 channel=lark;
- 通过 /mini 把飞书群 thread 注册成具名 peer,支持 ask/fan/chain/verify/crew 这类 thread-to-thread 协作;
- 通过 /fan、/chain、/verify 调用 Agent Bus,复用 Telegram 同一套 bus.parallel、bus.chain 和 bus.verifier 配置;
- 飞书合并转发消息会保留为  任务上下文,方便“一键转发给 bot 处理”;
- 按 state dir 加 Lark 服务锁,并提供 lark service start|stop|restart|status|logs|doctor,误开多个 lark run 时不会让多个进程同时消费同一批飞书事件,恢复也更像 Telegram service;
- lark send --chat  支持本地 CLI 主动发文本/文件/图片到 Lark,必须显式指定目标 chat,避免误发到上一次保存的会话;
- timeline 会记录 channel=lark,并提供 Lark 专用的 lark timeline / lark audit / lark dashboard 别名,所以不用再绕到 Telegram CLI 也能检查 Lark 流量。

访问控制故意复用现有 bridge store。未配对的 Lark 私聊不会直接跑引擎,而是返回配对/allowlist 指引。现在可以直接用 Lark 专用别名管理 Lark state dir:node dist/src/index.js lark access pair 、lark access allow 、lark access policy allowlist 和 lark access status。

Lark 专用 tool tag 沿用 Telegram side-channel 的紧凑 JSON 写法:

[tool:{"name":"lark.card","payload":{"title":"请选择","body":"下一步怎么做?","actions":[{"label":"继续","value":"continue"}]}}]
[tool:{"name":"lark.doc.create","payload":{"title":"Spec","content":"# Spec\n\n正文","docFormat":"markdown"}}]
[tool:{"name":"send.video","payload":{"path":"/absolute/path/demo.mp4"}}]

如果传 raw lark.card payload,bridge 会在存在会话上下文时给普通按钮自动补 Card 2.0 behaviors: [{type:"callback", value: ...}] 回调 metadata;如果你已经显式提供 callback metadata,则保留你的自定义回调。

lark-cli 适合在 agent turn 里处理飞书 Docs/IM/Calendar 等操作,但它不是入站 bot transport。入站长连接使用 @larksuiteoapi/node-sdk,因为它直接提供 normalized message event、card callback、streaming card 和 media helper。

产品边界

| 它是 | 它不是 |
|---|---|
| 一个把现有 Codex / Claude Code / Kimi Code / DeepSeek Harness / Antigravity 暴露到飞书/Lark,并可选暴露到 Telegram 的本地 bridge。 | 一个托管 SaaS agent 平台,或这些原生 CLI 的替代品。 |
| 一个管理会话、文件、审批、定时任务和多 agent 路由的控制层。 | 一个模型供应商、推理服务或独立 LLM runtime。 |
| 一个给重度 CLI agent 用户使用的实用运维层。 | 一个面向所有 IM 平台的通用聊天机器人框架。 |
| 一个把 delivery receipt、审计日志和任务状态移出脆弱 prompt 的地方。 | 一个保证模型永远自动正确完成任务的魔法盒。 |

核心工作流

| 工作流 | 入口 |
|---|---|
| 个人手机 copilot — 人在外面,也能操作电脑上的 Codex/Claude/Kimi/DeepSeek/Antigravity。 | 飞书/Lark 通道、会话续接 |
| 研究助手 — 搜索、直接读取 URL、保留 source log,再把文件发回 Telegram。 | Search MCP、文件投递 |
| Topic mini crew — 把一个 Telegram 群里的 forum topics 当 planner/writer/reviewer peers。 | Mini Bus、Telegram 群聊和 Topic |
| 持久化任务板 — 把 task、依赖、run、WIP limit 和 review gate 放到模型上下文之外。 | Board |
| 多 Bot agent bus — 在隔离 bot 实例之间 delegation,带 health check 和版本化本地协议。 | Agent Bus、Crew Workflow |

近期亮点

- v0.1.149–v0.1.151 — Codex 任务运行中可“边跑边补话”:纯文本直接注入当前 turn(turn/steer,OK 表情确认),/q  强制独立排队;/model fable 接入 Claude Fable 5;一轮 19 项审计修复(/stop 真正中断 Codex、配对码过期锁修复、Lark 日志轮转等)。
- v4.6.53 — 收紧飞书/Lark 产品边界:Telegram service --all 不再误扫 ~/.cctb/lark,Lark 临时附件 turn 后清理,lark send 必须显式 --chat,Docs 默认用 bot 身份创建,doctor 复用统一 secret 脱敏。
- v4.6.51–v4.6.52 — 补齐 Lark 主要 parity:直接最终回复、Lark 路由 /cron、/board、/mini、/fan、/chain、/verify、/goal,以及 service/audit/dashboard aliases 和 Telegram Markdown 投递加固。
- v4.6.42–v4.6.46 — 新增 QR lark wizard、lark provision、domain-safe PersonalAgent setup、权限/订阅检查,以及飞书云文档评论 @bot 后 in-thread 回复。
- v4.6.39–v4.6.41 — 引入飞书/Lark 通道预览:官方 Channel SDK 长连接、消息/卡片回调、服务锁、资源投递、Docs 创建、Card 2.0 callback behaviors。
- v4.6.22 — 新增 Antigravity CLI 第三后端,引入 /engine antigravity、YOLO/full-auto、conversation 绑定和 print-mode 模型 guardrails。
- v4.6.10–v4.6.18 — 加固 Telegram 核心:Codex/Claude /goal、音视频 ASR、/stop 旧进程清理,以及 Search MCP 的 web_extract、source log、provider metadata 和 health check。
- v4.6.2 — 新增 /board 持久化 Kanban 和 /mini topic/thread workflow。

升级已有 generated 实例指令: 更新代码后请刷新已生成的 agent.md block,让旧 bot 拿到最新短 Telegram Transport block:

telegram instructions upgrade --all --dry-run
telegram instructions upgrade --all
telegram service restart --all

只有当某个实例有自定义 transport block 且你确认要覆盖时,才使用 --force。强制覆盖前会在原文件旁边创建 agent.md.bak. 备份。

为什么是这套架构

- 优先保留原生 CLI 能力。 bridge 运行的是真正的 Codex、Claude Code、Kimi Code、DeepSeek Harness 和 Antigravity CLI,所以本地认证、项目文件、会话、审批和引擎原生行为都尽量和桌面端保持一致。
- 随时续接电脑上的工作。 在飞书/Lark(主平台)或 Telegram(兼容通道)里接上本地 Codex、Claude Code、Kimi、DeepSeek 或 Antigravity 会话,人在外面也能继续发文件、补指令;回到电脑后还能接着同一个项目继续做。会话和恢复后的 workspace 按私聊、群聊或 topic 隔离,其他对话不会静默切换到这个项目。
- 群聊 topic 可以当干净的旁路对话。 一个 bot 可以同时服务私聊和已允许的 Telegram 群;forum topic 会有独立 session 和 cron 范围,临时任务、定时任务不会污染主对话。不同 topic 还可以组成 Mini Bus,用同一个群里的轻量 peer 跑 fan-out、chain、verify 或 crew workflow;/board 负责把 Kanban 任务状态持久化到模型记忆之外。
- 多引擎不需要多套玩法。 每个 bot 可以独立选择 Codex、Claude、Kimi、DeepSeek 或 Antigravity,但文件投递和定时任务都走同一套 schema-backed [tool:{...}] bridge 协议。
- 通道能力放在 bridge,而不是模型记忆里。 飞书/Lark 与 Telegram 的发文件、cron 持久化、receipt、权限检查和失败重试由 bridge 代码负责,所以换模型、重启实例、续接会话后仍然有稳定语义。
- Prompt 短,规则稳定。 transport 规则放在实例级 agent.md,每轮 prompt 不再需要塞 request id、临时目录或 side-channel token。
- 看 receipt,不信口头声明。 文件投递和定时任务创建都有结构化 accepted/rejected receipt;只有 bridge 真正发出文件或写入任务,才算完成。
- 默认可运维。 timeline、audit、doctor、dashboard、usage tracking、cron 状态和 generated 指令升级,让失败可见,也让恢复流程可重复。

多引擎:Codex + Claude Code + Kimi Code + DeepSeek Harness + Antigravity

每个 bot 实例可以独立选择 OpenAI Codex、Claude Code、Kimi Code、DeepSeek Harness 或 Antigravity CLI 作为后端引擎。在飞书/Lark 或 Telegram 会话里直接发送 /engine kimi、/engine deepseek、/engine codex、/engine claude 或 /engine antigravity 即可切换;下面是 Telegram 兼容实例的本地 CLI 示例:

将某个实例设为 Claude Code
npm run dev -- telegram engine claude --instance review-bot

将另一个设为 Codex
npm run dev -- telegram engine codex --instance helper-bot

将另一个设为 Kimi Code
npm run dev -- telegram engine kimi --instance kimi-bot

将另一个设为 DeepSeek Harness
npm run dev -- telegram engine deepseek --instance deepseek-bot

将另一个设为 Antigravity
npm run dev -- telegram engine antigravity --instance agy-bot

查看当前引擎
npm run dev -- telegram engine --instance review-bot

切到 Kimi 后,服务优先使用 KIMI_EXECUTABLE,否则回落到 ~/.kimi-code/bin/kimi;CLI 需要先在本机完成认证。TaroCub 使用持久 kimi acp 协议。full-auto 映射 ACP yolo(自动批准工具但仍可提问),unsafe/bypass 映射 auto(完全自主)。

切到 DeepSeek 后,服务优先使用 DSH_EXECUTABLE,否则使用 PATH 中的 dsh;需要先在本机完成 Harness 认证。TaroCub 为每个实例托管私有、仅 loopback 的 dsh web,通过官方 HTTP RPC 与双 WebSocket 下行流工作,而不是抓取终端文字。实测兼容基线为 DeepSeek Harness 0.1.1-rc.2。

切到 Antigravity 时,bridge 会自动把该实例设为 YOLO/full-auto;如果你已经显式设成 bypass,则保留 bypass。当前实测兼容基线为 Antigravity CLI 1.1.22。每个活跃 conversation 维持一个原生 NDJSON stream-json worker,后续轮次复用热进程;空闲两小时、进程崩溃或 workspace、审批模式、模型、effort、超时等启动参数变化时会安全回收,并用权威 conversation ID 重建。session、回答、工具、终态和本轮 token 分开处理;非结构化 stdout、不匹配的输入回显、缺失或中途变化的 conversation ID、缺失最终 result 都会 fail closed,不会被误发成回答。full-auto 自动批准但同时启用 Antigravity 沙箱,只有显式 bypass 不启用沙箱。/model  会传给原生 --model(用 agy models 查看 ID),/effort 支持 low、medium、high 和 off。

| 特性 | Codex | Claude | Kimi | DeepSeek | Antigravity |
|---|---|---|---|---|---|
| 协议 | app-server / codex exec | stream-json | kimi acp | 私有 dsh web + 官方 HTTP/WS | 每 conversation 持久 NDJSON stream-json worker;原生 /goal 用直接 -p prompt |
| 会话恢复 | /resume thread  | /resume 扫描并选择 | /resume 扫描,也支持 /resume session  | /resume 扫描,也支持 /resume session ;真实 cwd 校验 | 结构化 conversation_id 自动绑定;日志扫描发现;/resume conversation  |
| 项目指令 | agent.md prompt 注入 | agent.md system prompt + workspace CLAUDE.md | workspace .kimi-code/agents/agent.md 主代理 override | 实例私有 DSH_HOME/AGENTS.md | agent.md prompt 注入 |
| 流式与工具 | 原生事件 | 原生事件 | ACP 文本、思考、工具、审批事件 | 原生文本/推理/工具/结果/usage 事件 | 原生 session/text/tool/result 事件 |
| 后台任务 | 结构化生命周期 | 结构化生命周期 | Hook + 任务复核/自动重试 | session/jobs + 自动复核,最终结果 exactly-once | result 后无结构化后台生命周期 |
| 审批 / 提问 | app-server 沙箱 / process 整轮预审批 | 单工具审批 + 结构化提问 | ACP 单工具审批;当前单选提问 | 单次/会话审批 + 多问题、多选、自由文本 | 整轮预审批 |
| 本地 skill / MCP | 原生 skill/MCP | 原生 skill/MCP/plugin | 原生 Kimi skill/MCP/plugin + bridge Search MCP | 复用 Harness profile;原生 plugin/MCP 由 Harness 管 | 原生能力 |
| /goal | 结构化 goal | 原生命令透传 | gap:真机返回 Unknown ACP command | 原生持久 Goal + 可选 token budget | 原生命令透传 |
| /steer | app-server 中途注入 | gap,后续消息排队 | gap,ACP 无中途 prompt 注入 | 原生 session.steer | gap,后续消息排队 |
| /model / effort | bridge 配置 | bridge 配置 | ACP session option | Harness session model API 实时校验 | bridge 配置转原生 --model / --effort |
| /compact / /context | 无状态 / runtime context | 支持 / 支持 | 支持 / 暂无结构化 context | 官方命令 / contextPressure 投影 | 暂不支持 |
| 用量 | token(费用视 runtime) | token + USD | gap:无结构化 token/费用 | token;无 USD,美元预算不生效 | 本轮 token;无 USD |
| 工作目录 | 实例 workspace/ | 实例或恢复 session 的原工作区 | 绑定前用真实 session/load 校验 cwd | 绑定前用 session.list/history 校验 cwd,跨工作区 fail closed | 实例 workspace/ |
| 进程生命周期 | 按 runtime | stream worker 2 小时回收 | ACP worker 2 小时回收;session 可恢复 | 每实例持久 Host,崩溃重启并按水位恢复 | 每 conversation 持久 worker,2 小时空闲回收;崩溃/配置变化后按 UUID 恢复 |

Antigravity 当前仍有明确的上游边界:headless 协议没有单工具远程审批、运行中 steer、result 之后的后台任务生命周期,也没有手动 compact/context API。普通审批因此是整轮一次确认,bridge 不会假装与 Codex/Claude 完全对齐。详见 Antigravity Engine 能力矩阵。

当前兼容基线是 Kimi Code 0.41.0。无 prompt 的真实 ACP 探针确认 session/new 与 session/load 都接受 bridge 注入的 stdio Search MCP,并会实际启动子进程;TaroCub 因此始终发送完整 MCP 列表,初始化失败时 fail closed,不再静默移除搜索能力。0.41.0 把 ACP auto 改成真正的 Never Ask:高危及无法分析的命令也会直接执行。因此新的 Kimi 配置默认使用 bridge full-auto / ACP yolo;升级前遗留、且没有新版 Never Ask 明确确认标记的 bypass 也会安全降级为 yolo,只有重新执行 /yolo unsafe 才进入 auto。两者都不是 OS 沙箱,yolo 下的 terminal cwd 边界也不等于文件系统隔离。

Kimi 0.41.0 还允许 AskUserQuestion(background=true) 晚于前台回合结束。TaroCub 会把这类审批卡绑定到保留的后台问题任务,不随前台回合结束而取消;若请求稍后才到达,则通过 Hook 记录的 question task 继续路由,并在 worker 销毁或超时后 fail closed。

Kimi 0.33 引入了后台进程结束后的内部“任务复核回合”,模型可能检查错误并自动重试。TaroCub 会在原用户回合结束后继续接收这段 ACP 输出,把多轮重试关联到同一任务链;中间失败保留在审计时间线但不直接误报给用户,最终只发送一次 Kimi 复核后的结论。若复核 Hook 没有到达,则在短暂等待后回退到真实任务输出;丢失的复核状态也会超时释放,不会永久阻塞会话或重启。

对于最终成功的后台任务,TaroCub 会读取真实输出;若输出明确以 saved / wrote / generated 报告了工作区内的受支持产物,会自动进入同一套文件/图片投递层。失败任务、不存在文件、隐藏路径、非支持类型和越出工作区的路径只保留为文字,不会自动发送。系统提示同时要求模型检查实际结果,不能只凭退出码判断成功,并直接输出交付标签,不能把“已保存到某路径”冒充为已经交付。

Kimi 的实测事件、取消、提问、恢复和 gap 证据见 docs/kimi-engine-notes.md,Kimi 对照见 docs/kimi-capability-matrix.md。DeepSeek 的 Host 架构、恢复不变量、功能矩阵与模型限制见 docs/deepseek-harness-engine.md。图片已经按 Harness 官方内容格式传输,但是否能识图取决于当前模型;实测默认 deepseek-v4-flash 会返回 MODEL_DOES_NOT_SUPPORT_IMAGES。DeepSeek 会上报 token,但不提供单轮 USD,/ultrareview 仍仅 Claude 可用。

实时网页搜索 MCP:Brave + Tavily

bridge 内置一个可选的本地 MCP server。Codex、Claude Code 和 Antigravity 可按各自原生方式注册;Kimi 实例会由 TaroCub 在 ACP 新建/恢复 session 时自动注入,同时保留 Kimi 自己的 MCP/plugin。DeepSeek 推荐安装独立 Harness 插件;TaroCub 管理的 Host 会校验插件能力和入口,有效时由插件接管,缺失、旧版或损坏时使用 bridge 私有 fallback,避免重复 client:

- web_search:通过 Brave 和/或 Tavily 做实时搜索。
- web_extract:用 Tavily Extract 清理并抽取指定 URL 正文。
- provider_status:检查 Brave/Tavily 是否已配置,不暴露 API key。
- health_check:需要排查 auth、quota、rate limit 或 timeout 时,手动发起 Brave/Tavily 真实探活;可以传 query 换掉默认探活词。
- 如果用户已经给了明确 URL,agent 应该先直接读取这些 URL,再用搜索做链接发现或背景补充。

它的好处不是“又多一个搜索按钮”,而是让来源链更清楚:

- Brave 适合找 URL、当前文档、价格页、新闻和普通网页结果。
- Tavily 适合偏研究的补充搜索和正文抽取。
- verify 模式会同时用 Brave + Tavily 交叉检查重要结论。
- 返回结果带 sourceLog、provider、domain、rank、accessedAt、extractedAt,抽取正文还带 contentHash。
- 如果 Brave/Tavily 其中一个失败并走 fallback,结果会带 fallbacks 和 notice,agent 应该在答案里简单说明 fallback。

配置方式:

export BRAVE_API_KEY="..."
export TAVILY_API_KEY="..."
npm run build

codex mcp add web-search \
--env BRAVE_API_KEY="$BRAVE_API_KEY" \
--env TAVILY_API_KEY="$TAVILY_API_KEY" \
-- node "$PWD/dist/src/index.js" search-mcp

claude mcp add web-search \
-e BRAVE_API_KEY="$BRAVE_API_KEY" \
-e TAVILY_API_KEY="$TAVILY_API_KEY" \
-- node "$PWD/dist/src/index.js" search-mcp

Kimi 无需手工注册 TaroCub Search MCP。DeepSeek 推荐执行 dsh plugin --profile web add github:cloveric/deepseek-harness-web-search-plugin;即使没有插件,TaroCub 管理的 DeepSeek Host 仍会使用经验证的私有 fallback,但普通 Harness 不会因此自动获得工具。Antigravity 如需原生 MCP/plugin,请使用自己的配置方式。bridge 可以跨引擎复用 skill 文档和工具规则,但各引擎原生插件系统仍然独立。

配置后重启相关 bot 实例,让新进程继承环境与原生 MCP/plugin 配置;Kimi 会自动获得 TaroCub Search MCP。Codex process 模式如果大量使用 MCP,建议使用 YOLO/full-auto/bypass 实例;普通非交互 codex exec 的 read-only approval 模式可能会取消 MCP tool call。更多细节见 docs/search-mcp.md。

Claude 引擎:CLAUDE.md 支持

使用 Claude 引擎时,每个实例会有一个 workspace/ 目录。在里面放一个 CLAUDE.md 就能定义项目级指令:

~/.cctb/review-bot/
├── agent.md              ← "你是一个严格的代码审查员"
├── workspace/
│   └── CLAUDE.md         ← "TypeScript 项目,用 ESLint,不要改测试文件"
├── config.json           ← { "engine": "claude", "approvalMode": "full-auto" }
└── .env

两层指令互不冲突:
- agent.md → bot 人格(通过 --system-prompt 注入)
- CLAUDE.md → 项目规则(Claude 从工作目录自动发现)

多 Bot 部署

想开多少个 bot 就开多少个。每个实例完全隔离 — 独立的引擎、token、人格、线程、访问规则、收件箱和审计日志。默认语义仍然是“一实例一个聊天”;多聊天是显式开启的例外模式。

┌─────────────────────────────────────────────┐
│                  TaroCub                     │
└────────────┬──────────────┬─────────────────┘
│              │
┌──────────────┼──────────────┼──────────────┐
▼              ▼              ▼              ▼
┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
│  "default" │ │   "work"   │ │ "reviewer" │ │ "research" │
│  引擎:     │ │  引擎:     │ │  引擎:     │ │  引擎:     │
│   codex    │ │   codex    │ │   claude   │ │   claude   │
│            │ │            │ │            │ │            │
│ agent.md:  │ │ agent.md:  │ │ agent.md:  │ │ agent.md:  │
│ "通用助手" │ │ "中文回复" │ │ "严格审查" │ │ "深度研究" │
└────────────┘ └────────────┘ └────────────┘ └────────────┘
PID 4821       PID 5102       PID 5340       PID 5520

30 秒部署

配置各实例
npm run dev -- telegram configure
npm run dev -- telegram configure --instance work
npm run dev -- telegram configure --instance reviewer

设置引擎
npm run dev -- telegram engine claude --instance reviewer

设置人格
npm run dev -- telegram instructions set --instance reviewer ./reviewer-instructions.md

推荐:给 Telegram/手机使用开启 YOLO
npm run dev -- telegram yolo on --instance work

全部启动
npm run dev -- telegram service start
npm run dev -- telegram service start --instance work
npm run dev -- telegram service start --instance reviewer

Agent 指令

每个 bot 有自己的 agent.md。每条消息都会重新加载 — 随时编辑,无需重启。

npm run dev -- telegram instructions show --instance work
npm run dev -- telegram instructions set --instance work ./my-instructions.md
npm run dev -- telegram instructions path --instance work

也可以直接编辑文件:

Windows
notepad %USERPROFILE%\.cctb\work\agent.md

macOS
open -e ~/.cctb/work/agent.md

Agent 任务里的文件投递

每个 Telegram turn 运行时,bridge 会通过注册过的 Telegram tool layer 投递生成文件。Agent 面向的标准形式是内联 tool tag:

[tool:{"name":"send.file","payload":{"path":"/absolute/path/to/report.pdf"}}]
[tool:{"name":"send.image","payload":{"path":"/absolute/path/to/image.png"}}]
[tool:{"name":"send.batch","payload":{"message":"Done","images":["/absolute/path/to/image.png"],"files":["/absolute/path/to/report.pdf"]}}]

如果 payload 较长或包含很多引号,也可以输出同一个 tool envelope 的 fenced block:

tool-call
{"name":"send.file","payload":{"path":"/absolute/path/to/report.pdf"}}

CLI 工作流里,bridge 仍会把稳定的 cctb 命令注入到支持 turn-scoped env 的 engine 进程:

cctb send --image /absolute/path/to/image.png
cctb send --file /absolute/path/to/report.pdf
cctb send --message "Done" --file /absolute/path/to/report.pdf

在 active Telegram turn 内,cctb send 会走 turn-scoped side-channel,并保留当前 chat/session 上下文。active turn 外也可以直接用仓库 CLI,它会回退到已配置实例和当前活跃 Telegram session:

telegram send --image /absolute/path/to/image.png
telegram send --file /absolute/path/to/report.pdf
telegram send --chat 123456789 --file /absolute/path/to/report.pdf
telegram send --instance bot2 --chat 123456789 --image /absolute/path/to/image.png

当前投递约定:

- Agent 应该用 [tool:...] 投递已存在的文件、图片、PDF、PPT 和其他二进制产物。这是生成实例指令唯一教给 agent 的投递 tag 格式。
- [tool:...] 示例由注册过的 tool schema/examples 生成;显式 fenced tool-call block 也走同一个解析器。
- cctb send 仍可用于 turn-scoped CLI 工作流,并且内部会走同一套 send tool layer。
- active turn 外,或者 turn-scoped cctb helper 不可用时,用 telegram send 做同一条显式投递链路。
- 显式发送命令接受任意可读绝对路径。
- 旧的 [send-file:/absolute/path] / [send-image:/absolute/path] 仅作为旧会话和历史输出兼容保留。新的 agent 指令、system prompt 和示例不要再使用它们。
- 小型文本/代码文件仍可用 file:name.ext fenced-block 形式返回。
- helper 只在当前 Telegram turn 有效,turn 结束后不能再用。
- [tool:...] / cctb send / telegram send 显式发送接受任意可读绝对路径;legacy fallback tag 仍按旧的 workspace / /resume 路径规则校验。
- Telegram 与 Lark 都会拒发 .env、.pem、.key、id_rsa、id_ed25519 等凭据形态文件,即使文件位于允许的 workspace 内也不例外。
- 文件投递成功和拒绝都会记录为 turn 级 receipt,所以 bridge 可以用结构化交付证据判断是否完成,而不是相信文本声明。
- 如果某个文件已经通过 stream delivery 或 side-channel helper 发过,最终 .telegram-out 扫描会按真实路径跳过它,避免 Telegram 重复附件。
- request-scoped .telegram-out// 目录只是运行时缓冲区,24 小时后自动清理。
- Telegram 收到的附件默认保留 3 天后清理,可用 TELEGRAM_INBOUND_FILE_RETENTION_DAYS 调整。
- bridge 不再保留 manifest、pending contract 或基于数量的状态来推断普通聊天 turn 里的未来交付意图。
- 纯文本任务不会误当成文件交付失败,例如图片分析、图片描述、内联报告;除非用户明确要求保存、导出、发送或交付文件。

这对 Codex、Claude、Kimi、DeepSeek、Antigravity 及其 process、stream、ACP、Harness runtime 都有效,因为标准路径只要求 agent 能输出文本。文件投递现在是显式动作:生成文件,输出 tool tag 或调用发送命令,然后依赖 receipt。

从 v4.5.0 或更早版本升级时,请刷新已生成的实例指令:

telegram instructions upgrade --all --dry-run
telegram instructions upgrade --all

这个命令会安全替换旧的 generated Telegram Transport block;缺少 transport section 时会追加。自定义 transport section 默认不会覆盖,除非显式加 --force。--force 覆盖前会在原文件旁边创建 agent.md.bak. 备份。

定时任务 / Cron

Agent 可以通过和文件投递同一套 tool layer 创建 Telegram 投递的提醒和周期任务:

[tool:{"name":"cron.add","payload":{"in":"10m","prompt":"check email"}}]
[tool:{"name":"cron.add","payload":{"at":"2026-05-01T09:00:00Z","prompt":"Monday standup"}}]
[tool:{"name":"cron.add","payload":{"cron":"0 9  * 1","prompt":"weekly summary"}}]

用户也可以直接在 Telegram 里管理任务:

/cron list
/cron add 0 9 * * 1 weekly summary
/cron rm
/cron toggle
/cron mode  new_per_run
/cron run

这套 cron 是为了 Telegram 投递设计的,不是任一引擎自己的 session-local reminder:

- 任务持久化在实例状态里,bot 重启后仍会加载。
- chatId、userId、chatType 由 bridge 注入,不信任 agent payload 里的同名字段。
- 支持相对提醒(in)、绝对时间(at)和 5 字段 cron 表达式(cron)。
- 每个任务会保存 timezone;默认跟随运行 bot 的服务器/实例环境。
- 停机太久后,过期的一次性提醒会标记为 missed,不会在启动时暴雨式补发。
- 周期任务会记录失败次数和有上限的 run history,连续失败后可以自动停用。
- 定时任务默认使用 sessionMode: "new_per_run",每次触发都开干净上下文,不继承创建任务时的聊天上下文;只有明确要“接着当前会话继续”的任务才使用 sessionMode: "reuse"。
- 这个默认值上线前创建的旧任务会保留已存储的模式;可用 /cron mode  new_per_run 原地升级旧周期任务,不必删除重建。
- 每个 chat 有任务数量上限,防止任务递归创建导致无限增长。

人类运维仍然可以用 CLI 检查和调试;但 generated instructions 会要求 agent 使用 [tool:{...}] layer,这样 Claude/Codex/Kimi/DeepSeek/Antigravity 的 process、stream、ACP 和 Harness runtime 行为一致。

YOLO 模式

如果你希望 Telegram bot 免打断运行,推荐开启 telegram yolo on。如果保持 YOLO 关闭,bridge 会用 Telegram 审批按钮接住无头审批:Claude、Kimi 和 DeepSeek 可以按原生权限请求审批;Codex app-server 模式会把 YOLO 设置映射到 app-server sandbox mode;Antigravity process 模式会做整轮 turn 预审批。DeepSeek 的 on 保持 workspace sandbox,unsafe 才映射 Harness danger-full-access;后者只适合完全可信的本地环境。

Claude 审批按钮会启动一个短生命周期的 localhost MCP bridge,并带随机 URL token。它能挡住盲扫本地端口的进程,但同一用户下能查看进程命令行的本地进程仍可能看到 token。所以 YOLO 关闭时的审批适合单用户工作站便利操作,不等于多用户隔离边界。

npm run dev -- telegram yolo on --instance work      # 安全自动审批
npm run dev -- telegram yolo unsafe --instance work   # 跳过所有检查
npm run dev -- telegram yolo off --instance work      # 恢复正常流程
npm run dev -- telegram yolo --instance work          # 查看状态

| 模式 | Codex | Claude | 适用场景 |
|---|---|---|---|
| off | Telegram 预审批整轮 turn | Telegram 工具审批 | 默认,最安全 |
| on | --full-auto | --permission-mode bypassPermissions | 手机操作 |
| unsafe | --dangerously-bypass- | --dangerously-skip-permissions | 仅限可信环境 |

热加载 — 不用重启 bot,CLI 切一下立刻生效。

用量追踪

按实例追踪 token 消耗和费用:

npm run dev -- telegram usage                    # 默认实例
npm run dev -- telegram usage --instance work    # 指定实例

输出:
Instance: work
Requests: 42
Input tokens: 185,230
Output tokens: 12,450
Cached tokens: 96,000
Estimated cost: $0.3521
Last updated: 2026-04-09T10:00:00Z

Claude 报告精确 USD 费用,Codex 和 DeepSeek 报告 token 数但没有 bridge 可用的精确 USD;Kimi 当前没有结构化单轮用量。

运行可见性与 Timeline

turn 运行期间,bridge 会向 Telegram 发送 typing action,并把结构化事件写入 timeline.log.jsonl / audit.log.jsonl。长工具调用不会实时编辑聊天里的消息内容;需要排查时看:

npm run dev -- telegram timeline --instance work
npm run dev -- telegram dashboard --instance work
npm run dev -- telegram service status --instance work

telegram verbosity 仍作为兼容配置保留,但当前 Codex/Claude/Kimi/DeepSeek/Antigravity runtime 使用的是 typing action + timeline/audit 事件,不会把模型的中间输出实时改写到 Telegram 消息里。

预算控制

为每个实例设置消费上限。当总费用达到上限时,新请求将被拦截,直到提高或清除预算。

npm run dev -- telegram budget show --instance work     # 当前花费与上限
npm run dev -- telegram budget set 10 --instance work   # 上限 $10
npm run dev -- telegram budget clear --instance work    # 移除上限

预算实时执行 — 达到上限时 bot 会用中英双语提示。

语音输入(ASR)

在 Telegram 发送语音/音视频,或在飞书/Lark 发送音频/视频资源,桥接器都会在进入 Claude、Codex、Kimi、DeepSeek、Antigravity 适配器之前完成转写。短音频走本机 Qwen ASR,无需云端服务。

长音频自动走云端(通义听悟,可选):配置后,≥ 15 分钟的音频/视频自动路由到阿里云通义听悟离线转写(30 分钟音频约 40 秒出全文),短音频仍走本机 Qwen。未配置时全部走本地;云端失败时按安全分片回退本地。

不要让安装 Agent 给每个 Bot 重新开发一套云端适配器。 仓库已经提供不含密钥的官方参考实现 integrations/tingwu-asr。每台机器只安装一份,所有 Bot 实例共享:

bash scripts/install-tingwu-asr.sh
bash ~/.tarocub-secrets/tingwu_asr/configure_env.sh

这是外置子进程协议,不是听悟本地服务:通义听悟没有 TaroCub 专用端口;8412 只属于本地 Qwen。官方适配器已经负责 OSS 上传、签名 URL、离线任务轮询、结果下载和临时对象清理。lark doctor 会检查脚本、虚拟环境、凭据文件是否存在且权限安全,以及实际路由阈值,但绝不读取凭据内容;认证是否有效仍须用真实音频烟测确认。

- 激活:TINGWU_ASR_DIR=/path/to/tingwu_asr,所有 Bot 指向同一个已配好的官方适配器目录;不要按 Bot 复制(密钥留在该目录的 .env.local,桥不读取也不记录)
- 阈值:ASR_CLOUD_THRESHOLD_SECONDS(默认 900 秒)
- 超时:ASR_CLOUD_TASK_TIMEOUT_SECONDS。不设置时,脚本自己的 --timeout 是 7200 秒,但子进程最多跑 15 分钟就会被杀掉——否则一个卡住的云端任务会把这个会话的队列占用两小时。显式设置这个变量会同时抬高(或压低)这两个上限
- 任务目录保留:ASR_CLOUD_JOB_RETENTION_DAYS(默认 7 天),每次新任务顺手清理过期的 /asr-jobs//
- 变量写在哪里:Lark 侧直接写进 ~/.cctb//lark.env 即可——这四个走白名单配置通道(loadLarkRuntimeEnv,和 LARK_APP_ID 同一条路),服务启动重写该文件时会保留;也可以导出到启动服务的进程环境,环境变量优先。注意区分同一个文件里的两条路:它们走白名单,不走 extras 透传——透传只把引擎凭据(IFIND_TOKEN 这类 MCP token)转给引擎子进程,并拒绝所有桥保留前缀(CCTB_、TAROCUB_、LARK_、CODEX_、CLAUDE_、DSH_、KIMI_、ANTIGRAVITY_、ASR_、TELEGRAM_、TINGWU_),因为这些控制桥自身行为(TINGWU_ASR_DIR 指向桥要去执行 python 脚本的目录),所以引擎写入的 extras 永远改不了它。DSH_EXECUTABLE 是显式白名单项;DSH_HOME、endpoint 和未来 Harness 控制项不会从 extras 进入桥进程。被拒的 extras 会在启动时打印 [lark] lark.env: ignored bridge-reserved keys …
- 密钥必须放在任何引擎工作区之外:官方安装器默认放 ~/.tarocub-secrets/tingwu_asr,这样在 ~/.cctb//workspace 里干活的 agent 读不到、也提交不了这些凭据。使用最小权限 RAM 用户及专用 OSS Bucket/Prefix,不要使用主账号 AccessKey
- 消息内开关:「强制本地转写」/「强制云端转写」必须和音频在同一条消息或同一批发送(当作附件说明)才生效——纯语音消息没有 caption,事后再发是新的一轮,改不了已经开跑的转写(冲突时本地优先)
- 云端失败自动回退本地;任务产物(原始 JSON/日志/纯文本)保存在 /asr-jobs// 便于追溯
- /stop 会中断时长探测、ffmpeg 切片、Qwen CLI/听悟子进程,并停止等待本地 Qwen HTTP;用户主动取消不会被误报成“转写失败”,也不会取消后又切换路径重跑。已进入模型内核的本地 HTTP 请求可能仍会在后台收尾,但不会继续占用 bot 的会话队列

工作原理:

1. 用户在 Telegram 发送语音/音视频,或在飞书/Lark 发送音频/视频资源
2. 桥接器下载媒体并探测时长
3. 低于阈值时走本机 Qwen ASR(HTTP 优先、CLI 备用);达到阈值时走通义听悟,云端失败再安全分片回退本地
4. 桥接器把转写文本追加到用户消息后,才交给当前 Claude、Codex、Kimi、DeepSeek 或 Antigravity 引擎

以 Qwen3-ASR 为例搭建:

git clone https://github.com/nicoboss/qwen3-asr-python
cd qwen3-asr-python
python -m venv venv
source venv/bin/activate
pip install -e .
huggingface-cli download Qwen/Qwen3-ASR-0.6B --local-dir models/Qwen3-ASR-0.6B

| 方式 | 地址/路径 | 延迟 | 说明 |
|------|-----------|------|------|
| HTTP 服务 | POST http://127.0.0.1:8412/transcribe | ~2-3s | 模型常驻内存,推荐 |
| CLI 备用 | ~/projects/qwen3-asr/transcribe.py  | ~30s | 每次加载模型 |

可选 ASR 守护:

bridge 默认不会主动启动任意 ASR 进程。只有你显式在实例 .env 里配置修复命令后,它才会在 HTTP ASR 连续失败后尝试重启本地 ASR 服务:

ASR_SERVICE_COMMAND='curl -fsS --max-time 2 -X POST http://127.0.0.1:8412/shutdown >/dev/null 2>&1 || true; sleep 2; cd "$HOME/projects/qwen3-asr" && exec "$HOME/projects/qwen3-asr/venv/bin/python3" "$HOME/projects/qwen3-asr/server.py" >> "$HOME/.cctb/asr-server.log" 2>&1'
ASR_RESTART_AFTER_FAILURES=2
ASR_RESTART_COOLDOWN_MS=60000

这个守护只覆盖常驻 HTTP ASR 服务。CLI 备用仍然可以转写,但不会被当作 daemon 管理。

自定义 ASR: 修改 src/telegram/message-input.ts 中的 createDefaultTranscribeVoice() 函数即可适配其他 ASR 引擎。

会话续接、Codex Thread、Kimi Session、DeepSeek Session 与 Antigravity Conversation

在电脑上用 Claude Code 开了个头?发 /resume 就能在聊天里接着干,不用重复解释上下文。用的是 Codex、Kimi、DeepSeek 或 Antigravity?那就直接用 thread / session / conversation id 绑定现有会话,再从飞书/Lark(主平台)或 Telegram(兼容通道)继续。

Claude 本地 session 续接

/resume          ← Bot 扫描本地最近 1 小时的 session

Bot 列出最近的 session:

最近的本地 session:
1. [tarocub] 64c2081c… (5m ago)
2. [my-app] a3f8b21e… (32m ago)

回复 /resume  继续该 session。

选一个:

/resume 1        ← Bot 自动建软链、切工作区、绑 session

之后发的每条消息都走原始 session — 相同的上下文、相同的项目目录、相同的对话历史。完成后:

/detach          ← 解绑 session;如果存在 /resume 前的旧对话,就恢复它

底层原理:

1. 优先扫描 CLAUDE_CONFIG_DIR/projects/,未设置时回退到 ~/.claude/projects/,查找最近 1 小时内修改过的 .jsonl 文件
2. 绑定 session ID,将工作区切换到你的真实项目路径
3. Claude CLI 在原目录用 -r  继续
4. /detach 会优先恢复 /resume 前的旧对话;如果没有旧对话,再回到默认工作区。本地 session 文件本身不会被改动

零污染: bridge 和实例指令都是每次调用时传入,不会写回本地 session 文件。

Codex thread 绑定

Codex 没有和 Claude 一样的本地 session 扫描入口。如果你已经知道 thread id,可以直接绑定:

/resume thread thread_abc123

绑定后:

- Telegram 里的后续消息会继续这个 Codex thread
- /status 会显示当前 thread id
- /detach 会解绑该 thread;如果存在绑定前的旧对话,就恢复它

这是一种“绑定已有 thread”的流程,不是导入本地 session:thread 仍然在服务端,bridge 只是在当前 chat 上绑定一个已知 thread id。

注意:默认的 Codex app-server runtime 会通过本机 Codex runtime 验证 /resume thread 。如果这个 thread id 不在本机索引里,仍然会 fail closed,而不是猜测绑定成功。

Kimi ACP session 绑定

Kimi ACP 提供 session/list。直接发 /resume 可以列出最近 session,再用 /resume  选择;如果已经知道 session id,也可以显式绑定:

/resume session session_abc123

bridge 会用短生命周期 ACP 连接先执行真实 session/list 和 session/load,以 Kimi 返回的原始 cwd 为准。只有 session 可加载且原工作区仍是有效目录时才会改写聊天绑定,并把该 cwd 持久化给后续 turn;不存在、工作区不匹配或不可加载的 ID 会 fail closed。

绑定后:

- 后续消息在原项目工作区继续该 Kimi ACP session
- /status 显示当前 session id
- /detach 解绑该 session;如果存在绑定前的旧对话,就恢复它

Kimi 的实例/Lark 指令写入 bot 自有工作区的 .kimi-code/agents/agent.md 主代理 override,并保留 Kimi 内置 ${base_prompt} 和 ${plugin_sections}。本机 ~/.agents/skills、Kimi plugin skills 与原生 MCP 继续由 Kimi 发现;TaroCub 还把 ~/.codex/skills 暴露到 bot 自有工作区,并在 session/new/session/load 注入 Search MCP。对于外部恢复工作区,bridge 不修改对方项目文件,只对普通文本 turn 使用 prompt fallback;这是 ACP 没有直接 system-prompt 请求字段时的安全边界。

DeepSeek Harness session 绑定

安装独立的 Harness 原生 bundle:

dsh plugin --profile web add github:cloveric/deepseek-harness-web-search-plugin

TaroCub 的私有 Host 会链接用户已认证的共享 web profile,因此普通
Harness Web 与 Bot session 都能获得 Search MCP,并可选使用 /tarocub 指引。只有 capability
marker、bundle 入口及实际注册 MCP client 的 Harness patch 均有效时,插件才会
接管 Search MCP;任何一项缺失或损坏,Bot Host 都会使用私有 fallback。两条事件
WebSocket 必须在 15 秒内全部连通,半连接不会无限卡住启动。插件激活与飞书应用
创建、bridge 配置、服务启动是三件独立的事,必须分别验证。

DeepSeek Harness 提供原生 session 列表、历史与投影。直接发 /resume 可以列出最近 session,再用 /resume  选择;已知 ID 时也可以显式绑定:

/resume session

绑定前,bridge 会从 Harness 权威数据读取 cwd、执行真实路径解析,并确认目录存在。已经在当前进程见过的 session 若后来声称属于另一个工作区,会直接 fail closed,不能覆盖原绑定。后续消息、工具、审批、提问、Goal 和后台任务都会继续走该原生 session;/detach 恢复绑定前的会话(若存在)。

每个 bot 实例使用私有 dsh web Host 和私有可写设置,但复用用户已认证的 Harness credentials/profile。进程或 WebSocket 断开后,bridge 按事件 seq 和 projection asOfSeq 恢复;分页追不全、游标不前进或快照缺水位时会终止当前任务,而不是假装恢复成功。详见 docs/deepseek-harness-engine.md。

Antigravity conversation 绑定

Antigravity 的结构化 init / result 会返回权威 conversation ID,bridge 在成功运行后自动绑定到当前聊天,后续 turn 用:

agy --conversation

如果你已经知道 Antigravity conversation ID,也可以手动绑定:

/resume conversation fdfc8ab1-7936-4599-98b0-d8ba2593c250

如果不知道 ID,直接发 /resume。bridge 会扫描最近的 Antigravity CLI 日志并返回编号列表;再发 /resume 1 即可绑定。

绑定后:

- Telegram 里的后续消息会继续这个 Antigravity conversation
- /status 会显示当前 conversation ID
- /detach 会解绑该 conversation;如果存在绑定前的旧对话,就恢复它

这仍然使用 Antigravity 的原生会话模型。/model  和 /effort low|medium|high 会分别映射到原生启动参数;/model off、/effort off 恢复 CLI 默认。/resume 的编号发现仍扫描近期 CLI 日志,因为 agy 暂时没有结构化 conversation list 命令。

实例管理

通过 CLI 列出、重命名或删除实例。重命名和删除前必须先停止服务。

npm run dev -- telegram instance list                          # 显示所有实例
npm run dev -- telegram instance rename old-name new-name      # 重命名
npm run dev -- telegram instance delete staging --yes          # 删除(需要 --yes)

备份与恢复

一条命令备份或恢复实例的完整状态目录。零依赖的二进制归档格式,跨平台兼容,失败时自动回滚。

npm run dev -- telegram backup --instance work                 # 创建带时间戳的 .cctb.gz
npm run dev -- telegram backup --instance work --out ./bak.cctb.gz
npm run dev -- telegram restore ./bak.cctb.gz --instance work  # 恢复(实例不能已存在)
npm run dev -- telegram restore ./bak.cctb.gz --instance work --force  # 覆盖已有实例

Agent Bus

通过本地 HTTP IPC 实现 bot 间通信。现在 bus 不只支持 /ask,还支持并行查询、顺序链式、自动复核,以及 coordinator 主导的 crew workflow。它负责路由、对等验证、防循环和本地鉴权。

协议 v1 — 所有请求和响应都带 protocolVersion、capabilities、结构化 errorCode 和 retryable 标志,调用方能清楚区分临时失败(超时、peer 不可达)和终态失败(bus 未开启、peer 不在白名单)。老的无版本报文仍兼容,方便滚动升级。Peer 活性通过 GET /api/health 探活 + cc-telegram-bridge 指纹校验,端口被其他进程占用时不会被误判成活着。完整规范见 docs/bus-protocol.md。

开启

在每个实例的 config.json 里加 bus:

{ "engine": "codex", "bus": { "peers": "" } }

| 字段 | 说明 |
|---|---|
| peers | "" = 和所有开了 bus 的 bot 通信。["a", "b"] = 只和指定 bot 通信。不写或 false = 隔离。 |
| maxDepth | 最大委托跳数(默认 3)。防止 A→B→C→A 循环。 |
| port | 本地 HTTP 端口。0 = 自动分配(默认)。 |
| secret | Bearer token 认证密钥(可选)。 |
| parallel | /fan 并行查询的实例列表(如 ["sec-bot", "perf-bot"])。 |
| chain | /chain 顺序串联的实例列表(如 ["reviewer", "writer"])。 |
| verifier | /verify 自动验证的实例名(如 "reviewer")。 |
| crew | 固定 coordinator workflow 的配置块,用于 hub-and-spoke specialist 协作。 |

双方都必须允许对方 — 单方面配置会被拒绝。

使用

在任意 bot 的 Telegram 聊天中:

/ask reviewer 帮我审查这个函数的安全问题
/fan 分析这段代码的 bug、安全问题和性能
/chain 按步骤改进这个回答
/verify 写一个数组排序函数

- /ask   — 委托给指定 bot,结果内联显示
- /fan  — 同时查询当前 bot + 所有 parallel bot,汇总结果
- /chain  — 按配置顺序串联多个 bot,每一跳都显式拿到上一跳输出
- /verify  — 在当前 bot 执行,然后自动发给 verifier 检查

/chain 是轻量 pipeline;crew 是更重的中心协调模式。

每个进程最多同时处理 8 个 Agent Bus /api/talk 委托;达到上限时返回可重试的 server_busy,避免 /fan 或外部调用无限 fork 引擎进程。服务关停会等待在途 HTTP 请求,5 秒后强制关闭剩余连接。

Board:持久化 Kanban 任务板

/board 是一个借鉴 Hermes Kanban 的轻量任务板。它优先解决"状态不能只放在对话里"的问题:任务、依赖、负责人、阻塞原因和完成总结都会写入实例私有的 kanban.sqlite,不会只靠模型记忆。旧 board.json 会在首次访问时校验、备份并一次性迁移,随后替换为防止旧版本误写的哨兵。这样它可以先服务 Mini Bus / Agent Bus 协作,后续再接自动执行。

/board add 写 launch plan
/board plan 发布 onboarding flow
/board desc B1 写 launch messaging 和 rollout 任务
/board accept B1 README 已更新
/board priority B1 high
/board labels B1 docs launch
/board check B1 add 更新 README
/board list
/board show B1
/board assign B1 writer
/board dep B2 B1
/board limits global 3
/board worktree B1 /tmp/tarocub-board/B1 board/B1
/board heartbeat B1 还在处理
/board recover 15
/board review B1 on reviewer
/board ready B2
/board run B2
/board start B2
/board fail B2 测试失败
/board runs B2
/board block B2 等 API 文档
/board unblock B2
/board approve B1
/board reject B1 测试还不够
/board done B1 设计已确认

- /board add  — 创建持久任务,得到类似 B1 的稳定 ID
- /board plan  — 让当前引擎返回 JSON 任务图,并把任务和依赖一次性落到 Board
- /board desc   — 设置任务卡描述
- /board accept   — 追加完成标准
- /board priority   — 设置优先级
- /board labels   — 替换任务标签
- /board check  add  / /board check  done  — 管理 checklist
- /board list [todo|ready|running|blocked|done] — 列出任务
- /board show  — 查看单个任务,包括来源 chat/topic
- /board assign   — 给任务标记 Mini Bus peer、bot 实例或任意负责人
- /board dep   — 声明某任务依赖另一个任务完成
- /board limits [global|assignee|conversation]  — 设置 WIP 限制;默认是 global=3、assignee=1、conversation=1
- /board worktree  [path] [branch] / /board workspace   [path] — 给任务挂可选工作区 metadata;Mini Bus 执行时会优先使用任务自己的 workspace path
- /board heartbeat  [说明] — 更新 active run 的存活时间戳
- /board recover [分钟] — 把超过阈值没有 heartbeat/新活动的 running 任务标记失败并阻塞;默认 15 分钟
- /board review   [reviewer] — 要求 done 前先进入 review
- /board approve  / /board reject   — 处理 review 中的任务
- /board ready  — 依赖完成后把任务推进到 ready
- /board run  — 执行一个 ready 任务;优先路由到当前群里的 Mini Bus peer,否则把负责人当作 Agent Bus 实例名委托
- /board start  — 标记 running,并创建轻量 run 记录
- /board fail   — 把当前 active run 记为失败,并用原因阻塞任务
- /board runs  — 查看一个任务的 run 尝试历史
- /board block   / /board unblock  — 管理阻塞状态
- /board done  [总结] — 完成任务;依赖它的任务如果条件满足会自动推进到 ready

当前版本不是隐藏的自动调度器。它先把任务状态模型打稳:模型辅助拆任务、任务卡 metadata、WIP 限制、workspace metadata、run heartbeat、卡住任务恢复、依赖推进、review gate,以及 /board run  这种一次只跑一张卡的显式执行。Lark 里 /board show  会渲染交互任务卡,按钮动作仍走同一套 /board 命令路径和权限检查。

Mini Bus:topic/thread 到 topic/thread 的工作流

在已允许的 Telegram 群聊/forum 或 Lark 群 thread 里,/mini 可以让同一个 bot/app 把不同 topic/thread 当成轻量 peer。每个 peer 保留自己的 session,复用同一个实例配置和 agent.md,可以单点询问、并行查询,也可以按顺序串联。适合临时 planning/review 线程,不需要再新建 bot 实例。

适合用 Mini Bus 的场景:

- 一个 intake topic 做 coordinator,把 planner、writer、reviewer、research 等 topic 注册成 peer
- 用 /mini fan 让多个 topic 并行回答同一个问题,快速对比方案
- 用 /mini chain 让多个 topic 按顺序接力,后一跳拿到前一跳输出
- 用 /mini verify 做轻量复核
- 用 /mini crew research-report 跑固定 specialist workflow

前置条件:

- bot 已经加入并允许当前 Telegram 群或 forum
- 如果 BotFather 开了群隐私模式,建议把 bot 设成群管理员,这样它才能看到普通群消息;否则用命令、@bot 或回复 bot 触发
- 每个 Telegram topic 或 Lark thread 都要在对应 topic/thread 里执行 /mini here  注册

典型配置:

/mini here planner
/mini here writer
/mini status
/mini ask planner 把这个任务拆成步骤
/mini fan 对比这些方案
/mini chain 把这个粗略想法整理成最终回答
/mini verifier reviewer
/mini verify 写最终答案
/mini role researcher research
/mini role analyst analyst
/mini role writer writer
/mini role reviewer reviewer
/mini crew research-report 分析这个市场

配置好以后,在 coordinator topic 里调用:

/mini ask planner 把这个拆成 tickets
/mini fan 找出这个方案的风险
/mini chain 把这个方案整理成最终文案
/mini verify reviewer 这个可以 ship 吗?

- /mini here  — 把当前 topic 注册成当前群里的具名 peer
- /mini order  — 设置默认 /mini chain 顺序
- /mini parallel  — 设置默认 /mini fan 目标列表
- /mini verifier  — 设置 /mini verify 使用的 verifier
- /mini role   — 把 crew 角色绑定到某个 topic peer
- /mini crew research-report  — 用 topic peer 作为 specialist 跑完整 research-report workflow
- /mini ask   — 向某个具名 topic peer 发一次任务
- /mini fan  — 并行调用当前群里所有已注册 peer topic(不包含当前 topic)
- /mini chain  — 按注册顺序串联 peer topic,每一跳拿到上一跳输出
- /mini verify [名称]  — 先在当前 topic 执行,再让已配置或指定的 verifier topic 复核
- /mini rm  — 移除某个 topic peer

它的实际好处是:用很低成本换到上下文隔离。每个 topic/thread 有自己的 session 和 cron 范围,但仍然共用同一个 bot/app、workspace、engine 设置、预算统计、审批、timeline 和 audit。适合临时多 agent 工作,比如规划、写作、复核、研究,或者把 cron/job 放到旁路 topic/thread 里。

Mini Bus 只作用于当前 Telegram 群或 Lark 群,不会打开新的 bot token/app,也不会创建新的 workspace;如果多个 topic/thread 同时改同一批文件,仍然要按本地并发 agent 的方式处理工作区冲突。

Mini crew 是 Agent Bus crew 的 topic 版本:coordinator 在当前 topic 里启动,先拆分任务,再把 research 子问题并行发给 researcher topic,随后把 analysis、writing、review 和修订循环交给配置好的角色 topic。它复用同一套 crew-runs/.json、timeline、audit、budget、approval 和 topic session 隔离机制。

拓扑模式

主副模式(Hub & Spoke) — 一个指挥,多个执行:

┌──────────┐
│  main    │
│ peers: * │
└──┬────┬──┘
│    │
┌───────┘    └───────┐
▼                    ▼
┌──────────┐        ┌──────────┐
│ reviewer │        │ researcher│
│peers:    │        │peers:     │
│ ["main"] │        │ ["main"]  │
└──────────┘        └──────────┘

工作 bot 只和主 bot 通信。主 bot 分发任务并汇总结果。

串联模式(Pipeline) — 按顺序传递:

┌────────┐     ┌────────┐     ┌────────┐
│ intake │────▶│ coder  │────▶│ review │
│peers:  │     │peers:  │     │peers:  │
│["coder"]│    │["intake",│   │["coder"]│
└────────┘    │"review"]│    └────────┘
└────────┘

每个 bot 只知道相邻的 bot。任务从左到右流动。

并行模式(Parallel) — 扇出到多个专家:

/fan "分析这段代码"
│
┌──────────────┼──────────────┐
▼              ▼              ▼
┌──────────┐  ┌──────────┐  ┌──────────┐
│ sec-bot  │  │ perf-bot │  │ style-bot│
└──────────┘  └──────────┘  └──────────┘
│              │              │
└──────────────┼──────────────┘
▼
汇总结果

{ "bus": { "peers": "", "parallel": ["sec-bot", "perf-bot", "style-bot"] } }

验证模式(Verification) — 执行后自动审查:

/verify "写一个排序函数"
│
▼
┌──────────┐    结果     ┌──────────┐
│  coder   │ ───────────▶ │ reviewer │
└──────────┘              └──────────┘
│
验证意见
│
▼
两者一起显示给用户

{ "bus": { "peers": "", "verifier": "reviewer" } }

Crew Workflow(中心协调)

更重的多 agent 协作,推荐用一个专门的 coordinator bot,再配固定 specialist bot。它遵循 hub-and-spoke 模式:

- 用户直接和 coordinator bot 对话
- specialist 之间不直接通信
- 所有上下文都由 coordinator 显式传递
- coordinator 负责阶段推进、结果拼装、run state 和最终回复

当前内置 workflow 是 research-report:

coordinator -> researcher -> analyst -> writer -> reviewer

如果 reviewer 提出修改意见,coordinator 会把草稿回写给 writer,再跑一轮或多轮修订。

coordinator 实例上的配置示例:

{
"bus": {
"peers": ["researcher", "analyst", "writer", "reviewer"],
"crew": {
"enabled": true,
"workflow": "research-report",
"coordinator": "coordinator",
"roles": {
"researcher": "researcher",
"analyst": "analyst",
"writer": "writer",
"reviewer": "reviewer"
},
"maxResearchQuestions": 4,
"maxRevisionRounds": 2
}
}
}

当前规则:

- 只有 coordinator 实例应该配置 crew
- 5 个角色必须全部不同
- 发给 coordinator bot 的普通文本消息会自动走 crew workflow
- 每次 run 会落到 crew-runs/.json
- 每个阶段的进度也会写进 timeline.log.jsonl

全互联(Mesh) — 所有 bot 自由通信:

// 每个实例
{ "bus": { "peers": "" } }

所有 bot 可以和所有 bot 通信。最简配置,适合 3-5 个 bot 的小团队。

可选:Telegram 快速开始(兼容通道)

这不是新安装的推荐入口。 主平台是飞书/Lark;本节只服务仍需 Telegram 的既有用户。你只需要在手机上从 BotFather 拿 token 并发送配对码,其余步骤在电脑上完成。

环境要求

- Node.js >= 20.17
- OpenAI Codex CLI、Claude Code CLI、Kimi Code CLI、DeepSeek Harness 和/或 Antigravity CLI 已安装并认证
- 一个 Telegram 账号(手机)

第一步:创建 Telegram Bot(手机操作)

1. 打开 Telegram,搜索 @BotFather
2. 发送 /newbot
3. 按提示设置 bot 名称和用户名
4. BotFather 会回复一个 bot token,本文用  表示
5. 复制这个 token

第二步:安装和配置(电脑操作)

打开终端的 Codex、Claude Code、Kimi Code、DeepSeek Harness 或 Antigravity,告诉它:

"克隆 https://github.com/cloveric/tarocub 并用这个 token 配置 Telegram bot:"

或者手动操作:

git clone https://github.com/cloveric/tarocub.git
cd tarocub
npm install
npm run build

用你的 bot token 配置
npm run dev -- telegram configure

可选:切换引擎(默认是 Codex)
npm run dev -- telegram engine claude
npm run dev -- telegram engine kimi
npm run dev -- telegram engine deepseek
npm run dev -- telegram engine antigravity

推荐:开启 YOLO 模式(Telegram 无需回电脑确认)
npm run dev -- telegram yolo on

启动服务
npm run dev -- telegram service start

第三步:配对手机(手机操作)

1. 在 Telegram 中找到你的新 bot(搜索用户名)
2. 发送任意消息 — bot 会回复一个 6 位配对码,如 38J63T
3. 回到终端执行:

npm run dev -- telegram access pair 38J63T

搞定! 现在可以在 Telegram 上和 Codex、Claude、Kimi、DeepSeek 或 Antigravity 对话了。支持文字、语音消息和文件。

多 Bot

在 BotFather 再创建一个 bot,然后:
npm run dev -- telegram configure --instance work
npm run dev -- telegram engine claude --instance work
npm run dev -- telegram yolo on --instance work
npm run dev -- telegram service start --instance work
配对方式相同:发消息,拿码,执行 telegram access pair  --instance work

或者创建一个专用 Antigravity bot
npm run dev -- telegram configure --instance agy-bot
npm run dev -- telegram engine antigravity --instance agy-bot
npm run dev -- telegram yolo on --instance agy-bot
npm run dev -- telegram service start --instance agy-bot

架构

┌─────────────────────────────────────────────────────────────────────┐
│                             TaroCub                                │
├─────────────┬──────────────┬──────────────────┬─────────────────────┤
│  Telegram   │   运行时     │     AI 引擎      │      状态           │
│  层         │   层         │     层           │      层             │
├─────────────┼──────────────┼──────────────────┼─────────────────────┤
│ api.ts      │ bridge.ts    │ adapter.ts       │ access-store.ts     │
│ delivery.ts │ chat-queue.ts│ process-adapter  │ session-store.ts    │
│ update-     │ session-     │   .ts (Codex)    │ runtime-state.ts    │
│ normalizer  │ manager.ts   │ claude-adapter   │ instance-lock.ts    │
│   .ts       │              │   .ts (Claude)   │ json-store.ts       │
│ message-    │              │ antigravity-     │ audit-log.ts        │
│ renderer.ts │              │   adapter.ts     │ timeline-log.ts     │
│             │              │ agent.md + config│ usage-store.ts      │
│             │              │                  │ crew-run-store.ts   │
└─────────────┴──────────────┴──────────────────┴─────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│  Bus 层  (本地 HTTP、仅 loopback、协议 v1)                        │
├─────────────────────────────────────────────────────────────────────┤
│  bus-server.ts  · bus-client.ts  · bus-handler.ts                   │
│  bus-protocol.ts(信封、错误码、zod)  · bus-registry.ts            │
│  bus-config.ts  · delegation-commands.ts  · crew-workflow.ts        │
└─────────────────────────────────────────────────────────────────────┘

数据流:

Telegram 消息 → 标准化 → 访问检查 → 聊天队列(串行)
→ 加载 config.json(引擎) → 加载 agent.md → 会话查找
→ Codex app-server、Claude stream-json、Kimi ACP、DeepSeek Harness 或 Antigravity 持久 stream-json worker(新建或恢复)
→ typing action + timeline 事件 → 最终渲染 → 发送 → 审计

亮点

多引擎
每个实例可切换 Codex、Claude Code、Kimi Code、DeepSeek Harness 或 Antigravity。不同 bot 可混合使用五种引擎,并由同一套 CLI 管理。

独立人格
每个实例加载自己的 agent.md。Claude 实例还支持 CLAUDE.md 项目规则。

多 Bot 支持
一个仓库可以跑多个 Telegram bot。每个实例都有自己的 token、引擎、工作区、访问规则、会话绑定、审计日志和服务生命周期。

Agent Bus
本地 bot-to-bot 调用支持委托、并行 fan-out、链式执行、验证和 coordinator 主导的 crew workflow,同时不会把各 bot 的 Telegram 聊天上下文混在一起。

会话续接
/resume 可以扫描 Claude Code、Kimi ACP、DeepSeek Harness 或 Antigravity 会话;/resume thread <thread-id> 可绑定 Codex thread,/resume session <id> 可绑定 Kimi/DeepSeek session。手机上继续之前的工作,不丢上下文。

运行可见性
turn 运行时 Telegram 会显示 typing,timeline/audit 会记录 session、工具调用、文件 receipt、重试和完成状态,方便排查。

YOLO 模式
一条命令让 AI 自动审批一切 — 多引擎通用,按实例配置,热加载生效。

安全脱离
/detach 会在可能时回到 /resume 前的旧对话。bridge 指令不会写回你的本地 Claude、Codex、Kimi、DeepSeek 或 Antigravity session 文件。

按 Bot 隔离
每个实例有独立的人格、工作区、会话、访问规则、收件箱、审计日志,以及按工作区路径隔离的自动记忆。各引擎自己的配置目录(~/.claude/ / ~/.codex/ / Antigravity CLI 配置)与你主 CLI 共享,避免 OAuth refresh token 被多实例抢用——代价是该引擎自己的 settings、plugins、MCP 状态会落在真实 home 里,full-auto / bypass 模式下 bot 也能动到这些。

生产级可靠性
长轮询(~0ms 延迟)、指数退避、429 自动重试、409 冲突自动退出、SIGTERM/SIGINT 优雅关闭、容错批处理。

用量追踪
按实例统计 token 消耗和 USD 费用。telegram usage 随时查看花费。

Timeline 与 Dashboard
telegram timeline、telegram service status、telegram dashboard 可以查看当前 turn 状态、最近失败、文件 receipt 和 crew 快照。

预算控制
按实例设置费用上限。达到上限时自动拦截请求 — 中英双语提示。

文件投递
生成的图片、PDF、PPT 和报告通过注册过的 [tool:...] send tag 投递,cctb send 和 telegram send 作为 CLI 入口。

备份与恢复
一条命令备份或恢复实例。零依赖二进制格式,跨平台兼容,原子回滚。

实例管理
通过 CLI 列出、重命名、删除实例。运行中的实例有保护机制防止误操作。

语音输入
直接发语音消息 — 本地通过可插拔 ASR(如 Qwen3-ASR)转写。常驻 HTTP 服务做快速推理,离线时回退到 CLI。

完整审计日志
每个实例独立的 JSONL 追加日志 — 支持按类型、聊天、结果过滤。10MB 自动轮转。

Docker 就绪
内含多阶段 Dockerfile,一次构建,随处部署。

结构化 Bus 协议
本地 bot 之间用带版本的 v1 协议通信 — protocolVersion、capabilities、结构化 errorCode 和 retryable 标志,调用方能区分临时失败和终态失败。Peer 活性是真的 /api/health 探活,不是只看 PID。详见 docs/bus-protocol.md。

聊天内命令一览

完整命令面,按组分类。未标 Lark 的命令两个通道都可用。(带示例的同款清单:Slash Command Index。)

会话与任务

| 命令 | 作用 |
|---|---|
| /status | 当前引擎、会话绑定、运行状态 |
| /stop | 停止当前任务(排队任务在各自排队卡片上取消) |
| /reset | 重置会话绑定 |
| /resume [编号] · /resume thread  · /resume session  · /resume conversation  | 续接 Claude/Kimi/DeepSeek session / 显式绑定 Codex thread / Antigravity conversation |
| /detach | 解绑当前会话/thread/conversation |
| /goal  · /goal --budget  … · /goal status · /goal clear | 会话目标(Codex/DeepSeek 结构化原生推进;Claude/Antigravity 原生命令) |
| /btw  | 旁问,不动当前会话 |
| /q (别名 /queue) | Lark — 强制排队(跳过中途注入) |
| /steer [on\|off\|\|unlimited\|default\|status] | Lark — 任务中途引导的资格窗口(默认 30 秒,超窗自动排队;支持 5m 分钟写法,0=不限时) |
| /continue | 继续等待中的压缩包分析 |
| /bg · /bg kill  · /bg killall | Lark — 查看/停止引擎与后台进程 |

设置

| 命令 | 作用 |
|---|---|
| /config | Lark — 交互配置卡片(推荐) |
| /engine [claude\|codex\|kimi\|deepseek\|antigravity] | 查看/切换后端引擎 |
| /model [名称\|off] | 查看/设置模型。Claude 支持别名;Kimi/DeepSeek 接受各自原生协议提供的 provider/model ID |
| /effort [low\|medium\|high\|xhigh\|max\|ultra\|off] | 推理强度(视模型而定) |
| /fast [on\|off\|status] | Codex 快速模式 |
| /yolo [on\|off\|unsafe\|status] | Lark — 审批模式(Telegram 侧没有这个聊天命令,用 CLI telegram yolo …) |
| /stream [on\|off] | Lark — 回答卡片打字机流式 |
| /timeout [on\|off] | 开关当前引擎的硬上限/静默看门狗;/timeout status 显示该引擎的准确策略 |
| /usage | 本实例累计用量 |
| /account | Lark — 当前绑定的飞书应用 |

群与授权

| 命令 | 作用 |
|---|---|
| /group [status\|allow\|deny\|on\|off\|all\|at] | 群授权与回复模式(on/off=整个实例的群模式开关,all=不@也回,at=只@才回) |
| /invite group\|user @某人 · /remove … | Lark — 授予/撤销群或用户授权 |
| /newgroup  · /newgroup topic  · /newtopic  | Lark — 新建并自动授权项目群 / 话题群;默认仍需 @bot |

视频会议(实验性、默认关闭)

| 命令 | 作用 |
|---|---|
| /meeting status · /meeting join  [密码] · /meeting leave [会议号] | 查看、加入或离开会议 |
| /meeting ask  | 使用当前实时字幕上下文回答 |
| /meeting invite [会议号] all · /meeting invite [会议号] @成员... | 邀请推荐成员或指定成员 |
| /meeting end [会议号] confirm | 为所有人结束 Bot 主持的会议;必须显式输入 confirm |

定时与持久任务

| 命令 | 作用 |
|---|---|
| /cron …(list/add/rm/toggle/mode/run) | 定时提醒、周期任务、计划 agent 任务 |
| /board …(别名 /kanban)(add/plan/list/show/run/heartbeat/recover/worktree) | 模型记忆之外的持久 Kanban 任务板 |

多 Agent 协作

| 命令 | 作用 |
|---|---|
| /ask   | 委托一条提示给别的 bot |
| /fan · /chain · /verify | Agent Bus 并行 / 串联 / 验证 |
| /mini …(here/ask/fan/chain/verify/crew) | topic/thread 级 peer agent |

上下文工具与审批

| 命令 | 作用 |
|---|---|
| /context | Claude 或 DeepSeek 上下文占用 |
| /compact | 压缩 Claude、Kimi 或 DeepSeek session 上下文 |
| /ultrareview | 深度代码审查(仅 Claude) |
| /approve [session\|turn\|always] · /approve  | 审批按钮不可用时的文字兜底 |
| /deny · /deny  | 拒绝待审批的工具调用(没有 /deny session 这种写法) |
| /approve-session  | Lark — 对指定请求在本会话内持续放行 |
| /help(Lark 上别名 /start) | 当前聊天里的帮助 |
| /ws list\|save\|use\|remove | Lark — 工作区目录管理 |
| 强制本地转写 · 强制云端转写 | 消息关键词(非命令):必须和音频/视频同一条消息或同一批发送(例如当作附件说明),才能强制走本地或云端转写;事后再发是新的一轮,改不了已经开跑的转写 |

服务运维

| 命令 | 说明 |
|---|---|
| telegram service start | 获取锁、加载状态、启动长轮询 |
| telegram service stop | 优雅关闭(SIGTERM/SIGINT) |
| telegram service status | 运行状态、PID、引擎、bot 身份、timeline 摘要、最近 crew run |
| telegram service restart | 停止 + 启动,干净重置 |
| telegram service restart --all | 重启所有已配置实例;start、stop、status、doctor 也支持 --all |
| telegram service logs | 查看 stdout/stderr 日志 |
| telegram service doctor | 全子系统健康检查,包括 timeline、crew、共享引擎环境和残留 launchd 项 |
| telegram engine [codex\|claude\|kimi\|deepseek\|antigravity] | 按实例切换 AI 引擎 |

如果在一个活跃 bot turn 里运行 telegram service stop --all 或 telegram service restart --all,当前实例会被自动跳过,避免命令杀掉自己的执行链。需要重启当前实例时,从终端单独执行对应 --instance 命令。
| telegram yolo [on\|off\|unsafe] | 切换自动审批模式 |
| telegram usage | 查看 token 用量和费用估算 |
| telegram verbosity [0\|1\|2] | 保留的兼容配置;当前 process runtime 使用 typing action + timeline/audit 事件 |
| telegram budget [show\|set\|clear] | 按实例费用上限(达到上限时拦截请求) |
| telegram timeline | 查看结构化生命周期事件,支持过滤 |
| telegram instance [list\|rename\|delete] | 通过 CLI 管理实例 |
| telegram backup [--instance ] | 将实例状态归档为 .cctb.gz |
| telegram restore  | 从备份恢复实例(--force 覆盖已有) |
| telegram logs rotate | 手动触发日志轮转 |
| telegram dashboard | 生成并打开带 timeline 和最近 crew 快照的 HTML 仪表板 |
| telegram help | 显示所有可用命令 |

所有命令支持 --instance  指定目标 bot。

稳定 Beta 命令

- telegram service doctor --instance
- telegram session list --instance
- telegram session inspect --instance
- telegram session reset --instance
- telegram task list --instance
- telegram task inspect --instance
- telegram task clear --instance

Telegram 用户也可以使用:

- /status
- /engine [claude|codex|kimi|deepseek|antigravity] — 切换当前实例引擎(桥会自动清掉陈旧绑定)
- /effort [low|medium|high|xhigh|max|ultra|off] — 设置推理强度;实际可用级别由当前引擎/模型决定,Kimi 通过 ACP thinking 选项应用,Antigravity 支持 low|medium|high|off
- /model [名称|off] — 为 Codex/Claude/Kimi/DeepSeek/Antigravity 切换模型;Kimi/DeepSeek 使用各自原生协议校验 provider/model ID,Antigravity 接受 agy models 列出的原生 ID
- /fast [on|off|status] — 切换 Codex Fast Mode。bridge 实例里把它当实验选项使用;如果出现 Codex runtime 失败,先 /fast off,不要反复重试;下一条简单消息仍失败时,再重启该实例一次。
- /goal  — 设置引擎 goal。默认无 token 预算,除非显式提供 --budget;Codex 和 DeepSeek 会执行结构化 Goal(DeepSeek token budget 可跨 bridge 重启恢复),Claude Code 和 Antigravity 使用原生 goal 指令。当前 Kimi ACP 不支持该命令,bridge 会明确拒绝而不是伪装成普通 prompt。
- /btw  — 旁问(不影响当前会话)
- /ask   — 委托给指定 peer bot
- /fan  — 查询当前 bot 和并行 specialist bot
- /chain  — 跑配置好的顺序 bot 链
- /verify  — 本地执行后交给 verifier bot 自动复核
- /resume — Claude/Kimi/DeepSeek:扫描并按编号恢复 session(Kimi/DeepSeek 也支持 /resume session );Codex:使用 /resume thread ;Antigravity:使用 /resume conversation
- /detach — 断开恢复的 Claude/Kimi/DeepSeek session、当前 Codex thread 或当前 Antigravity conversation;如果存在旧对话,则恢复到 /resume 之前
- /stop — 立即停止当前运行中的任务
- /continue — 恢复最近一个等待中的压缩包摘要
- /compact(Claude/Kimi/DeepSeek — 原生压缩;Codex 回退为 reset)
- /context(Claude/DeepSeek)— 显示当前上下文填充度,用来决定何时 /compact
- /ultrareview(仅 Claude Opus 4.7+)— 专门的代码审查通道,通常配合 /resume 进入本地项目
- /reset
- /help

针对压缩包摘要,推荐直接回复该摘要或点击其中的 Continue Analysis 按钮继续;裸 /continue 只会恢复最近一个等待中的压缩包。

状态文件损坏时的恢复行为:

- 当 session.json、file-workflow.json、timeline.log.jsonl 或 crew-runs/ 不可读时,telegram service status 和 telegram service doctor 会降级为 unknown (...) 警告,而不是直接崩溃。
- telegram session inspect 和 telegram task inspect 会提示状态不可读并直接停止,不会假装记录不存在。
- telegram session reset、telegram task clear 以及 Telegram /reset 只会在文件损坏或结构非法时自愈;写入默认空状态前,会先把原始不可读文件隔离备份到同目录。
- Telegram /status 在底层 JSON 不可读时,会把 session/task 状态显示为 unknown (...)。

Shell 辅助脚本

Windows (PowerShell):

.\scripts\start-instance.ps1 [-Instance work]
.\scripts\status-instance.ps1 [-Instance work]
.\scripts\stop-instance.ps1 [-Instance work]

macOS / Linux (bash):

./scripts/start-instance.sh [work]
./scripts/status-instance.sh [work]
./scripts/stop-instance.sh [work]

旧版 autostart 遗留清理:

bash scripts/cleanup-legacy-launchd.sh --all

Claude 认证 smoke test:

npm run smoke:claude-auth

共享引擎环境规则:

- CLAUDE_CONFIG_DIR 和 CODEX_HOME 只有在你显式 export 时才会传给 bot。
- 如果你改了其中任意一个变量,要从同一个 shell 重启对应实例。
- telegram service doctor 现在会检查共享环境是否漂移,以及是否还残留旧的 launchd plist。

访问控制

按实例分两层:配对(初始握手)+ 白名单(持续授权)。

默认行为现在更保守:

- 一个实例默认只服务 一个 Telegram chat
- 第二个 chat 不会自动配对,也不会被加入 allowlist,除非你显式打开 multi-chat
- 这样可以减少 /resume、workspace override、本地文件和会话状态在不同 chat 之间串掉

npm run dev -- telegram access pair
npm run dev -- telegram access policy allowlist
npm run dev -- telegram access allow
npm run dev -- telegram access revoke
npm run dev -- telegram access multi on
npm run dev -- telegram access multi off
npm run dev -- telegram status [--instance work]

只有在你真的想让一个实例服务多个聊天时,才使用 telegram access multi on --instance 。新实例和旧实例在没有显式修改前,默认都保持 off。

Telegram 群聊和 Topic

群聊有第二层允许机制:Telegram user 必须已经授权,并且当前群也必须在群里显式允许:

/group status
/group allow
/group deny
/group on
/group off
/group all
/group at

在群里,普通消息默认会被忽略,除非消息 @ 了 bot 用户名,或者是在回复 bot 的某条消息。斜杠命令仍然可用。如果你希望当前这个已允许的群像一个常驻共享聊天一样工作,在群里发送 /group all;想回到更安全的默认行为,在同一个群里发送 /group at。要让 /group all 听见普通消息,需要把 bot 设为这个群的管理员,让 Telegram 真正把普通群消息投递给它;BotFather privacy mode 也可能影响投递,但群管理员是实际推荐路径。未授权用户在群里触发 bot 时默认静默,只写 audit,不向群里刷"未授权"提示。

Telegram forum topic 会作为独立对话:每个 topic 有自己的 engine session 和 cron 范围。同一个 topic 内,已授权用户共享这个 topic 的上下文;如果想开临时对话或避免上下文混在一起,用新的 topic。

审计日志

每个实例独立的 JSONL 追加日志,支持过滤查询:

npm run dev -- telegram audit [--instance work]
npm run dev -- telegram audit 50                                    # 最近 50 条
npm run dev -- telegram audit --type update.handle --outcome error  # 按类型/结果过滤
npm run dev -- telegram audit --chat 688567588                      # 按聊天过滤

audit.log.jsonl 记录桥做了什么动作 — update.handle、bus.reply、budget.blocked —每次对外动作一条,10MB 自动轮转。

Timeline

和审计日志并列,桥还会写一条生命周期流(timeline.log.jsonl),描述每个 turn 的形态 — turn.started、turn.completed、budget.threshold_reached、crew.stage.、bus 委派等。同样是 JSONL,维度不同:

npm run dev -- telegram timeline [--instance work]
npm run dev -- telegram timeline --type turn.completed --outcome error
npm run dev -- telegram timeline --chat 688567588 --limit 100

简单说:audit 回答"我们做了什么动作",timeline 回答"这个 turn 的走向是什么"。telegram service status 和 telegram dashboard 的摘要就是从 timeline 里取的。

状态目录

Windows: %USERPROFILE%\.cctb\\
macOS/Linux: ~/.cctb//

/
├── agent.md                # Bot 人格与指令
├── config.json             # 引擎、YOLO 模式、详细度、bus
├── usage.json              # Token 用量和费用追踪
├── workspace/              # 按 bot 独立的工作目录
│   └── CLAUDE.md           # Claude Code 项目指令(仅 Claude 引擎)
├── .env                    # Bot token
├── access.json             # 配对 + 白名单数据
├── session.json            # 聊天到线程的绑定
├── file-workflow.json      # 待处理的文件上传 follow-up
├── runtime-state.json      # 水位线、偏移量
├── instance.lock.json      # 进程锁
├── audit.log.jsonl         # 结构化审计流(轮转为 .1、.2...)
├── timeline.log.jsonl      # 生命周期事件(turn.started、budget.、crew.stage.*)
├── crew-runs/              # Crew 运行状态(仅 coordinator 实例)
│   └── .json
├── service.stdout.log      # 服务 stdout
├── service.stderr.log      # 服务 stderr
└── inbox/                  # 下载的附件

开发

npm run dev --      # 开发模式
npm test                     # 运行测试
npm run test:watch           # 监听模式
npm run build                # 构建生产版本
npm start                    # 启动生产版本

Docker

构建
docker build -t tarocub .

运行
docker run -v ~/.cctb:/root/.cctb tarocub telegram configure
docker run -v ~/.cctb:/root/.cctb tarocub telegram service start

挂载 ~/.cctb 以在容器重启后保留状态。

故障排查

Bot 不回复

1. 运行 telegram service doctor 诊断
2. 查看 telegram service logs 的错误
3. 确认引擎已安装:codex --version、claude --version 或 agy --help
4. 如果是 Claude 实例,运行 npm run smoke:claude-auth
5. 如果 service doctor 报 legacy-launchd,运行 bash scripts/cleanup-legacy-launchd.sh --all

Codex Fast Mode 导致引擎运行时失败

Fast Mode 是 Codex CLI 自己的功能,但在无人值守 bridge 实例里,可能暴露上游 Codex 诊断问题,例如插件 warm-cache 失败或 Cloudflare challenge。bridge 会在 Codex 已经产出完整回复、且 stderr 只是非阻塞插件诊断时保留回复;真实 Codex 错误仍会让 turn 失败。

1. 在出问题的 bot 里发送 /fast off。
2. 先发一条简单消息,例如 hi。
3. 如果仍失败,等当前 turn 空闲后重启这个 bot 实例一次。
4. 避免在 bot 正在生成回复时 force 重启它自己;这会杀掉活跃 Codex 子进程,表现为 codex exited with code null。

Terminal 里的 Claude 正常,但 bot 里不正常

1. 先检查 shell:claude auth status
2. 运行 npm run smoke:claude-auth
3. 再跑 telegram service doctor --instance
4. 如果你刚改过 CLAUDE_CONFIG_DIR,请从同一个 shell 里重启实例
5. 如果 doctor 报 legacy-launchd,执行 bash scripts/cleanup-legacy-launchd.sh --all

详细说明见:docs/runtime-env-troubleshooting.md

Bot 发送重复回复

409 Conflict 说明两个进程在轮询同一个 bot token。服务会自动检测并退出。运行 telegram service status 检查,然后 telegram service stop + telegram service start 干净重启。

切换到 Claude 引擎

1. telegram engine claude --instance
2. 重启服务:telegram service restart --instance
3. 可选:在 workspace 目录添加 CLAUDE.md

agent.md 修改不生效

不需要重启 — 每条消息都会重新加载。用 telegram instructions path --instance  确认路径。

可选:配一个本地守护 Agent

这个项目现在已经能稳定使用,但仍然处在持续演进阶段。如果你在一台机器上跑多个实例,额外配一个本地守护 agent会很实用。它是可选项,不是必需项。

它适合做这些事:
- 检查实例健康状态
- 先看 service status / service doctor / timeline,再决定要不要动手
- 只重启出问题的那个实例
- 先汇报结论和证据,而不是默默改配置

不要把它当成第二个产品 bot。它的职责应该只限于运维:监控、诊断、重启、汇报。

示例 Brief

你可以把下面这段去敏感化的 brief 给本地守护 agent:

你是这台机器上 TaroCub 的本地运维守护代理。

你的工作是保持 bot 实例健康,并让问题容易诊断。

核心职责:
1. 检查实例健康状态
2. 在采取动作前先诊断
3. 只在必要时重启受影响的实例
4. 清楚汇报结论、证据和动作

默认规则:
- 默认假设一个实例只服务一个 chat,除非该实例明确开启了 multi-chat。
- 不要擅自修改 engine、model、yolo/approval mode、pairing、access 或 multi-chat,除非用户明确要求。
- 不要擅自清 task,除非用户明确要求,或任务已确认是残留且用户之前已授权清理。
- 不要擅自修改项目代码或 README,除非用户明确要求。
- 优先做最小恢复动作;除非真的必要,不要一上来重启全部实例。

默认诊断顺序:
1. 看 service status
2. 看 service doctor
3. 看最近 timeline / audit
4. 必要时再看 stdout / stderr
5. 先判断问题属于:
- 进程没跑
- engine/runtime 失败
- Telegram 投递失败
- 残留 task / workflow
- 认证或配置问题
6. 然后再决定是否需要重启

优先使用的命令:
- node dist/src/index.js telegram service status --instance
- node dist/src/index.js telegram service doctor --instance
- node dist/src/index.js telegram timeline --instance
- bash scripts/start-instance.sh
- bash scripts/stop-instance.sh

回复格式:
- 先给结论
- 再给证据
- 最后说明已执行或建议执行的动作

如果你已经在本机使用像 Hermes 这样的 agent,它就很适合承担这个角色。

许可证

MIT

你的 agent。你的引擎。你的规则。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群