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