Skip to content

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) — 推送检查结果到 WebView
  • getKey() / 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_WEBSOCKETSConcurrentNavigableMap<String, WebSocket> — 项目 → WebSocket 连接映射
  • AGENT_CLIENT_ID — 客户端 ID
  • URI_LINK_PREFIX — URI 链接前缀
  • clientOkHttpClient — OkHttp WebSocket 客户端

关键方法:

  • sendWsMessage(CommandEnum, Object, Project) — 发送 WebSocket 消息
  • getClientName() — 获取客户端名称(含 IDE 版本信息)
  • newWebSocket(WebSocketListener) — 创建新的 WebSocket 连接

OpenTelemetry 集成:

  • 发送消息时创建 APM Span
  • 使用 TextMapSetter 传播 traceparent 到 WebSocket 消息
  • 记录 COMMAND_IDSETTING_MESSAGE_TYPESETTING_TRIGGER_TIME_DELAY 等属性

2.4 SocketMessageHandleListener (341 strings) — 补充分析

消息分发逻辑: 根据 CommandEnum 类型将消息分发到不同的服务:

  • CodeCheckService — 代码检查
  • GitReviewService — Git 评审
  • CodeCompleteService — 代码补全
  • InlineChatCommandService — 内联聊天
  • CommonService — 通用消息

关键方法:

  • handleSocketMessage(String, Project) — 处理原始消息字符串
  • sendMessage2webView(Project, Object) — 推送消息到 WebView
  • changeServerStatus() — 变更服务状态

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

完整字段:

字段类型说明
idString消息唯一 ID
streamboolean是否流式消息
commandCommandEnum命令类型
sessionIdString会话 ID
modelCodeString模型代码
permissionCodeString权限代码
dataString消息数据(JSON 字符串)
rangeList<RangeDTO>代码范围列表
chatTestString聊天测试标识
pidString进程 ID
taskIdString任务 ID
requestCaseCodeDtoRequestCaseCodeDto请求用例代码 DTO
textString文本内容
tipinfoTipInfoDto提示信息
requestionString请求问题
streamStepString流式步骤
inlineChatVersionString内联聊天版本

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字段说明
LoginInfocurrent, update, file, md5, name登录信息(含更新 URL 和 MD5 校验)
ConnectConfigDtoid, user, databaseSQL 连接配置
DatabaseDtoid, formData, databases, errMsg数据库信息
EnterpriseDtoenterpriseId, enterpriseName, userId企业信息
SysUrlDtofeedbackUrl, maintainRepoUrl, codeSearchServerUrl, officialWebsiteUrl, codeKnowledgeWebUrl, userCenterWebUrl系统 URLs
TipInfoDtouser, isShowOperateGuide提示信息
WebRequestDto<T>type, value通用 Web 请求 DTO(泛型)
CodeCheckDtocodeFragment, errorType, errorMessage, codeInfo代码检查数据
CodeCheckFixDtotype, value (ValueDTO)代码检查修复
CodeCheckListDtotype, value (ValueDTO)代码检查列表
CodeCheckOriginDtoerrList (List<ErrListDTO>)代码检查原始数据
CodeRepoInfoDtocontent, currentPage, pageSize, totalPage代码仓库信息(含分页)
CodeSearchInfoDtocontent, type, count, currentPage, pageSize, totalPage代码搜索结果(含分页)

4. Diff 系统补充

4.1 CloudDiffUtil

路径: com/aicode/diff/CloudDiffUtil职责: 云端 Diff 工具 — Diff 操作的入口

Key 常量:

  • DIFF_FILE_UNIQUE_ID — Diff 文件唯一 ID
  • DIFF_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. 外部依赖汇总

依赖使用位置用途
GsonWebViewWindowPanel, VirtualFileUri, AgentCheckTimerJSON 序列化/反序列化
Guava MapsCodeGenerateEditorRequestMap 工具
Hutool IdUtilAgentCheckTimerUUID 生成
Hutool MapUtilAgentCheckTimerMap 工具
Hutool FileUtilPluginUpdater文件操作
OkHttpPluginWebsocketClientWebSocket 客户端
OpenTelemetryPluginWebsocketClient, OpenTelemetryServiceAPM 链路追踪
CEF/JCEFWebViewWindowPanel嵌入式浏览器

6. 关键发现

  1. Hutool 广泛使用: 3 处使用 Hutool(IdUtil、MapUtil、FileUtil),说明 iFlyCode 团队偏好 Hutool 工具库。

  2. LoginInfo 含更新信息: LoginInfo 包含 current(当前版本)、update(更新 URL)、file(下载文件)、md5(校验和)、name(文件名),登录响应即携带更新信息。

  3. ConcurrentNavigableMap: WebSocket 连接使用 ConcurrentNavigableMap 而非 ConcurrentHashMap,支持按 key 顺序遍历,可能用于多项目优先级调度。

  4. OpenTelemetry W3C 传播: WebSocket 消息携带 traceparent 头,使用 W3C Trace Context 标准传播分布式追踪上下文。

  5. GenericUtils 复用栈追踪: GenericUtilsOpenTelemetryUtil 都使用 LinkageError.getStackTrace() 获取调用者信息,与 AICodeStringUtil.H() 的混淆技术相同。

  6. Diff 系统 3 层: CloudDiffUtil(入口)→ DiffDialog(UI)→ DiffService(执行),通过 WriteCommandAction 确保 IntelliJ 文档修改的线程安全。

  7. chat 子包 DTO: CodeInfoDtoPresentationDataDto 是行级操作(解释/优化/拆分/注释/单测)的数据载体,由 PluginEditorInlayHintsProviderCheckGutterIconRenderer 使用。

  8. 6 个 SysUrl: SysUrlDto 包含 6 个系统 URL(反馈、维护仓库、代码搜索、官网、代码知识库、用户中心),说明 iFlyCode 有完整的 Web 服务生态。

本项目仅供学习研究,逆向分析内容归原厂商所有。