dsh-fresh-start
DSH(DeepSeek Harness)/fresh 命令:一键总结当前对话 → 开启新对话(自动跳转)→ 归档老对话。
为什么需要它
超大会话(数十万事件)工作一段时间后,live 事件树越滚越大,每次构建上下文都更慢、更占内存—— 在一个 67 万事件的会话里继续工作,卡顿和内存压力会持续恶化。
/fresh 把这个收尾动作变成一键操作:把历史压缩成一份自然语言摘要,开一个继承当前工作环境
的新会话并把摘要作为开场消息,然后归档老会话释放内存、自动跳转到新会话继续工作。
快速开始
安装
dsh plugin --profile web add github:orangeofcarl0-sys/dsh-fresh-start
插件源为 GitHub 仓库(不走本地路径)。之后插件发新版,同步仓库后更新:
dsh plugin --profile web update dsh-fresh-start
重启 dsh web,日志出现 [fresh-start] installed: /fresh command registered 即成功。
client 插件会随 dsh.client 声明自动进入浏览器清单(/plugins/dsh-fresh-start/client.js
返回 200)。
若 profile 的
cordis.patch.yml里已有本插件的手工挂载行,请先删除,否则会双实例。
使用
在对话输入框输入 /fresh,可选带 preset 参数:
/fresh # 继承当前会话的 preset
/fresh standard # 用指定 preset 开新会话
| 输入 | 目标 preset | 模式 |
|---|---|---|
/fresh standard |
standard |
标准模式 |
/fresh ptc(或旧输入 code) |
ptc |
PTC 模式(Code Mode SDK) |
/fresh minimal |
minimal |
极简模式 |
/fresh create / /fresh creator |
cordis |
创造模式 |
dsh 0.1.2-alpha.5 把内置
codepreset 更名为ptc且不留别名;本插件将ptc直接作为 preset id 使用,code仅作旧输入兼容映射到ptc。
指定不存在的 preset 时命令直接报错,不会静默回退到继承值。
/fresh 的完整流程
/fresh ──▶ ① 压缩(Compact-First)──▶ ② 对话式总结 ──▶ ③ 创建 seeded 新会话
│
自动跳转 ◀── ⑤ client 侧匹配 ◀── ④ 归档老会话
① 压缩(Compact-First)
若当前 preset 挂载了宿主压缩引擎(standard/code/cordis),先 compactNow 强制压缩当前
会话——deriveMessages() 跟随 surface shadow 收紧,后续总结请求体显著缩小,并直接复用
压缩摘要。引擎不可用(minimal)、agent busy、无可压缩范围或引擎抛错时安静降级为纯对话式
总结,不阻断流程(spec:docs/COMPACT_FIRST_SPEC.md)。
② 对话式总结
直接提取 dsh 上传给 LLM 的当前上下文(session.requestHeader() 的 system +
session.deriveMessages() 的全部消息,已压缩时为收紧后的上下文),用一条简单指令让 LLM
总结成自然语言摘要。
区别于 dsh 原生 /compact(用工程 checkpoint 指令 + token 比较,普通对话上常失败):
本实现把 compact 作为前置收紧、对话总结作为最终 seed 生成器。
③ 创建 seeded 新会话
ctx.agents.create 创建新会话:继承老会话的 cwd 与 agent preset(/fresh <preset>
可覆盖),摘要作为新对话的开场消息(seed),新会话的 header.parentSession 指向老会话。
④ 归档 + ⑤ 自动跳转
ctx.workspaceRegistry.archiveSession 归档老会话(释放 live 事件树内存);配套的
client 插件监听归档事件,按 parentId 找到新会话并 ctx.sessions.open 自动跳转过去。
每一步独立、失败降级不阻断后续——例如总结失败时仍会开新对话 + 归档(只是新对话不带 摘要),完整结果在命令返回文本里。
架构:host + client 双端
dsh-fresh-start/
├── lib/
│ ├── index.js # host 侧:/fresh 命令(总结 + 创建 + 归档)
│ ├── client.js # client 侧:监听归档事件,自动跳转
│ └── std/host.js # dsh-std 占位宿主入口(惰性,见下文)
├── cordis.patch.yml # dsh bundle 挂载清单
├── dsh-plugin.json # dsh-std Community v0.15 清单(惰性)
├── docs/COMPACT_FIRST_SPEC.md
└── tests/
- host 侧(
lib/index.js,经cordis.patch.yml挂载进 cordis bundle):/fresh命令本体——压缩 + 总结 + 创建(带摘要 seed 与parentSession标记)+ 归档。 - client 侧(
lib/client.js,随dsh.client声明进入浏览器):监听host/archived-sessions-changed,归档发生时按parentId匹配新会话并自动ctx.sessions.open跳转。含时序兜底:归档广播与新会话列表同步是两个通道,若新会话 尚未同步则进 pending,等会话列表更新后补跳。
兼容性
dsh 版本
以 0.1.5-rc.1 为准(2026-09-10 验证轮,1.3.4)。插件依赖 dsh 内部 API
(ctx.agents.create / ctx.workspaceRegistry / ctx.sessions.open /
session.deriveMessages() 等),dsh 升级可能导致兼容性问题。
0.1.5-alpha.1 → 0.1.5-rc.1 验证结论(同线收敛):
- dsh-session:
lib/index.js与事件词表仅新增两个事件类型 (deliverables/presented、subagent/catalog);本插件 seed 的approval/policy/permission/preset/sandbox/mode仍在词表;requestHeader()的 canonical header 仍不含system(沿用 1.3.3 记录的降级路径,无变化); - dsh-agent-presets:
lib/index.js字节级一致,仅内置 preset 组合数据 (四个 agent.cordis.yml + minimal/preset.yml)与 typert 协议文件更新; - dsh-llm:仅 typert 协议文件;compaction / permission-presets /
client-modules / command-compact:仅 package.json 重指。cordis 保持
^4.0.2。 - peers/devDeps 升
^0.1.5-rc.1(本插件用到的依赖与其他包在 0.1.5 线上已统一); 零代码改动,仅依赖声明与文档对齐。
0.1.3-alpha.2 → 0.1.5-alpha.1 验证轮:结论见 CHANGELOG 1.3.3。
1.3.0 对 alpha.5 的适配点(沿袭仍有效):
@deepseek-ai/dsh-agent-presets#resolveSessionPreset已删除 → 内联等价实现 (agent-preset/selected事件倒序扫描取data.agentPreset,回退header.agentPreset,与宿主投影语义一致);- 内置 preset
code更名ptc且不留别名 → 别名表反转(/fresh ptc直接命中 内置 id,/fresh code作旧输入兼容映射到ptc); - compaction 变为全局服务 → Compact-First 优先
ctx.compaction(/compact同款 seam),rc.2 的 per-presetserviceFor形态兜底; @deepseek-ai/dsh-client-runtime在 alpha 线停止发布 → 移除 peer 依赖与dsh.client.inject引用(client 半边零宿主 import,注册方式与 alpha.5 client-modules 机制一致,不受影响)。
其余用到的宿主 API(agents.create 的 seed/meta/setup 形状、
workspaceRegistry.archiveSession / resolveByPath / attachSession、
commands.register、session.requestHeader / deriveMessages、BlockAssembler /
createUserMessage、agentPresets.resolve / mount、permission seeded 分支)逐一
核对 alpha.5 均未变。
历史:rc.7 → rc.8、rc.1 → rc.2 时代的逐包发布产物比对均为增量变更(rc.2 中
sessions.create 收窄的参数本插件从未使用)。
dsh-std(双轨制)
1.2.10 起本插件双轨制:
- 功能路径唯一:
/fresh全部能力仍由原生 cordis 入口(lib/index.js+cordis.patch.yml)提供,这是唯一的功能实现路径。 - dsh-std 清单(惰性):附带 dsh-std Community v0.15 的
dsh-plugin.json(std 运行时包@dsh-std/core/@dsh-std/manifest0.1.0-rc1,2026-08-18),宿主 facet 入口为占位实现lib/std/host.js(空activate())。std 侧尚无 session/workspace 生命周期协议可承载本插件能力,故contributes.commands刻意留空——避免在装有@dsh-std/adapter-dsh的环境里向原生注册表投影第二个/fresh造成冲突。 - 默认完全惰性:dsh 原生加载器不读取
dsh-plugin.json;只有显式安装@dsh-std/adapter-dsh后清单才会被发现与校验(占位入口可通过其装载管线,空贡献 ⇒ 零投影)。 - 前向兼容:清单在
@dsh-std/manifest@0.1.1-rc.1的新版校验器下同样可解析 (2026-08-28 实测;@dsh-std/*已全线发布 0.1.1-rc.1,含adapter-dsh)。
开发与测试
npm install # 安装 devDependencies(@deepseek-ai/* rc.2、@dsh-std/manifest,来自 npm)
npm test
测试在 @deepseek-ai/* 依赖 0.1.3-alpha.2 线下运行:
tests/smoke_test.mjs(34 断言):命令注册 / 全流程 / 总结失败降级 / 新会话失败仍归档 / 无 workspaces 降级 /parentSession标记 / 不污染deriveMessages()返回值 / provider-model 不完整时回退与降级 / 取消中止 / header 异常结构化报错 —— ALL PASStests/client_test.mjs(9 断言):归档后按 parentId 自动跳转 / pending 兜底补跳 / 不相关归档不跳 / open 异常吞掉且不无限重试 —— ALL PASStests/std_manifest_test.mjs:dsh-plugin.json的 Community v0.15 结构断言 (可解析 / 版本同步 / 入口存在)—— ALL PASS
已知局限
- 总结依赖
session.deriveMessages()(dsh 上传的完整上下文),超大会话的上下文若超出 模型窗口,总结可能失败(此时仍会开新对话 + 归档,只是新对话不带摘要)。
更新日志
见 CHANGELOG.md。
No comments yet. Be the first to write one.