Files
deepseek-harness/packages/lsp/lsp-e2b/README.zh.md
2026-08-08 22:19:10 +08:00

3.7 KiB
Raw Blame History

@deepseek-ai/dsh-lsp-e2b

English | 中文

用于 ctx.lsp 的通用 E2B 语言服务器后端。它在共享的 ctx.e2b 沙箱内运行已配置的 stdio 服务器并读取其源文档;提供方注册表、规范化查询结果、队列和协议连接状态仍保留在宿主侧。

插件与配置

lsp-e2b 插件注入 e2b、lsp 和具体的 dsh-subprocess-e2b 服务。servers 是一张非空的提供方 id 表:

服务器键 默认值 含义
command 必填 远程可执行文件:绝对路径,或在加载时通过沙箱 PATH 解析。
args [] 远程服务器参数。
env {} 经由进程管理适配器传入的显式环境条目。
extensionToLanguage 必填 小写、以点开头的扩展名到 LSP language id 的映射。
initializationOptions / configuration null / null 静态初始化选项和 workspace/configuration 应答。
maxMessageBytes 16000000 从服务器接受的 LSP 消息大小上限。
maxStderrBytes 1000000 保留的服务器原始 stderr 尾部上限。
maxDocumentBytes 4000000 单次查询可打开的最大远程源文件。
shutdownTimeoutMs 5000 协议优雅关闭预算。
killGraceMs 2000 请求取消与 TERM 到 KILL 升级的宽限期。

提供方 id 与命令必须非空;数值上限必须是正的安全整数,定时器取值不得超过 Node 的最大定时器延迟。设置阶段会在 ctx.e2b.runtimeRoot 下上传一个仅供所有者使用的私有代理,在远程解析 Node 和每个已配置服务器的可执行文件,再以原子方式注册所有提供方。

远程协议与文件系统

E2B 命令回调交付的是文本,而 LSP 按字节分帧。因此,已安装的代理会把服务器 stdout、stderr 和 stdin 的原始字节进行 base64 编码,封装为以换行分隔的 ASCII JSON 帧;宿主会验证并解码每一帧,再把字节交给共享的 LspInstance 协议引擎。initialize.processId 为 null,因为宿主与服务器不共享进程命名空间。

每个提供方与规范化远程工作区的组合共享一个池化语言服务器进程。同一工作区的查询串行执行,不同工作区的查询并发运行。每项查询都会使用 realpath 规范化远程工作区与源文件,拒绝工作区外的路径,要求源文件为普通文件,在读取前后都检查大小上限,使用严格的 UTF-8 解码,并采用常规的临时 didOpen/请求/didClose 生命周期。传输失败会 dispose(资源释放)该实例,并在全新的远程进程上重试一次只读查询。

进程管理适配器负责进程组和终止升级,因此取消与资源释放都会等待远程服务器完全停稳。宿主负责 LSP 请求 id、待完成请求、提供方队列和规范化结果。

模型体验

通过 @deepseek-ai/dsh-tool-lsp 间接影响模型;该包会公开规范化的语义导航与悬停结果,而不改变其面向模型的 schema。

KV Cache 影响

不会直接失效;请求前缀变更由 dsh-tool-lsp 负责。

已知限制与暂缓工作

  • 仅支持已配置的服务器:本包不会安装语言服务器、选择 preset,或把宿主工作区同步到 E2B。
  • 宿主协议状态不可重连:保留沙箱并不会恢复提供方队列、JSON-RPC 请求、进程管理句柄或文档生命周期状态。
  • SDK 仍会保留输出:ASCII 分帧能保留协议字节,但 E2B 和进程管理适配器仍会在宿主内存中保留回调输出。
  • 沙箱策略归模板负责:本提供方不会额外增加卷、快照、凭据或网络策略层。