dsh-sessionrelay:在 DSH 里自动注入 SessionRelay 项目简报

前言

在 ZCode、Claude Code 这类命令行客户端里,进程工作目录通常就是项目根,SessionStart 一类 hook 可以在会话开始时把项目简报塞进上下文。DeepSeek Harness(DSH)是桌面 GUI,情况不同:process.cwd() 指向安装目录而不是项目;ctx.cmdlineArgs 为空;AssembleContext 只有 scope 与 signal,没有 cwd 与项目路径。SessionRelay 本身是 MCP 服务,可以被查询,但 MCP 的 initialize 响应不能向对话里注入 instructions 或 resources——未经模型主动请求就出现在上下文里的内容,必须由客户端放置。

下面介绍社区插件 dsh-sessionrelay(npm 包名 dsh-srelay-brief,维护者 rui08984-dot)。它把 SessionRelay 的项目记忆接到 DSH 官方的 systemPrompt.section() 注入点,并在每个模型步骤前渲染简报;同时提供项目解析、自动建库与两段式安全绑定。插件分类为「记忆」,当前 GitHub 星标为 0,版本 0.2.0(MIT)。

这是什么

dsh-sessionrelay 是面向 DSH 的原生插件,等价于 CLI 客户端里「SessionStart 自动带简报」的能力,但针对 DSH 的桌面环境做了项目判定与注入路径适配。记忆数据落在项目目录下的 .sessionrelay/,运行时优先使用插件自带的 vendor/ 副本,设计上支持离线、自包含,不强制用户全局安装 SessionRelay。

核心功能

每轮简报注入

插件注册一个 systemPrompt 段落,在每次上下文组装(即每个模型步骤前)执行,展示当前项目近期决策与未决问题;决策带 [MM-DD] 日期,总长上限 1200 字符。

取数路径为 SQL 优先:用 node:sqlite 只读打开本地库(见 src/brief-sql.mjs),CLI 子进程仅作兜底。资料中给出的量级为:冷路径约 5 ms、热路径约 1 ms,对比纯 CLI 约 310–360 ms。需要对照旧路径时可设环境变量:

SRELAY_BRIEF_FORCE_CLI=1

项目解析

常见情况下无需手工配置。判定顺序如下:

① agent.session.header.cwd      → DSH 校验过的绝对 cwd(按 agent)
② env SRELAY_PROJECT_ROOT       → 须指向含 .sessionrelay 的目录
③ DSH 会话反推                  → ~/.dsh/sessions 下最近活跃会话组
④ 注册表唯一存活项目            → 全局仅一个有效项目时
⑤ 悬空                          → 不猜测,列出候选供用户选择

主信号是 ①:DSH 在会话创建时交出工作目录。兜底 ③ 利用 DSH 按目录 slug 存放会话,例如 ~/.dsh/sessions/--E-music~0020player-- 对应 E:\music player。解码不能只做字符串替换(- 与真实路径歧义),插件会按文件系统深度优先剪枝,只探索真实存在的路径前缀。

第 ⑤ 级故意不猜错项目:把 A 项目简报注入 B 项目会话比不注入更危险,模型无法区分来源。

自动初始化

规则是黑名单:除临时目录、DSH 安装目录与 ~/.dsh、npm 全局根、盘符根外,在 DSH 中打开的真实文件夹会尝试自动创建记忆库(约 190 ms、约 166 KB,可删除 .sessionrelay/ 撤销)。git clone 后的目录、文件管理器打开的文件夹都会触发;monorepo 子目录会绑到仓库根。与 ZCode hook(~/.zcode/hooks/statebrief/brief.mjs)共用同一套黑名单逻辑,改规则需两边同步。

七个原生工具

工具 作用
srelay_search 检索项目历史会话与讨论
srelay_show 查看某会话消息与出处
srelay_record 沉淀已确认决策
srelay_init 为目录建记忆库(单步、可逆)
srelay_bind_project 提议切换绑定项目
srelay_confirm_bind_project 用户确认后生效
srelay_cancel_bind_project 取消待确认提议

