elk-9527/dsh-vscode--packages-vscode-extension ↗★ 0
dsh-panel
VS Code 侧边栏 DSH 交互面板扩展 适合需要在 VS Code 侧边栏中直接与 DSH 桌面端或独立配置集交互的用户。
同名套件的其他儲存庫
安裝
此插件尚未提供可驗證的 bundle,或相容性檢查未通過。請先閱讀倉庫說明。 閱讀完整 README ↗
說明文件
閱讀完整 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,完成后重启内核。
用法
- 点击侧边栏的 DSH 图标(活动栏中的对话气泡图标)。
- 直接提问。Enter 发送,Shift+Enter 换行。
- 顶栏显示模型下拉与上下文用量;右上角为「新建对话」与「重新连接」。
- 连接中途断开(例如 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.host | 127.0.0.1 | 该插件的监听地址 |
dshPanel.port | 47821 | 该插件的端口,须与插件中配置的端口一致 |
dshPanel.autoStart | true | 端口上不存在该插件时自行启动内核(启用后无需先启动桌面端) |
dshPanel.fallbackProfile | vscode-panel | 自行启动内核时使用的 profile(其中须安装该插件)。不应填写 desktop,该档由桌面端独占,命令行无法启动 |
dshPanel.dshCommand | dsh | dsh 命令的名称或完整路径 |
dshPanel.provider / dshPanel.model | 空 | 新会话的初始模型,留空由内核决定 |
dshPanel.cwd | 空 | 新会话的工作目录,留空使用当前工作区 |
命令
DSH:新建对话—— 关闭当前会话并新建一个会话。DSH:重新连接—— 断开后重新连接(在修改端口或刚启动 DSH 之后使用)。DSH:查看日志—— 打开输出面板中的 DSH Panel 通道,出现问题时在此查看。
当前范围与限制
-
仅连接本机,没有鉴权机制。因此仅适用于本机使用。
-
面板中的**预设(preset)**跟随该插件的配置,不能在会话中途切换: 内核的
agentPresets在首个回合之后会锁定(agent-preset/locked), 并且 ACP 未将预设暴露为可选配置项。 -
权限模式:ACP 同样未暴露该配置(ACP 仅支持模型与推理强度两个 config option), 因此该项为连接组件在内核之外提供的旁路方法,要求
dsh-acp-door0.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)。
故障处理
-
先运行
DSH:查看日志,检查是否存在连接失败或握手异常的记录。 -
手动确认该插件是否在监听:
Test-NetConnection 127.0.0.1 -Port 47821。 -
确认该插件已安装:
dsh plugin --profile list。 -
对话流中显示「DSH 自己退出了(code=…)」 → 面板自行启动的内核已退出。 其后通常紧接内核最后的输出(内核原文)。查看全文:
node tools/panel-log.cjs --grep 内核内核没有任何输出即退出,通常意味着该进程由外部终止(而非自身崩溃), 例如人工执行
taskkill、系统清理工具、或者杀毒软件。 -
对话流中显示「那是别处的 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