Skip to content

Latest commit

 

History

History
1212 lines (977 loc) · 33.2 KB

File metadata and controls

1212 lines (977 loc) · 33.2 KB

CodeActor 系统架构文档

版本:v1.0.0 | 最后更新:2025年

目录


1. 概述

CodeActor 是一个用 Go 语言构建的 AI 驱动自主编码系统。它采用多 Agent 协作架构,通过 LLM(大语言模型)驱动,能够自主完成代码分析、编写、调试和运维等复杂任务。

核心特性

  • 多 Agent 协作:6 个专业子 Agent + 1 个编排者,各司其职
  • 工具丰富:20+ 种内置工具,覆盖文件操作、代码搜索、系统命令等
  • 内存管理:对话记忆 + 本地便签,自动修复 tool_call 配对
  • 上下文压缩:异步增量压缩,智能摘要,支持热重载配置
  • 安全守卫:工作区权限检查 + 用户确认机制
  • 多表示层:TUI、Web UI、VS Code 扩展,统一协议

项目结构

codeactor-agent/
├── internal/
│   ├── agents/        # Agent 系统核心
│   ├── tools/         # 工具系统
│   ├── llm/           # LLM 引擎抽象
│   ├── memory/        # 内存系统
│   ├── messaging/     # 消息系统
│   ├── compact/       # 上下文压缩引擎
│   ├── browser/       # 浏览器自动化
│   ├── config/        # 配置系统
│   ├── app/           # 应用入口
│   ├── tui/           # 终端 UI
│   ├── http/          # HTTP/WebSocket 服务
│   ├── protocol/      # 协议定义
│   └── ...
├── codexray/          # Rust 代码分析引擎
├── vscode/            # VS Code 扩展
├── webui/             # Web 前端
├── protocol/          # 协议 Schema
└── config/            # 配置文件

2. 整体架构分层

CodeActor 采用经典的四层架构设计,从上到下依次为:

graph TB
    subgraph "表示层"
        TUI[TUI - Bubble Tea]
        WEB[Web UI - React]
        VSIX[VS Code 扩展]
    end

    subgraph "通信层"
        HTTP[HTTP/WebSocket 服务]
        MB[消息总线 - 发布/订阅]
        WS[WebSocket 推送]
    end

    subgraph "核心引擎层"
        CA[CodeActor 应用]
        subgraph "Agent 编排"
            COND[ConductorAgent 编排者]
            subgraph "子 Agent"
                REPO[RepoAgent]
                CODE[CodingAgent]
                CHAT[ChatAgent]
                META[MetaAgent]
                DEVOPS[DevOpsAgent]
                BR[BrowserAgent]
            end
        end
        subgraph "支撑系统"
            TOOLS[工具系统]
            LLM[LLM 引擎]
            MEM[内存系统]
            COMPACT[上下文压缩]
            GUARD[WorkspaceGuard]
        end
    end

    subgraph "外部服务层"
        CR[codexray - Rust 引擎]
        LLM_API[LLM 提供商 API]
        CHROME[无头 Chrome]
    end

    TUI --> HTTP
    WEB --> HTTP
    VSIX --> HTTP
    HTTP --> WS
    HTTP --> CA
    CA --> MB
    COND --> REPO
    COND --> CODE
    COND --> CHAT
    COND --> META
    COND --> DEVOPS
    COND --> BR
    REPO --> CR
    CODE --> TOOLS
    COND --> LLM
    COND --> MEM
    COND --> COMPACT
    TOOLS --> GUARD
    COND --> LLM_API
    BR --> CHROME
Loading

分层说明

层级 职责 关键组件
表示层 用户交互界面 TUI、Web UI、VS Code 扩展
通信层 进程间通信、事件分发 HTTP Server、WebSocket、消息总线
核心引擎层 业务逻辑、AI 推理 ConductorAgent、子 Agent、工具、LLM、内存
外部服务层 外部能力集成 codexray、LLM API、浏览器

3. Agent 系统

3.1 Agent 接口与基础

系统中所有 Agent 都实现统一的 Agent 接口:

