dsh-quick-toc 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.en.md CHANGED
@@ -2,6 +2,26 @@
2
2
 
3
3
  All notable changes to **dsh-quick-toc** are documented here. Chinese version: [CHANGELOG.md](CHANGELOG.md).
4
4
 
5
+ ## [0.7.1] - 2026-09-19
6
+
7
+ ### Added
8
+ - **A "back to where I scrolled to" button**: the outline already carried a "back to the newest row" button in the list's lower-right corner whenever it was not at the bottom; there is now a matching round button in the upper-right corner, arrow pointing up, that takes you back to **the row you were looking at when you left that surface**. The place is recorded **at close time**, and the docked panel and the curtain **keep their own** — neither overwrites the other. Reopening the surface is what lights the button up, and it returns that row to **where it sat** — if it was clipped by the viewport's top edge (which is what happens when the list is parked at the bottom), it goes home clipped by the same amount instead of being forced to the very top. Using the button once — or scrolling back there yourself — fades it out and forgets that record until the next close. It is placed from the list's measured start inside the surface, so neither the docked panel's grip bar and header row nor the curtain's own toolbar can sit on top of it, and it grows to 34px with the curtain.
9
+
10
+ ### Changed
11
+ - **Opening the panel or the curtain now lands on the row being read**: only the curtain did this before, while the panel simply showed wherever the list had last been left, so the two surfaces disagreed. One rule now: the turn currently being read is aligned to the top of the list, instantly. When that turn is one of the newest few the list is already at its end, so the row lands at the bottom — no clamping is involved.
12
+ - **The panel's collapse and expand animation now uses `transform`**: it used to transition `left` (a layout property, so the whole panel — grip bar, header and every rendered outline row — was re-laid out on each frame) together with `clip-path`. On a long session the main thread could not keep up with the compositor, so collapsing turned into "a line sweeps across and the content it passes disappears" instead of the panel sliding away. The box now always sits parked at its collapsed spot and the open state is a transform on top of it: the visual geometry is unchanged, and the animation no longer slows down with the size of the list.
13
+ - **Toolbar icon geometry calibrated**: the curtain button is a 12×9 landscape rectangle (centred on both axes) instead of a portrait slab, with its arrow pointing down and its tail landing on the rectangle's top edge; the level filter's three lines are heavier (2.2); the questions-only bubble keeps the same 2.2 outline and is slightly larger and a touch lower (the bubble is the visual body and the tail hangs off its lower left, so geometric centring reads as top-heavy); the ✕ and the magnifier drop their old 1px translate nudge in favour of geometry drawn exactly on centre — a nudge is half a pixel off at any other size.
14
+ - The "remember reading position" and "auto-load history" rows in the settings card no longer carry a description.
15
+
16
+ ### Fixed
17
+ - **Paging through history "never caught up"**: once the reader reached the unloaded region, the auto-loader kept crawling at 50 messages per page every 130ms, so in a deep gap they were already there while the rows were still being filled in. There are now two paths: when a "not loaded" placeholder is actually in view, that turn's seq is paged in one hop (carrying an extra 8 rows of margin towards older history); only while merely approaching the prefetch band does it pull one page at a time. The same area held a misreading — the host's "load earlier" button is disabled while a page is in flight, and the plugin read "loading" as "reached the beginning", announcing "this is the oldest message" hundreds of turns early.
18
+ - **The view being pushed away while loading, and "turning auto-load off still bounced"**: a placeholder row grows taller when it loads, pushing everything below it down. The compensation used to run inside `requestAnimationFrame` (one or two frames after the DOM change — the "jumps and springs back" the reader saw) and only covered loads the plugin itself started, so a page the host paged in had none at all. It now runs in a layout effect (same frame as the DOM change, before the browser paints), anchors on the **first real row** in view (the placeholders are exactly what grows, so anchoring below them is what lets new content grow upward out of the viewport), and the list carries `overflow-anchor: none` — the browser's own scroll anchoring also rewrites `scrollTop` for the same growth, and the two together push the content up.
19
+ - **"It janks every so often / the longer it runs the slower it gets"**: the auto-follow read `getBoundingClientRect` for **every** message in the session on each pass — thousands of them, a dozen times a second — so the work grew with the length of the session. The node list is now cached and only re-scanned when the container or its end keys change, and the scan interval widens while the panel is collapsed.
20
+ - **Auto-loading nudged the middle conversation upward**: before each page it lifted the conversation 26px out of the host's stick-to-bottom zone (0.5.1 added that so the host would not re-pin history paged in from the outline), but it did so on every page — the reader only touched the outline and saw the conversation move. The host side now relies on the outline's own quiet window, and the lift is gone entirely.
21
+ - **One upward scroll could pull several pages**: the prefetch test measured the "loaded / not loaded" boundary row, which by definition sits against the viewport's top edge, so the condition was always true. It now measures from the nearest placeholder in view, with hysteresis.
22
+ - **Opening the curtain left the list a little above the end and then walked it down; upward jumps landed inaccurately; opening scrolled down from above**: the follow **centred** the row being read, and for the newest turn the centred position lies past the end of the list, so it stopped half a viewport short; `revealGroupInOutline` used `scrollIntoView({ block: "nearest" })`, which scrolls the minimum distance (so the landing point was arbitrary) and animates. Both now share one rule — **that row goes to the top of the list, instantly**.
23
+ - **The droplet stayed a little thick when pressed flat and then vanished a beat later**: the press ended at `scaleY(0.12)`, leaving about 2px of a 17px dome sitting on the strip, while the handle was not removed for another 220ms and its fade-out was deliberately delayed by 0.2s — so those 2px sat motionless for a beat and then the whole thing disappeared. Both ends are `scaleY(0)` now: pressed flush into the strip, and growing from zero on the way back.
24
+
5
25
  ## [0.7.0] - 2026-09-19
