跳到正文
技术博客 / 长期维护

把 cc-connect 的特殊交互真正接到 Discord

记录我给 cc-connect 补齐 Discord 特殊展示链路的过程,包括 todo 面板、plan 选择、权限按钮、工具状态回流,以及 quiet 模式边界修正。

作者
gebimaster
发布时间
阅读时长
4 分钟

这次我想补的,不是普通聊天消息,而是更像 Cursor IDE 那种过程态展示:todo / plan 要有独立面板,工具调用要能看到状态,权限请求要能点按钮,方案选择要能直接在 Discord 里提交。

这件事真正难的地方,不是“会不会发消息”,而是整条链路能不能稳定地把特殊事件识别出来,并在 Discord 上用合适的组件展示出来。

一开始卡住的地方其实不止一个

用户最开始的反馈很典型:todo 好像有了,但一会就没了;plan 选择像是闪一下就结束;有些过程信息直接退化成普通文本。

我回头看日志和会话内容,最后确认问题主要有三个:

• EventResult 阶段普通文本发送得太早,choice prompt 分支被绕过去了

• choice parser 只认 A / B / C,不认“方案 1 / 方案 2”这种真实输出

• quiet 的边界太粗,连 todo / plan 也一起压掉了

所以后面不是补一个判断,而是把 engine、parser、Discord 组件、事件回流一起串起来。

这次补齐了哪些能力

1. 执行面板

我把 todo 和 tool use / tool result 统一收进一个执行面板里,用 Discord embed 的形式展示。这样用户在频道里不需要翻很多条消息,就能看到当前计划、执行中的工具和已经完成的工具。

状态上只保留最关键的两种:

• 🔄 进行中

• ✅ 已完成

这种展示方式比纯文本更适合 Discord,因为它天然适合“持续更新同一块区域”,而不是一条一条刷屏。

2. plan 选择不再靠手输

第二块是选择交互。我在 Discord 侧加了下拉选择和提交按钮,并且限制只有当前任务发起人能操作。用户选完之后,结果会重新作为消息送回 agent。

这意味着 plan 不再只是“助手输出几个方案,然后你手动回一段文本”,而是真正变成一个可点击的交互面板。

3. parser 支持编号方案列表

真正导致 plan 长期“不通”的根因,是模型的实际输出经常长这样:

• 方案 1:个人作品馆

• 方案 2:专注与任务管理台

• 方案 3:数字花园 / 灵感收藏册

或者:

• 1. 个人作品集网站

• 2. 习惯打卡 / 目标追踪器

• 3. 个人知识库 / 灵感收藏站

但旧 parser 只会抓这种格式:

• A. 方案一

• B. 方案二

• C. 方案三

所以我后面扩展了选择解析逻辑,同时支持:

• A / B / C 选项

• 方案 1:xxx

• ### 方案 2:xxx

• ### 1. xxx

并把最终提交值统一成“选 1”这种格式,这样 Discord 组件和模型文案的预期也能保持一致。

TypeScript
1if (cps, ok := p.(ChoicePromptSender); ok) {
2 if (groups, ok := parseChoicePrompt(fullResponse); ok) {
3 sp.finish("")
4 if err := cps.SendChoicePrompt(e.ctx, replyCtx, fullResponse, groups); err == nil {
5 return
6 }
7 }
8}

上面这个优先级调整其实很关键:先发 choice prompt,再决定要不要回退到普通文本。否则面板永远抢不过最终回复。

4. quiet 只静音 thinking / tool,不影响 todo / plan

后面用户又提了一个很对的点:quiet 不应该把 todo / plan 也一起干掉。

因为对真实工作流来说,todo / plan 本身就是任务脉络,不是噪音。真正需要安静下来的,是:

• thinking

• tool message

所以最后我把 quiet 的边界重新划清:

• 开启 quiet 后,thinking 和 tool 消息隐藏

• todo / plan 仍然显示

这个调整不大,但体验差异很明显:频道安静了很多,但任务过程没有断。

这次主要改了哪些位置

这次比较关键的文件主要有这些:

• core/engine.go

• core/interfaces.go

• core/engine_test.go

• platform/discord/discord.go

• agent/codex/session.go

• agent/cursor/session.go

可以把它理解成三层:

• agent 层负责把 tool、todo、result 这些事件吐出来

• engine 层负责决定哪些事件该走特殊渲染

• discord 层负责把它们变成按钮、下拉框和执行面板

只有这三层都对上了,Discord 里看起来才会像一个工作台,而不是日志转发器。

我最后的判断

这次改完以后,Discord + cc-connect + Codex / Cursor 这套组合才真正像一个可以长期使用的系统:

• 有计划面板

• 有工具状态

• 有权限交互

• 有方案选择

• quiet 也不会吞掉关键过程信息

对我来说,这类改动最有价值的地方,不是多了几个炫技组件,而是把原本一碰就断的链路,变成真正能放进日常工作流的东西。

公开评论

讨论区

0

这里保留已经通过审核的公开评论。补充经验、纠错或提出不同判断都可以。

还没有公开展示的评论。如果你有补充经验或不同看法,欢迎留下第一条。

参与讨论

发表评论

提交后会先进入后台审核,通过后才会显示在文章下方;短时间内频繁提交会被限制。

会公开显示在评论里。
提交后会先进入审核,再公开展示。最多 500 字
通常会在审核后显示在这里。