# dsh-question-index [English](README.md) | 中文 DeepSeek Harness(dsh web GUI)的**问题索引侧栏**插件:在当前会话的标题栏右侧添加一个「问题 · N」按钮,点击展开一个悬浮面板,按顺序列出当前对话里的所有用户提问(序号 + 预览 + 提问时间),点击任意条目即平滑滚动到对应的用户消息并短暂高亮。 ## 功能 - 只统计当前会话的用户消息(含中途引导 steering 消息,带「引导」标签),按消息顺序编号 - 面板顶部显示问题总数;每条一行:序号 + 问题预览 + 提问时间,完整问题放在悬停提示里 - 图片/附件消息显示为「[图片 · 文件名]」,不再是无法辨认的占位文本 - 内置搜索框实时过滤问题(保留原始序号),按 Enter 直接跳转第一个匹配项 - 点击条目跳转并高亮目标消息;目标消息在已加载窗口之外时自动翻页加载更早历史 - 面板打开时滚动对话会同步高亮当前可视区对应的问题条目 - 面板锚定在「问题」按钮正下方(右缘对齐),窗口缩放时自动跟随 - 新消息实时追加到列表;列表停在底部时自动跟随 - 切换会话时列表自动切换(条目是会话作用域的) - 不修改任何对话内容;面板可通过标题栏按钮、✕ 或 Esc 收起 - 中英文界面跟随 GUI 语言 ## 安装 ```sh dsh plugin --profile web add /Users/zzy/code/deepseek-harsees/test/dsh-question-index ``` 然后重启 DeepSeek Harness Desktop(或刷新 GUI 页面)。安装后可核对: - `~/.dsh/profiles/web/package.json` 的 `dependencies` 和 `dsh.profile.bundles` 里都出现了 `dsh-question-index`; - GUI 的设置 → 插件清单里 `ui-question-index` 处于 active。 ## 卸载 ```sh dsh plugin --profile web remove dsh-question-index ``` ## 实现说明 - 挂载点:ui-conversation 声明的会话作用域列表 slot `conversation.session.header.utilities`;面板本体经 `createPortal` 挂到 `document.body`(fixed 定位,不占用布局)。 - 数据源:会话标准工具包 `useSession` 快照的 `chat.order`(有序节点 key)+ `chat.nodes`(keyed store),过滤 `kind === "user" | "steering"`。注意不要用快照顶层的 `nodes` 字段——那是 legacy 兼容投影,装的是剥掉外壳的 data 对象,没有跳转所需的 key。 - 跳转:聊天行 DOM 带有 `data-chat-anchor-key=""`,滚动容器为 `[data-conversation-scroll]`;未加载的历史经 `ctx.sessions.binding(sessionId).session.loadOlder()` 翻页。 - 已知限制:`data-chat-anchor-key` 是 ui-conversation 的内部 DOM 契约,跨版本不承诺稳定;若失效,跳转会退化为面板内的提示条,列表功能不受影响。