elk-9527/dsh-vscode--packages-vscode-extension ↗★ 0

dsh-panel

在 VS Code 侧边栏中直接使用 DeepSeek Harness:桌面端运行时直接接入;未运行时使用同一份 $DSH_HOME 中已准备的配置集启动。 适合需要在 VS Code 侧边栏中直接与 DSH 桌面端或独立配置集交互的用户。

Package
dsh-panel
Compatibility
Unverified
Version
0.1.4
License
MIT
Last updated
Sep 20, 2026

Other repositories with this package name

Install

This plugin has no verified bundle, or compatibility checks failed. Read the repository notes first. Read the full README ↗

使用生产档运行 10 分钟,每 40 秒执行一个真实回合

node tools/soak.cjs --profile vscode-panel --minutes 10 --turn-every 40

更换端口,同时验证"该插件读取环境变量"(档中配置 47830,环境变量指定 47831)

node tools/soak.cjs --profile vscode-panel --port 47831 --patch --minutes 2


运行结束后输出:成功与失败回合数、内核是否自行退出、断线次数、内核退出前的输出。
(2026-09-19 使用该工具运行两轮、每轮 10 分钟:生产档 10 回合 0 断线、最小档 10 回合
0 断线。用户报告的"35 秒即退出"未能复现,见交接文档。)

### ACP 接入点插件的目标档选择

该插件安装在哪个 profile 中,面板就能连接哪个 profile 的 DSH。

**问题(2026-09-19)**:最初的默认值为 `desktop` 档,考虑是"与桌面端使用同一档,
记忆、技能与插件完全一致"。但该档**由桌面端独占**,普通命令行无法启动:

error: profile "desktop" is managed exclusively by the Electron application


因此在"桌面端未运行"的情况下面板必然无法启动,而该场景恰恰最需要面板自行启动。
当前的做法:

- 面板使用自己的档 **`vscode-panel`**(通过 `dsh --profile vscode-panel
  --from-default-profile web` 创建,再通过 `dsh plugin --profile vscode-panel add
  ` 安装该插件,以及用户使用的其他插件),命令行可以启动,也可以开启 TCP 接入端口;
- PATH 上的 `dsh` 是**桌面端自身的启动垫片**(`DSH Desktop.exe` 以
  `ELECTRON_RUN_AS_NODE` 运行 `desktop-cli.js`),它可以运行 `desktop` 档,
  但它位于一个带哈希的一次性目录中,桌面端更新后路径随之变化,因此启动较早的
  VS Code 可能仍指向已被删除的版本:`dsh` 找不到、`node bin.js` 拒绝
  `desktop` 档,**两种方式同时失败**。这就是该 bug 的完整成因。

**注意**:插件在内核启动时加载。安装完成后,已在运行的桌面端不会立即提供接入点,
应当重启一次桌面端(得到单进程、单内核的状态),
或者让扩展自行启动一个内核(记忆相同,仅多一个进程)。

### 受限模式(Restricted Mode)的兼容性

清单中声明了 `capabilities.untrustedWorkspaces.supported = true`。

该声明具有实际作用:**未声明该字段的扩展在 VS Code 的受限模式中会被完全禁用**,
表现为"面板不加载且无报错",排查困难(在隔离窗口中实际观察到:
同一个扩展,不带工作区文件夹时可以激活,带一个未被信任的文件夹时完全不加载)。
本扩展不执行工作区中的代码:读取工作区文件仅发生在用户主动右键「带进对话」时,
设置也只读取用户级设置(受限模式下 VS Code 不套用工作区设置)。

## 安装

