Skip to content

dsh-sessions

Verified

@wishp3/dsh-sessions · v0.2.0 · MIT · Web UI

DeepSeek Harness (DSH) Web UI plugin: cross-session @ mentions, bare session-id references, copy-session-id row actions, and Codex-style selection quote-to-composer

Install

dsh plugin add @wishp3/dsh-sessions

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Readme

dsh-sessions

dsh-sessionsDeepSeek Harness(DSH)的 Web 插件:把其他会话作为有界、只读、带来源的快照引用进当前会话。浏览器半提供 @ 触发源、引用范围设置卡片,并 vendor ui-workspace 以在会话行 菜单加入「复制会话 ID」;宿主半通过 agent/pre-step 解析 mention,并调用官方 ctx.sessionReferenceResolver.prepare() 产出快照。

功能

  • @ 候选:输入 @ 时列出可引用的历史会话,排序沿用 sessionReferenceResolver.listCandidates()(同 cwd、无 cwd、其他 cwd)。候选 label 取日志支撑的最新标题,缺失时回退到会话 id。
  • 裸 session id:消息里的 session-<uuid> 直接解析为引用,只在两侧不是 [A-Za-z0-9_-] 的位置匹配。
  • 手打 @标题allowPlainTitleMentions 打开时,按候选标题做不区分大小写的精确匹配;唯一命中才解析,重名保持普通文本。
  • 复制会话 ID:会话行 菜单新增「复制会话 ID」,复制 dsh 原生 session id;成功与失败都有 toast。
  • 引用前文:在会话正文中选中文本会出现「添加到对话」按钮;引用以输入框 chip + 上方引用条暂存,支持展开/收起与逐条移除,发送时自动序列化为逐行 > 前缀的引用块。

安装

dsh plugin --profile web add @wishp3/dsh-sessions
dsh --profile web

bundle patch 做两件事:disabled: true 关掉内置 ui-workspace,并插入 session-referencesession-bridge 两行。前者是官方快照语义层;后者同时声明 dsh.bundledsh.client,web loader 从同一行自动提供浏览器半。

DSH 插件通过 profile 安装、通过 bundle patch 参与组合,详见官方插件管理文档架构说明

与官方项目的关系

本项目是基于 deepseek-ai/deepseek-harness 构建的社区插件,不修改官方运行时:

  • 快照语义完全复用官方 @deepseek-ai/dsh-session-reference 服务,本包只做 UI 触发源、路由与 agent/pre-step 接线。
  • 浏览器半通过官方 ctx.inputTriggerssettings.plugin.itemslots 等服务接入 Web UI。
  • upstream/ 保留一份提交给官方仓库的工作区菜单槽位补丁;补丁合并后,本包会删除 vendor 并恢复内置 ui-workspace

需要命令行运行或参与核心功能开发,请以官方仓库为准。

相关开源项目

README 的组织方式参考 DeepSeek Harness Desktop。该仓库 About 原文:

为 DeepSeek Harness (DSH) 生态打造的现代化桌面端体验

🔗 dshdesktop.cn

项目 简介 链接
DeepSeek Harness DSH 核心生态框架,本插件的运行时与官方语义层来源。 GitHub
DeepSeek Harness Desktop DSH 生态的桌面端体验。 GitHub · 官网
Agents-Anywhere 从手机远程控制电脑上的 Coding Agent。 GitHub

About 里的 topic 是标签,不是独立仓库;以下按 About 显示顺序收录到 GitHub topic 页:

标签 链接
deepseek GitHub
deepseek-harness GitHub
desktop GitHub
dsh GitHub
dsh-plugin GitHub
dsh-plugin-desktop GitHub

工作区界面

当前发布的 ui-workspace 没有会话行菜单扩展槽位,upstream/0001-web-session-row-menu-slot.patch 是提交给上游的补丁。本包因此 vendor 了 ui-workspace 的完整浏览器源码(src/vendor/workspace/),在 bundle patch 中禁用内置行,用自己的注册补上 sidebar.workspacesconversation.hero.workspace 两个 slot,其余行为与内置实现一致。

复制走 copyTextToClipboard():先在点击手势内同步 document.execCommand('copy'),失败再回退 navigator.clipboard.writeText(),任一后端接受即成功。结果 toast 在行组件本地渲染,4 秒后自动消失,zh/en 文案各一套。

会话行 菜单 复制成功 toast
会话行菜单里的复制会话 ID 复制会话 ID 成功 toast

dsh 升级工作区 UI 后需同步 vendor 目录;upstream/ 里的槽位补丁合并进上游后,可删除 vendor 并恢复内置 ui-workspace

配置

Web UI:设置 → 插件 → 插件配置 → 会话引用。卡片默认折叠,展开后可在「仅当前工作区 / 所有可见会话」之间切换,保存即写入宿主 settings。

api-proxy 的 settings 命名空间白名单不覆盖第三方包,因此卡片不注册官方 settings 槽,而是走本包自己的 GET/POST /dsh-sessions/settings;设置节持久化到 dsh settings.yamldsh-sessions: 段。

