# Changelog ## v1.5.1-beta.1 (2026-08-28) Beta since v1.5.0 stable — 16 merged PRs focused on Feishu/Weixin reliability, Claude Code /compact, Codex reasoning, and Cursor image attachments. See `changelogs/v1.5.1-beta.1.md` for the full contributor list. ### New Features - **i18n**: Localize agent system prompts (cron/timer/send/relay) based on language config (#1721, #1655) - **Cursor**: Deliver image attachments via on-disk paths (#1709) ### Fixed - **Feishu**: Chunked HTTP Range download for large resources (#1746); fail-closed on bot open_id discovery (#1725) - **Weixin**: Split send budget by reply vs push path (#1743); configurable inbound dedup (#1733) - **Claude Code**: Restore /compact and slash commands (#1737); bounded session teardown (#1714) - **Codex**: Propagate failed turns (#1730); max reasoning effort (#1727); /list session names (#1639) - **Pi**: Attachment @path refs (#1724); Windows build fix (#1738) - **Session**: /switch target idle reset exemption (#1734) - **Daemon/Skills**: Non-Linux build (#1710); plugin skill roots (#1713) ## Unreleased ### Added - **`agent_session_idle_timeout_mins`**: new per-project config option that closes an idle live agent process after a clean turn while preserving the cc-connect session and saved agent session ID. The next message starts a new agent process and resumes the same conversation. Set to `0` or leave unset to disable (#1338). - **Reasonix agent**: new agent adapter for Reasonix multi-model coding agent, bridging via HTTP serve API (POST /submit, SSE /events, POST /approve). Supports default/yolo/plan permission modes, SSE auto-reconnect with backoff, and thinking accumulator. (#1281) - **cloud_web platform**: 新增 self-hosted IM Gateway 作为 first-class platform 接入 (CWIP v1 协议,支持 websocket / long_poll / gateway 3 种 transport,完整 inbound/outbound + capability negotiation + graceful degradation)。 详见 docs/cloud-web.md + #1282。 ## Unreleased ### Added - **Feishu: outbound bot-to-bot @mention resolution** via new `mention_map` config option. Maps agent-friendly names (e.g. `BOT-A`) to Feishu open_ids so that when an agent writes `@BOT-A` in its reply, cc-connect converts it to a native Feishu `` tag that triggers a real notification. Layered on top of `resolve_mentions` (group-member matching) with higher priority, so explicit config always wins (#1322). ### Fixed - **codex**: expose the `max` reasoning effort in `/reasoning` and Codex project configuration. The Codex adapter now accepts and forwards `max` instead of rejecting it and showing usage limited to `low|medium|high|xhigh` (#1726). - **codex**: `/model` chooser now surfaces `gpt-5.x` (and any future frontier chat model) when the model list is populated by fetching `GET /v1/models` from the provider. The previous hard-coded 11-entry allowlist (`o1/o3/o4/gpt-4o/gpt-4.1/codex-mini-latest`) had not been updated since 2026-03 and silently filtered out every `gpt-5*` variant (including `gpt-5.6-sol/terra/luna`) returned by the API, so users on `codex-cli >= 0.143` could not pick GPT-5.6 in cc-connect even after upgrading the CLI. The allowlist is replaced with pattern rules: accept the `gpt-*` / `chatgpt-*` / `codex-*` / `o1-*` / `o3-*` / `o4-*` / `o5-*` families plus the bare `o1/o3/o4/o5` IDs, and reject non-chat modalities (`embedding`, `whisper`, `tts`, `dall-e`, `audio-preview`, `realtime`, `transcribe`, `moderation`, `image`, `search-preview`). New frontier chat models are picked up automatically without a code change. Note: this only affects the API-fetch fallback path; users with an explicit `model_catalog_json` in `~/.codex/config.toml` or a `models = [...]` list in cc-connect's provider config were unaffected. - **Feishu recall fallback probes**: throttle repeated active-message recall checks so long-running turns do not continuously call platform message APIs. - **Skill discovery depth-1 only**: skill scanning no longer recurses into subdirectories. Only `//SKILL.md` is registered; nested SKILL.md files (e.g. inside `/references/...`) are treated as skill assets and ignored, matching the Claude Code CLI convention. Previously, nested SKILL.md files leaked into platform command menus as phantom slash commands (101 leaked commands from `frontend-design` skill alone) (#1304). - **Feishu: tighter `@` mention detection in `SendWithStatusFooter` / `buildReplyContent`** — a bare `@` inside an email address, URL, or escaped character no longer false-positives as a mention. Mention detection now checks for the resolved `` tag instead of a substring match, so card rendering (and the notation-style status footer) is preserved for content that merely contains `@`. Real `@mentions` still force `MsgTypeText` so Feishu fires the mention event (#1322). - **feishu**: coalesce consecutive image messages from the same session into a single multi-image dispatch to fix first-image drop on batch sends (#1395). When the Feishu mobile client sends N images in quick succession, each image arrives as a separate `image` event with very close `create_time` values. Dispatching each immediately caused core/engine's `create_time` watermark (PR #1168) to drop the oldest image, so the agent only saw N-1 images. A per-session image buffer with a 150ms quiet window now merges the burst into one `core.Message` carrying all images, in send order. Single-image sends and quoted-image replies are unaffected. - **claudecode**: fix per-spawn system-prompt temp file EACCES under `run_as_user` (#1429). The per-spawn temp file written by `writeTempAppendPromptFile` (the 1% edge-case path used when the prompt has session-specific platform formatting or user `append_system_prompt`) inherited `os.CreateTemp`'s 0600 mode and was owned by the cc-connect process user (often root under systemd). When the agent was spawned under a different `run_as_user`, it could not read the file and exited before any prompt was loaded. The file is now `chmod 0o644` immediately after write, matching the shared `ensureSharedSystemPromptFile` path. Prompt content is non-secret (a superset of the already-shared base prompt), so 0644 is consistent with the shared file. Does not affect the shared-file path (already 0644 since #1376) or the daemon-mode path resolution (#1419). - **kimi**: gate `--work-dir` flag on `kimiFlagSupport.WorkDir` so the Kimi Code CLI build that dropped the flag no longer exits with `error: unknown option --work-dir` (#1476). Same probe-based pattern as the `--print` fix in #1456 / PR #1461: the agent probes `kimi --help` once at construction, then `buildArgs` emits the flag only when the installed CLI advertises it. The agent still runs in the correct directory because `exec.Command.Dir` is set separately, so legacy kimi-cli users (who still have `--work-dir`) keep non-default workspace support while modern-CLI users get clean startup. - **kimi**: native Kimi Code CLI (Node.js `kimi-code`) dialect support (#1561). The newer CLI removed `--quiet` and `--resume`, moved the session resume hint from a plain-text line to a stdout JSON meta event (`{"role":"meta","type":"session.resume_hint",...}`), and emits assistant/tool `content` as a plain string instead of typed blocks — causing `error: unknown option`, silently dropped replies, and broken multi-turn continuity. The probe now also gates `--quiet` (emulated locally by suppressing thinking/tool events when unsupported), resume uses `-r ` on the modern dialect (the command the CLI's own hint prints), the meta resume-hint event restores the session ID, and the stream parser accepts both content shapes regardless of probed flavor. Session listing additionally scans `~/.kimi-code/sessions` with its `state.json` schema (`title`/`workDir`, honoring the workDir filter) and counts messages from `agents/main/wire.jsonl` so `/list` and `/delete` work for both CLI flavors. Legacy kimi-cli behavior is unchanged. - **core**: queue post-restart notification and dispatch on platform ready (#1383). Previously `/restart` sent the success notification immediately after engine startup, racing the platform's async connect window (Telegram: ~2.6s). On a not-yet-ready platform the send was silently dropped at debug log level. The notify is now queued on the engine and dispatched when the target platform reaches `OnPlatformReady`, with bounded retry (3 attempts, 0/500/1500 ms backoff) on transient send failure. Failed sends log at warn level. A 10s safety timeout drops the notify with a warning if the target platform never reaches ready, so startup is never blocked indefinitely. Also covers Discord / Weixin / Matrix (other AsyncRecoverablePlatform implementations) for free. - **core**: `SaveFilesToDisk` / `AppendFileRefs` always emit absolute paths (#1459). When a user configured a relative `work_dir` (e.g. `~/project` or `.cc-connect`), `SaveFilesToDisk` joined relative paths into the attachments directory and the resulting paths were passed verbatim into the agent's prompt. The spawned agent process — typically run from a different cwd by the platform adapter — could not resolve them and silently dropped every attachment. `SaveFilesToDisk` now calls `filepath.Abs(workDir)` up front and falls back to the raw value on error, and `AppendFileRefs` defensively absolutizes each entry. Both behaviors are covered by new tests for relative, absolute, and empty workDir; the empty-workDir case falls back to the process cwd so misconfigured deploys still get a writable attachments directory. - **Plugin skill roots**: Codex and Claude Code static skill discovery now includes plugin-provided `skills` directories while preserving depth-1 registration, so bundled plugin skills are listed without reintroducing nested reference-template leaks. - **core**: prevent same-name file attachments from overwriting each other. `SaveFilesToDisk` now scopes files by message ID, keeps duplicate names distinct within one message, and uses an atomic no-overwrite fallback for legacy callers without a message ID (#1552). ## Unreleased ### Fixed - **/model switch confirmation copy**: `MsgModelChanged` now explicitly states the new model applies to the current session and all future sessions, removing the misleading "new sessions" wording that made users think they needed `/new` to see the change take effect (#1368). ## Unreleased ### Fixed - **DingTalk message list title**: derive the `markdown.title` field on outgoing DingTalk messages from the message content (markdown stripped, first non-empty line, truncated to 20 runes) instead of the hardcoded `"reply"`. The DingTalk chat list now shows the actual reply preview instead of "reply" on every entry. Empty / pure-format / pure-emoji messages still fall back to "reply" so the title is never blank (#1269). ## v1.3.3 (2026-06-15) First stable release of the 1.3.3 series. Stabilizes the v1.3.3-beta.1 → v1.3.3-beta.5 line (≈ 235 PRs since v1.3.2) plus 7 post-beta.5 fixes. See `changelogs/v1.3.3.md` for the full themed summary; per-beta details remain in the beta sections below. ### Highlights - **New agents**: Devin CLI, Google Antigravity (`agy`), GitHub Copilot — all first class. Hardened coverage for Cursor, OpenCode, Qoder, Kimi, Pi. - **Platform expansion**: QQ Bot inline keyboards + file send/receive (OneBot), WeCom `SendFile` (WebSocket), Feishu audio + video native media, Slack Assistant API, MAX webhook delivery, DingTalk @mentions / richText / image / file inbound, WPS Xiezuo (金山协作), broader Weibo DM. - **Long-running turn hardening**: new `max_turn_time_mins` wall-clock cap with soft-stop + force-kill + auto-resume — long bash / test commands can no longer lock a session indefinitely. - **Core commands**: `/timer`, `/cancel`, `/ps` (replaces `/btw`), `cron add --silent`, agent-driven TTS. - **Multi-user / permissions**: reply-to-unauthorized-IM-senders, @mention-tolerant permission keywords (`@Bot/permit` ≡ `/permit`), Bridge requires token when enabled. - **Observability**: blackbox testing framework (P0/P1/P2 + config-switch matrix), CUJ test framework, agent-resume regression suite, Pi context-usage reporter. - **Provider ecosystem**: NekoCode, VisionCoder, AIHubMix, MiniMax M3 presets; Claude Code 1M-context Opus + `append_system_prompt` + PermissionRequest hooks; Codex `request_user_input` app-server events; configurable shell + shell profile. ### Post-beta.5 fixes (delta from beta.5) - **qoder**: emit streaming text without dropping final result (#1290) - **weixin**: use `ilink_user_id` in `getConfigReq` for typing ticket (#1308) - **daemon**: remove redundant `linger_other.go` that breaks non-linux builds (#1314) - **wps-xiezuo**: preserve newlines in outbound messages — fixes unreadable `/status` (#1361) - **core**: `/switch` no longer loses history; persist user msgs immediately; add CUJ test framework (#1348) - **core**: queued FIFO drains no longer drop earlier queued messages as stale just because a later queued message has a higher `create_time` (#1286) - **core**: make `/history` entry truncation configurable via `[display].history_max_len`, defaulting to 1000; `0` disables truncation (#1291) - **tts/minimax**: drop `status=2` trailer chunk to stop audio playing twice (#1364) - **tests**: add provider-resume regression tests for codex / opencode / kimi (#1366) ### ⚠️ Behavior Changes (carried forward from the beta cycle) All behavior changes from beta.1 → beta.5 remain in effect for v1.3.3. **Most likely to affect existing configs:** - `progress_style` default for Telegram & Discord is now `compact` (was `legacy`). Set `progress_style = "legacy"` to revert. (#1354) - QQ Bot default `intents` now include `INTERACTION_CREATE` (bit 26). Custom `intents` must include `1<<26` for inline keyboard buttons. - DingTalk `msgtype=file` inbound now reaches the agent (#1357). - Engine permission keyword matching is @mention-tolerant: `@Bot/permit` ≡ `/permit` (#1358). - `reset_on_idle_mins` default is now 30 minutes (#494). Set to `0` to disable. - Bridge with no `[bridge].token` configured will refuse to start (#408). ### Breaking Changes **None.** Fully additive release. ### Upgrade ```bash npm i -g cc-connect@1.3.3 # or go install github.com/chenhg5/cc-connect/cmd/cc-connect@v1.3.3 ``` Coming from a `v1.3.3-beta.*`: this is a small fix-only upgrade. No config change required. Coming from `v1.3.2`: review the Behavior Changes above before upgrading. --- ## v1.3.3-beta.5 (2026-06-15) Large beta with 74 PRs from 28 contributors. New agents (Google Antigravity `agy`, GitHub Copilot), QQ file send/receive via OneBot, WeCom `SendFile` (WebSocket), Feishu audio/video media, agent-driven TTS, `/timer` and `/cancel` commands, and broad platform fixes across Telegram, Discord, DingTalk, Feishu, WeCom, WeiXin, Cursor, OpenCode, Pi, and Codex. See `changelogs/v1.3.3-beta.5.md` for the full list. ### New Features - **Google Antigravity (`agy`)** agent as a first-class integration (#1123) - **GitHub Copilot** agent as a first-class integration (#865) - **`/timer`** — one-shot delayed task system (#1012) - **`/cancel`** — interrupt and reset the current session (#957) - **Session prune** command to remove duplicate sessions (#603) - **Agent-driven TTS** send (#1230) - **Reply to unauthorized IM senders** option (#1190) - **QQ Bot inline keyboard buttons** and INTERACTION_CREATE events. Permission requests now render as clickable buttons (#1131) - **QQ (OneBot) file send/receive** via HTTP API (#323) - **WeCom `SendFile`** in WebSocket mode (#1199) - **Feishu audio + video attachments** as native media (#1202) - **Feishu rich card rendering + panel handling** refresh (#1204) - **DingTalk reaction emoji** support (#1213) - **DingTalk @mention via `send --at-users` / `--at-all`** (#1188) - **Slack + tmux** per-thread session scope with per-session tmux windows (#1179) - **`cron add --silent`** CLI flag (#1285, closes #858) - **Codex `request_user_input`** app-server events + relay group visibility (#1200, #1209) - **Claude Code** custom `append_system_prompt` + PermissionRequest hooks (#1175, #850) - **Pi** `ContextUsageReporter` for reply footer token stats (#1235) - **Daemon** hardened service-file env capture + EnvDiscoverer plugin hook (#1034) - **Configurable shell + shell profile** for `exec` (#870) ### Fixed - Many fixes across the engine, agents, and platforms. Highlights: Telegram/Discord progress style, DingTalk file inbound, Feishu link/card URLs, WeCom long-message split, Cursor session titles, OpenCode tool rejection, Codex resume + sandbox_mode, Pi `/dir` and `/model`, Windows instance lock, and Claude Code provider preservation. See `changelogs/v1.3.3-beta.5.md`. ### ⚠️ Behavior Notes - **`progress_style` default** for Telegram and Discord is now `compact` (was `legacy`). Set `progress_style = "legacy"` in the platform config to restore previous behavior (#1354). - **DingTalk `msgtype=file`** inbound messages now reach the agent. Previously silently dropped (#1357). - **Engine permission keyword matching** is now @mention-tolerant: `@Bot/permit` matches the same as `/permit` (#1358). ### ⚠️ QQ Bot Intent Configuration The default intents for QQ Bot now include `INTERACTION_CREATE` (bit 26, value `1<<26`). If you previously set a custom `intents` value without this bit, inline keyboard buttons will not work — update your `intents` to include bit 26. If you use the default intents, no action is needed. See `config.example.toml` for the new `intents` option. ## v1.3.3-beta.4 (2026-05-28) ### New Features - **`max_turn_time_mins`**: new config option — absolute wall-clock cap per agent turn that does NOT reset on tool-call events. Prevents long-running bash commands from permanently locking the session (#1091). Uses a two-phase shutdown: soft stop (10s grace) then force-kill. Session is preserved and resumed via `--resume` on the next message. ### Fixed - **Web console 404 regression**: `make release-all` did not depend on `make web`, so release binaries were built without frontend assets when `web/dist/` was empty (gitignored). All routes on the management port returned `404`. Fixed by adding `web` as a prerequisite of `release-all` (#1136) - **Slack @mention without space**: `stripAppMentionText` only matched `"> "` (with trailing space), so `@Bot/command` (no space) was forwarded verbatim to Claude instead of being parsed as a command - **DingTalk `msgtype="picture"` dropped**: image messages delivered as `"picture"` (instead of `"image"`) were silently dropped. Both types now route to the image handler (#1128) - **Feishu `require_mention = false` ignored**: the platform read `group_reply_all` but users set `require_mention = false`; now both are treated as equivalent (#1141) - **AskUserQuestion resolved with empty answer**: delivery receipts and read-notifications (empty messages) were accepted as valid answers to `AskUserQuestion`, resolving it within ~500ms before the user could respond. Empty/whitespace content is now rejected (#1086) ## v1.3.3-beta.3 (2026-05-24) Beta release with blackbox testing infrastructure, cursor/opencode agent support, and bug fixes. ### New Features - **Blackbox testing framework**: Phase 1-2 blackbox testing with P0/P1/P2 coverage, config-switch, and NewEnvWithSetup infrastructure - **Cursor/OpenCode agents**: add cursor and opencode agent support in blackbox tests ### Fixed - **Core italic wrapping**: restore italic wrapping on reply footer - **Feishu footer asterisks**: strip asterisks from footer to prevent Feishu markdown italic rendering - **Kimi session UUID**: capture session UUID from stderr instead of stdout - **Codex stdio sentinel**: add stdio sentinel for Codex app_server backend - **Windows cross-compile**: add missing `CheckLinger` stub to `daemon/windows.go` and `daemon/unsupported.go` so `make release-all` succeeds for all target platforms ## v1.3.3-beta.2 (2026-05-09) Beta release with Slack Assistant API, DingTalk improvements, MAX platform webhook mode, and numerous platform fixes. No breaking changes. ### New Features - **Slack Assistant API**: support Slack Assistant API (Agent toggle) with natural on/off switching (#844) - **DingTalk richText**: support richText message type for DingTalk platform (#828) - **DingTalk image handling**: add DingTalk image message support (#828) - **MAX webhook delivery mode**: add webhook delivery mode for MAX messenger platform with deployment docs (#818) - **Claude Code env vars**: support project-level environment variables via `env` config section (#812) - **display_mode enum**: add `display_mode` enum to replace boolean `quiet` config, with quiet/compact/normal/full options (#655) - **Core reset_on_idle_mins default**: default to 30 minutes to prevent context drift (#494) - **Claude Code custom system prompt**: add support for custom system prompt configuration via `system_prompt` option (#534) ### Fixed - **Bridge security**: require token when Bridge is enabled to prevent unauthorized access (#408) - **Feishu recalled messages**: handle recalled messages gracefully (#841) - **Feishu media download failure**: notify user when media download fails instead of silent drop (#815) - **WeChat video messages**: send video files as proper video messages in WeChat (#813) - **WeChat incomplete delivery**: notify user on incomplete message delivery and enhance retry logging (#771) - **Telegram private topics**: preserve private topic session keys (#804) - **Kimi session UUID**: capture session UUID from stderr instead of stdout (#766) - **Codex app_server config**: app_server backend should honor model/effort/provider config + add stdio sentinel (#837) - **Codex progress rendering**: render progress in rich Card 2.0 format (#838) - **Core ellipsis events**: suppress ellipsis-only events and handle context indicator in footer - **Core Markdown table**: render inline formatting inside GFM table cells (#675) - **Feishu user id resolution**: guard user id resolution against edge cases - **Feishu thread topics**: skip quote injection in thread-isolated topics (#767) - **Config display mode**: honor project display mode setting - **Daemon restart**: add --force flag to daemon restart command (#736) - **AskUserQuestion**: use question text as answers key for proper answer routing (#822) ## v1.3.3-beta.1 (2026-04-25) Beta release with new agents, new features, and broad platform fixes. No breaking changes. ### New Features - **Devin agent**: add Devin CLI as a first-class agent with full `/list`, `/mode`, and session management (#672) - **`/ps` command** (replaces `/btw`): send a message to a busy session mid-turn; `/btw` kept as alias for backward compatibility (#620) - **`!` shell shortcut**: use `!ls -la` as shorthand for `/shell ls -la`, with optional `--timeout` parameter (#658) - **NO_REPLY suppression**: agents can return `NO_REPLY` to silently skip platform delivery, useful for cron/analysis tasks (#682) - **Feishu shared WebSocket**: multiple projects sharing the same `app_id` now share one WebSocket connection with per-project `allow_chat` / `group_only` filtering (#613) - **Message queue depth configurable**: new `[queue] max_depth` config option (default 5) (#690) - **Claude Code opus[1m]**: add 1M-context Opus model option with shorthand descriptions (#660) - **QQ Bot file send/receive**: full file attachment support with robustness checks (#685) - **Bridge ImageSender/FileSender**: `cc-connect send --image/--file` now works through bridge protocol (#712) - **Provider presets**: add NekoCode, VisionCoder, and AIHubMix to provider presets; add Trae CLI ACP and COCO ACP config examples (#739) ### Fixed - **OpenCode image handling**: inbound images from WeChat/WeCom are now correctly passed to OpenCode CLI via `--file` flags (#717) - **Slack Markdown**: convert standard Markdown to Slack mrkdwn format (bold, italic, strike, links, headings) (#680) - **QQ Bot reconnect**: cancel stale goroutines on WebSocket reconnect to prevent race conditions (#678) - **Gemini multiline prompt**: pass prompt via stdin to preserve newlines (#695) - **Telegram HTML fallback**: upgrade silent HTML parse failures to Warn-level logs (#674) - **Telegram /skills**: show Telegram-safe skill command format (#571) - **Feishu webhook mode**: skip bot open_id fetch in webhook mode for private deployments (#696) - **Reply footer**: suppress footer when only workdir is known (#701) - **Web UI add-platform**: fix "project not found" error when adding a new platform to an uncreated project ### Contributors Thanks to all contributors who made this release possible: - @YoungShook — Devin agent integration, Telegram HTML fallback - @Cigarrr — /ps command, NO_REPLY feature - @vinnyxiong — Feishu shared WebSocket and allow_chat - @happyTonakai — Shell `!` prefix and `--timeout` - @AaronZ345 — Claude Code opus[1m] model - @ferocknew — QQ Bot file support - @soaringk — OpenCode image fix - @Zx55 — Telegram /skills fix - @zhaomoran — Feishu webhook mode fix - @LyInfi — Reply footer suppression - @meloalright — Trae/COCO ACP config examples ## v1.3.2 (2026-04-21) Hotfix release: session filtering is now configurable and defaults to showing all sessions. ### Fixed - **`/list` shows all sessions by default**: the session filter introduced in v1.3.0 (which hid sessions not created by cc-connect) was accidentally merged and caused confusion. The filter is now **off by default** — `/list`, `/switch`, and `/delete` show all agent sessions regardless of origin. ### Added - **`filter_external_sessions` config option**: users who *do* want to hide externally-created sessions can set `filter_external_sessions = true` in `[[projects]]` to restore the old filtering behavior. - **Comprehensive integration tests**: real-agent E2E tests for both Codex and Claude Code covering the full `/list` → `/new` → conversation → `/list` lifecycle with provider-based authentication (no env-var API keys required). Plus 9 adapter-level filter tests using real Codex/Claude Code session file fixtures. ## v1.3.1 (2026-04-20) Patch release with critical bug fixes for session management, config preservation, and Weibo media support. ### Fixed - **Session visibility (`/list`)**: historical Codex sessions disappeared after upgrade due to `AgentSessionID` being cleared on `/new` or provider switch without preservation. Added `PastAgentSessionIDs` tracking with legacy data migration so existing sessions remain visible. - **Session naming (`/new xxx`)**: custom session names from `/new` were not mapped to the agent session ID for agents where the ID is established asynchronously (Codex, Qoder, Kimi, etc.). Added name mapping to all `EventResult` and `EventText` handlers across interactive, relay, and drain paths. - **Config comment preservation**: `/provider switch`, `/model`, `/lang`, display settings, and TTS changes now use surgical text-level editing instead of full TOML re-serialization, preserving all comments, unknown fields, and formatting. - **Codex `codex_home` path**: session listing, history, and deletion now consistently use the configured `codex_home` instead of hardcoded `~/.codex`. - **Feishu card callback hint**: log a reminder when interactive card mode is enabled but `card.action.trigger` may not be subscribed. ### Added - **Weibo image & file support**: send and receive images and files in Weibo DMs via base64 encoding within the WebSocket `send_message` payload. Implements `ImageSender` and `FileSender` interfaces. - **Comprehensive session tests**: 12 new `SessionManager` unit tests covering `PastAgentSessionIDs`, legacy data migration, and version-based schema detection. 9 new `Engine` integration tests covering `/list` visibility across `/new`, provider switch, and real-world legacy data scenarios, plus end-to-end session name mapping tests for all three agent ID patterns (immediate, EventText, EventResult). - **Config preservation tests**: 8 new tests verifying comment and field preservation for `SaveActiveProvider`, `SaveAgentModel`, `SaveProviderModel`, `SaveLanguage`, `SaveDisplayConfig`, `SaveTTSMode`, multi-project config, and global provider refs. ## v1.3.0 (2026-04-19) First stable release of the 1.3 series. 555 commits since v1.2.1 with major new features, platform improvements, and broad community contributions. ### Highlights - **Web Admin UI** — Full management dashboard embedded in the binary via `go:embed`. Project CRUD, session monitoring, cron editor, provider management, chat interface, and i18n (en/zh/zh-TW/ja/es). Use `cc-connect web` to open directly in the browser with auto-login. - **Lifecycle Event Hooks** — New `[[hooks]]` config to trigger shell commands or HTTP webhooks on 7 event types: `message.received`, `message.sent`, `session.started`, `session.ended`, `cron.triggered`, `permission.requested`, `error`. Async by default, fail-open, non-blocking. - **Skill Management** — New `/skills` page in the web UI with local skill browser (per-project, per-agent) and recommended skill presets fetched from remote. - **Global Provider Management** — Add, edit, delete providers in the web UI; import from cc-switch config; per-agent-type provider presets with featured/star badges. ### New Features - `cc-connect web` CLI command: auto-configure web admin, open browser with token-based login - Feishu: auto-resolve `@name` mentions to clickable at-tags (`resolve_mentions` config) - Feishu: multi-level reply chain recognition; done-emoji reaction after streaming - Feishu: configurable progress display styles (compact/card) - Claude Code: support CLI wrappers via `cli_path`; `/effort` command for reasoning effort; `auto` permission mode; `disallowed_tools` config - Codex: runtime reply footer; preserve workspace app-server options - Kimi CLI: new agent support - Pi: new agent support - Discord: preserve table formatting; proxy support; `@everyone`/`@here` broadcast - Telegram: forum topic support; markdown table monospace rendering; command menu adaptation - WeCom: configurable `api_base_url` for private deployments; file receiving via HTTP callback - Weixin (ilink): personal chat platform with CDN media, QR setup, image/file/audio send - Config: support `${ENV_VAR}` placeholders in TOML values - Core: `/workspace init` with local directory paths; `/dir` directory history; `agent-sid` command; auto-compress context on token threshold; outgoing rate limiting - Daemon: preserve proxy env in systemd service ### Bug Fixes - Fix Windows cross-compilation (duplicate runas stub file) - Fix web footer double 'v' prefix in version display - Fix web modal overlay not covering full viewport (portal rendering) - Fix provider preset cards: action buttons pinned to card bottom - Fix web page content overlapping footer (global layout restructure) - Fix Gemini image handling: save to workspace, prompt-based file references - Fix Claude Code: unblock readLoop when child subprocesses hold stdout pipe - Fix Codex: multiline prompt on resume; force-kill process group on stop - Fix core: race condition during session cleanup; follow symlinked skill directories; persist agent_session_id; filter `/list` to cc-connect owned sessions - Fix Feishu: slash commands in thread/reply context; user/chat name resolution in async goroutine - Fix Telegram: UTF-8-safe command menu descriptions - Fix TTS: don't send empty language_type to Qwen TTS API - Fix config: `formatTOML` no longer strips user-set zero values - Security: mask bridge token in `/api/v1/status`; path traversal protection for static files ### Contributors Thanks to all contributors who made this release possible: - [@leoliang1997](https://github.com/leoliang1997) — Feishu card rendering, auto-resolve @mentions - [@xukp20](https://github.com/xukp20) — Provider env handling, skill discovery, Codex options - [@boyu-zhu](https://github.com/boyu-zhu) — Telegram markdown table rendering - [@RukawaKaede](https://github.com/RukawaKaede) — Claude Code CLI wrapper support - [@meishaoqing](https://github.com/meishaoqing) — Feishu multi-level reply chain - [@Zx55](https://github.com/Zx55) — Telegram command menu, symlinked skill dirs - [@leighstillard](https://github.com/leighstillard) — Claude Code `/effort` command - [@ht290](https://github.com/ht290) — inject_sender display name - [@Sentixxx](https://github.com/Sentixxx) — Claude Code readLoop subprocess fix - [@bugwz](https://github.com/bugwz) — WeCom private deployment API base URL - [@cold2600438-lgtm](https://github.com/cold2600438-lgtm) — Kimi CLI agent - [@MeteorSkyOne](https://github.com/MeteorSkyOne) — Discord table formatting - [@happyTonakai](https://github.com/happyTonakai) — Feishu done-emoji reaction - [@xxb](https://github.com/xxb) — Codex reply footer, Discord session routing - [@q107580018](https://github.com/q107580018) — Feishu delete/model card flows - [@Cigarrr](https://github.com/Cigarrr) — Workspace binding parsing - [@g1f9](https://github.com/g1f9) — Local directory workspace init - [@0xsegfaulted](https://github.com/0xsegfaulted) — agent-sid command - [@yzlu0917](https://github.com/yzlu0917) — Env var config placeholders - [@sidney061212-ai](https://github.com/sidney061212-ai) — Agent session ID persistence - [@zkunzhu](https://github.com/zkunzhu) — Daemon proxy env preservation - [@Yuri0314](https://github.com/Yuri0314) — TTS language type fix ## v1.2.2-beta.5 (2026-03-31) Beta release with embedded web admin, Discord proxy support, multimodal fixes, and major platform improvements. ### New Features - **Embedded Web Admin**: Web frontend is now compiled into the binary via `go:embed` — no separate `npm install` needed. Use `/web setup` to configure, or build with `no_web` tag to exclude. Binary size increases ~1MB (#356) - **Web Admin Dashboard**: Full-featured management UI with project CRUD, session management, cron job editor, global settings, chat interface with bridge WebSocket, slash commands, and i18n (en/zh/zh-TW/ja/es) (#316) - **Discord Proxy Support**: Discord platform now supports `proxy`, `proxy_username`, `proxy_password` options for HTTP API and WebSocket Gateway connections - **Feishu Progress Styles**: Configurable progress display styles (compact/card) to reduce message spam - **Claude Code Auto-Permission Mode**: New `auto` permission mode for Claude Code agent (#329) - **WeCom File Receiving**: WeCom HTTP callback now supports receiving files and forwarding them to the agent (#330) - **Outgoing Rate Limiting**: Per-platform outgoing message rate limiting - **Telegram Forum Topics**: Migrated to `go-telegram/bot` library with forum topic support (#321) - **Global Settings UI**: Expose global configurations (language, quiet, display, stream preview, rate limit, log) in the web admin ### Bug Fixes - **Gemini Image Handling**: Save attachments to workspace directory instead of `/tmp` so Gemini CLI tools can access them; use prompt-based file references instead of unsupported `--image` flag - **Security**: Mask bridge token in `/api/v1/status` endpoint; add path traversal protection for static file serving - **Codex**: Fix multiline prompt preservation on resume (#341); force kill session process group on stop (#340) - **Session Recycling**: Wait for old session to close before creating new one (#352) - **Discord**: Harden session routing and remove implicit continue bridge (#322); execute slash commands when defer fails (#300) - **Slack**: Pass file uploads to agent (#296) - **Telegram**: UTF-8-safe command menu descriptions (#301) - **WeCom**: Strip @bot mentions from inbound text (#303) - **Daemon**: macOS launchd do not respawn on clean exit (#304) - **Core**: Route workspace model changes through session context (#339); outgoing rate limit refinements and i18n tightening - **Config**: `formatTOML` no longer strips user-set zero values (e.g. `quiet = false`) ### Improvements - **CI**: Add Node.js setup for web frontend build in CI pipeline; use `no_web` tag for e2e/smoke tests - **Tests**: Expanded coverage across agents, config, and core packages - **Selective Compilation**: Added `no_web` build tag to exclude web assets from binary ### Contributors Special thanks to all contributors who made this release possible: - **cg33** — Embedded web admin, Discord proxy, Gemini fix, security hardening - **xxb** — Discord session routing fix, codex process kill, workspace reconnect (#322, #340, #315) - **dev-null-sec** — Codex multiline prompt fix (#341) - **xukp20** — Workspace model routing (#339) - **zhengbuqian** — Telegram go-telegram/bot migration and forum topics (#321) - **huangdijia** — Claude Code auto permission mode (#329) - **buddhism5080** — Discord file sending (#307) ## v1.2.2-beta.4 (2026-03-22) Beta release with Weixin (ilink) personal chat support, session/continue improvements, and platform fixes. ### New Features - **Weixin Personal (ilink)**: New platform with long-poll `getUpdates` / `sendMessage`, QR `weixin setup`, CDN decrypt for inbound media and `ImageSender`/`FileSender` outbound (#257) - **Telegram**: Voice/audio reply support (#225) and async startup recovery - **Discord**: `@everyone` / `@here` broadcast support (#132) - **Cron**: Optional new session per run and per-job timeout (#236) - **Claude Code**: `disallowed_tools` configuration option (#232) - **Auto-Compress**: Compress context when estimated tokens exceed threshold (#231) - **Continue / Sessions**: Fork session on `--continue` to avoid context contamination (#244); replace persisted `ContinueSession` sentinel with real agent session id; reserve CLI `--continue` bridge for real user traffic - **Core**: `/dir` directory history; `/model` switching aligned with provider flow (#246) - **Providers**: MiniMax M2.7 high-speed model added to example configs (#217) ### Bug Fixes - **Weixin**: Harden send path (empty body skip, response body cap, dedup keys, multi-voice segments); treat `sendMessage` JSON `ret != 0` as failure so quota/API errors surface correctly - **Feishu**: Always reply to the original message; dispatch message handling asynchronously (#57) - **Codex**: Mode switch and `--json` flag position fixes (#240, #239) - **Multi-Workspace**: Workspace command prefix missing leading slash (#135) - **Non-Claude Agents**: Ignore `ContinueSession` sentinel where inappropriate (#244 follow-up) - **npm / Update**: Version sync after update; pre-release version comparison normalization ### Improvements - **Tests**: Expanded coverage across `config`, `core`, agents, and platforms - **Logging / Errors**: Additional error logging in several code paths ### Contributors Special thanks to all contributors who made this release possible: - **cg33** — Weixin ilink platform, setup CLI, and CDN media (#257) - **Shawn** — Feishu async dispatch and reply-to-original fixes (#57) - **quabug** — Discord broadcast and non-Claude ContinueSession handling (#132, #244) - **huluma1314** — Auto-compress when token threshold exceeded (#231) - **Leigh Stillard** — Fork session on `--continue` (#244) - **Deeka Wong** — Telegram audio replies and core `/model` provider flow (#225, #246) - **q107580018** — Telegram async startup recovery - **just4zeroq** — Codex mode and JSON flag fixes (#240) - **术士木星** — Cron session-per-run and job timeout (#236) - **hushicai** — Claude `disallowed_tools` (#232) - **Octopus** — MiniMax M2.7 high-speed in examples (#217) - **alinnb** — `/dir` directory history - **Claude** — Continue-session bridge fixes, auto-compress/cron edge cases, Weixin send hardening and API error handling, and broad test improvements ## v1.2.2-beta.3 (2026-03-19) Beta release with major multi-user mode, improved workspace stability, and platform enhancements. ### New Features - **Multi-User Mode**: Per-user rate limits, role-based ACL (allow_from/admin_from), and audit logging - **ImageSender**: Unified image sending support for 6 platforms (Feishu, Telegram, Discord, Slack, DingTalk, QQ) - **MiniMax M2.7**: Upgraded default model from M2.5 to M2.7 for improved reasoning - **/whoami Command**: Display user ID for allow_from/admin_from configuration - **/btw Command**: Inject messages into busy sessions without interrupting - **/dir Command**: Dynamic runtime work directory switching - **Cron Muting**: Mute/unmute cron jobs with platform wrapper and UI integration - **Interrupt Support**: Send interrupt signal to agent sessions (Ctrl+C equivalent) - **CORS Support**: Cross-origin requests enabled for Bridge API - **Message Queuing**: Queue messages when agent is busy instead of discarding - **QQ Bot Markdown**: Full Markdown message support for QQ Bot ### Bug Fixes - **Workspace Session Persistence**: Sessions now persist to disk in multi-workspace mode - **Race Conditions**: Multiple data race fixes (adminFrom, degraded field, userRolesMu) - **Memory Leaks**: Fixed pendingAcks leak on WeCom WebSocket disconnect, goroutine leaks - **i18n**: Complete translation coverage for error messages - **Relay Timeout**: Return partial text after timeout instead of error - **QQ Bot Reconnect**: Handle nil wsConn on failed reconnect ### Improvements - **Message Queue**: Extracted message queue handling into dedicated method - **Cron UX**: Improved human-readable cron expressions - **Slack**: Typing indicator, file download error handling, auth diagnostics - **Provider Config**: `models` list for per-provider model selection via alias - **Build**: Test infrastructure with P0/P1分层测试targets ### Contributors Special thanks to all contributors who made this release possible: - **sean2077** - Multi-user mode, ACL, and audit logging - **0xsegfaulted** - Multi-workspace fixes and interrupt support - **octo-patch** - MiniMax M2.7 upgrade - **windli2018** - Bridge CORS support - **jenvan** - CORS fixes ## v1.2.2-beta.2 (2026-03-16) Beta release with significant improvements to agent stability, platform onboarding, and user experience. ### New Features - **Feishu/Lark CLI Onboarding**: New `cc-connect feishu setup` command with QR code terminal display for quick bot configuration, supporting both new bot creation and existing bot binding - **Pi Agent**: Added support for Pi coding agent with full session management and tool handling - **Session TUI Browser**: New `cc-connect sessions` subcommand with terminal UI for browsing session history - **Multi-Workspace Mode**: Channel-based workspace resolution with auto-binding by convention and interactive init flow - **Design Documentation**: Added comprehensive design plans for multi-workspace and session resilience features - **Slack Enhancements**: Typing indicator via emoji reactions, mrkdwn formatting guidance in system prompt - **Session Resilience**: Automatic `--continue` on first connection, resume-failure fallback, and context usage indicators - **Management API**: HTTP REST API endpoints for external management tools with WebSocket bridge support - **Cron Setup Command**: `/cron setup` for easy cron job configuration with memory file integration ### Bug Fixes - **RateLimiter Goroutine Leak**: Fixed cleanup goroutine not stopped on replacement and engine shutdown - **DrainEvents Infinite Loop**: Fixed infinite loop when channel is closed in `drainEvents` - **InteractiveKey Consistency**: Fixed `executeCardAction` using wrong key for `interactiveStates` lookup in multi-workspace mode - **Workspace Command Prefix**: Fixed missing leading slash in workspace command prefix check - **Agent Session Close**: Always close events channel on session timeout to prevent goroutine leaks - **Pi Agent Mutex**: Move thinking field read inside mutex in `StartSession` to prevent race condition - **Session AgentID Protection**: Protect `Session.AgentSessionID` writes with mutex to prevent data races - **Session Routing Race**: Prevent session routing race when `/new` runs during active turn - **Discord Duplicate Messages**: Deduplicate gateway `MessageCreate` events causing duplicate responses - **Codex JSON Lines**: Handle large stdout JSON lines without scanner buffer overflow - **UTF-8 Safety**: Use rune-based splitting in `splitMessage` to prevent invalid UTF-8 sequences ### Improvements - **Gemini Display**: Enhanced tool display with diff syntax highlighting and improved Telegram markdown rendering - **Thread Safety**: Added comprehensive thread-safe accessors for Session fields - **Test Engine**: Thread safety improvements to test engine and fixed test assertions - **Input Validation**: Consolidated interactive state cleanup and added input validation - **i18n**: Updated rate limit messages to mention `/btw` command for adding context during processing ### Contributors Special thanks to all contributors who made this release possible: - **kevinWangSheng** - Multiple critical bug fixes (RateLimiter, drainEvents, UTF-8 safety, session routing) - **q107580018** - Feishu CLI onboarding with QR code integration - **sean2077** - Session TUI browser and sessions management - **quabug** - Pi agent implementation and Discord fixes - **AtticusZeller** - Gemini tool display and Telegram markdown enhancements - **leighstillard** - Multi-workspace design, session resilience, and Slack improvements - **Shawn** - Thread safety fixes and test improvements - **zhuguanqi** - Session management and data race fixes - **Steve-Rye** - JSON lines handling improvements - **Xihui He** - iFlow and agent enhancements - **Mr.QiuW** - Various platform improvements ## v1.2.2-beta.1 (2026-03-12) Beta release with major new features and security improvements. ### New Features - **`/usage` Command**: Add a built-in quota usage command with a generic agent usage-reporting interface; Codex now supports ChatGPT OAuth usage lookup via `~/.codex/auth.json` - **Feishu Interactive Cards**: Beautiful card-based UI for slash commands (/help, /list, /status, etc.) with tabbed navigation and in-place updates - **Lark Platform Support**: Added support for Lark (飞书国际版) with proper domain handling - **Codex Reasoning Effort**: New `/reasoning` command to switch reasoning effort levels (low/medium/high) - **Codex Model Cache Fallback**: `/model` command now falls back to local `~/.codex/models_cache.json` when API is unavailable - **Gemini Timeout Config**: New `timeout_mins` option to configure per-turn timeout for Gemini agent - **Batch Session Deletion**: `/delete` now supports comma lists, ranges, and mixed forms for batch deletion - **TTS Support**: Text-to-speech with Qwen and OpenAI providers - **Admin Privilege System**: Admin-only commands for privileged operations - **iFlow Tool Timeout**: Configurable tool timeout and reset timer on partial completion - **Card-based Permission Prompts**: Permission requests now use interactive cards with callback support - **Shared Session Support**: Share sessions across all platforms with `share_session_in_channel` option ### Bug Fixes - **Security Hardening**: Socket permissions tightened (0600), token redaction in logs, warning for open `allow_from` - **Slack @mention Support**: Fixed AppMentionEvent handling for channel @mentions - **Update Fallback**: Self-update now falls back to .tar.gz/.zip archive when bare binary returns 404 - **Skill Symlink**: Fixed skill directory scanning to follow symbolic links - **QQBot Error Handling**: Added error logging for json.Unmarshal and WriteJSON calls - **Claude Code Path**: Fixed underscore handling in findProjectDir path matching ### Improvements - **Daemon Config Flag**: Support daemon install with config file path - **Message Tracing**: Added message tracing and threaded replies - **Scanner Buffer**: Optimized scanner buffer sizes for large outputs ## v1.2.1 (2026-03-09) Patch release with bug fixes and minor enhancements. ### Bug Fixes - **Engine: Idle Timer During Permission Wait** - Stop idle timer while waiting for user permission response to prevent session termination - **Feishu: Nil Pointer Checks** - Add nil checks for `SenderId.OpenId` and `msg.Content` to prevent panics - **Feishu: URL Validation** - Validate URLs before creating hyperlinks to prevent rejection of non-HTTP(S) URLs - **Cron: Error Logging** - Log `json.Unmarshal` errors instead of silently ignoring when cron file is corrupted - **Engine: Stale Event Prevention** - Add `drainEvents` utility to clear buffered events between turns ### New Features - **Bind Setup Command** - `/bind setup` writes relay instructions to memory file for better bot-to-bot relay configuration ## v1.2.0 (2026-03-08) This is the first stable release of cc-connect 1.2.0, consolidating all beta changes and adding new features. ### New Features (since beta.7) - **Official QQ Bot Platform**: Native integration with Tencent's official QQ Bot Platform via WebSocket, supporting text, image, and document messages - **iFlow CLI Agent**: Full support for iFlow CLI agent with interactive tool-call handling and mode switching - **Shell Command Execution**: Custom commands can execute shell commands directly with `exec` field in config - **Telegram Bot Menu**: Auto-register bot command menu on startup for better discoverability - **DingTalk Reply Preprocessing**: Improved markdown content preprocessing for reply messages - **Multi-Bot Relay Persistence**: Relay bindings now persist across restarts with improved binding messages ### Improvements - **Quiet Mode**: `/quiet` now supports both per-session and global scope modes - **Compression Command**: Improved `/compress` command handling and code refactoring - **i18n**: Added new message keys and improved command formatting ### All 1.2.0 Highlights (from beta releases) - **Bot-to-Bot Relay**: Forward messages between different messaging platforms - **Streaming Preview**: Real-time message preview on Telegram, Discord, and Feishu - **Typing Indicators**: Visual processing feedback on supported platforms - **Session Search**: Search sessions by name, ID prefix, or summary - **Custom Slash Commands**: Define reusable prompt templates - **Agent Skills Discovery**: Auto-discover and invoke user-defined skills - **Daemon Mode**: Run as background service with systemd/launchd support - **Rate Limiting**: Per-session sliding-window rate limiter - **Command Aliases**: Define shortcut aliases for commands - **Self-Update**: In-place binary updates with auto-restart - And many more improvements and bug fixes... ## v1.2.0-beta.7 (2026-03-07) ### New Features - **Multi-Bot Relay Binding**: `/bind` now supports binding multiple bots in a group chat; use `/bind ` to add, `/bind -` to remove specific project - **System-level Systemd**: Daemon mode now supports system-level systemd (`/etc/systemd/system/`) when running as root, useful for servers and containers - **Config Example Command**: `cc-connect config-example` prints embedded config template for quick reference - **Interactive Command Buttons**: `/lang`, `/model`, `/mode` commands now show interactive button menus for easy selection - **Exec Commands**: Custom commands can execute shell commands directly with `exec` field in config - **Configurable Idle Timeout**: Agent idle timeout can be configured via `idle_timeout_mins` in config ### Improvements - **Daemon Error Messages**: Improved systemd detection and error messages for WSL2, containers, and SSH environments - **Codex CLI Visibility**: Patched codex session source to make CLI output visible ### Bug Fixes - **Streaming Preview**: Fixed stale preview messages when streaming degrades ## v1.2.0-beta.6 (2026-03-06) ### New Features - **Bot-to-Bot Relay**: Forward messages between different messaging platforms via CLI (`cc-connect relay`) and internal API; enables cross-platform bot communication - **Session Search**: Search sessions by name, ID prefix, or summary with `/search ` command - **List Pagination**: `/list` now supports pagination with `--page` and `--page-size` flags for large session counts - **Per-Platform Streaming Preview Control**: Configure streaming preview per platform via `streaming_preview` setting (Telegram, Discord, Feishu) - **Silent Cron Mode**: Suppress cron job notification messages with `silent = true` in cron job config - **Voice Qwen Mode**: Voice function now supports Qwen audio model for speech-to-text - **Feishu Three-Tier Rendering**: Intelligent markdown rendering strategy — simple text uses plain messages, rich markdown uses Post, code blocks/tables use Card ### Improvements - **Status Display**: Improved `/status` command output with better formatting and Feishu message rendering fixes - **Self-Update**: Auto-restart after update; added Gitee mirror support for Chinese users - **Windows Self-Update**: Full Windows support for in-place binary updates - **Message Splitting**: Improved boundary checks for cleaner message chunking - **Platform Startup**: Better error handling and logging during platform initialization - **Session Switch i18n**: Added translation for session switch success message ### Bug Fixes - **Idle Session Timeout**: Added timeout for unresponsive agent sessions to prevent hangs - **Streaming Preview**: Removed `maxChars` check that caused premature preview termination - **Message Deduplication**: Deduplicate messages by process start time to prevent duplicate processing ## v1.2.0-beta.5 (2026-03-06) ### New Features - **Streaming Preview**: Real-time message preview that updates in-place as the agent streams output; supported on Telegram, Discord, and Feishu with configurable interval, min delta, and max length - **Rate Limiting**: Per-session sliding-window rate limiter to prevent message flooding; configurable `max_messages` and `window_secs` - **Typing Indicators**: Visual processing feedback — Telegram/Discord show native typing action, Feishu adds emoji reaction (auto-removed on completion) - **Command Aliases**: Define shortcut aliases for commands (`[[aliases]]` in config.toml or `/alias add`); e.g. map "帮助" → "/help" - **Banned Words Filter**: Block messages containing configured sensitive words (`banned_words` in config.toml) - **Project-level Command Disabling**: Disable specific commands per project via `disabled_commands` config - **Session Deletion**: Delete sessions with `/del` command - **`/switch` Fuzzy Matching**: Switch sessions by name, ID prefix, or summary substring in addition to numeric index ### Improvements - **Streaming Preview + Tool Messages UX**: In non-quiet mode, when thinking/tool messages are sent, the streaming preview freezes and the final response is delivered as a new message at the bottom of the chat (instead of silently updating an older message above the tool messages) - **Telegram Markdown→HTML**: Full Markdown-to-HTML conversion with proper escaping, placeholder-based tag nesting, and automatic fallback to plain text on parse errors - **Discord Code-Fence-Aware Splitting**: Message chunking now respects code block boundaries, closing and re-opening fences across splits - **Feishu Dual Rendering**: Simple markdown uses Post messages (normal font), code blocks/tables use Card messages (native rendering); matches Claude-to-IM's approach - **Feishu Permission Interaction**: Confirmed WebSocket mode incompatibility with card button callbacks; uses text-based `/perm` commands (consistent with Claude-to-IM) - **Session Creation & Naming**: Improved session naming with last user message as summary - **Graceful Shutdown**: Improved context handling and lock release during shutdown - **Unit Tests**: Added ~50 new test cases covering markdown conversion, message splitting, session management, and engine logic ### Bug Fixes - **Telegram HTML Crossed Tags**: Fixed `...` nesting issues by using placeholder-based formatting pipeline - **Telegram HTML Attribute Escaping**: Fixed `"` in URLs breaking `` attributes (escape to `"`) - **Telegram Duplicate Messages**: Fixed duplicate sends caused by streaming preview optimization skipping final HTML update - **Streaming Preview Cursor**: Removed trailing `▍` cursor from final messages - **Feishu Message Recall**: Unified preview and final message types to Card, eliminating unnecessary delete-and-resend - **Feishu Reaction Cleanup**: Register empty handler for `im.message.reaction.deleted_v1` to suppress error logs - **`fmt.Sprintf` Warnings**: Remove non-constant format strings flagged by `go vet` ## v1.2.0-beta.2 (2026-03-01) ### New Features - **`/upgrade` Command**: Check for available updates (including beta) and self-update the binary in-place; queries both GitHub and Gitee releases - **`/restart` Command**: Restart cc-connect service from chat with post-restart success notification - **`/config reload` Command**: Hot-reload configuration (display, providers, commands) without restarting - **`/name` Command**: Set custom display names for sessions (e.g. `/name my-feature`, `/name 3 bugfix`); names persist across restarts and show in `/list`, `/switch`, `/status` - **Default Quiet Mode**: Configure `quiet = true` globally or per-project in config.toml to suppress thinking/tool progress by default; users can still toggle with `/quiet` - **Command Prefix Matching**: Type shortened commands like `/pro l` for `/provider list`, `/sw 2` for `/switch 2`; works for all commands and subcommands - **Numeric Session Switching**: `/list` shows numbered sessions; `/switch 3` switches by number instead of copying long IDs - **Group Chat Mention Filtering**: Feishu, Discord, and Telegram bots now only respond to @mentions in group chats instead of all messages - **Claude Code Router Support**: Integration with Claude Code Router for enhanced routing capabilities - **Third-party Provider Proxy**: Local reverse proxy rewrites incompatible `thinking` parameters for third-party LLM providers (e.g. SiliconFlow) ### Improvements - **Session History for Claude Code**: `/history` now works after `/switch` by reading from agent JSONL files - **List Summary**: `/list` now shows the most recent user message as summary instead of the first - **Session Names in UI**: Custom session names display with 📌 prefix in `/list`, `/switch`, `/status` - **API Server Shutdown**: Clean shutdown without "use of closed network connection" error - **Agent Session Timeouts**: 8-second graceful shutdown timeout for all agent sessions with kill fallback - **Feishu Rich Text**: Use Post (rich text) messages instead of Interactive Cards for normal font size ### Bug Fixes - **DingTalk Startup**: Fix false startup failure when stream client returns nil error - **Deadlock on /new and /switch**: Release lock before async agent session close to prevent hangs - **Provider Command**: Correctly list providers when no active provider is set - **Unknown Command Handling**: Show i18n-friendly warning and fall through to agent for native commands ### Security & Reliability - **Race Condition Fixes**: `sync.Once` for channel close, mutex protection for concurrent fields, non-blocking event sends - **Atomic File Writes**: Config, session, and cron files use temp+rename pattern - **Message Deduplication**: Platform-level dedup for Feishu and DingTalk webhooks - **HTTP Client Timeouts**: Shared 30s-timeout HTTP client for all outbound requests - **Path Traversal Protection**: Validate command file paths - **Sensitive Data Redaction**: Redact API keys and tokens in logs ## v1.2.0-beta.1 (2026-03-01) ### New Features - **Custom Slash Commands**: Define reusable prompt templates as global slash commands (`[[commands]]` in config.toml or `/commands add`); supports positional parameters (`{{1}}`), rest parameters (`{{2*}}`), default values (`{{1:default}}`), and runtime add/del/list - **Agent Skills Discovery**: Auto-discover and invoke user-defined skills from agent directories (e.g. `.claude/skills//SKILL.md`); list with `/skills`, invoke with `/ [args]`; supports all agents (Claude Code, Cursor, Gemini, Codex, Qoder) - **`/config` Command**: View and modify runtime configuration (e.g. `thinking_max_len`, `tool_max_len`) from chat, with persistent save to `config.toml` - **`/doctor` Command**: Run system diagnostics covering agent authentication, platform connectivity, system resources, dependencies, and network latency; fully i18n-supported - **Discord Slash Commands**: Register native Discord Application Commands so typing `/` shows an autocomplete menu; supports per-guild instant registration via `guild_id` config - **Daemon Mode**: Run cc-connect as a background service (`cc-connect daemon install/start/stop/status/logs`); supports systemd (Linux) and launchd (macOS) - **Qoder CLI Agent**: Full support for the Qoder coding agent with streaming JSON, mode switching, and model selection - **Telegram Proxy**: Support HTTP/SOCKS5 proxy for Telegram bot API connections - **WeChat Work Proxy Auth**: Add `proxy_username` / `proxy_password` for authenticated forward proxies - **i18n Expansion**: Add Traditional Chinese (zh-TW), Japanese (ja), and Spanish (es) language support - **`--stdin` Support**: Read prompt from stdin for CLI usage (`echo "hello" | cc-connect send --stdin`) ### Improvements - **Slow Operation Monitoring**: Warn-level logs for slow platform send (>2s), agent start (>5s), agent close (>3s), agent send (>2s), and agent first event (>15s); turn completion logs now include `turn_duration` - **`tool_max_len=0` Fix**: Remove hardcoded 200-char truncation in all agent sessions (Claude Code, Cursor, Codex, Gemini, Qoder), making the user-configurable `tool_max_len` setting authoritative - **Cursor `/list` Improvements**: Parse binary blob structure to show accurate message counts and first user message summary ### Bug Fixes - **Telegram proxy**: Only override `http.Transport` when proxy is actually configured - **Discord interaction fallback**: Gracefully fallback to channel messages when interaction token expires ## v1.1.0 (2026-03-02) ### New Features - **`/compress` Command**: Compress/compact conversation context by forwarding native commands to agents (Claude Code `/compact`, Codex `/compact`, Gemini `/compress`); keeps long sessions manageable - **Auto-Compress**: Added optional automatic context compression when estimated token usage exceeds a configurable threshold (`[projects.auto_compress]`). - **Telegram Inline Buttons**: Permission prompts on Telegram now use clickable inline keyboard buttons (Allow / Deny / Allow All) instead of requiring text replies - **`/model` Command**: View and switch AI models at runtime; supports numbered quick-select and custom model names. Fetches available models from provider API in real-time (Anthropic, OpenAI, Google), with built-in fallback list - **`/memory` Command**: View and edit agent memory files (CLAUDE.md, AGENTS.md, GEMINI.md) directly from chat; supports both project-level and global-level (`/memory global`) - **`/status` Command**: Display system status including project, agent, platforms, uptime, language, permission mode, session info, and cron job count ### Improvements - **Cron list display**: Multi-line card-style formatting with human-readable schedule translations and next execution time - **Model switch resets session**: Switching model via `/model` now starts a fresh agent session instead of resuming the old one, preventing stale context from affecting the new model - **Permission modes docs**: README now documents permission modes for all four agents (Claude Code, Codex, Cursor Agent, Gemini CLI) - **Natural language scheduling docs**: INSTALL.md now explains how to enable cron job creation via natural language for non-Claude agents - **README revamp**: Redesigned project header with architecture diagram, feature highlights, and multi-agent positioning ### Bug Fixes - **Gemini `/list` summary**: Fixed session list showing raw JSON (`{"dummy": true}`) instead of actual user message summary - **GitHub Issue Templates**: Added structured templates for bug reports, feature requests, and platform/agent support requests ## v1.1.0-beta.7 (2026-03-02) (see v1.1.0 above — beta.7 changes are included in the stable release) ## v1.1.0-beta.6 (2026-02-28) ### New Features - **QQ Platform** (Beta): Support QQ messaging via OneBot v11 / NapCat WebSocket - **Cron Scheduling**: Schedule recurring tasks via `/cron` command or CLI (`cc-connect cron add`), with JSON persistence and agent-aware session injection - **Feishu Emoji Reaction**: Auto-add emoji reaction (default: "OnIt") on incoming messages to confirm receipt; configurable via `reaction_emoji` - **Display Truncation Config**: New `[display]` config section to control thinking/tool message truncation (`thinking_max_len`, `tool_max_len`); set to 0 to disable truncation - **`/version` Command**: Check current cc-connect version from within chat ### Bug Fixes - **Windows `/list` fix**: Claude Code sessions now discoverable on Windows despite drive letter colon in project key paths - **CLAUDECODE env filter**: Prevent nested Claude Code session crash by filtering CLAUDECODE env var from subprocesses ### Docs - Clarified global config path `~/.cc-connect/config.toml` in INSTALL.md - Fixed markdown image syntax in Chinese README ## v1.1.0-beta.5 (2026-03-01) ### New Features - **Gemini CLI Agent**: Full support for `gemini` CLI with streaming JSON, mode switching, and provider management - **Cursor Agent**: Integration with Cursor Agent CLI (`agent`) with mode and provider support ## v1.1.0-beta.4 (2026-03-01) ### Bug Fixes - Fixed npm install: check binary version on install, replace outdated binary instead of skipping - Added auto-reinstall logic for outdated binaries in `run.js` ## v1.1.0-beta.3 (2026-03-01) ### New Features - **Voice Messages (STT)**: Transcribe voice messages to text via OpenAI Whisper, Groq Whisper, or SiliconFlow SenseVoice; requires `ffmpeg` - **Image Support**: Handle image messages across platforms with multimodal content forwarding to agents - **CLI Send**: `cc-connect send` command and internal Unix socket API for programmatic message sending - **Message Dedup**: Prevent duplicate processing of WeChat Work messages ## v1.1.0-beta.2 (2026-03-01) ### New Features - **Provider Management**: `/provider` command for runtime API provider switching; CLI `cc-connect provider add/list` - **Configurable Data Dir**: Session data stored in `~/.cc-connect/` by default (configurable via `data_dir`) - **Markdown Stripping**: Plain text fallback for platforms that don't support markdown (e.g. WeChat) ## v1.1.0-beta.1 (2026-03-01) ### New Features - **Codex Agent**: OpenAI Codex CLI integration - **Self-Update**: `cc-connect update` and `cc-connect check-update` commands - **I18n**: Auto-detect language, `/lang` command to switch between English and Chinese - **Session Persistence**: Sessions saved to disk as JSON, restored on restart ## v1.0.1 (2026-02-28) - Bug fixes and stability improvements ## v1.0.0 (2026-02-28) - Initial release - Claude Code agent support - Platforms: Feishu, DingTalk, Telegram, Slack, Discord, LINE, WeChat Work - Commands: `/new`, `/list`, `/switch`, `/history`, `/quiet`, `/mode`, `/allow`, `/stop`, `/help`