編集者注

kalynnka/vscode-deepseek-harness

Unofficial: drive your own DeepSeek Harness (dsh) as a native VS Code chat agent, beside Claude Code and Codex.

これは DeepSeek Harness(DSH)プラグインです。当サイトは GitHub README、インストール情報、メンテナンス状況、公開セキュリティシグナルをまとめています。

vscode-deepseek-harness

一个非官方 VS Code 扩展,将 DeepSeek Harness 注册为 VS Code 原生 agent sessions 视图中的 chat session target —— 与 Claude Code 和 Codex 使用相同的界面 —— 而不是再提供一个 webview 聊天面板。

状态:M0–M5 已实现。 VSIX 可以构建、安装并在授予 proposed APIs 后正常激活。

DeepSeek Harness answering in VS Code's chat panel, with the sessions list beside it

使用

dsh 在 Copilot 所在的同一个 chat panel 中回答。 没有第二个侧边栏,也没有 webview:上方的面板是 VS Code 自带的,其中的回复来自这台机器上的 dsh

由哪个 agent 回答由 composer 底部的一个选择器决定,默认安装下显示 Local。点击它并选择 DeepSeek Harness —— 此后你在该聊天中输入的所有内容都会发送给你的 harness。这个 chip 会一直保留直到你更改它,因此这是一个按会话(per-conversation)的选择,而不是一种模式。

一旦切换到它,composer 就是普通的那一个,这里值得关注的几个部分是:

composer 中的内容到达 dsh 的内容
你的编辑器选区,以 chip 形式固定文件、行范围,以及选中的行本身
拖入的文件,或 # 引用的文件它的路径,相对于会话的工作目录
粘贴的图片真实的图片附件(当模型接受时)
/ 开头且命中 dsh 所拥有命令的行该命令,通过 dsh 自己的命令注册表执行 —— 永远不会发送给模型
Model 选择器session.selectModel —— 你的 dsh 提供的每一个 provider 和 model
Reasoning 选择器所选模型的 efforts,带该模型自身的默认值
Permissions 选择器read-only / workspace-write / danger-full-access,你的 dsh 的 preset 表里有什么就提供什么

选区以文本形式发送,因为 dsh 没有结构化的引用类型;已保存的文件以路径形式发送,因为 dsh 有自己的读取工具,更愿意自己打开文件而不是被传入内容。这两个决定及其代价都在 gaps §10 中说明。

右侧的 SESSIONS 列表是你的真实 dsh session 历史 —— 与 dsh web UI 显示的是同一批会话,因为它们是同一个 harness。打开一个会话会重建其 transcript;New Session 会在你的 workspace 文件夹中开启一个新会话。

它做什么

Sessions 列表你的真实 dsh 会话,实时更新:新增、移除、运行中以及等待你处理的状态
Transcript从 session log 重建的过往 turn,带 tool cards
实时 turn散文、推理和 tool calls 实时流式输出
问题在聊天中内联回答,像 dsh 的 ask() 一样精确地阻塞
Approvals同样,以 Allow once / Reject 提示的形式
Attachments你的选区及其行范围、拖入的文件、# 引用、粘贴的图片
Model 切换你的 dsh 提供的每一个 provider 和 model,按会话实时读取
Thinking effort所选模型的 reasoning efforts,带其自身默认值
Permissions会话的 preset,通过 dsh 自己的 /permission 命令切换
Slash commandsdsh 自己的 plancompactfeedbackexportpermissiongoal —— 从 composer 和 Command Palette 代理执行,绝不发送给模型
Token 用量每 turn 的 prompt 与 completion,含 cache 读写拆分
Context每个会话行上模型窗口的百分比
Control停止、从所选 turn fork、在你的 workspace 文件夹中新建会话
命令切换模型composer 里的 /models(或 Command Palette 的 Switch Model…)打开 dsh 自己的模型目录