// internal/agents/types.go
type Agent interface {
    Name() string
    Run(ctx context.Context, input string) (AgentResult, error)
}

type AgentResult struct {
    Text   string
    Memory []memory.ChatMessage
}

type BaseAgent struct {
    LLM       llm.Engine
    Publisher *messaging.MessagePublisher
}

设计要点

  • Name() 返回 Agent 的唯一标识(snake_case 格式)
  • Run() 接收任务描述字符串,返回文本结果和完整的内部对话历史
  • AgentResult.Memory 包含 IsSubAgent=true 的完整对话记录,供 Conductor 注入主上下文

3.2 ConductorAgent 编排器

ConductorAgent 是整个系统的"大脑",位于 internal/agents/conductor.go,负责:

  1. 任务评估:分析用户意图,选择合适的子 Agent
  2. 委派调度:通过工具调用将任务分发给子 Agent
  3. 结果聚合:收集子 Agent 输出,整合为最终回复
  4. 流程控制:状态管理、重试、熔断、上下文压缩协调

3.2.1 Conductor 结构

type ConductorAgent struct {
    BaseAgent
    // 6 个子 Agent 引用
    RepoAgent      *RepoAgent
    CodingAgent    *CodingAgent
    ChatAgent      *ChatAgent
    MetaAgent      *MetaAgent
    DevOpsAgent    *DevOpsAgent
    BrowserAgent   *BrowserAgent
    
    // 工具适配器列表
    Adapters       []*tools.Adapter
    
    // 上下文压缩
    compactEngine  *compact.Engine
    asyncCompactor *compact.AsyncCompactor
    
    // 容错机制
    stepRetries          int
    circuitBreakerThreshold    int
    circuitBreakerResetTimeout time.Duration
    consecutiveLLMFailures     int
    
    // 动态 Agent 注册
    customAgents map[string]*CustomAgent
    
    // 结果压缩
    resultCompressor *ResultCompressor
}

3.2.2 委派工具链

Conductor 通过 Adapters 向 LLM 暴露工具,核心是 6 个委派工具:

工具名 目标 Agent 用途
delegate_repo RepoAgent 代码分析、语义搜索
delegate_coding CodingAgent 文件读写、代码编辑
delegate_chat ChatAgent 一般对话、解释
delegate_meta MetaAgent 自定义 Agent 生成
delegate_devops DevOpsAgent 系统运维、Shell 命令
delegate_browser BrowserAgent 浏览器自动化

3.2.3 Conductor Run 流程

sequenceDiagram
    participant User as 用户
    participant CA as CodeActor
    participant COND as ConductorAgent
    participant LLM as LLM API
    participant TOOL as 工具/子Agent
    participant MEM as 内存系统

    User->>CA: 输入任务
    CA->>COND: Run(ctx, task)
    COND->>MEM: 加载对话历史
    COND->>COND: Assess 阶段
    
    loop 最多 N 步
        COND->>LLM: 发送消息+工具定义
        LLM-->>COND: 响应(tool_call/text)
        
        alt tool_call
            COND->>TOOL: 执行委派/工具
            TOOL-->>COND: 执行结果
            COND->>MEM: 记录 tool_call/result
        else text
            COND->>MEM: 记录助手回复
            COND->>COND: 检查结果
            alt 需要更多步骤
                COND->>COND: 继续循环
            else 完成
                break
            end
        end
        
        alt 连续失败
            COND->>COND: 检查熔断器
            alt 触发熔断
                COND->>COND: 指数退避等待
            end
        end
    end
    
    COND->>COND: 压缩上下文(如需)
    COND->>MEM: 注入子 Agent 内存
    COND-->>CA: AgentResult
    CA-->>User: 最终回复
Loading

3.2.4 容错机制

熔断器(Circuit Breaker)

// 连续 LLM 调用失败时触发熔断
if a.consecutiveLLMFailures >= a.circuitBreakerThreshold {
    // 指数退避重试
    time.Sleep(backoffDuration)
}

步骤重试(Step Retries)

  • 当 LLM 返回无效响应时,自动重试当前步骤
  • 重试次数从配置 config.LLM.StepRetries 读取

