把 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 组件和模型文案的预期也能保持一致。
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 return6 }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 也不会吞掉关键过程信息
对我来说,这类改动最有价值的地方,不是多了几个炫技组件,而是把原本一碰就断的链路,变成真正能放进日常工作流的东西。
讨论区
这里保留已经通过审核的公开评论。补充经验、纠错或提出不同判断都可以。
发表评论
提交后会先进入后台审核,通过后才会显示在文章下方;短时间内频繁提交会被限制。