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

dsh-panel

VS Code 侧边栏 DSH 交互面板扩展 适合需要在 VS Code 侧边栏中直接与 DSH 桌面端或独立配置集交互的用户。

包名
dsh-panel
兼容性
待验证
版本
0.1.4
许可证
MIT
最近更新
2026年9月20日

同名包的其他仓库

安装

此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 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