@ryuu-64/dsh-find-all 0.1.6 → 0.1.8

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.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.8
4
+
5
+ - Keep Ctrl+F and the header search button bound to the current main conversation across sidebar focus changes and main-view navigation.
6
+ - Add a return-to-reading-position control that restores a saved passage after navigating search results, with visible feedback when the host cannot restore it.
7
+ - Improve match navigation feedback and align the find bar with the conversation's layout and theme.
8
+ - Reveal retained, collapsed result content through the host's disclosure controls when navigating to a match; explain when it cannot be displayed.
9
+ - Exclude message-action controls from conversation search results.
10
+
11
+ The supported host-version list is unchanged. Returning to a saved passage depends on the host retaining and displaying that content; if restoration fails, the find bar remains available for retry.
12
+
13
+ ## 0.1.7
14
+
15
+ - Use the host-native icon button for the conversation search entry, including theme, hover and keyboard-focus styles.
16
+ - Clarify that search covers loaded conversation content and can continue loading available earlier history; status text no longer implies complete history when the host cannot provide it.
17
+ - Retain the current match during history loading when its identity can still be verified.
18
+
19
+ The runtime code is unchanged from the accepted PR #17 merge (`f945fb9ccd581c808bc7f50128c3a7d7d2fca6da`). The existing 195 checks, release-artifact verification and RC2 Web acceptance passed; the user also confirmed their real-device test passed before this release. The exact supported host-version list is unchanged.
20
+
3
21
  ## 0.1.6
4
22
 
5
23
  Fix text matching, history feedback and search state after the 0.1.5 compatibility release.
package/README.md CHANGED
@@ -13,8 +13,9 @@ DSH 桌面窗口是 Electron 壳,本身没有浏览器那种查找栏。而会
13
13
  ## 功能
14
14
 
15
15
  - **⌘F / Ctrl+F** 唤起查找栏,优先带入有效的选中文字;没有新选词时恢复上次关键词。关键词仅保留在当前插件实例内存中,禁用、刷新或重启后清空
16
- - **范围切换**:`整段`(默认)↔ `本页`,点那个胶囊按钮切换
17
- - **边搜边加载**:整段模式下自动分页加载历史,高亮与计数随加载实时更新
16
+ - **范围切换**:`包含更早内容`(默认)↔ `已加载内容`,点那个胶囊按钮切换
17
+ - **已加载内容**:只搜索当前会话中已经加载到页面的内容,包括滚动区域外的内容;不会继续加载历史,也不会移除先前已经加载的内容
18
+ - **边搜边加载**:“包含更早内容”模式下自动分页加载历史,高亮与计数随加载实时更新
18
19
  - **进度可见**:显示「正在加载更早的历史… 已 3 页」,**点一下这段文字即可停止加载**
19
20
  - **安全上限**:最多加载 400 页(约 2 万条消息);历史不再增长时会自行停止
20
21
  - **导航**:Enter / Shift+Enter 上下一个;⌘G(Ctrl+G)/ F3 下一个,加 Shift 反向;Esc 关闭查找栏并清除高亮
@@ -23,7 +24,7 @@ DSH 桌面窗口是 Electron 壳,本身没有浏览器那种查找栏。而会
23
24
 
24
25
  ## 安装
25
26
 
26
- 先按 **DSH 运行时版本**选择安装入口;它不一定等于 Desktop 产品版本。下面的包名用于安装 npm 已发布版本;验收特定候选包时,请替换为对应 `.tgz` 的绝对路径。
27
+ 先按 **DSH 运行时版本**选择安装入口;它不一定等于 Desktop 产品版本。
27
28
 
28
29
  **运行时 0.2.0-rc.2**:用 Desktop 自带的插件命令安装:
29
30
 
@@ -31,9 +32,9 @@ DSH 桌面窗口是 Electron 壳,本身没有浏览器那种查找栏。而会
31
32
  dsh plugin --profile desktop add @ryuu-64/dsh-find-all
