dsh-session-adopt:在运行中的 Harness 里收养外部会话并跨 harness 导入

前言

DeepSeek Harness(DSH)把会话持久化到各客户端、各进程共享的存储里。但正在运行的 Web/Desktop Host 在启动时只构建一次 cwd → Workspace 索引,浏览器侧的会话列表也不会自行重读磁盘。于是,由 VS Code 的 ACP 客户端、SDK、无头任务等在其他进程里创建的会话虽然已经落盘,却可能长期处于「未分组」状态:侧边栏里看不到,或者要重启 Harness 之后才能出现,且未必挂到对应的 Workspace。

dsh-session-adopt(维护者 FrozMN,分类:客户端)针对上述缺口,在运行时扫描持久化会话、按工作目录归位到 Workspace,并在侧栏提供手动同步。它还支持从本机其他 agent harness(首发适配 pi)探测会话,合成为原生 DSH v4 会话并导入到匹配或新建的 Workspace。本文基于插件仓库 README 与 package.json(当前版本 0.2.0,许可证 MIT)整理安装与用法。

这是什么

dsh-session-adopt 是 DeepSeek Harness 的插件包,无 npm 第三方依赖,仅使用 Node 内置模块与 Harness 暴露的服务(见仓库 index.js 中的 webServer、connection、sessionPersistence、workspaceRegistry、sessions 等)。

两类能力可以分开理解:

  1. 收养(adopt):发现「当前运行窗口之外」已写入持久化存储的会话,解析 cwd、匹配 Workspace,调用 workspace.attachSession(),并用 ctx.sessions.refresh() 刷新客户端目录。
  2. 导入(import):只读扫描本机其他 harness 的会话存储,通过对话框或同源 JSON API 批量导入,生成经过校验的 DSH durable 会话(对话轮次、步骤、工具调用/结果、标题等),导入过程不调用模型。

社区目录页:skillhub.cn/plugins/FrozMN/dsh-session-adopt。源码与说明:GitHub — FrozMN/dsh-session-adopt。目录站点与 DeepSeek / 幻方无官方从属关系,安装与审阅仍以仓库为准。

核心功能

侧栏:Sync sessions

在 sidebar.footer.action 插槽注册 Sync sessions(与 Settings 相邻,展开/折叠侧栏均可见)。点击后执行全量扫描(含较早的未分组会话),再刷新会话列表;悬停可查看上次同步时间、安置数量或失败原因;按钮上的 +N 徽标表示最近一次同步新安置的会话数。

侧栏:Import sessions

第二个底栏动作为 Import sessions。对话框按 harness 分组列出探测到的外部会话:徽章、标题、工作目录、消息数、模型、目标 Workspace(→ existing workspace 或 → new workspace: /path)。可多选或全选后 Import selected;每行反馈 imported / already imported / 失败原因。已导入会话按确定性 id 去重,重复导入不会复制对话。界面跟随 Harness 语言(中/英)。

收养流程(运行时)

插件在运行时大致完成:

  1. 通过 ctx.sessionPersistence 列出 durable 会话。
  2. 将会话 cwd 规范化为 canonical 路径并匹配 Workspace。
  3. workspace.attachSession() 挂载;依赖既有 workspace.follow 流更新侧栏。
  4. ctx.sessions.refresh() 让列表立即可见。

此外还支持:插件加载时的启动扫描;默认每 2 小时、仅限 active workspace 的定时扫描;窗口重新可见时焦点扫描(每分钟至多一次);按会话日志修改时间计数的 6 小时活跃窗口(新发现的会话即便尚无 Workspace 也会激活其目录);canonical cwd 无注册时的自动创建 Workspace;扫描串行且幂等,单会话失败不中断整次扫描。

跨 harness 探测与合成

shipped 适配器支持 pi(默认 ~/.pi/agent/sessions,或通过环境变量 PI_CODING_AGENT_SESSION_DIR / PI_CODING_AGENT_DIR 覆盖)。仓库 import/adapters/ 预留 Claude Code、Codex、Gemini CLI、OpenCode 等插槽;外部存储只读。

导入时:外国会话转为 DSH v4 原生结构;缺 Workspace 时在显式导入时创建并挂载;重复导入同一外部会话返回「already imported」。

脚本化 API

与 Host 其余路由相同,受同源与浏览器会话 cookie 约束,接受 application/json,选择项为扫描返回的不透明 key,不接受任意文件系统路径:

Route Method Purpose
/session-import/sources GET 适配器清单:id、title、availability、roots
/session-import/scan POST 扫描外部存储;body {} 或 { "adapterIds": ["pi"] }
/session-import/import POST 导入选中项;body { "selections": ["<candidateKey>", …], "workspace": "auto" }
/session-import/status GET 配置、进行中的标志、最近 scan/import 摘要

环境与依赖

  • 需要挂载 Workspace 插件与 Web 侧栏的 DSH Web 或 Desktop profile。
  • 需要会话持久化(内置 JSONL 后端即可)。
  • 跨 harness 导入:本机存在可读的外部会话目录(pi 见上文路径或环境变量)。

安装与启用

安装须同时完成包装安装与 bundle 选择;仅在 profile 内执行裸 pnpm add 不够。推荐在 Harness Settings → Plugins 使用 Install bundle,指向本机目录或仓库 URL,并启用 Session adopt。

若当前 agent 暴露 Host 的 plugin_manager 工具:

plugin_manager install_bundle  <absolute-path-or-git-url>
plugin_manager list_plugins

使用 dsh CLI(package.json 声明了 dsh.bundle manifest)可一条命令安装并选中 bundle:

dsh plugin --profile web add https://github.com/FrozMN/dsh-session-adopt

安装后重启对应 profile 或桌面应用以加载 bundle。开发时也可指向本地目录,例如 dsh plugin --profile web add /absolute/path/to/dsh-session-adopt;目录安装会链入 profile,改代码后 reload 插件即可。

更新:替换包文件或拉取仓库后,在 Plugins 页面重启插件;纯 ESM bundle、无构建步骤。

典型用法

操作 效果
点击 Sync sessions 全量扫描(含较早未分组会话),刷新会话列表
悬停同步按钮 上次同步时间、安置数量或失败原因
+N 徽标 最近一次同步安置的会话数

从 IDE 切回 Harness 时,焦点扫描会覆盖常见路径;仍可作为保险再点一次 Sync sessions。

跨 harness 导入(以侧栏为例):

  1. 点击 Import sessions。
  2. 在列表中勾选目标会话,查看将落入的 Workspace。
  3. Import selected,确认每行结果;会话目录与 Workspace 快照会随既有流更新,无需整页刷新。

本地脚本可先 POST /session-import/scan,再用返回的 candidate key POST /session-import/import。

适用场景与注意

适合:在同一台机器上混用 DSH 与 IDE/ACP/SDK 创建会话,希望不重启即可在侧边栏看到并归位 Workspace;需要从 pi 等本地 harness 把历史对话迁入 DSH,且希望幂等、可脚本化。

注意:

  • 插件以当前 DSH 进程的权限运行,安装前请阅读源码与 MIT 许可证,确认可接受其读取持久化存储与本机外部 harness 目录的行为。
  • 非 pi 的 harness 需自备或等待对应 import/adapters/ 适配器;未适配的来源不会出现在导入列表。
  • 收养侧「活跃窗口」默认 6 小时、定时扫描默认 2 小时,行为以仓库当前实现为准;配置细节见 /session-import/status 与源码。

结尾

dsh-session-adopt 补上的是运行时会话可见性与 Workspace 归属,并把本机其他 harness 的对话以原生 DSH 会话形式归档到正确的工作区。侧栏 Sync sessions 与 Import sessions 覆盖日常操作;/session-import/* 便于自动化。

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

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

Xiaoye