dsh-lsp-bridge:为 DeepSeek Harness 接入语言服务器

前言

在 DeepSeek Harness(DSH)里让模型读代码,常见做法是整文件检索或自行解析 AST。文件一多、跨模块引用一复杂,就容易漏符号、对不准行号。语言服务器(LSP)本来就是为「悬停、定义、引用、诊断」这类语义查询设计的;DSH 会话侧若缺少统一入口,就要在每个项目里单独配 gopls、pyright、typescript-language-server 等,还要处理多仓工作区与进程生命周期。

下面介绍社区插件 dsh-lsp-bridge(维护者 voidmind26):把 Harness 接到 stdio 语言服务器,对外暴露 lsp 查询工具,并支持模型驱动的 lsp_setup 安装与配置、多语言发现、多根工作区,以及按会话复用服务器实例。插件当前版本 0.3.0(MIT),要求 Node.js ≥ 22,安装期无需编译。

这是什么

dsh-lsp-bridge 是 DSH 的 Bundle 插件:通过 package.json 中的 dsh.bundle.patch 挂载 cordis.patch.yml,不绑定个人路径或 profile。它为 LLM 提供通用 LSP 工具 lsp,以只读语义查询为主(README 亦提到受权限约束的改写能力);具体能力取决于所连接的语言服务器。

在 SkillHub 目录 中分类为「模型推理」。源码与说明见 GitHub:voidmind26/dsh-lsp-bridge。

核心功能

lsp 工具支持的 operation

插件把 LSP 能力封装为 JSON 入参的 operation。常用项如下(完整表格见 README):

operation 用途 额外必需参数
status 查看已配置服务;不启动语言服务器 无
hover 类型与文档 file、line、character
definition 跳转定义 file、line、character
typeDefinition 类型定义 file、line、character
implementation 实现位置 file、line、character
references 引用(含声明) file、line、character
documentSymbols 文档符号 file
workspaceSymbols 所选项目/多根工作区的符号 query;建议显式 server、root
diagnostics 单文件诊断 file

约定:输入 line / character 从 1 开始,character 按 UTF-16 计数;输出保留原始 LSP URI,range 从 0 开始。server 用于在多个语言服务之间消歧;路径相对于当前会话工作目录,也可使用绝对路径。

lsp_setup:模型侧安装与配置

README 推荐不必人工扫描或手写完整配置,由智能体调用 lsp_setup:

operation 行为 是否执行程序
status 诊断项目与服务器,报告缺失与可用安装方案 否
install 执行 catalog 允许列表内的安装命令(需 apply=true) 是
configure 将可用服务器写入插件配置 否
verify 真实启动并完成 initialize,报告能力与错误 是
auto 串联以上步骤(安装需 apply=true) 取决于 apply

安全边界要点:安装命令来自冻结的 src/catalog.js,模型不能自定义 shell 命令;不使用 shell、不使用 sudo;仅 install/auto 且 apply=true 才会安装;默认安装目录为 $DSH_HOME/lsp-bridge(本机多为 ~/.dsh/lsp-bridge),不修改业务工程;每次调用要求会话为 danger-full-access,不会自动提权。

多语言、多根与会话复用

  • 支持按语言配置多个 stdio 语言服务器,字段包括 command/args、languages、rootMarkers、roots、workspaceFolders、initializationOptions 等(见 README「通用配置」)。
  • 语言服务器评估目录由配置的 roots/workspaceFolders 决定,不属于「当前会话目录」本身;会话主要负责授权与未声明根时的默认工作区。查询时 file/root 仍须落在会话工作区内。
  • 插件池化语言服务器进程:session-scoped server reuse(同会话内复用,空闲可回收),可配 timeoutMs、maxInstances、idleTimeoutMs、maxSessions 等。

设置 UI 与自动发现

完整重启 Desktop 或 Web 宿主后,可在「设置 → LSP」使用独立页面:服务器列表、只读诊断、短暂 initialize 验证、按 catalog 扫描 Go/Rust/TS·JS/Python/C++ 等候选。扫描只读、不安装;安装仍通过 lsp_setup 且 apply=true。Web 与 Desktop 共用 platform: web 的客户端 Bundle。

安装与启用

插件已核对 DSH 0.1.5-rc.2 / Desktop 2.0.10 的接口;其他版本需自行验证。安装插件本身不会下载或启动任何语言服务器(默认 servers: [])。

