Skip to content

[feat] Claude Code权限协议: control_request/response 原生支持 #321

@aaronwong1989

Description

@aaronwong1989

摘要

实现 Claude Code --permission-prompt-tool stdio 原生协议,支持运行时权限询问和响应,而不仅仅依赖 YAML AllowedTools 静态配置。

背景

cc-connect 的核心创新之一:使用 --permission-prompt-tool stdio 启动 Claude Code,解析 control_request 事件,通过 stdin 写入 control_response 实现双向权限协议。

当前 HotPlex:权限通过 YAML AllowedTools 静态配置,运行时无法询问用户。

// cc-connect 启动参数
args := []string{
    "--permission-prompt-tool", "stdio",  // 关键!
    "--output-format", "stream-json",
    "--input-format", "stream-json",
}

// 事件: {"type":"control_request","request_id":"xxx","request":{
//   "subtype":"can_use_tool","tool_name":"Bash","input":{...}
// }}
// 响应: {"type":"control_response","response":{
//   "subtype":"success","request_id":"xxx",
//   "response":{"behavior":"allow","updatedInput":{...}}
// }}

提案

  1. 新增事件类型event/events.go):

    • EventControlRequest
    • EventControlCancelRequest
  2. 新增消息类型types/message.go):

    type ControlRequest struct {
        RequestID string
        Request   struct {
            Subtype  string
            ToolName string
            Input    map[string]any
        }
    }
    type PermissionResult struct {
        Behavior     string
        UpdatedInput map[string]any
        Message      string  // deny 时的原因
    }
  3. 改进 session 事件解析internal/engine/session.go):

    • 新增 control_request 事件分支
    • 同步等待 callback 返回 PermissionResult
    • 写入 stdin control_response
  4. 新增权限模式permission-mode=askprovider/claude_provider.go

  5. WebSocket APIinternal/server/controller.go):

    • POST /permission 端点:接收权限决策
    • SSE/流式推送 control_request 事件到客户端

影响文件

  • event/events.go - 新增事件类型常量
  • types/message.go - 新增消息类型
  • provider/claude_provider.go - 新增 permission-mode=ask 选项
  • internal/engine/session.go - 新增 control_request 处理分支
  • internal/server/controller.go - 新增权限响应 API

参考

  • cc-connect: agent/claudecode/session.go handleControlRequest
  • 调研文档: docs/research/cc-connect-compare-proposals.md

来源: cc-connect 竞品调研 | 分支: research/cc-connect-deep-dive

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/engine⚙️ Engine - 核心引擎area/security🛡️ Security - 安全模块 (WAF, 权限)priority/high🟠 P1 - 严重影响用户体验、频繁出现的问题size/medium📏 Medium - 1-3 天工作量status/needs-triage🔍 Needs Triage - 需要进一步评估type/feature✨ Feature - 新功能请求

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions