READMESource: main@e6d2056f
@known-mouse/dsh-history-question-nav
一个 DeepSeek Harness Web 客户端插件:在窗口右侧列出当前会话里你问过的每一个问题,点击任意一条即可平滑滚动定位到对话中对应的位置(问题气泡会短暂高亮)。
- 右侧常驻「问题 / Questions」面板,按对话顺序列出当前会话的所有用户问题。
- 点击某条问题 → 会话滚动到该问题所在位置并短暂高亮。
- 面板可收起为右上角「问题」小按钮。
- 跟随当前会话:切换会话时列表自动换成那个会话的问题。
- 中英双语:注册了
question-navlocale 命名空间(zh/en),随 DSH 的语言设置自动切换。

目录结构
dsh-history-question-nav/
├── package.json # dsh.bundle.patch + dsh.client.platform = "web"
├── cordis.patch.yml # profile 补丁层:insert 本插件行
├── lib/
│ ├── index.js # host 半边(故意为空)
│ ├── client.js # 浏览器半边(window.__ModuleLoader__.load 打包格式)
│ └── types/ # 最小 d.ts 声明
└── README.md
客户端半边只依赖外壳已提供的 react(无需任何 dsh.client.external),通过
ctx.slots.inject("shell.overlay", ...) 注册到布局的框架级悬浮层,用
ctx.sessions.binding(currentId) 读取当前会话的 conversation 快照;文案经
ctx.locale.register("question-nav", { zh, en }) 注册并在组件里走 t 座位。
安装
dsh plugin --profile web add @known-mouse/dsh-history-question-nav
dsh plugin 会:① pnpm add 安装依赖;② 检测到本包声明了 dsh.bundle,
自动把它加进 profile 的 bundles 层,于是 cordis.patch.yml 的 insert 行自动生效。
最后重启 Web 服务并刷新页面:
dsh web
需要本机已安装 pnpm(
dsh plugin通过它管理依赖)。
手动安装(不依赖 dsh plugin)
- 把本目录放到 profile 的
node_modules下,并把@known-mouse/dsh-history-question-nav加进 profilepackage.json的dependencies。 - 把
cordis.patch.yml的内容合并进 profile 的cordis.patch.yml,或者直接把@known-mouse/dsh-history-question-nav加进dsh.profile.bundles。 - 重启
dsh web并刷新页面。
原理要点
shell.overlay是ui-layout声明的框架级悬浮层(additive list,root scope), 本插件把面板注册进去,pointer-events:auto让面板可交互,其余保持 click-through。- 当前会话 id 来自全局标准钩子
useSessions(s => s.current);会话的 conversation 快照通过注入的ctx.sessions用binding(id).session取得,并用useSyncExternalStore订阅。 - 问题列表来自
ConversationSnapshot.chat(order+nodes.get(key)),过滤kind === "user";每个 chat 节点在 DOM 上带有data-chat-anchor-key,点击时按 该 key 找到元素,再对[data-conversation-scroll]滚动容器做平滑滚动。
No comments yet. Be the first to write one.