Skip to content

5. 与 Service 层的交互关系

5.1 EditorManagerService (核心交互)

Listener调用方法用途
AutoCodeGenerateListenereditorChanged(editor, requestType, isCommandName)触发代码补全请求
AutoCodeGenerateListenerdisposeTips(editor, actionEnum)关闭代码提示
AutoCodeGenerateListenerisAvailable(editor)检查编辑器可用性
AutoCodeGenerateListenerhasTipInlays(editor)检查 AI 提示
AutoCodeGenerateListenercancelTipRequests(editor)取消补全请求
CodeEditorListenerisAvailable(editor)检查编辑器可用性
CodeLookupManagerListenereditorChanged(editor, Forced, false)强制触发补全
CodeLookupManagerListenercancelTipRequests(editor)取消补全请求
CodeLookupManagerListenerdisposeTips(editor, IdeCompletion)关闭 IDE 补全提示
CodeLookupManagerListener$01acceptTip(editor)接受 AI 补全
CodeLookupManagerListener$01hasTipInlays(editor)检查 AI 提示
AICodeUnloadPluginListenerdisposeTips(editor, UserOperate)用户操作关闭提示

5.2 PluginWebsocketClient (WebSocket 通信)

Listener调用方法用途
CodeFileEditorManagerListenersendWsMessageWithOutApm(msg, project)发送文档打开/同步消息
CommitHandlerFactory$osendWsMessage(msg, project)发送单元测试收集数据
GitBranchChangeListenersendWsMessage(CommandEnum, data, project)发送 Git 状态消息
PluginManagerListenercloseWebsocket(basePath, reason)关闭 WebSocket 连接

5.3 SocketMessageHandleListener (WebView 通信)

Listener调用方法用途
GitBranchChangeListenersend2Web(project, data)发送 Git 状态给 WebView
ThemeChangeListenersend2Web(project, data)发送主题变更给 WebView

5.4 其他服务交互

Listener服务用途
AutoCodeGenerateListenerDocumentActionTracker追踪强制代码生成动作
AutoCodeGenerateListenerRequestTipServiceImplAPM 追踪(撤销时结束 Span)
CodeFileEditorManagerListenerRecentFilesManager记录最近打开文件
CodeFileEditorManagerListener$01InlineChatService清理 Inline Chat 数据
CodeFileEditorManagerListener$01CommonServiceJava 语言支持检查
CommitHandlerFactory$oUnitTestCollectUtil分析变更方法和单元测试
PluginManagerListenerChatService清除 Chat 会话 ID
PluginManagerListenerSqlService清除 SQL 会话 ID
GitBranchChangeListenerAICodeSettingsState读取权限/忽略设置
ThemeChangeListenerStatusBarPopup更新状态栏图标

6. 混淆字符串解密方法汇总

所有 Listener 中大量使用了字符串混淆,解密通过以下静态方法:

解密方法来源包用途
MethodGeneratorConfig.H(Object)com.aicode.action.batch通用解密
CodeCompleteService.H(Object)com.aicode.agent.service代码补全相关
GeneratorConfig.H(Object)com.aicode.action.batch代码生成相关
HandleCacheUtil.H(Object)com.aicode.util缓存相关
IndentLineUtil.H(Object)com.aicode.util缩进相关
PropertyUtils.H(Object)com.aicode.util属性相关
OverlayUtils.H(Object)com.aicode.content.util覆盖层相关
FileExtensionLanguageDetails.H(Object)com.aicode.content.util.file文件扩展名相关
InlineChatStatusServiceKt.H(Object)com.aicode.inline.statusInline Chat 状态
CancelRequestTip.H(Object)com.aicode.service.editor取消请求提示
JComponentKt.H(Object)com.aicode.utilUI 组件相关
AICodeStringUtil.H(Object)com.aicode.util字符串工具
GenericUtils.H(Object)com.aicode.diff通用差异工具
FileService.H(Object)com.aicode.diff文件服务
RequestCancelException.H(Object)com.aicode.exception请求取消异常
FontKt.H(Object)com.aicode.ui字体相关
Maps.H(Object)com.aicode.utilMap 工具
NewFileUtils.H(Object)com.aicode.util新文件工具

7. 关键发现

7.1 代码补全触发机制

AutoCodeGenerateListener 是代码补全的核心触发器:

  • 监听 IntelliJ 的 CommandListener,在 commandFinished 时检测编辑器位置变更
  • 如果光标位置改变(VisualPosition 不同),触发 editorChanged(Automatic) -- 自动补全
  • 如果仅文档内容改变(modificationSequence 不同),触发 disposeTips(CaretChange) -- 关闭提示
  • Tab 键选择 IDE 补全时,如果存在 AI 提示,会拦截 IDE 补全,改为接受 AI 提示

7.2 文档变更延迟策略

CodeFileEditorManagerListener$01 对不同语言采用不同延迟:

  • Java 文件: 3000ms 延迟后触发补全
  • 非 Java 文件: 50ms 延迟后触发补全

这表明 Java 代码补全需要更多上下文分析时间。

7.3 Git 授权流程

GitBranchChangeListener 实现了完整的 Git 仓库授权流程:

  1. 检测分支是否在远程仓库
  2. 如果不在远程,标记为未授权(status=-5)
  3. 通过 WebSocket 通知 Agent 和 WebView
  4. 提供三种用户操作: 打开知识库、忽略授权、授权仓库
  5. 授权通过 Agent WebSocket 发送 GIT_REPO_AUTHORIZE 命令

7.4 项目关闭清理

PluginManagerListener 在项目关闭时:

  1. 先自动接受所有处于 SUCCESS 状态的 Inline Chat 会话
  2. 关闭 WebSocket 连接
  3. 清除 Chat 和 SQL 会话缓存

7.5 VCS 提交数据收集

CommitHandlerFactory$o 在代码提交成功后:

  1. 分析所有 Java 变更文件
  2. 提取变更方法信息
  3. 收集单元测试相关数据
  4. 通过 WebSocket 发送 LOG_TEST_COLLECTION_COMMIT 消息给 Agent

7.6 主题变更广播

ThemeChangeListener 在 IDE 主题或字体大小变更时:

  1. 切换状态栏和工具窗口图标(暗色/亮色)
  2. 通过 WebView 通信通道通知前端主题变更
  3. 更新状态栏弹出组件

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