srelay_init 供模型在需要时主动建库;绑定已有库则走两段式(见下节)。

两段式安全绑定

srelay_bind_project 决定决策写入哪个 SQLite 库,不能由模型单方面生效。流程为:先 srelay_bind_project({ projectPath }) 仅记录提议并提示用户确认;用户同意后调用 srelay_confirm_bind_project();srelay_cancel_bind_project() 放弃提议。提议按 scope 隔离。目标路径必须已存在 .sessionrelay,否则会出现「绑定成功但后续调用静默失败」。

自包含运行时(vendor/)

解析顺序:SRELAY_CLI_PATH(开发)→ bundled vendor/(默认)→ 全局 npm(最后兜底)。

Git 仓库不含 vendor/(约 62 MB 构建产物)。安装后需确认 vendor 就位,否则插件不报错但可能回落到全局上游 srelay,出现「一切正常、简报始终为空」的半失效状态。获取方式包括:

途径 说明
Release 资产 从 Releases 下载 vendor-*.tar.gz 解压到插件目录(可离线)
npm 拉取 node vendor-srelay.mjs(需联网)
本地复制 node vendor-srelay.mjs --from <path>(离线)

验证:

node -e "console.log(require('fs').existsSync('vendor/dist/srelay.js'))"

应输出 true。

安装与启用

插件以当前 DSH 进程的 Node 环境运行,要求 Node ^22.19.0 || >=24.0.0(见 package.json)。安装前建议阅读仓库源码与 MIT 许可证;插件目录页与 GitHub 由社区维护,与 DeepSeek / 幻方无官方从属关系。DSH 生态上「一切皆插件」,SkillHub 等为独立社区目录。

方式一:DSH 插件管理器(推荐)

在 DSH 的 Plugins 页面填入包名并安装:

dsh-srelay-brief

方式二:命令行

dsh plugin --profile web add dsh-srelay-brief

方式三:从 GitHub 安装

dsh plugin --profile web add https://github.com/rui08984-dot/dsh-sessionrelay

无论哪种方式,装完后都应按上一节确认 vendor/ 已就位。资料说明:不需要预先全局安装 SessionRelay。

可选环境变量:

SRELAY_PROJECT_ROOT=/path/to/project/with/.sessionrelay

典型用法

  1. 在 DSH 中打开项目文件夹;若目录不在黑名单内,记忆库会自动创建。
  2. 正常对话即可:每个模型步骤前 system prompt 会带上项目简报(决策与未决问题)。
  3. 需要查历史或写决策时,让模型调用 srelay_search、srelay_show、srelay_record。
  4. 切换绑定到其他已有 .sessionrelay 的项目:模型调用 srelay_bind_project,你在界面确认后再由模型或你触发 srelay_confirm_bind_project()。
  5. 新项目且无自动建库时,可通过 srelay_init 建库。

适用场景与注意

适合:长期在 DSH 里做同一仓库开发、希望跨会话保留「已做决策 / 待决问题」、并已采用或愿意采用 SessionRelay 数据模型的团队或个人。

注意:

  • 插件与 DSH 同权限访问本地文件与 SQLite;绑定错误会把决策写入错误项目库且不可逆,故绑定必须用户确认。
  • 无 vendor 且全局 srelay 非本 fork 时,可能出现静默空简报。
  • SRELAY_PROJECT_ROOT 在资料中注明主要对 serve 生效;CLI 子命令以 cwd 为准。
  • 社区目录页:SkillHub - dsh-sessionrelay;源码与中文 README:GitHub - rui08984-dot/dsh-sessionrelay。

结尾

dsh-sessionrelay 把 SessionRelay 的项目记忆接到 DSH 唯一合适的注入点,用 SQL 优先的简报、DSH 会话反推的项目解析、黑名单自动建库与两段式绑定,补上了桌面客户端相对 CLI 在「开场记忆」上的缺口。安装包名 dsh-srelay-brief,装完务必检查 vendor。更多说明见 目录页 与 GitHub 仓库。

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

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

小夜