@ycp424c/dsh-auto-fold-turn
DSH 0.2.1-rc.2 开发与验证
本次 0.1.1 适配要求 DSH 0.2.1-rc.2;尚未发布 npm。运行包与开发工作区分开。
开发验证直接使用同版已安装的官方 npm SDK,客户端引擎测试另需官方源码 tag
dsh-v0.2.1-rc.2(commit 687f282e8625c6b8d11ff58211a90524be2e4317)。
setup 校验版本、生成忽略的本机路径映射,不修改上游源码。Node 与 pnpm 版本见 package.json。
# runtime-prefix 下须有 node_modules/@deepseek-ai/dsh@0.2.1-rc.2。
# 另外需要同版 client-store、client-ui-slots、client-ui-primitives,
# 以及 client-store 使用的 zustand@5 / immer@10;若另装到一个 prefix,作为第三个参数传入。
node scripts/setup-dsh.mjs /path/to/runtime-prefix /path/to/deepseek-harness-at-tag /path/to/extra-sdk-prefix
pnpm install --frozen-lockfile
pnpm check
不需要第三个 SDK prefix 时可省略。SDK 使用外部已有安装,仓库不复制核心实现;
三个输入目录可以放在任意持久位置,提交的默认配置不依赖临时目录或个人绝对路径。
行为
- 所有已加载、存在最终回复的 Turn 默认折叠,包括历史 Turn(历史 replace / prepend
与实时 append 走同一规则)。
- 折叠后保留:用户消息、摘要行、最终回复、最终回复之后的终态提示(error /
max-token 等)与 DSH 原生 turn-tail 操作。
- 每个 Turn 独立折叠/展开;一个 Turn 的操作不影响其他 Turn。
- 显式展开状态跨刷新保留,直到用户再次折叠。
- 没有最终回复或无法可靠解析的 Turn 保持完整显示。
失败与兼容策略(统一 fail-open)
- 没有 closing assistant:不生成摘要,不隐藏内容。
- 无法唯一识别最终 assistant:不隐藏内容。
- snapshot 目标与 DOM 行无法完整对应:不隐藏任何目标。
- localStorage 不可用/损坏/写入失败:交互在当前页面继续,持久化降级或重置。
- 插件卸载:清除所有插件自有显隐属性与样式。
架构
| 模块 | 职责 |
|---|
src/client/index.tsx | 插件入口:注册 Definition、keyed renderer、样式表;生命周期随 fiber |
src/client/fold-summary-definition.ts | auto-fold-summary Conversation Node Definition(match turn/end 与轮内 agent 内容事件,读 turn-tail data 的 closing,anchor 为该轮第一个 agent 内容事件 seq - 0.05) |
src/client/fold-target-resolver.ts | 纯函数:从 Chat snapshot 计算本轮可折叠过程 key 与最终回复 key |
src/client/fold-state-store.ts | sessionId+turn 显式展开集合,localStorage key dsh.auto-fold.expanded.v1 |
src/client/dom-adapter.ts | 唯一接触 DSH DOM 的模块:按 [data-chat-node-key] 定位节点各分行(兼容 anchor 回退)、原子显隐、[data-conversation-scroll] 滚动补偿 |
src/client/summary-row.tsx | 摘要行 renderer:layout effect 应用显隐,原生 button + aria-expanded |
排序:摘要 Node 的 anchorSeq 为该轮第一个 agent 内容事件(assistant/live-chunk /
assistant/message / tool/call / llm/retry)的 seq 减插件私有小数 offset(兼容边界,
非公共 API),使按钮位于 agent 回答的顶部——用户 prompt 之后、所有过程节点之前。
这些事件都带 turn 字段且恒排在用户消息之后(真实事件流中 step/start 可能先于
user/message,即 agent/inbox/spliced,因此 step 锚点不可靠)。折叠边界以最终回复
自身的 anchor 为准:任何原生排在最终回复之后的 Node(终态提示、晚期工具证据)都不会被折叠。
DOM 兼容标记
插件升级 DSH 后需运行兼容 smoke(INSTALL.md)。依赖的三个标记当前同时被 DSH
自身滚动逻辑与 E2E 测试使用,但不视为稳定公共 API:
[data-chat-node-key](同一节点的全部 reasoning/response 行);[data-chat-anchor-key](摘要及兼容回退定位)
[data-chat-flow-kind](summary 行漂移校验)
[data-conversation-scroll](滚动容器)
折叠语义与参考源
- 折叠对象:该轮内、排序严格位于最终回复之前、且不在保护集合
(
user / steering / turn-tail / turn-process / 外层 groupTree 控制 / 最终回复)中的一切 Chat 节点——包括
tool-call、中间 assistant-step、model-retry,以及 context、
command、compaction 等轮内节点(均可展开恢复)。
- 最终回复之后的一切节点(终态 error / max-token 提示、晚期工具证据)永不折叠。
- DOM 标记语义:
[data-chat-anchor-key] 缺失或流程 kind 漂移时不隐藏任何行
(fail-open);[data-conversation-scroll] 缺失时仍执行隐藏,仅跳过滚动
补偿(行可随时展开恢复,不会丢失内容)。
- 类型检查使用同版 npm SDK 的公开声明;客户端测试使用同版官方源码中的真实组装器、ChatNodeSeat 与 ChatGroupSeat。
- 在 compact/standard/detailed 下,摘要位于原生折叠之外,通过原生 Turn disclosure 协调展开;步骤分组用浏览器
beforematch 协议展开,不直接改写原生 hidden 属性。
- verbose 或异常回合保留插件自己的 DOM 折叠;同一个 assistant 的 reasoning/response 行全部按 Node key 处理。禁用时移除插件自己的显隐属性,原生控件保持可用。
开发
按文首配置同版本 SDK 与源码,然后执行:
pnpm install --frozen-lockfile
pnpm check # typecheck + build + test(包含新产物 smoke)
安装到本机 web profile 见 INSTALL.md。
License
MIT