Skip to content

15. PluginWebsocketClient — WebSocket 客户端

类签名: public class com.aicode.agent.PluginWebsocketClient源文件: ve (混淆后) 包路径: com.aicode.agent

字段

访问修饰类型名称说明
public staticConcurrentNavigableMap<String, MessageDto>AGENT_REQUESTAgent请求映射
public staticConcurrentNavigableMap<String, WebRequestDto>WEB_REQUESTWeb请求映射
public staticConcurrentNavigableMap<String, RequestCaseCodeDto>WEB_REQUEST_DATAWeb请求数据映射
publicokhttp3.RequestrequestOkHttp请求对象
private static finalorg.slf4j.Loggerbyte日志器(混淆名)
public staticConcurrentNavigableMap<String, String>AGENT_CLIENT_IDAgent客户端ID映射
public staticStringINITID初始化ID
public staticConcurrentNavigableMap<String, WebSocket>AGENT_WEBSOCKETSAgent WebSocket映射
public static finalbooleanenum混淆开关标志
public static finalStringURI_LINK_PREFIXURI链接前缀
public staticokhttp3.OkHttpClientclientOkHttp客户端

方法

public 方法 (外部API) — 12个

返回类型方法签名说明
Stringstatic getClientName()获取客户端名称
WebSocketnewWebSocket(WebSocketListener)创建WebSocket连接
voidstatic closeWebsocket(String, String)关闭WebSocket(2参数)
Booleanstatic sendWsMessageForCode(Span, MessageDto, Project)发送代码补全WS消息
voidstatic sendWsMessage(CommandEnum, Object, Project)发送WS消息(3参数)
voidstatic sendWsMessageForGitKnowledge(CommandEnum, Object, Project, WebViewDataTypeEnum)发送Git知识WS消息
voidstatic wsInit(Project)WebSocket初始化
voidstatic sendWsMessageWithOutApm(MessageDto, Project)发送WS消息(无APM)
voidcreateWebSocketConnect(WebSocketListener, String, Span)创建WebSocket连接
voidstatic sendWsMessage(MessageDto, Project)发送WS消息(MessageDto版)
voidstatic closeWebsocket(String)关闭WebSocket(1参数)
voidstatic sendWsMessage(CommandEnum, Project)发送WS消息(2参数)

private 方法 (内部实现) — 3个

返回类型方法签名说明
Stringstatic FF(Span, MessageDto, boolean)内部处理
Booleanstatic Ce(Project, MessageDto)内部处理
voidstatic yD(Map, String, String)内部处理
Booleanstatic Fd(Project, MessageDto)内部处理

构造器

签名说明
public PluginWebsocketClient()公有构造器

16. RestartableAgentProcessService — Agent 进程管理

类签名: public class com.aicode.agent.service.RestartableAgentProcessService implements PluginAgentProcessService, com.intellij.openapi.Disposable源文件: xj (混淆后) 包路径: com.aicode.agent.service

字段

访问修饰类型名称说明
private finalObjectfloat锁对象(混淆名)
public static finalAtomicBooleanpushAgentRefresh推送Agent刷新标志
public finalAtomicIntegerconnectAttempts连接尝试次数
public static finalAtomicIntegerrefreshTimes刷新次数
privatePluginAgentProcessServiceImplbyte代理进程实现(混淆名)
public static finalAtomicIntegerrestartAttempts重启尝试次数
private static finalcom.intellij.openapi.diagnostic.Loggerenum日志器(混淆名)
public static finalintRESTART_TIME重启时间间隔

方法

public 方法 (外部API) — 10个

