🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

会话迁移管理 ailiasdesu/dsh-session-manager

DeepSeek Harness
ailiasdesu68 天前有提交已提供中文文档扫描:含敏感能力

拖拽迁移会话并自动备份,归档恢复一键可逆

28/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ailiasdesu/dsh-session-manager
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
L4 · 真实安装等级说明 →
数据截至 2026/10/07·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 68 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 56 处,展示前 38 条)
  • 读取本地文件
    lib/index.js:81
    if (!existsSync(srcRoot)) return 0;
  • 读取本地文件
    lib/index.js:83
    for (const entry of readdirSync(srcRoot, { withFileTypes: true })) {
  • 读取本地文件
    lib/index.js:86
    if (!existsSync(teamJson)) continue;
  • 读取本地文件
    lib/index.js:88
    const team = JSON.parse(readFileSync(teamJson, 'utf8'));
  • 写入本地文件
    lib/index.js:92
    mkdirSync(dstRoot, { recursive: true });
  • 删除本地文件递归
    lib/index.js:94
    rmSync(srcTeam, { recursive: true, force: true });
  • 读取本地文件
    lib/index.js:113
    for (const entry of readdirSync(root, { withFileTypes: true })) {
  • 读取本地文件
    lib/index.js:115
    for (const sub of readdirSync(join(root, entry.name), { withFileTypes: true })) {
  • 删除本地文件递归
    lib/index.js:163
    if (ts < cutoff) { try { rmSync(p, { recursive: true, force: true }); removed++; } catch { } }
  • 写入本地文件
    lib/index.js:188
    mkdirSync(dirname(p), { recursive: true });
  • 写入本地文件
    lib/index.js:189
    writeFileSync(p, JSON.stringify(list, null, 2), 'utf8');
  • 写入本地文件
    lib/index.js:385
    mkdirSync(delBackup, { recursive: true });
  • 删除本地文件递归
    lib/index.js:387
    rmSync(dir, { recursive: true, force: true });
  • 读取本地文件
    lib/migrate.js:116
    const raw = readFileSync(filePath);
  • 读取本地文件
    lib/migrate.js:125
    const stream = createReadStream(filePath);
  • 读取本地文件
    lib/migrate.js:148
    const raw = readFileSync(filePath);
  • 读取本地文件
    lib/migrate.js:167
    const raw = readFileSync(filePath);
  • 读取本地文件
    lib/migrate.js:190
    for (const entry of readdirSync(root, { withFileTypes: true })) {
  • 读取本地文件
    lib/migrate.js:193
    if (existsSync(cand)) return cand;
  • 写入本地文件
    lib/migrate.js:219
    mkdirSync(backupDir, { recursive: true });
  • 写入本地文件
    lib/migrate.js:222
    writeFileSync(join(backupDir, 'manifest.json'), JSON.stringify({
  • 写入本地文件
    lib/migrate.js:227
    mkdirSync(newSessionDir, { recursive: true });
  • 写入本地文件
    lib/migrate.js:230
    writeFileSync(tmp, buf);
  • 删除本地文件
    lib/migrate.js:234
    rmSync(tmp, { force: true });
  • 写入本地文件
    lib/migrate.js:237
    renameSync(tmp, newFile);
  • 删除本地文件递归
    lib/migrate.js:238
    rmSync(dirname(oldFile), { recursive: true, force: true });
  • 写入本地文件
    lib/migrate.js:246
    mkdirSync(dirname(oldFile), { recursive: true });
  • 删除本地文件
    lib/migrate.js:252
    rmSync(newFile, { force: true });
  • 写入本地文件
    lib/workspace-files.js:12
    mkdirSync(dirname(p), { recursive: true });
  • 写入本地文件
    lib/workspace-files.js:13
    writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf8');
  • 写入本地文件
    lib/workspace-files.js:14
    renameSync(tmp, p);
  • 读取本地文件
    lib/workspace-files.js:18
    if (!existsSync(p)) return;
  • 写入本地文件
    lib/workspace-files.js:20
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    lib/workspace-files.js:27
    if (!existsSync(p)) return false;
  • 读取本地文件
    lib/workspace-files.js:28
    const data = JSON.parse(readFileSync(p, 'utf8'));
  • 读取本地文件
    lib/workspace-files.js:54
    if (!existsSync(p)) return false;
  • 读取本地文件
    lib/workspace-files.js:55
    const data = JSON.parse(readFileSync(p, 'utf8'));
  • 读取本地文件
    lib/workspace-files.js:66
    if (!existsSync(p)) return false;
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-host-webserver@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-locale
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 拖拽跨工作区迁移会话
  • 自动备份与回滚
  • 归档恢复一键可逆

DSH 会话迁移插件:在 Web UI 设置面板里拖拽会话跨工作区移动(自动备份/回滚,同步官方 workspaceRegistry)

README

由 DeepSeek 最新模型翻译生成
dsh-session-manager DSH(DeepSeek Harness)完整会话管理插件:设置面板中迁移会话(拖拽/点击,冷热皆可)、归档/恢复、彻底删除已归档会话、自动清理过期子代理——全部操作自动备份,安全可逆。 零运行时外部依赖;仅“热迁移”一条路径使用上游内部方法(详见下面的依赖边界)。 功能一览 | 功能 | 说明 | 依赖 | | 会话迁移(冷) | 磁盘四件套(header 帧 / 文件 / workspace.json / projcache),重启自举收敛 | ✅ 零内部 API | | 会话迁移(热) | 内存 header + 磁盘 + 官方索引三方同步,无需重启 | ⚠️ experimental(使用上游内部方法)| | 归档 | 官方公开 API(archiveSession)| ✅ 公开 API | | 恢复已归档 | 磁盘直写 archivedSessionIds(重启自举)| ✅ 磁盘直写(experimental 标注)| | 彻底删除已归档 | 备份整目录 → 删文件 → 清理全部索引 | ✅ 磁盘直写 + 文件操作 | | 过期子代理清理 | delegationDepth>=1 且闲置 30 天且非运行中 → 自动归档 | ✅ 公开 API |
展开完整文档(README 剩余 1 节)
dsh-session-manager

DSH(DeepSeek Harness)完整会话管理插件:设置面板中迁移会话(拖拽/点击,冷热皆可)、归档/恢复、彻底删除已归档会话、自动清理过期子代理——全部操作自动备份,安全可逆。
零运行时外部依赖;仅“热迁移”一条路径使用上游内部方法(详见下面的依赖边界)。

功能一览

| 功能 | 说明 | 依赖 |
| 会话迁移(冷) | 磁盘四件套(header 帧 / 文件 / workspace.json / projcache),重启自举收敛 | ✅ 零内部 API |
| 会话迁移(热) | 内存 header + 磁盘 + 官方索引三方同步,无需重启 | ⚠️ experimental(使用上游内部方法)|
| 归档 | 官方公开 API(archiveSession)| ✅ 公开 API |
| 恢复已归档 | 磁盘直写 archivedSessionIds(重启自举)| ✅ 磁盘直写(experimental 标注)|
| 彻底删除已归档 | 备份整目录 → 删文件 → 清理全部索引 | ✅ 磁盘直写 + 文件操作 |
| 过期子代理清理 | delegationDepth>=1 且闲置 30 天且非运行中 → 自动归档 | ✅ 公开 API |
| 团队状态联动 | 迁移会话时连带搬移 AgentTeams 团队状态(.agent-teams/)| ✅ 文件操作 |

依赖边界(重要)

本插件对上游(@deepseek-ai/dsh v0.1.1-rc.2)的依赖分三类,只有第三类属于“内部方法”且仅热迁移使用:

1. 官方公开服务/API——webServer(注册本地路由)、sessions(live 查询)、sessionPersistence(root)、workspaceRegistry.list()、workspaceRegistry.archiveSession()、workspaceRegistry.archivedSessionIds(公开属性)。
2. 磁盘直写(storages/workspace.json、session_projcache.json)——原子 tmp+rename + 自动备份;DSH 重启自举时从磁盘收敛(官方 bootstrap 语义)。
3. 上游内部方法(workspaceRegistry.indexHeader / attachSession / detachSession)——仅“热迁移”分支使用(运行时内存索引无公开 API 可替代);已标注 experimental,上游提供公开迁移 API 后迁移到公开契约。

因此:“迁移”主路径(冷迁移、重启后自动消费队列、归档/恢复/删除/清理)不依赖任何上游内部 API;你迁移任何未打开的会话走的都是零内部依赖路径。

安装

官方标准命令(从 GitHub 安装)
dsh plugin --profile web add github:ailiasdesu/dsh-session-manager#main

或本地开发路径
cd ~/.dsh/profiles/web
pnpm add file:../../dsh-session-manager # 或 pnpm add file:C:/Users/34021/.dsh/dsh-session-manager

确认 profile/package.json 的 dsh.profile.bundles 已包含 @dsh-external/dsh-session-manager (插件自带 dsh.bundle.patch 自动应用)。重启 DSH 生效。

使用

打开 设置 → 会话管理:

- 会话列表:仅显示未归档的活动会话(子代理、已归档自动隐藏);行 hover 出现 [归档] [迁移];行可拖拽到右侧目标工作区
- 点击式迁移:会话行「迁移」→ 右侧点选目标工作区 → 确认条 → 确认
- 已归档 (N) 折叠区:展开后每行 [恢复] / [彻底删除](红色+确认)
- 右侧目标工作区:全部已注册工作区(含新创建)

交互约束:
- ●当前(活动会话)不可归档/迁移/删除
- 正在生成中的会话:迁移/删除被拒绝(等空闲)
- 打开中(live)的会话:冷迁移会被自动排队(重启后零依赖路径自动完成);删除被拒绝(存档后需重启再删)
- 全部操作自动备份:迁移 → ~/.dsh/session-migrate-backup///(整目录 + manifest);删除 → ~/.dsh/session-migrate-backup/deleted//

工作原理

- 会话归属 = 日志 header 的 cwd(DSH canonical 语义;workspace json 的 sessionIds 为持久视图)
- 帧级 zstd 改写:DSH 日志是多帧 zstd(header 帧 + body 帧,带 checksum)——Node zlib 只解码首帧,因此实现移植了官方 scanZstdFrames(与 @deepseek-ai/dsh-session-persistence-jsonl 一致),迁移只重写 header 帧,body 帧字节原样保留,并对 header/body 做字节级校验(内容零风险)
- 目录命名:encodeSegment / projectKey 与官方 jsonl 后端逐字一致(不会触发 DSH corrupt 校验)
- 热迁移(仅此路径用内部方法):header.cwd = 新(内存对象)→ indexHeader → attachSession → detachSession;失败自动回滚(内存 header + 文件 + 索引)
- no-overwrite:迁移/回滚目标已存在同 ID 会话则拒绝(平台无关“先检后写”)

架构

| 文件 | 职责 |
| lib/index.js | host 插件:REST /session-manager/api(list/migrate/archive/unarchive/delete)+ 迁移编排 + 排队/清理调度 + 团队联动 |
| lib/migrate.js | 核心:编码(官方算法)、scanZstdFrames(官方帧解析)、帧级改写/校验、文件级迁移/回滚 |
| lib/workspace-files.js | 磁盘级索引同步:workspace.json 归属移动 / archivedSessionIds / projcache(原子+备份)|
| lib/client.js | 浏览器端:设置面板 section(slots 注册,React 壳 + 纯 DOM UI),拖拽 + 点击式 + 归档管理 |
| tests/unit.mjs | 合成多帧 fixture + 真实大文件(可选)+ no-overwrite + 迁移/回滚(约 20 项断言)|

开发

node --check lib/index.js && node --check lib/migrate.js && node --check lib/client.js
node tests/unit.mjs # 全量测试(合成 fixture 机器无关;BIG 真实大文件用例存在才跑)

实现为无构建链 ESM(lib/ 即正式源码;src/index.ts 仅 bundle 规范桩)。

版本简史

- v0.1 会话迁移(拖拽)→ v0.2 帧级 zstd(修复多帧截断)+ 热迁移 + 排队 → v0.3 社区审查整改(no-overwrite/整目录备份/manifest/合成测试/License)→ v1.0 更名 dsh-session-manager(归档/恢复/彻底删除/子代理清理/团队联动/零内部依赖冷路径)

License

BSD-3-Clause
预览分享卡片长什么样 ↓ailiasdesu/dsh-session-manager
分享 · DeepSeek Harness Hub
ailiasdesu/dsh-session-manager

拖拽迁移会话并自动备份,归档恢复一键可逆

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部