- Главная
- Плагины
- Сеансы и сообщения
- dsh-temptask
dsh-temptask
aeroscis/dsh-temptask
Временные задачи в один клик для DeepSeek Harness: каждая создаёт одноразовый workspace с отметкой времени и собственной сессией, отображаемые нативным узлом в боковой панели.
Установка
dsh plugin --profile web add github:aeroscis/dsh-temptaskREADME
dsh-temptask — DSH 临时任务
给 DeepSeek Harness 加一个「临时任务」入口:一键开一个隔离的临时工作目录,在里面聊。 实验、临时调试、一次性问题——即开即用、用完就清。
- 一个任务 = 一个目录 = 一个工作区(侧边栏里的那一项):
<DSH_HOME>/dsh-temptask/<时间戳>/。所以侧边栏长成 DSH 原生的样子:任务工作区 → 它的会话,展开、归档、搜索、拖拽都是官方能力。 - 不用起名:工作区名就是那个时间戳目录;会话标题由 DSH 按首条消息自动总结,显示在会话行上。
- 聊出成果了就转正:改名、搬到你要的正式目录、连这段对话一起带过去,从此不再被自动清理。
- 侧边栏一行:主区点击 = 新建,右边五个按钮(清理 / 转正 / 打开根目录 / 说明 / 设置);也有
/temptask命令。 - 清理有二次确认,只删任务根目录下的子目录,根目录里你自己放的东西不会被碰。
1. 安装与卸载
# 安装(默认 profile)
dsh plugin add @aeroscis/dsh-temptask
# 指定 profile / 从本地目录安装
dsh plugin --profile <profile> add @aeroscis/dsh-temptask
dsh plugin --profile <profile> add /path/to/dsh-temptask
装完重启 DSH。侧边栏顶部(「新建会话」下方)会多出一行:
+ 临时任务 │ 🗑 ♥ ⧉ ? ⚙
主区整块可点 = 新建;右边五个按钮依次是 清理 / 转正 / 打开(或复制)任务根目录 / 说明 / 设置。 窄栏折叠时它就收成一个 + 图标。
desktop是 Electron 保留的 profile 名,终端里的dsh plugin会拒绝管理它。 桌面版请在应用内的插件管理界面装卸;想在终端操作就换一个自建 profile。
卸载:dsh plugin --profile <profile> remove @aeroscis/dsh-temptask。
卸载不会删除任务目录与 tasks.json——要清就先用「清理临时任务」或手动删。
支持的 DSH 版本
| DSH 版本 | 能不能用 | 和别的版本有什么不同 |
|---|---|---|
0.1.5-rc.2 | ✅ | 能用。配置项存在 DSH 自己的设置里,改完要重启 DSH。这版官方只有「归档」,没有「取消归档」 |
0.1.7-rc.2 | ✅ | 同上;从这一版起才有「取消归档」(unarchiveSession) |
0.2.0-rc.1 / 0.2.0-rc.2 | ✅ | 能用。配置项改由本插件提供,改完不用重启 |
0.2.1-rc.2 / 0.2.1-rc.3 | ✅ | 能用。「浏览…」选文件夹在这条线上是通的 |
0.2.2-rc.1 | ✅ 本版本实测过 | 能用。桌面版 DSH NEXT 2.0.22-next 内置的就是这条线 |
上表之外的版本,宿主会直接跳过本插件——界面上那一行不会出现,DSH 日志里会写
skipping profile bundle "@aeroscis/dsh-temptask"。遇到这种情况,升级插件或升级 DSH 即可。
2. 怎么用
新建
点 +(或 /temptask new)→ 创建 <DSH_HOME>/dsh-temptask/<时间戳>/ 并在这里开一条会话。
之后它就是一个普通的侧边栏工作区:展开能看到这次任务下的所有会话。
转正(♥)
临时任务聊出了成果、想长期留着时用。三种入口,都打开同一个面板:
- 侧边栏那一行的 ♥;
- 会话行右键菜单里的「转正此任务」;
- 会话行悬停时出现的 ♥ 按钮(会自动预选这条会话所属的任务)。
面板里依次是三个区块:
- 要转正的任务——每行大字是工作区名(就是那个时间戳),下面小字是这段对话聊了什么 (会话标题 → 首条消息摘要),所以不用猜是哪一个。默认只列侧边栏还有工作区的任务; 右上角「显示全部(N)」把只剩文件夹的(工作区被删过)也列出来。
- 新目录名——默认取上面那段内容(例如「修复登录页的 500 错误」→
修复登录页的-500-错误), 可以改成你要的名字;它同时是新工作区的名字。 - 目标父目录——必须是已存在的目录("少写一层"是最常见的手误,所以插件不替你造)。 能用系统目录选择器就点「浏览…」,否则手输绝对路径。
再加两个勾选:把对话带过去(默认勾,强烈建议)与完成后打开新会话。
点「转正」会先给你一个确认页(原路径 → 新路径、带不带历史、旧会话怎么处理),确认后才动手。 成功后给一张结果卡:原路径 / 新路径 / 新工作区 / 历史是否带上(没带上会说明原因)/ 归档了几条旧会话。
它会做什么:搬目录 → 在新位置建工作区 → 在新位置重建一条带完整历史的会话 → 旧会话按策略归档 → 删掉旧工作区与任务记录。旧的那条会话原样留在磁盘上(默认只是从侧边栏隐藏),新家得到的是新会话。
卡住时:如果那个目录正被占用(还有会话在跑、终端停在里面),会得到「目录被占用」的提示, 此时什么都没有改动——关掉那个任务的会话/终端再试。
清理(🗑)
勾选要删的任务(默认勾上已关闭的),二次确认后:删目录 → 删侧边栏那一项 → 删记录,再按设置处理它的会话 (默认归档,见 §3《删除任务时它的对话去哪了》)。运行中的任务会标「运行中」, 清理前会先中止当轮。
齿轮(⚙)
只放一件事:删除任务时怎么处理它的会话 —— 归档会话(推荐) 或 留在未分组。
另有「复制根目录」与清理入口。
说明(?)
鼠标移开就收起。里面是:有几个任务、根目录在哪、会话在哪儿、设置去哪改。 两半版本不一致时会多出一句「重启 DSH」——那是唯一需要你知道版本的场合。
3. 数据在哪
<DSH_HOME>/dsh-temptask/ ← 任务根目录(不存在时启动重建;删除操作永不碰它本身)
├── 2026-09-27-14-30-00/ ← 一个任务 = 一个目录
└── 2026-09-27-14-31-12/
<DSH_HOME>/plugin-data/dsh-temptask/
├── tasks.json ← 任务记录(原子写)
├── tasks.json.bak ← 仅当记录损坏时生成
└── config.json ← 仅在宿主没有设置服务时使用
- 目录名是本地时间戳;同一秒内重复创建会加
-2,绝不覆盖。 - 任务目录被手工删掉 → 下次启动会发现记录指着不存在的目录,于是丢掉这条记录并提示(目录才是任务本身)
- 侧边栏那一项被手工删掉 → 下次「打开」该任务会按路径把它建回来。
删除任务时它的对话去哪了
一个任务可能先后开过好几条会话。删除任务时按设置处理:
| 设置 | 会发生什么 |
|---|---|
归档会话(推荐) | 会话从侧边栏隐藏,日志仍留在磁盘上。要放回来:侧栏「视图选项 → 全部对话(显示已归档)」,在会话上右键「取消归档」(DSH 0.1.7-rc.2 起;0.1.5-rc.2 没有这个入口)。它会回到「未分组」——工作目录已经没了 |
留在未分组 | 会话留在官方「未分组」里,仍然可见、能打开,但它的工作目录已经没了(工具/终端指不到地方) |
为什么插件不删:DSH 没有删除会话的能力——会话日志只允许追加,存储层也明确没有删除或保留接口
(dsh-session-persistence 的原话:"No deletion or retention API — pruning stored sessions is out-of-band
backend maintenance")。所谓「带外维护」就是:DSH 关掉后你自己去删磁盘上的会话日志。
本插件不做这一步,也不会去动那些文件。
想连痕迹一起清掉
「归档」「删除工作区」「删会话日志」是三件不同的事,各删各的:
| 动作 | 谁提供 | 实际删掉了什么 |
|---|---|---|
| 归档会话 | 官方,可取消 | 只改可见性:日志、缓存、workspace.json 里的归档登记都留着 |
| 删除工作区 | 官方侧栏右键 | 只删 workspace.json 里那条记录:文件夹与该工作区名下的会话都留着(转为「未分组」) |
| 删会话日志 | 没人提供(DSH 把这件事划给"带外维护") | 只能关掉 DSH 手工做,见下 |
「清理临时任务」落在哪一层:删任务目录 → 删侧边栏记录 → 删 tasks.json 记录,会话按设置归档。
所以会话日志、投影缓存、workspace.json 里的归档登记都还在。
删除工作区之后仍然存在的四处:
| 位置 | 内容 |
|---|---|
<DSH_HOME>/sessions/--<目录名编码>--/session-<会话ID>/session.v4.jsonl.zstd | 整段对话。日志第一行就是 {"type":"session",…,"cwd":"…"},路径是明文 |
<DSH_HOME>/storages/session_projcache/sessions/session-<会话ID>.json | 会话投影缓存,同样带明文 cwd |
<DSH_HOME>/storages/workspace.json | global.archivedSessionIds / global.pinnedSessionIds 按会话 ID 记着,删工作区时不清 |
<DSH_HOME>/logs/*.jsonl | 不保证记,但确实会记到路径与会话 ID |
目录名编码规则(存储层的 projectKey):连续的分隔符(/、\、:)合并成一个 -;字母、数字、.、_、-
原样保留;其余字符(空格、中文、~ 等)变成 ~ + 4 位大写十六进制(UTF-16 码元),最后套成 --…--。例:
C:\Users\Aeroscis\.dsh\dsh-temptask\2026-11-01-00-00-24
→ --C-Users-Aeroscis-.dsh-dsh-temptask-2026-11-01-00-00-24--
超过 251 字符会截断(这一步有损),超长路径就按前缀去 sessions 下找。日志文件名里的 v4 是当前格式号,
格式升级后会跟着变;不开压缩时没有 .zstd 后缀。
要彻底抹掉,按这个顺序来(DSH 必须全程关闭):
- 复制一份
workspace.json留底; - 删掉
<DSH_HOME>/sessions/下那个--…--目录(该工作区名下所有会话); - 删掉这些会话对应的
<DSH_HOME>/storages/session_projcache/sessions/session-<会话ID>.json; - 编辑
workspace.json:把这些会话 ID 从global.archivedSessionIds与global.pinnedSessionIds去掉, 并确认global.pendingMutation是null(不是的话,说明上次删除中途崩过); - 删掉工作区目录本身(
Shift+Delete;本插件删目录走fs.rm,不进回收站); - 需要的话再清
<DSH_HOME>/logs/。
做完再启动 DSH,侧边栏、搜索、会话列表都不会再出现它。如果只删了日志、没做第 4 步,workspace.json
里会留下指向已不存在会话的 ID:界面上看不到,但记录还在。
清不掉的部分:DSH 之外还有文件系统日志(NTFS USN)、卷影副本与系统还原点、备份软件、同步盘、 杀毒软件的隔离区。这些不归 DSH 管,要不要处理得自己评估。
想把对话接回某个项目
/temptask repair <工作区绝对路径> [来源会话ID]:把某条孤儿会话(它记录的目录已经不存在了)
的历史,复刻进一个正常的工作区,成为一条能继续聊的新会话。它只读旧日志、不删不改任何东西。
适用两种情形:转正时没勾「把对话带过去」事后又想要;以及临时目录被删/被清理之后。 如果原会话只是被归档,取消归档只能让它回到「未分组」(目录已失效)——这条命令才能让它继续工作。
4. 命令
/temptask list 列出全部任务(ID / 目录 / 工作区 / 状态 / 时间)
/temptask new 新建任务并打开会话
/temptask open <ID|目录名|标题> 打开任务(支持片段匹配,多个匹配会列候选)
/temptask promote <ID|目录名|标题> --dir <父目录> [--name <新名>] [--no-history] [--yes]
转正:搬目录 + 建正式工作区 + 把对话复刻进新会话
/temptask repair <工作区路径> [来源会话ID]
把已存在的工作区与它的孤儿会话接上(补回历史)
/temptask clean <ID|目录名|标题> 删除任务(先预览,加 --yes 才执行)
/temptask clean --all --yes 删除全部任务
/temptask help 帮助
- 标题含空格要加引号:
/temptask open "修复登录 bug"。 clean/promote都是"先打印将要做什么,加--yes才动手"。promote不带--name时沿用原目录名;--no-history= 不把对话带过去(仍会在新家开一条空会话)。- 例:
/temptask promote "修复登录 bug" --dir "D:\Flora\ProgramProjects" --name login-fix --yes
5. 配置
在「设置 → 插件 → 临时任务」里改(DSH 0.1.x 上这一节的位置与写法略不同,效果一样):
| 键 | 默认 | 说明 |
|---|---|---|
rootDir | <DSH_HOME>/dsh-temptask | 任务根目录。留空 = 默认 |
autoCleanDays | 0 | >0 时,启动清理「已关闭且最后打开超过 N 天」的任务 |
onDeleteSessions | archive | 删除任务时怎么处理会话:archive 归档 / keep 留在未分组 |
dataDir | <DSH_HOME>/plugin-data/dsh-temptask | 插件数据目录(改它要重启 DSH) |
改 rootDir 与 autoCleanDays 不用重启,下一次操作就生效。
6. 排错
| 现象 | 处理 |
|---|---|
| 侧边栏没有「临时任务」这一行 | 确认插件装在这个 profile 上;看 DSH 日志有没有 [dsh-temptask];窄栏折叠时它只剩一个图标。若日志里有 skipping profile bundle,说明 DSH 版本不在支持范围内(见 §1) |
在 desktop profile 上 dsh plugin 被拒 | 预期行为:desktop 是 Electron 保留名,请在应用内的插件管理界面操作 |
| 设置里看不到「临时任务」这一节 | 该宿主没挂设置表单;改配置的点 ⚙(写入 <dataDir>/config.json),功能不受影响 |
| 改了插件,行为还是旧的 | 插件分两半:后端只在 DSH 启动时加载 → 必须重启 DSH;界面刷新页面就更新。设置卡片页脚写着两半版本,不一致时会提示「重启 DSH」 |
| 工作区名一直是时间戳 | 预期行为:工作区名 = 目录名(DSH 的默认语义),插件不改写它。DSH 总结的会话标题显示在会话行上。想改名字就在工作区上右键重命名 |
| 建任务报「无法创建任务根目录」 | 改 rootDir,或检查 <DSH_HOME> 的写权限 |
| 设置卡片出现「记录损坏…已备份重建」 | 看 <dataDir>/tasks.json.bak 找回旧记录 |
/temptask open 说「任务目录不存在」 | 目录被手工删了:清理掉这条记录后重新新建 |
| 打开了任务但页面没跳 | 直接点侧边栏对应的工作区即可(自动跳转有约 2.5 秒的轮询延迟) |
| 转正后新工作区里只有空会话 | 当时没勾「把对话带过去」,或那条会话没有已完成的一轮 → 用 /temptask repair <新工作区路径> 把历史接回来 |
| 临时目录被删后对话打不开 | 同上:/temptask repair <某个正常的工作区路径> |
| 转正报「目录被占用」 | 关掉那个任务的会话/终端(Windows 上只要还有程序待在那个目录里就搬不动);此时不会有任何改动 |
7. 已知限制
- 插件不删会话:DSH 没有删除接口(日志只追加),本插件只归档。归档可以取消,但日志会一直留在磁盘上; 要彻底抹掉得在 DSH 关闭时手工删文件(见 §3)。
- 删除工作区也不等于删干净:官方只删
workspace.json里那条记录,文件夹与该工作区的会话都留着, 而会话日志头部存着明文cwd。要连痕迹一起清掉得手工做,步骤见 §3《想连痕迹一起清掉》。 - 转正只复刻"已完成的一轮":最后一个回合还没收尾的内容不会被带过去;一个已完成回合都没有时 会退化成空会话并如实说明。
- 转正的目标不能落在任务根目录内部:那会被自动登记成新的临时任务,等于原地打转。
- 侧边栏那一行内部的按钮屏幕阅读器读不到(这一行是官方按"导航按钮"渲染的,内部内容被标成
装饰性内容);同样的动作在「设置 → 插件 → 临时任务」与
/temptask命令里都能用键盘完成。 - 多个 profile 同时运行时共用一份
tasks.json:写入前会在锁内重读磁盘、按 id 合并, 极端情况下仍有亚毫秒级的覆盖窗口。
8. 给维护者
实现细节、为什么这样设计、逐条核对过哪些官方语义、被否掉的方案、测试与发版流程,都在
docs/DESIGN.md。
License
MIT
Похожие плагины
billion-context
ranxianglei/billion-context
dsh-web-ui (dsh-chat-recovery)
zhu1090093659/dsh-web-ui
dsh-synapse
liangmianya/dsh-synapse
dsh-archive-manager
michengai/dsh-archive-manager