130 Commits
Author SHA1 Message Date
Tony Yu a230774a7a docs: add international Kimi Code link alongside domestic subscription link (#1876)
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.
2026-09-27 19:24:39 +08:00
dev-claudecodeandCursor 80713167d1 docs(changelog,readme): v1.5.1-beta.1
Bump version and add changelog for beta release since v1.5.0 stable.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-28 08:04:22 +08:00
business-success 024b5e3bf2 docs(sponsors): add APIMart at position 5
Add APIMart to the sponsor table between AIGoCode and DMXAPI,
alongside the APIMart logo asset. README.zh-CN.md gets the
matching Chinese row.
2026-08-26 17:25:40 +08:00
91a4d74e7a docs(readme): add Prerequisites section with agent-CLI-first install order (#1464) (#1466)
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>
2026-08-13 16:46:43 +08:00
dev-claudecodeandClaude Opus 4.8 3fc360ee6a docs(sponsors): update Kimi platform links with tracking IDs
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>
2026-08-07 10:04:12 +08:00
dev-claudecodeandClaude Opus 4.8 9a3b0abf1d docs(sponsors): switch Kimi banner to CDN and update copy
- 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>
2026-07-22 23:41:07 +08:00
dev-claudecodeandClaude Opus 4.8 c4a612c238 docs(sponsors): replace top banner with Kimi
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>
2026-07-13 12:39:48 +08:00
dev-claudecodeandClaude Opus 4.8 f10ef6c767 docs(sponsors): add 七牛云 (Qiniu Cloud) and Fenno.ai as new sponsors
- 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>
2026-07-08 07:51:54 +08:00
dev-claudecodeandClaude Opus 4.8 97efa7f582 docs(sponsors): add 二狗 API (Ergou API) as new sponsor
- 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>
2026-07-04 10:37:15 +08:00
dev-claudecodeandClaude Opus 4.8 e2bbe5fbe6 docs(sponsors): emphasize premium accounts in VisionCoder entry
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>
2026-07-03 11:21:52 +08:00
dev-claudecodeandClaude Opus 4.8 c70da8733d docs(sponsors): move VisionCoder to position 6
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>
2026-07-03 11:16:11 +08:00
dev-claudecodeandClaude Opus 4.8 2754d715c1 docs(sponsors): update VisionCoder entry
- 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>
2026-07-03 10:49:56 +08:00
dev-claudecodeandClaude Opus 4.8 7915635f10 docs(sponsors): add APINEBULA as new sponsor
- 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>
2026-06-30 22:41:52 +08:00
dev-claudecodeandClaude Opus 4.8 1e0d8f7fff docs(sponsors): update unity2.ai registration link
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>
2026-06-23 23:49:07 +08:00
dev-claudecodeandClaude Opus 4.8 5c19196825 docs(sponsors): add unity2.ai as new sponsor
- 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>
2026-06-23 23:32:23 +08:00
WupeiandClaude 8343c310b6 feat(send): configurable attachment size limit via max_attachment_size_mb (#1392)
* 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>
2026-06-21 21:26:09 +08:00
1d84c1b0b1 docs(sponsors): remove four lapsed sponsor entries (#1404)
Drop sponsor blocks whose relationships have lapsed:
- AIHubMix
- NekoCode
- AICodeMirror
- DDS Hub

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: dev-claudecode <dev-claudecode@cc-connect.local>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:08:30 +08:00
+7 6f8d3a2bd8 feat(matrix): add Matrix platform adapter with E2EE support (#834)
* 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>
2026-06-16 09:54:55 +08:00
ClaudeandCursor dc1c63b9eb release: v1.3.3 stable
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>
2026-06-15 23:02:36 +08:00
ClaudeandCursor e44012c723 docs(readme): refresh "What's New" to v1.3.3-beta.5
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>
2026-06-15 13:45:26 +08:00
Yu Zhang 1bd0d95294 feat: add agent-driven TTS send support (#1230)
* feat: add agent-driven TTS send support

* test: cover tts error contracts
2026-06-09 23:30:30 +08:00
cg33andClaude 5e2f3b9eba docs(sponsors): add runapi.co as new sponsor (#1277)
- 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>
2026-06-08 22:09:30 +08:00
Claude c4e5595e04 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>
2026-06-03 09:30:56 +08:00
m3 03ae3908fc feat(agent): add GitHub Copilot as a first-class agent (#865) 2026-06-02 10:13:40 +08:00
Claude 694c816121 docs(sponsors): add apikey.fun and reorder nekoCode
- 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>
2026-05-23 13:28:23 +00:00
Claude 91c46b9ee6 docs(sponsors): add CaMeL and reorder inactive sponsors
- 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>
2026-05-20 12:46:55 +00:00
Claude ebceb4154b docs(sponsors): add SiliconFlow sponsor
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-19 01:32:46 +00:00
xiayuandClaude Opus 4.6 9cf496b973 feat(platform): add WPS Xiezuo native platform (#921)
* 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>
2026-05-18 11:12:03 +08:00
Claude 9e71032ede docs(sponsors): update aicanapi affiliate link
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 11:00:01 +00:00
Claude 42fd8253d9 docs(sponsors): add AnyRoute.io sponsor
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 10:57:56 +00:00
Claude 3c07db2c36 docs(sponsors): update aicanapi and 10点AI descriptions with official copy
- 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>
2026-05-05 10:30:01 +00:00
Claude 8f7e52a27f docs(sponsors): update Pateway and 10点AI descriptions
- 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>
2026-05-05 10:28:19 +00:00
Claude bc7d6e8825 docs(sponsors): update 10点AI affiliate link
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-04 13:19:12 +00:00
Claude dcff37697f docs(sponsors): move aicanapi, pateway, 10点AI after AICodeMirror
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-04 13:01:41 +00:00
Claude 94035b695f docs(sponsors): add aicanapi, pateway, 10点AI sponsors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-04 12:53:47 +00:00
Claude a4a9206196 docs: move Trendshift badge below language switcher
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-04 06:37:48 +08:00
Claude 8ded01b9ae docs: add Trendshift badge to README.zh-CN
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-04 06:27:44 +08:00
Claude a7058854ba docs: update sponsor list and add donor recognition
- Move 优云智算 to earlier position
- Add thx0701 to donor list

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-30 15:45:08 +00:00
Claude 558d48b511 fix: update sponsor referral links
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-26 06:47:54 +08:00
Claude e0b4cc89e5 docs: add DragonCode and 优云智算 sponsors
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-26 01:00:25 +08:00
Claude 77a1f9cc77 docs: clarify that cc-connect web does not start the service
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
2026-04-23 17:48:56 +08:00
Claude 087bb2402a feat(sponsor): add NekoCode as new sponsor (position 3)
- 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>
2026-04-21 23:03:29 +08:00
Claude 32bd992ecc feat(sponsor): add VisionCoder as new sponsor (¥800/month)
- 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>
2026-04-21 22:51:24 +08:00
Claude fdda018e5c fix(sponsor): move AIHubMix to 2nd position and add brand name
- 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>
2026-04-21 21:35:54 +08:00
Claude c2b66fb3c7 feat(sponsor): update AIHubMix position and add to provider-presets
- 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>
2026-04-21 21:30:28 +08:00
Claude e425f1ec40 feat(sponsor): add AIHubMix as new sponsor
- 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>
2026-04-21 21:30:28 +08:00
1b8a0843ef feat(agent): add Devin CLI as a first-class agent (#672)
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>
2026-04-21 21:19:30 +08:00
Claude 5eb795846e feat(sponsors): add DDS Hub sponsor
- Add DDS Hub to sponsor table (¥100)
- Logo added to assets/sponsors/ddshub.png
- Link: https://ddshub.short.gy/ccconnect

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-20 17:00:53 +08:00
Claude b80e11261d docs: add Weibo DM to What's New section in both READMEs
Made-with: Cursor
2026-04-20 12:53:43 +08:00
Claude 207b196924 docs: sync Chinese README with English version
- Add missing Weibo column to platform feature snapshot table
- Add missing Weibo row to support matrix and platform setup guides
- Add OS-User Isolation (run_as_user) section translation

Made-with: Cursor
2026-04-20 12:13:48 +08:00