返回类型方法签名说明
voidstatic pushAgentRefreshToWebView()推送Agent刷新到WebView
voidforceRestart()强制重启
voidonRestartException(String, Integer)重启异常回调(2参数)
booleanisRunning()判断是否运行中
voidonReconnectException(String, Integer, Project)重连异常回调
PluginAgentProcessServiceExgetDelegate()获取代理委托
voidcheckAgent(Project)检查Agent状态
voiddispose()释放资源(Disposable接口)
PluginAgentProcessServiceImplcreateInitializedDelegate()创建初始化委托
voidonRestartException(String, Integer, Span)重启异常回调(3参数)
static voidkillAgent()终止Agent进程
voidrefreshAgent(Project)刷新Agent
voidinit()初始化

private 方法 (内部实现) — 2个

返回类型方法签名说明
voidpE()内部处理
StringJD()内部处理(可能等待)
voidde(String, Project)内部处理
voidstatic enum(int)混淆开关方法

构造器

签名说明
public RestartableAgentProcessService()公有构造器

17. RequestTipServiceImpl — 请求提示服务

类签名: public class com.aicode.service.editor.RequestTipServiceImpl implements RequestTipService, com.intellij.openapi.Disposable源文件: zc (混淆后) 包路径: com.aicode.service.editor

字段

访问修饰类型名称说明
public finalTipCachecache提示缓存
private static finalorg.slf4j.Loggerfinal日志器(混淆名)
publicStringtry字段(混淆名)
public static finalMap<String, CodeTipRequestDto>CODE_TIP_MAP代码提示请求映射
public static finalbooleanfloat混淆开关标志
public static finalMap<Project, String>LATEST_RESPONSE_DATA最新响应数据
publicStringbyte字段(混淆名)
public static finalObjectobject同步锁对象
public static finalMap<Project, Map<String, Long>>LAST_REQUEST最后请求时间映射
publicLanguageenum语言类型(混淆名)

方法

public 方法 (外部API) — 10个

返回类型方法签名说明
booleanisAvailable(Editor)判断编辑器是否可用(接口方法)
EditorRequestServicecreateInlineChatRequest(Editor, int, TipType)创建内联聊天请求
EditorRequestServicecreateRequest(Editor, int, TipType)创建请求
voidfetchInlineChatContent(EditorRequestService, Flow$Subscriber, Editor, String, CodeTipRequestType)获取内联聊天内容
voiddealStreamAgentTips(String, ResponseStreamDto, Project, MessageDto)处理流式Agent提示
voiddispose()释放资源(Disposable接口)
List&lt;CodeInlayList&gt;fetchCachedTips(EditorRequestService)获取缓存提示
StringgetFileExtensionFromEditor(Editor)获取编辑器文件扩展名
voiddealAgentTips(String, JsonObject, Project)处理Agent提示
voidfetchTips(EditorRequestService, Flow$Subscriber, Editor, String, CodeTipRequestType)获取提示

private 方法 (内部实现) — 5个

返回类型方法签名说明
voidjA(Editor, Span)内部处理
voidib(String, List&lt;String&gt;, EditorRequestService, Flow$Subscriber, ResponseStreamDto$ResponseData)内部处理
StringRb(ResponseStreamDto$ResponseData, CodeTipRequestDto)内部处理
voidXb(Editor, Span)内部处理
voidstatic enum(int)混淆开关方法
voidstatic iC(Editor, MessageDto)内部处理
voidAc(String, String, AICodeSettingsState, Editor, CodeTipRequestType, Span, String, boolean)内部处理
voidstatic Fa(Editor, List<CodeInfoDto$RangeDTO>)内部处理

构造器

签名说明
public RequestTipServiceImpl()公有构造器

内部类

RequestTipServiceImpl$j — TypeToken子类

java
public class com.aicode.service.editor.RequestTipServiceImpl$j extends TypeToken<String[]> &#123;
  public final RequestTipServiceImpl enum;
&#125;

18. EditorManagerServiceImpl — 编辑器管理

类签名: public class com.aicode.service.editor.EditorManagerServiceImpl implements EditorManagerService源文件: ec (混淆后) 包路径: com.aicode.service.editor

