Repository navigation
Releases
v0.2.0 — 适配 DeepSeek Harness 0.1.7
0.2.0
新增
- 快速跳章:书架每行右侧的
≡展开该书的步骤清单,滚动点选直接跳到任意一章;打开时当前章自动居中。点整行仍然是选中这本书接着读(ADR-0008)。 - 快进:按住
Shift+↓/→时输出的时钟走 40 倍(约每秒二十多行),松开立刻回到正常速度。快进的结束认真实松手事件而不是定时器,所以按住就是连着一大片出来。仍然是逐行逐字长出来的,不是整段蹦出(ADR-0009)。 - 书单能用鼠标:书单开着时鼠标不触发退出 —— 否则手刚移到书名上界面就没了,等于根本点不到书。点书名打开、点
✕删除、拖文件导入都能用;此时用Ctrl+Shift+Alt+Z收起(ADR-0007)。
修复:适配 DeepSeek Harness 0.1.7-rc.1
0.1.7 改了客户端插件与基线原语的若干契约,逐条按实际安装产物(lib/*.js 与
lib/types/**/*.d.ts)对齐,并在一个隔离的 DSH 0.1.7 实例里用 CDP 驱动真实浏览器端到端验证:
快捷键进出、空书库下的鼠标行为、拖放导入 txt、自动进入阅读、鼠标一动收场 —— 全通过。
-
MarkdownText在运行时根本取不到,正文渲染整条静默降级。0.1.7 的MarkdownText与
DisclosureRow都是React.memo(...)的产物(.d.ts声明的类型就是MemoExoticComponent),
而React.memo返回的是对象:typeof MarkdownText → 'object' Object.keys(MarkdownText) → ['$$typeof', 'type', 'compare'] MarkdownText.$$typeof → Symbol(react.memo)原判据是
typeof value === 'function',于是withSafePrimitives认定"基线没有 MarkdownText"
并直接返回未包装的模块 —— 下一节的 labels 兜底因此整条失效。判据改为
「函数,或带$$typeof的对象」。 -
labels从可选变必填,而渲染器是「无保护解引用」。0.1.7 的实现直接读
context.labels.code.copyLabel(dsh-client-ui-primitives/lib/index.js:10725-10727,围栏/缩进代码块)
与context.labels.footnotes(:11025)。漏传的后果不是"文案不对",而是正文里一旦出现
代码块或脚注就 TypeError,slot entry 被错误边界整条摘掉 —— 屏幕上那一段阅读流直接消失,
且只在特定章节复现。改为在primitives.ts这一层给MarkdownText套上"labels 永远合法"的
外壳(调用点照旧只传{ text, streaming: false }),兜底文案取自 0.1.7 自带的中文词典
(dsh-client-locale/lib/client.js:933-937、:966),不是自己编的。 -
拿不到「当前会话」,退化成
ids[0]。0.1.7 的SessionListState只有
{ ids, byId, phase, projectionsBySession },没有current字段
(dsh-api-session-controller/lib/types/client/sessions/service.d.ts:43-52);而
sessions.binding(id)只对已被 retain 的会话返回 binding(contract/sessions.d.ts:149-153)。
旧代码的state.current永远是 undefined,一旦ids[0]不是被 retain 的那个就拿不到事件流,
只能退回硬编码模板 —— 那违反 ADR-0002(工作痕迹行必须来自真实会话历史)。
改为从 session 作用域槽的sessionIdprops 记录真实会话 id,兜底顺序写死为:
真实 id 的 binding → 其余 id 中第一个能拿到非空 binding 的(retainedBy.mainView优先)→ 模板。 -
图标名整批改名。0.1.7 里
Icon…Outline14/Icon…Outline16一个都不剩
(grep -c "Outline14\|Outline16" lib/types/icons/index.d.ts= 0),统一成
Icon…OutlineRegular(1px 描边)/Icon…OutlineMedium(1.3px 描边),尺寸只由size决定。
取值改为「新名 → 旧名」降级链,同一份代码在新旧两版上都能取到图标。 -
DisclosureRow的onToggle变必填。当前靠expandable: false在运行时没崩
(lib/index.js:3046-3092证明不可展开时它从不被调用),但那是"靠一个 prop 的值兜住"的
脆弱状态 —— 谁把expandable改成 true 就立刻崩。补一个模块级稳定noop(写成常量而不是
内联箭头:DisclosureRow是 memo 的,回调每帧换新对象会让浅比较失效)。
其他
- 单测 193 → 212 条。新增的
test/primitives.test.mjs用逐字复刻 0.1.7 无保护解引用的替身
做红绿可证的验证:先断言裸调用必抛 TypeError,再断言套上外壳后既不会崩、也照常输出正文;
另外钉住了「memo 形态的组件必须被当成组件」这条判据。 lib/已随源码重建(仓库直接消费产物,见 README「为什么lib/进版本库」)。