DSH Session Toolkit: Workspace Migration and Runtime Agent Preset Switching

前言

在 DeepSeek Harness(DSH)里,会话归属哪个工作区,取决于会话头里的 cwd 是否与该工作区路径一致;这条规则是推导出来的,而不是单独存一条「成员关系」。因此,单靠浏览器端很难把「已经跑过几轮」的会话挪到另一个已注册工作区,也很难在会话已经开始之后更换 Agent 预设——官方 agentPresets.select 只接受空白会话,一旦有回合就会抛出 agent-preset/locked。

dsh-session-toolkit(GitHub:QqiqiQ/dsh-session-toolkit)在对话标题栏增加两个按钮,并在插件里提供 host 端路由,用来完成上述两类操作。下面介绍它的定位、安装方式,以及使用时需要接受的机制与限制。

这是什么

维护者为 QqiqiQ,在社区插件目录中归类为客户端(面向 dsh web 注入 UI)。当前 package 版本为 0.1.2,许可证 MIT。

一句话:在 DSH 对话头增加 ⇄ Workspace(把工作区会话迁到另一工作区,可选归档原会话)和 ◈ Preset(对已开始的会话切换 Agent 预设),历史不重写,由 host 半与 harness API 配合完成。

核心功能

工作区迁移(⇄ Workspace)

工作区成员关系每次由 dsh-workspace 根据会话头 cwd 过滤;attachSession 也会拒绝 cwd 不匹配的路径。会话头不可变,也没有 API 能改写 cwd,因此「迁移」实际是:在目标目录开一条延续会话,带上完整历史,并在元数据里保留 fork 来源(如 parentSession、isSeeded 等)。

插件侧大致流程为:读源会话 → 用 seed 与 inheritedEventCount 等在目标 cwd 上 agents.create → workspace.attachSession 新 id → 可选 archiveSession 源 id。新会话会沿用源会话最后一次使用的模型(来自最后的 model/selection,或从未改选时来自最后一条 request/header 的 config),与 preset 里的 {{model}} 解析方式一致。

迁移完成后会得到新的 session id;原会话历史仍在原工作区,需要时可取消归档源会话找回。

运行中切换预设(◈ Preset)

插件先尝试官方路径 agentPresets.select;若会话已非空白而被拒绝,则通过 agentPresets.recompose(agent.ctx, id) 在同一 Agent 作用域上重绑,并写入本应由 select 产生的 agent-preset/selected 事件。对话投影与浏览器标签会跟随,不会改写已有历史。

注意:换 preset 会改变下一轮请求的系统提示与工具目录,提供商侧 prefix 缓存从首 token 起失效;不会顺带切换模型——模型归属会话,不归属 preset。若当前回合仍在跑,host 路由会返回 session-busy。

为何需要 host 半

浏览器半无法单独完成上述语义;插件通过相对 URL 的 fetch 调用本包两条 host 路由(刻意不走 session command,避免在会话日志里留下 command/run):

  • POST /session-toolkit/migrate — body:{ sessionId, workspaceId, archiveSource?, agentPreset? }
  • POST /session-toolkit/preset — body:{ sessionId, agentPreset }

请求会先经过 connection.requestRejection(登录 cookie / loopback / 同源等检查),仅接受 application/json,body 上限 64 KiB。

安装与启用

可从插件市场搜索 “Session Toolkit”,或手动安装 release 包:

dsh plugin --profile web add https://github.com/QqiqiQ/dsh-session-toolkit/releases/latest/download/dsh-session-toolkit.tgz

安装后重启 dsh web。插件在 dsh 配置里声明 client.platform: web,并注入 @deepseek-ai/dsh-client-ui-conversation,对话头按钮在 web 端加载。

典型用法

  1. 在 dsh web 打开一条已有历史的会话。
  2. 需要换工作区目录时,点 ⇄ Workspace,选择目标已注册工作区;按需勾选是否归档源会话,必要时可同时指定 agentPreset(由 migrate 路由 body 支持)。
  3. 需要换 Agent 人格/工具集但不希望开新会话时,点 ◈ Preset,选择目标 preset;若当前有请求在跑,需等回合结束再试,避免 session-busy。
  4. 迁移后浏览器会指向新 session id;若误操作,到原工作区对源会话取消归档即可继续访问原 id 上的历史。

适用场景与注意

适合:多工作区协作、同一对话链要在另一 cwd 下继续开发;长会话中途想换 preset 又不想丢上下文。

使用前请知悉:

  • 插件以当前 dsh 进程权限运行;安装前建议阅读 GitHub 仓库 源码与 MIT 许可证。
  • 社区目录 skillhub 插件页 与 DeepSeek / 幻方无官方从属关系,DSH 生态是「一切皆插件」的独立社区分发方式,并非官方应用商店。
  • 已知限制以 README 为准:迁移必产生新 id;preset 切换 invalidate 提供商 prefix cache;不切换模型。

结尾

dsh-session-toolkit 补的是 DSH 在「已开始的会话」上对工作区与 Agent 预设的两处缺口:迁移用延续会话 + 可选归档,预设用 select 或 recompose,并统一走 host 路由。查阅详情与 issue 见 GitHub:https://github.com/QqiqiQ/dsh-session-toolkit;目录入口:https://www.skillhub.cn/plugins/QqiqiQ/dsh-session-toolkit。

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

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

Xiaoye