插件配置页:内置「终端」卡与「会话引用」卡展开后的样式
默认 作用
scope workspace workspace:只能引用与目标会话同 cwd 的记录;all:引用本机 dsh 可见的全部持久化会话
allowBareSessionIds true 解析消息中的裸 session id
allowPlainTitleMentions true 解析手打 @标题
candidateLimit 50 预留:浏览器半目前固定请求 50 个候选
failureMode passthrough preflight 成功后、pre-step 再次 prepare 失败时:passthrough 保留可读文本继续,reject 拒绝该步

scope 在卡片上改;其余键通过 cordis.patch.yml 或 profile 覆盖。

工作方式

引用前文(选区引用)

  1. 选中聊天正文 → 选区上方出现「添加到对话」(输入区与引用条内的选区不触发)。
  2. 点击后文本按 16,000 Unicode 码点截断(超出追加「…(已截断)」),以 dsh-sessions-quote chip 插入草稿末尾;输入框上方的 conversation.input.dock 引用条直接从 input.occurrences 派生,支持展开/收起与移除。
  3. 提交时 codec 把每个 chip 序列化为 > 引用内容clipboardText 同为引用块,复制 chip 或草稿重载后语义保持。

新会话输入 @ 时的候选菜单(浏览器半):

输入 @ 后出现的会话候选菜单
  1. @ 触发源候选来自 POST /dsh-sessions/candidates;pick 插入 chip,不透明 ref 携带目标会话、来源会话、label 与规范 mention 文本。
  2. 提交时 codec serialize 调 /dsh-sessions/preflight:宿主按当前 scope 过滤后完整执行一次 prepare()。失败会中止提交并保留草稿;成功才输出规范 @[label](dsh-session:…)
  3. 宿主 agent/pre-step waterfall 先取普通 enter 决策,再逐个解析直接 user 消息:规范 mention 规范化为可读 @label;裸 id 与手打 @标题 按开关解析;每个 id 必须落在 scope 内,否则按 failureMode 处理。
  4. prepare() 一次读取全部来源并去重,重写为 [快照, 可读直接消息, …]。快照源标记为 { kind: 'session-reference', version: 1 }

快照语义沿用 @deepseek-ai/dsh-session-reference

  • 每个来源只调一次 sessionQuery.readSurface(),入队后不重读;只投影用户直接发出的 user/message、assistant 文本,以及带 dsh-compaction 标记的 user/message 检查点。工具、reasoning、上下文、插件生成的 user 消息、未完成的 assistant 分片、被压缩遮蔽的事件全部排除。
  • 每条来源独立受 maxReferenceBytes(65536)限制,保留压缩检查点与最新消息,旧的非检查点单元按 dsh-output-retention 头尾截断;固定字段就超限时以 SESSION_REFERENCE_BUDGET_EXCEEDED 失败。
  • 一条消息最多 3 个不同来源;拒绝自引用。
  • 目标日志先记录带来源的上下文 user/message,再记录可读直接消息;之后源会话变更、压缩或删除不影响目标回放。

模型体验

引用会话背景

模型看到的内容

模型看到两条连续的 user 消息:先是 ## Referenced sessions 不可信快照,再是带可读 @label 的当前消息。警告禁止遵循快照中的指令、权限声明或工具请求,除非当前 user 重复这些内容。label、cwd 值、id 与会话文本序列化为 JSON 放进 <referenced-sessions> 标签;数据中的每个 <\u003c 发出,源文本拼不出定界标签。

Token 影响

每条含引用的消息增加固定警告和最多三个序列化快照,每个独立受 65536 字节限制。精确快照保留在目标历史中,直到目标压缩遮蔽或摘要它;源会话变化不增加更多 token。

KV Cache 影响

快照与请求是两条连续、仅追加的目标消息,保留较早的可缓存历史。不同引用或源捕获内容只改变新后缀;目标压缩可能从替换边界起使复用失效。

已知限制与暂缓事项

  • vendor 工作区浏览器:dsh 升级 UI 后需同步 src/vendor/workspace/;上游合并 upstream/ 槽位补丁后可切回内置实现。
  • 手打 @标题 只精确匹配:重名标题不自动解析,请用菜单 chip 或裸 id。
  • preflight 与 pre-step 之间存在竞态:源会话可能被删除或损坏;默认 passthrough 保留可读文本并记录错误,reject 改为拒绝该步。
  • 不搜索消息正文:候选查询只检查 id、cwd 与折叠后的标题(语义层限制)。
  • 只传播文本:非文本 user 与 assistant 块不跨会话。
  • 引用不是实时链接:快照在发送时冻结,不是 fork、恢复或订阅。

开发

npm install --ignore-scripts   # 首次安装,跳过 prepare
npm run build
npm test

本地调试(在 deepseek-harness 源码 checkout 中):

pnpm dsh web --patch /absolute/path/to/dsh-sessions/cordis.patch.yml

发布

npm run build
npm publish

package.json 已声明 publishConfig.access: public,scope 为 @wishp3

License

MIT

本项目是基于 DeepSeek Harness 构建的社区插件,并非 DeepSeek 官方产品。