字段

访问修饰类型名称说明
private static finalKey&lt;Boolean&gt;newKey(混淆名)
private static finalorg.slf4j.Loggerlong日志器(混淆名)
public static finalKey&lt;RequestResultList&gt;CACHE_KEY_LAST_REQUEST缓存Key
private static finalSet&lt;String&gt;super集合(混淆名)
public static finalAtomicIntegerdocChangeCount文档变更计数
public staticBooleanfor标志(混淆名)
public static finalbooleanif混淆开关标志
public static finalStringACCEPT_CODE_FOR_LINE行级接受代码Key
privateIntegercase字段(混淆名)
public staticOperateActionEnumfinal操作枚举(混淆名)
private static finalKey&lt;Boolean&gt;tryKey(混淆名)
public static finalMap<String, String>keyMap键映射
public finalCancelRequestTiprequestAlarm请求取消闹钟
public static finalKey&lt;RequestResultList&gt;KEY_LAST_REQUEST最后请求Key
privateIntegerfloat字段(混淆名)
public static finalintDELAY_MILLIS延迟毫秒数
public staticStringbyte字段(混淆名)
public static finalStringACCEPT_CODE_FOR_WORD词级接受代码Key
public static finalKey&lt;Boolean&gt;enumKey(混淆名)

方法

public 方法 (外部API) — 18个

返回类型方法签名说明
voidshowPreviousInlaySet(Editor)显示上一组Inlay
booleanacceptTipForLine(Editor)行级接受提示
static intcountLeadingSpaces(String)计算前导空格
static voidacceptCount(Project, int, int, String, Document, CodeCollectEnum)接受计数(6参数)
voiddisposeTips(Editor, OperateActionEnum)释放提示
booleanhasNextInlaySet(Editor)是否有下一组Inlay
intcountTrailingSpaces(String)计算尾部空格
List&lt;TipRenderer&gt;getInlays(Editor, int, int)获取Inlay列表
booleanacceptTip(Editor)接受提示
static List&lt;String&gt;findCommonContinuousSubstrings(String, String)查找公共连续子串
booleanhasCacheData(Editor, char)是否有缓存数据
booleanisAvailable(Editor)编辑器是否可用
static voidacceptCount(Project, String, String, CodeCollectEnum)接受计数(4参数)
booleanhasPreviousInlaySet(Editor)是否有上一组Inlay
static voidacceptCount(Editor, int, int, CodeCollectEnum)接受计数(4参数,Editor版)
static Stack&lt;Integer&gt;findMatchingRightParentheses(String)查找匹配右括号
booleanacceptWordTip(Editor)词级接受提示
voidacceptTip(Project, Editor, EditorRequestService, CodeInlayList)接受提示(完整版)
voiddispose()释放资源
voideditorChanged(Editor, int, CodeTipRequestType, boolean)编辑器变更回调
voidcancelTipRequests(Editor)取消提示请求
voidshowNextInlaySet(Editor)显示下一组Inlay
voidacceptWordTip(Project, Editor, EditorRequestService, CodeInlayList)词级接受提示(完整版)
intcountTipInlays(Editor, TextRange, boolean, boolean, boolean, boolean)计算提示Inlay数量

private 方法 (内部实现) — 36个

