Skip to content

LSP Navigation zh

pawaca edited this page Aug 30, 2026 · 1 revision

LSP 导航

未实现——上游的语义代码导航在当前 Edge 部署中不可用。

上游参考:LSP 导航

上游提供了什么

LSP 接缝是一个可选的能力层,通过 ctx.lsp 暴露语义代码导航。分布在三个包中:

  • dsh-lsp — 服务定义:LspService,提供 provider 注册和查询分发
  • dsh-lsp-stdio — stdio 宿主:通过 node:child_process 启动语言服务器进程(TypeScript、Python、Go 等)
  • dsh-tool-lsp — 工具消费者:注册模型可用的四个语义查询工具

四个操作组成封闭联合:goToDefinitionfindReferencesgoToImplementationhover。每个 provider 注册稳定的 ID 和扩展名到语言的映射。该服务可选,不在 agent loop 核心执行路径上。

当前 Edge 状态

未实现 三个 LSP 包均不在 Edge 的依赖中。没有 ctx.lsp 服务。模型无法执行跳转定义、查找引用或悬浮查询。

主要阻塞是 stdio 宿主(dsh-lsp-stdio):它通过 node:child_process 启动长期运行的语言服务器进程,这在 Cloudflare Workers 中不可用。

Cloudflare 启用路径

方案 能力 所需 Plan 复杂度
Cloudflare Containers 完整 LSP——在 Linux 容器中运行真正的语言服务器(tsserver、pylsp、gopls)。进程跨 turn 持久化,预热后响应快。 Workers Paid 或 Enterprise 高——需要容器生命周期、stdio 桥接、工作区同步
Tree-sitter WASM 部分——符号提取、常见语言的跳转定义。无悬浮文档,跨文件引用有限。在 Workers 中运行,无需容器。 免费 plan 兼容 中——实现基于 Tree-sitter WASM 解析器的 LspProvider

容器方案ContainerLspProvider 实现上游 LspProvider 接口,在 Container 内启动语言服务器而非通过 stdio。容器生命周期可按 workspace 管理——首次 LSP 查询时启动,session 期间保活,session 结束时释放。需要将 DO VFS 中的工作区文件同步到容器文件系统。

Tree-sitter 方案:适用于免费 plan 的轻量替代。Tree-sitter WASM 解析器可以提取符号、在文件或项目内导航定义、提供基本的结构信息。无法达到完整 LSP 的精度(无类型推断、无语言服务器的悬浮文档),但能覆盖最常见的导航需求。

架构总结

组件 状态 备注
LspService (dsh-lsp) 缺失 服务定义——无平台依赖,可直接安装
Stdio 宿主 (dsh-lsp-stdio) 缺失 需要 node:child_process——需要 Container 替换
工具消费者 (dsh-tool-lsp) 缺失 无平台依赖——服务就绪后可直接安装

关键观察:服务定义和工具消费者包没有平台依赖——可以直接安装。只有 stdio 宿主需要平台相关的替换(Container 或 Tree-sitter 方案)。上游的 LspProvider 接口是正确的扩展点。

TODO

**评估 Container 支撑的 LSP provider。**Cloudflare Containers 能否以可接受的启动延迟运行 tsserver/pylsp?从 DO VFS 到容器文件系统的工作区同步开销多大?容器是否能在交互式开发 session 期间持久化足够长?

**评估 Tree-sitter WASM 作为免费 plan 替代。**哪些语言有成熟的 Tree-sitter WASM 解析器?仅用 Tree-sitter 查询能否实现跨文件的跳转定义和查找引用?包含 WASM 解析器对 bundle 大小的影响?

English

中文

Clone this wiki locally