32
33
  ```
33
34
 
34
- **运行时 0.2.0-rc.1 / 0.1.7-rc.2**:这两个官方安装包没有上述新版 CLI 入口,通用 `dsh plugin --profile desktop` 也会拒绝操作。请在 Desktop 中打开「插件 / Plugins」→「添加插件 / Add plugin」,填入 `@ryuu-64/dsh-find-all`(验收候选时填 `.tgz` 绝对路径),点击「安装 / Install」,完成后点击「立即启用 / Enable now」。不要用版本豁免绕过安装错误。
35
+ **运行时 0.2.0-rc.1 / 0.1.7-rc.2**:这两个官方安装包没有上述新版 CLI 入口,通用 `dsh plugin --profile desktop` 也会拒绝操作。请在 Desktop 中打开「插件 / Plugins」→「添加插件 / Add plugin」,填入 `@ryuu-64/dsh-find-all`,点击「安装 / Install」,完成后点击「立即启用 / Enable now」。不要用版本豁免绕过安装错误。
35
36
 
36
- 安装后**完整重启一次 DSH Desktop**,再检查插件是否正常加载。已验证的三个桌面版本支持原生禁用/重新启用;旧宿主的刷新要求见下方兼容表说明。
37
+ 安装后**完整重启一次 DSH Desktop**,再检查插件是否正常加载。
37
38
 
38
39
  装完按 **⌘F / Ctrl+F**,右上角出现查找栏就算装好了。
39
40
 
@@ -54,7 +55,7 @@ dsh plugin --profile desktop remove dsh-find-bar
54
55
  | 打开查找栏 | `⌘F` / `Ctrl+F` |
55
56
  | 下一个 / 上一个命中 | `Enter` / `Shift+Enter` |
56
57
  | 下一个 / 上一个命中(另一套) | `⌘G`(`Ctrl+G`)/ `F3`,加 `Shift` 反向 |
57
- | 切换范围 `整段` ↔ `本页` | 点查找栏上的胶囊按钮 |
58
+ | 切换范围 `包含更早内容` ↔ `已加载内容` | 点查找栏上的胶囊按钮 |
58
59
  | 停止加载更早的历史 | 点「正在加载更早的历史…」那行文字 |
59
60
  | 关闭并清除高亮 | `Esc` |
60
61
 
@@ -63,12 +64,18 @@ dsh plugin --profile desktop remove dsh-find-bar
63
64
  ## 已知限制
64
65
 
65
66
  - 大小写不敏感,没有「区分大小写」开关
66
- - 单次搜索最多记 5000 个命中
67
+ - 单次搜索仅显示前 5000 处匹配
67
68
  - 折叠起来的工具调用和思考块,正文不在页面里,搜不到——先展开再搜
68
- - 整段模式要真的翻历史,所以很长的会话首次搜索需要等几秒
69
+ - “包含更早内容”模式要真的翻历史,所以很长的会话首次搜索需要等几秒
69
70
  - 宿主尚未就绪、公开报错、无进展或到达上限时,保留已找到的结果并提示未完成;再次打开查找或输入关键词可手动重试。停止、关闭、换词或切换会话会取消插件任务,但不会中断宿主已经发出的请求
70
71
  - “已搜索当前可用历史”不保证历史完整。宿主可能在正常末页和不连续页错误时都不再提供更早页;此时重新查找也不保证恢复缺失历史
71
72
 
73
+ ## 支持与交流
74
+
75
+ 发现 Bug、兼容性问题或有功能建议,请先[提交 Issue](https://github.com/Ryuu-64/dsh-find-all/issues),并附上 DSH Desktop、DSH 运行时和插件版本、复现步骤及必要截图;不要公开 API 密钥或私密对话。
76
+
77
+ QQ 交流群:`1129212995`。群聊用于使用交流和社区互助;需要持续跟踪的问题请先提交 Issue,再把 Issue 链接发到群里。群聊不替代 Issue 中可检索的正式记录。
78
+
72
79
  ## 卸载 / 回退
73
80
 
74
81
  运行时 0.2.0-rc.2 可用:
@@ -82,24 +89,6 @@ dsh plugin --profile desktop add dsh-find-bar # 想换回上游那
82
89
 
83
90
  ## 关于这个项目
84
91
 
85
- 本插件 fork 自 [secyborg/dsh-find-bar](https://github.com/secyborg/dsh-find-bar)(作者 secyborg,MIT),在上游的基础上加了「整段会话」搜索。上游原有的查找条界面、高亮、`n/N` 计数和键盘导航都保留了下来。
92
+ 本插件 fork 自 [secyborg/dsh-find-bar](https://github.com/secyborg/dsh-find-bar)(作者 secyborg,MIT),在上游的基础上加了自动加载更早内容的会话搜索。上游原有的查找条界面、高亮、`n/N` 计数和键盘导航都保留了下来。
86
93
 
87
94
  版权与许可为 MIT 双署名:`Copyright (c) 2026 secyborg` 与 `Copyright (c) 2026 Ryuu-64`。上游 README 原样保存在 `README.fork-origin.md`,改动清单与致谢见 `NOTICE.md`。
88
-
89
- ## 兼容性开发说明
90
-
91
- 当前候选改动由会话标题栏中的查找按钮取得明确的会话身份;首次快捷键在只有一个可见会话面板时可直接查找;多会话时先点击或聚焦目标会话。已明确拒绝或失效的目标不会自动改搜其它会话。无法识别可靠的会话正文范围时会提示先选择会话,不退回整页搜索。历史加载失败或中断时保留已显示的部分结果,并说明尚未搜完。
92
-
93
- 右侧嵌入会话暂不支持查找,会提示范围不可用,不会自动改搜主栏;明确选择主会话后仍可查找。
94
-
95
- [2026-10-02 验收记录(代码版本 `69c477c`)](https://github.com/Ryuu-64/dsh-find-all/actions/runs/36998700597)使用同一候选包完成十版 Web 和三个官方 Windows Desktop 的插件功能验收:首次快捷键、80 条结果的分页、会话切换、结果导航及宿主支持的启停行为。当前 rc2 还验证了实际右侧嵌入会话的范围隔离。
96
-
97
- | DSH 运行时版本 | 实际 Web | 官方 Windows Desktop |
98
- | --- | --- | --- |
99
- | 0.1.5-rc.2、0.1.5-rc.3、0.1.6-alpha.2 | 功能验收通过 | 已核官方路径未取得安装包,未验证 |
100
- | 0.1.6-alpha.1、0.1.7-alpha.1、0.1.7-alpha.2、0.1.7-rc.1 | 功能验收通过 | 本轮未验证 |
101
- | 0.1.7-rc.2、0.2.0-rc.1、0.2.0-rc.2 | 功能验收通过 | 插件功能验收通过;宿主错误仍保留 |
102
-
103
- **该次 CI 整体仍为失败**:三个桌面版本均记录到宿主启动时的 `startupData/preloadScripts` 错误及退出时的连接错误,未装插件的基线也存在同类错误。没有忽略这些错误,也不把插件功能通过写成宿主整体无错误。Web 通过不代表对应 Desktop 已验证,未知未来版本不作承诺。详见 [兼容性验收方法与边界](docs/compatibility.md);最终交付状态以 [PR #9](https://github.com/Ryuu-64/dsh-find-all/pull/9) 的独立审核为准。
104
-
105
- 旧宿主 0.1.5-rc.2 / rc.3 / 0.1.6-alpha.1 本身不支持插件图变更的热卸载:禁用或重新启用后须刷新页面或重启应用。其余七个已验 Web 运行时和上述三个已验 Desktop 均通过了两次原生禁用/重新启用测试;未验证的 Desktop 不据此推定通过。
@@ -4,7 +4,7 @@ This implementation follows the approved [Issue #1 plan](https://github.com/Ryuu
4
4
 
5
5
  ## Contract research
6
6
 
7
- The adapter uses a `conversation.session.header.utilities` list entry. Its `sessionId` comes from the session standard props; it never consults the old global `sessions.list.current` field. A mounted button identifies one view instance, not just one session. Keyboard focus or a click inside a visible view selects that instance. An ambiguous multi-view selection fails closed with a prompt to select a conversation. Focus in the find bar preserves the selected instance. On the first shortcut, neutral body focus may discover one registered view only when all visible registered instances and known conversation content/scroll/flow containers identify that same single instance. Visible unsupported or embedded views also make discovery ambiguous; the main panel and its own content are deduplicated. Explicit rejection, ambiguity, or loss of an earlier selection blocks that discovery; passive checks never select a replacement.
7
+ The adapter uses a `conversation.session.header.utilities` list entry. Its `sessionId` comes from the session standard props; it never consults the old global `sessions.list.current` field. Ctrl+F and the main header button search the current window's central main conversation. The registered header's actual button identifies that main frame and its view instance. A headerless sidebar, background session, unrelated control, or nested process flow does not become another search target merely because it is visible or receives focus. Body-focused Ctrl+F works without a preparatory click when one registered main frame is visible. If a host presents multiple registered main frames, a specific registered header/frame context is still required; ambiguous identity fails closed. Focus in the find bar, sidebar interaction, and sidebar closure preserve the main target.
8
8
 
9
9
  Official release-tag sources inspected:
10
10
 
@@ -14,11 +14,11 @@ Official release-tag sources inspected:
14
14
  - [`0.1.7-rc.2` content](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.7-rc.2/packages/client/ui-conversation/src/client/skeleton/ConversationContent.tsx), [`0.2.0-rc.1` content](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.1/packages/client/ui-conversation/src/client/skeleton/ConversationContent.tsx), and [`0.2.0-rc.2` content](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/packages/client/ui-conversation/src/client/skeleton/ConversationContent.tsx): explicit content session identity is additionally checked
15
15
  - [`0.2.0-rc.2` slot registry](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/packages/client/ui-renderer/src/client/registry.ts): slot injection and registration are context-owned effects
16
16
 
17
- The official [startup fixture](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/apps/web/tests/startup-auto-selection.e2e.ts) explicitly distinguishes the resident conversation root from the composer's unrelated `data-phase`. Routing skips that editor attribute. Initial focus in an unbound Hero/settling composer before any visible registered session exists keeps the never-selected state; a rejected active conversation or lost selection still cannot trigger discovery of another view.
17
+ The official [startup fixture](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/apps/web/tests/startup-auto-selection.e2e.ts) explicitly distinguishes the resident conversation root from the composer's unrelated `data-phase`. Routing skips that editor attribute. Unregistered Hero/settling and sidebar interactions do not leave a permanent rejection state. A visible modal dialog or an editor with its own find UI keeps ownership of its keyboard shortcuts.
18
18
 
19
- DOM attributes are implementation details, not a promised future host API. `resolveScope` is their single adapter boundary. It requires an active, connected, visible panel, exactly one registered session anchor, one scrollport, and one visible `data-chat-flow`. If explicit host session metadata exists, it must match. Search and mutation observation stay inside that flow. A missing/ambiguous/hidden/replaced flow yields no results or paging. There is no `document.body` or `window.find` fallback.
19
+ DOM attributes are implementation details, not a promised future host API. `resolveScope` is their single adapter boundary. It requires an active, connected, visible panel, exactly one registered session anchor, one scrollport, and one visible `data-chat-flow`. If explicit host session metadata exists, it must match. Search and mutation observation stay inside that flow. Identified nested process flows remain part of the outer main conversation; unrelated or ambiguous flows fail closed. Missing or hidden Chat content yields an explicit unavailable/no-searchable-content status, no results, and no paging. It never substitutes sidebar or whole-page text. There is no `document.body` or `window.find` fallback.
20
20
 
21
- `ctx.effect` owns global key/focus/pointer listeners and teardown. React effect cleanup removes each session anchor. Close/dispose cancels debounce, paging-start, paging-settle, session polling, observation, and highlights. An in-flight host request cannot be aborted through this API; its generation token prevents stale results from being painted or another page being requested.
21
+ `ctx.effect` owns global key/focus/pointer listeners and teardown. React effect cleanup removes each session anchor. Close/dispose cancels debounce, paging-start, paging-settle, session polling, observation, and highlights. An in-flight host request cannot be aborted through this API; its generation token prevents stale results from being painted or another page being requested. A real main-frame/session switch clears old highlights and the return origin, cancels plugin paging/navigation/recovery, and rebinds the new main. Identity includes the registered instance and public Node-store generation, not just a session ID; a new store for the same session and DOM invalidates the old work. A surviving frame whose header disappears remains unavailable rather than selecting an unrelated registered frame.
22
22
 
23
23
  Paging errors/stalls and manual stop retain rendered matches and explicitly label them incomplete. Existing matching and query behavior have not been redesigned.
24
24
 
@@ -63,6 +63,38 @@ The runner preserves its real `USERPROFILE`; DSH state and Electron `--user-data
63
63
 