Web profile

已安装 DSH CLI,且 PATH 中有 pnpm 时,在插件目录执行:

dsh plugin --profile web add github:voidmind26/dsh-lsp-bridge

应使用已初始化的 web profile;安装后重启原有 web 进程并刷新页面。卸载:

dsh plugin --profile web remove dsh-lsp-bridge

Desktop profile(README 以 macOS 为例)

普通 CLI 会拒绝保留的 desktop profile,需用 Desktop 自带入口。示例:

dsh_packaged() {
  ELECTRON_RUN_AS_NODE=1 '/Applications/DSH Desktop.app/Contents/MacOS/DSH Desktop' \
    --expose-internals '/Applications/DSH Desktop.app/Contents/Resources/app/lib/desktop-cli.js' "$@"
}
dsh_packaged plugin --profile desktop add github:voidmind26/dsh-lsp-bridge

安装后重启 Desktop 并刷新 GUI。卸载:dsh_packaged plugin --profile desktop remove dsh-lsp-bridge。其他操作系统需使用该 Desktop 提供的 CLI 入口,README 未声明已验证。

手工配置(可选)

  1. 将 examples/cordis.patch.yml 里 id: lsp 的配置覆盖合入 $DSH_HOME/profiles/web/cordis.patch.yml 或 $DSH_HOME/profiles/desktop/cordis.patch.yml 的顶层数组(DSH_HOME 默认 ~/.dsh)。config 为整体替换,非深合并。
  2. 填写 servers;GUI 的 PATH 可能与终端不同,必要时写服务器命令的绝对路径。
  3. 若曾手动 insert 过 id: lsp,迁移时先移除旧插入,避免与 Bundle 重复注册。
  4. 在目标工程会话中使用 danger-full-access,先 lsp 的 status,再查真实文件中的定义。

典型用法

查询定义

行列须换成目标符号在文件中的真实位置(以下为 README 参数示例):

{"operation":"definition","file":"qsl-game-server/main.go","line":20,"character":8,"server":"go"}

工作区符号

{"operation":"workspaceSymbols","server":"go","root":"unityroomlib","query":"Router"}

工具返回形如 { "json": "...", "truncated": false };GUI/LLM 呈现的是 json 字段内容。结果过长会带 truncated 预览,不能把预览当作完整结果。

推荐首次启用流程

  1. 安装 Bundle 并重启宿主。
  2. 在 danger-full-access 会话中让智能体执行 lsp_setup 的 status 或 auto(需要安装时设 apply=true)。
  3. 调用 lsp 的 status 确认服务就绪。
  4. 对仓库内真实路径执行 definition、hover 或 diagnostics 等 operation。

适用场景与注意

适合谁: 已在 DSH Web 或 Desktop 中做代码相关智能体,希望模型通过 LSP 做定义跳转、引用、符号搜索、单文件诊断,而不是仅靠全文搜索;多语言、多仓 monorepo 需要 roots/workspaceFolders 的场景也可对照 README 中的三种「项目根」模式选型。

务必知晓:

  • 插件与语言服务器以当前 DSH 进程权限运行;安装前请阅读源码与 MIT 许可证,并理解 lsp_setup 仅在显式 apply=true 时才会在 $DSH_HOME/lsp-bridge 等目录执行 catalog 内命令。
  • C/C++ 的 clangd 无 catalog 内可移植安装方案,README 仅给出人工安装建议。
  • 内置 catalog 覆盖常见栈,其他兼容 stdio LSP 的服务器仍可手工配置,不代表插件会自动下载语言 SDK(例如仅有 typescript-language-server 而无 TypeScript SDK 时,status 会报 missing-dependency)。
  • README 说明:已有协议与 Bundle 结构的自动化测试,不能等同于你在真实 web/Desktop profile 上的安装结果;排查配置时除 profile 层外也可检查 $DSH_HOME/cordis.patch.yml。

DSH 生态强调「一切皆插件」;SkillHub 为社区目录站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-lsp-bridge 把 Harness 会话与 stdio 语言服务器之间的查询、配置和生命周期收成 lsp / lsp_setup 两条路径,并辅以「设置 → LSP」的发现与验证界面。若你的智能体需要在 DSH 里稳定地做代码语义检索,可按上文命令安装,在受控权限下完成 setup,再用真实文件坐标验证 definition 与 diagnostics。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