liangmianya/dsh-synapse
liangmianya/dsh-synapseDeepSeek Harness 的可视化非线性对话工作区:把会话、追问与分支变成可浏览、可拖拽的对话地图。
dsh 网页端一键上下文压缩:会话标题栏「压缩」按钮把整段对话总结成几句话,新建同工作区会话以摘要为第一条消息并自动切换,原会话原样保留。
小模型上下文压缩插件,面向 DeepSeek Harness Web GUI,当前适配 harness 0.2.0-rc.2(v0.1.x 对应的是 0.1.7 之前的契约,配置走已删除的 settings.register() 命名空间)。
上下文一长、小上下文模型就装不下——点一下会话标题栏的「压缩」按钮:插件把整段对话总结成几句话,新建一个同工作区的会话,把摘要作为第一条消息注入,然后自动切过去继续聊。原对话原样保留在侧边栏,一个字都不丢。
一键安装:
dsh plugin --profile web add <仓库或本地路径>例如本地路径:
dsh plugin --profile web add D:\CBN-HT\Desktop\AI编程\dsh插件\dsh-context-compressor装完重启 harness(dsh web)、刷新页面,会话标题栏右侧会出现「压缩」按钮。
parentSession 指向原会话(侧边栏里嵌套显示来源),标题自动带上「· 续」;原会话作为完整历史保留,可随时回去翻。<compacted-summary> 标记和"已建立背景"前言,模型把它当作既有上下文直接续接,不会当成新任务去执行。ctx.llm,跟随会话路由的 provider/model;回放保留会话自身的 system + tools + 消息前缀,命中提供方 KV 缓存(同一会话连续压缩基本不重复烧输入钱)。harness 自带 compaction-basic(自动按上下文阈值压缩 + /compact 命令),那是原地压缩:保留最近尾部,把更早的对话替换成一条结构化 checkpoint 消息。
本插件是另一条路径:整段对话压成几句话 → 开新会话注入。适合上下文窗口很小、连结构化 checkpoint 都嫌长的模型(比如自定义的小模型)。两者不冲突,可以同时装:
/compact 或自动压缩;POST /api/dsh-context-compressor/compress,带上当前 sessionId。session.snapshotEvents();0.2.0 已删除同步的 session.events 访问器)与 surface,最新优先回放到字符上限(maxInputChars,超出丢最旧),接上压缩指令,用会话自身的 system + tools + 前缀调 ctx.llm.stream()。parentSession 指向原会话),把「前言 + <compacted-summary>摘要</compacted-summary>」作为第一条 user 消息 append 进去并 flush 落盘。uiWorkspace.openSession(id) 切到新会话(0.2.0 的 sessions 运行时不再有 open())→ 标题加「· 续」。新会话第一条消息会由用户手动发送;发消息时 harness 自动为该会话创建 agent(懒恢复),摘要随历史一起进入上下文。
配置走 harness 0.1.7+/0.2.0 的 loader 配置通道:插件导出 Config(schemastery schema),由 loader 校验 profile 条目里的 config 后调用 apply(ctx, config)。在你的 profile 补丁层 ~/.dsh/profiles/<profile>/cordis.patch.yml 里覆盖条目 ui-context-compressor 的 config:
- id: ui-context-compressor
config:
enabled: true # 总开关
maxInputChars: 20000 # 回放字符上限(超出时丢弃最旧消息)
maxTokens: 2048 # 摘要输出 token 预算
summarizationProvider: '' # 留空 = 跟随会话路由的 provider/model
summarizationModel: ''
不配置即用以上默认值;只写其中几项时,未写的字段逐项回退到默认值。改完配置后重启 harness 生效(配置只在 host 半区解析并注入路由,浏览器半区不缓存配置)。
summarizationProvider / summarizationModel 需成对填写(例如 asdf / qwen38),用于覆盖"跟随会话模型"的默认行为。
旧的
~/.dsh/settings.yaml命名空间dsh-context-compressor在 0.2.0 已无效(settings.register()被删除)。
lib/index.js — host 半区:Config 导出(loader 配置通道)+ POST /api/dsh-context-compressor/compress 路由(守卫 → 回放 → 摘要 → 新建会话 → 注入 → flush)。lib/client.js — 浏览器半区:conversation.session.header.actions 链式条目(「压缩」按钮 + 内联确认 + 切到新会话 + 标题续接),纯函数 evaluateSnapshot / currentTitle / renameSession / continueInFreshSession 各自可测。test/smoke.cjs — node test/smoke.cjs:host(Config 导出/路由注册/守卫全路径/成功链路/config 覆盖与逐项回退/摘要失败)+ client(注册/快照守卫全分支/非响应式标题读取/retain→ready→rename→release/compressRequest/SSR 渲染)断言。compaction-basic 已经做了,直接配置即可。pendingSubmissions)时,路由返回 busy / 按钮保持禁用,失败可重试。summarizationProvider/Model,压缩会失败——本会话能点按钮说明肯定有历史,正常不会触发。sessions.retain(id, { source: 'contextCompressor' }) 才能拿到会话面改名;改名失败只打一条 warn,不影响压缩结果。lib/client.js 为手写 bundle(与 dsh-continue-on-limit / dsh-auto-translate 同一技术路线),不经过构建步骤;改动后直接生效,冒烟测试兜底。MIT