6
26
 
7
27
  ### Added
package/CHANGELOG.md CHANGED
@@ -2,6 +2,26 @@
2
2
 
3
3
  **dsh-quick-toc** 的重要变更都记录在这里。英文版见 [CHANGELOG.en.md](CHANGELOG.en.md)。
4
4
 
5
+ ## [0.7.1] - 2026-09-19
6
+
7
+ ### 新增
8
+ - **「回到我滚到的位置」浮动按钮**:大纲不在底部时,列表右下角本来就有一枚「回到底部」;现在右上角多了一枚方向朝上的同款圆钮,带你回到**离开这个界面时正在看的那一行**。位置在**关闭的那一刻**记录,停靠面板与幕布**各记各的**,互不覆盖;重新打开时按钮才亮出,点它回到那一行**原来的位置**——若它当初被视口上沿裁掉了一截(列表停在底部时就是如此),就还它那一截,而不是硬顶到最上面。用过一次、或者自己滚回同一处,按钮就渐隐并忘掉这次记录,直到下一次关闭再记。它按列表在界面里的实际起点定位,所以停靠面板的把手条与标题栏、幕布自己的工具条都压不住它,并且跟着幕布放大到 34px。
9
+
10
+ ### 变更
11
+ - **打开面板与幕布时都落在「正在阅读的那一行」**:此前只有幕布这么做,面板只是显示列表上次停在哪,两个界面会不一致。现在同一条规则:当前正在阅读的那一轮对齐到列表顶部、瞬时完成;读的就在最新几轮时列表已经到底,那一行自然停在底部,不需要任何钳制。
12
+ - **面板的展开/收起动画改用 `transform`**:原先同时过渡 `left`(布局属性,每帧都要重排整个面板)与 `clip-path`,长会话里成百上千行大纲时主线程跟不上合成器,于是收起会变成「一条线扫过、扫过的内容消失」,而不是面板滑走。现在盒子常驻停在收起位、展开态是叠上去的位移,视觉几何完全不变,动画不再随列表规模变慢。
13
+ - **顶部图标的几何校准**:幕布钮从竖长方形改成 12×9 的横矩形(两轴都居中),箭头由朝上改为朝下、尾端压在矩形上边上;层级筛选的三根线加粗到 2.2;「只看提问」的对话泡轮廓同样加粗到 2.2,并略微放大、整体下移一点(泡体是视觉主体、尾巴挂在左下发散,几何居中反而读作重心在上);✕ 与放大镜去掉原先 1px 的平移补偿,改为把几何画在正中——平移在其它尺寸下会差半个像素。
14
+ - 设置卡片里「记住阅读位置」「自动加载历史」两行不再带说明文字。
15
+
16
+ ### 修复
17
+ - **大纲翻历史「一直追不上」**:翻到未加载区域之后,自动加载仍按 50 条一页、每 130ms 一页地爬,深空档里读者已经翻到了,页面却还没铺完。现在分两条路:视野里已经出现「未加载」占位行时,直接按该回合的 seq 一次翻页到位,并往更早的方向多带 8 行余量;只是接近预取带时才一页一页拉。同一处还修掉一个误判——宿主的「加载更早」按钮在加载期间是 disabled,插件把「正在加载」读成了「已到最早」,于是几百轮之前就弹出「已经是最早的消息」。
18
+ - **加载时视野被推走,以及「关掉自动加载也会回弹」**:占位行加载后变高,它下面的内容被整体推下去。补偿原先跑在 `requestAnimationFrame` 里(比 DOM 变更晚 1–2 帧,看到的就是「跳一下再弹回来」),而且只补自己发起的加载,宿主自己翻页时完全没有补偿。现在补偿放进布局 effect(与 DOM 变更同一帧、浏览器绘制之前)、锚点取视野里**第一个真实行**(占位行正是要长高的那一批,锚在它们下面才等于让新内容在视野上方长出去),并给列表加 `overflow-anchor: none`——浏览器自带的滚动锚定也会为同一次增长改 `scrollTop`,与我们的补偿叠加会把内容向上顶出去。
19
+ - **「用一会儿卡一下 / 开越久越慢」**:自动跟随每次都对会话里**每一条**消息读一次 `getBoundingClientRect`,几千条 × 每秒十几次,工作量随会话长度增长。现在缓存节点列表,只在容器或首尾键变化时重扫;面板收起时把扫描间隔也放宽。
20
+ - **自动加载把中间的对话往上抬**:翻页前会把对话区从贴底的吸附区里抬出 26px(0.5.1 为了防止宿主把刚从大纲翻进来的历史重新钉回底部),但它每翻一页都动一次,读者只在大纲里操作却看到中间的对话动了。宿主侧改用大纲自己的静默窗来判断,这段抬升整个删除。
21
+ - **一次上滚会连拉好几页**:预取判据原先量的是「已加载 / 未加载边界那一组」,而那一组按定义就贴在视口顶边,条件恒成立。现在从视野里最近的一个占位行起量,并加迟滞。
22
+ - **幕布展开时列表先停在偏上的位置、再被跟随拉到底;向上跳转落点不准;打开时会从上面滚下来**:跟随把「正在阅读的那一行」**居中**,读最新回合时「居中」要求的位置超过列表末端,所以总差半个视口;`revealGroupInOutline` 用的是 `scrollIntoView({ block: "nearest" })`,只滚最小距离(落点随机)、而且带一段动画。现在统一成一条规则——**那一行对齐到列表顶部、瞬时完成**。
23
+ - **顶部液滴按下去还留一点厚度、停一拍才突然消失**:下压终点是 `scaleY(0.12)`,17px 的穹顶压到底仍剩约 2px 摆在分割线上;而把手要等 220ms 才被摘掉、淡出又刻意延后 0.2s,那 2px 就静止不动地停了一拍,然后整块消失。现在两端都是 `scaleY(0)`——压到底即沉进分割线,冒出来也从 0 起。
24
+
5
25
  ## [0.7.0] - 2026-09-19
6
26
 
7
27
  ### 新增
package/README.en.md CHANGED
@@ -28,6 +28,7 @@ A conversation TOC plugin for [DeepSeek Harness](https://github.com/deepseek-ai/
28
28
  - **Auto-follow** — the turn being read lights up in a closed blue box while you scroll the conversation; the outline follows on its own
29
29
  - **Jumping** — click a heading to jump to its position in the conversation, with the scroll animation handed to the browser's own smooth scrolling (advanced on the wall clock, so it takes the same time on a 60 Hz and a 240 Hz panel); when the host re-pages and moves the target mid-flight the jump re-aims, and when the host's own scrolling cancels the animation it is issued again, so a cross-page jump never stops halfway; a browser that carries the call out at once gets a frame-by-frame glide drawn by the plugin instead
30
30
  - **Back to the newest row** — after paging far up, a floating button in the list's lower-right corner returns to the newest entry in one click (it appears when the list is not at its bottom and disappears once it is)
31
+ - **Back to where I left** — closing the panel or the curtain remembers the row that was at the top (each surface keeps its own, and neither overwrites the other); the next time that surface opens, a floating button in the list's upper-right corner returns that row to **where it sat**. It fades out — and forgets the record — once it is used, or as soon as you scroll back there yourself, until the next close. Under the same rule, opening the panel or the curtain puts the **row being read** at the top of the list (when that turn is one of the newest few the list is already at its end, so the row lands at the bottom)
31
32
  - **Dockable and resizable** — drag the top bar to move the panel, ◀ / ▶ to dock left or right, drag an edge to resize (no upper bound, down to 120px wide), and collapse it into an edge handle (its height is set by the card's "Handle position"); position and size are remembered per browser (top offset, width and height are adjusted by dragging only)
32
33
  - **Panel scale** — a slider in the settings card scales the **content** (text, icons, buttons and their spacing) from 50% to 200% in 5% steps while the **panel's own size stays exactly as dragged**; dragging only moves the readout, and the settings document is written once you let go. A narrow panel keeps its four header buttons on one line: the empty middle gives way first, then the whole row scrolls sideways (wheel over the header), and the grey grab bar fades out
33
34
  - **Paging** — the most recent groups show first; scrolling up both expands the index and loads older conversation
@@ -40,7 +41,7 @@ A conversation TOC plugin for [DeepSeek Harness](https://github.com/deepseek-ai/
40
41
 
41
42
  | Plugin | Supported DSH |
42
43
  | --- | --- |
43
- | **0.7.x** (latest, 0.7.0) | 0.1.5-rc.1, 0.1.5-rc.2 |
44
+ | **0.7.x** (latest, 0.7.1) | 0.1.5-rc.1, 0.1.5-rc.2 |
44
45
  | 0.6.x (0.6.3) | 0.1.5-rc.1, 0.1.5-rc.2 |
45
46
  | 0.5.x (0.5.1) | 0.1.5-rc.1, 0.1.5-rc.2 |
46
47
  | 0.4.x (0.4.1) | 0.1.5-rc.1, 0.1.5-rc.2 |
@@ -49,7 +50,7 @@ A conversation TOC plugin for [DeepSeek Harness](https://github.com/deepseek-ai/
49
50
 
50
51
  Each major line lists only its newest patch (the defects a new feature introduces are fixed in the patches that follow, so within one major line the newest patch is the one to use; older patches keep working — the plugin does not break existing interfaces).
51
52
 
52
- `engines.dsh` has a floor of **0.1.5-rc.1** (`>=`): from that release on, the plugin uses the host's session-scoped slot injection. 0.7.0 was tested on **0.1.5-rc.2** (the full-width curtain and its droplet handle, the jump-to-section-end buttons, cross-session search, keyboard navigation, the questions-only view and the remembered reading position were each exercised in a real browser; the panel scale, a dragged size reaching storage and coming back, and the collapsed handle's position had been measured before that); on **0.1.5-rc.1** the plugin's loading and client-module delivery were tested for real (the host boots without errors, `--dump-config` carries the quick-toc entry, the combined client bundle URL lists `dsh-quick-toc/client.js`, and the bytes it serves contain this release's curtain handle, jump-to-section-end and reading-position markers). The host interfaces it relies on — the `turnOutline` projection, the session-scoped `useProjection`, the client `sessions` service and its `loadThrough` jump loader (since 0.5.0), the `turn-error` node used for failed turns (since 0.5.1), and the host `settings` service (`installSection`), the client `settingsScope` and the `settings.plugin.item` card slot added in 0.6.0, and the client `sessions.search` that 0.7.0's cross-session search calls — were checked one by one against the installed 0.1.5-rc.1 and 0.1.5-rc.2 bundles, whose code is byte-identical between the two releases (`dsh-client-ui-chat` differs by a single CSS declaration unrelated to this plugin, and the package that carries `search`, `dsh-api-session-controller`, is byte-identical down to the same limits: at most 20 hits per search, 240 code points per snippet), so both releases are claimed. Older or newer DSH versions are unverified and therefore not claimed; on an older DSH the newest usable plugin version is **0.3.2**. On install or update, the DSH market pre-flights host compatibility from `engines.dsh`, `dsh.compatibility.dshReleases` and `peerDependencies` in `package.json`.
53
+ `engines.dsh` has a floor of **0.1.5-rc.1** (`>=`): from that release on, the plugin uses the host's session-scoped slot injection. 0.7.1 was tested on **0.1.5-rc.2** (the "back to where I left" floating button, the leave positions the panel and the curtain record separately, the row being read landing at the top when a surface opens, and the absence of the button after closing at the bottom were each confirmed); 0.7.0 was tested on the same release (the full-width curtain and its droplet handle, the jump-to-section-end buttons, cross-session search, keyboard navigation, the questions-only view and the remembered reading position were each exercised in a real browser; the panel scale, a dragged size reaching storage and coming back, and the collapsed handle's position had been measured before that); on **0.1.5-rc.1** the plugin's loading and client-module delivery were tested for real (the host boots without errors, `--dump-config` carries the quick-toc entry, the combined client bundle URL lists `dsh-quick-toc/client.js`, and the bytes it serves contain this release's curtain handle, jump-to-section-end and reading-position markers). The host interfaces it relies on — the `turnOutline` projection, the session-scoped `useProjection`, the client `sessions` service and its `loadThrough` jump loader (since 0.5.0), the `turn-error` node used for failed turns (since 0.5.1), and the host `settings` service (`installSection`), the client `settingsScope` and the `settings.plugin.item` card slot added in 0.6.0, and the client `sessions.search` that 0.7.0's cross-session search calls — were checked one by one against the installed 0.1.5-rc.1 and 0.1.5-rc.2 bundles, whose code is byte-identical between the two releases (`dsh-client-ui-chat` differs by a single CSS declaration unrelated to this plugin, and the package that carries `search`, `dsh-api-session-controller`, is byte-identical down to the same limits: at most 20 hits per search, 240 code points per snippet), so both releases are claimed. Older or newer DSH versions are unverified and therefore not claimed; on an older DSH the newest usable plugin version is **0.3.2**. On install or update, the DSH market pre-flights host compatibility from `engines.dsh`, `dsh.compatibility.dshReleases` and `peerDependencies` in `package.json`.
53
54
 
