前言¶
在 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 未声明已验证。
手工配置(可选)¶
- 将
examples/cordis.patch.yml里id: lsp的配置覆盖合入$DSH_HOME/profiles/web/cordis.patch.yml或$DSH_HOME/profiles/desktop/cordis.patch.yml的顶层数组(DSH_HOME默认~/.dsh)。config为整体替换,非深合并。 - 填写
servers;GUI 的 PATH 可能与终端不同,必要时写服务器命令的绝对路径。 - 若曾手动
insert过id: lsp,迁移时先移除旧插入,避免与 Bundle 重复注册。 - 在目标工程会话中使用
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 预览,不能把预览当作完整结果。
推荐首次启用流程¶
- 安装 Bundle 并重启宿主。
- 在
danger-full-access会话中让智能体执行lsp_setup的status或auto(需要安装时设apply=true)。 - 调用
lsp的status确认服务就绪。 - 对仓库内真实路径执行
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。