tool_call 配对修复

  • 内存系统自动检测并修复 tool_call / tool_response 不匹配
  • 防止截断或压缩破坏原子性

3.3 子 Agent 详解

3.3.1 RepoAgent(代码分析 Agent)

职责:代码库深度分析、语义搜索、代码结构理解

核心工具

  • semantic_search:语义代码搜索
  • query_code_skeleton:获取代码骨架
  • query_code_snippet:获取代码片段
  • read_file:文件读取
  • search_by_regex:正则搜索

外部依赖:通过 HTTP 调用 codexray 服务(Rust 引擎)

// RepoAgent 工具链
RepoOps = NewRepoOperationsTool(codexrayURL, workDir)

3.3.2 CodingAgent(编码 Agent)

职责:文件编辑、代码生成、构建执行

核心工具

  • read_file:读取文件内容
  • create_file:创建新文件
  • search_replace_in_file:搜索替换文本
  • run_bash:执行 Shell 命令
  • thinking:思考工具
  • micro_agent:微 Agent 调用

3.3.3 ChatAgent(对话 Agent)

职责:一般对话、问题解答、非编码任务

核心工具

  • thinking:思考工具
  • micro_agent:微 Agent 调用
  • 注意:ChatAgent 无文件操作权限,纯对话 Agent

3.3.4 MetaAgent(元 Agent / Agent 设计师)

职责:动态生成自定义 Agent 设计

工作方式

  1. 接收自然语言描述
  2. 单次 LLM 调用生成 JSON 设计输出
  3. Conductor 解析 JSON,注册为新 Agent

输出格式

{
  "thinking": "...",
  "agent_name": "my_custom_agent",
  "agent_design": "系统提示词...",
  "tools_used": ["read_file", "search_by_regex"],
  "task_for_agent": "任务描述模板..."
}

3.3.5 DevOpsAgent(运维 Agent)

职责:系统管理、Shell 命令、文件检查、日志分析

核心工具

  • run_bash:执行任意 Shell 命令
  • read_file / search_by_regex:文件检查
  • file_operations:文件管理

3.3.6 BrowserAgent(浏览器自动化 Agent)

职责:驱动无头 Chrome 完成 Web 操作

技术栈:go-rod(Chrome DevTools Protocol 客户端)

核心能力

  • 页面导航
  • 元素操作
  • 截图
  • JavaScript 执行

3.4 委派图(DelegationGraph)

委派图是一个 静态 DAG(有向无环图),定义 Agent 间的委派权限,防止循环调用。

type DelegationGraph map[string][]string

// 默认委派关系
func DefaultDelegationGraph() DelegationGraph {
    return DelegationGraph{
        "conductor": {"repo", "coding", "chat", "meta", "devops", "browser"},
        "coding":    {"repo"},
        "devops":    {"repo"},
        "browser":   {"repo"},
        "repo":      {},  // 叶子节点
        "chat":      {},  // 叶子节点
        "meta":      {},  // 叶子节点
    }
}
graph LR
    COND[Conductor] --> REPO[Repo]
    COND --> CODE[Coding]
    COND --> CHAT[Chat]
    COND --> META[Meta]
    COND --> DEVOPS[DevOps]
    COND --> BR[Browser]
    CODE --> REPO
    DEVOPS --> REPO
    BR --> REPO
Loading

验证算法:DFS 三色标记法检测环

  • 0 = 未访问(白色)
  • 1 = 正在访问(灰色)
  • 2 = 已完成(黑色)

拓扑排序:Kahn 算法,从叶子到根排序

3.5 状态机(StateMachine)

状态机管理 Conductor 的运行阶段,确保流程可控。

stateDiagram-v2
    [*] --> idle: 初始状态
    idle --> planning: 收到新任务
    planning --> executing: 开始执行
    planning --> idle: 无需执行
    planning --> error: 规划失败
    executing --> reviewing: 步骤完成
    executing --> planning: 需要重新规划
    executing --> error: 执行失败
    reviewing --> done: 结果满意
    reviewing --> planning: 需要修改
    reviewing --> error: 审查失败
    done --> idle: 新任务
    error --> planning: 重试
    error --> idle: 放弃
Loading

状态定义

状态 含义 允许转换
idle 空闲 → planning
planning 规划中 → executing, error, idle
executing 执行中 → reviewing, error, planning
reviewing 审查中 → done, planning, error, idle
done 完成 → idle
error 错误 → planning, idle

4. 工具系统

工具系统位于 internal/tools/,提供统一、安全的工具调用接口。

4.1 Adapter 模式

Adapter 是工具系统的核心抽象,将函数包装为 LLM 可用的工具定义:

// internal/tools/adapter.go
type ToolFunc func(ctx context.Context, params map[string]interface{}) (interface{}, error)

type Adapter struct {
    name        string
    description string
    fn          ToolFunc
    schema      map[string]interface{}
    guard       *WorkspaceGuard
}

关键方法

  • NewAdapter(name, description, fn):创建适配器
  • WithSchema(schema):设置 JSON Schema
  • Call(ctx, input):执行工具调用,自动触发 guard 检查
  • ToToolDef():转换为 LLM 的 ToolDef 格式

工作流程

sequenceDiagram
    participant LLM as LLM
    participant ADP as Adapter
    participant GUARD as WorkspaceGuard
    participant FN as 业务函数

    LLM->>ADP: Call(ctx, JSON input)
    ADP->>ADP: 解析 JSON → params
    alt 危险操作
        ADP->>GUARD: Check(toolName, params)
        GUARD-->>ADP: needsAuth + reason
        alt 需要授权
            GUARD->>GUARD: RequestAuth(ctx)
            alt 用户拒绝
                GUARD-->>ADP: error
                ADP-->>LLM: 错误
            end
        end
    end
    ADP->>FN: fn(ctx, params)
    FN-->>ADP: result
    ADP->>ADP: 序列化为 JSON
    ADP-->>LLM: 结果字符串
Loading

4.2 工具注册表(Registry)

Registry 是线程安全的工具注册表,支持注册/查找/列表:

type Registry struct {
    tools   map[string]*Adapter
    mu      sync.RWMutex
}

特性

  • 线程安全(读写锁)
  • 按名称索引
  • 支持批量获取(用于 LLM 系统提示)

4.3 WorkspaceGuard 安全守卫

WorkspaceGuard 在执行危险操作前检查文件路径,确保操作在工作区内:

type WorkspaceGuard struct {
    workspacePath     string
    confirmMgr        *UserConfirmManager
    sessionAllowed    map[string]bool  // 会话级授权工具
    sessionAllAllowed bool             // 会话内全部授权
    projectAuthorized bool             // 项目永久授权
}

危险工具列表

工具名 检查类型
create_file 路径在工作区内
search_replace_in_file 路径在工作区内
delete_file 路径在工作区内
rename_file 路径在工作区内
run_bash 命令白名单检查

授权级别

  1. 单次授权(allow/yes):仅本次生效
  2. 会话授权(allow_session):本次会话内该工具免审
  3. 会话全部授权(allow_all_session):本次会话内所有工具免审
  4. 项目永久授权(allow_all_project):持久化到 settings.json

4.4 委派适配器(DelegateAdapter)

将 Agent 包装为 delegate_<name> 工具,使其他 Agent 可直接调用:

func NewDelegateAdapter(name, description string, target AgentRunner) *Adapter {
    toolName := "delegate_" + name
    return NewAdapter(toolName, description, func(ctx, params) {
        task := params["task"].(string)
        return target.Run(ctx, task)
    }).WithSchema({...})
}

4.5 核心工具列表

类别 工具 说明
文件操作 read_file 读取文件内容
create_file 创建新文件
search_replace_in_file 搜索并替换文本块
delete_file 删除文件
rename_file 重命名文件
搜索 search_by_regex 正则表达式搜索
semantic_search 语义代码搜索(调用 codexray)
query_code_skeleton 获取代码骨架
query_code_snippet 获取代码片段
系统 run_bash 执行 Shell 命令
认知 thinking 思考工具
micro_agent 创建子任务
deepthinking 深度分析
委派 delegate_repo 委派代码分析
delegate_coding 委派编码任务
delegate_chat 委派对话
delegate_meta 委派 Agent 设计
delegate_devops 委派运维任务
delegate_browser 委派浏览器操作