返回类型方法签名说明
booleanfC(CodeInlayList, EditorRequestService, Editor, boolean, OperateActionEnum)内部判断
voidstatic HC(Editor, EditorRequestService, CodeEditorInlay, String, InlayModel, int)内部处理
booleanstatic GB(Inlay)内部判断
voidNC(CodeInlayList, EditorRequestService, Editor, boolean, OperateActionEnum)内部处理
Inlay&lt;TipRenderer&gt;Za(EditorRequestService, Editor, CodeInlayList, TipInlayRenderer, int)内部处理
booleanzB(Document, int, CodeTipRequestType, RequestResultList)内部判断
voidiB(long)内部处理
voidstatic Oc(Document, int)内部处理
booleanstatic LC(String, String, int)内部判断
booleanmc(EditorRequestService, Editor)内部判断
booleanstatic hb(String)内部判断
voidmA(Editor)内部处理
voidAa(CodeInlayList, EditorRequestService, Editor)内部处理
voidstatic gc(char[], int, String, Map, Editor, EditorRequestService, InlayModel, CodeEditorInlay, int, Map)内部处理
Stringzc()内部处理
voidlc(CodeInlayList, EditorRequestService, Editor, boolean, OperateActionEnum)内部处理
voidjb(Project, Editor, EditorRequestService, CodeInlayList, String, String)内部处理
voidvc(Project, Editor, String, String, boolean)内部处理
voidqB(EditorRequestService, Editor, int, CodeEditorInlay, List&lt;String&gt;)内部处理
voidstatic enum(int)混淆开关方法
booleanstatic ta(Inlay)内部判断
booleanPA(Editor, RequestResultList, Document)内部判断
voidMA(EditorRequestService, Editor, int, CodeEditorInlay, String)内部处理
booleanqa(Editor, RequestResultList, Document, boolean)内部判断
Stringstatic JA(int)内部处理
Stringla()内部处理
booleanQB(Editor)内部判断
voidma(boolean, Editor, EditorRequestService, CodeTipRequestType, Consumer&lt;CodeInlayList&gt;)内部处理
voidXA(EditorRequestService, Editor, CodeTipRequestType, Consumer)内部处理
booleanSC()内部判断
booleanOC(Editor, int)内部判断
StringHA(Editor)内部处理
voidoc(Editor, RequestResultList)内部处理
voidMc(Project, Editor, EditorRequestService, CodeInlayList, String, String, Span, MessageDto)内部处理
StringTA(CodeInlayList)内部处理
voidbA(CodeInlayList, EditorRequestService, Editor, boolean, OperateActionEnum)内部处理
StringNa(String)内部处理
voiddA(EditorRequestService, Editor, CodeTipRequestType, Consumer)内部处理
voidRa(EditorRequestService, Editor, RequestResultList, CodeInlayList)内部处理
voidZB(List&lt;TipRenderer&gt;)内部处理
booleanCb(Editor)内部判断
Flow$Subscriberda(Editor, EditorRequestService, Consumer&lt;CodeInlayList&gt;, long)内部处理
voiduA(RequestResultList, EditorRequestService, Editor, CodeInlayList)内部处理
voidFb(Editor, Document, String, boolean, String, String, Project)内部处理
ResponseStreamDto$ResponseDatapb(CodeInlayList)内部处理
booleanmB(CodeInlayList, EditorRequestService, Editor, boolean, OperateActionEnum)内部判断
voidPb(Editor, Runnable)内部处理
voidDb(CodeInlayList, EditorRequestService, Editor, boolean, OperateActionEnum)内部处理
booleanfb(Document)内部判断
booleanNc(Editor, RequestResultList, Document)内部判断
Stringstatic aB(int)内部处理
StringMC(Editor)内部处理
voidKa(Editor, EditorRequestService, CodeTipRequestType, Consumer&lt;CodeInlayList&gt;)内部处理
booleanstatic nC(boolean, TextRange, Inlay)内部判断
booleanXc(Editor, List&lt;CodeInlayList&gt;)内部判断
booleanlb(Editor, int)内部判断
List&lt;String&gt;Ba(String, String)内部处理
booleanstatic Yc(String, String)内部判断

构造器

签名说明
public EditorManagerServiceImpl()公有构造器

内部类

EditorManagerServiceImpl$B — 混淆开关表

java
public class com.aicode.service.editor.EditorManagerServiceImpl$B &#123;
  public static final int[] enum;
&#125;

EditorManagerServiceImpl$F — Flow订阅者