64
64
  ## Simultaneous embedded sidebar boundary
65
65
 
66
- The official rc2 [SidebarChatTab](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/packages/client/ui-subagent/src/client/sidebar-chat/index.tsx) renders an embedded ConversationContent with `data-conversation-content`, `data-conversation-session` and `data-content-phase`, without the main panel's `data-phase` or a session header utility. This unsupported view must block neutral fallback to another conversation; explicit interaction with it remains rejected after it disappears. Fixtures cover visible registered Hero/settling/unknown phases, hidden utilities and headerless sidebars.
66
+ The official rc2 [SidebarChatTab](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/packages/client/ui-subagent/src/client/sidebar-chat/index.tsx) renders an embedded ConversationContent with `data-conversation-content`, `data-conversation-session` and `data-content-phase`, without the main panel's `data-phase` or a session header utility. This embedded view is excluded from main-frame selection and search. Opening, focusing, clicking, or closing it preserves the central main target. Its text cannot enter the results, and a sidebar without any main Chat body reports unavailable. Fixtures retain strict checks for multiple registered main identities, Hero/settling/unknown main phases, hidden utilities, and mismatched content metadata.
67
67
 
68
- The current rc2 real-host case authors a completed one-shot child with the official persisted header/descriptor/catalog pattern from [subagent-conversation.e2e.ts](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/apps/web/tests/subagent-conversation.e2e.ts), opens the host's actual right-sidebar control, and natively re-enables the plugin with both views visible. It requires neutral Ctrl+F to reject ambiguity, an explicit main choice to remain scoped, and unsupported sidebar interaction to reject main-session search. No model is called and no second DOM pane is fabricated. The CI result for each artifact determines whether this case passed.
68
+ The current rc2 real-host case authors a completed one-shot child with the official persisted header/descriptor/catalog pattern from [subagent-conversation.e2e.ts](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/apps/web/tests/subagent-conversation.e2e.ts), opens the host's actual right-sidebar control, and natively re-enables the plugin with both views visible. It requires neutral Ctrl+F and the main header button to search main A with both views open, sidebar interaction and closure to preserve that target, and a sidebar-only query to produce no main results. No model is called and no second DOM pane is fabricated. The CI result for each artifact determines whether this case passed.
69
+
70
+ ## Return to reading position (development)
71
+
72
+ The Issue #15 implementation is a draft. Unit geometry fixtures cover state transitions, not real Web or Electron acceptance. The separate `Return reading position RC2` workflow installs one candidate artifact into the official exact `0.2.0-rc.2` Web runtime and records semantic identities, text positions, measured geometry, native input, and screenshots. Its result must be inspected; defining a workflow is not a pass. Older supported hosts and Electron remain unverified for this new feature. The npm version and existing release artifact are unchanged.
73
+
74
+ A closed-to-open transition captures one origin before the input receives focus. The origin belongs to the exact header instance, session, root, public Node store, and SessionFace. It records the exact `data-chat-anchor-key` part, original Node key, sequence, a text offset inside that part, and the visible text's viewport offset. Text is re-resolved inside that same semantic part after re-rendering. An ambiguous edited passage fails; identical text in another message cannot substitute. Native group-body scrolling is measured separately. The origin is not persisted to web storage.
75
+
76
+ The public `useChat` session-standard hook supplies the stable Node store ([rc2 slots](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/packages/client/ui-chat/src/client/contract/slots.ts), [Node store](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/packages/client/ui-chat/src/client/contract/snapshot.ts)). Its `get` includes loaded hidden Nodes. A loaded Node with no visible DOM waits for rendering or uses its actual host disclosure controls; it does not trigger history paging. Missing data may request bounded older pages through the existing deduplicated `SessionFace.loadOlder` path. The public snapshot does not expose the actual history-window lower bound, so absence alone does not prove deletion. A cancelled plugin recovery cannot abort an already-started host request and retains its deduplication record until settlement.
77
+
78
+ The DOM attributes are version-specific implementation details, not a newly promised SDK. The [rc2 Node seat](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/packages/client/ui-chat/src/client/chat/ChatNodeSeat.tsx) assigns distinct anchor keys to the parts of one Node. The [group seat](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/packages/client/ui-chat/src/client/chat/ChatGroupSeat.tsx) retains hidden content and nests a process-body flow. The adapter allows those identified nested process flows inside one outer flow; unrelated or ambiguous flows still fail closed. Embedded sidebars remain excluded from that main-conversation scope.
79
+
80
+ A return makes one immediate landing and then verifies the same text is actually visible after host scroll sampling. It does not claim success from a scroll call. During unchanged layout it also verifies the restored offset; layout changes prioritize the original text remaining visible. Success closes the bar, removes highlights and the origin, restores an appropriate surviving focus without scrolling, and announces completion. Recoverable failure leaves the bar and origin available for retry. Close, session/view change, new result navigation, reader input, and disposal cancel recovery; every wait and actual scroll rechecks identity.
81
+
82
+ One rc2 host limitation requires real-runtime evidence: [ChatNavigation.loadEarlier](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/packages/client/ui-chat/src/client/chat/use-chat-navigation.ts) retains a paging anchor, and [ChatViewport](https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.2.0-rc.2/packages/client/ui-chat/src/client/chat/use-chat-viewport.ts) may reapply it after external scrolling. `chatScroll` is only a Chat-injected read/save store, not a plugin live capture/restore API. This plugin neither imports private Chat controllers, synthesizes reader events, repeatedly fights the host's scrolling, nor replaces Chat. Native Load earlier followed by pointer/Enter/Space return and later stream/layout growth are explicit acceptance cases. A host path that pulls the view away must report failure and keep Issue #15 open.
83
+
84
+ ### RC2 Web evidence (2026-10-04)
85
+
86
+ [Run 37183990650](https://github.com/Ryuu-64/dsh-find-all/actions/runs/37183990650), commit `b0dc12e`, installed the exact official RC2 runtime and one candidate artifact. Ordinary pointer, Enter, and Space return cases passed: the same semantic Node/part, paragraph, and text offset returned from a long response with Range top `4px` before and after. These were real trusted browser inputs. A `1400→1120` viewport change did not change the fixed-width text column, so this run does not establish text-reflow acceptance.
87
+
88
+ The three cases after the host's own **Load earlier** completed all failed. The rendered Node count grew from `100` to `200` before the return command; the original passage moved from top `4px` to `7589px` instead of being restored. Each real return input originated outside the scrollport, and the host reapplied its retained paging anchor. The plugin kept the find bar open and reported the failed landing. The workflow remains failed; these cases are not waived or marked complete.
89
+
90
+ [Run 37185149672](https://github.com/Ryuu-64/dsh-find-all/actions/runs/37185149672), commit `8d65ce6`, additionally passed actual responsive text reflow: the viewport changed from `1400px` to `560px`, the original paragraph's height changed from `96px` to `144px`, and its Range top remained `4px` after returning to the same Node, text offset, and paragraph. The `700px` intermediate width did not reflow that paragraph and was not counted as reflow evidence.
91
+
92
+ The same run passed real streaming through the official replay provider, agent, and SSE. Search began while the host followed the tail; another `1140` characters arrived during search without pulling the reader back. After a live paragraph reflowed from `24px` to `48px`, return restored the same Node, text offset, and paragraph at `7px`. Further stream growth kept that position and increased the distance from the tail from `2624px` to `3456px`; the stream then completed.
93
+
94
+ All three native Load earlier cases still failed on their first return attempt. The fixture retained those failures, then separately sent a real reader wheel movement and retried the same return button. Pointer, Enter, and Space retries all recovered the saved semantic passage with `0px` offset error. A real reader scroll can therefore release this host state before retrying; it does not make the original automatic return pass. The workflow remains red, and no synthetic reader event or repeated scroll-write loop was added to the plugin. Electron, the other admitted Web runtime versions, and the full real-runtime failure/accessibility matrix remain unverified for this feature.
95
+
96
+ The earlier failures establish a limit in the original adapter, not proof that the host must change. A plugin-only route is now being tested: wait for public history loading and Chat's rendered history control to settle, activate a scoped **loaded** Turn navigation button through its normal click handler, then locate and verify the original text. The official RC2 handler cancels prior paging/navigation before landing. This uses existing UI behavior, not a new SDK call, private-controller import, synthetic reader event, or replacement Chat. Whether it satisfies the remaining acceptance cases is decided by exact-host tests; an upstream change is not currently assumed necessary.
97
+
98
+ [Run 37190287282](https://github.com/Ryuu-64/dsh-find-all/actions/runs/37190287282), commit `bdd1524`, passed 11 of the 12 existing RC2 scenarios, including all three native paging returns, two repeated paging cycles, reflow, streaming, and wheel/query/Escape cancellation of pending returns. Multiwindow search failed before the second return could be exercised. The explicit-context runner correction preserved every scenario and assertion.
99
+
100
+ [Diagnostic run 37207453256](https://github.com/Ryuu-64/dsh-find-all/actions/runs/37207453256), commit `459f468`, records the second window's focus sequence: its restored conversation composer receives focus; session-search controls then receive pointer/focus input outside that conversation; immediately before Ctrl+F the active element is `BODY`, while one visible registered header and one Chat flow still identify the same session. That revision cleared prior selection on outside interaction and forbade neutral body rediscovery after rejection. Its wheel-based selection change was an intermediate attempt, not the current search-target contract. The current correction keeps the central registered main frame through outside/sidebar interaction, supports body Ctrl+F directly, and invalidates old work on an actual frame or store-generation change. Strict scope and instance checks remain. The updated unit fixtures and real-host sidebar expectations do not themselves establish Web or Desktop acceptance; the unchanged multiwindow return scenario and the updated sidebar cases must run against the corrected artifact before acceptance can be claimed.