1. **准备可由命令行启动的网页配置集**:桌面端正在运行且已安装配套插件时,面板会直接接入。
   若需要在桌面端未运行时使用面板,建议创建 `vscode-panel` 配置集:

   ```sh
   dsh --profile vscode-panel --from-default-profile web --dump-config

desktop 配置集由桌面端独占,不能作为自行启动的目标。 2. 为该配置集安装配套插件(首次安装时执行):

dsh plugin --profile vscode-panel add dsh-acp-door
dsh plugin --profile vscode-panel list

插件配置中的 provider 和 model 必须与本机 DSH 的可用服务一致,详见 dsh-acp-door 的配置说明。安装或更新插件后重启该配置集的内核。 3. 安装本扩展:在市场搜索 DSH Panel,或使用命令行 code --install-extension Elk-ydy.dsh-panel。使用 .vsix 时执行 code --install-extension .vsix --force,再执行一次 Developer: Reload Window。 4. 打开侧边栏,直接提问。

其它电脑与更新

  • 每台电脑独立安装 DSH、配套插件和本扩展。面板不会连接远程 DSH,也不会同步其它电脑的 $DSH_HOME;各电脑的记忆和会话记录由本机 DSH 管理。
  • 自启使用的 vscode-panel 配置集不会自动复制桌面端的插件或模型设置。需要相同行为时, 在该配置集中分别安装对应插件,并配置同一模型服务。
  • 接入点固定监听 127.0.0.1,不支持改为局域网地址、端口转发或隧道访问。
  • 从市场安装的扩展由 VS Code 按更新设置升级;从 .vsix 安装的版本需要手动安装新版 .vsix 并执行 Reload Window。插件的常规兼容更新使用 dsh plugin --profile update dsh-acp-door,完成后重启内核。

用法

  1. 点击侧边栏的 DSH 图标(活动栏中的对话气泡图标)。
  2. 直接提问。Enter 发送,Shift+Enter 换行。
  3. 顶栏显示模型下拉与上下文用量;右上角为「新建对话」与「重新连接」。
  4. 连接中途断开(例如 DSH 重启)时无需干预:下次发送会自动重连, 并自动接回原会话(ACP 的 session/resume 实测可保留上下文)。 若无法接回(内核中已不存在该会话),面板会明确提示「上一段会话未能恢复,此处为新对话。」, 不会静默替换为一段没有记忆的新对话。

将编辑器内容带入对话

提供两个命令(可在命令面板中搜索 DSH,或在编辑器内右键):

命令可用条件带过去的内容
DSH:把选中的代码带进对话编辑器中有选区时选中行的正文 + 该文件的链接
DSH:把当前文件带进对话已打开文件时仅提供该文件的链接,由 DSH 自行读取

带过去的内容会显示为输入框上方的一个小块,点击 × 可以移除;发送之后, 该消息气泡中仍保留当时带入的清单。

两者的区别在于:选区代码量小,且用户的意图通常就是"仅这几行",直接提供正文对模型最准确; 整个文件可能很大,只提供一条链接(ACP 的 resource_link),由 DSH 使用自身工具读取 —— 不占用上下文,读取到的始终是最新版本。

权限与确认

工具调用是否需要确认,取决于用户所用 profile 的权限策略(桌面端安装了 auto-approval, 默认不打断)。面板在内核实际发起询问时弹出选项,也会将代码改动渲染为 diff。

顶栏另有一个「权限」按钮(与桌面端功能相同):点开后显示内核中的权限预设 清单,桌面端具有的档在此处同样具有:

档含义来源
仅可查看可读取任何位置,但不修改任何内容内核自带
工作区内修改可在工作区/临时目录内写入,越界时先询问内核自带
Auto Approval可在工作区内写入,并自动批准无害的命令dsh-auto-approval-plugin(安装后才存在)
完全权限不再询问,可执行任何操作内核自带

以下是若干有意为之的设计:

  • 清单不在面板中硬编码,而是在每次创建会话时从内核读取(dsh-door/permission/get)。 因此用户或某个插件向内核新增档之后,面板立即显示该档,不会出现中文名乱码、 少一项这类错位。清单中无法识别的档(例如插件新增的档)原样显示内核提供的名称与说明。
  • 内置三档的说明文字为翻译后的中文(桌面端显示内核中的英文原文), 这是唯一一处刻意与桌面端不同的地方,目的是减少英文阅读。
  • 点击「完全权限」时会先确认一次(与桌面端一致):该档意味着不再逐条确认, 误选代价较高,因此确认步骤放在客户端而不是内核中。
  • 权限切换随时可执行,且对当前会话立即生效(与「模式」不同,模式无法更改当前会话)。 切换结果以内核回读的为准,失败时明确说明并回到实际状态。
  • 连接到的该插件版本过低(低于 0.0.12,例如桌面端档中的该插件)时, 按钮变为灰色的「切不了」,悬浮提示与对话流中说明原因与升级方法 (顶栏该位置仅有 4 个字的宽度,无法容纳原因,见「面向用户的文案长度上限」)。 此时仍可在桌面端自身的界面中切换,该界面不使用该插件这条路径。

设置

设置项默认值说明
dshPanel.host127.0.0.1该插件的监听地址
dshPanel.port47821该插件的端口,须与插件中配置的端口一致
dshPanel.autoStarttrue端口上不存在该插件时自行启动内核(启用后无需先启动桌面端)
dshPanel.fallbackProfilevscode-panel自行启动内核时使用的 profile(其中须安装该插件)。不应填写 desktop,该档由桌面端独占,命令行无法启动
dshPanel.dshCommanddshdsh 命令的名称或完整路径
dshPanel.provider / dshPanel.model空新会话的初始模型,留空由内核决定
dshPanel.cwd空新会话的工作目录,留空使用当前工作区

命令

  • DSH:新建对话 —— 关闭当前会话并新建一个会话。
  • DSH:重新连接 —— 断开后重新连接(在修改端口或刚启动 DSH 之后使用)。
  • DSH:查看日志 —— 打开输出面板中的 DSH Panel 通道,出现问题时在此查看。

当前范围与限制

  • 仅连接本机,没有鉴权机制。因此仅适用于本机使用。

  • 面板中的**预设(preset)**跟随该插件的配置,不能在会话中途切换: 内核的 agentPresets 在首个回合之后会锁定(agent-preset/locked), 并且 ACP 未将预设暴露为可选配置项。

  • 权限模式:ACP 同样未暴露该配置(ACP 仅支持模型与推理强度两个 config option), 因此该项为连接组件在内核之外提供的旁路方法,要求 dsh-acp-door 0.0.12 及以上。 所连接的内核版本过低、无法切换权限时,面板会自动改用自行启动的内核(该内核的组件 为与本扩展配套的新版本),因此「连接桌面端内核」不会导致权限选择器缺失; 代价是该时刻会多一个内核进程。确实无法切换(例如该 DSH 未提供权限设置)时, 按钮显示为灰色的「切不了」,原因以简述文本说明(不出现「门」「包名」「版本号」)。

  • 界面文案中不得出现内部术语(用户 2026-09-20 的原话为「『门』都出来了,别人能知道是什么意思?类似的提示全删了」)。因此界面文案中不得出现:连接组件名 (「门」)、包名(dsh-acp-door / dsh-base / @deepseek-ai/*)、版本号 (0.0.12)、「档」(profile)、设置项全名、「内核原话」这种仅内部使用的说法。 内核自身输出的原文不在此列:它保存在「原始报错(展开)」折叠区与日志中, 一个字都不删除,属于证据而非讲解。该规则由三个测试保证 (test/permission.js §6 黑名单、test/panel.js §8.7 与 §8.9 检查实际发出的消息、 tools/uitest.js 检查渲染出的悬浮提示)。

  • 历史会话列表可列出本机 $DSH_HOME/sessions 中的会话(标题、时间、回合数、 工作目录),点击一条即可接回上下文。面板优先向接入点查询;接入点版本较低时, 自动改为读取同一台机器上的会话文件,不要求修改桌面端配置集。

  • 顶栏仅显示简短状态(就绪 / 工作中 / 未连接)。报错原文与诊断信息进入对话流, 长原文收在「原始报错(展开)」的折叠区中,不占用顶栏空间。访问令牌、密钥、口令等敏感 参数的值会替换为「[已隐藏]」,其余内容保持原样。

  • 面向用户的文案长度上限(用户提过两次意见,2026-09-19 确定该规则):

    位置上限示例
    顶栏状态≤ 24 字,不允许换行正在启动…、就绪
    对话流提示第一行≤ 32 字正在启动 DSH…、继续使用当前正在运行的 DSH。
    提示中引用的内核原话另起一行,≤ 80 字原因:…
    报错标题 / 处理方式≤ 32 / ≤ 48 字额度或频率已达上限,本回合未完成。

    使用哪个档、哪个命令、哪个端口这类排障细节一律只写入日志(DSH:查看日志) 或折叠区;面板中不再出现「没有现成的内核,正在启动一个(档:vscode-panel)。 第一次会慢一点,之后就快了。」这类长句。该规则由两个测试保证 (test/panel.js §8.9 检查本次运行中实际发出的全部消息、 test/fallback.js 检查自启路径),文案加长会直接导致测试失败。

  • 两个内核并存的情形(autoStart 打开时):面板先连接 dshPanel.port(47821)上 已存在的内核。桌面端运行时该内核即桌面端的内核;若该内核无法切换权限,面板会改用 自行启动的内核(位于 selfStartPort)。因此在「桌面端 + VS Code 面板」同时 运行、而桌面档中的连接组件为旧版时,机器上会存在两个内核:一个属于桌面端, 一个属于面板。若只需一个内核,应将桌面档中的连接组件一并升级 (该档由桌面端管理,升级后需要重启桌面端)。

  • 顶栏配置行的宽度分配(同日确定,用户第二次反馈为「模型的占地有点大, 其他两点有点小」):三个格子按 7:6:6 分配,各自设有下限(模型 116 / 模式 96 / 权限 108),用量条位于最后、空间不足时自动换行(优先增加顶栏一行小条, 不压缩文字);面板宽度小于 360px 时收起「模型 / 模式 / 权限」三个标签, 剩余宽度全部分配给控件。上述规则在 tools/uitest.js 的 access 场景中有断言检查 (各 ≥100px、模型不超过模式格的 1.4 倍、按钮文字不截断、配置行不横向溢出)。

  • 不支持图片粘贴(内核实测 promptCapabilities.image = false)。

故障处理

  1. 先运行 DSH:查看日志,检查是否存在连接失败或握手异常的记录。

  2. 手动确认该插件是否在监听:Test-NetConnection 127.0.0.1 -Port 47821。

  3. 确认该插件已安装:dsh plugin --profile list。

  4. 对话流中显示「DSH 自己退出了(code=…)」 → 面板自行启动的内核已退出。 其后通常紧接内核最后的输出(内核原文)。查看全文:

    node tools/panel-log.cjs --grep 内核
    

    内核没有任何输出即退出,通常意味着该进程由外部终止(而非自身崩溃), 例如人工执行 taskkill、系统清理工具、或者杀毒软件。

  5. 对话流中显示「那是别处的 DSH(通常为桌面端)已退出或重启。」 → 断线来自桌面端内核的退出或重启,与面板无关。直接发送消息, 面板会自行启动内核并接回上下文。

开发

本扩展为纯 JavaScript、零运行时依赖、无构建步骤,修改文件后直接重载窗口即可。

一条命令运行全部测试(内核未启动时,测试会按需自行启动内核,运行结束后自行回收):

node test/run-all.js        # 快速套件:静态契约、纯函数与命令行回归;不启动 DSH
node test/run-all.js --ui   # 追加真实浏览器中的界面断言(需要 Chrome)
node test/run-all.js --all  # 追加面板层、真进程的自启内核、断线接回、模式、权限预设、端到端,约 4 分钟

# 真实 VS Code 隔离窗口中的端到端自检(不影响用户正在使用的窗口)。**发版前应带上 --linger**:
$env:DSH_PANEL_CHECK_PORT = '47830'
$env:DSH_PANEL_CHECK_PROFILE = 'vscode-panel'
$dshBin = Join-Path $env:USERPROFILE '.dsh\profiles\node_modules\@deepseek-ai\dsh\lib\bin.js'
$doorPatch = Join-Path $env:TEMP 'dsh-panel-test-door-47830.yml'
$env:DSH_PANEL_CHECK_DSH = "node `"$dshBin`" --patch `"$doorPatch`""
$env:DSH_PANEL_CHECK_LINGER = '90'      # 创建会话之后再持续观察 90 秒
node tools/vscode-check.js