java
public class com.aicode.service.editor.EditorManagerServiceImpl$F
    implements Flow$Subscriber<List&lt;CodeInlayList&gt;> &#123;
  public final EditorRequestService super;
  public final EditorManagerServiceImpl for;
  public static final boolean if;
  public final long case;
  public final Editor final;
  private volatile Flow$Subscription try;
  public final Consumer float;
  private volatile boolean byte;
  public final AtomicBoolean enum;

  public void onComplete();
  public void onError(Throwable);
  public void onNext(Object);
  public void KB(List&lt;CodeInlayList&gt;);
  public void onSubscribe(Flow$Subscription);
&#125;

响应式流订阅者,用于处理代码补全提示的异步数据流。实现 Flow.Subscriber 接口,支持背压控制。


19. OpenTelemetryService — 遥测服务

类签名: public class com.aicode.apm.OpenTelemetryService源文件: rn (混淆后) 包路径: com.aicode.apm

字段

访问修饰类型名称说明
private static finalorg.slf4j.Loggerenum日志器(混淆名)
publicio.opentelemetry.api.trace.SpanparentSpanOpenTelemetry父Span

方法

public 方法 (外部API) — 3个

返回类型方法签名说明
static OpenTelemetryServicegetInstance()获取单例实例
synchronized voidhandApmConfig(JsonObject)处理APM配置(同步)

private 方法 (内部实现) — 1个

返回类型方法签名说明
booleankd(String)内部判断

构造器

签名说明
public OpenTelemetryService()公有构造器

20. DiffService — Diff 服务

类签名: public class com.aicode.diff.DiffService源文件: xk (混淆后) 包路径: com.aicode.diff

字段

访问修饰类型名称说明
private static finalStringtry字段(混淆名)
public staticKey&lt;VirtualFile&gt;DIFF_FILEPATH_LEFTDiff左侧文件Key
private static finalStringfloat字段(混淆名)
private static finalStringbyte字段(混淆名)
public staticKey&lt;VirtualFile&gt;DIFF_FILEPATH_RIGHTDiff右侧文件Key
private static finalcom.intellij.openapi.diagnostic.Loggerenum日志器(混淆名)
public static finalStringtempDirectoryName临时目录名

方法

public 方法 (外部API) — 7个

返回类型方法签名说明
voidstatic replaceTextInVirtualFile(Project, VirtualFile, int, int, String)替换虚拟文件中的文本
voidcloseDiffViewIfAlreadyOpened(Project)关闭已打开的Diff视图
voidstatic openDiff(Project, String, Document, int, int)打开Diff视图
voidopenInlineChatDiff(Editor, String, Document, int, int)打开内联聊天Diff
voidstatic copyFile(String, String, String, String)复制文件
voidstatic replaceTextInFile(VirtualFile, int, int, String)替换文件中的文本
static DocumentgetDocument(Editor)获取文档
voidopenDiffViewForAICode(Project, String, Editor)打开AI代码Diff视图

private 方法 (内部实现) — 3个

返回类型方法签名说明
voidstatic YC(Document, VirtualFile)内部处理
voidstatic Vd(Document, int, int, String)内部处理
voidstatic enum(int)混淆开关方法

构造器

签名说明
public DiffService()公有构造器

附录A: 混淆模式分析

混淆开关方法模式

几乎所有混淆类都包含一个 private static void enum(int) 方法,这是混淆器的开关方法。对应的内部类(如 ChatService$IaCommonService$Ha 等)包含两个 static final int[] 数组(byteenum),用于在运行时解析混淆后的方法名。

字段命名混淆

混淆后的字段名使用 Java 关键字和常见词作为名称,包括:

  • byte, enum, float, long, try, for, if, case, super, new, final

这是典型的 ProGuard/R8 混淆策略,利用 Java class 文件允许关键字作为字段名的特性来增加逆向难度。

混淆方法名模式

