dsh-terminal-button:在 DSH 底部复用官方终端并补齐桌面入口

前言

DeepSeek Harness(DSH)从 0.2.1 起在客户端内置了官方右侧栏终端:PTY、传输、会话列表、主题与 xterm 均由 @deepseek-ai/dsh-client-ui-sidebar-terminal 提供。若你更习惯在 composer 下方整行使用终端、或希望托盘与标题栏的「打开终端」落到同一块区域,再叠加复制粘贴快捷键与 shell 里的 dsh 命令,单独再搭一套终端栈既重复又难维护。下面介绍社区插件 dsh-terminal-button(维护者 whiteS18,分类:客户端):它不实现第二套 PTY/WebSocket/xterm,而是把官方终端渲染到会话列底部,并补上官方未覆盖的桌面入口与 CLI shim。

这是什么

dsh-terminal-button 是 DeepSeek Harness 的客户端插件,简介为「Embedded terminal plugin for DeepSeek Harness」;当前 npm 包版本为 0.4.4,许可证 MIT,源码见 GitHub:whiteS18/dsh-terminal-button,目录页见 SkillHub:dsh-terminal-button。

从 0.4.0 起,插件定位是「官方终端扩展」:在 conversation.composer.dock 懒加载官方包 chunk lib/client.terminal.js 中的 TerminalBody,数据来自官方客户端服务 webTerminals。插件自身不包含 PTY、WebSocket、xterm 或会话恢复逻辑。

核心功能

底部面板

面板布局与 0.3.x 时代一致:composer 底部独占一行、与主界面同宽,顶部可拖拽调高度;头部显示会话 cwd,底部保留状态行(连接中 / 运行中 / 已退出 / 错误、路径、「重开终端」)。官方终端被 Host 回收或销毁后(重启、会话卸载、空闲回收),再次打开面板时会自动新建终端并在状态行提示,无需手动点「新建终端」。

关闭面板仅 detach:官方视图与 Host 进程保留,按官方「未附着终端」超时(默认 2 小时)回收;重新 attach 会收到全屏快照。插件通过窗口 hold 桥接,避免没有侧栏 Tab 的底部终端被侧栏开关误释放 hold。

复制与粘贴快捷键

在底部面板内:

  • Ctrl+Shift+C:复制选区
  • Ctrl+Shift+V 粘贴;Windows/Linux 上 Ctrl+V 也可粘贴
  • Ctrl+C 仍为 SIGINT;macOS 上 Cmd+C / Cmd+V 保持原生行为

实现方式为向官方 xterm 转发浏览器 copy 与官方 paste 事件,选区与输入仍由官方渲染器处理(0.4.4 以 DOM 桥接补回 0.4.0 重构时丢失的快捷键)。

桌面「打开终端」入口

托盘、设置页、标题栏的「打开终端」在 Host 端 patch desktopRuntime.openTerminal,重定向到底部面板(SSE /dsh-terminal/events 通知前端)。若在插件设置里选择 系统弹窗,则放行原生行为,直接弹出系统终端窗口。

dsh 命令 shim

桌面版没有独立 dsh 可执行文件时,官方终端启动子进程通常只透传 DSH_SESSION_ID。插件 patch ctx.subprocess.spawnTerminal,把临时目录中的 dsh.cmd / dsh 前插到 PATH——官方右侧栏终端与底部面板均生效,且不会把任何 DSH_* 变量重新注入 shell。

显示位置与新会话界面

在 插件 → 插件列表 → 本插件详情 →「终端显示位置」 可选:

  1. 底部面板(默认)
  2. 系统弹窗

旧配置中的 sidebar 会自动归一为底部面板。右侧栏终端仍由官方提供。

进入「新会话」/空白会话(hero)界面时,底部面板会收起,且不会在发出第一条消息后自动弹回;只有明确点击终端图标才会重新挂出(监听 data-content-phase="hero")。

仍由官方负责的能力

主题跟随、OSC 调色板、光标对比度、鼠标选择、字体与字号、Shell 选择(含 preferredShell)、终端数量上限、跨刷新恢复等,均使用官方终端实现,本插件不重复实现。

兼容性与依赖

  • 需要 DSH Desktop 0.2.1-rc.2 及以上。
  • Profile bundle 中须启用官方终端插件 @deepseek-ai/dsh-client-ui-sidebar-terminal(dsh-web-app 默认会注入)。
  • 客户端通过官方 modules.importChunk() 载入渲染组件,通过 webTerminals 复用视图;Host 端需要 webServer 与 subprocess 服务。DSH 若改动上述契约,插件需跟随适配。

安装与启用

桌面 profile 安装(命令来自项目 README):

dsh plugin --profile desktop add dsh-terminal-button

本地开发目录安装:

dsh plugin --profile desktop add /绝对路径/dsh-terminal-button

启动顺序决定是否需要重启:插件 bundle 在 DSH 进程启动时组合,安装命令只改磁盘上的 profile 文件。

  1. 先安装 → 再启动:直接生效。
  2. 先启动 → 再安装:装完后须完全退出并重新启动 DSH Desktop。

仅修改 client.js(客户端半部)时,client-hmr 可热更新或刷新窗口;修改 index.js(Host 半部)须重启 DSH Desktop。

安装后可用 Host 健康检查确认 Host 半部已加载(<port> 换成本机 DSH 端口):

curl http://127.0.0.1:<port>/dsh-terminal/health

正常应返回 {"ok":true}。

典型用法

  1. 按上文命令安装并确保 DSH Desktop 已重启(若安装时 DSH 已在运行)。
  2. 在会话 composer 区域使用终端图标或桌面「打开终端」入口,终端出现在底部面板(除非设置为系统弹窗)。
  3. 在面板内用 Ctrl+Shift+C / Ctrl+Shift+V(或 Linux/Windows 下的 Ctrl+V)处理复制粘贴;需要时在状态行使用「重开终端」。
  4. 在终端 shell 中直接调用 dsh(PATH 已由插件 shim 注入)。
  5. 需要外置系统终端时,在插件详情把「终端显示位置」改为 系统弹窗。

调试时可打开 DSH Developer Tools(标题栏扳手或 Ctrl+Shift+I),在 Console 查看 window.__DSH_TRANSPORT__、window.__DSH_BOOT__ 等;底部面板加载失败时,面板内会显示原因(例如官方 chunk 不可用或 webTerminals 服务缺失)。

适用场景与注意

适合:已在用 DSH Desktop、希望 composer 下方整行终端、统一桌面「打开终端」行为,并在 shell 里使用 dsh CLI 的开发者。

注意:

  • 插件 Host 半部以当前 DSH 进程权限运行;安装前请阅读 源码与 LICENSE,自行评估信任边界。
  • 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本插件是对官方终端的扩展而非替代整套终端栈。
  • 0.4.x 为「官方终端扩展」架构;0.3.x 为插件自带终端的旧实现,升级路径与变更见仓库 CHANGELOG.md。

结尾

dsh-terminal-button 把官方 @deepseek-ai/dsh-client-ui-sidebar-terminal 接到 composer 底部,并补齐桌面入口重定向、复制粘贴快捷键与 dsh PATH shim,避免重复维护第二套终端。安装命令为 dsh plugin --profile desktop add dsh-terminal-button;详情与 issue 见 GitHub,目录索引见 SkillHub 插件页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