- 插件侧配置 (Schema: wWA)
支持通过
.lsp.json或manifest.lspServers进行定义。核心字段包含command、args、extensionToLanguage、env、initializationOptions及workspaceFolder。 - 传输层协议
代码中声明支持
stdio与socket两种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)
基于
StreamMessageReader与StreamMessageWriter建立连接,完成initialize/initialized标准握手。 - 生命周期约束 (T52)
封装初始化参数(如
workspaceFolders、rootUri、capabilities),但明确暂不支持restartOnCrash、startupTimeout以及shutdownTimeout等高级特性。 (参考:external/claude-code-pkg/package/cli.js:1246)
- 映射维护 (b52) 维护「扩展名 serverName」与「fileUri serverName」的路由映射关系。
- 文件状态同步
根据需求按需启动 Server,并负责
didOpen、didChange、didSave、didClose等生命周期事件的同步。其中languageId由配置中的extensionToLanguage字典映射决定。 (参考:external/claude-code-pkg/package/cli.js:1246)
-
内置 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)
- 编辑器同步
当
FileWrite或FileEdit工具成功写入磁盘后,会触发_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 处于pending或not-started状态,该工具定义将被延迟加载(其逻辑类似于 MCP tools 的延迟初始化)。 (参考:external/claude-code-pkg/package/cli.js:4591)