5. LLM 引擎

5.1 Engine 接口

LLM 引擎抽象层,支持多种 LLM 提供商:

// internal/llm/engine.go
type Engine interface {
    GenerateContent(ctx context.Context, messages []Message, tools []ToolDef, opts *CallOptions) (*Response, error)
    Model() string
}

实现

  • EngineOpenAI:OpenAI 兼容接口(支持 Claude、Gemini 等)

5.2 消息与工具定义格式

消息格式

type Message struct {
    Role       Role       // system/user/assistant/tool
    Content    string     // 文本内容
    ToolCalls  []ToolCall // 工具调用
    ToolCallID string     // 工具调用 ID(tool 角色回复用)
    ToolName   string     // 工具名称
    Reasoning  string     // 推理内容(DeepSeek 等)
}

工具定义

type ToolDef struct {
    Type     string      // "function"
    Function FunctionDef
}

type FunctionDef struct {
    Name        string         // 工具名称
    Description string         // 工具描述
    Parameters  map[string]any // JSON Schema
}

5.3 多模型支持

CodeActor 支持为不同 Agent 和工具配置不同的 LLM 模型:

配置层级:
  1. per-agent 引擎(优先级最高)
  2. per-tool 引擎
  3. 默认引擎
// 引擎解析
conductorEngine = client.GetAgentEngine("conductor")
codingEngine    = client.GetAgentEngine("coding")
microAgentEngine = client.GetToolEngine("micro_agent")

优势

  • 简单任务使用低成本模型
  • 复杂推理使用高质量模型
  • 微 Agent 可以使用独立模型

6. 内存系统

6.1 ConversationMemory(对话内存)

管理完整的对话上下文,支持多角色和子 Agent 分组:

// internal/memory/memory.go
type ChatMessage struct {
    Type       MessageType     // system/human/assistant/tool
    Content    string
    ToolCalls  []ToolCallData
    ToolCallID *string
    Timestamp  time.Time
    Metadata   map[string]interface{}

    // 子 Agent 分组元数据
    GroupID    string  // 同一 sub-agent 调用共享
    ParentID   string  // 指向 Conductor 的 tool_call_id
    IsSubAgent bool    // 快速过滤标记
}

type ConversationMemory struct {
    Messages []ChatMessage
    MaxSize  int  // 默认 300 条
}

核心功能

  1. 自动截断:超过 MaxSize 时移除最旧的非系统消息
  2. tool_call 配对修复:截断后自动修复不匹配的 tool_call
  3. 子 Agent 隔离ToMessages() 自动跳过 IsSubAgent 消息
  4. Sub-agent 注入:子 Agent 完成后,Conductor 将完整 Memory 注入主上下文

6.2 LocalMemory(本地便签内存)

Agent 私有便签,不跨 Agent 共享:

type LocalMemory struct {
    // 每个 Agent 实例独立的私有存储
    data map[string]string
    mu   sync.RWMutex
}

用途

  • Agent 内部状态追踪
  • 任务上下文缓存
  • 避免重复 LLM 调用

7. 事件/消息系统

7.1 发布-订阅架构

graph LR
    PUB[Publisher] --> DIS[Dispatcher]
    DIS --> C1[Consumer 1 - TUI]
    DIS --> C2[Consumer 2 - Web UI]
    DIS --> C3[Consumer 3 - Logger]
    
    style PUB fill:#e1f5fe
    style DIS fill:#fff3e0
    style C1 fill:#e8f5e9
    style C2 fill:#e8f5e9
    style C3 fill:#e8f5e9
Loading

核心组件

// MessagePublisher - 发布者
type MessagePublisher struct {
    dispatcher *MessageDispatcher
}

