kimi.com/code serves mainland China (WeChat / +86 sign-in, Alipay and WeChat Pay), so international readers cannot sign up or pay there.
Label both Kimi Code plan sites in the sponsor CTA of the English and Chinese READMEs, mirroring the domestic|global split already used for the API links, keeping the same aff value and the slash-free link form.
New users installing cc-connect were hitting a fail-fast path
("claudecode: claude CLI not found in PATH", Web UI on :9820 never
comes up) because the README jumped straight to installing
cc-connect itself with no guidance on installing the agent CLI first
and authenticating it. Issue #1464 (NirvanaCh7, fresh macOS Homebrew
install) hit this; historical #1122 and #1139 were related but
closed COMPLETED without addressing the README.
Add a top-level "Prerequisites" section (zh-CN: "准备工作") to both
README.md and README.zh-CN.md, placed immediately before "Quick
Start". The section walks through the install order:
1. Install the agent CLI (Claude Code / Codex / Gemini / iFlow /
Qoder / Cursor Agent / OpenCode) — pick one, verify it's on PATH
2. Authenticate the agent (e.g. `claude login`) — stores creds in
home dir
3. Install cc-connect (npm / Homebrew / binary)
4. Start cc-connect and open Web UI on http://localhost:9820
5. Configure platform bot tokens in the Web UI
The section explicitly warns about the failure mode so users
recognize it before they hit it. cc-connect startup logic is
unchanged — the fail-fast behavior is intentional and well-tested.
Co-authored-by: dev-claudecode <dev-claudecode@cc-connect.local>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Replace Kimi Open Platform links in both READMEs and the
provider-presets invite URLs with new tracking IDs from
Moonshot AI, applying the same pattern to both the
global (platform.kimi.ai) and China (platform.kimi.com)
endpoints.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Replace local Kimi banner assets with Kimi-hosted CDN URLs
(gcdn.moonshot.cn/growth-cdn/sponsor/kimi-en.png + kimi-zh.png)
so Kimi can manage the banner centrally.
- Update sponsor copy from Kimi K2.7 Code to Kimi K3
(Moonshot AI's 3T-class agentic model with native vision
and 1M-token context).
- Delete now-orphan local banner files.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the previous top-of-README banner with Kimi in both
README.md and README.zh-CN.md, including new logo assets and
updated sponsor copy and links.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Insert 七牛云 at position 2 and Fenno.ai at position 3 in
both README.md and README.zh-CN.md.
- Add assets/sponsors/qiniu.png and assets/sponsors/fenno.png
(logos provided by sponsors).
- Sponsor copy, English translations, and affiliate links
from sponsor-supplied materials.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Insert 二狗 API in the middle of the sponsor table in both
README.md and README.zh-CN.md (position 10 of 19).
- Add assets/sponsors/ergou.png (logo provided by sponsor).
- Sponsor copy and affiliate link from 二狗 API's own materials.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bold 'Claude Max 200', 'GPT Pro 200', and '高级成品号 /
premium accounts' in both README.md and README.zh-CN.md
per VisionCoder's request.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Promote VisionCoder earlier in the sponsor table in
both README.md and README.zh-CN.md based on sustained
cooperation and product quality. RunAPI, CaMeL, and
Unity2.ai shift down one position each.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Switch domain to visioncoder.cn (per VisionCoder request)
- Refresh logo asset (assets/sponsors/visioncoder.png)
- Update sponsor copy to reflect current VisionCoder offerings
(retail channels for Claude Max 200 / GPT Pro 200 premium accounts)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Insert APINEBULA at the top of the sponsor table in both
README.md and README.zh-CN.md (position 1).
- Add assets/sponsors/apinebula.png (logo supplied by
APINEBULA via their Galaxy Video Bureau platform).
- Sponsor copy and registration link provided by APINEBULA.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace placeholder link with the affiliate-tracked
registration URL on unity2.ai's request.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Insert unity2.ai between CaMeL and AnyRoute.io in both
README.md and README.zh-CN.md (position 7).
- Add assets/sponsors/unity2ai.png.
- Sponsor copy and link provided by unity2.ai.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(core): configurable attachment size limit for /send API
Introduce a max_attachment_size_mb config option (default 50 MiB, 0 keeps the
default) and make the /send API body limit track it. Attachments travel
base64-encoded inside the JSON body (~4/3 expansion), so the request body
limit is now derived from the per-attachment limit rather than the previous
hard-coded 52 MB cap — which was smaller than a single 50 MB attachment after
base64 and would silently reject valid sends.
- config: add MaxAttachmentSizeMB field
- core: APIServer.SetMaxAttachmentSize setter + DefaultMaxAttachmentSize const;
sendBodyLimit() returns limit*4/3 + envelope, falling back to the default
when unset. The limit field is guarded by s.mu because handleSend reads it
concurrently with reload-time writes (CI runs `go test -race`).
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(send): honor max_attachment_size_mb from cc-connect send + daemon
Resolve the per-attachment limit as CC_MAX_ATTACHMENT_SIZE_MB env (MiB) >
config max_attachment_size_mb (MiB) > core.DefaultMaxAttachmentSize, and apply
it on both sides of the socket. The env var deliberately uses the same MiB
unit (and a mirroring name) as the config field, so the two knobs cannot
silently disagree by a factor of 1<<20. A malformed or non-positive env value
falls through to config/default with a stderr warning, mirroring resolveLogMaxSize.
- daemon: set the limit on the API server at startup and on config reload.
The engine's reload closure cannot see the API server, so a package-global
reference re-applies the setting (mirroring existing globals like
config.ConfigPath).
- send: the `cc-connect send` subcommand is a separate process with no loaded
config, so it best-effort re-reads config.toml to honour the same limit; the
guard runs before the file is read into memory.
- tests: cover env/config/default resolution (MiB) and the readAttachment guard.
Co-Authored-By: Claude <noreply@anthropic.com>
* docs: document configurable attachment size limit
Surface max_attachment_size_mb (default 50 MiB) and the CC_MAX_ATTACHMENT_SIZE
override in the user-facing docs and README. The /send attachment sections
previously mentioned only platform-side limits, not cc-connect's own cap.
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* feat(matrix): add Matrix platform adapter using mautrix-go
Implements a full Matrix protocol adapter so users can interact with
their coding agent through any Matrix homeserver (matrix.org, self-hosted
Synapse/Dendrite, etc.). Uses mautrix-go SDK for Client-Server API.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(matrix): add Matrix platform documentation
Update README.md, README.zh-CN.md, INSTALL.md, CLAUDE.md and add
docs/matrix.md with setup guide, config reference and FAQ.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* test(matrix): add unit tests and fix session key parsing
35 tests covering config validation, message handling, lifecycle,
concurrency, and error paths. Race detector clean.
Fixes two bugs found by tests:
- stripBotMention: strip matrix.to URL before plain user ID to avoid
partial replacement inside the URL path
- ReconstructReplyCtx: room IDs contain colons, so colon-based SplitN
corrupted them; use ":@" boundary detection instead
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(matrix): add Chinese setup guide
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(matrix): add E2EE support via mautrix cryptohelper
Add Olm/Megolm encryption support using mautrix-go's built-in
cryptohelper. Encrypted rooms are now fully supported for both
sending and receiving messages.
Key implementation details:
- Crypto DB stored per device ID (~/.cc-connect/matrix-crypto-<device>.db)
- Auto-recovers from stale device keys by force-uploading new keys
- All outbound messages encrypted via sendRoomEvent when room has E2EE
- DecryptErrorCallback logs decryption failures through slog
- Cleanup client stores on failed crypto init to prevent DB panics
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(matrix): update setup guide with E2EE instructions
- Recommend creating dedicated device via curl login (avoids E2EE issues)
- Add E2EE section with startup log example showing device_id
- Add FAQ entries for common E2EE problems and troubleshooting
- Document crypto DB location and cleanup steps
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(matrix): add SAS verification and cross-signing support
Enable auto-accept SAS key verification so users can verify the bot's
device from Element. Bootstrap cross-signing to eliminate "encrypted by
a device not verified by its owner" warning on bot messages.
- Add verification helper with auto-accept/auto-confirm SAS flow
- Workaround mautrix MAC verification bug for cross-user verification
- Fix in-room verification transaction ID lookup from m.relates_to
- Persist cross-signing seeds to disk for stable keys across restarts
- Support m.login.password UIA fallback for publishing cross-signing keys
- Add auto_verify and cross_signing_password config options
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(matrix): add verification and cross-signing documentation
Add SAS verification and cross-signing setup instructions to both
English and Chinese Matrix guides. Document new config options
(auto_verify, cross_signing_password) and FAQ entries for device
verification and the red exclamation mark warning.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(matrix): fix inaccurate documentation and capability table
- Fix Matrix "Markdown / cards" from ✅ to ⚠️ (no CardSender)
- Change "red exclamation mark" to "red question mark" per actual UI
- Recommend curl with dedicated device_id for token (not Element)
- Add cross-signing seeds file to E2EE reset instructions
- Clarify that cross-signing may need cross_signing_password
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(matrix): reduce verbose logging in production
Downgrade per-message and internal workaround logs from Info to Debug,
and use structured fields for SAS verification log.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(matrix): fix formatting, rename field, and add token redaction
- Run gofmt to fix struct definition and literal alignment
- Rename shareSessionInChan to shareSessionInChannel for consistency
with other platforms (Telegram, Discord, Slack)
- Add core.RedactToken() in connectLoop error logging to prevent
access token leakage in logs
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* ci: install libolm-dev for Matrix E2EE crypto
The mautrix-go crypto package depends on libolm (C library) for
end-to-end encryption. The CI runners don't have it pre-installed,
causing golangci-lint to fail when loading the CGO package.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(matrix): use build-tagged E2EE to avoid CGO/libolm dependency
Split E2EE (end-to-end encryption) code behind a `goolm` build tag so
the default build compiles without CGO or libolm-dev. This fixes CI
lint failures caused by the mautrix-go crypto package pulling in the
CGO-based libolm backend by default.
- Default build: no E2EE, no CGO, CI lint passes
- Build with `-tags goolm`: full E2EE using pure-Go olm backend
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* build: enable goolm tag by default in Makefile
Matrix E2EE requires the goolm build tag. Add it as a default
tag in the Makefile so `make build` includes E2EE automatically.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(matrix): suppress unused field lint for cryptoHelper
The cryptoHelper field is only accessed in e2ee.go (goolm build tag),
so the default build's linter flags it as unused. Add //nolint:unused
since this is intentional.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(matrix): add Matrix platform adapter using mautrix-go
Implements a full Matrix protocol adapter so users can interact with
their coding agent through any Matrix homeserver (matrix.org, self-hosted
Synapse/Dendrite, etc.). Uses mautrix-go SDK for Client-Server API.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(matrix): add Matrix platform documentation
Update README.md, README.zh-CN.md, INSTALL.md, CLAUDE.md and add
docs/matrix.md with setup guide, config reference and FAQ.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* test(matrix): add unit tests and fix session key parsing
35 tests covering config validation, message handling, lifecycle,
concurrency, and error paths. Race detector clean.
Fixes two bugs found by tests:
- stripBotMention: strip matrix.to URL before plain user ID to avoid
partial replacement inside the URL path
- ReconstructReplyCtx: room IDs contain colons, so colon-based SplitN
corrupted them; use ":@" boundary detection instead
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(matrix): add Chinese setup guide
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(matrix): add E2EE support via mautrix cryptohelper
Add Olm/Megolm encryption support using mautrix-go's built-in
cryptohelper. Encrypted rooms are now fully supported for both
sending and receiving messages.
Key implementation details:
- Crypto DB stored per device ID (~/.cc-connect/matrix-crypto-<device>.db)
- Auto-recovers from stale device keys by force-uploading new keys
- All outbound messages encrypted via sendRoomEvent when room has E2EE
- DecryptErrorCallback logs decryption failures through slog
- Cleanup client stores on failed crypto init to prevent DB panics
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(matrix): update setup guide with E2EE instructions
- Recommend creating dedicated device via curl login (avoids E2EE issues)
- Add E2EE section with startup log example showing device_id
- Add FAQ entries for common E2EE problems and troubleshooting
- Document crypto DB location and cleanup steps
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(matrix): add SAS verification and cross-signing support
Enable auto-accept SAS key verification so users can verify the bot's
device from Element. Bootstrap cross-signing to eliminate "encrypted by
a device not verified by its owner" warning on bot messages.
- Add verification helper with auto-accept/auto-confirm SAS flow
- Workaround mautrix MAC verification bug for cross-user verification
- Fix in-room verification transaction ID lookup from m.relates_to
- Persist cross-signing seeds to disk for stable keys across restarts
- Support m.login.password UIA fallback for publishing cross-signing keys
- Add auto_verify and cross_signing_password config options
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(matrix): add verification and cross-signing documentation
Add SAS verification and cross-signing setup instructions to both
English and Chinese Matrix guides. Document new config options
(auto_verify, cross_signing_password) and FAQ entries for device
verification and the red exclamation mark warning.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(matrix): fix inaccurate documentation and capability table
- Fix Matrix "Markdown / cards" from ✅ to ⚠️ (no CardSender)
- Change "red exclamation mark" to "red question mark" per actual UI
- Recommend curl with dedicated device_id for token (not Element)
- Add cross-signing seeds file to E2EE reset instructions
- Clarify that cross-signing may need cross_signing_password
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(matrix): reduce verbose logging in production
Downgrade per-message and internal workaround logs from Info to Debug,
and use structured fields for SAS verification log.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(matrix): fix formatting, rename field, and add token redaction
- Run gofmt to fix struct definition and literal alignment
- Rename shareSessionInChan to shareSessionInChannel for consistency
with other platforms (Telegram, Discord, Slack)
- Add core.RedactToken() in connectLoop error logging to prevent
access token leakage in logs
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* ci: install libolm-dev for Matrix E2EE crypto
The mautrix-go crypto package depends on libolm (C library) for
end-to-end encryption. The CI runners don't have it pre-installed,
causing golangci-lint to fail when loading the CGO package.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(matrix): use build-tagged E2EE to avoid CGO/libolm dependency
Split E2EE (end-to-end encryption) code behind a `goolm` build tag so
the default build compiles without CGO or libolm-dev. This fixes CI
lint failures caused by the mautrix-go crypto package pulling in the
CGO-based libolm backend by default.
- Default build: no E2EE, no CGO, CI lint passes
- Build with `-tags goolm`: full E2EE using pure-Go olm backend
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* build: enable goolm tag by default in Makefile
Matrix E2EE requires the goolm build tag. Add it as a default
tag in the Makefile so `make build` includes E2EE automatically.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(matrix): suppress unused field lint for cryptoHelper
The cryptoHelper field is only accessed in e2ee.go (goolm build tag),
so the default build's linter flags it as unused. Add //nolint:unused
since this is intentional.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(matrix): resolve lint errors for CI (errcheck + staticcheck)
* feat(agent): add GitHub Copilot as a first-class agent (#865)
* chore: ignore web/tsconfig.tsbuildinfo (TS incremental build cache)
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(qqbot): add inline keyboard buttons and INTERACTION_CREATE event handling (#1131)
* feat(qqbot): add support for inline keyboard buttons and interaction events
- Update default intents to include INTERACTION_CREATE
- Implement SendWithButtons to send messages with inline keyboard buttons
- Encode permission decisions and session key in button_data for routing callbacks
- Handle INTERACTION_CREATE events to process button clicks as permission responses
- Create synthetic message for permission decisions and forward to engine
- Add ackInteraction to acknowledge INTERACTION_CREATE events via API call
- Add extensive tests for sending buttons, handling interactions, and edge cases
* fix(qqbot): ignore ackInteraction error and correct test URL check
- Suppress error from ackInteraction to avoid unused error variable warning
- Update test to expect corrected interaction URL path "/interactions/interact-1" instead of "/v2/interactions/interact-1"
* - Add sessionKey field to replyContext to embed in button_data and session routing
- Refactor SendWithButtons to use sessionKey from replyContext and validate emptiness
- Enhance replyContext construction with sessionKey in various message scenarios
- Implement new tests for sharing session keys in channel, empty session key errors,
and interaction_create event permission routing
- Update config.example.toml to document new required intents for interaction support
- Modify changelog with instructions on enabling INTERACTION_CREATE intent (bit 26) for QQ Bot
- Permission requests now use clickable inline buttons instead of text replies, requiring
enabling the INTERACTION capability in QQ Open Platform settings
* test(qqbot): ignore errors and returned values in test HTTP handlers
* feat: integrate Google Antigravity CLI (agy) agent
* Harden antigravity session discovery and attachment handling to preserve resume correctness under contention
Constraint: Keep external behavior and interfaces unchanged while improving runtime robustness
Rejected: Full process-level session correlation | Requires upstream CLI contract not available here
Confidence: medium
Scope-risk: narrow
Directive: Keep session-id detection conservative unless agy exposes explicit correlation metadata
Tested: go test ./agent/antigravity/... && go test ./core/... && go test ./cmd/cc-connect/...
Not-tested: Real concurrent agy process race on multi-session host
* Fix antigravity prompt execution and shutdown safety without changing user-facing flow
Constraint: Preserve existing antigravity integration surface and core event handling contracts
Rejected: Introduce a custom permission event parser for agy stdout | No stable upstream protocol contract yet
Confidence: medium
Scope-risk: narrow
Directive: If agy publishes structured permission I/O, replace y/n terminal fallback with typed request/response framing
Tested: go test ./agent/antigravity/... && go test ./core/... && go test ./cmd/cc-connect/...
Not-tested: End-to-end interactive agy permission prompt against a live CLI binary
* Stabilize antigravity permission flow so Discord approvals consistently drive CLI execution
Constraint: Preserve current antigravity stream/event contracts while improving permission reliability
Rejected: Full structured agy protocol parser | Upstream schema is not yet stable/public
Confidence: medium
Scope-risk: narrow
Directive: Replace regex prompt detection with typed protocol once agy exposes machine-readable permission events
Tested: go test ./agent/antigravity/... && go test ./core/... && go test ./cmd/cc-connect/... && go build ./cmd/cc-connect
Not-tested: Live Discord permission prompts across all locales/terminal themes
* Prevent agy hangs and unsupported flag crashes in cross-platform antigravity runs
Constraint: Keep antigravity adapter behavior compatible across Telegram/Discord while avoiding CLI-specific crashes
Rejected: Keep passing -m and rely on user wrapper scripts | Breaks agy v1.0.2 directly for normal users
Confidence: high
Scope-risk: narrow
Directive: Re-enable explicit model flag only after agy documents stable model flag support
Tested: go test ./agent/antigravity/... && go test ./core/... && go test ./cmd/cc-connect/... && go build ./cmd/cc-connect
Not-tested: Live agy v1.0.2 interactive permission prompts on Telegram with real long-running tool tasks
* Fix lint-blocking errcheck findings in antigravity adapter without behavior changes
Constraint: Keep runtime behavior unchanged while satisfying CI lint gates
Rejected: Broader refactor around file/stream lifecycle | Unnecessary for this blocking lint failure
Confidence: high
Scope-risk: narrow
Directive: Keep close/remove calls explicitly checked or intentionally ignored with clear intent in this package
Tested: go test ./agent/antigravity/... && go test ./core/... && go test ./cmd/cc-connect/...
Not-tested: Full GitHub Actions rerun output
* Fix remaining errcheck close-handling findings from CI lint
Constraint: Resolve lint blockers without behavioral changes
Rejected: Broad lifecycle refactor | unnecessary for this CI-only failure class
Confidence: high
Scope-risk: narrow
Directive: Keep file/stream close sites explicitly checked or intentionally ignored for errcheck
Tested: go test ./agent/antigravity/... && go test ./core/... && go test ./cmd/cc-connect/...
Not-tested: GitHub Actions rerun not yet executed
* docs: update MiniMax banner to M3 release
- Replace minimax-en.jpeg and minimax-zh.jpeg with new M3 PNG banners
- Update MiniMax description in both READMEs to reflect M3 benchmarks
(SWE-Bench Pro 59.0, Terminal Bench 2.1 66.0, VIBE V2 60.1, etc.)
- Update tagline: "Build, Learn & Ship" / "Mini 价格 Max 性能"
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore: update MiniMax model to M3 in provider presets
- Switch primary model from MiniMax-M2.7 to MiniMax-M3
- Add MiniMax-M3-highspeed variant
- Keep M2.7 as fallback for compatibility
- Update descriptions to reflect M3 features (Sparse Attention, Multimodal)
- Bump updated_at to 2026-06-03
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(core): /stop preserves AgentSessionID so next message can resume (#1196)
`cmdStop` no longer clears `AgentSessionID`; the next message can `--resume` the
conversation, matching the card-button Stop path and eliminating the
inconsistency described in #1189.
- Session-ID write-back now always follows the live forked ID Claude reports on
every `--resume` (was: skip if already set); name binding still fires only on
first assignment to avoid polluting `sessionNames`
- Removed `clearStaleSessionID` helper and `CompareAndSetAgentSessionID` guard;
replaced with unconditional `SetAgentSessionID` + `wasEmpty` name-binding gate
- Updated / renamed affected tests:
- TestSessionIDWriteback_TracksLiveForkedID
- TestInteractiveWriteBack_TracksForkedSessionID
- TestInteractiveWriteBack_NamingBindsOnlyOnFirstAssignment
- TestCmdStop_PreservesAgentSessionID
Closes#1189
* fix: three bug fixes — WPS ChannelKey, Telegram text_link, workspace bind path
fix(wps-xiezuo): set ChannelKey on inbound messages for per-group session
isolation (#1217). Without ChannelKey, messages from different WPS groups
were routed to the same session.
fix(telegram): forward text_link entity URLs to agent as [label](url) (#1207).
Telegram passes inline hyperlinks as entities (not in the plain text), so the
agent never saw the URL. enrichTextLinks() rewrites text_link spans in-place
using UTF-16 offsets (Telegram's coordinate system).
fix(core): splitCommandArgs() respects quoted paths in /workspace bind (#1211).
strings.Fields splits on every space, truncating paths like
'/workspace bind "/my project/foo"'. The new parser honours single and
double quotes so space-containing paths work correctly.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(pi): correct agent directory paths (SkillDirs + GlobalMemoryFile) (#1206)
* fix(pi): correct SkillDirs paths for pi agent skill discovery
cc-connect's pi agent reported wrong skill directories (~/.pi/skills/
instead of ~/.pi/agent/skills/), causing SkillRegistry to never find
pi skills. This meant slash commands like /caveman were not intercepted
by cc-connect's command routing — they fell through to pi's print mode
as raw text, and the LLM never received the skill instructions.
Fix:
- ~/.pi/skills/ -> ~/.pi/agent/skills/ (pi's default agent dir)
- Add ~/.agents/skills/ (common shared skill dir)
- Add /skills/ if env var is set
* fix(pi): correct GlobalMemoryFile path
pi loads global AGENTS.md from getAgentDir() which defaults to
~/.pi/agent/, not ~/.pi/. Respect if set.
* chore(pi): consistent homeDir variable naming in SkillDirs
* fix(pi): add SetWorkDir to enable /dir command (#1177)
pi agent implemented GetWorkDir() but not SetWorkDir(), so the
WorkDirSwitcher interface was incomplete and /dir always returned
'current agent does not support dynamic work directory switching'.
* fix(pi): pipe prompt via stdin to avoid CLI option parsing (#1185)
Reply chain headers start with "---", which pi's CLI parser
interprets as an option flag, producing "Unknown option" errors.
Pass the prompt via stdin instead of as a positional argument,
consistent with how gemini and codex agents handle it.
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* fix(pi): read enabledModels from settings.json for /model (#1178)
* fix(pi): read enabledModels from settings.json for /model
AvailableModels() now reads ~/.pi/agent/settings.json enabledModels
instead of returning nil. New() also falls back to defaultModel
from settings when opts don't specify model.
Add helpers: piSettingsDir, settingsPath, readSettings,
readSettingsModels, readDefaultModel. Respects PI_CODING_AGENT_DIR.
* fix(pi): check err return values in tests to pass errcheck linter
* fix(pi): silence errcheck for os.Setenv/Unsetenv in defer cleanup blocks
* feat(dingtalk): add reaction emoji support (#1213)
* feat(dingtalk): add reaction emoji support
* fix(dingtalk): satisfy emotion lint
* feat(slack,tmux): per-thread session scope and per-session tmux windows (#1179)
Add `session_scope` to the Slack platform ("user" | "channel" | "thread").
"thread" keys each Slack thread to its own cc-connect session, so a new
top-level message starts a fresh conversation while replies in the same
thread continue it. Backward compatible: when unset, behaviour is
unchanged (share_session_in_channel maps to "channel").
Add `window_per_session` to the tmux agent: each cc-connect session gets
its own tmux window (and its own init_command/agent instance) instead of
sharing one pane. Required for real isolation when the platform splits
sessions per thread; otherwise concurrent threads interleave into a single
shared agent. The allocated window name doubles as the agent session ID so
resumes reuse the same window.
Both options default off. Includes unit tests and config.example.toml docs.
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* Reply to unauthorized IM senders (#1190)
* feat(relay): configure group visibility (#1209)
* feat(send): 支持 --at-users / --at-all 命令行参数,DingTalk @mention 通知 (#1188)
* feat(send): add --at-users and --at-all support for DingTalk @mention
- Add --at-users and --at-all flags to cc-connect send command
- Add AtMentionSender optional interface for platforms that support @mention
- Implement ReplyWithAt in DingTalk platform using text msgtype
- Add CheckLinger stub for macOS compatibility
* fix: update test callers for SendToSessionWithAttachments new signature
* feat(send): add --at-users and --at-all support for DingTalk @mention
- Add --at-users and --at-all flags to cc-connect send command
- Add AtMentionSender optional interface for platforms that support @mention
- Implement ReplyWithAt in DingTalk platform using text msgtype
- Add CheckLinger stub for macOS compatibility
- Update all test callers for new signature
* fix(dingtalk): check resp.Body.Close return value for errcheck
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: wen_guoxing <wen_guoxing@itrus.com.cn>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cron): align manual trigger command with exec (#1201)
* feat: add manual cron run support
* feat(cron): align manual trigger command with exec
* fix(cron): guard shell manual triggers
* test(cron): accept manual run output before trigger ack
* test(release): align footer expectations without markdown italics
* fix(core): keep full reply footer paths
* test(core): normalize local dir path expectation
* fix(cron): check exec response body close
---------
Co-authored-by: aoko <aokodesuka@gmail.com>
Co-authored-by: 张彧 <aaron@mac.tail449498.ts.net>
Co-authored-by: 张彧 <aaron@Aaron-MacBook-Pro-14.local>
* feat(codex): support request_user_input app-server events (#1200)
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(feishu): refresh rich card rendering and panel handling (#1204)
Squash merge of PR #1204 (rebased onto main, minor conflicts resolved).
Adds structured per-turn reply footer, cardkit-v1 streaming, status footer
interface, claude context usage tracking, and rich card body improvements.
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(feishu): send audio and video attachments as media (#1202)
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(opencode): pass --agent flag when agent config option is set (#1210)
Adds optional 'agent' config option under [projects.agent.options] for
opencode. When set, the value is passed as --agent to every 'opencode run'
invocation, enabling plugin-defined agents (e.g. oh-my-openagent's
'Sisyphus - Ultraworker') to work correctly without falling back to the
default agent.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(core): remove leftover conflict markers in engine_test.go from #1202 merge
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: three bug fixes for #1184, #1139, and #1176
fix(core): multiSelect AskUserQuestion on card platforms (closes#1184)
- For multiSelect questions, render options as a numbered text list
instead of instant-resolve buttons (buttons resolved on first click,
preventing multi-selection)
- Add new i18n key MsgAskQuestionNoteMulti with per-language hint to
reply with comma-separated numbers (e.g. 1,3)
- Single-select questions keep the existing button UX unchanged
fix(config): allow cc-connect web with agent-only config (closes#1139)
- Add LoadPermissive() / validatePermissive() that skip the
"at least one platform" requirement
- runWeb now uses LoadPermissive so the web admin UI starts even
before any platforms are configured, enabling first-time setup
fix(weixin): fail fast on ret=-2 when context_token cannot be refreshed (closes#1176)
- When sendMessage returns ret=-2 and the stored token is the same as
the current one (no inbound message has refreshed it), stop retrying
immediately instead of burning 3 retries on the same stale token
- Return a clear actionable error: "user must send a new message to
refresh the session token"
- Applied to both text (weixin.go) and media (media_outbound.go) paths
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(matrix): support MATRIX_CROSS_SIGNING_PASSWORD env var and document crypto DB paths
- Add environment variable fallback for cross_signing_password (env var
takes precedence over config file, avoiding plaintext password in config)
- Document E2EE crypto data storage location (~/.cc-connect/) and file
purpose (crypto DB + cross-signing seeds) in both English and Chinese
setup guides
- Add data directory comment in config.example.toml
Addresses P3 items from PR #834 review.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: m3 <Marvae@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: 7a3lv7 <hjkl931031@gmail.com>
Co-authored-by: JazzuLu <27945372+JazzuLu@users.noreply.github.com>
Co-authored-by: shellus <353358601@qq.com>
Co-authored-by: Han <hanzr.nju@outlook.com>
Co-authored-by: Marco <48539922+MMMarcinho@users.noreply.github.com>
Co-authored-by: masakasu <32926719+MASAKASUNO1@users.noreply.github.com>
Co-authored-by: Rael <realraelmail@gmail.com>
Co-authored-by: Yu Zhang <34849476+AaronZ345@users.noreply.github.com>
Co-authored-by: wgx521 <wgx521@139.com>
Co-authored-by: wen_guoxing <wen_guoxing@itrus.com.cn>
Co-authored-by: aoko <aokodesuka@gmail.com>
Co-authored-by: 张彧 <aaron@mac.tail449498.ts.net>
Co-authored-by: 张彧 <aaron@Aaron-MacBook-Pro-14.local>
Bump VERSION to v1.3.3 and npm/package.json to 1.3.3. Stabilizes the
v1.3.3-beta.1 -> v1.3.3-beta.5 line (~235 PRs since v1.3.2) plus 7
post-beta fixes (qoder streaming, weixin typing ticket, daemon
linger_other.go, wps-xiezuo newlines, /switch history loss, minimax TTS
trailer, provider-resume regression tests).
- Add changelogs/v1.3.3.md with themed summary (New Agents, Platform
Capabilities, Core, Behavior Changes, Fixed)
- Prepend v1.3.3 section to CHANGELOG.md with highlights + post-beta
delta + behavior-change checklist
- Refresh "What's New" in README.md and README.zh-CN.md to v1.3.3
- Fix CUJ test flake: bump TestCUJ_H2_TwoPlatformsConcurrentNoBleed
deadline from 5s to 30s so it stays green under `-race -parallel=N`
on constrained CI hosts (passes <2s in isolation)
Co-authored-by: Cursor <cursoragent@cursor.com>
The What's New section was still pinned to v1.3.0 — out of date by
beta.1 through beta.4. Update both README.md and README.zh-CN.md to
highlight v1.3.3-beta.5: new agents (Antigravity, Copilot), native
file attachments (QQ, WeCom, Feishu media), /timer, /cancel,
agent-driven TTS, plus the three user-visible behavior notes.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Insert logo and description between Shengsuanyun and AICodeMirror
in both README.md and README.zh-CN.md.
- Add assets/sponsors/runapi.jpg (logo supplied by runapi.co).
- Sponsor copy and registration link provided by runapi.co.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
- Replace minimax-en.jpeg and minimax-zh.jpeg with new M3 PNG banners
- Update MiniMax description in both READMEs to reflect M3 benchmarks
(SWE-Bench Pro 59.0, Terminal Bench 2.1 66.0, VIBE V2 60.1, etc.)
- Update tagline: "Build, Learn & Ship" / "Mini 价格 Max 性能"
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Insert APIKEY.FUN at position 4 (after DMXAPI)
- Move nekoCode to position 5 (before Shengsuanyun)
- Add APIKEY.FUN to provider presets
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Insert CaMeL at position 6 (after AICodeMirror)
- Move Code0 and claudeapi.com to end of sponsor list (not renewed)
- Add CaMeL to provider-presets.json
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(wps-xiezuo): add native Go platform for WPS Xiezuo
Replace the Python bridge adapter with a native Go platform that compiles
directly into the cc-connect binary. Users only need to configure app_id and
app_secret in config.toml.
- WebSocket long connection with KSO-1 HMAC-SHA256 authentication
- AES-256-CBC event decryption with PKCS7 padding
- Event signature verification (HMAC-SHA256, base64url)
- X-Ack-Mode with writeLoop-serialized ACK responses
- Client/Server ping-pong with 90s deadline timeout
- REST API for sending messages (P2P and group)
- Emoji reaction typing indicator
- Token management (client_credentials, form-urlencoded)
- Dedup and allow_from support
Co-Authored-By: Claude Opus 4.6 <noreply@anthropicxxxxxx.com>
* fix(wps-xiezuo): address lint errors (errcheck, unused, staticcheck)
- Check SetReadDeadline return values with _ = prefix
- Remove unused tokenRequest struct (now using url.Values)
- Replace deprecated websocket.Upgrade with websocket.Upgrader
Co-Authored-By: Claude Opus 4.6 <noreply@anthropicxxxxxx.com>
* fix(wps-xiezuo): check Stop() return value in handleGoAway
Co-Authored-By: Claude Opus 4.6 <noreply@anthropicxxxxxx.com>
* fix(wps-xiezuo): fix data race in writeLoop channel access
Pass writeCh as parameter to writeLoop instead of reading p.writeCh
directly, eliminating race between close/nil assignment in defer and
channel read in writeLoop goroutine.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropicxxxxxx.com>
* docs(wps-xiezuo): prepare native platform PR
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropicxxxxxx.com>
- aicanapi: Claude Code up to 84% off, Doubao Seedance 2 queue-free
- 10点AI: production-optimized, high concurrency, GPT/Claude/Gemini/DeepSeek
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Pateway: 100% official direct access, $3 trial, up to 40% off, referral rewards
- 10点AI: add ¥5 registration bonus
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Users mistakenly believed `cc-connect web` also starts the bridge.
Updated README, README.zh-CN, and INSTALL.md to clarify it only
configures the web admin and opens the browser — a separate
`cc-connect` command is still needed to start the service.
Made-with: Cursor
- Add NekoCode sponsor at position 3 (after AIHubMix, before DMXAPI)
- Claude and CodeX API relay, exclusive 10% off code: CC-CONNECT
- Link: https://nekocode.ai/?aff=CC-CONNECT
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add VisionCoder sponsor at position 6 (after Code0)
- ¥800/month sponsorship with Token Plan promo (buy 1 month get 1 free)
- Reliable API relay service for Claude Code/Codex/Gemini
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Move AIHubMix before DMXAPI (now 2nd position)
- Add "AIHubMix" text next to logo since logo has no text
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Move AIHubMix to 2nd position in sponsor list (after DMXAPI)
- Update invite link to https://aihubmix.com/?aff=mGTx
- Compress sponsor description for better readability
- Add AIHubMix to provider-presets.json (500+ models, all formats)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add AIHubMix sponsor entry to both English and Chinese READMEs
- AIHubMix: ¥1,000 one-time sponsorship
- Deep integration with OpenAI/Claude/Gemini/Qwen/DeepSeek/Kimi
- Officially authorized by Microsoft Azure, AWS, GCP
- Link: https://aihubmix.com/?aff=XNdl
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adds native support for Devin CLI (Cognition, https://cli.devin.ai/)
as a named cc-connect agent, alongside Claude Code / Codex / Cursor /
Gemini / iFlow / Qoder / OpenCode. Users can now configure Devin with
a minimal `type = "devin"` block rather than hand-rolling a generic
ACP config.
[[projects]]
name = "my-project"
[projects.agent]
type = "devin" # NEW
[projects.agent.options]
work_dir = "/path/to/code"
# command / args / display_name default to "devin" / ["acp"] / "Devin"
# mode, auth_method, env (for WINDSURF_API_KEY) passed through to ACP
Credentials come from the local `devin auth login` store — cc-connect
never sees or forwards any token. Windsurf Enterprise users can inject
WINDSURF_API_KEY via the agent env option.
The new `agent/devin/` package is a thin wrapper around `agent/acp/`:
Devin speaks the Agent Client Protocol over stdio via its `devin acp`
subcommand, so the session/prompt, session/update, permission, and
tool-call plumbing is shared. Embedding *acp.Agent and shadowing only
Name() gives us identity and defaulting without duplicating transport
code:
type Agent struct { *acp.Agent }
func (a *Agent) Name() string { return "devin" }
Wiring Devin revealed two protocol features that agent/acp had left
as MVP-skipped TODOs. Both are needed for `/list` and `/mode` to work
in IM, so this PR fills them in as part of the Devin integration —
Cursor Agent, OpenClaw, and Copilot CLI all pick up the same
improvements automatically.
ListSessions now spawns a short-lived `<command>` process that runs
just initialize + session/list, then tears down. Capability is
discovered via `agentCapabilities.sessionCapabilities.list`, and a
negative result is cached on the Agent so non-supporting servers pay
the spawn cost only once. Soft-degrades on JSON-RPC -32601 (method
not found) and -32600 (invalid request). Measured cost against
`devin acp` 2026.4.9-0: ~40 ms round trip.
Agent implements core.ModeSwitcher (SetMode / GetMode /
PermissionModes); the modes list is sourced from the modes block
returned by session/new or session/load. GetMode precedence: the most
recent explicit SetMode wins over the last server-advertised
currentModeId, so `/mode plan` reports the new mode back to the user
immediately rather than the cached previous one.
acpSession implements core.LiveModeSwitcher via session/set_mode with
client-side modeId validation against the cached availableModes.
Client-side validation is mandatory because at least one ACP server
(devin acp 2026.4.9-0) silently accepts unknown modeIds with an empty
result — server-only validation would let typos go undetected.
session/update notifications with sessionUpdate = current_mode_update
are absorbed so cc-connect stays in sync when the user switches modes
from another client (e.g. the Windsurf IDE).
newACPSession moved from seven positional args to an acpSessionConfig
struct. Private API, not a breaking change externally; the one
exported consumer (cursor_integration_test.go) is updated.
A sessionCallbacks interface lets running acpSession instances report
handshake-derived capabilities and modes back to the parent Agent,
since the engine (not the agent) owns the session lifetime.
- README.md / README.zh-CN.md: Devin added to the Support Matrix and
the agent count bumped from 7 to 8.
- config.example.toml: dedicated Devin section placed before the
generic ACP examples, with prerequisites and override notes.
- web/src/pages/Projects/ProjectList.tsx: Devin added to the agent
dropdown so the web admin UI surfaces it alongside other
first-class agents.
- Makefile: ALL_AGENTS += devin (enables selective compilation tags
`no_devin` / AGENTS=devin,...).
22 new tests total (7 for agent/devin, 15 for agent/acp). All pass
with -race. agent/acp wrapper tests avoid requiring `devin` in PATH
by pinning `command = "true"` to satisfy the upstream exec.LookPath
check while still exercising the Name() shadow and default injection.
End-to-end verified against live `devin acp` 2026.4.9-0 through the
cc-connect bridge:
- /mode lists Devin's five modes with ▶ Code marked current
- /mode plan switches and the engine reports "switched to **Plan**"
- /list shows "devin Sessions (1)" (confirms Name() propagates to UI)
- agent field in engine logs = "devin" (not "acp")
Closes none — net-new agent support.
Generated with [Devin](https://cli.devin.ai/docs)
Co-authored-by: youngshook <youngshook@users.noreply.github.com>
Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>