Skip to content

Instantly share code, notes, and snippets.

@n-WN
Created December 23, 2025 09:57
Show Gist options
  • Select an option

  • Save n-WN/c0cb6c0ca0c8dbe008a527ff31699eb2 to your computer and use it in GitHub Desktop.

Select an option

Save n-WN/c0cb6c0ca0c8dbe008a527ff31699eb2 to your computer and use it in GitHub Desktop.
Claude Code: 对 Agent 暴露 LSP 的实现链路分析 (v2.0.76)

Claude Code: 对 Agent 暴露 LSP 的实现链路分析 (v2.0.76)


一、 配置入口与加载机制

  • 插件侧配置 (Schema: wWA) 支持通过 .lsp.jsonmanifest.lspServers 进行定义。核心字段包含 commandargsextensionToLanguageenvinitializationOptionsworkspaceFolder
  • 传输层协议 代码中声明支持 stdiosocket 两种 transport 模式,但当前版本实现中仅观察到 stdio 分支的具体处理逻辑。 (参考: external/claude-code-pkg/package/cli.js:1148)
  • 加载安全性 系统读取插件根目录配置或 manifest 声明。通过 C55 逻辑进行路径穿越防护,强制要求 LSP 相关路径必须位于插件目录内,否则记录 lsp-config-invalid。 (参考: external/claude-code-pkg/package/cli.js:1246)

二、 协议层与进程管理

  • 进程启动 (R52) 利用 child_process.spawn 启动 LSP Server,并将 stdio 配置为 pipe 模式。
  • 通信链路 (vscode-jsonrpc) 基于 StreamMessageReaderStreamMessageWriter 建立连接,完成 initialize / initialized 标准握手。
  • 生命周期约束 (T52) 封装初始化参数(如 workspaceFoldersrootUricapabilities),但明确暂不支持 restartOnCrashstartupTimeout 以及 shutdownTimeout 等高级特性。 (参考: external/claude-code-pkg/package/cli.js:1246)

三、 LSP Manager (路由与同步)

  • 映射维护 (b52) 维护「扩展名 serverName」与「fileUri serverName」的路由映射关系。
  • 文件状态同步 根据需求按需启动 Server,并负责 didOpendidChangedidSavedidClose 等生命周期事件的同步。其中 languageId 由配置中的 extensionToLanguage 字典映射决定。 (参考: external/claude-code-pkg/package/cli.js:1246)

四、 Agent 工具集成 (核心暴露层)

  • 内置 Tool 定义 (L49) 定义名称常量为 "LSP"。 (参考: external/claude-code-pkg/package/cli.js:2927)

  • 执行逻辑 (V27/D27/fq0.call) 将 Agent 传入的操作(如 operation, filePath, line, character)映射至 LSP 标准请求:

  • textDocument/definition (定义)

  • textDocument/references (引用)

  • textDocument/hover (悬停)

  • textDocument/implementation (实现)

  • textDocument/documentSymbol (符号)

  • workspace/symbol (工作区符号)

  • textDocument/prepareCallHierarchy (调用层级预备)

  • 交互流 在执行请求前,系统会必要地先调用 openFile 确保文件开启,随后执行 sendRequest 并将返回的 JSON 响应格式化为人类可读的纯文本供 Agent 理解。 (参考: external/claude-code-pkg/package/cli.js:2946)


五、 联动与被动感知

  • 编辑器同步FileWriteFileEdit 工具成功写入磁盘后,会触发 _m().changeFile()_m().saveFile()。该机制保证了 LSP Server 侧的 Buffer 状态与物理文件一致,并负责清理过期的 diagnostics。 (参考: cli.js:1265, 1873)
  • 被动诊断 (Passive Diagnostics) 对所有运行中的 Server 注册 textDocument/publishDiagnostics 处理器。通过缓存与聚合逻辑,将诊断信息以异步附件形式投喂给 Agent(日志带有 [PASSIVE DIAGNOSTICS] 前缀)。 (参考: external/claude-code-pkg/package/cli.js:1246)
  • 延迟加载机制 在构建 Tool Schemas 时,若工具标记有 isLsp 且 LSP Manager 处于 pendingnot-started 状态,该工具定义将被延迟加载(其逻辑类似于 MCP tools 的延迟初始化)。 (参考: external/claude-code-pkg/package/cli.js:4591)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment