Repository navigation
Releases: Max-Null/dsh-chat-rail
Release list
dsh-chat-rail 0.6.13
修复
- 点击跳转后高亮会落到上一条(issue #1)。落位把目标行居中(视口 50%),而 scroll-spy 按「离 40% 线最近」选行——相邻条目中心间距小于视口高度的 20% 时,40% 线离上一条更近;落位自己派发的那次 scroll 经 60ms 去抖就把高亮改判到上一条。消息越矮、间距越密越容易中(行高 40/60/80/100px 实测全部选中上一条)。
新增
- 点击条目立即变蓝,不再等滚动结束——未加载的条目本就要先分页,落位前根本没有 scroll 事件可供 scroll-spy 更新。
- 跳转落位期间冻结 scroll-spy 的重算:settle 之后再等一个 150ms 去抖窗口才交还,且交还时不重算,高亮留在点击的那条,直到用户自己滚动。
说明
-
issue #1 报的另两件事——「平滑滚动期间悬浮窗乱跳」与「多个平滑动画互相抢占」——在当前版本已不成立。0.6.x 早已把落位改成瞬时定位(
jumpToMessage直接赋scrollport.scrollTop,见docs/决策/2026-09-28-跳转改瞬时定位-方案.md),那条「smooth → 连续 scroll → 高亮反复改判 → 高亮跟随再把 rail 自己滚」的链条失去了触发源。无头浏览器按两边真实几何重放:落位方式 scroll 事件 updateActive 执行 高亮变化 rail 自我滚动 0.3.1(smooth) 31 7 5 5 次 0.6.12(瞬时) 1 1 1 1 次 -
因此没有采用建议里的「150ms 滚动静止检测」:在瞬时落位下它会让落位刚结束就重算一次,而那次重算正好判给上一条,等于把刚修好的问题制造回来。
-
跳转所有权改用单调递增 token 表示:连点两条已加载的条目时,被取代的旧跳转不得解除新冻结、也不得抹掉新跳转的分页指示。
-
测试 50 → 57(新增 7 条钉所有权规则;做过变异验证——移除所有权检查后对应用例确实转红)。
-
未包含「滚动中点击其它条目直接接管」:分页期间条目仍
disabled,去掉这道守卫会让loadThrough并发,安全性未在真机验证,留作后续。
dsh-chat-rail 0.6.12
修复
- 附件回填在 DSH
0.2.0-rc.2上失效(表现为「加号只把文本填进输入框、图片不进去」)。该内核把两个运行时方法改了名:createDraftImages(files)→createDrafts(sessionId, files)、addImages(ids)→addAttachments(ids);旧调用藏在可选链与降级分支后面,所以不报错也没有提示。现在两代名字都探测,按内核实际提供的那一代调用。 - 收藏 ★ / 添加 + 的按钮提示移到按钮下方,与官方复制按钮一致(原先挂在上方,会伸进消息行盖住正文)。
升级
dsh plugin --profile <name> add @max-null/dsh-chat-rail或精确 pin:
dsh plugin --profile <name> add @max-null/dsh-chat-rail@0.6.12dsh-chat-rail 0.6.11
修复
- tip 面板不再越过输入区。悬停到靠下的条目时,面板此前会从条目顶边一路向下探(最高 70vh)压到 composer 上——既盖住发送按钮,又因为 tip 自己接管指针事件而把点击一并吞掉。现在面板底边钉在 composer 座位(官方锚点
[data-composer-seat])上沿之外,空间不够就内部滚动;连 120px 的最小可读高度都放不下时,top整体上移。 .crl_tip补box-sizing: border-box:content-box下max-height只约束内容高度,padding 与 border 会再撑出 22px,足以把上面那道闸门顶穿。
升级
dsh plugin --profile <name> add @max-null/dsh-chat-rail或精确 pin:
dsh plugin --profile <name> add @max-null/dsh-chat-rail@0.6.11dsh-chat-rail 0.6.10
调整
- 导航条
z-index由 5 → 19:压过官方右侧面板(10)、列拖拽手柄(11)与标题栏座位(15),又停在shell.overlay(20)之下 —— 此前这三档在几何重叠时都能压住导航条。
上限不是保守起见:shell.overlay是独立的层叠上下文,越过 20 会把那一层整体盖住(插件中心的「插件更新」弹窗就注册在那里)。 - README「兼容性」中那条层级说明同步更新。
升级
dsh plugin --profile <name> add @max-null/dsh-chat-rail或精确 pin:
dsh plugin --profile <name> add @max-null/dsh-chat-rail@0.6.10dsh-chat-rail 0.6.9
修复
- 导航条不再盖住
shell.overlay那一整层:.crl_nav的z-index由 90 降到 5。
官方 frame 的浮层梯度是「右侧面板 10 → 拖拽手柄 11 → 标题栏座位 15 → shell.overlay 20 → 全屏右面板 40」。上一版取 90 只调开了与 DSH 菜单(100)的先后,仍高于整层 shell.overlay —— 该层是独立的层叠上下文,其中一切(包括插件中心注册在那层里、自身没有 portal 的「插件更新」弹窗)都会输给层外的元素,于是被导航条挡住。
5 仍高于会话列内容,同时低于右侧面板 10 与拖拽手柄 11(手柄须始终可拖)。
文档
- README「兼容性(重点)」把层级判据改成官方的浮层梯度,并写明为什么取 5。
dsh-chat-rail 0.6.8
修复
- 导航条不再压住 DSH 的菜单与 tooltip:
.crl_nav的z-index由 100 降到 90。DSH 的下拉菜单与 tooltip 同为 100(ui-primitives/Menu.module.css),而导航条是挂到body末尾的 portal——同层级时 DOM 靠后者在上,导航条因此把菜单压住。90 仍高于侧栏 30 与 dockkit 70,只让菜单赢。
文档
- README 的「兼容性(重点)」补上这条层级约定:该段此前只覆盖与侧栏、底栏、官方轮次导航的避让,没有写与菜单/浮层的叠放。
dsh-chat-rail 0.6.7
dsh-chat-rail 0.6.7
版本决策
- 0.6.6 → 0.6.7(patch):只放宽 peer 版本范围 + 校订 README,没有新的用户可见能力,非 break。但没有它,本插件在 SSiD 下一版内核(
0.2.0-rc.1)上不会被装载。
为什么必须发这一版
SSiD 内嵌内核将从 0.1.7-rc.2 升到 0.2.0-rc.1。DSH 在装载插件前逐个检查 peerDependencies 里的每个 @deepseek-ai/dsh-* 声明(packages/boot/app-boot/src/plugin-compatibility.ts):
semver.satisfies(runtimeVersion, requirement, { includePrerelease: true })caret 对 0.x 的上界是下一个 minor 的 -0 预发布,于是:
| 范围 | 对 0.2.0-rc.1 |
|---|---|
^0.1.7-rc.2(旧) |
false —— 判不兼容,插件不被装载 |
^0.1.1-rc.1 |
false |
>=0.1.7-rc.2 <0.3.0(新) |
true |
相对于 npm 0.6.6 的增量
- fix(compat):
peerDependencies与devDependencies的 9 个@deepseek-ai/dsh-*声明统一改为>=0.1.7-rc.2 <0.3.0——保留原下限,只放宽上界。@deepseek-ai/cordis与@deepseek-ai/schemastery不在该检查的命名空间内(只匹配@deepseek-ai/dsh与@deepseek-ai/dsh-*),保持不变。pnpm-lock.yaml同步 9 条 specifier,解析版本仍是0.1.7-rc.2。 - docs(README) 核对(先假定写错,再回源码找证据):
- 版本要求原写「需要 DSH ≥
0.1.0-rc.6」,与 peer 下限0.1.7-rc.2矛盾——按上面的判据,那个内核根本装不上。已改为与 peer 一致的写法,并说明 caret 为何不可用。 - 收藏原写「按会话持久化(localStorage)」,实际是 host 文件(
$DSH_HOME/chat-rail-favorites.json,经/chat-rail/api/favorites读写;localStorage 仅作旧数据一次性迁移)。 - 架构段的投影锚点字段补全为
{ seq, time, text, hasImage, images, id }。 - 其余断言(260px 退场阈值、
[data-conversation-scroll]锚点、--dsh-sidebar-height避让、conversation.input.dock槽、TurnNavigator 双aria-label、loadThrough200 条 /loadOlder50 条、只显示收藏开关行为)逐条回源码核对,与实现一致,未改。
- 版本要求原写「需要 DSH ≥
判据来源(实测)
用 DSH checkout 自带的真 semver 7.7.4 逐条验证:0.2.0-rc.1 对全部 9 个新范围的 satisfies 均为 true,对旧 caret 式均为 false;0.1.7-rc.2 对新范围仍为 true(没有丢下限)。
回归确认(L1)
pnpm typecheck✅pnpm test50/50 ✅pnpm build✅(lib/重新构建,产物与上一版逐字节一致——本次不改用户可见行为,docs/shots/未动)
兼容性
需要 DSH >=0.1.7-rc.2 <0.3.0,与本插件的 peerDependencies 一致。
dsh-chat-rail 0.5.0
dsh-chat-rail 0.5.0
版本决策
- 0.4.0 → 0.5.0(minor):新功能「安装后自动屏蔽 DSH 官方轮次导航」+ 1 个收藏粘性修复,非 break。
相对于 npm 0.4.0 的增量
- feat(client):屏蔽官方 TurnNavigator(轮次导航)——DSH
0.1.2-alpha.1+自带轮次导航竖轨(与右键 messages 同名右缘位置;仅轮次维度)。安装本插件后自动隐藏官方竖轨,由本插件统一承担会话导航。锚点用 aria-label 中英双文案(轮次导航/Turn navigation),不用 CSS module 类名(hkplfa_slot这类 hash 随构建漂移)。- L2 实测(SSiD dev)通过:官方竖轨消失、导航/收藏功能正常、console 0 error。记录:
docs/验证记录-2026-08-30-屏蔽官方TurnNavigator.md(含截图)。
- L2 实测(SSiD dev)通过:官方竖轨消失、导航/收藏功能正常、console 0 error。记录:
- fix(client):收藏开关粘性正确——收藏开关粘住胶囊顶部(含 padding 区域),行不再从顶部透过(8658e46)。
- docs:家族清单同步(header-unify → quick-toolbar 迁出)、L2 留痕。
回归确认(L1)
pnpm typecheck✅pnpm test22/22 ✅
dsh-chat-rail 0.4.0
dsh-chat-rail 0.4.0
画卷式消息导航,新增收藏与快速填充。
✨ 新功能
- 消息操作按钮:每条用户消息的复制按钮左侧新增两个按钮
- 星 ★:收藏/取消收藏(收藏后变为黄色实心星),按会话持久化
- 加号 +:一键把消息全文 + 历史附件回填输入框(走官方附件通道)
- 导航条联动:收藏的消息指示条显示为黄色;展开态标题前显示黄色星标
- 只显示收藏:导航条顶部星形过滤开关,点亮后只显示收藏的消息
💾 持久化(host 侧)
- 收藏数据存 host 文件(
~/.dsh/chat-rail-favorites.json,经/chat-rail/api/favoritesGET/PUT) - 为什么:client
localStorage按 origin 隔离,思灵 DSH web 端口每次启动随机 → 旧方案跨重启丢收藏 - localStorage 旧数据自动一次性迁移后清除;加载完成前以 localStorage 兜底
🎨 UI 打磨
- 星/加号按钮与复制按钮完全同款:28px 圆形、DSW token 颜色、hover 浅蓝圆背景
- hover 黑底 tooltip(收藏消息 / 取消收藏 / 填充到输入框),与 host Tooltip 一致
- 展开态筛选按钮为完整标签行(星 + 「只显示收藏」),杜绝竖排
- 收藏条为当前阅读位置时光晕同色(黄),不再「黄点蓝光」
- 筛选按钮钉在导航条顶部(sticky,长会话滚动不跟随滚走)
- 无收藏时隐藏筛选按钮(过滤激活时取消最后一条收藏自动释放过滤)
🐛 修复
conversation服务注入声明(此前直接访问导致插件崩溃)- 只显示收藏过滤下剩 1 条时导航条不再消失
- host 半端
webServer注入导致投影单测批量失败(fake 服务分流修复)
验证
- 单测 22/22、E2E 11/11(真实 SSiD 界面驱动,幂等重置收藏后重测)、typecheck 通过
- 长会话真机验收通过(筛选按钮 sticky、无收藏隐藏、收藏持久化跨重启保留)