dsh-session-actions
给 DeepSeek Harness(DSH)Web 客户端加一个侧边任务:在任意会话行上「开启侧边任务」,它会在同一目录新开一个零上下文的对话,直接开在右侧栏,和你正在做的事情并排。
一个 DSH 客户端插件包(bundle),纯 JavaScript,无构建步骤。
功能
- 零上下文新会话:不 fork、不复制历史。新对话的 token 从 0 开始(系统提示与工具定义除外),不会把主对话的几万 token 一起带过去。
- 右侧栏独立标签:与主对话并排;同一目录,能读同一批文件。
- 临时生命周期:
- 关闭标签 / 闲置 1 小时 / 重启应用 → 任务结束;
- 结束时右下角弹 6 秒提示「侧边任务已结束并归档」;
- 标签不会被自动关掉,而是冻结:顶部常驻「已失效」横幅,输入框被替换成不可发送的提示 —— 由你手动关闭。
- 可找回:结束的会话进入归档,在侧栏 视图选项 → 已归档 里能找到(DSH 没有会话删除 API,归档是目前能做到的“作废”)。
安装
本包是一个 DSH bundle(dsh.bundle.patch + dsh.client),用 DSH 自带的插件管理器安装,不要手工改 profile:
// 通过 Agent 的 plugin_manager 工具
{ "action": "install_bundle", "target": "/绝对路径/dsh-session-actions" }
也可以先克隆再安装:
git clone https://github.com/HiMenma/dsh-session-actions.git
安装后无需重启:客户端 bundle 会通过 HMR 进入已打开的页面。改动本包的 client.js 后会触发热重载;如需强制换一代模块,把插件 disable 再 enable 即可。
使用
- 在左侧栏任意会话行上点「…」(或右键)→ 开启侧边任务;
- 右侧栏出现一个「侧边任务」标签,里面是空白对话,直接输入即可;
- 用完关闭标签;想保留就闲置着(1 小时后自动失效)。
实现要点
| 位置 | 用途 |
|---|---|
sidebar.workspaces.session.menu.item |
会话行菜单里的「开启侧边任务」 |
ctx.sessions.create({ cwd }) |
创建零上下文会话(只传目录,避免占用宿主“新建会话”会复用的空白会话) |
ctx.resources.register + ctx.sidebarRightTabs.register |
自定义 dsh-resource://sidetask/session/ 资源与 tab 类型 |
sidebar.right.pane.tab(key = 插件 id) |
tab 正文:SessionProvider + conversation.content 工厂,Chat 视图固定 |
conversation.composer(chain,priority 100) |
失效后替换输入框,禁止发送新请求 |
shell.overlay |
结束时右下角提示 |
状态(哪些会话是侧边任务、是否失效)存放在浏览器 localStorage 的 dsh.side-task.v1,不上报 Host、不写会话日志。
已知限制
- 无法物理删除会话:DSH 的会话只能归档,所以“关闭即删除”落地为“关闭即归档”,JSONL 仍在磁盘上,可手动取消归档恢复。
- 用过的侧边任务会以普通会话出现在「未分组」里,直到被归档;没发过消息的空白侧边任务在任何列表都不显示(DSH 不渲染非当前空白会话)。
- 重启应用后恢复出来的失效标签只显示「已失效」提示,不会再把已归档会话拉起来读。
- 在 DSH
0.2.2-rc.1(Desktop /desktopprofile)上开发;依赖的是公开 Slot 与 Client 服务,未做跨版本兼容保证。
License
MIT © 2026 Yang
English summary
A DSH Web client bundle that adds Open side task to the session row menu: it opens a fresh zero-context conversation in the right sidebar, rooted at the same directory. Side tasks are temporary — closing the tab, one hour of idleness, or an app restart ends them (they are archived, never silently deleted), the tab stays open with an “invalid” banner and a disabled composer until you close it yourself.