deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:XSJUSTC/dsh-rewind
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
English | 简体中文
DSH(DeepSeek Harness)会话回退插件。永久 bundle 插件:宿主机半 + Web 客户端半,零依赖、零构建步骤。
snapshotEvents() / eventAt(),旧宿主自动回退 session.events。conversation.chat.node 的 user / steering 两个渲染器,因此只有这两类行会被打上 data-xsj-seq 标记;模型的 assistant-step 输出、工具调用、context 等行走官方渲染器,从来没有标记。此前隐藏判定对未标记的行一律「不隐藏」,于是提交区间后只藏住了提问、回答仍然留在屏幕上。test/hiding.test.mjs 覆盖)。/state 返回而运行,此前二者无法区分,导致每次加载都会闪现已被回退掉的尾巴;若 /state 请求失败,则永久保持可见——界面看到的消息模型其实看不见。现在按会话记录 fetched / fetchFailed:未拿到答复时保持当前判定不动并重试,拿到后才据实隐藏;本地刚记录下的 mark 仍会立即生效。agent/disposed 不再泄漏补丁:ensurePatched 会在 session 实例上装一个闭包了 st.ranges 的 deriveMessages 覆盖,而 disposed 此前直接丢弃状态记录,使该覆盖无人可解——会话会永久继续按已回退的区间过滤模型上下文,且跨插件重载存活。现在与 evictIfNeeded 同规则,先解挂再丢弃。ensurePatched 改为自愈:不再只信 st.patched 标志,而是比对实际安装的方法与记录的包装器,不一致就重新安装(幂等),避免标志与实际脱节后静默停止对模型隐藏。/image 对一个日志里确实存在的 id 返回 404,表现为回退时图片被静默丢弃。/api/xsj-rewind/image 端点,依 attachmentId 从会话日志读回原始字节;客户端构造成 File 后通过 composer 的隐藏文件输入重新入档,自动触发官方的图片数量/大小校验。@deepseek-ai/dsh-client-ui-attachment 客户端半在 0.1.5-rc.2 只导出 apply/inject(不再有 ImageGallery 组件),此前引用它会让含图片的用户消息抛错,并被 React 错误边界放大到前后相邻的整片消息(表现为大范围回退按钮消失)。现改用官方同款 renderMessageImages prop(路由到 conversation.message.images 槽位)。slots 服务改为防御性获取并逐席位 try/catch。此前任一次注册冲突(如客户端 HMR 重载竞态)都会中断整个 apply(),导致「样式已注入但渲染器全丢」。attachments 服务改为运行时解析(ctx.get),缺少附件 provider 时插件仍能正常挂载,仅图片端点降级返回 501。primitives.MessageText 已被移除,用户气泡文本改用与官方相同的 projectUserText() 渲染(自动获得 @引用/会话 chip 高亮);@deepseek-ai/dsh-client-runtime;mark / cancel / state / image)注册在 dsh 的 Web 服务器上,遵循 dsh 自身的本地信任模型:dsh web 默认只监听 127.0.0.1,因此端点仅本机可达、不经 dsh 的 API 鉴权层。若你把 dsh web 绑定到对外地址(如 0.0.0.0),这些端点会随之外露——此时请自行在网络层(防火墙 / 反向代理鉴权)加以限制。/image 端点的授权模型:只会返回当前会话日志中确实引用过的 attachment(按 attachmentId 在事件流中查找),不提供按路径或任意 id 读取的能力;字节读取由 dsh 的 attachments.readImage 完成,含完整性校验。hook/invoked 事件,负载为
{ source: 'xsj.rewind', phase: 'mark' | 'cancel' | 'commit', targetSeq, hiddenFrom?, hiddenTo?, preview? }。
该事件类型属于本构建的已知保留词条(无读写方),重载安全。# 在任意目录执行(路径指向本仓库克隆位置):
dsh plugin --profile web add <本仓库目录的绝对路径>
# 重启 DSH 进程,并刷新浏览器页面
该命令会把包登记进 profile(~/.dsh/profiles/<name>/package.json 的
dependencies + dsh.profile.bundles),profile 启动时合并本包的
cordis.patch.yml 插入宿主机插件行,Web 客户端扫描自动加载 lib/client.js。
dsh plugin --profile web remove @xsj/dsh-rewind
# 重启 DSH。会话日志中的 rewind 记录无害保留(hook/invoked 为已知类型)。
Session 对象的 deriveMessages(),按已提交区间过滤
surface 节点(带签名缓存)。请求构建、llm/stream 重放不变量、图片检查全部走同一入口,天然一致。
日志不增删改任何消息事件。agent.cancel({ kind: 'user' }, { keepInbox: true })
中断当前回合;排队消息保留,随后从截断点继续。agent/pre-step 瀑布中,待回退会话一旦有新输入消息进入步骤即提交隐藏区间
[targetSeq, 当前日志末尾];新消息在此之后追加,不受影响。data-chat-flow-key,客户端按行打 seq 戳
并由 MutationObserver 驱动,对隐藏行内联 display:none;不依赖宿主 store 内部形状,
取消/切换会话即还原,不改动任何既有渲染器。user / steering 行有 seq 可打;其余行(模型输出、工具调用、context)
走官方渲染器、无标记,因此按 DOM 顺序从前一条已标记行前向归属,前导无证据的行
才回退到后方证据。不再采用「未打戳即不隐藏」。-1 接管 conversation.chat.node 的 user/steering
渲染器(槽位系统的原生遮蔽机制),行内复刻原生气泡(projectUserText / ImageGallery /
Tooltip / writeClipboard),追加 ↺ 按钮。本插件无任何 npm 依赖:Host 半只用 Node 内置模块与注入服务,Client 半经
window.__ModuleLoader__ 从外壳的冻结模块表取 react /
@deepseek-ai/dsh-client-ui-primitives / @deepseek-ai/dsh-client-ui-attachment。
克隆本仓库到任意机器后按「安装」一节操作即可。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。