54
55
  ## Install
55
56
 
@@ -88,6 +89,7 @@ After installing, restart DSH and open the Web UI. The panel starts collapsed: c
88
89
  - **Keyboard**: with the panel open, ↑/↓ move the cursor, Enter jumps, Home / End go to either end and Esc collapses; inside the search box ↑/↓ step through the matches
89
90
  - **Questions only**: the speech-bubble button in the header folds the outline down to each turn's time and the first line of your prompt
90
91
  - **Back to the newest row**: after paging far up, click the floating button in the list's lower-right corner
92
+ - **Back to where I left**: closing the panel or the curtain remembers the row you were looking at; the floating button in the upper-right corner takes you back the next time you open it
91
93
  - **Reading position**: scroll the conversation and the turn you are reading is boxed in blue; the outline follows
92
94
  - **Settings**: expand the "Conversation Outline" card under **Settings → Plugins → Plugin configuration** for the language, the default docked edge, the panel scale (a 50%–200% slider in 5% steps), where the collapsed handle sits (a 0%–100% slider in 1% steps: 0% at the bottom, 100% at the top, 50% centred by default), the heading levels shown, the remembered reading position and the fuzzy / hover / diagnostic switches; changed fields can be reset individually (returning one to its default drops the mark). The card and the panel are live in both directions, with no reload needed, and the preferences follow the DSH settings document