func (p *Publisher) Publish(eventType string, content interface{}, from string) error

// MessageDispatcher - 调度器
type MessageDispatcher struct {
    mainCh        chan *Event
    consumers     map[EventType][]Consumer
    wal           WAL
    backlog       *Backlog
    dlq           *DeadLetterQueue
}

数据流

  1. Agent 通过 Publisher 发布事件
  2. Dispatcher 接收事件,写入 WAL(如启用)
  3. Dispatcher 按 EventType 分发给所有注册 Consumer
  4. 如果主 channel 满,事件进入 Backlog
  5. 如果 Consumer 处理失败,事件进入死信队列

7.2 事件类型

协议定义在 internal/protocol/agent_events.go

事件类型 说明 使用场景
model_info 模型信息 启动时广播当前模型
llm_call_start LLM 调用开始 监控/计时
llm_call_end LLM 调用结束 监控/统计
ai_response AI 响应 显示给用户
tool_call_start 工具调用开始 进度展示
tool_call_result 工具调用结果 进度展示
tool_call_error 工具调用错误 错误处理
context_loaded 上下文加载 进度展示
context_compressed 上下文压缩 状态展示
ai_stream_start 流式响应开始 流式 UI
ai_chunk 流式数据块 流式 UI
ai_stream_end 流式响应结束 流式 UI
user_help_needed 需要用户帮助 权限请求
user_help_response 用户回复 权限决策
conversation_error 对话错误 错误处理
conversation_result 对话完成 任务完成
thinking 思考内容 思考展示

7.3 WAL 持久化与死信队列

WAL(Write-Ahead Log)

  • 异步写入磁盘,确保事件不丢失
  • 支持重启后回放未确认事件
  • 通过 DispatcherOptions.WALPath 配置

Backlog(积压队列)

  • 主 channel 满时,事件溢出到 Backlog
  • 后台协程定期排空 Backlog
  • 可配置最大容量(默认 10000)

DeadLetterQueue(死信队列)

  • Consumer 处理失败的事件进入 DLQ
  • 可配置重试次数(默认 3 次)
  • 支持指数退避重试

8. 上下文压缩引擎

8.1 核心压缩算法

上下文压缩引擎位于 internal/compact/,当对话 token 数超过限制时触发:

type Engine struct {
    config       *Config
    tokenizer    Tokenizer
    priorityCalc *PriorityCalculator
    summarizer   *LLMSummarizer
    state        *CompressionState  // 增量压缩状态
}

压缩流程

flowchart TD
    A[检测 Token 数] --> B{是否超限?}
    B -->|否| C[无需压缩]
    B -->|是| D[计算优先级]
    D --> E[LLM 摘要压缩]
    E --> F[合并摘要栈]
    F --> G[返回压缩结果]
Loading

关键参数

  • MaxContextTokens:上下文 token 上限
  • KeepRecentRounds:保留最近 N 轮完整对话
  • MinSummaryTokens:摘要最小 token 数

8.2 异步增量压缩

双重压缩策略

flowchart LR
    subgraph "异步压缩(后台)"
        A1[持续监听 token 用量] --> A2{超过阈值?}
        A2 -->|是| A3[异步提交压缩任务]
        A3 --> A4[Worker 处理]
        A4 --> A5[结果等待应用]
    end
    
    subgraph "同步压缩(前台)"
        B1[主流程检测] --> B2{接近上限?}
        B2 -->|是| B3[暂停主流程]
        B3 --> B4[强制压缩]
        B4 --> B5[恢复主流程]
    end
Loading

AsyncCompactor 实现:

type AsyncCompactor struct {
    engine     *Engine
    jobQueue   chan *CompactJob      // 任务队列
    dropPolicy DropPolicy            // 队列满策略
    workerID   int
}

丢弃策略

策略 说明 默认值
DropPolicyBlock 阻塞等待 -
DropPolicyDropOldest 丢弃最旧任务
DropPolicyDropNewest 丢弃新任务 -

8.3 优先级计算

PriorityCalculator 根据多种因素计算消息优先级:

type PriorityWeights struct {
    SystemMessageWeight    float64  // 系统消息权重
    RecentMessageWeight    float64  // 近期消息权重
    ToolCallWeight         float64  // 工具调用权重
    UserMessageWeight      float64  // 用户消息权重
    CriticalMessageWeight  float64  // 关键消息权重
}

优先级越高的消息越可能在压缩时被保留。


9. 外部服务集成

9.1 Codexray 代码分析引擎

Codexray 是一个用 Rust 编写的代码分析引擎,通过 HTTP API 提供语义代码搜索能力:

┌──────────────┐         HTTP/gRPC         ┌──────────────┐
│  CodeActor   │ ──────────────────────▶  │  Codexray    │
│  (Go)        │ ◀──────────────────────  │  (Rust)      │
└──────────────┘                          └──────────────┘

集成方式

  • RepoAgent 通过 HTTP 调用 codexray 服务
  • 端口由 main 函数动态分配

提供的能力

  • 语义代码搜索
  • 代码骨架查询
  • 代码片段提取
  • 代码结构分析

9.2 浏览器自动化

BrowserAgent 使用 go-rod 驱动无头 Chrome:

import "github.com/go-rod/rod"

能力

  • 页面导航
  • 元素查找和操作
  • 截图
  • JavaScript 执行
  • Cookie 管理

10. 表示层

10.1 TUI(终端 UI)

基于 Bubble Tea 框架的终端界面:

import "github.com/charmbracelet/bubbletea"

组件

  • tui_model.go:Bubble Tea Model 实现
  • tui_render.go:渲染逻辑
  • tui_tasks.go:任务管理
  • tui_completion.go:自动补全
  • components/:可复用 UI 组件

10.2 Web UI

React + TypeScript 构建的 Web 界面:

webui/
├── src/          # React 组件
├── public/       # 静态资源
└── package.json  # 依赖

通信协议:WebSocket,使用统一的 Agent Events 协议。

10.3 VS Code 扩展

VS Code 扩展通过 WebSocket 与 CodeActor 通信:

┌──────────────┐  WebSocket   ┌──────────────┐
│ VS Code      │ ◀─────────▶ │ CodeActor    │
│ Extension    │              │ HTTP Server  │
└──────────────┘              └──────────────┘

功能

  • 侧边栏集成
  • 代码操作
  • 实时状态展示

11. 配置系统

配置系统支持热重载,位于 internal/config/

type Config struct {
    LLM     LLMConfig
    Agent   AgentConfig
    Browser BrowserConfig
    // ...
}

特性

  • TOML 格式配置文件
  • 运行时热重载
  • 默认配置 + 用户配置覆盖

12. 关键设计模式

模式 应用位置 说明
Orchestrator ConductorAgent 编排子 Agent 协作
Adapter tools.Adapter 统一工具接口
Strategy 压缩策略、LLM 引擎选择 可切换算法
State Machine StateMachine 状态流转控制
Circuit Breaker ConductorAgent 连续失败时熔断
Retry 指数退避重试 容错机制
Publish-Subscribe MessageDispatcher 事件分发
Factory NewConductorAgent, NewAgent Agent 创建
Decorator Adapter.WithSchema 增强工具定义
Singleton GlobalCtx 全局上下文

13. 数据流图

13.1 任务处理完整数据流

flowchart TB
    subgraph Input ["输入"]
        USER[用户输入]
    end

    subgraph Core ["核心处理"]
        APP[CodeActor.Init]
        COND[ConductorAgent]
        
        subgraph Agents ["Agent 层"]
            REPO[RepoAgent]
            CODE[CodingAgent]
            CHAT[ChatAgent]
            META[MetaAgent]
            DEVOPS[DevOpsAgent]
            BR[BrowserAgent]
        end
        
        subgraph Tools ["工具层"]
            FILEOPS[文件操作]
            SEARCH[搜索工具]
            BASH[Shell 执行]
            CODEXRAY[codexray]
        end
    end

    subgraph State ["状态管理"]
        MEM[ConversationMemory]
        LOCALM[LocalMemory]
        SM[StateMachine]
        COMPACT[Context Compression]
    end

    subgraph Output ["输出"]
        TUI[TUI]
        WEB[Web UI]
        VSIX[VS Code]
    end

    USER --> APP
    APP --> COND
    COND --> Agents
    COND --> Tools
    Agents --> MEM
    COND --> SM
    COND --> COMPACT
    COND --> OUTPUT
    MEM --> COND
    LOCALM --> Agents
    
    Tools --> CODEXRAY
    FILEOPS --> MEM
    SEARCH --> MEM
    BASH --> MEM
    
    COND --> TUI
    COND --> WEB
    COND --> VSIX
