dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DSH 桌面版多功能 UI 插件:对话宽度滑块(按下全屏预览、跟随窗口宽度)、思考块增强(思考/回复强制中文、展开收起、Markdown 渲染)、Open With 头部打开按钮、界面英文标签中文化、设置弹窗窗口化、会话删除与工作区分页。
DSH 的一体化界面增强插件:对话宽度、思考块、会话与工作区管理与入场动效。
DSH(DeepSeek Harness)的多功能增强插件。把对话宽度调节、思考块交互、输出语言、设置面板补丁、会话删除、工作区分页与入场动效收进同一个插件,每项功能独立开关、改动即时生效。
dsh-plugin-width-slider 面向 DSH 的日常使用场景,补齐官方客户端尚未提供、或使用体验不够顺手的能力:
本插件整合了两个上游插件(dsh-think-zh-expand、dsh-client-ui-custom)的成熟能力,安装本插件后无需再单独安装它们,详见兼容性与已知限制。
localStorage 的 dsh.conversation.contentWidth,重启 DSH 后启动即应用,无需打开设置页。dsh.conversation.contentWidthFollow。client.js,升级不会被覆盖。DisclosureRow 与官方思考图标,正文为纯文本(与官方 ReasoningRow 一致),外观与官方保持一致。MarkdownText 渲染,代码块、表格、公式由官方管线处理;围栏(dsh-ui、mermaid 等)完全交给 genui、dsh-mermaid-render 等专门插件,不存在两套 Markdown 渲染互相压制的问题。整合自 dsh-client-ui-custom,设置项收进本插件的功能总控页。
no-preference 只说明用户没设过、不代表他想要全量动效,只有 reduce 能被信任。standard(280–350ms)、纯透明度 fast(150–200ms)、新建对话大表面 medium(400–500ms);列表逐项入场步长 70ms,尾部超过 420ms 一起入场;落位类入场(上浮、缩放、面板展开)用带 3% 过冲的 linear() 曲线收尾,关闭类动画单独用 ease-in-expo。| 项目 | 要求 |
|---|---|
| 运行环境 | DSH(DeepSeek Harness),Windows 10/11 |
| DSH 版本 | >= 0.1.5-rc.1(当前基线:0.1.7-rc.2;已在 0.1.5-rc.1 与 0.1.7-rc.2 上逐项核对) |
| Node.js | ^22.11 或 >= 24 |
| 平台 | 仅 win32 |
本插件由浏览器端注入与 host 端两部分组成:
lib/client.js注入页面,lib/index.mjs在 host 进程提供/api/width-slider端点,两者都随 DSH 重启生效。
下文中的
<profile>指你实际使用的 profile 名。任选一种方式安装后,请重启 DSH:host 端index.mjs、client bundle 以及/api/width-slider端点都需要重启才会生效。
dsh plugin --profile <profile> add dsh-plugin-width-slider
cd C:\Users\<用户名>\.dsh\profiles\<profile>
pnpm link C:\path\to\dsh-plugin-width-slider
修改代码后执行 npm run build 并重启 DSH 即生效,无需复制文件。
将构建产物复制到 profile 的 node_modules 目录:
dsh-plugin-width-slider/
├── package.json
├── cordis.patch.yml
└── lib/
├── index.mjs # Host 端入口
└── client.js # Client 端 bundle(ModuleLoader 握手)
复制到 C:\Users\<用户名>\.dsh\profiles\<profile>\node_modules\dsh-plugin-width-slider\,并在该 profile 的 package.json 中把 "dsh-plugin-width-slider" 加入 dsh.profile.bundles 数组,然后重启 DSH。
lib/ 产物,重启 DSH 生效;功能开关与各项偏好保留。所有配置位于设置面板的 Width Slider 区块,改动即时生效、重启保留。默认只开不改写官方界面已有元素的六项(对话宽度滑块、思考块增强、强制中文、弹窗可拖拽、tab 栏滚动、会话删除),其余默认关闭。
| 分组 | 开关 | 说明 | 默认 |
|---|---|---|---|
| 对话宽度 | 启用对话宽度滑块 | 关闭后恢复官方原生宽度拖拽手柄 | 开 |
| 对话宽度 | 跟随窗口宽度 | 内容宽度实时等于对话列宽;开启后手动拖动不可用 | 关 |
| 思考与输出 | 思考块增强渲染 | 思考块展开/收起交互总开关 | 开 |
| 思考与输出 | 思考/回复强制中文 | host 端注入最高优先级语言规则 | 开 |
| 动效 | 动效总闸 | 关闭 / 跟随系统 / 开启(「跟随系统」读操作系统的「减少动态效果」设置) | 关闭 |
| 界面 | 弹窗可拖拽 | 设置面板窗口化(拖拽调宽高、移动、复位) | 开 |
| 界面 | 弹窗按比例跟随 | 弹窗尺寸按窗口比例(62% × 82%)自适应 | 关 |
| 界面 | tab 栏滚动 | 设置左侧导航超高时显示滚动条 | 开 |
| 界面 | 会话删除 | 会话行「⋯」菜单新增删除项 | 开 |
| 界面 | 工作区分页 | 侧栏工作区标题行改为页签栏 | 关 |
| 界面 | 侧边栏工具并入 | 工作区标题行的搜索 / 视图 / 添加工作区三个按钮并入「新建会话」行,页签行独占整行 | 关 |
| 分组 | 选项 | 可选值 | 默认 |
|---|---|---|---|
| 思考与输出 | 显示方式 | 思考完自动收起 / 始终展开 | 自动收起 |
| 动效 | 风格 | 轻柔 / 上浮 / 滑入 / 显影(一档同时决定对话内容、侧边栏与新建对话三处各用哪种入场样式;点击卡片即时预览) | 上浮 |
| 通用 | 恢复默认设置 | 重置全部开关与宽度、设置面板尺寸记忆,并刷新页面 | — |
截图与动图来自 DSH 实测,存放于
image/目录。
宽度滑块 · 按下即预览
设置面板窗口化
工作区分页
| 机制 | 说明 |
|---|---|
| Slot 注入 | settings.section(功能总控页,id width-slider)、shell.overlay(会话删除确认框)、conversation.chat.node(思考块渲染器)、sidebar.workspaces(工作区分页 wrapper) |
| 宽度应用 | 向每个 [data-phase] 对话根元素写入内联 --dsh-chat-user-width,与官方 onHandleDrag 同路径 |
| 宽度启动恢复 | client 启动即应用持久偏好:跟随模式启用全局 ResizeObserver watcher(观察对话根尺寸、窗口与根增减);固定值在对话根出现后发布一次 |
| 预览模式 | createPortal 挂载到 document.body,position: fixed; inset: 0; z-index: 100000,同时把 [data-shell-overlay] 等设置面板覆盖层设为 opacity: 0 |
| 思考块渲染 | 覆盖 conversation.chat.node 的 assistant-step 渲染器(priority −1),只提供展开/收起;头部沿用官方 DisclosureRow + IconThinkOutline14,正文纯文本 |
| 强制中文 | host 端注册 systemPrompt.section(order −90),开关热注销/注册 |
| 面板补丁 | body 观察器以 [role=dialog][aria-modal] + > nav 语义锚点探测设置面板,不依赖 CSS Module 哈希类名,探测失败安静跳过 |
| 会话删除 | 克隆官方菜单项注入「⋯」菜单,目标会话 id 从会话行 React fiber 直读(避免按标题反查误删);host 端 /width-slider sessionDelete 执行删除链,失败即中止并留痕 |
| 工作区分页 | 常驻 wrapper 包裹官方 sidebar.workspaces,按当前页签过滤会话与工作区(结果按源引用与作用域缓存,保证 getSnapshot 引用稳定);分组数据经 /width-slider wsGroupsRead/Write 存 $DSH_HOME/storages/dsh-plugin-width-slider/workspace-groups.json |
| 动效 | 命令式 Web Animations 实现(replayEntrance),而非 CSS @starting-style:宿主挂载行或面板时已强制过一次样式解析,声明式起始态不会生效;观察 [data-chat-anchor-key] 消息行与 [role="tree"] [role="treeitem"] 侧栏行,整批载入按文档序错峰入场;设置面板动效拦截三条关闭路径,先让真实面板缩小再放行;设置页的实时预览复用同一份 entranceSpec() 帧表(时长按 3 倍放慢,帧与缓动不变),不存第二份拷贝 |
| 动效 | 角色化入场读宿主发布的 data-chat-flow-kind(user/steering → 用户角色,assistant-step → 所选样式,其余 → 过程角色);思考块正文按渲染高度估算行数做 clip-path 逐行擦除;宽度滑块取最近 120ms 的指针采样算释放速度,投影 120ms 后由欠阻尼弹簧(k=260、ζ≈0.67)驱动,落点定稿时才写入存储;设置页错峰由 nth-child 加一个 CSS 变量步长实现,不经过 JS |
| 配置存储 | 功能开关(含动效总闸与风格档)经 /api/width-slider 端点读写 $DSH_HOME/storages/dsh-plugin-width-slider/settings.json(原子写);client 端 config store 负责热切换 |
| 滑块几何 | 轨道高度等于圆形手柄直径(设置页行内 16px、预览遮罩 28px),填充条右端为与手柄同心同半径的半圆头,无平直切面露出 |
| 性能 | 列宽在 pointerdown 时快照,宽度更新经 rAF 节流,拖动不卡顿 |
本插件整合了以下上游能力,安装本插件后无需再单独安装它们;若同时启用,会出现两套实现争抢同一界面元素的情况,请停用或卸载上游插件。
| 上游插件 | 上游参考版本 | 本插件整合版本 | 整合内容 |
|---|---|---|---|
| dsh-think-zh-expand | v0.4.7 | v0.3.0 | 强制中文、思考块渲染 |
| dsh-client-ui-custom | v0.1.0-rc.12 | v0.8.0 | 入场动效引擎(本插件 2.0.0 起改为总闸 + 风格档) |
同时启用时的后果:同一块界面被两个渲染器接管、出现两个按钮与两套设置,或两套动效引擎对同一批 DOM 各自动画一次导致效果叠加。
| 项目 | 说明 |
|---|---|
| 目标内核 | DSH 0.1.7-rc.2(当前官方内核),并对 0.1.5-rc.1 保留兼容兜底:思考块图标名回退、会话行 id 取法回退、会话菜单项注入回退。不为更早版本保留兼容分支 |
| Host 入口依赖 | inject 声明 systemPrompt、connection、subprocess、webServer。端点注册不用 connection.rpc.handle:该调用把路由注册为 owner.effect(() => owner.webServer.register(route)),owner 取 connection 自身 ctx,而 0.1.5 的 connection 已不在自身 ctx 注入 webServer,第三方插件调用必抛 cannot get property "webServer" without inject —— 所以承担路由注册的 fiber 自己必须声明 webServer 依赖。注册改走 connection.fetch.register 的 /api 精确 Fetch 路由 |
| 端点与围栏 | 客户端 POST /api/width-slider,请求体为 { method, payload },响应体为处理器返回的 JSON;围栏由 connection 的 /api 处理器统一施加(可信 Host/Origin + 浏览器认证) |
| 已核对稳定的契约 | slot(conversation.chat.node、settings.section、shell.overlay、sidebar.workspaces、sidebar.workspaces.session.menu.item)、ui-primitives 组件(MarkdownText、DisclosureRow、Modal、MenuItemButton、IconThinkOutlineRegular/IconThinkOutlineMedium,旧名 IconThinkOutline14 保留回退)、__ModuleLoader__ 握手、connection.fetch.register 的 /api 精确 Fetch 路由、locale.register、sessions.list 快照、storageDomain 的 session_projcache 与 workspace 域、会话行根 data-row-key="session:<id>" |
| 功能 | 状态 |
|---|---|
| 对话宽度滑块、思考块增强、面板补丁 | 已在 DSH 上实测 |
| 会话删除、宽度启动恢复 | 已由作者验收 |
| 工作区分页 | 已由作者验收 |
| 设置页排版重写与动效整合 | 已在 DSH 0.1.5-rc.1 上实测(角色化入场、思考块逐行揭示、滑块惯性回弹、设置页错峰落位逐项核对) |
| 动效设置重写(2.0.0) | 已在 DSH 0.1.7-rc.1 上实测(总闸三态、四档风格卡即时预览、总闸关闭时置灰) |
| 预览慢放与弹窗动效归因(2.0.1) | 预览改为 3 倍慢放;桌面版设置弹窗的入场动效经代码逐项核对(原点锚到弹窗外触发按钮、0.62 起点缩放、EASE_SPRING 过冲、320ms) |
| 弹窗锚点修复(2.0.2) | 已定位桌面版 0.1.7 的回归:该版本把 aria-haspopup="dialog" 加到了上下文仪表、统计药丸、用量面板等多处控件上,引擎原先取文档第一个匹配元素当锚点,会锚到视口另一侧的控件;改为三级优先取锚点(指针按下的按钮 → aria-expanded="true" 的候选 → 离弹窗最近者),排除弹窗内部按钮,并把锚点夹取到弹窗边界内 |
0.1.5 内核适配(RPC 迁移到 /api 精确 Fetch 路由) | 已在 DSH 0.1.5-rc.1 上实测(/api/width-slider 返回 200,设置读写与各功能开关即时生效) |
| 0.1.7-rc.2 内核适配 | 已逐项核对:host 侧 systemPrompt.section / agents.cancel+whenIdle / sessions.detachEntered、五个 client 服务(slots/locale/connection/sessions/workspaces)与 slot API、DOM 锚点、__ModuleLoader__ 握手、require 白名单全部命中;修复思考块图标名、按 groupPart 过滤块(避免思考块与回复重复渲染)、会话行 id 与菜单项改走官方契约。其中 client 侧的 connection 已在 2.1.0 移除——它在本插件里始终零消费者,端点调用一直走原生 fetch 而非 connection.rpc.call(host 侧的 connection / webServer 依赖不变,见上表) |
| 端点契约集中化与入口服务收敛(2.1.0) | 已由本仓测试覆盖(端点契约测试钉住路径、五个方法名与请求形状;client 入口装配用例覆盖 E1–E15 生命周期);未在真实 DSH 进程里加载过 |
win32)上验证与发布;其它平台未做适配。npm install
npm run build # tsdown 构建 → lib/index.mjs + lib/client.js
npm run typecheck # TypeScript 类型检查
npm test # 单元测试(含 jsdom 动效用例)
构建产物:
lib/
├── index.mjs # Host 端(ESM)
├── client.js # Client 端(CJS,含 window.__ModuleLoader__.load 握手)
└── types/ # 类型声明(tsc 产出)
测试位于 test/(31 个用例文件、305 项:设置面板动效、思考块渲染与分组过滤、动效角色映射、动效总闸与风格档判定、弹簧手感、文字擦除、侧边栏工具并入、会话删除、工作区页签对话框、端点协议契约、client 入口装配、MOTION_CSS 字符串快照,全部通过);仓库内包含 DSH 源码副本(dsh-src/),已在 vitest.config.ts 中排除,不参与测试收集。
tsdown 0.6.x 与 rolldown 1.2.7 组合会报
The requested module 'rolldown/experimental' does not provide an export named 'transformPlugin'。
请使用 tsdown >= 0.22(本仓库已锁定 ^0.22.14 + rolldown ^1.2.6)。
dsh-plugin-width-slider/
├── src/
│ ├── index.ts # Host 端入口:注入装配 + 端点注册
│ ├── host/
│ │ ├── api.ts # 五个端点的分发器(readSettings / writeSettings / wsGroupsRead / wsGroupsWrite / sessionDelete)
│ │ ├── chinesePrompt.ts # 中文强制注入(systemPrompt.section 的三态装卸)
│ │ ├── dshHome.ts # $DSH_HOME 解析
│ │ ├── endpointChannel.ts # /api 下 JSON 端点注册(connection.fetch.register)
│ │ ├── jsonFile.ts # JSON 读写、损坏文件的改名保留与回落
│ │ ├── sessionDeleteService.ts # 会话删除链(停任务、删目录、清投影缓存、工作区记账)
│ │ ├── settingsStore.ts # settings.json 的 per-apply store
│ │ └── workspaceGroupsStore.ts # workspace-groups.json 的 per-apply store
│ ├── shared/
│ │ ├── settings.ts # 功能开关契约(host/client 唯一真源)
│ │ ├── motionSettings.ts # 动效总闸三态与四档风格
│ │ ├── endpointContract.ts # 端点路径、五个方法名与响应信封
│ │ └── types.ts # Disposer 等最小共享类型
│ ├── env.d.ts # 运行时模块类型桩
│ └── client/
│ ├── index.ts # Client 端入口:locale 注册 + 受控功能生命周期
│ ├── sessionDelete.ts # 会话删除菜单项与确认框
│ ├── sidebarToolsMerge.ts # 侧边栏工具并入
│ ├── widthPrefs.ts # 宽度偏好读写/发布与启动恢复
│ ├── WidthSliderControl.tsx # 宽度滑块组件(按下预览、rAF 拖动、释放惯性与持久化)
│ ├── WidthSliderSettings.tsx # 设置区块:功能总控页
│ ├── workspaceTabs.tsx # 兼容转发壳(真正的实现在 patches/wsTabs/)
│ ├── core/ # 跨功能基础设施
│ │ ├── config.ts # FeatureSettings 契约 + client 配置 store
│ │ ├── domObserver.ts # DOM 变更观察的统一封装
│ │ ├── endpointChannel.ts # /api 端点调用(POST { method, payload })
│ │ ├── features.ts # 受控功能注册表
│ │ ├── lang.ts # 界面语言判定
│ │ ├── locales.ts # zh / en 文案
│ │ ├── overlayState.ts # 浮层状态
│ │ ├── primitives.ts # ui-primitives 的取用封装
│ │ └── rpc.ts # 设置读写的端点薄封装
│ ├── features/ # 受控功能的装配层
│ │ ├── motion/index.ts # 动效引擎的装卸与槽位绑定
│ │ ├── think/index.ts # 思考块渲染器注册与样式注入
│ │ └── width/index.ts # 宽度启动恢复与手柄隐藏样式
│ ├── official/ # 官方 DOM 与契约的适配层
│ │ ├── chatDom.ts # 对话区 DOM 锚点
│ │ ├── menuInjection.ts # 会话行菜单项注入
│ │ └── settingsDom.ts # 设置面板 DOM 锚点
│ ├── patches/ # 官方界面的补丁
│ │ ├── settingsPanel/ # 面板补丁:弹窗窗口化 + 左侧导航滚动
│ │ └── wsTabs/ # 工作区分页:页签栏、分组 store、树过滤
│ ├── motion/ # 入场动效引擎(对话/侧边栏/新建对话/设置面板)
│ └── think/ # 思考块渲染器
├── test/ # 单元测试(含 jsdom 动效用例)
├── scripts/fix-dts-imports.mjs # 构建后修正 d.ts 相对导入
├── docs/ # 重构计划、各批实施规格与留档(非运行时依赖)
├── cordis.patch.yml # bundle patch:insert width-slider
├── tsdown.config.ts
├── tsconfig.json
└── package.json
Q:重启后对话宽度没有恢复?
宽度偏好保存在 localStorage,client 启动时会立即应用;若宽度未恢复,请确认「启用对话宽度滑块」处于开启状态,且没有其它插件同时写入 --dsh-chat-user-width。
Q:设置里找不到本插件? 请确认插件已安装到 DSH 的 profile 并已重启。设置项位于 设置 → Width Slider。
Q:和上游插件同时安装会怎样? 会出现两套实现争抢同一界面元素(两个按钮、两套渲染器或两套动效引擎)。请停用或卸载上游插件,见与上游插件的关系。
Q:会话删除能恢复吗? 不能。删除操作会同时清理会话数据、磁盘日志与相关记账,执行前有二次确认。
Q:动效没有生效? 先看动效总闸是不是「关闭」(默认关闭);若总闸选了「跟随系统」而系统启用了「减少动态效果」,动效会按设计不播放。场景不再单独开关——总闸开着就全部生效,风格卡决定怎么动。
Q:官方升级后某些功能失效? 部分能力依赖官方 DOM 结构,官方大幅重构界面时可能失效。此时相关补丁会安静跳过,不影响其它功能;请在 Issues 反馈并附上 DSH 版本号。
/api/width-slider 的路径与五个方法名(readSettings / writeSettings / wsGroupsRead / wsGroupsWrite / sessionDelete)原先以字符串字面量散落在 host 与 client 共八处,改一处漏一处既无编译期也无运行时提示。现在集中在新建的 src/shared/endpointContract.ts,并由新增的端点契约测试钉住路径、五个方法名、请求形状与响应信封。inject 移除零消费者的 connection——client 侧的端点调用一直走原生 fetch,从不经过 connection.rpc.call(0.1.5 内核对第三方插件已不可用)。host 侧的 connection / webServer 依赖不变,那边有必需性论证(见 src/index.ts 与 src/host/endpointChannel.ts 的说明)。motion/settingsMotion.ts 里那个模块私有的 PANEL_FRAMES(起点 opacity 0 / scale 0.62)改名为 SETTINGS_PANEL_FRAMES,以区别于引擎里同名的面板入场帧表(motion/frames.ts 的 PANEL_FRAMES,起点 opacity 0.5 / translate 0 6px)——两者同名不同物,此前只靠注释区分。帧表数值一个都没变。patches/wsTabs/assignMenuItem.ts 的 excludeAttrs 里有一个本插件旧版本自己的属性名,删掉后语义不变(排除表不需要包含自己的 attr,official/menuInjection.ts 的查找条件已覆盖);会话删除项仍在排除表里。MOTION_CSS 字符串快照、client 入口装配端到端覆盖、端点契约测试;用例文件从 22 个增至 31 个,用例数从 228 项增至 305 项。core/ / features/ / official/ / patches/ 分层);第三方声明里六处已失效的文件路径更正(含两个已被拆分/改名的文件)。src/index.ts 与 src/client/index.ts 之外的模块按职责分层;本版把端点协议与版本号一并收敛。以上改动由 tsc、vitest 与构建产物核对验证;本版本未在真实 DSH 进程里加载过端到端验证。
aria-haspopup="dialog" 加到了上下文仪表、统计药丸、用量面板等多处控件上,而引擎原先用 document.querySelector 取文档里第一个这样的按钮当缩放锚点——命中的可能是视口另一侧的控件,面板就从那个点往外放大,看起来像从上方飘进来。现在按三级优先取锚点:指针按下的那个按钮 → aria-expanded="true" 的候选(弹窗打开时只有触发的那个按钮是展开态)→ 离弹窗最近的候选;候选一律排除弹窗内部的按钮。test/settingsMotion.test.ts 增加「多个候选时只认展开的那个」「触发按钮在弹窗外时锚点被夹取到边界」「弹窗内部的按钮不会被当作自己的触发按钮」三例(测试总数 225 → 228)。PANEL_FRAMES 起点缩放 0.62、EASE_SPRING 曲线峰值 108.3% 的过冲、全程 320ms。代码位置:src/client/motion/settingsMotion.ts 的 triggerOrigin() / PANEL_FRAMES / PANEL_REPLAY_MS 与 src/client/motion/animate.ts 的 EASE_SPRING。本次按用户决定保持现状,只改预览。dsh-settings-drawer,它往 settings.section 注册了一个「设置抽屉」导航项、并过滤导航列表,因此左侧导航条目数与 desktop 不同。entranceSpec() 帧表与时长,不存第二份拷贝——预览一旦与实机漂移,教的就是错的东西。motionEnabled、sidebarMotionEnabled、newChatMotionEnabled、settingsMotionEnabled、motionRoleEntrance、motionStyle、sidebarMotionStyle、newChatMotionStyle 八个字段整批移除,场景一律跟随总闸。把五个引擎的名字摆成五个开关,等于要求用户先学会代码结构才能设置自己。motionLook(默认 rise),保留 motionMode;旧字段读到时一律丢弃、不做迁移——它们表达的「哪些地方动」已经并入总闸,旧值没有对应物。prefers-reduced-motion: no-preference 只说明用户没设过、不代表他想要全量动效;原先"系统开了就降级为仅淡入"的隐式行为,现在是一个显式档位。MotionPresetConfig 随之改名为 MotionStylePreset)。motionMode,取值 off(默认)/ system / on;判定收在共享层的纯函数 motionAllowed(mode, systemReducesMotion),host、client 与测试共用同一份。motionMode 是新字段,老配置文件里没有,mergeSettings 会让它回落到默认的「关闭」。若你此前把动效开着,升级后需要把总闸切到「跟随系统」或「开启」。mergeSettings 原来对布尔用 !== false 判定(配置缺键即视为开),与 DEFAULT_FEATURE_SETTINGS 是两套逻辑,改默认值时容易静默漂移;现在每个字段一律以 DEFAULT_FEATURE_SETTINGS 回落,布尔只认真正的布尔值,脏值不再被当成 true。src/client/think/uiLocalize.ts 与 test/uiLocalize.test.ts、设置总控页上的开关、uiLocalize 配置字段(老配置文件里的该键会被忽略),并同步 README 与第三方声明。src/client/lang.ts 的 isZhInterface() 保留:思考块(「已停止」标签)、会话删除确认框与设置面板补丁仍用它判断界面语言。配置字段由 19 个减为 18 个,总控页开关由 15 项减为 14 项。data-session-delete-item 标记,而兜底清理逻辑(ensureDeleteMenuItem)正是以该标记为删除键——槽项渲染后紧接着的 rAF 调度把它自己删掉了,菜单里只剩官方的置顶/重命名/分叉/归档,且没有任何报错。现在槽项改用独立的 data-session-delete-slotitem 标记,只承担「官方槽已接管、兜底让位」这一语义,不再参与兜底项的删除键匹配。0.1.7-rc.2:逐项核对 host 与 client 两侧契约 —— systemPrompt.section、agents.cancel/whenIdle、sessions.detachEntered/flush、storageDomain 的 session_projcache 与 workspace 域、五个 client 服务(slots/locale/connection/sessions/workspaces)、slot API 与覆盖语义、DOM 语义锚点、__ModuleLoader__ 握手、require 白名单,全部命中,无需改动。IconThinkOutline14 改名为 IconThinkOutlineRegular / IconThinkOutlineMedium,插件按新名优先解析、旧名回退(0.1.5 兜底),图标不再丢。groupPart: "reasoning")与独立条目(groupPart: "response")渲染两次,官方按 groupPart 跳块才不会重复。插件渲染器此前忽略该字段,导致思考块与回复各出现两遍;现在按同样语义过滤块,并从注册处透传 props.groupPart。data-row-key="session:<id>"(0.1.7 起稳定),React fiber 直读保留为 0.1.5 兜底。sidebar.workspaces.session.menu.item:由宿主直接投影 sessionId / displayTitle,不再依赖克隆官方菜单项;槽生效时不再克隆(避免菜单里出现两个同名项),旧宿主仍走 DOM 兜底。dsh.client.inject 与 peerDependencies 移除 0.1.7 已不存在的 @deepseek-ai/dsh-client-runtime(该字段仅作加载元数据)。Thinking、Tool Call(s)、Turns/Calls 及其展开收起、Load earlier history、Cancel 等)整条移除,保留仍无官方译文的硬编码英文作为兜底。