93
95
 
package/README.md CHANGED
@@ -28,6 +28,7 @@
28
28
  - **自动跟随** —— 滚动对话时正在阅读的回合自动点亮(封闭蓝框),大纲自动跟随
29
29
  - **跳转** —— 点击标题跳到对话中该标题的位置,滚动动画交给浏览器自己的平滑滚动(按真实时间推进,60Hz 与 240Hz 屏幕上时长一致);飞行中目标被宿主翻页挪动时会重新瞄准、动画被宿主滚动打断时会重新发起,跨页远跳不会半途停下;若某个浏览器把平滑滚动直接执行成瞬移,插件改为自己逐帧绘制。面板与对话双向定位
30
30
  - **回到底部** —— 往上翻远之后,列表右下角的浮动按钮一步回到最新一条(不在底部时出现、到底后消失)
31
+ - **回到我离开的位置** —— 关闭面板或幕布时记住列表顶部那一行(两者各记各的、互不覆盖),下次打开时列表右上角出现向上的浮动按钮,一步回到那一行的**原位置**;用过一次或自己滚回该处就渐隐并忘掉,直到下次关闭再记。同一规则下,打开面板或幕布时**正在阅读的那一行**会落在列表顶部(读的就在最新几轮时列表已经到底,那一行自然停在底部)
31
32
  - **可停靠、可缩放** —— 拖顶部横条移动,◀ / ▶ 切换左右停靠,拖边缘调宽高(尺寸没有上限,最窄可到 120px),收起后成为边缘把手(停在什么高度由设置里的「把手位置」决定);位置与尺寸按浏览器记住(顶边距、宽度、高度只通过拖拽调整)
