Bundle
dsh-session-title-refresh
DeepSeek Harness 会话标题插件:在会话菜单中根据对话内容重新总结标题
- Source
- leolee9086
- License
- MIT
- Updated
- Updated 16 hours ago
Readme
# dsh-session-title-refresh
DeepSeek Harness 独立 Web 插件。仅在侧边栏会话原有的「⋯」菜单中增加 **重新总结会话标题**。不注册顶部按钮、输入框下方按钮或设置项,不添加全局样式,不修改 DSH 源码。
## 使用
打开会话菜单,点击「重新总结会话标题」。菜单项显示进行中、成功或失败状态;请求期间重复点击不会重复调用。关闭再打开菜单仍可看到该会话的请求状态,失败时显示原因并允许重试。
插件根据该会话的人类文字消息生成标题,优先保留最近消息,空间允许时保留第一条消息。JSON 输入最多 24 KiB;单条过长的最新消息保留尾部,不切断 Unicode 码点。附件、工具输出、插件注入和系统提示不进入这次标题请求。选择会话待使用的模型;没有待使用选择时采用最后一次请求模型,再没有则采用默认模型。
成功后调用 DSH 的 `sessionTitle.rename()` 保存为显式指定的标题,因此会固定该标题,不会被正在运行的自动命名覆盖。再次点击此菜单可重新生成。模型请求和消息序号通过现有 `session/title-llm-request` 事件记录,标题通过现有 `session/title` 事件保存,侧边栏通过 DSH 原有数据流更新。
## 修正的旧行为
旧版调用 `sessionTitle.refresh()`,但默认 `session-title-first-prompt-llm` 即使手动刷新也只选第一条人类消息,可能成功返回几乎相同的标题。旧版也只在 live session 表查找会话,未加载的历史会话会失败。
新版通过公开的 Typert agent lookup 加载目标会话,并使用目标 Agent 的服务作用域;通过共享 `generateSessionTitleWithLlm` 辅助方法执行独立的标题请求,不替换全局自动命名 provider。正在生成时若用户另外改名或发起更新的总结请求,旧结果不会覆盖新标题。
## 菜单实现
DSH 当前没有会话行菜单扩展槽。插件仅观察新增的 `[role="menu"]` 节点,沿该菜单的 React owner 链寻找包含 `rename/fork/archive` 的菜单和准确的会话行,取其 `node.id`。不根据几何位置、当前选中会话或显示标题猜测目标;同名会话不会混淆。无法确认所属会话时不添加入口。
新增菜单项沿用原菜单项的 CSS 类。没有 React 组件、输入框、localStorage 偏好项、全局 CSS 或合成 Escape 事件。卸载时移除观察器和菜单项,并中止未完成的请求。
## 安装
需要 Node.js **22.19.0 或更高版本**、pnpm,以及兼容的 DeepSeek Harness Web 环境。插件本身**没有任何第三方或 DSH 内部依赖**,只通过运行时的 Cordis 服务契约工作,因此不引入 DSH 本体代码,也不需要跟随 DSH 源码目录。DSH 的插件接口仍可能随版本变化,使用其他版本时请先验证兼容性。
在你的 DSH Web profile 目录中安装指定 tag(默认目录为 `~/.dsh/profiles/web`,Windows 通常为 `%USERPROFILE%\.dsh\profiles\web`):
```sh
pnpm add 'github:leolee9086/dsh-session-title-refresh#v0.2.0'
```
也可以从 [GitHub Releases](https://github.com/leolee9086/dsh-session-title-refresh/releases) 下载构建好的 `.tgz` 包,在同一 profile 目录执行:
```sh
pnpm add ./dsh-session-title-refresh-0.2.0.tgz
```
然后在该 profile 的 `cordis.patch.yml` 中加入下列配置;已有 `insert` 列表时,只需向列表追加这一个插件项,不要重复注册:
```yaml
- insert:
- id: session-title-refresh
name: dsh-session-title-refresh
```
包内已带 `cordis.patch.yml`,因此也可以直接作为 bundle 挂载:
```yaml
- name: dsh-session-title-refresh
```
重载插件或重启 DSH 后刷新浏览器页面。仓库 tag 和 Release 包都包含 `lib/` 构建产物,安装使用不需要克隆或修改 DSH 源码。
## 本地开发
```sh
git clone https://github.com/leolee9086/dsh-session-title-refresh.git
cd dsh-session-title-refresh
pnpm install --frozen-lockfile
pnpm test
pnpm build
```
唯一的开发依赖是用于测试的 `jsdom`。运行时零依赖:标题生成通过运行环境提供的 `ctx.get('llm')`、会话与标题服务完成,不 import 任何 DSH 包。`pnpm build` 校验后将 `src/` 下的文件复制到 `lib/`;提交源码变更时应同时提交最新构建产物。
```sh
pnpm pack
```
打包前会自动执行测试和构建。包内只包含运行产物、`cordis.patch.yml`、包元数据、中文 README 和 MIT 许可证。
## HTTP 接口
`POST /api/session-title/resummarize`,JSON 请求 `{ "sessionId": "session-…" }`。使用 DSH Connection 的 Host/Origin 校验和浏览器 Cookie 身份验证。
- 成功:`{ok:true,title,eventSeq,messageSeqs,source:{kind:'user',provider,model}}`。
- 错误:`{ok:false,reason,error?}`,包含不存在、没有文字、无可用模型、超时、被更新请求取代及模型上游错误。
- 标题已提交但持久化检查失败时,返回 `ok:true` 和 `warning`,不会误报为保留了旧标题。
请求体上限 8 KiB;模型输出预算 2048 tokens;模型超时 90 秒;整个请求上限 120 秒。每次手动总结至多新增一次辅助模型请求,不向主对话插入消息。
## 验证及边界
`node --test tests/*.test.mjs` 覆盖独立菜单注入、同名会话定位、重复点击、状态及卸载、历史会话解析、模型选择、输入预算、鉴权、失败保留标题、并发覆盖保护和真实共享生成方法的流组装及日志事件。
客户端依赖 DSH 菜单的 React owner 和 ARIA 结构;DSH 升级改变该结构时可能需要更新本插件。文案目前为简体中文。浏览器关闭请求或插件卸载会取消未完成的生成;已接受的标题不会因此回滚。
## License
[MIT](./LICENSE)
## 赞赏
如果这个项目帮到了你,可以请我喝杯咖啡:

也欢迎通过 [爱发电](https://afdian.net/a/leolee9086) 支持。Install
dsh plugin --profile web add github:leolee9086/dsh-session-title-refresh
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-session-title-refresh from the hub
- This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.