上表中没有任何硬编码。Providers、models、reasoning efforts、标题、token 计数和 context 容量都从运行中的 harness 读取,因此你的 dsh 明天新增的模型无需在此更新即可出现。

Slash commands

dsh 自己的 slash commands —— /plan/compact/feedback/export/permission/goal,以及这个 dsh 提供的任何其他命令 —— 是代理执行的,而不是发送给模型。两个入口:

  • 在聊天中。/ 开头、且命中该会话 dsh 所拥有命令的行会在到达模型之前被拦截:它通过 dsh 自己的命令注册表执行,结果内联渲染在聊天里,不会开启 turn,也不产生任何计费。未知的 /foo 不会被拦截,会作为普通 prompt 流入模型 —— 与 dsh 自己的 web composer 的处理方式完全一致。因此在这里输入 /permission read-only 是即时且免费的,而不是一次模型调用。
  • / 下拉列表。 在 composer 中输入 / 会把 dsh 的命令与编辑器自己的命令一并列出,选中即通过同一个代理执行。编辑器在注册时就固定了 agent 的下拉列表,所以这些条目是静态贡献的,再按 commands/list 实时过滤:你的 dsh 未声明的命令不会显示;超出该列表的新命令手动输入仍会执行,只是无法出现在下拉列表里。见 gaps §16
  • Command Palette → DeepSeek Harness: Run Slash Command… 选择要操作的会话(或让它在你的 workspace 中新建一个),从 dsh 的实时命令目录中挑选命令,按 dsh 声明的输入提示填写参数,然后运行。选择器还提供一个自由输入项,用于输入任何 /command line

执行层面没有任何硬编码:命令集合、描述和输入提示都来自对确切会话的 commands/list,因此你的 dsh 明天新增的命令无需在此更新即可运行。下拉列表的条目是唯一的静态部分,而实时目录决定其中哪些会显示。其机制 —— 以及为什么朴素的 session.prompt 会白白花掉一个 turn —— 见 gaps §12

下拉列表里还有四个属于编辑器而非 dsh 的命令:/fork 通过 dsh fork 会话(与本扩展 fork handler 的切分点一致),/vscode-pet 是 workbench 的彩蛋,/debug 属于 Copilot Chat。编辑器的 /models 对贡献型会话是空操作,因此本扩展用自己的同名命令遮蔽它:选中或输入 /models 会打开 dsh 的模型目录(下拉列表会显示两个条目 —— 有效的那个带着 dsh 的描述),切换后 composer 自己的选择器会跟随。编辑器的条目无法被隐藏;原因见 gaps §19

与上游的关系

DeepSeek Harness 不接受外部 pull request,因此本项目位于该仓库之外,并通过其现有的 /api carrier 与之通信 —— 与其自己的 web UI 使用的 HTTP + WebSocket 接口相同。没有 fork,没有 patch。

此扩展永远不会捆绑 dsh。 它驱动你已经安装的 dsh,使用你真实的 $DSH_HOME,因此你的 profiles、settings、credentials、skills 和 session history 都是你已有的那些。整个 VSIX 只有 42 KB:一个打包的 JavaScript 文件、一个 manifest 和图形资源。

它也从不要求你的 API key。Credentials 留在 dsh 自己的 credentials plane 中,即你已经存放它们的地方 —— 它们永远不会被复制到 VS Code settings 中。

要求

  • VS Code 1.133.0 或更高版本。
  • 你自己安装的 DeepSeek Harness:PATH 上的 dsh,或已构建的 checkout(见 settings)。
  • 为此扩展启用 proposed APIs —— 见下文。

安装

此扩展不在 Marketplace 上,也无法上架 —— 声明了 enabledApiProposals 的扩展在发布时会被拒绝。手动安装 VSIX 是唯一途径,下面的 proposal 选择不是可选项:没有它,contribution 会被静默跳过,任何地方都不会出现任何内容。

