# @huangzhaoyu/dsh-trashbin — DSH 回收站（删除冷静区）

> 归档的对话进入回收站，7 天内可反悔恢复；7 天自动清理，绝不物理删除对话内容。

![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)
![DSH Plugin](https://img.shields.io/badge/DSH-plugin-blue.svg)

---

## 这是什么？

DSH（DeepSeek Harness）的「归档会话」默认只把对话从侧边栏隐藏，**没有任何地方能看到已归档的对话**，更无法恢复——归档等于"永久消失"。

本插件给归档加了一个**回收站（删除冷静区）**：

- 📥 归档的对话进入回收站（侧边栏左下角设置按钮旁新增按钮）
- ↩️ 7 天内可随时**恢复**，回到原来所在的工作区
- 🗑️ 可手动**移除**，或等待 **7 天自动清理**
- 🔒 所有操作**永不删除会话日志**（`~/.dsh/sessions` 完好保留，只是从界面消失）

## 安装

> **所有安装方式都需要重启 DSH**（UI 插件是"一次性 surface"，重启后才会加载）。

### 方式 A：一条命令（推荐，需有 `dsh` 命令）

```sh
dsh plugin --profile web add @huangzhaoyu/dsh-trashbin
# 然后重启 DSH
```

没有全局 `dsh` 命令时，用 node 直接调用：

```powershell
node "你的DSH路径\node_modules\@deepseek-ai\dsh\lib\bin.js" plugin --profile web add @huangzhaoyu/dsh-trashbin
```

### 方式 B：脚本安装（Windows，本地下载）

```powershell
powershell -ExecutionPolicy Bypass -File install.ps1
# 然后重启 DSH
```

脚本会自动：备份 → 复制到 profile → 注册依赖与 bundles → 验证文件完整性。

### 方式 C：手动安装

1. 复制 `dsh-trashbin` 目录到 `~/.dsh/profiles/web/node_modules/@huangzhaoyu/`
2. 在 `~/.dsh/profiles/web/package.json` 的 `dependencies` 加 `"@huangzhaoyu/dsh-trashbin": "^0.1.0"`
3. 在 `dsh.profile.bundles` 数组追加 `"@huangzhaoyu/dsh-trashbin"`
4. 重启 DSH

### 卸载

```powershell
powershell -ExecutionPolicy Bypass -File uninstall.ps1
# 然后重启 DSH
```

或从 bundle 列表和 dependencies 中移除 `@huangzhaoyu/dsh-trashbin`，重启 DSH。

## 功能细节

| 功能 | 说明 |
|------|------|
| 回收站入口 | 侧边栏左下角设置按钮旁 · 垃圾桶图标 |
| 回收站面板 | 显示归档时间 / 剩余天数 / 原工作区 / 标题 |
| 恢复 | 从归档集合移除，会话回到原工作区原位置 |
| 移除 | 从回收站消失（保持归档，界面再也不显示） |
| 7 天清理 | 归档超 7 天未恢复自动移除（剩余 ≤2 天红色警示） |
| 空状态 | "回收站是空的"提示 |

## 安全设计

- **不改 DSH 核心**：独立包，走官方 bundle + client 双面机制挂载
- **不删日志**：`~/.dsh/sessions` 任何文件都不被触碰
- **写链安全**：恢复操作走 storage domain 同一写链，与 DSH 自身写入安全排队
- **幂等**：恢复不存在/未归档的会话不报错
- **可回滚**：install.ps1 备份 package.json，uninstall.ps1 一键还原

## 已知说明

- 回收站状态（归档时间等）存浏览器 `localStorage`；清缓存后会丢失时间信息，表现为归档对话全部立即显示为"过期"（不影响归档本身，不崩溃）
- 7 天过滤在打开回收站时触发；连续 7 天不开则清理顺延到下次打开（无感知差异）

## 结构

```text
dsh-trashbin/
├── package.json       # dsh.bundle.patch + dsh.client 双面声明
├── cordis.patch.yml   # 注册 trashbin 行到 profile
├── install.ps1        # 安装脚本（备份+回滚）
├── uninstall.ps1      # 卸载脚本
└── lib/
    ├── index.js       # host 半边：/trash/unarchive 路由 + 存储域写入
    └── client.js      # browser 半边：回收站按钮 + 面板 UI + localStorage 状态
```

## License

[MIT](LICENSE)

*为 DSH 社区与昭瑜自制 🐟*