DSH 会话清理(Session Cleaner)
通过 DSH 本地 API 删除/归档会话与工作区,不触碰存储文件。
铁律(必须遵守)
- 绝不直接编辑
G:\harness\dsh-home\storages\workspace.json和session_projcache.json。 运行中的 dsh 进程会把内存状态回写磁盘,直接改文件几秒内被覆盖还原,产生"删不掉"的假象。所有操作只走 API。 - 删除 = 归档。
workspace.archiveSession是 DSH 的删除语义:会话从所有列表消失,但日志文件保留在sessions\目录(不占列表、可后续物理清除)。 - 归档不可逆:当前 API 没有 unarchive,归档后无法从 GUI 恢复。执行前必须向用户复述将删除的会话(标题 + 编号),得到确认后才调用(可加
-Force跳过脚本内确认,但 SKILL.md 的确认义务不变)。 - 物理删除(purge-files)更危险:把会话日志目录真正删掉。仅当用户明确说"彻底删除"时才用,且必须二次确认。
用法(pwsh 工具里执行,每条一行)
$s = '<本 skill 目录>\scripts\session-cleaner.ps1' # 已设 DSH_HOME 时也可:Join-Path $env:DSH_HOME 'skills\session-cleaner\scripts\session-cleaner.ps1'
Set-ExecutionPolicy -Scope Process Bypass -Force
# 1) 列出全部会话(按 workspace 分组,含标题/运行态/归档标记)
& $s -Action list
# 2) 归档某个会话(先 list 拿 id;-Force 跳过交互确认)
& $s -Action archive -SessionId 'session-8992e893-294c-4754-ba85-192a49bb6a07' -Force
& $s -Action archive -SessionId 'id1','id2','id3' -Force # 批量
# 3) 按标题模糊匹配归档(匹配多个时列出候选,需 -Force 全部归档)
& $s -Action archive -SessionTitle '天气' -Force
# 4) 移除 workspace 分组(不删目录与文件,分组从列表消失)
& $s -Action delete-workspace -WorkspaceId 'a4fa0353-225e-4754-9f36-3e2d164eb5ca' -Force
# 5) 彻底删除会话日志文件(归档后仍想清磁盘 —— 高危,二次确认)
& $s -Action purge-files -SessionId 'session-8992e893-294c-4754-ba85-192a49bb6a07' -Force
参数速查
| 参数 | 说明 |
|---|---|
-Action |
list | archive | delete-workspace | purge-files(必填) |
-SessionId |
会话 id,支持逗号分隔多个 |
-SessionTitle |
标题子串匹配(仅 archive 用;匹配多个需 -Force) |
-WorkspaceId |
workspace id(仅 delete-workspace 用) |
-Force |
跳过脚本内确认 |
-BaseUrl |
默认 http://127.0.0.1:3080;端口变了就传 |
排障
- 连接失败 / 400 → dsh web 没在运行(检查
start-dsh.cmd),或端口不同(-BaseUrl)。 - session-not-found → id 写错,或该会话已归档(归档的会话再归档/操作会报此错)。
- 列表中标题为空 → 新会话还没有标题快照,属正常;按 id 区分。
- 脚本报中文乱码 → 脚本必须是带 BOM 的 UTF-8;若被改坏,用下面命令补 BOM:
$p = $s # 即上面已赋值的 session-cleaner.ps1 完整路径
$c=[System.IO.File]::ReadAllText($p,[System.Text.UTF8Encoding]::new($false))
[System.IO.File]::WriteAllText($p,$c,[System.Text.UTF8Encoding]::new($true))
变更日志
- v1.0.0:初版,封装 list / archive / delete-workspace / purge-files 四个动作。