Add new workflows:
- issue-reply.yml: Automatically greet new issue creators
- stale.yml: Handle stale issues and PRs with automated warnings/closures
Update ci.yml to use go-version-file instead of hardcoded Go version
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>
This adds a new GitHub Actions workflow that:
- Runs on pushes and PRs to main branch
- Sets up Go 1.23 environment with caching
- Downloads dependencies, builds, and runs tests
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>
Added support for managing multiple workspaces including:
- New workspace bind command to link existing directories
- Enhanced session management scoped to workspaces
- Improved error handling with localized messages
- Fixed interactive state lookup for multi-workspace contexts
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>
* feat(wecom): add WebSocket long-connection mode for WeChat Work
Add WeChat Work AI Bot WebSocket support, enabling connection without
public URL, message encryption, or IP allowlist. Key implementation details:
- Use userID as chatid for single-chat scenarios (matching official SDK behavior)
- Add 500ms delay between multi-chunk sends to prevent out-of-order delivery
- Support text and pre-transcribed voice messages
- Exponential backoff reconnection with heartbeat-based dead connection detection
Made-with: Cursor
* docs(readme): add WebSocket mode for WeChat Work; test(wecom): add unit tests for WebSocket implementation
- Update README support matrix, setup guide, config examples and project
structure to include the new WebSocket long-connection mode alongside
existing Webhook
- Add 22 unit tests covering splitByBytes, handleMsgCallback chatID
fallback, writeAndWaitAck, handleFrame ACK dispatch, generateReqID
and newWebSocket
Made-with: Cursor
---------
Co-authored-by: xinlingzhao <xinlingzhao@tencent.com>
Add opt-in `inject_sender` config option for projects. When enabled,
cc-connect prepends a metadata line to each message before forwarding
to the agent:
[cc-connect sender_id=ou_abc123 platform=feishu]
<original message>
This allows agents (Claude Code, Codex, etc.) to identify who sent the
message and adjust behavior accordingly — e.g. personal task views,
role-based access control, or per-user tone.
The feature is off by default and can be enabled per-project:
[[projects]]
inject_sender = true
Closes#91
* feat: add multi-workspace mode and base_dir config fields
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add WorkspaceBindingManager for channel-to-workspace persistence
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add workspacePool for managing per-workspace agent state
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add ChannelNameResolver interface and Slack implementation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add multi-workspace fields, SetMultiWorkspace, and idle reaper to Engine
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add resolveWorkspace method for channel-to-directory mapping
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: wire multi-workspace mode setup in main.go
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add workspace init flow for cloning repos and binding channels
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add /workspace commands (init, unbind, list, status)
Add handleWorkspaceCommand with subcommands:
- (no args): show current workspace binding for the channel
- init <git-url>: clone repo and bind workspace to channel
- unbind: remove workspace binding from channel
- list: show all workspace bindings for the project
Only available when multi-workspace mode is enabled.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: wire multi-workspace routing into handleMessage with per-workspace agents
Add workspace resolution to handleMessage that resolves channels to workspace
directories, creates per-workspace agents with correct work_dir, and routes
messages through workspace-specific session managers. The normal (single-workspace)
code path is unchanged — all new logic is gated behind e.multiWorkspace.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: add integration tests for multi-workspace resolution
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: resolve multi-workspace bugs found during live testing
Three bugs fixed:
1. App mention events not handled - Slack sends `app_mention` events
(not `message.channels`) when the bot is @mentioned. Added
AppMentionEvent handler in the Slack platform.
2. Bot mention prefix not stripped - app_mention text includes
`<@UBOTID> ` prefix, breaking command parsing and workspace
resolution. Now stripped before passing to engine.
3. Slash command syntax incompatible with Slack - `/workspace` commands
were being intercepted by Slack as slash commands. Changed all
user-facing references and prefix detection to use `workspace`
without the leading slash.
Also added debug logging to handleEvent for diagnosing event delivery.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: instruct agent to use Slack mrkdwn formatting
Add Slack formatting guidelines to the agent system prompt so responses
use Slack's mrkdwn syntax instead of standard Markdown (e.g. *bold*
instead of **bold**, no ## headings).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Add support for rich permission prompts using interactive cards when platforms support them. CardButtons now support Extra field for callback data. Implement fallback chain: inline buttons → cards → plain text. Includes i18n support and tests for all platforms.
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>
Add toolTimeoutSec field to Agent and Session structs to allow configurable timeout duration.
Reset pending tool timeout timer when partially completing tools.
Increase default timeout from 45s to 180s.
Add tests for timeout behavior and customization.
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>
Add support for Lark platform alongside Feishu with shared implementation.
Update all error messages to include platform tag prefix.
Refactor platform initialization to handle both Feishu and Lark configurations.
Add tests for Lark platform specific behaviors.
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>
Updated buffer sizes for stdout scanners across all agent sessions:
- Initial buffer size reduced from 1MB to 64KB
- Max buffer size increased from 1MB to 10MB
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>
Add nil checks for card operations in core engine.
Improve token redaction utility and error handling.
Initialize delete mode state properly.
Fix error message in cc-connect update.
Add missing platform allowFrom checks.
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>
1. Unix socket permissions: 0o660 → 0o600 (owner-only access), preventing
other processes in the same group from injecting messages via the API.
2. Telegram bot token redaction: when file downloads fail, the bot token
embedded in the Telegram API URL is now replaced with [REDACTED] in
error messages to prevent token leakage in logs.
3. Startup warning for open allow_from: all platforms now log a WARN-level
message when allow_from is not configured, making it obvious that the
deployment permits all users. This surfaces the fail-open default so
operators can make an informed decision.
Ref #60
Slack dispatches `app_mention` events (not `message` events) when a bot
is @mentioned in a channel. Without handling this event type, the bot
only responds in DMs while silently ignoring channel mentions.
Add a `*slackevents.AppMentionEvent` case to `handleEvent` with the same
validation pipeline (bot filter, old-message guard, AllowList check,
session key generation) used for regular messages.
Also fix stale go.sum checksum for github.com/BurntSushi/toml.
Closes#48
The `cc-connect update` command downloads the bare binary asset (e.g.
`cc-connect-v1.1.0-linux-amd64`), but some releases only publish
archive assets (.tar.gz / .zip). When the bare binary returns HTTP 404,
the updater now falls back to downloading the corresponding archive and
extracting the binary from it.
Closes#25
* feat(cards): interactive card UI for slash commands on Feishu
- Add platform-agnostic Card model (core/card.go) with builder API
- Add CardSender/CardNavigable interfaces (core/interfaces.go)
- Implement Feishu card renderer using column_set for mobile layout
- Redesign all slash command responses to use interactive cards
- Add handleCardNav router and executeCardAction for in-place updates
- Convert /new /quiet /switch /stop to act: and nav: actions
- /help card uses tab buttons grouped by Session/Agent/Tools/System
- renderUpgradeCard: sync update check with 8s timeout
- Fix: return error card instead of nil in handleCardNav /list /switch
Made-with: Cursor
* fix(cards): address PR #52 review feedback
- Add enable_feishu_card config option (default true) so operators can
fall back to plain-text replies when card permissions are unavailable;
wraps Platform in interactivePlatform only when cards are enabled
- Fix goroutine leak in renderUpgradeCard: use buffered channel (cap 1)
so the background goroutine can always complete even after a timeout
- Fix /stop concurrent logic in executeCardAction: consolidate state
mutation under a single interactiveMu critical section
- Fix code indentation in platform/feishu/card.go (action map and
CardSelect/CardNote case blocks)
- Add unit tests for Card.RenderText and Card.HasButtons (core/card_test.go)
- Add Feishu platform tests for ReplyCard/SendCard and card renderer
(platform/feishu/platform_test.go)
- Update docs/feishu.md and README with enable_feishu_card option
Made-with: Cursor
Add screenshot examples demonstrating multi-agent collaboration in Discord
and include star history chart visualization.
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>
Add error handling for silently ignored errors in the QQBot gateway:
- Hello payload parse (heartbeat_interval): log warning on failure
instead of silently falling back to hardcoded default
- READY payload parse (session_id): log warning on failure instead
of storing empty session ID that breaks resume
- InvalidSession payload parse (resumable bool): log warning on
failure instead of always treating as non-resumable
- Heartbeat WriteJSON: log failure for connection diagnostics
Claude Code replaces underscores with hyphens when encoding project
paths as directory names (e.g. sandwichlab_core → sandwichlab-core).
findProjectDir only replaced path separators and colons, causing /list
to return empty for projects with underscores in their path.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add pendingMsgs buffer to geminiSession to accumulate assistant messages before classifying them as either EventThinking or EventText. This improves message handling by deferring classification until we have context from tool use or result events.
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>
Add support for handling interaction queries (webFetch/shell requests) and accumulate thinking deltas in a buffer before emitting completed events. Also adds WebFetch tool call type and debug logging.
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>
Add pending message buffer to accumulate agent messages before classification.
Improve event handling with better logging and support for additional event types.
Add helper functions for text extraction and tool input processing.
Handle turn failures and flush messages appropriately for thinking/text events.
generated by llmgit
Co-Authored-By: Claude <noreply@anthropic.com>