32
33
  - **面板缩放** —— 设置里的滑块把**内容**(文字、图标、按钮及其间距)在 50%–200% 之间按 5% 一档缩放,**面板本身的尺寸不变**;拖动滑块时只移动读数,松手才写入设置。面板变窄时顶栏四颗按钮保持一行:先挤掉中间的空白,挤满后整行可横向滚动(在顶栏上滚滚轮即可),此时顶部的灰色拖拽横条渐隐消失
33
34
  - **分页** —— 默认显示最近的若干组,向上滚动既展开索引也加载更早的对话
@@ -40,7 +41,7 @@
40
41
 
41
42
  | 插件版本 | 支持的 DSH 版本 |
42
43
  | --- | --- |
43
- | **0.7.x**(最新,0.7.0) | 0.1.5-rc.1、0.1.5-rc.2 |
44
+ | **0.7.x**(最新,0.7.1) | 0.1.5-rc.1、0.1.5-rc.2 |
44
45
  | 0.6.x(0.6.3) | 0.1.5-rc.1、0.1.5-rc.2 |
45
46
  | 0.5.x(0.5.1) | 0.1.5-rc.1、0.1.5-rc.2 |
46
47
  | 0.4.x(0.4.1) | 0.1.5-rc.1、0.1.5-rc.2 |
@@ -49,7 +50,7 @@
49
50
 
50
51
  每个大版本只列该系列最新的一个补丁版本(新功能引入的缺陷都在其后的补丁里修掉了,所以同一个大版本内直接用最新补丁即可;旧补丁仍可继续用,插件不破坏既有接口)。
51
52
 
