# Session Cleaner

> 清理 DeepSeek Harness 的会话与工作区——归档会话（从会话列表删除）、移除 workspace 分组、彻底删除会话日志。全部通过本地 Web API（http://127.0.0.1:3080）操作，一致性由 DSH 自己保证。

- Skill: `andersonlin4/session-cleaner` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add andersonlin4/session-cleaner`
- Raw SKILL.md: https://api.skillmd.com/api/skills/andersonlin4/session-cleaner/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: AndersOnLin4 (https://skillmd.com/u/andersonlin4)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/andersonlin4/session-cleaner

---


# DSH 会话清理（Session Cleaner）

通过 DSH 本地 API 删除/归档会话与工作区，不触碰存储文件。

## 铁律（必须遵守）

1. **绝不直接编辑** `G:\harness\dsh-home\storages\workspace.json` 和 `session_projcache.json`。
   运行中的 dsh 进程会把内存状态回写磁盘，直接改文件几秒内被覆盖还原，产生"删不掉"的假象。所有操作只走 API。
2. **删除 = 归档**。`workspace.archiveSession` 是 DSH 的删除语义：会话从所有列表消失，但日志文件保留在 `sessions\` 目录（不占列表、可后续物理清除）。
3. **归档不可逆**：当前 API 没有 unarchive，归档后无法从 GUI 恢复。**执行前必须向用户复述将删除的会话（标题 + 编号），得到确认后才调用**（可加 `-Force` 跳过脚本内确认，但 SKILL.md 的确认义务不变）。
4. **物理删除（purge-files）更危险**：把会话日志目录真正删掉。仅当用户明确说"彻底删除"时才用，且必须二次确认。

## 用法（pwsh 工具里执行，每条一行）

```powershell
$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：

```powershell
$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 四个动作。
