omdsh-chatmode:给 DeepSeek Harness 加一个 Chat / Work 模式开关

前言

DeepSeek Harness 的 web GUI 是一个编码智能体,New Session 界面要求先选一个工作区才接收消息——对编码智能体来说合理,因为它总得工作在某个目录里。但不是每次提问都是工作:想随手问一句、理一条思路时,选目录这一步就成了障碍。

DSH 的理念是一切皆插件,这类体验缺口正好留给插件补。下面介绍的 omdsh-chatmode 做的就是这件事:在对话上方加一个 Chat / Work 切换,Chat 模式下不用选项目目录就能开始对话,这些对话统一收纳在侧边栏一个受管的 Chat 工作区里。

这是什么

omdsh-chatmode 是 DeepSeek Harness web GUI 的聊天模式插件,属于 omdsh-plugins,npm 包名 @omdsh-plugins/omdsh-chatmode,当前版本 0.2.5,许可证 MIT,包元数据中归类为 workspace。

它依赖 omdsh-basemode 发布的注册表(sessionModesmodeOfcolumn 等),自身不修改 harness 的任何部分,全部能力建立在这些接缝上。

核心功能

Chat / Work 开关与受管工作区

插件向 omdsh-basemode 发布的 sessionModes 分段注册表注册 Chat 和 Work 两个分段,在会话上方提供模式切换。同时注册真实目录 <dshHome>/sessions/chat 作为侧边栏的 Chat 工作区分组,并保持其标题为 Chat;无论打开多少项目,该分组始终排在侧边栏第一位——host 半区在启动时置顶,browser 半区负责维持。

两个分段携带 tone / owns,侧边栏会话上的绿、蓝圆点由 omdsh-basemode 依据这些声明绘制。

Chat 的新会话行上,工作区 chip 被移除:插件对自带按钮做标记而非替换,harness 自带的预设 chip 保留在原位。

模式是派生的,不是存储的

一个会话是 Chat,当且仅当它归入受管的 Chat 工作区。开关读取这一事实并报告它,所以从侧边栏打开一个对话会把开关移动到对应模式——开关描述当前会话所在位置,而不是决定它。

相应地,按分段是导航,不是状态写入。

Work 切换始终留在当前项目

按 Work 时,插件先借助 omdsh-basemode 发布的 sessionModes.column 判定屏幕上的项目,然后按顺序回答:回到该项目最近离开的会话、其次该项目最近的会话、否则在该项目新建一个——不会跳到别的项目。

“最近的会话”有两个排除条件:

1、其他 posture 认领的会话,注册表用 modeOf 判定,模式增加时依然成立;
2、空白会话——除非项目里只有空白会话,此时空白会话就是这个项目的 New Session 行,打开它好于再建一个。

另外,Chat 分段声明 inProject: false,表明其对话不归档于某个具体工作项目。

New Session 的归属

New Session 请求先交给持有当前列的分段处理,也就是 modes.registernewSession 回调;Chat 与 Work 不响应,交给框架自身的 New Session,并让出该列。本插件负责的一处行为是:New Session 复用工作区已有的空白会话。

安装与启用

本包是 profile bundle:通过 dsh plugin 安装进 profile,并追加到该 profile 的 layer stack,它的加载行组合在自带代码树之上。README 只描述了这一机制,未给出完整命令原文,本文不代拟,安装前以仓库 README 为准。

版本与环境要求(来自 package.json):

包名:@omdsh-plugins/omdsh-chatmode
版本:0.2.5
Node:^22.19.0 || >=24.0.0
包管理器:pnpm@11.7.0
许可证:MIT

client 侧注入以下模块,platform 为 web:

@deepseek-ai/dsh-client-locale
@deepseek-ai/dsh-api-session-controller
@deepseek-ai/dsh-api-workspace-controller

它不替换 harness 的任何控件。移除插件时,加载行、两个分段及其用到的所有接缝会一并移除。

典型用法

经过上面的安装,日常使用就是三种导航:

1、按 Chat:回到离开的聊天,或在 Chat 工作区开始一个新对话;
2、按 Work:回到当前所在项目中离开的工作会话,否则该项目最近的会话,否则在该项目新建一个;
3、从侧边栏打开一个对话:开关随之移动到对应模式。

对话里跑的是什么:聊天运行与工作会话相同的 agent,使用部署默认预设——除非部署另有说明,即为 Standard mode。要换预设,仍用 harness 自带的 chip。

对想给 omdsh-basemode 写模式的开发者,README 给了 newSession 回调的接口示例,omdsh-chatmode 的 New Session 路由依赖这一约定:

modes.register({
  id: 'code',
  newSession: (workspaceId) => startAnotherTerminal(workspaceId),
})

返回 true 表示“我已启动”,列保持不变;不响应的模式把请求让给框架处理。

适用场景与注意

适合在 DSH web GUI 里既有项目工作、也想随手提问的人:问题不关于某个项目时,不必为它选目录,这些对话也与项目会话分开收纳。

使用前注意三点:

1、插件依赖 omdsh-basemode 发布的注册表(sessionModesmodeOfcolumn 等),环境里需要这套接缝;
2、插件以当前 dsh 进程的权限运行,安装前应检查源码与许可证,本插件许可证为 MIT;
3、它是 profile bundle 而非对 harness 的改动,移除即整体还原。

结尾

omdsh-chatmode 用一个开关和一组受管接缝,把“随手一问”和“项目工作”在 DSH web GUI 里分开,且没有动 harness 本身。如果你两种用法都有,可以看一下。

  • GitHub:https://github.com/omdsh-plugins/omdsh-chatmode
  • 社区目录页:https://www.skillhub.cn/plugins/omdsh-plugins/omdsh-chatmode (skillhub 为独立社区目录,与 DeepSeek / 幻方无官方从属关系)
羽毛球分组比赛记分
小程序二维码

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

小夜