dsh-session-link
复制、打开 `dsh://` 会话深链,或将其粘贴到另一对话中,注入被引用会话的受限只读快照。
安装
dsh plugin --profile web add dsh-session-link
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-session-link
  · English · 中文
DeepSeek Harness 的 Codex 式会话深度链接插件
复制任意会话的链接,粘贴到另一个对话里 —— 被引用会话的上下文会被快照,并作为受控的只读背景上下文注入到你的提示词之前;同一链接也能在浏览器中直接打开对应会话。
一键安装
# 一条命令装完:安装包 + 自动加入 profile 的 bundle 层 + 自动应用配置行 dsh plugin --profile web add dsh-session-link # 重启 Web GUI 并刷新页面 dsh web
无需手动修改任何 yml —— 插件自带 dsh.bundle patch(cordis.patch.yml),dsh plugin add 检测到后会自动把它加进 dsh.profile.bundles,启动时自动组合 session-link 行配置。上游的 session-reference 服务自 dsh 0.1.0-rc.8 起由官方 web bundle 自行组合,插件不再重复插入(重复 id 会导致启动失败)。
通用 npm 安装(只装包、不进 profile):npm install dsh-session-link
手动安装方式(不依赖 bundle 机制):见[快速开始](#快速开始)。
┌─ 会话 A ─────────────────┐ ┌─ 会话 B ─────────────────────────┐
│ 🔗 复制会话链接 │ │ 用户: 请参考这个会话: │
│ → dsh://session/session-│ ─────▶ │ dsh://session/session-… │
│ …abc │ 粘贴 │ │
└───────────────────────────┘ │ 模型: (收到 A 的快照 │
│ + 提示词,链接变 @label) │
└──────────────────────────────────┘
特性
- 🔗 一键复制 —— 会话头部「复制会话链接」按钮,输出
dsh://session/<会话ID>(codex:// / claude:// 同款格式) - 📖 跨对话读上下文 —— 把链接粘进任意对话,源会话内容被快照(有上限、只读)并注入到你的提示词之前
- 🖱️ 可点击深链(Windows) —— 注册
dsh协议处理器后,点击dsh://链接直接打开 Web GUI 并选中该会话 - 🛡️ 容错 —— 畸形链接、会话不可读、自引用都不会打断对话:链接保留为原文,失败记录在服务端日志
工作原理
本插件复用官方 @deepseek-ai/dsh-session-reference 服务(它已实现规范 URI、mention 解析、快照投影与字节预算保留),再把它接入 agent 循环和 Web 界面:
- 服务端(
lib/index.js) —— cordis 插件,挂在agent/pre-step钩子上:用户消息里出现会话深链时,把各种链接形式统一成规范dsh-session:mention,解析为结构化引用,通过sessionReferenceResolver.prepare()快照源会话,并把聚合的只读快照放在直接提示之前。钩子与传输层无关,TUI 里粘贴规范 URI 同样生效。自 dsh 0.1.0-rc.8 起,上游服务自身也会在agent/pre-step上处理规范 URI;插件监听器以prepend跑在最外层,只处理上游不认识的深链形式(dsh://、web 链接),同一条链接不会被注入两次。 - 浏览器端(
lib/client.js) —— 静态客户端包(dsh.client声明),在conversation.session.header.actions渲染复制按钮,并在以/?session=<会话ID>(或旧的/s/<会话ID>、哈希形式#/s/<会话ID>)打开页面时,等会话目录加载后经ctx.uiWorkspace.openSession()选中目标会话(约 10 秒有界重试,最终失败时告警)。
链接格式
形式 · 示例 · 用途
深链 · dsh://session/<会话ID> · 按钮复制;协议处理器可点击;粘贴可解析
浏览器地址 · http://<主机>:3080/?session=<会话ID> · 协议处理器打开的目标;粘贴同样识别
旧式浏览器地址 · http://<主机>:3080/s/<会话ID> · 服务端 302 到上面的形式;粘贴同样识别
规范 URI · dsh-session:<base64url(JSON 会话ID)> · dsh-session-reference 的无损 URI;粘贴可解析
Markdown mention · @[标签](dsh-session:…) · 解析后显示为 @标签(TUI mention 形式)
只有带 session-… 形态会话 ID 的链接才会被当作引用,无关的 dsh://…、/s/… 文本不会被误伤。
为什么浏览器地址换成了?session=:自 dsh 0.1.1-rc.2 起 Web 服务器只把/(及配置的 index)当入口,未知路径(含/s/<ID>)一律 404 —— 旧的 SPA fallback 被移除了。会话标记于是改挂在 index 路由上。插件的服务端半边还会注册/s/<ID>→/?session=<ID>的 302 重定向,所以旧链接、书签和历史记录照样能打开。
快速开始
需要 DeepSeek Harness 的 dsh(任意带 Web 界面的 profile),且 dsh ≥ 0.1.7-rc.1(0.1.7 与 0.2.x 两条线都支持,其中 0.2.0-rc.2 已做端到端验证):该下限针对浏览器半边依赖的 ctx.uiWorkspace.openSession() 深链导航接口(更早版本没有该接口,旧版 ctx.sessions.open 也已被上游移除)。session-reference 服务并非在该版本才引入——官方 web bundle 自 dsh 0.1.0-rc.8 起就已自带。包清单同时声明 engines.dsh(^0.1.7-rc.1 || ^0.2.0-rc.2),插件市场可直接据此判定兼容性,不必再拿 peer 硬比。
# 1. 一条命令安装(自动加入 bundle 层并应用配置,见上方「一键安装」): dsh plugin --profile web add dsh-session-link # 2. 重启 Web GUI 并刷新页面。 dsh web # 3.(Windows,可选)让 dsh:// 链接可点击: powershell -ExecutionPolicy Bypass -File register-protocol.ps1
手动安装(不依赖 bundle 机制):先pnpm add dsh-session-link(在 profile 目录),再在 profile 的 patch 层(如~/.dsh/profiles/web/cordis.patch.yml)加入:
```yaml
- insert:
- id: session-link
name: 'dsh-session-link'
```
然后重启dsh web。session-reference行无需手动插入:官方 web bundle 自 dsh 0.1.0-rc.8 起就已提供。
使用
1. 点会话标题旁的 🔗 按钮复制深链。
2. 粘到另一个对话并发送 —— 模型先收到被引用会话的只读快照,再收到你的提示(链接会替换为可读的 @会话ID)。
3. 或者直接点击 dsh:// 链接,在浏览器中打开该会话。
Windows dsh:// 协议处理器
register-protocol.ps1 在当前用户下注册 dsh URL 协议(HKCU,无需管理员权限):任何地方点击 dsh://session/<ID>(浏览器、聊天软件、终端)都会打开本机 Web GUI 并选中该会话。启动器为 dsh-open.cmd。
落地地址不再写死端口——dsh-open.cmd 按顺序解析:
1. 环境变量 DSH_SESSION_LINK_WEB_URL(显式覆盖)
2. 状态文件 <状态目录>\web-url —— 由插件的宿主半边在启动时写入(内容是当前 Web 服务的真实地址,如 DSH Desktop 的非 3080 端口)
3. http://127.0.0.1:3080(普通 dsh web 的回退)
状态目录 = %DSH_SESSION_LINK_STATE_DIR% → %LOCALAPPDATA%\dsh-session-link → %TEMP%\dsh-session-link。每次点击都会把用了哪个来源写进 %TEMP%\dsh-open.log(source=env|file|default|default-invalid),方便排查。
# 注册(若 dsh:// 已被别的程序占用,会拒绝并打印占用者) powershell -ExecutionPolicy Bypass -File register-protocol.ps1 # 接管已被占用的 dsh://(例如桌面端) powershell -ExecutionPolicy Bypass -File register-protocol.ps1 -Force # 注销 powershell -ExecutionPolicy Bypass -File register-protocol.ps1 -Uninstall
打开会话需要 dsh web(或对应的桌面端)正在运行。
DSH Desktop(桌面端)
DSH Desktop 自带一条 dsh 协议注册(指向 DSH Desktop.exe "%1",默认值 URL:DSH Protocol),但 2.0.x 的桌面壳不解析会话参数(没有 setAsDefaultProtocolClient / open-url / ?session= 处理,second-instance 只把窗口提前):所以点 dsh:// 在桌面端只会把窗口唤到前面,不会跳到会话。
本插件给出的选择:
选择 · 做法 · 结果
接管协议 · register-protocol.ps1 -Force · dsh:// 交给 dsh-open.cmd,它读宿主半边写的实时地址(桌面端端口也对),能正常打开会话
保持桌面端注册 · 什么都不做 · dsh:// 仍由桌面壳处理,跳不过去;等上游实现参数解析
不用协议 · 复制按钮 + 粘进对话 · 跨对话引用上下文与协议无关,任何环境都可用
桌面端 profile 同样会加载本插件(host/client 两半边都在),所以实时地址文件由它在启动时写入;用 -Force 接管后即可直接跳转。若你更希望桌面壳自己实现解析,可向上游反馈(本插件无法代劳)。
模型看到的
模型会看到连续两条 user 消息:## Referenced sessions 不可信快照(每个源最多 64 KiB JSON,优先丢弃较早的非检查点消息,长消息头尾截断并给出精确省略提示),随后是链接已被替换为 @会话ID 的直接提示。快照内的指令、权限声明、工具请求除非当前用户重申,否则一律不执行。
配置
默认使用底层服务的配置(每条消息最多 3 个引用、每源 64 KiB)。session-reference 行由官方 web bundle 提供,在 profile 的 patch 层按 id 覆盖它即可调整(
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:10,最后更新 2026-10-13