@device1999/dsh-session-archive-delete 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/LICENSE +21 -0
- package/README.md +157 -2
- package/assets/client.js +1083 -0
- package/assets/screenshot-menu.png +0 -0
- package/assets/screenshot-settings.png +0 -0
- package/cordis.patch.yml +7 -0
- package/lib/backup.js +221 -0
- package/lib/delete.js +252 -0
- package/lib/index.js +830 -0
- package/lib/paths.js +105 -0
- package/lib/store.js +77 -0
- package/lib/subtree.js +138 -0
- package/package.json +58 -5
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
4
|
+
|
|
5
|
+
## [0.1.1] - 2026-10-20
|
|
6
|
+
|
|
7
|
+
### 文档
|
|
8
|
+
|
|
9
|
+
- README 增加会话菜单与设置页截图
|
|
10
|
+
- 包名改为 scope 形式 @device1999/dsh-session-archive-delete
|
|
11
|
+
|
|
12
|
+
### 修复
|
|
13
|
+
|
|
14
|
+
- 客户端模块 id 与包名保持一致,避免重复 factory 注册导致 web boot 失败
|
|
15
|
+
- 移除多余的 <script> 兜底注入路径
|
|
16
|
+
|
|
17
|
+
## [0.1.0] - 2026-10-20
|
|
18
|
+
|
|
19
|
+
### 新增
|
|
20
|
+
|
|
21
|
+
- 会话「…」菜单集成:「备份删除」与「彻底删除」两个入口
|
|
22
|
+
- 备份流水线:复制会话目录、投影缓存与元数据快照,逐文件校验后才删除
|
|
23
|
+
- 子代理会话处理:按 `parentSession` 递归收集子树,一起备份、一起删除
|
|
24
|
+
- 删除模式设置:两项同时显示 / 只显示备份删除 / 只显示彻底删除
|
|
25
|
+
- 备份位置设置:系统文件夹对话框选择,或直接编辑路径
|
|
26
|
+
- 备份文件夹命名:日期+主题 / ID前八位+主题 / 纯主题 / 前八位+主题+日期
|
|
27
|
+
- 路径校验接口:无效路径当场提示并回滚
|
|
28
|
+
- 每个备份文件夹生成 `RESTORE.txt` 恢复说明
|
|
29
|
+
|
|
30
|
+
### 安全
|
|
31
|
+
|
|
32
|
+
- 删除前先把会话引用从 `workspace.json` 摘除并落盘,防止宿主内存状态写回
|
|
33
|
+
- 删除后复查 3 次,防止文件句柄重建目录
|
|
34
|
+
- 会话目录必须位于 `~/.dsh/sessions` 下且目录名与会话 id 完全一致
|
|
35
|
+
- 运行中会话先取消当前轮次再删除
|
|
36
|
+
|
|
37
|
+
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dsh-archive-delete contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,158 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-session-archive-delete
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
给 DeepSeek Harness(DSH)的会话列表加一个安全的「删除」入口:**先完整备份到本地,校验通过后才删除**。
|
|
4
|
+
|
|
5
|
+
装上之后,在侧栏任意会话的「…」菜单最下方会多出删除选项:
|
|
6
|
+
|
|
7
|
+
<img src="assets/screenshot-menu.png" width="200" alt="会话菜单">
|
|
8
|
+
|
|
9
|
+
## 为什么需要它
|
|
10
|
+
|
|
11
|
+
DSH 只有「归档」,没有删除。想真正释放磁盘空间就得手动去找
|
|
12
|
+
`~/.dsh/sessions/<工作区>/<uuid>/` 删目录,同时还要手动清理
|
|
13
|
+
`workspace.json` 和投影缓存——漏一步,侧栏就会留下点不开的空壳会话。
|
|
14
|
+
|
|
15
|
+
本插件把这件事做成一条安全的流水线:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
确认 → 复制会话目录 + 缓存 + 元数据快照 → 逐文件校验 → 删除原件 → 清理账本
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
任何一步失败都会中止,原会话保持完好。
|
|
22
|
+
|
|
23
|
+
## 功能
|
|
24
|
+
|
|
25
|
+
| 功能 | 说明 |
|
|
26
|
+
|---|---|
|
|
27
|
+
| 备份删除 | 把会话完整备份到指定文件夹,校验通过后再删 |
|
|
28
|
+
| 彻底删除 | 不备份,直接删除 |
|
|
29
|
+
| 两种模式并存 | 菜单可同时显示两个选项,也可只显示其一 |
|
|
30
|
+
| 子代理会话 | 自动找出该会话派生的所有子代理,一起备份、一起删除 |
|
|
31
|
+
| 自定义备份位置 | 系统文件夹对话框选择,或直接输入路径 |
|
|
32
|
+
| 四种命名方式 | 日期+主题 / ID前八位+主题 / 纯主题 / 前八位+主题+日期 |
|
|
33
|
+
| 路径校验 | 无效路径当场提示,不会写入设置 |
|
|
34
|
+
| 一键恢复 | 每个备份文件夹带 `RESTORE.txt`,按说明复制回去即可 |
|
|
35
|
+
|
|
36
|
+
<img src="assets/screenshot-settings.png" width="720" alt="设置页">
|
|
37
|
+
|
|
38
|
+
## 安装
|
|
39
|
+
|
|
40
|
+
### 方式一:在 DSH 界面里装(推荐)
|
|
41
|
+
|
|
42
|
+
左侧栏 **插件** → 右上角 **添加插件** → 输入包名安装:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
@device1999/dsh-session-archive-delete
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
装完重启 DSH。
|
|
49
|
+
|
|
50
|
+
### 方式二:命令行
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
dsh plugin --profile <profile> add @device1999/dsh-session-archive-delete
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`<profile>` 通常是 `desktop` 或 `web`,可在 `~/.dsh/profiles/` 下看到。
|
|
57
|
+
|
|
58
|
+
### 方式三:从源码本地开发
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
git clone https://github.com/device1999/dsh-session-archive-delete.git
|
|
62
|
+
dsh plugin --profile desktop add file:/path/to/dsh-session-archive-delete
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
或在 profile 的 `package.json` 里写 `link:` 依赖,然后在 `node_modules` 里建一个
|
|
66
|
+
指向源码目录的 junction(Windows)或 symlink(macOS / Linux)。
|
|
67
|
+
|
|
68
|
+
## 使用
|
|
69
|
+
|
|
70
|
+
### 删除一个会话
|
|
71
|
+
|
|
72
|
+
1. 侧栏会话行点「…」
|
|
73
|
+
2. 选「备份删除」或「彻底删除」
|
|
74
|
+
3. 确认框里核对会话名、ID 和备份路径
|
|
75
|
+
4. 点「确认」
|
|
76
|
+
|
|
77
|
+
删除成功后侧栏会立即刷新;如果删的是当前会话,会自动跳到下一个。
|
|
78
|
+
|
|
79
|
+
### 设置
|
|
80
|
+
|
|
81
|
+
**设置 → 备份删除**:
|
|
82
|
+
|
|
83
|
+
| 设置项 | 选项 |
|
|
84
|
+
|---|---|
|
|
85
|
+
| 删除模式 | 两个菜单项同时显示 / 只显示「备份删除」/ 只显示「彻底删除」 |
|
|
86
|
+
| 备份位置 | 点击选择文件夹,或直接编辑地址栏;留空 = 默认位置 |
|
|
87
|
+
| 备份文件夹命名 | 四种格式任选 |
|
|
88
|
+
|
|
89
|
+
设置保存在 `~/.dsh/dsh-session-archive-delete.json`。
|
|
90
|
+
|
|
91
|
+
### 默认备份位置
|
|
92
|
+
|
|
93
|
+
按以下优先级确定:
|
|
94
|
+
|
|
95
|
+
1. 设置里填写的路径
|
|
96
|
+
2. 环境变量 `DSH_ARCHIVE_ROOT`
|
|
97
|
+
3. 插件配置 `workspaceRoot`
|
|
98
|
+
4. 自动推断:从会话记录里选出使用最多的工作区目录
|
|
99
|
+
5. 都拿不到时:`<用户主目录>/DSH-归档会话`
|
|
100
|
+
|
|
101
|
+
> 备份位置不能设在 `~/.dsh` 内部,否则 DSH 会把它当成数据目录重新扫描。
|
|
102
|
+
|
|
103
|
+
## 备份结构
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
<备份位置>/<按命名规则生成的文件夹>/
|
|
107
|
+
sessions/<工作区目录>/<会话id>/ 会话原始文件(保留原名)
|
|
108
|
+
projcache/<会话id>.json 界面投影缓存
|
|
109
|
+
meta/workspace.json 删除前的元数据快照
|
|
110
|
+
meta/session_projcache.json
|
|
111
|
+
manifest.json 清单:完整 id、标题、大小、子代理列表
|
|
112
|
+
RESTORE.txt 恢复步骤
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
子代理会话也备份在同一个文件夹的 `sessions/` 下,清单里列在 `subagents` 字段。
|
|
116
|
+
|
|
117
|
+
## 恢复一个会话
|
|
118
|
+
|
|
119
|
+
详见每个备份文件夹里的 `RESTORE.txt`,大意是:
|
|
120
|
+
|
|
121
|
+
1. 完全退出 DSH
|
|
122
|
+
2. 把 `sessions/<工作区>/<会话id>` 复制回 `~/.dsh/sessions/<工作区>/`
|
|
123
|
+
3. 把 `projcache/<会话id>.json` 复制回 `~/.dsh/storages/session_projcache/sessions/`
|
|
124
|
+
4. 在 `~/.dsh/storages/workspace.json` 里把会话 id 加回对应工作区的 `sessionIds`
|
|
125
|
+
5. 启动 DSH
|
|
126
|
+
|
|
127
|
+
## 安全性
|
|
128
|
+
|
|
129
|
+
- **不删未校验的内容**:复制后逐文件比对大小与数量,不一致就中止
|
|
130
|
+
- **删前先摘账本**:先把引用从 `workspace.json` 移除并落盘,再删文件,
|
|
131
|
+
避免 DSH 内存状态把引用写回
|
|
132
|
+
- **删后复查**:目录删除后检查 3 次,防止文件句柄重建目录
|
|
133
|
+
- **路径边界校验**:会话目录必须位于 `~/.dsh/sessions` 下,且目录名与会话 id 完全一致
|
|
134
|
+
- **运行中会话**:先取消当前轮次再删除,不会留下半截日志
|
|
135
|
+
|
|
136
|
+
## 系统要求
|
|
137
|
+
|
|
138
|
+
- DSH 0.2.x(Web / 桌面客户端)
|
|
139
|
+
- Windows / macOS / Linux
|
|
140
|
+
- 系统文件夹对话框依赖 PowerShell 7(Windows)。没有 pwsh 时会自动回退到页面内目录浏览
|
|
141
|
+
|
|
142
|
+
## 已知限制
|
|
143
|
+
|
|
144
|
+
- 默认备份位置依赖宿主提供的 `sessionQuery` 服务来推断工作区;取不到时回退到用户主目录
|
|
145
|
+
- 子代理关系来自会话 header 的 `parentSession` 字段,会话文件是 zstd 压缩,无法纯读盘解析
|
|
146
|
+
- 备份是完整复制,大会话会占用相应磁盘空间
|
|
147
|
+
|
|
148
|
+
## 卸载
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
dsh plugin --profile <profile> remove dsh-session-archive-delete
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
重启 DSH。已生成的备份文件夹不会被删除,可按需自行清理。
|
|
155
|
+
|
|
156
|
+
## License
|
|
157
|
+
|
|
158
|
+
MIT
|