iFlyCode Agent 包与通信层深度分析
版本: 3.4.2-222 | 分析日期: 2026-05-11
1. 概述
本文档补充分析 com/aicode/agent/ 包的内部类、com/aicode/agent/dto/ 的完整 DTO 体系、com/aicode/agent/service/ 的服务层细节,以及 com/aicode/diff/ 包的 Diff 系统。
2. Agent 包核心类补充
2.1 AgentCheckTimer (178 strings) — 补充分析
路径: com/aicode/agent/AgentCheckTimer职责: Agent 进程健康检查定时器
关键数据结构:
AGENT_CHECK_MAP— 项目 → 检查状态映射AGENT_CLIENT_MAP— 项目 → WebSocket 客户端映射AGENT_WEBSOCKETS— 项目 → WebSocket 连接映射timeOutTimer— 超时定时器
关键方法:
scheduleAtFixedRate(TimerTask, delay, period)— 定期检查send2Web(Project, Object)— 推送检查结果到 WebViewgetKey()/getValue()— 获取检查映射键值containsKey()— 检查项目是否存在
关键依赖:
PluginWebsocketClient— WebSocket 客户端HeartBeatCheckRunner— 心跳检测OkHttp WebSocket— WebSocket 连接Hutool IdUtil.fastSimpleUUID()— UUID 生成Hutool MapUtil— Map 工具WebViewDataTypeEnum— WebView 数据类型CommandEnum— 命令枚举
内部类:
$ha— 检查任务(引用 AGENT_CLIENT_MAP)$ba— 匿名类
关键发现: 使用 Hutool 的 IdUtil.fastSimpleUUID() 生成消息 ID,这是第四处 Hutool 依赖。
2.2 HeartBeatCheckRunner (223 strings) — 补充分析
关键方法:
checkAgent(Project)— 检查 Agent 是否存活onRestartException()— 重启异常处理
重启触发:
RestartEnum.HEART_BEAT_ERROR— 心跳检测失败RestartEnum.CONNECT_REFUSED— 连接被拒绝
2.3 PluginWebsocketClient (296 strings) — 补充分析
关键数据结构:
AGENT_WEBSOCKETS—ConcurrentNavigableMap<String, WebSocket>— 项目 → WebSocket 连接映射AGENT_CLIENT_ID— 客户端 IDURI_LINK_PREFIX— URI 链接前缀client—OkHttpClient— OkHttp WebSocket 客户端
关键方法:
sendWsMessage(CommandEnum, Object, Project)— 发送 WebSocket 消息getClientName()— 获取客户端名称(含 IDE 版本信息)newWebSocket(WebSocketListener)— 创建新的 WebSocket 连接
OpenTelemetry 集成:
- 发送消息时创建 APM Span
- 使用
TextMapSetter传播 traceparent 到 WebSocket 消息 - 记录
COMMAND_ID、SETTING_MESSAGE_TYPE、SETTING_TRIGGER_TIME_DELAY等属性
2.4 SocketMessageHandleListener (341 strings) — 补充分析
消息分发逻辑: 根据 CommandEnum 类型将消息分发到不同的服务:
CodeCheckService— 代码检查GitReviewService— Git 评审CodeCompleteService— 代码补全InlineChatCommandService— 内联聊天CommonService— 通用消息
关键方法:
handleSocketMessage(String, Project)— 处理原始消息字符串sendMessage2webView(Project, Object)— 推送消息到 WebViewchangeServerStatus()— 变更服务状态
2.5 PluginWebsocketListener (185 strings) — 补充分析
关键方法:
onOpen(WebSocket, Response)— 连接打开- 重置
restartAttempts计数 - 调用
wsInit()初始化 WebSocket - 调用
send2Web()推送状态到 WebView
- 重置
onMessage(WebSocket, String)— 收到消息- 调用
SocketMessageHandleListener.handleSocketMessage()
- 调用
onFailure(WebSocket, Throwable, Response)— 连接失败- 调用
OpenTelemetryUtil记录错误 Span
- 调用
3. Agent DTO 体系补充
3.1 MessageDto (205 strings) — 核心消息 DTO
路径: com/aicode/agent/dto/MessageDto
完整字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | String | 消息唯一 ID |
| stream | boolean | 是否流式消息 |
| command | CommandEnum | 命令类型 |
| sessionId | String | 会话 ID |
| modelCode | String | 模型代码 |
| permissionCode | String | 权限代码 |
| data | String | 消息数据(JSON 字符串) |
| range | List<RangeDTO> | 代码范围列表 |
| chatTest | String | 聊天测试标识 |
| pid | String | 进程 ID |
| taskId | String | 任务 ID |
| requestCaseCodeDto | RequestCaseCodeDto | 请求用例代码 DTO |
| text | String | 文本内容 |
| tipinfo | TipInfoDto | 提示信息 |
| requestion | String | 请求问题 |
| streamStep | String | 流式步骤 |
| inlineChatVersion | String | 内联聊天版本 |
3.2 chat 子包 DTO
路径: com/aicode/agent/dto/chat/
| DTO | 说明 |
|---|---|
| CodeInfoDto | 代码信息 — path, language, range, text |
| CodeInfoDto$RangeDTO | 代码范围 — line |
| PresentationDataDto | 呈现数据 — codeInfoDto |
| ChatMessageDto | 聊天消息 |
| ChatModelDto | 聊天模型 |
3.3 其他 DTO
| DTO | 字段 | 说明 |
|---|---|---|
| LoginInfo | current, update, file, md5, name | 登录信息(含更新 URL 和 MD5 校验) |
| ConnectConfigDto | id, user, database | SQL 连接配置 |
| DatabaseDto | id, formData, databases, errMsg | 数据库信息 |
| EnterpriseDto | enterpriseId, enterpriseName, userId | 企业信息 |
| SysUrlDto | feedbackUrl, maintainRepoUrl, codeSearchServerUrl, officialWebsiteUrl, codeKnowledgeWebUrl, userCenterWebUrl | 系统 URLs |
| TipInfoDto | user, isShowOperateGuide | 提示信息 |
| WebRequestDto<T> | type, value | 通用 Web 请求 DTO(泛型) |
| CodeCheckDto | codeFragment, errorType, errorMessage, codeInfo | 代码检查数据 |
| CodeCheckFixDto | type, value (ValueDTO) | 代码检查修复 |
| CodeCheckListDto | type, value (ValueDTO) | 代码检查列表 |
| CodeCheckOriginDto | errList (List<ErrListDTO>) | 代码检查原始数据 |
| CodeRepoInfoDto | content, currentPage, pageSize, totalPage | 代码仓库信息(含分页) |
| CodeSearchInfoDto | content, type, count, currentPage, pageSize, totalPage | 代码搜索结果(含分页) |
4. Diff 系统补充
4.1 CloudDiffUtil
路径: com/aicode/diff/CloudDiffUtil职责: 云端 Diff 工具 — Diff 操作的入口
Key 常量:
DIFF_FILE_UNIQUE_ID— Diff 文件唯一 IDDIFF_FILEPATH_LEFT— Diff 左侧文件路径DIFF_FILEPATH_RIGHT— Diff 右侧文件路径DIFF_SUGGEST_CODE— Diff 建议代码
4.2 DiffDialog
路径: com/aicode/diff/DiffDialog父类: DialogWrapper — IntelliJ 对话框基类 职责: Diff 对话框 — 显示代码差异
4.3 DiffService
路径: com/aicode/diff/DiffService职责: Diff 服务 — 执行代码替换
关键方法:
replaceTextInVirtualFile()— 使用WriteCommandAction+Document.replaceString替换代码
4.4 FileInfo / FileService / GenericUtils
| 类 | 职责 |
|---|---|
| FileInfo | 文件信息 — 文件路径和内容 |
| FileService | 文件服务 — 文件读写操作 |
| GenericUtils | 通用工具 — 使用 LinkageError.getStackTrace() 进行 H() 解码 |
5. 外部依赖汇总
| 依赖 | 使用位置 | 用途 |
|---|---|---|
| Gson | WebViewWindowPanel, VirtualFileUri, AgentCheckTimer | JSON 序列化/反序列化 |
| Guava Maps | CodeGenerateEditorRequest | Map 工具 |
| Hutool IdUtil | AgentCheckTimer | UUID 生成 |
| Hutool MapUtil | AgentCheckTimer | Map 工具 |
| Hutool FileUtil | PluginUpdater | 文件操作 |
| OkHttp | PluginWebsocketClient | WebSocket 客户端 |
| OpenTelemetry | PluginWebsocketClient, OpenTelemetryService | APM 链路追踪 |
| CEF/JCEF | WebViewWindowPanel | 嵌入式浏览器 |
6. 关键发现
Hutool 广泛使用: 3 处使用 Hutool(IdUtil、MapUtil、FileUtil),说明 iFlyCode 团队偏好 Hutool 工具库。
LoginInfo 含更新信息:
LoginInfo包含current(当前版本)、update(更新 URL)、file(下载文件)、md5(校验和)、name(文件名),登录响应即携带更新信息。ConcurrentNavigableMap: WebSocket 连接使用
ConcurrentNavigableMap而非ConcurrentHashMap,支持按 key 顺序遍历,可能用于多项目优先级调度。OpenTelemetry W3C 传播: WebSocket 消息携带
traceparent头,使用 W3C Trace Context 标准传播分布式追踪上下文。GenericUtils 复用栈追踪:
GenericUtils和OpenTelemetryUtil都使用LinkageError.getStackTrace()获取调用者信息,与AICodeStringUtil.H()的混淆技术相同。Diff 系统 3 层: CloudDiffUtil(入口)→ DiffDialog(UI)→ DiffService(执行),通过
WriteCommandAction确保 IntelliJ 文档修改的线程安全。chat 子包 DTO:
CodeInfoDto和PresentationDataDto是行级操作(解释/优化/拆分/注释/单测)的数据载体,由PluginEditorInlayHintsProvider和CheckGutterIconRenderer使用。6 个 SysUrl:
SysUrlDto包含 6 个系统 URL(反馈、维护仓库、代码搜索、官网、代码知识库、用户中心),说明 iFlyCode 有完整的 Web 服务生态。