前言¶
DeepSeek Harness (DSH) 的 Web GUI 是一个基于插件的动态环境。用户在操作时,经常需要在会话、面板、插件或任务看板之间切换。由于这些视图是动态渲染的,浏览器地址栏无法直接反映当前屏幕上的内容,导致用户无法复制链接分享当前状态,也无法通过 URL 回溯历史操作。
dsh-url-router 是一个 DSH Web GUI 插件,它解决了这个问题。它作为地址栏的唯一写者,通过修改 URL 的 fragment(即 # 后的部分)来映射当前界面,使得每个界面都有独立的可寻址链接。
安装与启用¶
安装命令如下:
dsh plugin --profile web add dsh-url-router
安装完成后,需要重启 dsh web 服务,并在浏览器中执行硬刷新(Ctrl+Shift+R 或 Cmd+Shift+R)以加载新插件。
核心功能¶
该插件主要具备以下特性:
- 地址栏路由:地址栏的 fragment 时刻反映当前屏幕内容。
- 独立链接:每个界面(会话、面板、插件等)都有唯一的 URL 片段。
- 仅修改 Fragment:插件只修改 URL 的
#部分,不会改写路径(Path)或查询串(Query String)。这意味着启动时的?token=…等参数会被保留。 - 不污染历史记录:使用
replaceStateAPI,在浏览器中导航面板时不会往历史栈里塞记录,用户无法通过浏览器的“后退”按钮回到面板打开前的状态。 - 零依赖:无额外的宿主路由或遥测依赖,纯浏览器端运行。
- 整行即真链接:侧栏的会话行、插件面板的列表行等,整行都是透明的真锚点。用户可以右键调用浏览器原生菜单(如“在新标签页中打开”),也可以中键或 Ctrl+单击在新标签页打开。
支持的路由范围¶
插件支持以下主要类型的路由:
- 会话:
#/session/<id>,对应主视图中的某个会话。 - 主面板:
#/panel/<panelId>,对应主面板(如 plugins、task-board 等)。 - 插件页面与组件:
#/panel/plugins/<包名>/<组件 id>,对应插件内部的具体组件页。 - 任务看板:
#/panel/task-board/task/<任务 id>,对应任务看板中的某个任务详情。 - 设置面板:
#/settings、#/settings/<分区>、#/settings/<分区>/<页签>。
注意事项与限制¶
- 互斥性:一个 URL fragment 只能有一个写者。本插件与其它写 fragment 的插件(例如
dsh-session-url)互斥,同时启用会导致两者互相覆盖。 - 视图虚拟化:DSH 的视图是虚拟化的,只有渲染在屏幕上的行才会被识别。未渲染出来的行无法通过链接跳转,粘贴链接也无法“假装”跳转到未渲染的行。
- 设置分区 ID 不稳定:设置面板的分区没有稳定的 ID。插件通过读取 DOM 中的
aria-current="true"来识别当前分区,因此如果官方修改了显示文案,旧的分区链接可能会失效,但用户重新点击后会自动生成新链接。 - 工作区名仅用于显示:链接中的工作区名主要用于显示,决定打开哪个会话的依然是会话 ID。
总结¶
dsh-url-router 为 DSH Web GUI 带来了可寻址性。它不依赖复杂的路由机制,仅通过修改 Fragment 实现了界面状态与 URL 的绑定。对于需要频繁分享链接、回溯会话或进行自动化脚本操作的用户来说,这是一个必要的工具。