52
- `engines.dsh` 下限为 **0.1.5-rc.1**(`>=`,该版本起插件改用会话级槽位注入的宿主接口)。0.7.0 在 **0.1.5-rc.2** 上实测通过(全屏幕布与液滴把手、跳到本节末尾、跨会话检索、键盘导航、只看提问、记住阅读位置都在真实浏览器里逐项跑过;面板缩放、尺寸的落盘与读回、收起把手的位置等既有能力此前已实测);**0.1.5-rc.1** 上实测了插件加载与客户端模块下发(宿主启动无报错、`--dump-config` 里有 quick-toc 条目、客户端组合包 URL 里列出 `dsh-quick-toc/client.js`,取回的下发内容包含本版新增的幕布把手、跳到本节末尾与阅读位置等标记),它依赖的宿主接口——`turnOutline` 投影、会话级槽位的 `useProjection`、客户端 `sessions` 服务与 `loadThrough` 跳转加载器(0.5.0 起)、失败回合所用的 `turn-error` 节点(0.5.1 起)、以及 0.6.0 新增的宿主 `settings` 服务(`installSection`)、客户端 `settingsScope` 与 `settings.plugin.item` 配置卡片槽位、以及 0.7.0 跨会话检索所用的客户端 `sessions.search`——在 0.1.5-rc.1 与 0.1.5-rc.2 的安装包中逐个核对存在(这些宿主包的代码在两版之间逐字节相同,`dsh-client-ui-chat` 仅差一条与本插件无关的 CSS 声明;`search` 所在的 `dsh-api-session-controller` 两版逐字节相同,含「一次最多 20 条、片段上限 240 字符」的同一套上限),因此两版都声明兼容。更早或更新的 DSH 版本未经验证,不作声明;在更早的 DSH 上可安装的最新插件版本是 **0.3.2**。安装或更新时,DSH 市场会依据 `package.json` 中的 `engines.dsh`、`dsh.compatibility.dshReleases` 与 `peerDependencies` 做宿主兼容预检。
53
+ `engines.dsh` 下限为 **0.1.5-rc.1**(`>=`,该版本起插件改用会话级槽位注入的宿主接口)。0.7.1 在 **0.1.5-rc.2** 上实测通过(「回到我离开的位置」浮动按钮、面板与幕布分别记录的离开位置、打开时落在正在阅读的那一行、以及在底部关闭再打开不出按钮都逐项确认);0.7.0 在同一版本上实测通过(全屏幕布与液滴把手、跳到本节末尾、跨会话检索、键盘导航、只看提问、记住阅读位置都在真实浏览器里逐项跑过;面板缩放、尺寸的落盘与读回、收起把手的位置等既有能力此前已实测);**0.1.5-rc.1** 上实测了插件加载与客户端模块下发(宿主启动无报错、`--dump-config` 里有 quick-toc 条目、客户端组合包 URL 里列出 `dsh-quick-toc/client.js`,取回的下发内容包含本版新增的幕布把手、跳到本节末尾与阅读位置等标记),它依赖的宿主接口——`turnOutline` 投影、会话级槽位的 `useProjection`、客户端 `sessions` 服务与 `loadThrough` 跳转加载器(0.5.0 起)、失败回合所用的 `turn-error` 节点(0.5.1 起)、以及 0.6.0 新增的宿主 `settings` 服务(`installSection`)、客户端 `settingsScope` 与 `settings.plugin.item` 配置卡片槽位、以及 0.7.0 跨会话检索所用的客户端 `sessions.search`——在 0.1.5-rc.1 与 0.1.5-rc.2 的安装包中逐个核对存在(这些宿主包的代码在两版之间逐字节相同,`dsh-client-ui-chat` 仅差一条与本插件无关的 CSS 声明;`search` 所在的 `dsh-api-session-controller` 两版逐字节相同,含「一次最多 20 条、片段上限 240 字符」的同一套上限),因此两版都声明兼容。更早或更新的 DSH 版本未经验证,不作声明;在更早的 DSH 上可安装的最新插件版本是 **0.3.2**。安装或更新时,DSH 市场会依据 `package.json` 中的 `engines.dsh`、`dsh.compatibility.dshReleases` 与 `peerDependencies` 做宿主兼容预检。
53
54
 
54
55
  ## 安装
55
56
 
@@ -88,6 +89,7 @@ dsh plugin --profile web add <插件目录路径>
88
89
  - **键盘**:面板打开后 ↑/↓ 移动光标、Enter 跳转、Home / End 到首尾、Esc 收起;搜索框里 ↑/↓ 在命中之间切换
89
90
  - **只看提问**:标题栏的语音气泡按钮把大纲折成每轮的时间 + 你的提问首行
90
91
  - **回到底部**:翻远了之后点列表右下角的浮动按钮回到最新一条
92
+ - **回到我离开的位置**:关掉面板或幕布时它记住你当时看的那一行;下次打开时右上角的浮动按钮一步带你回去
91
93
  - **阅读位置**:滚动对话,正在阅读的回合会以蓝框标出;大纲会自动跟随
92
94
  - **设置**:在 **设置 → 插件 → 插件配置** 里展开「对话大纲」卡片,可改语言、默认停靠边缘、面板缩放(50%–200% 滑块,5% 一档)、收起把手的位置(0%–100% 滑块,1% 一档;0% 在最下、100% 在最上,默认 50% 居中)、显示的标题层级、记住阅读位置与模糊/悬停/诊断开关;改过的字段可单独重置(改回默认值时标记自动消失)。卡片与面板实时同步,不需要刷新;偏好保存在 DSH 的设置里,跟随配置走
93
95