返回目錄

tarocub

編輯精選維護狀態: 活躍

cloveric/tarocub

飛書/Lark 優先的本地 AI Agent 閘道器,也是 Codex、Claude Code、Kimi Code、DeepSeek Harness、Antigravity 的原生 DSH 外掛(可選 Telegram)。

前往 GitHub
$ dsh plugin add tarocub

安裝

dsh 沒有統一的安裝指令 —— 把該外掛 README(見下方)中的設定行加入你的 profile / patch 設定,然後重啟即可。

查看安裝教學

15

星數

3

Fork

TypeScript

語言

MIT

授權條款

2026-04-08

建立於

2026-09-21

最近推送

README

English  |  中文文档  |  📖 飞书图文版 (Feishu Doc)  |  Full Reference

TaroCub: Feishu/Lark-first control for local AI agents

License Node.js >= 20.17 TypeScript Codex | Claude Code | Kimi Code | DeepSeek Harness | Antigravity Native DeepSeek Harness plugin Feishu/Lark | Telegram LINUX DO

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

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.

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.

前往 GitHub

DSH Plugins 是獨立的 DeepSeek Harness 外掛市集,與 DeepSeek 官方無關,也不代表官方背書。第三方外掛未經安全稽核,安裝前請審查原始碼。

每週取得最新的 DeepSeek Harness 外掛,絕不濫發。