用 dsh-session-deeplink 给 DSH 会话加上可分享的 URL

前言

DeepSeek Harness(dsh)的 Web 界面默认跑在本机,会话列表在侧栏里。打开某一个对话之后,浏览器地址栏通常还是根路径。刷新页面、再开一个标签,或把当前地址发给同事,对方并不能直接落到同一条会话上,只能自己再点一遍侧栏。

社区插件 dsh-session-deeplink 做的事情很窄:把当前会话 ID 写进 URL 的 ?session= 参数,打开这条链接时再按参数切回去。它是 Web 客户端插件,不往 host 进程里挂服务。

本文按社区目录页、GitHub 仓库 README、客户端源码和 npm 包页交叉核对后整理。社区插件目录 deepseek-harness-plugin.com 是独立站点,和 DeepSeek / 幻方没有官方从属关系。DeepSeek Harness 本身的核心理念是「一切皆插件」,插件由社区各自发布。

这是什么

dsh-session-deeplink 是一款面向 DeepSeek Harness Web 客户端的会话深链接插件,由 R3alloc 维护,许可证 MIT。目录页把它归在「会话与消息」分类。截至 2026-08-18,GitHub 仓库 R3alloc/dsh-session-deeplink 星标为 6,npm 上的版本是 0.1.1

它解决的问题是:让本机(或同一套会话列表)里的会话可以被 URL 直接寻址。README 写得很明确——只要该会话仍存在于 DSH 会话列表中,打开这条 URL 就会恢复到同一会话。它不是把对话内容发到公网的云分享,也不是跨机器自动同步会话存储。

仓库把插件拆成两半:

  • Node 入口 src/index.tsapply 为空,不注入、不提供任何 host 服务,只为了让 Loader 能挂上这一行,并扫描到 dsh.client 声明。
  • 浏览器端 src/client/index.ts:真正干活的部分。package.jsondsh.client.platformweb,并声明注入 @deepseek-ai/dsh-client-runtime

核心功能

根据 README 和客户端源码,能力可以概括成下面四点。

?session= 打开指定会话

查询参数名固定为 session。地址形如:

http://127.0.0.1:3080/?session=session-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

3080 是 DeepSeek Harness Web UI 的默认端口,也是 README 里的示例。插件在会话列表进入 ready 之后读这个参数:目标 ID 在 sessions.list 里存在、且当前会话不是它,就调用 ctx.sessions.open(target)。只处理一次初始参数,之后不再根据 URL 反复打开。

目标不存在时,源码会打一条 console.warn,不会去 open。仓库测试覆盖了这种情况:地址栏改回当前有效会话,侧栏选择保持不变。

切换会话时同步地址栏

初始深链接处理完之后,插件订阅 sessions.list。当前会话变化时,用 history.replaceStatesession 参数改成新的 ID。用 replace 而不是 push,所以切换会话不会在浏览器历史里堆一串几乎相同的页面。

保留其他查询参数和 fragment

同步时只改 session 这一个键,pathname、其余 query、hash 都留下。仓库测试覆盖了这种情况:页面原来是 /?mode=test#conversation,切换会话后变成带上 session=,同时 mode=test#conversation 仍在。

没有当前会话时,会删掉 session 参数,而不是留下一个空值。

只跑在浏览器里

README 和 Node 入口注释都写了:不添加任何 host 服务。cordis.patch.yml 只是把 id 为 session-deeplink 的插件插进 profile 的 layer 栈,好让客户端半边进入浏览器 roster。

安装与启用

目录页给出的安装命令原文是:

dsh plugin add github:R3alloc/dsh-session-deeplink

仓库 README 则要求装进 web profile,因为这是 Web 客户端插件。作者给出的两种写法如下。

从 npm 安装(README 建议日常用这条,包里已经带好客户端 bundle,安装时不必再跑构建):

dsh plugin --profile web add dsh-session-deeplink

从 GitHub 安装:

dsh plugin --profile web add github:R3alloc/dsh-session-deeplink

Git 依赖会走包内的 prepare 脚本在本机构建。README 说明:pnpm 10 及以上可能要先在对应 profile 的 pnpm-workspace.yaml 里授权构建,再重新执行安装:

allowBuilds:
  dsh-session-deeplink: true

如需可复现安装,目录页建议固定 commit 哈希。本文核对仓库 main 时,最新提交为 f6250b6c5ec6bcc8a6f715b59d034664f409281e(2026-08-14),可以写成:

dsh plugin --profile web add github:R3alloc/dsh-session-deeplink#f6250b6c5ec6bcc8a6f715b59d034664f409281e

目录页和 README 都提醒:插件以当前 dsh 进程的权限运行,安装时可能执行代码。安装前请检查源代码仓库和许可证。

装完后重启 dsh web

典型用法

  1. 启动 Web UI(官方仓库默认地址是 http://127.0.0.1:3080),打开任意已有会话。
  2. 地址栏应变为带 ?session= 的 URL。把这条链接收藏、复制到另一个标签页,或发给使用同一套会话列表的人。
  3. 用这条 URL 重新打开页面时,只要该会话还在列表里,界面会切到对应会话,不用再点侧栏。
  4. 之后在侧栏切换会话,地址栏里的 ID 会跟着变;刷新页面应仍落在当前这条会话上。

不需要额外配置项。源码里没有可调的选项对象,查询键名写死为 session

适用场景与注意事项

适合这些情况:

  • 本机同时开多个标签,每个标签钉住不同会话
  • 把正在进行的对话做成书签,隔天用同一条 URL 回来
  • 团队共用同一套 DSH 会话存储时,用链接指向某一条对话

使用前需要注意:

  1. 能力边界。链接能打开的前提是目标会话已经在当前 DSH 会话列表里。对方没有这条会话,打开链接不会凭空把对话内容拉过去。插件也不负责复制上下文、注册自定义协议。
  2. 只作用于 Webpackage.json 声明 dsh.client.platformweb。装到非 web profile 上,浏览器端逻辑不会生效。
  3. 版本。README 写明当前版本基于 DeepSeek Harness 0.1.0-rc.6 开发。Harness 仍处于开发者预览,后续版本可能要同步更新插件。
  4. 安全。插件以当前 dsh 进程权限运行。从 GitHub 安装还会在本机执行 prepare 构建。装之前应阅读 src/client/index.tssrc/index.ts 和 MIT 许可证。日常安装优先用 npm 包,避免安装阶段跑构建脚本。
  5. 失效行为。会话被删或 ID 写错时,插件只打警告,不会抛错中断界面;地址栏会同步成当前仍有效的会话。

小结

dsh-session-deeplink 把 DSH Web 会话变成地址栏里的一条查询参数:能打开、能同步、能保留其余 URL 片段,而且不往 host 侧加服务。功能面很小,但对「刷新丢会话、链接点不回去」这类日常摩擦是对症的。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-session-deeplink/

GitHub:https://github.com/R3alloc/dsh-session-deeplink

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