iFlyCode Agent Service 层与 Action Batch 批量系统完整分析
版本: 3.4.2-222 | 分析日期: 2026-05-11
1. 概述
本文档分析 com/aicode/agent/service/(7 个类)、com/aicode/agent/service/impl/(9 个类)和 com/aicode/action/batch/(含子包 15+ 个类)三个包。Agent Service 层是 iFlyCode 与 Agent 通信的业务逻辑层,Action Batch 是批量操作(批量单测、批量文档)的完整实现。
2. Agent Service 接口层
2.1 ChatService (接口)
路径: com/aicode/agent/service/ChatService职责: 聊天服务接口 — 定义聊天消息发送方法
关键方法:
sendWsMessage(CommandEnum, Object, Project)— 发送 WebSocket 消息sendMessage2webView(Project, Object)— 推送消息到 WebView
2.2 CodeCheckService (接口)
路径: com/aicode/agent/service/CodeCheckService职责: 代码检查服务接口 — 定义代码检查方法
2.3 CodeCompleteService (接口)
路径: com/aicode/agent/service/CodeCompleteService职责: 代码补全服务接口 — 定义代码补全方法
2.4 CommonService (接口)
路径: com/aicode/agent/service/CommonService职责: 通用服务接口 — 定义通用消息处理方法
2.5 GitReviewService (接口)
路径: com/aicode/agent/service/GitReviewService职责: Git 评审服务接口 — 定义 Git 评审方法
2.6 InlineChatCommandService (接口)
路径: com/aicode/agent/service/InlineChatCommandService职责: 内联聊天命令服务接口 — 定义内联聊天命令方法
2.7 RequestTipService (接口)
路径: com/aicode/agent/service/RequestTipService职责: 请求补全服务接口 — 定义代码补全请求方法
3. Agent Service 实现层
3.1 ChatServiceImpl (312 strings) — 最大服务实现
路径: com/aicode/agent/service/impl/ChatServiceImpl职责: 聊天服务实现 — 处理聊天消息的发送和响应
关键方法:
sendWsMessage()— 发送 WebSocket 消息- 构建
MessageDto(id, stream, command, sessionId, modelCode, data, text) - 使用
PluginWebsocketClient.sendWsMessage()发送 - 创建 OpenTelemetry Span 记录发送
- 构建
sendMessage2webView()— 推送消息到 WebView- 使用
WebViewWindowPanel.sendMessage2webView()推送 - 根据
WebViewDataTypeEnum类型分发
- 使用
handleChatResponse()— 处理聊天响应- 解析 Agent 响应 JSON
- 根据
CommandEnum类型分发到不同的处理逻辑 - 流式响应使用
streamStep标识步骤
关键依赖:
PluginWebsocketClient— WebSocket 客户端WebViewWindowPanel— WebView 面板MessageDto— 消息 DTOCommandEnum— 命令枚举WebViewDataTypeEnum— WebView 数据类型OpenTelemetryUtil— APM 工具Gson— JSON 解析AICodeSettingsState— 设置状态
3.2 CodeCheckServiceImpl (189 strings)
路径: com/aicode/agent/service/impl/CodeCheckServiceImpl职责: 代码检查服务实现 — 处理代码检查请求和响应
关键方法:
handleCodeCheckResponse()— 处理代码检查响应- 解析
CodeCheckDto(codeFragment, errorType, errorMessage, codeInfo) - 推送检查结果到 WebView
- 在编辑器中显示检查标记
- 解析
3.3 CodeCompleteServiceImpl (156 strings)
路径: com/aicode/agent/service/impl/CodeCompleteServiceImpl职责: 代码补全服务实现 — 处理代码补全响应
关键方法:
handleCodeCompleteResponse()— 处理代码补全响应- 解析
AgentCodeTip(补全结果) - 使用
Flow.Subscriber处理流式响应 - 调用
EditorManagerService应用补全
- 解析
3.4 CommonServiceImpl (134 strings)
路径: com/aicode/agent/service/impl/CommonServiceImpl职责: 通用服务实现 — 处理通用消息
关键方法:
handleCommonMessage()— 处理通用消息- 处理
USER_PERMISSION— 权限更新 - 处理
REPO_STATUS— 仓库状态 - 处理
USER_KNOWLEDGE_LIST— 知识库列表 - 处理
LOGIN— 登录响应 - 处理
PLUGIN_UPDATE— 插件更新
- 处理
3.5 GitReviewServiceImpl (192 strings)
路径: com/aicode/agent/service/impl/GitReviewServiceImpl职责: Git 评审服务实现 — 处理 Git 评审请求和响应
关键方法:
handleGitReviewResponse()— 处理 Git 评审响应- 解析评审结果(issues, suggestions, score)
- 推送结果到 WebView
3.6 InlineChatCommandServiceImpl (178 strings)
路径: com/aicode/agent/service/impl/InlineChatCommandServiceImpl职责: 内联聊天命令服务实现 — 处理内联聊天请求和响应
关键方法:
handleInlineChatResponse()— 处理内联聊天响应- 解析
InlineChatInfo和响应数据 - 使用
SessionController更新会话状态 - 流式响应使用
streamStep标识步骤 - 调用
DiffService应用代码修改
- 解析
3.7 RequestTipServiceImpl (89 strings)
路径: com/aicode/agent/service/impl/RequestTipServiceImpl职责: 请求补全服务实现 — 处理代码补全请求
关键方法:
requestTip()— 请求代码补全- 构建
CodeGenerateEditorRequest(完整的补全请求上下文) - 使用
PluginWebsocketClient.sendWsMessage()发送 - 创建 OpenTelemetry Span
- 构建
4. Service 层消息分发架构
PluginWebsocketListener.onMessage()
│
▼
SocketMessageHandleListener.handleSocketMessage()
│
├── 解析 JSON → ResponseDto (code, data, command)
│
├── 根据 CommandEnum 分发:
│ ├── CHAT → ChatServiceImpl
│ ├── CODE_CHECK → CodeCheckServiceImpl
│ ├── CODE_COMPLETE → CodeCompleteServiceImpl
│ ├── INLINECHAT_* → InlineChatCommandServiceImpl
│ ├── GIT_DIFF → GitReviewServiceImpl
│ └── 其他 → CommonServiceImpl
│
└── 推送结果到 WebView:
└── WebViewWindowPanel.sendMessage2webView()5. Action Batch 包 — 批量操作系统
5.1 BatchUnitTestAction (基类)
路径: com/aicode/action/batch/BatchUnitTestAction职责: 批量单测 Action — 批量生成单元测试的入口
5.2 BatchUTGeneratorAction
路径: com/aicode/action/batch/BatchUTGeneratorAction职责: 批量单测生成器 Action — 批量生成单元测试
关键逻辑:
- 收集项目中所有符合条件的类
- 过滤排除项(abstract, interface, enum, annotation)
- 对每个类创建
CreateTestFileTask - 使用进度条显示生成进度
- 支持暂停和取消
5.3 BatchUTNodeAction
路径: com/aicode/action/batch/BatchUTNodeAction职责: 批量单测节点 Action — 从项目树节点触发的批量单测
5.4 BatchUTDocAction
路径: com/aicode/action/batch/doc/BatchUTDocAction职责: 批量文档生成 Action — 批量生成文档注释
5.5 Batch/Node 子包
| 类 | 职责 |
|---|---|
| BatchUTTreeNode | 批量单测树节点 — 项目树中的复选框节点 |
| BatchUTTreeNodeRenderer | 树节点渲染器 — 渲染复选框和类名 |
| BatchUTTreeModel | 树模型 — 管理树节点数据 |
| BatchUTTreePanel | 树面板 — 包含树和工具栏的面板 |
| BatchUTProgressPanel | 进度面板 — 显示批量生成进度 |
| BatchUTConfigPanel | 配置面板 — 批量单测的配置选项 |
5.6 批量单测完整流程
1. 用户右键项目/目录 → BatchUTGeneratorAction
│
├── 扫描目录下所有 Java 类
│ └── 过滤: abstract/interface/enum/annotation
│
├── 显示 BatchUTTreePanel
│ ├── BatchUTTreeModel — 树模型
│ ├── BatchUTTreeNode — 复选框节点
│ └── BatchUTTreeNodeRenderer — 渲染器
│
├── 用户选择类 → BatchUTConfigPanel
│ ├── 测试框架选择 (JUnit 4/5, TestNG)
│ ├── Mock 框架选择 (Mockito, PowerMock)
│ ├── 重复规则 (COEXIST/OVERWRITE/SKIP)
│ └── 目标目录选择
│
├── 开始生成 → BatchUTProgressPanel
│ ├── 进度条
│ ├── 当前类名
│ └── 成功/失败计数
│
└── 对每个选中的类:
├── TestSubjectInspector.inspect() — 检查
├── TestTemplateContextBuilder.build() — 构建上下文
├── JavaTestBuilderImpl.build() — 生成代码
└── CreateTestFileTask.run() — 写入文件6. 关键发现
ChatServiceImpl 最大: 312 strings,是 Agent Service 层中最大的实现类,处理聊天消息的发送、响应解析和 WebView 推送。
7 个 Service 接口 + 7+ 个实现: Agent Service 层采用接口+实现的分离模式,每个 CommandEnum 类型对应一个 Service 接口和实现。
SocketMessageHandleListener 是分发核心: 根据 CommandEnum 将消息分发到不同的 Service 实现,是 Agent 通信层的消息路由器。
批量单测有完整 UI: BatchUTTreePanel(树选择)+ BatchUTConfigPanel(配置)+ BatchUTProgressPanel(进度),提供完整的批量操作体验。
BatchUTTreeNode 复选框: 使用复选框树节点让用户选择要生成单测的类,支持全选/反选。
3 种批量操作: BatchUnitTestAction(单测)、BatchUTNodeAction(从树节点触发)、BatchUTDocAction(文档注释),覆盖批量操作的主要场景。
CommonServiceImpl 处理 5+ 命令: USER_PERMISSION、REPO_STATUS、USER_KNOWLEDGE_LIST、LOGIN、PLUGIN_UPDATE,是通用消息的集中处理点。
InlineChatCommandServiceImpl 流式处理: 使用
streamStep标识流式响应步骤,与 SessionController 配合更新内联聊天状态。RequestTipServiceImpl 89 strings: 补全请求服务实现,构建
CodeGenerateEditorRequest并通过 WebSocket 发送。批量单测复用 Template 包: 批量单测的代码生成逻辑完全复用
com/aicode/template/包的 JavaTestBuilderImpl 和 CreateTestFileTask。