dsh-new-session:给 DSH 的模型一个能真正新开对话的工具

前言

在 DSH 里跑长任务时,经常会遇到一种尴尬:上下文已经塞满,代码也改完了,模型说「接下来的东西不适合在这个对话里继续,我们新开一个对话吧」——然后它其实开不了。DSH 0.2.1 里模型给出的典型回答是「新对话我开不了,那是界面操作」。左侧栏的「新对话」按钮确实存在,但那条通路(sessionController.commands.create + commands.prompt)没有暴露成工具,模型只能先停下来等你手动点。

dsh-new-session 就是补这个缺口的插件:它把建会话、投递交接消息、附带上一段对话的只读引用、自动切到新会话这一整套动作,做成一个模型可以直接调用的 new_conversation 工具。维护者是 CassiaTw1g,分类是工作流。

下面按「这是什么 → 装什么 → 怎么用 → 有什么要注意的」来讲。

这是什么

一句话定位:一个 DSH 插件,让模型在当前工作区里真正创建一个新会话,并立刻开始干活,同时把界面切过去。

它做的事情拆成四步,对应工具里的四个能力:

能力 说明
建会话 建在调用方当前所属的工作区(workspaceRegistry)里,侧边栏直接出现,不是孤儿会话
投交接 交接内容作为新会话的首条用户消息投进去,新会话立刻跑自己的第一轮,调用方不等它结束
带引用 reference_current: true(默认)会在首条消息里附一段本对话的只读快照引用;不给它引用时,prompt 必须自包含
切视图 结果落地后调 uiWorkspace.openSession(sessionId),主视图跳到新对话

另外它会把 title 通过 session/title 的 user 来源钉住,这样自动标题(fallback / LLM)不会再覆盖你指定的标题。工具行渲染成一张「新开对话」卡片,显示标题、工作区、session id 和打开按钮;失败时卡片上直接写原因。

仓库地址:https://github.com/CassiaTw1g/dsh-new-session,目录页:https://www.skillhub.cn/plugins/CassiaTw1g/dsh-new-session。许可证 MIT,engines.node >= 22。

工具参数

new_conversation 的参数就五个,全部来自 README:

  • prompt:必填,交接内容
  • title:新会话标题
  • workspace:工作区;写错会报错并列出可选工作区
  • reference_current:是否附带上一段对话的只读引用,默认 true
  • switch:是否自动切视图,默认开

其中 switch / reference_current 可以覆盖全局配置里的同名默认值。

和已有插件的差别

README 里列了两个社区相近的插件,都是作者查过 npm / GitHub 的:

  • @ryuu-64/dsh-session-tools:提供 session_create / session_send / list_sessions / session_wait,功能很全,但 peer 依赖钉在 0.2.0-rc.2,而且建会话是「出一张卡片,手动点开」。
  • dsh-session-messaging:会话之间互发消息,没有建会话。

dsh-new-session 的差异点是三点:自动切换(作者称之为 codex 的手感)、内置跨对话引用、宿主半边零 @deepseek-ai/* import,所以不挑宿主小版本,装进任意 0.2.x profile 都不会因为 peer 解析失败而挂。

安装

README 给了三种方式,按省事程度排。

方式 0,npm / 插件市场:

dsh plugin --profile desktop add dsh-new-session

或者在 DSH 的「插件 → 发现」里搜 new session。README 在这里有一句注:索引上架后才可见;同时它自己也提到「npm 还没发布、或想跟主干」的情况,这时走下面的方式。桌面版要先完全退出,dsh plugin 才能拿到 profile 锁。

方式 A,仓库里的安装脚本,README 标为推荐,桌面版运行中也能装:

node tools/install-profile.mjs                      # 默认 desktop profile
node tools/install-profile.mjs --profile headless   # 其它 profile
node tools/install-profile.mjs --dry-run            # 只看会做什么
node tools/install-profile.mjs --profile desktop --rollback   # 撤销

脚本做的是文件级安装:复制包、改 package.json 的 dependencies 和 dsh.profile.bundles,每次都留一份 package.json.bak-newsession-<时间戳> 备份。

方式 B,dsh plugin 指向本地路径:

dsh plugin --profile desktop add file:D:/DSH/插件/dsh-new-session

装完之后的收尾动作,README 写得很具体,这两步都在做同一件事:让两边各自重新加载。

  1. 宿主半边:桌面版通过 profile 热重载挂上新工具,README 的实测记录是秒级生效;没生效就完全退出 DSH 再打开。
  2. 浏览器半边:刷新一次页面,因为 dsh.client 的模块图是在页面加载时组装的。

配置

全部配置都在 cordis.patch.yml 里,只有几行:

- insert:
    - id: new-session
      name: dsh-new-session
      config:
        autoSwitch: true        # 结果落地后自动切到新对话
        referenceCurrent: true  # 自动附加上一段对话的只读引用
        switchDelayMs: 900      # 切换前的停顿(毫秒)
        # toolName: new_conversation

也就是说,不写任何配置直接装,默认行为就是「自动切 + 带上一段对话的只读引用 + 切之前停 900 毫秒」。

用法

装好之后不需要记参数,直接跟模型说人话就行。README 给的示例:

新开一个对话,把 X 剩下的事继续做完。

模型会调 new_conversation,然后写一段自包含的交接,内容至少包含目标、已完成、下一步、约束、路径这几项。新会话建起来立刻开工,界面切过去;旧会话保持原样,随时可以切回来。

想把交接做得稳一点,可以明确要求交接段落自包含,或者明确说不要带引用。调用方和接收方都不依赖彼此记得上一句说了什么,这是这套设计的核心。

适用场景与注意

适合这些人:在 DSH 里跑多步任务、上下文容易被撑爆、希望用对话分段而不是在同一个会话里无限追加的人;以及自己写插件、需要一个「会话生命周期」工具来做参数参考的人。插件的目录结构(lib/index.js 宿主半边、lib/client.js 浏览器半边、cordis.patch.yml、安装脚本、两个方向的单测)本身可以当作一个双半边插件的样板。

有几个边界需要在装之前知道,都来自 README 的「已知边界」一节:

  • 只建会话,不建工作区。workspace 填错会报错,并列出可选的工作区。
  • 浏览器半边只有 Web / 桌面版有意义。headless profile 没有 sessionController,这时工具会给出可读报错而不是静默失败。
  • 跨对话引用依赖宿主装了 @deepseek-ai/dsh-session-reference(dsh-web-app 默认带);没有这个服务时会自动降级为纯文本交接。
  • 自动切换不会抢视图:卡片只出现在发起调用的那段对话里,而且只跳一次;3 分钟以外的历史卡片不会触发跳转。

另外提醒一句安装前的通用动作:插件是以当前 DSH 进程的权限运行的,能读到这个进程能读到的文件、能执行它能执行的命令。装之前把源码和许可证过一遍,这是任何第三方插件都适用的前提,对这个插件也不例外。仓库许可证是 MIT,作者目前没有发布正式 npm 包,走 npm 方式前可以先确认一下是否已经上架。

小结

dsh-new-session 解决的问题非常窄:模型需要一个能真正开会话、并且自动切过去的能力,而不是一份「建议你新开对话」的说明。它没有试图去替代现有的会话管理插件,只是在它们之外补上了「建会话 + 自动切」这个动作。如果你正好被卡在「上下文该切但切不了」这一步,可以试一下。

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

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

小夜