私有方法名使用2个字母的随机组合(如 iE, Ye, ZC, bF, Ad 等),而公共API方法名保留语义化名称(如 handleAction, send2Agent, getTalkHistory)。

未混淆的类

TemplateRequestService 是唯一未混淆的核心服务类,保留了完整的原始方法名和字段名,源文件名为 TemplateRequestService.java。这可能是由于该类逻辑过于复杂,混淆后难以保证正确性,或者是遗漏。


附录B: 服务间依赖关系

Agent通信层

PluginWebsocketClient (WebSocket通信)
    |
    +-- RestartableAgentProcessService (进程管理)
    |       implements PluginAgentProcessService, Disposable
    |
    +-- ChatService (聊天)
    +-- CodeCompleteService (代码补全)
    +-- InlineChatCommandService (内联聊天命令)
    +-- GitReviewService (Git评审)
    +-- SqlService (SQL)
    +-- CodeCheckService (代码检查)
    +-- CodeSearchService (代码搜索)
    +-- UserService (用户)
    +-- BatchUnitTestService (批量单测)
    +-- CommonService (通用)

编辑器集成层

RequestTipServiceImpl (请求提示)
    implements RequestTipService, Disposable
    |
    +-- EditorManagerServiceImpl (编辑器管理)
    |       implements EditorManagerService
    |       |
    |       +-- EditorManagerServiceImpl$F (Flow订阅者)
    |
    +-- InlineChatService (内联聊天面板)
    |       implements Disposable
    |       |
    |       +-- InlineChatService$Companion (Kotlin伴生对象)
    |
    +-- InlineChatHandleService (内联聊天处理)
    +-- InlineChatStreamHandleService (内联聊天流式处理)

辅助服务层

DiffService (Diff对比)
OpenTelemetryService (APM遥测)
TemplateRequestService (模板请求/单测生成)

附录C: handleAction/handleAgentAction 方法统一入口

所有核心服务类都实现了 handleAction 和/或 handleAgentAction 方法,这是 iFlyCode 插件的消息分发机制:

handleActionhandleAgentAction
ChatServicehandleAction(WebViewDataTypeEnum, JsonObject, String, Project)handleAgentAction(CommandEnum, JsonObject, String, MessageDto, Project)
CodeCompleteService-handleAgentAction(CommandEnum, JsonObject, MessageDto, String, Project)
CommonServicehandleAction(WebViewDataTypeEnum, JsonObject, String, Project)-
InlineChatCommandService-handleAgentAction(String, CommandEnum, Project, MessageDto, JsonObject) + handleAgentAction(Project, MessageDto, String, CommandEnum)
GitReviewServicehandleAction(WebViewDataTypeEnum, JsonObject, Project)handleAgentAction(CommandEnum, JsonObject, Project)
SqlServicehandleAction(WebViewDataTypeEnum, JsonObject, Project)handleAgentAction(CommandEnum, String, JsonObject, Project)
CodeCheckServicehandleAction(WebViewWindowPanel, WebViewDataTypeEnum, JsonObject, Project)handleAgentAction(CommandEnum, JsonObject, MessageDto, String, Project)
CodeSearchServicehandleAction(WebViewWindowPanel, WebViewDataTypeEnum, JsonObject, String, Project)handleAgentAction(CommandEnum, JsonObject, String, Project)
UserServicehandleAction(WebViewDataTypeEnum, Project)handleAgentAction(CommandEnum, JsonObject, String, Object, Project)
BatchUnitTestServicehandleAction(WebViewDataTypeEnum, String, Project)handleAgentAction(CommandEnum, JsonObject, MessageDto, String, Project)
TemplateRequestService-handleAgentAction(CommandEnum, JsonObject, MessageDto, String, Project) (synchronized)
  • handleAction: 从 WebView 前端触发的动作入口
  • handleAgentAction: 从 Agent 后端响应触发的动作入口

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