Loading

13.2 Agent 间通信数据流

flowchart LR
    subgraph ConductorScope [Conductor 上下文]
        COND[ConductorAgent]
        ADAPTERS[Adapters]
    end
    
    subgraph ToolCallScope [工具调用]
        TOOL_DEF[ToolDef → LLM]
        TOOL_CALL[Tool Call]
        TOOL_RESULT[Tool Result]
    end
    
    subgraph MemoryScope [内存管理]
        CONV_MEM[ConversationMemory]
        SUB_AGENT_MEM[SubAgent Memory]
    end
    
    COND --> ADAPTERS
    ADAPTERS --> TOOL_DEF
    TOOL_DEF --> LLM[LLM API]
    LLM --> TOOL_CALL
    TOOL_CALL --> SUB_AGENTS[子 Agent Run]
    SUB_AGENTS --> TOOL_RESULT
    TOOL_RESULT --> CONV_MEM
    SUB_AGENTS --> SUB_AGENT_MEM
    SUB_AGENT_MEM -.->|注入| CONV_MEM
Loading

14. 术语表

术语 英文 说明
Agent Agent 具有特定能力的 AI 组件
Conductor ConductorAgent 系统的编排者/大脑
Sub-Agent Sub-Agent 被委派任务的专用 Agent
Tool Tool Agent 可使用的操作能力
Adapter Adapter 工具适配器,包装函数为 LLM 可用格式
Delegate Delegate 委派,将一个任务交给另一个 Agent
LLM Large Language Model 大语言模型
Tool Call Tool Call LLM 请求调用工具的请求
WAL Write-Ahead Log 预写日志,用于持久化
DLQ Dead Letter Queue 死信队列,存放处理失败的消息
TUI Text User Interface 终端用户界面
Codexray Codexray Rust 编写的代码分析引擎
Context Compression Context Compression 上下文压缩,减少 token 占用
Circuit Breaker Circuit Breaker 熔断器,连续失败时暂停
State Machine State Machine 状态机,管理流程状态
DAG Directed Acyclic Graph 有向无环图

附录

A. 关键文件索引

文件路径 说明
internal/agents/types.go Agent 接口定义
internal/agents/conductor.go ConductorAgent 实现
internal/agents/delegation.go 委派图定义
internal/agents/state_machine.go 状态机实现
internal/agents/builder.go Agent 构建器
internal/tools/adapter.go 工具适配器
internal/tools/registry.go 工具注册表
internal/tools/workspace_guard.go 工作区守卫
internal/tools/delegate.go 委派适配器
internal/llm/engine.go LLM 引擎接口
internal/llm/engine_openai.go OpenAI 兼容实现
internal/memory/memory.go 对话内存
internal/memory/local.go 本地便签内存
internal/messaging/message_publisher.go 消息发布者
internal/messaging/message_dispatcher.go 消息调度器
internal/messaging/wal.go WAL 持久化
internal/compact/engine.go 压缩引擎
internal/compact/engine_async.go 异步压缩
internal/protocol/agent_events.go 事件类型定义
internal/app/app.go CodeActor 应用入口
internal/config/config.go 配置系统

B. 配置示例

# config/config.toml

[llm]
max_steps = 50
step_retries = 3

[agent]
repo_max_steps = 20
coding_max_steps = 30
chat_max_steps = 10
meta_retry_count = 3

[browser]
enable_browser_agent = false
viewport_width = 1280
viewport_height = 720
timeout_seconds = 30