Add toolTimeoutSec field to Agent and Session structs to allow configurable timeout duration. Reset pending tool timeout timer when partially completing tools. Increase default timeout from 45s to 180s. Add tests for timeout behavior and customization. generated by llmgit Co-Authored-By: Claude <noreply@anthropic.com>
cc-connect
English | 中文
Control your local AI agents from any chat app. Anywhere, anytime.
cc-connect bridges AI agents running on your machine to the messaging platforms you already use. Code review, research, automation, data analysis — anything an AI agent can do, now accessible from your phone, tablet, or any device with a chat app.
You (Phone / Laptop / Tablet)
│
┌───────────────┼───────────────┐
▼ ▼ ▼
Feishu Slack Telegram ...9 platforms
│ │ │
└───────────────┼───────────────┘
▼
┌────────────┐
│ cc-connect │ ← your dev machine
└────────────┘
┌─────┼─────┐
▼ ▼ ▼
Claude Gemini Codex ...7 agents
Code CLI OpenCode / iFlow
Why cc-connect?
Time to uninstall OpenClaw — cc-connect gives you access to the most powerful AI agents available, not just one.
- 7 AI Agents — Claude Code, Codex, Cursor Agent, Qoder CLI, Gemini CLI, OpenCode, iFlow CLI. Use whichever fits your workflow, or all of them at once.
- 9 Chat Platforms — Feishu, DingTalk, Slack, Telegram, Discord, WeChat Work, LINE, QQ, QQ Bot (Official). Most need zero public IP.
- Multi-Bot Relay — Bind multiple bots in a group chat and let them communicate with each other. Ask Claude, get insights from Gemini — all in one conversation.
- Full Control from Chat — Switch models (
/model), tune reasoning (/reasoning), change permission modes (/mode), manage sessions, all via slash commands. - Agent Memory — Read and write agent instruction files (
/memory) without touching the terminal. - Scheduled Tasks — Set up cron jobs in natural language. "Every day at 6am, summarize GitHub trending" just works.
- Voice & Images — Send voice messages or screenshots; cc-connect handles STT/TTS and multimodal forwarding.
- Multi-Project — One process, multiple projects, each with its own agent + platform combo.
Left:Lark | Telegram | Right:Wechat
Support Matrix
| Component | Type | Status |
|---|---|---|
| Agent | Claude Code | ✅ Supported |
| Agent | Codex (OpenAI) | ✅ Supported |
| Agent | Cursor Agent | ✅ Supported |
| Agent | Gemini CLI (Google) | ✅ Supported |
| Agent | Qoder CLI | ✅ Supported |
| Agent | OpenCode (Crush) | ✅ Supported |
| Agent | iFlow CLI | ✅ Supported |
| Agent | Goose (Block) | 🔜 Planned |
| Agent | Aider | 🔜 Planned |
| Agent | Kimi Code (Moonshot) | 🔭 Exploring |
| Agent | GLM Code / CodeGeeX (ZhipuAI) | 🔭 Exploring |
| Agent | MiniMax Code | 🔭 Exploring |
| Platform | Feishu (Lark) | ✅ WebSocket — no public IP needed |
| Platform | DingTalk | ✅ Stream — no public IP needed |
| Platform | Telegram | ✅ Long Polling — no public IP needed |
| Platform | Slack | ✅ Socket Mode — no public IP needed |
| Platform | Discord | ✅ Gateway — no public IP needed |
| Platform | LINE | ✅ Webhook — public URL required |
| Platform | WeChat Work (企业微信) | ✅ Webhook — public URL required |
| Platform | QQ (via NapCat/OneBot) | ✅ WebSocket, no public IP needed — Beta |
| Platform | QQ Bot (Official) | ✅ WebSocket — no public IP needed |
| Platform | 🔜 Planned (Business Cloud API) | |
| Platform | Microsoft Teams | 🔜 Planned (Bot Framework) |
| Platform | Google Chat | 🔜 Planned (Chat API) |
| Platform | Mattermost | 🔜 Planned (Webhook + Bot) |
| Platform | Matrix (Element) | 🔜 Planned (Client-Server API) |
| Feature | Voice Messages (STT) | ✅ Whisper API (OpenAI / Groq / Qwen) + ffmpeg |
| Feature | Voice Reply (TTS) | ✅ Qwen TTS / OpenAI TTS + ffmpeg |
| Feature | Image Messages | ✅ Multimodal (Claude Code) |
| Feature | API Provider Management | ✅ Runtime provider switching |
| Feature | CLI Send (cc-connect send) |
✅ Send messages to sessions via CLI |
| Feature | Multi-Bot Relay | ✅ Cross-platform bot communication & group chat binding |
Quick Start
Prerequisites
- Claude Code: Claude Code CLI installed and configured, OR
- Codex: Codex CLI installed (
npm install -g @openai/codex), OR - Cursor Agent: Cursor Agent CLI installed (
agent --versionto verify), OR - Gemini CLI: Gemini CLI installed (
npm install -g @google/gemini-cli), OR - Qoder CLI: Qoder CLI installed (
curl -fsSL https://qoder.com/install | bash), OR - OpenCode: OpenCode installed (
opencode --versionto verify), OR - iFlow CLI: iFlow CLI installed (
npm i -g @iflow-ai/iflow-clioriflow --version)
Install & Configure via AI Agent (Recommended)
Send this to Claude Code or any AI coding agent, and it will handle the entire installation and configuration for you:
Please refer to https://raw.githubusercontent.com/chenhg5/cc-connect/refs/heads/main/INSTALL.md to help me install and configure cc-connect
Manual Install
Via npm:
npm install -g cc-connect
Download binary from GitHub Releases:
# Linux amd64
curl -L -o cc-connect https://github.com/chenhg5/cc-connect/releases/latest/download/cc-connect-linux-amd64
chmod +x cc-connect
sudo mv cc-connect /usr/local/bin/
Build from source (requires Go 1.22+):
git clone https://github.com/chenhg5/cc-connect.git
cd cc-connect
make build
Configure
# Global config (recommended)
mkdir -p ~/.cc-connect
cp config.example.toml ~/.cc-connect/config.toml
vim ~/.cc-connect/config.toml
# Or local config (also supported)
cp config.example.toml config.toml
Run
./cc-connect # auto: ./config.toml → ~/.cc-connect/config.toml
./cc-connect -config /path/to/config.toml # explicit path
./cc-connect --version # show version info
Upgrade
# npm
npm install -g cc-connect
# Binary self-update
cc-connect update
cc-connect update --pre
Platform Setup Guides
Each platform requires creating a bot/app on the platform's developer console. We provide detailed step-by-step guides:
| Platform | Guide | Connection | Public IP? |
|---|---|---|---|
| Feishu (Lark) | docs/feishu.md | WebSocket | No |
| DingTalk | docs/dingtalk.md | Stream | No |
| Telegram | docs/telegram.md | Long Polling | No |
| Slack | docs/slack.md | Socket Mode | No |
| Discord | docs/discord.md | Gateway | No |
| LINE | INSTALL.md | Webhook | Yes |
| WeChat Work | docs/wecom.md | Webhook | Yes |
| QQ (NapCat) | docs/qq.md | WebSocket (OneBot v11) | No |
| QQ Bot (Official) | docs/qqbot.md | WebSocket (Official API) | No |
Quick config examples for each platform:
# Feishu
[[projects.platforms]]
type = "feishu"
[projects.platforms.options]
app_id = "cli_xxxx"
app_secret = "xxxx"
# enable_feishu_card = true
# DingTalk
[[projects.platforms]]
type = "dingtalk"
[projects.platforms.options]
client_id = "dingxxxx"
client_secret = "xxxx"
# Telegram
[[projects.platforms]]
type = "telegram"
[projects.platforms.options]
token = "123456:ABC-xxx"
# Slack
[[projects.platforms]]
type = "slack"
[projects.platforms.options]
bot_token = "xoxb-xxx"
app_token = "xapp-xxx"
# Discord
[[projects.platforms]]
type = "discord"
[projects.platforms.options]
token = "your-discord-bot-token"
# LINE (requires public URL)
[[projects.platforms]]
type = "line"
[projects.platforms.options]
channel_secret = "xxx"
channel_token = "xxx"
port = "8080"
# WeChat Work (requires public URL)
[[projects.platforms]]
type = "wecom"
[projects.platforms.options]
corp_id = "wwxxx"
corp_secret = "xxx"
agent_id = "1000002"
callback_token = "xxx"
callback_aes_key = "xxx"
port = "8081"
enable_markdown = false # true only if all users use WeChat Work app (not personal WeChat)
# QQ (via NapCat/OneBot v11, no public IP needed)
[[projects.platforms]]
type = "qq"
[projects.platforms.options]
ws_url = "ws://127.0.0.1:3001"
allow_from = "*" # QQ user IDs, e.g. "12345,67890" or "*" for all
# QQ Bot Official (no public IP needed, no third-party adapter)
[[projects.platforms]]
type = "qqbot"
[projects.platforms.options]
app_id = "your-app-id"
app_secret = "your-app-secret"
Permission Modes
All agents support permission modes switchable at runtime via /mode.
Claude Code modes (maps to --permission-mode):
| Mode | Config Value | Behavior |
|---|---|---|
| Default | default |
Every tool call requires user approval. |
| Accept Edits | acceptEdits (alias: edit) |
File edit tools auto-approved; other tools still ask. |
| Plan Mode | plan |
Claude only plans — no execution until you approve. |
| YOLO | bypassPermissions (alias: yolo) |
All tool calls auto-approved. For trusted/sandboxed environments. |
Codex modes (maps to --ask-for-approval):
| Mode | Config Value | Behavior |
|---|---|---|
| Suggest | suggest |
Only trusted commands (ls, cat...) run without approval. |
| Auto Edit | auto-edit |
Model decides when to ask; sandbox-protected. |
| Full Auto | full-auto |
Auto-approve with workspace sandbox. Recommended. |
| YOLO | yolo |
Bypass all approvals and sandbox. |
Cursor Agent modes (maps to --force / --mode):
| Mode | Config Value | Behavior |
|---|---|---|
| Default | default |
Trust workspace, ask before each tool use. |
| Force (YOLO) | force (alias: yolo) |
Auto-approve all tool calls. |
| Plan | plan |
Read-only analysis, no edits. |
| Ask | ask |
Q&A style, read-only. |
Gemini CLI modes (maps to -y / --approval-mode):
| Mode | Config Value | Behavior |
|---|---|---|
| Default | default |
Prompt for approval on each tool use. |
| Auto Edit | auto_edit (alias: edit) |
Auto-approve edit tools, ask for others. |
| YOLO | yolo |
Auto-approve all tool calls. |
| Plan | plan |
Read-only plan mode, no execution. |
Qoder CLI modes:
| Mode | Config Value | Behavior |
|---|---|---|
| Default | default |
Standard permissions; prompt for approval. |
| YOLO | yolo |
Skip all permission checks, auto-approve. |
OpenCode modes:
| Mode | Config Value | Behavior |
|---|---|---|
| Default | default |
Standard mode. |
| YOLO | yolo |
Auto-approve all tool calls. |
iFlow CLI modes:
| Mode | Config Value | Behavior |
|---|---|---|
| Default | default |
Manual approval mode. |
| Auto Edit | auto-edit |
Auto-edit mode. |
| Plan | plan |
Read-only planning mode. |
| YOLO | yolo |
Auto-approve all tool calls. |
# Claude Code
[projects.agent.options]
mode = "default"
# allowed_tools = ["Read", "Grep", "Glob"]
# Codex
[projects.agent.options]
mode = "full-auto"
# model = "o3"
# reasoning_effort = "high"
# Cursor Agent
[projects.agent.options]
mode = "default"
# Gemini CLI
[projects.agent.options]
mode = "default"
# Qoder CLI
[projects.agent.options]
mode = "default"
# OpenCode
[projects.agent.options]
mode = "default"
# iFlow CLI
[projects.agent.options]
mode = "default"
Switch mode at runtime from the chat:
/mode # show current mode and all available modes
/mode yolo # switch to YOLO mode
/mode default # switch back to default
For Codex, you can also switch reasoning effort at runtime:
/reasoning # show current reasoning effort and available levels
/reasoning high # switch to high reasoning effort
/reasoning 3 # quick-select by number
API Provider Management
Switch between different API providers (e.g. Anthropic direct, relay services, AWS Bedrock) at runtime — no restart needed. Provider credentials are injected as environment variables into the agent subprocess, so your local config stays untouched.
Configure Providers
In config.toml:
[projects.agent.options]
work_dir = "/path/to/project"
provider = "anthropic" # active provider name
[[projects.agent.providers]]
name = "anthropic"
api_key = "sk-ant-xxx"
[[projects.agent.providers]]
name = "relay"
api_key = "sk-xxx"
base_url = "https://api.relay-service.com"
model = "claude-sonnet-4-20250514"
# For special setups (Bedrock, Vertex, etc.), use the env map:
[[projects.agent.providers]]
name = "bedrock"
env = { CLAUDE_CODE_USE_BEDROCK = "1", AWS_PROFILE = "bedrock" }
Via CLI:
cc-connect provider add --project my-backend --name relay --api-key sk-xxx --base-url https://api.relay.com
cc-connect provider add --project my-backend --name bedrock --env CLAUDE_CODE_USE_BEDROCK=1,AWS_PROFILE=bedrock
cc-connect provider list --project my-backend
cc-connect provider remove --project my-backend --name relay
Import from cc-switch:
If you already use cc-switch to manage providers, import them with one command (requires sqlite3):
cc-connect provider import --project my-backend
cc-connect provider import --project my-backend --type claude # only Claude providers
cc-connect provider import --db-path ~/.cc-switch/cc-switch.db # explicit DB path
Manage Providers in Chat
/provider Show current active provider
/provider list List all configured providers
/provider add <name> <key> [url] [model] Add a provider
/provider add {"name":"relay","api_key":"sk-xxx","base_url":"https://..."}
/provider remove <name> Remove a provider
/provider switch <name> Switch to a provider
/provider <name> Shortcut for switch
Adding, removing, and switching providers all persist to config.toml automatically. Switching restarts the agent session with the new credentials.
Env var mapping by agent type:
| Agent | api_key → | base_url → |
|---|---|---|
| Claude Code | ANTHROPIC_API_KEY |
ANTHROPIC_BASE_URL |
| Codex | OPENAI_API_KEY |
OPENAI_BASE_URL |
| Gemini CLI | GEMINI_API_KEY |
— (use env map) |
| OpenCode | ANTHROPIC_API_KEY |
— (use env map) |
| iFlow CLI | IFLOW_API_KEY / IFLOW_apiKey |
IFLOW_BASE_URL / IFLOW_baseUrl |
The env map in provider config lets you set arbitrary environment variables for any setup (Bedrock, Vertex, Azure, custom proxies, etc.).
Claude Code Router Integration
Claude Code Router is a powerful tool that routes Claude Code requests to different model providers (OpenRouter, DeepSeek, Gemini, etc.) with custom transformations. cc-connect now supports seamless integration with Claude Code Router.
Why Use Claude Code Router?
- Multi-Provider Support: Route requests to OpenRouter, DeepSeek, Ollama, Gemini, Volcengine, SiliconFlow, and more
- Model Routing: Use different models for different tasks (background, thinking, long context, web search)
- Request/Response Transformation: Automatic adaptation for different provider APIs
- Dynamic Model Switching: Switch models on-the-fly without restarting
Setup
- Install Claude Code Router:
npm install -g @musistudio/claude-code-router
- Configure Router (create
~/.claude-code-router/config.json):
{
"APIKEY": "your-secret-key",
"Providers": [
{
"name": "openrouter",
"api_base_url": "https://openrouter.ai/api/v1/chat/completions",
"api_key": "sk-xxx",
"models": ["anthropic/claude-sonnet-4", "google/gemini-2.5-pro-preview"],
"transformer": { "use": ["openrouter"] }
},
{
"name": "deepseek",
"api_base_url": "https://api.deepseek.com/chat/completions",
"api_key": "sk-xxx",
"models": ["deepseek-chat", "deepseek-reasoner"],
"transformer": { "use": ["deepseek"] }
}
],
"Router": {
"default": "deepseek,deepseek-chat",
"think": "deepseek,deepseek-reasoner",
"longContext": "openrouter,google/gemini-2.5-pro-preview"
}
}
- Start Router:
ccr start
- Configure cc-connect (in
config.toml):
[projects.agent.options]
work_dir = "/path/to/project"
mode = "default"
# Router integration
router_url = "http://127.0.0.1:3456" # Router URL (default port)
router_api_key = "your-secret-key" # Optional: if router requires auth
How It Works
When router_url is configured, cc-connect automatically:
- Sets
ANTHROPIC_BASE_URLto the router URL - Sets
NO_PROXY=127.0.0.1to prevent proxy interference - Disables telemetry and cost warnings for cleaner integration
All Claude Code requests are then routed through the router, which handles model selection and provider communication.
Usage
Once configured, use cc-connect as usual. The router transparently handles model routing:
You: Help me refactor this code
Router → DeepSeek (default model)
You: Think through this architecture decision
Router → DeepSeek Reasoner (thinking model)
You: Analyze this large codebase
Router → Gemini Pro (long context model)
Important Notes
- Provider settings are ignored: When using router, the
[[projects.agent.providers]]settings are bypassed as the router manages model selection - Router must be running: Ensure
ccr startis executed before starting cc-connect - Configuration changes: After modifying router config, restart with
ccr restart
For more details, see the Claude Code Router documentation.
Voice Messages (Speech-to-Text)
Send voice messages directly — cc-connect transcribes them to text using a configurable STT provider, then forwards the text to the agent.
Supported platforms: Feishu, WeChat Work, Telegram, LINE, Discord, Slack
Prerequisites:
- An API key for OpenAI or Groq (for Whisper STT)
ffmpeginstalled (for audio format conversion — most platforms send AMR/OGG which Whisper doesn't accept directly)
Configure
[speech]
enabled = true
provider = "openai" # "openai" or "groq"
language = "" # e.g. "zh", "en"; empty = auto-detect
[speech.openai]
api_key = "sk-xxx" # your OpenAI API key
# base_url = "" # custom endpoint (optional, for OpenAI-compatible APIs)
# model = "whisper-1" # default model
# -- OR use Groq (faster and cheaper) --
# [speech.groq]
# api_key = "gsk_xxx"
# model = "whisper-large-v3-turbo"
How It Works
- User sends a voice message on any supported platform
- cc-connect downloads the audio from the platform
- If the format needs conversion (AMR, OGG → MP3),
ffmpeghandles it - Audio is sent to the Whisper API for transcription
- Transcribed text is shown to the user and forwarded to the agent
Install ffmpeg
# Ubuntu / Debian
sudo apt install ffmpeg
# macOS
brew install ffmpeg
# Alpine
apk add ffmpeg
Voice Reply (Text-to-Speech)
cc-connect can synthesize AI text replies into voice messages and send them back to users via supported platforms.
Supported platforms: Feishu (Lark)
Prerequisites:
- An API key for Qwen (DashScope) or OpenAI TTS
ffmpeginstalled (for audio format conversion — Feishu requires Opus format)
Configure
[tts]
enabled = true
provider = "qwen" # "qwen" or "openai"
voice = "Cherry" # default voice name
tts_mode = "voice_only" # "voice_only" (default) | "always"
max_text_len = 0 # max rune count before skipping TTS; 0 = no limit
[tts.qwen]
api_key = "sk-xxx" # Alibaba DashScope API key
# base_url = "" # leave empty for default endpoint
# model = "qwen3-tts-flash"
# -- OR use OpenAI TTS --
# [tts.openai]
# api_key = "sk-xxx"
# model = "tts-1"
TTS Modes
| Mode | Behavior |
|---|---|
voice_only |
Only reply with voice when the user sends a voice message |
always |
Always send a voice reply, regardless of input type |
Switch mode at runtime: /tts always or /tts voice_only
How It Works
- Agent produces a text reply
- cc-connect calls the TTS API to synthesize audio
- For Feishu: WAV audio is converted to Opus via
ffmpeg - Voice message is sent back to the user alongside the text reply
Scheduled Tasks (Cron)
Create scheduled tasks that run automatically — like daily code reviews, periodic trend summaries, or weekly reports. When a cron job fires, cc-connect sends the prompt to the agent in your chat session and delivers the result back to you.
Manage via Slash Commands
/cron List all cron jobs
/cron add <min> <hour> <day> <mon> <wk> <prompt> Create a cron job
/cron del <id> Delete a cron job
/cron enable <id> Enable a job
/cron disable <id> Disable a job
Example:
/cron add 0 6 * * * Collect GitHub trending repos and send me a summary
Manage via CLI
cc-connect cron add --cron "0 6 * * *" --prompt "Summarize GitHub trending" --desc "Daily Trending"
cc-connect cron list
cc-connect cron del <job-id>
Natural Language Scheduling (via Agent)
Claude Code supports this out of the box — just tell it in natural language:
"每天早上6点帮我总结 GitHub trending" "Every Monday at 9am, generate a weekly status report"
Claude Code will automatically translate your request into a cc-connect cron add command via --append-system-prompt.
For other agents (Codex, Cursor, Gemini CLI, Qoder CLI, OpenCode, iFlow CLI), you need to add instructions to the agent's project-level instruction file so it knows how to create cron jobs. Add the following content to the corresponding file in your project root:
| Agent | Instruction File |
|---|---|
| Codex | AGENTS.md |
| Cursor | .cursorrules |
| Qoder CLI | AGENTS.md (project), ~/.qoder/AGENTS.md (global) |
| Gemini CLI | GEMINI.md |
| OpenCode | OPENCODE.md |
| iFlow CLI | IFLOW.md |
Content to add:
# cc-connect Integration
This project is managed via cc-connect, a bridge to messaging platforms.
## Scheduled tasks (cron)
When the user asks you to do something on a schedule (e.g. "every day at 6am",
"every Monday morning"), use the Bash/shell tool to run:
cc-connect cron add --cron "<min> <hour> <day> <month> <weekday>" --prompt "<task description>" --desc "<short label>"
Environment variables CC_PROJECT and CC_SESSION_KEY are already set — do NOT
specify --project or --session-key.
Examples:
cc-connect cron add --cron "0 6 * * *" --prompt "Collect GitHub trending repos and send a summary" --desc "Daily GitHub Trending"
cc-connect cron add --cron "0 9 * * 1" --prompt "Generate a weekly project status report" --desc "Weekly Report"
To list or delete cron jobs:
cc-connect cron list
cc-connect cron del <job-id>
## Send message to current chat
To proactively send a message back to the user's chat session (use --stdin heredoc for long/multi-line messages):
cc-connect send --stdin <<'CCEOF'
your message here (any special characters are safe)
CCEOF
For short single-line messages:
cc-connect send -m "short message"
Daemon Mode
Run cc-connect as a background service managed by the OS init system (Linux systemd user service, macOS launchd LaunchAgent).
cc-connect daemon install --config ~/.cc-connect/config.toml # install service
cc-connect daemon install --work-dir ~/.cc-connect # same, using config dir
cc-connect daemon start
cc-connect daemon stop
cc-connect daemon restart
cc-connect daemon status
cc-connect daemon logs [-f] [-n N] [--log-file PATH]
cc-connect daemon uninstall
Install flags: --config PATH, --log-file PATH, --log-max-size N (MB), --work-dir DIR, --force. --config points to a config file; --work-dir points to the directory containing config.toml. Logs auto-rotate at the size limit and keep one backup.
Session Management
Each user gets an independent session with full conversation context. Manage sessions via slash commands:
/new [name] Start a new session
/list List all agent sessions for this project
/switch <id> Switch to a different session
/current Show current session info
/history [n] Show last n messages (default 10)
/provider [...] Manage API providers (list/add/remove/switch)
/allow <tool> Pre-allow a tool (takes effect on next session)
/reasoning [level] View or switch reasoning effort (Codex)
/mode [name] View or switch permission mode
/quiet Toggle thinking/tool progress messages
/stop Stop current execution
/help Show available commands
During a session, the agent may request tool permissions. Reply allow / deny / allow all (auto-approve all remaining requests this session).
Multi-Bot Relay
cc-connect supports cross-platform bot communication, enabling multiple AI agents to collaborate in a single group chat.
Claude Code & Cursor Agent chatting in Discord — Multi-Agent Collaboration
Group Chat Binding
Bind multiple bots in a group chat so users can interact with all of them in one place:
/bind Show current bindings
/bind claudecode Add claudecode project to this chat
/bind gemini Add gemini project to this chat
/bind -claudecode Remove claudecode from this chat
After binding, all bound bots receive messages in the group. Users can @mention specific bots or let all of them respond.
Bot-to-Bot Communication
Use CLI or internal API to send messages between bots:
# CLI: Send message to another project and get response
cc-connect relay send --to gemini "What do you think about this architecture?"
# In chat, ask one bot to consult another
# The bot can use cc-connect relay to communicate with other agents
This enables powerful workflows like:
- Ask Claude Code to review code, then ask Gemini for a second opinion
- Let one agent handle frontend questions while another handles backend
- Cross-validate solutions from multiple AI models
Configuration
Each [[projects]] entry binds one code directory to its own agent and platforms. A single cc-connect process can manage multiple projects simultaneously.
# Project 1
[[projects]]
name = "my-backend"
[projects.agent]
type = "claudecode"
[projects.agent.options]
work_dir = "/path/to/backend"
mode = "default"
[[projects.platforms]]
type = "feishu"
[projects.platforms.options]
app_id = "cli_xxxx"
app_secret = "xxxx"
# Project 2 — Codex agent with Telegram
[[projects]]
name = "my-frontend"
[projects.agent]
type = "codex"
[projects.agent.options]
work_dir = "/path/to/frontend"
mode = "full-auto"
[[projects.platforms]]
type = "telegram"
[projects.platforms.options]
token = "xxxx"
See config.example.toml for a fully commented configuration template.
Extending
Adding a New Platform
Implement the core.Platform interface and register it:
package myplatform
import "github.com/chenhg5/cc-connect/core"
func init() {
core.RegisterPlatform("myplatform", New)
}
func New(opts map[string]any) (core.Platform, error) {
return &MyPlatform{}, nil
}
// Implement Name(), Start(), Reply(), Send(), Stop()
Then add a blank import in cmd/cc-connect/main.go:
_ "github.com/chenhg5/cc-connect/platform/myplatform"
Adding a New Agent
Same pattern — implement core.Agent and register via core.RegisterAgent.
Project Structure
cc-connect/
├── cmd/cc-connect/ # Entrypoint
│ └── main.go
├── core/ # Core abstractions
│ ├── interfaces.go # Platform + Agent interfaces
│ ├── registry.go # Plugin-style factory registry
│ ├── message.go # Unified message / event types
│ ├── session.go # Multi-session management
│ ├── i18n.go # Internationalization (en/zh)
│ ├── speech.go # Speech-to-text (Whisper API + ffmpeg)
│ └── engine.go # Routing engine + slash commands
├── platform/ # Platform adapters
│ ├── feishu/ # Feishu / Lark (WebSocket)
│ ├── dingtalk/ # DingTalk (Stream)
│ ├── telegram/ # Telegram (Long Polling)
│ ├── slack/ # Slack (Socket Mode)
│ ├── discord/ # Discord (Gateway WebSocket)
│ ├── line/ # LINE (HTTP Webhook)
│ ├── wecom/ # WeChat Work (HTTP Webhook)
│ ├── qq/ # QQ (NapCat / OneBot v11 WebSocket)
│ └── qqbot/ # QQ Bot (Official API v2 WebSocket)
├── agent/ # Agent adapters
│ ├── claudecode/ # Claude Code CLI (interactive sessions)
│ ├── codex/ # OpenAI Codex CLI (exec --json)
│ ├── cursor/ # Cursor Agent CLI (--print stream-json)
│ ├── qoder/ # Qoder CLI (-p -f stream-json)
│ ├── gemini/ # Gemini CLI (-p --output-format stream-json)
│ ├── opencode/ # OpenCode (run --format json)
│ └── iflow/ # iFlow CLI (-p, -r, -o)
├── docs/ # Platform setup guides
├── config.example.toml # Config template
├── INSTALL.md # AI-agent-friendly install guide
├── Makefile
└── README.md
Community
Contributors
Thanks to all the people who contributed to this project:
Star History
License
MIT