1. 获取 VSIX。Releases 下载 —— 每个 release 都附带从该确切 tag 构建的 .vsix —— 或者自己构建:

npm install
npm run build
npm run package        # → deepseek-harness-sessions-<version>.vsix

2. 安装它。

code --install-extension deepseek-harness-sessions-*.vsix

3. 授予 proposed APIs —— 见下一节 —— 然后重启 VS Code。不是 reload,而是 restart,因为 argv.json 只在启动时读取一次。

升级时,将较新的 VSIX 安装覆盖旧版本即可;argv.json 中的 grant 以扩展 id 为键,会保留下来。

启用 proposed APIs

此扩展使用 proposed APIs,无法通过 Marketplace 发布。你只需选择一次:

  1. Command Palette → Preferences: Configure Runtime Arguments

  2. 将扩展 id 添加到 enable-proposed-api

    {
      "enable-proposed-api": ["kalynnka.deepseek-harness-sessions"]
    }
    
  3. 重启 VS Code。

不需要在编辑器的内部 allowlist 上。VS Code 会先检查 product.json 的 allowlist,然后回退到 enable-proposed-api 中指定的任何内容,因此这条记录就是全部授权。

Extension development mode 不是替代方案。 在 stable 构建上,编辑器要求 isExtensionDevelopment && quality !== 'stable' 才会广泛授予 proposals,所以单独按 F5 什么也得不到。bundled launch configuration 正是为此而显式传递 --enable-proposed-api

验证授权

src/probe.ts 针对你实际运行的构建来回答这个问题,这也是唯一能回答它的地方:

npm run build
touch .dsh-probe-request
code --user-data-dir ~/.dsh-probe-vscode \
     --extensions-dir ~/.dsh-probe-vscode-ext \
     --extensionDevelopmentPath "$PWD" \
     --enable-proposed-api kalynnka.deepseek-harness-sessions \
     --new-window
cat .dsh-probe-result.json

它会写入判定结果,然后退出它打开的窗口:

{ "vscodeVersion": "1.133.0", "ok": true, "missing": [] }

将 user-data-dir 放在你的 home 目录下;在 macOS 上,VS Code 不会针对 /private/tmp 下的目录启动。

每次 VS Code 升级后重新运行它 —— 被定稿或撤回的 proposal 会在此显示为 ok: false 并点名缺失的具体成员,而不是一个没有任何错误提示的空会话列表。

probe 会调用 proposed 函数,而不是仅仅检查它是否存在。这个区别就是全部测试:VS Code 无条件导出 proposed 类和命名空间函数,只在调用时拒绝,因此存在性检查即使 proposal 已被拒绝也会报告成功。在 1.133.0 上测得:

无 flag--enable-proposed-api <id>
--extensionDevelopmentPathdeniedgranted
installed VSIXdeniedgranted

故障排查

任何地方都没有 DeepSeek Harness 条目。 chatSessions contribution 本身受 proposal 门控 —— 缺少授权时 VS Code 会静默跳过它,任何地方都没有错误。检查 argv.json,然后重新运行上面的 probe。

没有与 Claude Code 和 Codex 并排的 DeepSeek Harness tab 这是预期行为,且无法从这里修复:那个 tab 条来自编译进 VS Code 的一个封闭的 session types allowlist,第三方类型被构造性地排除。第三方 session provider 会以 agent 的身份出现在 Chat composer 中 —— "Chat with DeepSeek Harness"。见 gaps §9

启动会话。 Command Palette → New DeepSeek Harness Session,或 chat 头部的 + ⌄ 下拉菜单。在普通 CHAT tab 中输入不会到达 dsh —— 那个 tab 属于本地 agent,在那里发送的消息由当前选中的 agent 回答(默认安装下是 Copilot)。

这些命令之所以存在,只是因为 contribution 设置了 canDelegate: true。VS Code 的 _enableContribution 在该 flag 设置时才注册 session agent 和按类型的 New … Session 命令;没有它,session type 会被注册但完全不可达,且没有任何错误来解释这一点。

