实现 Worker Stdio Session Control(用户指令透传)
概述
实现 Worker-Session-Control-Spec.md 中定义的 10 个 worker stdio 命令,
让用户通过 Slack/飞书平台使用 /compact、/context、/clear 等原地操作指令,
无需杀进程重启。
Spec: docs/specs/Worker-Session-Control-Spec.md
验证脚本: scripts/test_cc_context.py(10/10 命令已在 CC 协议层验证通过)
动机
| 现状 |
问题 |
/reset = 杀进程 + 新建 |
延迟 5-10s 冷启动,丢失 session 连续性 |
| 无 context 可见性 |
用户无法感知 token 消耗,直到 API 报错 |
| 无法原地压缩 |
对话变长后只能全量 reset,浪费已有上下文 |
架构
现有 Control Command(进程级):
Messaging → ParseControlCommand → SM.Transition() → Worker.Terminate()
特征:改变 session 状态,进程重启/终止
Worker Stdio Command(协议级):
Messaging → ParseWorkerCommand → handleWorkerCommand → Worker.Input/SendControlRequest
特征:session 状态不变,stdin/stdout 原地交互
实施阶段
Phase 1: 类型定义(无外部依赖)
Phase 2: Messaging 层命令解析(无外部依赖)
Phase 3: Claude Code Worker — ControlRequester
Phase 4: Gateway Handler 集成
Phase 5: OpenCode Server Worker(可与 Phase 4 并行)
Phase 6: Messaging 平台渲染
测试
能力矩阵
| 命令 |
分类 |
CC |
OpenCode Server |
/context |
Control Request |
4/4 |
3/4(mcp_status 间接) |
/mcp |
Control Request |
✅ |
⚠️ 间接 |
/model <name> |
Control Request + Passthrough |
✅ |
✅(per-message) |
/perm <mode> |
Control Request |
✅ |
✅ |
/compact |
Passthrough |
✅ |
✅ |
/clear |
Passthrough |
✅ |
✅(session 重建) |
/effort <level> |
Passthrough |
✅ |
❌ 不支持 |
/rewind |
Passthrough |
✅ |
✅(更强,含文件回退) |
/commit |
Passthrough |
✅ |
✅ |
| 自然语言 |
NL 触发 |
✅ |
✅ |
风险
| 风险 |
概率 |
影响 |
缓解 |
CC idle 时 get_context_usage 不响应 |
中 |
挂起 |
30s ctx 超时兜底 |
| OpenCode clear 重建 session ID 变化 |
高 |
连接断开 |
clear 后需通知 Gateway 更新 session 映射 |
/commit 在自动化上下文误触发 |
中 |
git 污染 |
仅对授权用户开放 |
| pendingRequests map 内存泄漏 |
低 |
内存泄漏 |
ctx cancel 时清理;response 后 delete |
/rewind CC 只回退对话不回退文件 |
低 |
用户困惑 |
渲染时明确提示范围 |
参考资料
- Spec:
docs/specs/Worker-Session-Control-Spec.md
- 验证脚本:
scripts/test_cc_context.py
- 相关已实现:
internal/messaging/control_command.go(现有 ParseControlCommand)
实现 Worker Stdio Session Control(用户指令透传)
概述
实现
Worker-Session-Control-Spec.md中定义的 10 个 worker stdio 命令,让用户通过 Slack/飞书平台使用
/compact、/context、/clear等原地操作指令,无需杀进程重启。
Spec:
docs/specs/Worker-Session-Control-Spec.md验证脚本:
scripts/test_cc_context.py(10/10 命令已在 CC 协议层验证通过)动机
/reset= 杀进程 + 新建架构
实施阶段
Phase 1: 类型定义(无外部依赖)
pkg/events/events.go:ContextUsage/MCPStatus/WorkerCommandEventTypeWorkerStdioCommand类型(10 个常量:StdioContextUsage,StdioMCPStatus,StdioSetModel,StdioSetPermMode,StdioCompact,StdioClear,StdioModel,StdioEffort,StdioRewind,StdioCommit)IsPassthrough()方法WorkerCommandData/ContextUsageData/MCPStatusDatastructContextCategory/ContextSkillInfostructPhase 2: Messaging 层命令解析(无外部依赖)
internal/messaging/control_command.go:WorkerCommandResultstructworkerSlashMap(10 项 slash 命令映射)workerNLMap(14 项自然语言触发映射)ParseWorkerCommand()函数ParseControlCommand优先于ParseWorkerCommandPhase 3: Claude Code Worker — ControlRequester
internal/worker/claudecode/control.go:pendingRequestsmap(map[string]chan map[string]any)SendControlRequest()— 发送control_request到 CC stdin,等待control_responseDeliverResponse()— 路由control_response到 pending channelreadOutput中新增control_responsecase,调用DeliverResponseinternal/worker/claudecode/worker.go:SendControlRequest()方法(委托到control.SendControlRequest)internal/worker/claudecode/mapper.go:mapContextUsageResponse()— CC JSON →ContextUsageDatamapMCPStatusResponse()— CC JSON →MCPStatusDataPhase 4: Gateway Handler 集成
internal/gateway/handler.go:handleWorkerCommand()方法worker.Input("/compact", nil)SendControlRequest()+ broadcast responseHandle()中新增WorkerCommandevent type 分发Phase 5: OpenCode Server Worker(可与 Phase 4 并行)
新增
internal/worker/opencodeserver/commands.go:ServerCommander结构体(嵌入 HTTP client)ControlRequester接口:SendControlRequest()委托到 HTTP RESTWorkerCommander接口:Compact()/Clear()/Rewind()queryContextUsage()— 聚合 message tokenssetModel()/setPermissionMode()internal/worker/opencodeserver/worker.go:ServerCommanderControlRequester/WorkerCommander接口Phase 6: Messaging 平台渲染
internal/messaging/feishu/adapter.go:context_usage事件渲染为 CardKit 互动卡片mcp_status事件渲染为 CardKit 互动卡片internal/messaging/slack/adapter.go:context_usage事件渲染为 Block Kitmcp_status事件渲染为 Block Kit测试
control_command_test.go:新增ParseWorkerCommand测试(10 项 slash + 14 项 NL + 优先级验证)claudecode/control_test.go:SendControlRequest+DeliverResponse路由测试claudecode/mapper_test.go:mapContextUsageResponse+mapMCPStatusResponse测试gateway/handler_test.go:handleWorkerCommandpassthrough + control_request 测试opencodeserver/commands_test.go:HTTP mock 测试(若可行)能力矩阵
/context/mcp/model <name>/perm <mode>/compact/clear/effort <level>/rewind/commit风险
get_context_usage不响应/commit在自动化上下文误触发/rewindCC 只回退对话不回退文件参考资料
docs/specs/Worker-Session-Control-Spec.mdscripts/test_cc_context.pyinternal/messaging/control_command.go(现有ParseControlCommand)