tarocub
Curated pickMaintenance: Activecloveric/tarocub
Feishu/Lark-first local AI agent gateway and native DeepSeek Harness plugin for Codex, Claude Code, Kimi Code, DeepSeek Harness, and Antigravity; Telegram optional.
$ dsh plugin add tarocubInstall
dsh has no central install command — add this plugin’s entry (documented in its README below) to your profile or patch config, then restart.
How installs work15
stars
3
forks
TypeScript
Language
MIT
License
2026-04-08
Created
2026-09-21
Last push
README
English | 中文文档 | 📖 飞书图文版 (Feishu Doc) | Full Reference
TaroCub
A Feishu/Lark-first gateway for Codex, Claude Code, Kimi Code, DeepSeek Harness, and Antigravity running on your own machine.
TaroCub runs real CLI agents on your own machine, then gives them durable chat surfaces, files, sessions, tasks, cron, audit logs, and multi-agent workflows.
Resume local sessions anytime from your phone, whether you are at your desk, commuting, or walking the dog.
📖 Feishu Doc (飞书图文) | Quick Start | Surfaces | Core Highlights | Lark Setup | Commands | Docs
What This Is
TaroCub is a local bridge, not a hosted agent product. It runs the real Codex, Claude Code, Kimi Code, DeepSeek Harness, and Antigravity CLIs on your own computer, then gives them a durable messaging control surface in Feishu/Lark, with Telegram retained as an optional compatibility channel.
Feishu/Lark is the primary platform. The maintainer has not used Telegram as a day-to-day control surface for a long time. Telegram remains available for existing deployments, but new installations should start with Feishu/Lark.
This project was formerly named cc-telegram-bridge. The canonical repository is now cloveric/tarocub; GitHub redirects the old URL, and existing state directories plus the cctb shorthand remain supported for compatibility.
It is built for people who already use CLI agents heavily and want:
- Feishu/Lark-native operation with cards, Docs comments, Sheets, Drive, and group/thread workflows;
- optional phone-first Telegram operation for existing personal-bot deployments;
- durable state for sessions, cron jobs, file delivery, usage, timelines, audit logs, and multi-agent routing.
The intended setup flow is agent-assisted: clone the repo, open it in Codex, Claude Code, Kimi Code, DeepSeek Harness, or Antigravity, and ask the agent to configure the bridge for you. The CLI exists so your local agent can do the boring setup work instead of making you hand-edit every file.
The old long README is preserved as Full Reference. This landing page is intentionally short.
Quick Start
Recommended: ask your local agent to configure it
Open this repository in Codex, Claude Code, Kimi Code, DeepSeek Harness, or Antigravity and say:
Read the README and configure TaroCub for me.
Run the Lark wizard, check permissions, install/bind lark-cli, and tell me what I need to scan or approve.
That is the preferred path. Manual commands are still below for operators who want to see each step. If you explicitly need the legacy-compatible Telegram channel, ask the agent to configure it with a BotFather token instead.
Feishu / Lark (recommended)
git clone https://github.com/cloveric/tarocub.git
cd tarocub
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 keeps QR registration alive in tmux, prints one durable registration link, writes progress to ~/.cctb/<lark-instance>/lark-setup.log, and starts the Lark service when setup completes. Use --no-start-service only when you explicitly want to prepare the app without listening yet.
If lark doctor reports missing app scopes, open the permission page URL it prints and grant the JSON it prints. PersonalAgent apps activate the grant immediately after confirmation; enterprise custom apps may still require a version publish. Then run:
node dist/src/index.js lark provision
node dist/src/index.js lark doctor
node dist/src/index.js lark slash sync
DeepSeek Harness web search plugin (native bundle)
Install the standalone native plugin into the web profile used by ordinary
Harness and by TaroCub's private Harness hosts:
dsh plugin --profile web add github:cloveric/deepseek-harness-web-search-plugin
The plugin adds source-traceable Brave/Tavily live search and URL extraction.
TaroCub integration and /tarocub guidance are optional. Installing it does
not create a Feishu/Lark app or start the bridge. The canonical TaroCub
subdirectory source remains compatible. Check, update, or remove it with:
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 still recognizes installations made under the former
tarocub-deepseek-harness-plugin package name so they can be migrated without
breaking managed bots.
Telegram (optional compatibility channel)
Create a Telegram bot with @BotFather, then run:
npm run dev -- telegram configure <telegram-bot-token>
npm run dev -- telegram yolo unsafe
npm run dev -- telegram service start
telegram yolo unsafe maps to approvalMode: "bypass": Codex uses its bypass sandbox mode, Claude Code/Antigravity use their unsafe skip-permissions modes, Kimi selects ACP auto, and DeepSeek selects Harness danger-full-access. Treat it as equivalent to bypassing normal approval prompts and local sandbox controls.
Send any message to the bot. It will reply with a pairing code:
npm run dev -- telegram access pair <pairing-code>
Surfaces
| Surface | Best for | Status |
|---|---|---|
| Feishu/Lark | Team chat, interactive cards, Docs comments, Sheets/Docs/Drive workflows, group/thread workflows | Recommended — the primary, actively-developed channel |
| Telegram | Mobile control, voice input, file delivery, multi-bot operations, cron, Agent Bus | Fully supported; longest-tested, but no longer the day-to-day focus |
| Local CLI | Operations, setup, debugging, status, backups, direct sends | First-class operator interface |
Core Highlights
| Highlight | Why it matters |
|---|---|
| Real CLI engines, not a fake chat backend | Codex, Claude Code, Kimi Code, DeepSeek Harness, and Antigravity run as their native local CLIs, so your real auth, local files, project instructions, MCP/plugins, and engine behavior stay intact. |
| DeepSeek Harness web search plugin | Install github:cloveric/deepseek-harness-web-search-plugin; its self-contained runtime adds Brave/Tavily live search and URL extraction, while TaroCub integration remains optional. |
| DeepSeek Search MCP | Plain Harness gets Search MCP from the plugin. Managed DeepSeek bots use that registration when valid and otherwise retain TaroCub's private fallback, so exactly one mcp-cctb-search client is active while native Harness search remains available. |
| Engine-neutral Lark intake | Long-media Tingwu routing and group/topic session boundaries are resolved before dispatch, so DeepSeek follows the same 15-minute ASR threshold and chat/thread isolation rules as Codex, Claude, and Kimi. |
| Session Resume | Continue existing work instead of starting over: Claude local sessions, Codex threads, Kimi ACP sessions, DeepSeek Harness sessions, and Antigravity conversations can be attached from chat and detached later. Bindings and resumed workspace roots are scoped to the private chat, group, or topic that created them, so another conversation cannot silently switch projects. |
| Mid-turn steering | While a Codex or DeepSeek turn is running on Lark, a plain-text follow-up sent within the steer eligibility window (default 30s, /steer to tune/disable/unlimit) is injected straight into it so the engine course-corrects without a second turn — acked with an OK reaction. Past the window (or with /q <message>) it queues as its own turn. Files, quoted replies, and queued backlogs keep normal FIFO order automatically. |
| Feishu/Lark as a native work surface | Lark adds what Telegram cannot: Card 2.0 choices, approval cards, Docs comment @mentions, Sheets/Docs/Drive workflows through lark-cli, /newgroup, and thread-aware group work. |
| Optional Telegram control plane | Existing deployments can still send files and screenshots, record voice messages, approve work, stop turns, inspect status, and operate multiple personal bots. |
| Engine-native progress and diagnostics | Codex consumes authoritative turn/completed summaries before any read fallback. Claude forwards child-agent text into the matching live tool panel without contaminating the parent answer. Kimi preserves ACP task/review lifecycles, DeepSeek replays ordered Harness history/projections, and Antigravity maps native structured session/text/tool/result events without posting protocol or thinking output as an answer. |
| ASR for voice/audio/video | Telegram and Lark voice/audio/video resources, plus recordings forwarded as ordinary files/documents, are downloaded and transcribed automatically before any Claude/Codex/Kimi/DeepSeek/Antigravity adapter runs. Media documents are recognized from their declared name or downloaded path, so Telegram files without file_name still work. Short audio uses local Qwen ASR, and (when TINGWU_ASR_DIR is configured) audio/video ≥ 15 minutes uses Aliyun Tingwu cloud transcription, with chunked local fallback on cloud failure. If bridge transcription is unavailable, the original media file remains attached with an explicit fallback note instead of being silently treated as already transcribed. /stop cancels probing/chunking, CLI or cloud processes, aborts the local HTTP wait, and never starts a fallback after cancellation. Send 强制本地转写 / 强制云端转写 with the audio (same message or burst) to force a route. See Long-audio cloud ASR for configuration. |
| File and artifact delivery | Agents can return generated images, PDFs, reports, decks, source bundles, and other files through structured send.file, send.image, send.batch, audio, and video tags. Structured/legacy aliases are deduplicated by real file identity; image batches split only on an explicit size rejection, while ambiguous acknowledgements stop without an immediate duplicate retry. |
| Scheduled work and reminders | /cron and cron.add persist one-shot reminders, recurring jobs, and agent-run scheduled tasks outside model memory, with chat/thread routing preserved. |
| Agent Bus | Multiple bot instances can call each other as local workers for delegation, fan-out, chain, verifier, and coordinator-led crew workflows. |
| Mini Bus | Telegram topics or Lark threads can become lightweight named peers, so one group can run planner/writer/reviewer-style workflows without separate bots. |
| Board | Durable Kanban state for tasks, model-assisted planning, dependencies, WIP, review gates, workspaces, heartbeats, stale-run recovery, Lark task cards, and execution history. |
| Search MCP | Optional Brave/Tavily MCP gives source-traceable web_search, web_extract, provider status, fallback notices, and source logs. |
| Operational visibility | status, doctor, timeline, audit, dashboard, usage tracking, service locks, and backups make failures inspectable instead of mysterious. |
| Web config console | cctb ui opens a loopback-only, token-gated web console that lists every instance (engine, model, service liveness) and edits the safe config subset on disk with next-restart semantics. |
| VC meeting attendance (experimental) | On Feishu/Lark, the bot can join a video meeting, follow the live transcript, answer when addressed, invite participants, and explicitly end a hosted meeting (/meeting join/status/ask/leave/invite/end). Off by default; requires Feishu's bot-join beta allowlist. |
Feature Map
| Feature | Feishu/Lark | Telegram | Local CLI |
|---|---|---|---|
| Codex / Claude Code / Kimi Code / DeepSeek Harness / Antigravity engines | Yes | Yes | Yes |
| Session resume / detach | Yes | Yes | Yes |
| Voice, audio, and video ASR | Yes | Yes | Inspect/debug |
| File and image delivery | Yes | Yes | lark send / telegram send |
| Stop and approvals | Interactive cards | Inline buttons | Service controls |
Mid-turn steering + /q queue escape |
Yes (Codex and DeepSeek) | Planned | Native in the corresponding CLI |
| Plan Mode-style choices | Rich choice cards | Sequential buttons, including multi-select | Tool/debug path |
| Cron reminders and agent jobs | Yes | Yes | Manage/list/run |
| Board durable tasks | Yes | Yes | Inspect/export |
| Agent Bus fan/chain/verify | Yes | Yes | Configure peers |
| Mini Bus topic/thread workflows | Lark threads | Telegram topics | Inspect state |
| Docs comments and Sheets workflows | Yes, with lark-cli |
Not applicable | Provision/auth/doctor |
| VC meeting attendance (gated beta) | /meeting commands |
Not applicable | Config + preflight |
| Web config console | — | — | cctb ui (loopback + token) |
| Timeline, audit, dashboard, usage | Yes | Yes | Primary ops surface |
Kimi Code engine
Select Kimi in either chat channel with /engine kimi (or use
telegram engine kimi --instance <name> for a Telegram instance). The service
resolves KIMI_EXECUTABLE first and otherwise
falls back to ~/.kimi-code/bin/kimi; Kimi Code must already be authenticated
locally. TaroCub uses the persistent kimi acp protocol, not prompt-mode text
scraping.
Kimi supports streamed text/thought/tool events, /stop, tool approvals,
multi-question and multi-select Lark/Telegram forms, /compact,
model/effort/mode options, and /resume session scanning/selection. TaroCub loads instance and
channel guidance through a workspace .kimi-code/agents/agent.md main-agent
override that retains Kimi's ${base_prompt} and ${plugin_sections}. It also
exposes local Codex skills to bridge-owned Kimi workspaces and injects the
built-in Search MCP alongside Kimi's native MCP/plugins.
The current compatibility baseline is Kimi Code 2.0.1 with
@agentclientprotocol/sdk 1.4.0. The public kimi acp entry point and
packages/acp-server tree are unchanged from 2.0.0, while 2.0.1 does change
internal permission, Hook-runner, Wire/history, media-tool, session-index, and
workspace-watcher code. TaroCub's real adapter therefore re-verified the
affected behavior rather than inferring compatibility from the entry point:
new/list/load plus a resumed turn, an unanalyzable harmless Bash command under
ACP yolo with zero approval requests, exactly one Hook start and terminal
event for a background Bash task, Search MCP object output, a two-field
multi-select form, cancellation followed by worker reuse, and image reading by
both the main agent and a delegated subagent. Hook input event names and
payloads consumed by TaroCub are unchanged; the upstream runner only adds
telemetry and an internal errored result flag. No compatibility shim is
required. Kimi
0.43's standard ACP form elicitation was verified end to end with two
questions, including multi-select and distinct display labels/wire values.
Older permission-style single-choice requests remain supported as a
compatibility fallback. TaroCub
always supplies the complete configured
MCP list and fails closed if Kimi rejects session initialization; it does not
retry by silently removing stdio search. Native Kimi user/project MCP files and
plugins remain independent. Kimi 0.43 can defer MCP tool definitions, but the
built-in Search MCP deliberately remains immediately discoverable rather than
being deferred. Kimi 0.42 always enables its secondary-model pool,
but without a [secondary_model] section subagents inherit the caller's model,
so existing TaroCub instances do not need a new model setting.
Kimi full-auto maps to ACP yolo; delegated terminal working directories are
kept inside the real workspace, but this is not an OS sandbox. Explicit
bypass maps to ACP auto. Starting with Kimi 0.41.0, auto is true Never Ask
mode: dangerous and unanalyzable commands execute without interruption. New
Kimi configurations therefore default to bridge full-auto / ACP yolo; use
telegram yolo unsafe or /yolo unsafe only when fully unattended execution is
intentional. Pre-0.41 Kimi bypass values without the new explicit Never Ask
acknowledgement are also resolved as yolo; re-run the unsafe command to opt in
under the new semantics.
Kimi 0.41.0 also allows AskUserQuestion(background=true) to outlive the
foreground turn. TaroCub keeps those approval cards attached to the retained
background task instead of aborting them with the completed turn, routes a late
request through the hook-recorded question task even across a newer foreground
turn, and aborts it on TaskStop, terminal WaitFor, worker teardown, or bounded
expiry.
TaroCub implements the ACP terminal lifecycle used by Kimi for delegated
Bash/process work (create, bounded UTF-8 output, wait, kill, and release), and
cleans up unreleased terminals when a worker exits. KIMI_CODE_LEGACY_FLAG=1
remains a rollback escape hatch, not the recommended Bot configuration.
Kimi's plugin manager is not part of the ACP surface used by TaroCub. Optional
official capabilities such as Kimi Computer Use and Kimi WebBridge must be
installed or updated once in the local interactive Kimi TUI, then activated
for the Bot with a fresh TaroCub session (/reset). Plugins are user-wide and
may add browser/computer-control MCP servers, so TaroCub deliberately does not
auto-install them.
With Kimi Code 0.32 or newer, TaroCub also installs an inert local hook plugin
under KIMI_CODE_HOME and activates it only for bridge-owned ACP subprocesses.
TaskStarted, background-task Notification, SubagentStop, TurnStarted,
Stop, StopFailure, and Interrupt feed the existing run cards, worker
retention, and restart guard. Kimi 0.33 introduced a completed-process review
flow in a synthetic task-origin turn where it may inspect bad output and retry.
TaroCub
retains that autonomous ACP stream after the original user turn has ended,
keeps intermediate process failures in the audit timeline without sending
misleading failure cards, and delivers only Kimi's final reviewed conclusion.
If no review turn arrives, a bounded fallback delivers the real task output;
accepted relay events are drained before that fallback decides no review exists,
and lost reviews expire instead of blocking that session forever.
Tool-result metadata remains the start-event fallback; terminal task tombstones
reject late/duplicate start events, and detached Bash notices read the real
bounded output.log tail from that Kimi session instead of showing only a
generic completion title. Successful background output that explicitly ends
with saved / wrote / generated plus a supported workspace artifact path is
normalized into the shared file/image delivery layer; failed, missing, hidden,
unsupported, or workspace-escaping paths remain plain text. Agents are also
told to validate actual output rather than trust exit status, and to emit exact
delivery tags instead of treating a saved path as delivery. Accepted hooks are
drained before the ACP worker is destroyed, and timeline identity stays scoped
by conversation, session, and task across ordinary messages, card actions,
comments, and bus turns. The relay deliberately ignores SessionHeartbeat: it
proves only that the Kimi process is alive, not that a turn or task is making
progress. Existing Kimi credentials, sessions, skills, MCP servers, and
config.toml are not replaced.
While detached work is retained, TaroCub never assumes that a quiet task is
dead and never kills its ACP worker merely to apply model, effort, or instruction
changes. Same-workspace non-security changes are deferred while later turns keep
using the existing worker. Workspace and approval-mode changes fail closed until
the task finishes (or the operator explicitly uses /reset); after terminal or
six-hour safety expiry, the next turn applies the pending configuration normally.
The current Kimi ACP surface still does not expose structured per-turn token/cost
usage, mid-turn steering, a direct client-supplied system-prompt field, or a
/goal command; TaroCub reports those gaps instead of simulating support. See
Kimi Engine Notes for protocol evidence and the
Kimi Capability Matrix for Kimi's
cross-engine release contract.
Telegram renders structured AskUserQuestion requests in one editable inline
flow: multiple questions advance sequentially, while multi-select questions use
toggle buttons plus an explicit Submit action. Kimi 0.43 now reaches that richer
flow through ACP form elicitation; older Kimi permission callbacks still use the
single-choice fallback.
DeepSeek Harness engine
Select DeepSeek in either channel with /engine deepseek (or use
telegram engine deepseek --instance <name>). Install and authenticate dsh
first; TaroCub resolves DSH_EXECUTABLE and otherwise uses dsh from PATH.
The verified compatibility baseline is DeepSeek Harness 0.1.5-rc.1. This is
also the npm latest version at the 2026-09-15 verification point. TaroCub has
live-verified the authenticated mux, session-v2 projections, command attachment
schema migration, and a streamed model turn. The npm next prerelease remains
outside the supported baseline until it receives the same protocol probes.
Install the standalone native Harness bundle:
dsh plugin --profile web add github:cloveric/deepseek-harness-web-search-plugin
The shared web profile is linked into each private bot home, so the plugin is
available in both ordinary Harness Web and TaroCub-backed sessions. It provides
Search MCP directly, with optional /tarocub guidance. TaroCub validates the plugin marker, bundled
entrypoint, and the Harness patch that registers the MCP client; if any part is
absent or damaged, the private Host safely retains its built-in Search MCP
fallback instead of registering two clients. Plugin activation remains separate
from installing, configuring, or starting the Feishu/Lark bridge.
TaroCub owns a private loopback-only dsh web --no-open --host 127.0.0.1 --port 0 process per bot instance and uses Harness's official HTTP RPC plus
the authenticated remote.mux WebSocket. Credentials and profiles are linked
from the configured DSH_HOME, while mutable settings and bridge instructions
remain isolated in the instance state directory. The forwarded event stream
must become ready within 15 seconds, so a half-open or unauthenticated WebSocket
cannot block startup forever. A crashed host is restarted and active sessions
recover from ordered history/projection watermarks; incomplete or malformed
recovery fails closed rather than silently skipping events.
More in Chat & IM
awesome-gpt-image-2
by freestylefly
Prompt-as-Code engine and template library for GPT-Image2, with 470+ reverse-engineered cases, 20+ production templates and distilled agent skills.
voyager
by nagi-ovo
Browser extension that enhances Gemini, AI Studio, Claude and ChatGPT with a prompt manager that works across any web UI, DeepSeek Harness included.
dsh-im
by xmanrui
把 IM 机器人接入 DSH:统一管理飞书/微信/钉钉/企业微信/QQ/Telegram/Discord/WhatsApp 八个渠道,扫码或凭据接入、流式回复与设置页管理
wegent
by wecode-ai
Plan, build, and deliver with an open-source, self-hostable AI workspace for coding, collaboration, and automation.