Sessions 列表。 "chat.viewSessions.enabled": true 显示它;Chat Agent Sessions: Focus Agent Sessions 聚焦它。注意 Chat: Show Sessions 不是 Command Palette 命令 —— 它只存在于 Chat welcome 视图的 context menu 中 —— 而 chat.viewSessions.enabled 为 false 时,Focus 命令会从 palette 中隐藏。

日志中出现 "No dsh found"。 deepseekHarness.executabledeepseekHarness.checkoutPathmachine 作用域的,因此 VS Code 只从 User settings 读取它们 —— workspace 或 folder settings 中的值会被刻意忽略,因为仓库不能把扩展指向任意二进制文件。

Settings

Setting默认值用途
deepseekHarness.executable""dsh 不在 PATH 上时指定你的 dsh
deepseekHarness.checkoutPath""已构建的 deepseek-harness checkout,通过 node 运行
deepseekHarness.home""覆盖 $DSH_HOME;为空表示使用你真实的那一个
deepseekHarness.historyPageMessages10每页 session.history 的消息数 —— 刻意保持较小,见 gaps §1 与 §17
deepseekHarness.historyTurns10重新打开会话时恢复多少条历史 prompt;取满这么多条后停止翻页
deepseekHarness.extraArgs[]传给 dsh web 的额外参数

bind host 和 port 刻意不可配置。dsh web server 没有 TLS 也没有 auth,因此它总是在 loopback 上用临时端口启动,作为此扩展拥有并在退出时杀掉的子进程。

开发

npm install
npm run build       # 或:npm run watch
npm run typecheck
npm run smoke       # 只读:启动你的 dsh,读取 list/history/models,不写入任何内容

如果 dsh 不在你的 PATH 上,npm run smoke 需要设置 DSH_CHECKOUTDSH_EXECUTABLE

然后按 F5Run Extension),它会启动一个已经设置好 proposal flag 的 Extension Development Host。

提交遵循 Conventional Commits;PR 标题是 release-please 读取的内容,因为 squash merge 会保留标题而丢弃分支的 commit subjects。

非官方声明

这不是 DeepSeek 的项目。它不是由 DeepSeek 或 DeepSeek Harness 维护者构建、背书、审查或支持的,它的 bug 是仓库的 bug —— 请不要把它们提交到上游。

DeepSeek Harness 不接受外部 pull request,这正是本项目作为独立扩展、通过其公开的 /api carrier 与 harness 通信而不是作为其 patch 存在的原因。

DeepSeek 名称和 whale 标志属于 DeepSeek。它们在此作为图标和显示名出现,以便 agent 能让人认出它所驱动的是哪个 harness,取自 DeepSeek Harness 文档站点;来源在 media/ 中。不声称或暗示任何隶属或背书关系。如果 DeepSeek 不希望以这种方式使用它们,请开一个 issue,它们会被替换。

许可证

MIT —— 适用于本仓库中的代码。它不涉及 DeepSeek Harness 本身(后者有自己单独的许可证),也不涉及上面的标志。

REPOSITORY SIGNALS

セキュリティとインストールエビデンス

このスコアは公開リポジトリメタデータと当サイトに登録されたインストールエビデンスのみに基づくもので、コードセキュリティ監査とは異なります。

出所の追跡可能性

公開プラグインカタログから取得し、公開 GitHub リポジトリにリンクしています。

ライセンス

リポジトリは MIT ライセンスを宣言しています。

メンテナンス活動

過去180日以内にコードの更新があります。

インストールエビデンス

再現可能な正確なインストールメタデータはまだ登録されていません。リポジトリの説明に従って手動で確認してください。

インストールライフサイクルスクリプト

確認したパッケージメタデータにインストールライフサイクルスクリプトは宣言されていません。