dsh-archived-chats 0.10.0 → 0.12.0
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/README.en.md +84 -22
- package/README.md +84 -22
- package/assets/screenshots/01-archive-entry.png +0 -0
- package/assets/screenshots/01b-archive-success.png +0 -0
- package/assets/screenshots/02-archived-overview.png +0 -0
- package/assets/screenshots/03-full-text-search.png +0 -0
- package/assets/screenshots/04-conversation-preview.png +0 -0
- package/assets/screenshots/05-metadata-editor.png +0 -0
- package/assets/screenshots/06-bulk-selection.png +0 -0
- package/assets/screenshots/07-import-preview.png +0 -0
- package/assets/screenshots/08-move-undo.png +0 -0
- package/assets/screenshots/09-recycle-restore.png +0 -0
- package/assets/screenshots/10-permanent-delete.png +0 -0
- package/assets/screenshots/11-storage-retention.png +0 -0
- package/assets/screenshots/12-storage-details.png +0 -0
- package/assets/screenshots/13-retention-preview.png +0 -0
- package/assets/screenshots/14-origins-branches.png +0 -0
- package/docs/ARCHITECTURE.en.md +33 -26
- package/docs/ARCHITECTURE.md +33 -26
- package/lib/client.js +1420 -81
- package/lib/index.js +310 -37
- package/lib/insights.js +190 -0
- package/lib/lineage.js +247 -0
- package/lib/recycle.js +454 -0
- package/lib/retention-service.js +217 -0
- package/lib/retention.js +263 -0
- package/lib/snapshot.js +603 -0
- package/lib/trash.js +359 -0
- package/lib/types/client/index.d.ts +142 -8
- package/lib/types/index.d.ts +116 -4
- package/package.json +18 -2
- package/assets/screenshots/1-archived-chats.png +0 -0
- package/assets/screenshots/2-search.png +0 -0
- package/assets/screenshots/3-delete-confirm.png +0 -0
- package/assets/screenshots/4-group-menu.png +0 -0
- package/assets/screenshots/5-metadata-editor.png +0 -0
- package/assets/screenshots/6-bulk-actions.png +0 -0
- package/assets/screenshots/7-import-preview.png +0 -0
- package/assets/screenshots/8-conversation-preview.png +0 -0
package/README.en.md
CHANGED
|
@@ -1,15 +1,31 @@
|
|
|
1
1
|
# dsh-archived-chats
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/dsh-archived-chats)
|
|
4
|
+
[](https://www.npmjs.com/package/dsh-archived-chats)
|
|
5
|
+
[](https://github.com/Ultronen/dsh-archived-chats/actions/workflows/ci.yml)
|
|
6
|
+
[](https://awesome-dsh-plugin.com/p/Ultronen/dsh-archived-chats/)
|
|
7
|
+
|
|
3
8
|
[English](README.en.md) | [中文](README.md)
|
|
4
9
|
|
|
5
10
|
> 🔎 **Archived no longer means lost.** Search conversation content, read complete messages and tool calls, then back up, restore, or delete safely.
|
|
6
11
|
|
|
7
|
-
>
|
|
12
|
+
> ♻️ **Removing an archived chat from this plugin is undoable.** The plugin first creates a local recovery snapshot containing the session and attachments, then moves it to the Recycle Bin. Physical removal happens only after an explicit **Delete permanently** action in the Recycle Bin.
|
|
8
13
|
|
|
9
|
-
A local
|
|
14
|
+
A local archived-chat manager for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness): search and preview complete conversations, back up and restore sessions, and safely manage history with an undoable Recycle Bin, recovery snapshots, retention policies, and Origins & Branches.
|
|
10
15
|
|
|
11
16
|
Once a conversation is archived in DeepSeek Harness it disappears from the sidebar, and there is no built-in way to browse it again — only the workspace store (`~/.dsh/storages/workspace.json`) still remembers it. This plugin adds an **Archived Chats** page under Settings where every archived session is visible, searchable, and manageable.
|
|
12
17
|
|
|
18
|
+
[Plugin market](https://awesome-dsh-plugin.com/p/Ultronen/dsh-archived-chats/) · [npm](https://www.npmjs.com/package/dsh-archived-chats) · [Releases](https://github.com/Ultronen/dsh-archived-chats/releases) · [Questions and feedback](https://github.com/Ultronen/dsh-archived-chats/discussions) · [Private vulnerability reporting](https://github.com/Ultronen/dsh-archived-chats/security/advisories/new)
|
|
19
|
+
|
|
20
|
+
<p align="center">
|
|
21
|
+
<a href="assets/screenshots/04-conversation-preview.png"><img src="assets/screenshots/04-conversation-preview.png" width="49%" alt="Full-text search and read-only preview for archived chats"></a>
|
|
22
|
+
<a href="assets/screenshots/11-storage-retention.png"><img src="assets/screenshots/11-storage-retention.png" width="49%" alt="Storage and Retention with session directories, recovery snapshots, and policy controls"></a>
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
<p align="center"><sub>Search and read without unarchiving first; removing an archived chat here moves it through a recovery-snapshot Recycle Bin.</sub></p>
|
|
26
|
+
|
|
27
|
+
If this plugin helps you recover or protect an important conversation, consider starring the repository so people who need archived-chat recovery can discover it more easily.
|
|
28
|
+
|
|
13
29
|
## 🚀 Install
|
|
14
30
|
|
|
15
31
|
```sh
|
|
@@ -26,32 +42,41 @@ dsh plugin --profile web update dsh-archived-chats
|
|
|
26
42
|
|
|
27
43
|
## Compatibility
|
|
28
44
|
|
|
29
|
-
|
|
45
|
+
The full 0.12.0 feature target is DeepSeek Harness `0.1.1-rc.2`. Older hosts can still expose the archive list, but missing persistence, attachment, or live-session lifecycle capabilities produce explicit errors for recycle, storage, or lineage features instead of guessed internal writes.
|
|
30
46
|
|
|
31
47
|
## Preview
|
|
32
48
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-

|
|
52
|
+

|
|
53
|
+

|
|
54
|
+

|
|
55
|
+

|
|
56
|
+

|
|
57
|
+

|
|
58
|
+

|
|
59
|
+

|
|
60
|
+

|
|
61
|
+

|
|
62
|
+

|
|
63
|
+

|
|
64
|
+

|
|
65
|
+

|
|
43
66
|
|
|
44
67
|
## Usage
|
|
45
68
|
|
|
46
|
-
1. Archive a conversation from the normal DSH session menu. Archiving removes
|
|
69
|
+
1. Archive a conversation from the normal DSH session menu. After the Host confirms success, a **Chat archived** notice appears at the top for three seconds with direct **View** and **Undo** actions; hovering or focusing it pauses the timer. Archiving removes the chat from the sidebar but keeps its session data in the workspace store.
|
|
47
70
|
2. Open **Settings → Archived Chats**. The page groups archived conversations by workspace and remembers collapsed groups in this browser.
|
|
48
71
|
3. Search titles, tags, notes, conversation text, or tool output. Open the row preview to read an archived conversation without unarchiving it. Click **Select multiple** only when you need bulk actions.
|
|
49
72
|
4. Click **Import backup** to choose a ZIP produced by this plugin and confirm non-conflicting sessions after the preview. Click **Export backup** to export the current selection, or every archived chat when nothing is selected. Individual rows also have an export action.
|
|
50
|
-
5. Choose **Unarchive** to return a conversation to the sidebar.
|
|
73
|
+
5. Choose **Unarchive** to return a conversation to the sidebar. **Move to Recycle Bin** creates a protection snapshot and offers immediate **Undo**; the session can also be restored later from the **Recycle Bin** tab. Only **Delete permanently / Empty Recycle Bin** removes originals and snapshots irreversibly.
|
|
74
|
+
6. Open **Storage & Retention** to measure archived/recycled session directories and recovery snapshots this plugin created and retained for them. Restoring a chat may retain its snapshot, so storage can remain when the archive list is empty. Counts apply separately to each original chat; saving performs no cleanup until exact candidates are previewed and applied. **Origins & Branches** uses a collapsible connector tree to show where archived/recycled chats came from and which sessions branched from them, with project filtering and search.
|
|
51
75
|
|
|
52
76
|
## Features
|
|
53
77
|
|
|
54
78
|
- **Complete archived-session list**, grouped by workspace (project) with a per-group count. Every group can be collapsed or expanded, and the state is remembered per browser.
|
|
79
|
+
- **Archive success notice**: after a chat is archived, a compact frame-wide notice remains for three seconds with **View**, **Undo**, and close actions. Pointer hover or keyboard focus pauses the timer, active View/Undo work cannot time out, and failures retain a retry action.
|
|
55
80
|
- **Full-text conversation search**: one search field matches titles, workspaces, tags, notes, user messages, assistant answers, and tool results, with a readable hit excerpt on each matching row.
|
|
56
81
|
- **Native archived conversation preview and turn navigation**: follow the Harness conversation layout with user messages on the right and assistant messages on the left; present Markdown, reasoning, tool activity, JSON, code, and available stored images read-only, while retaining a responsive turn rail for quick jumps. If the host lacks attachment capability, only images degrade and the rest of the preview remains readable.
|
|
57
82
|
- **Filter and sort** by type (all / regular / subagent), project, and tag; then order results by newest, oldest, or title.
|
|
@@ -60,12 +85,25 @@ Screenshots 1–7 were captured from 0.9.0 in a local DeepSeek Harness `0.1.0-rc
|
|
|
60
85
|
- **JSON + Markdown backups**: export one row, the current selection, or every archived chat as a ZIP. Each package has a versioned manifest, a lossless machine-readable session record, and a human-readable transcript for every included session.
|
|
61
86
|
- **Preview-first import and restore**: choose a ZIP backup, inspect every session before writing, preselect only non-conflicting IDs, and restore selected sessions as archived chats. Existing IDs are skipped and never overwritten.
|
|
62
87
|
- **Compact top-level actions**: common **Import backup** / **Export backup** actions are direct, while the low-frequency destructive action lives under **More**. The page stays focused on DSH archive management without a persistent source selector or redundant menus.
|
|
63
|
-
- **On-demand multi-select**: checkboxes stay hidden by default and appear only after clicking **Select multiple**. Select individual chats, every visible result, or an entire project; the selection bar can export, unarchive, or
|
|
88
|
+
- **On-demand multi-select**: checkboxes stay hidden by default and appear only after clicking **Select multiple**. Select individual chats, every visible result, or an entire project; the selection bar can export, unarchive, or move the chosen chats to the Recycle Bin, while selections hidden by another filter remain intact.
|
|
64
89
|
- **Unarchive** a single chat or a whole project group from the group's `⋯` menu — restored chats reappear in the sidebar immediately.
|
|
65
|
-
- **
|
|
66
|
-
-
|
|
90
|
+
- **Four archive-management views**: Archived, Recycle Bin, Storage & Retention, and Origins & Branches. Recycled rows stay grouped by their original workspace, each group can collapse independently, and rows show trash time, snapshot size, attachment count, and `trashed` / `degraded` / `purge-pending` state. Checkboxes stay hidden until **Select multiple** is activated.
|
|
91
|
+
- **Storage analysis**: separately measures archived/recycled session directories and plugin-owned snapshots, with unavailable/degraded diagnostics and repeated snapshot-attachment bytes. Searchable detail dialogs open from the summary cards, so long inventories never push retention controls down the page. It does not label these numbers as globally reclaimable Harness attachment storage.
|
|
92
|
+
- **Preview-first retention policies**: plan by retained recovery snapshots per original chat, snapshot age, snapshot quota, and recycle age. The default keeps one recovery snapshot per original chat. Saving never runs cleanup; snapshots in use by Recycle Bin or unavailable snapshots are excluded and permanent recycle purges start unselected.
|
|
93
|
+
- **Read-only Origins & Branches**: uses durable Harness `parentSession` fields to show the sources, forks, and subagent trees of archived/recycled chats, retaining only the parent/child context needed to explain them. Unrelated active chats are not sent to the browser. Managed cards keep source copy inside the card and put a centered disclosure arrow on its own bottom row; users can click the whole card or arrow to fold, copy the full ID, use project/status filters, and expand or collapse all. Searching titles, projects, or IDs automatically reveals matching paths; an independently scrolling tree keeps large datasets from extending the page, and root branches default to collapsed above 50 nodes. Missing parents, cycles, and delegation-depth mismatches are diagnosed without rewriting relationships.
|
|
94
|
+
- **Automatic recovery snapshots and retained history**: moving an archived chat to Recycle Bin captures all events plus verified image bytes. Restore removes the recycle record but deliberately retains the validated snapshot, so retained recovery storage can exist with an empty archive list. Repeated restore/recycle cycles retain older valid snapshots until the user explicitly applies retention or permanently purges the chat.
|
|
95
|
+
- **Two-level restore**: when the original session is intact, restore only removes the recycle marker and does not rewrite persistence. If the original is missing, the plugin falls back to the validated session-and-attachment snapshot through public writer capabilities, never overwriting an existing ID.
|
|
96
|
+
- **Explicit permanent purge**: only the Recycle Bin exposes permanent delete and empty. The plugin records durable `purge-pending` crash intent before deleting the original and snapshot; interrupted purges retry at startup.
|
|
67
97
|
- Works in light and dark schemes; localized in English and 中文.
|
|
68
98
|
|
|
99
|
+
## Recycle Bin, privacy, and attachment limits
|
|
100
|
+
|
|
101
|
+
The recycle catalog (`trash.json`) and protection snapshots live under `$DSH_HOME/plugin-data/archived-chats/` and stay on this machine. Attachment bytes are read one at a time, digest-verified, and atomically published; neither conversations nor attachments are uploaded. Recycle previews use a separate authorized scope.
|
|
102
|
+
|
|
103
|
+
Retention policy lives in `retention.json` under the same directory. Policies never run in the background, at startup, or on a timer; every cleanup requires a single-use five-minute preview followed by explicit selection and confirmation.
|
|
104
|
+
|
|
105
|
+
Permanent purge removes the snapshot's attachment copies, but Harness's global attachment store may retain identical bytes because another session still references them or because the host applies its own garbage-collection policy. This plugin does not claim immediate global attachment GC.
|
|
106
|
+
|
|
69
107
|
## Tags, notes, and statistics
|
|
70
108
|
|
|
71
109
|
Tags and notes live **only on your machine** in `$DSH_HOME/plugin-data/archived-chats/metadata.json` — they are never uploaded, synced, or sent anywhere else. Unarchiving a session keeps its metadata; a completed physical deletion removes it, while a deferred or failed deletion keeps it intact. Metadata and statistics failures are always non-blocking: the list, unarchive, and deletion keep working even when the metadata store is unreadable or a session directory cannot be measured.
|
|
@@ -112,15 +150,22 @@ Attachment references are preserved in `session.json`, but attachment bytes and
|
|
|
112
150
|
</details>
|
|
113
151
|
|
|
114
152
|
<details>
|
|
115
|
-
<summary><b>
|
|
153
|
+
<summary><b>Can I restore immediately after moving a session to the Recycle Bin?</b></summary>
|
|
116
154
|
|
|
117
|
-
|
|
155
|
+
Yes. The success notice includes **Undo**, and the Recycle Bin keeps a Restore action. A live session is safely disposed or parked before the recycle record commits. If the host lacks the required capability, the move fails explicitly and leaves the archived session intact.
|
|
156
|
+
|
|
157
|
+
</details>
|
|
158
|
+
|
|
159
|
+
<details>
|
|
160
|
+
<summary><b>Why are recovery snapshots shown when there are no archived chats?</b></summary>
|
|
161
|
+
|
|
162
|
+
A recovery snapshot is created before an archived chat moves to the Recycle Bin. Restoring removes the recycle record but deliberately keeps the validated snapshot as recovery history, so it may still use storage after the archive list becomes empty. The default keeps one snapshot per original chat. To remove them, set the count to `0`, save, then run **Preview cleanup → Apply selected cleanup**. Saving alone never deletes data.
|
|
118
163
|
|
|
119
164
|
</details>
|
|
120
165
|
|
|
121
166
|
## Implementation overview
|
|
122
167
|
|
|
123
|
-
The plugin has two halves: the Host service
|
|
168
|
+
The plugin has two halves: the Host service manages archives, snapshots, the recycle catalog, and restore/purge transactions, while the browser page provides search, preview, backup, restore, and explicit confirmations. Mutations go through guarded local routes. Ordinary removal commits only a recycle record; physical removal is reachable only through the Recycle Bin's crash-safe purge flow.
|
|
124
169
|
|
|
125
170
|
User-facing storage, backup limits, deletion outcomes, and compatibility notes stay in this README. Maintainer details such as route contracts, data flow, restore transactions, live-deletion lifecycle, and failure fallbacks are documented in [ARCHITECTURE.md](docs/ARCHITECTURE.en.md).
|
|
126
171
|
|
|
@@ -134,6 +179,23 @@ The suite (`test/*.test.mjs`) covers export records and real ZIP decoding, bound
|
|
|
134
179
|
|
|
135
180
|
## Version history
|
|
136
181
|
|
|
182
|
+
### 0.12.0
|
|
183
|
+
|
|
184
|
+
- Added a three-second top notice after archive success, with direct View and Undo, hover/focus pause, and retryable failures.
|
|
185
|
+
- Added separate session/snapshot accounting, repeated snapshot-attachment totals, and unavailable/degraded diagnostics.
|
|
186
|
+
- Added count/age/quota retention planning with separate save/apply, short-lived single-use previews, and execution-time revalidation.
|
|
187
|
+
- Added a read-only Origins & Branches tree scoped to archived/recycled chats and necessary relationship context, with diagnostics for missing parents, cycles, and delegation-depth anomalies.
|
|
188
|
+
- Recycle cycles retain prior valid snapshots; permanent purge still removes the original and every valid snapshot through `purge-pending`.
|
|
189
|
+
- **Downgrade warning:** 0.11.x does not display or govern multiple histories, though it tolerates them and removes them on permanent purge. Back up `$DSH_HOME/plugin-data/archived-chats/` before downgrading.
|
|
190
|
+
|
|
191
|
+
### 0.11.0
|
|
192
|
+
|
|
193
|
+
- Added persistent **Archived / Recycle Bin** tabs, independent recycle selection, trash-scoped preview, restore, permanent purge, and empty actions.
|
|
194
|
+
- Ordinary deletion now captures a complete local protection snapshot and moves the session to recoverable trash, with immediate **Undo**.
|
|
195
|
+
- Restore prefers the intact original and falls back to a validated session-plus-attachment snapshot without overwriting an existing ID.
|
|
196
|
+
- Added durable `purge-pending` recovery, snapshot recovery/degraded states, and safe migration of legacy `pending-deletions.json` IDs into recoverable trash without silent boot deletion.
|
|
197
|
+
- **Downgrade warning:** 0.10 does not understand 0.11 recycle records or snapshots. Before downgrading, restore needed sessions in 0.11 and back up `$DSH_HOME/plugin-data/archived-chats/`.
|
|
198
|
+
|
|
137
199
|
### 0.10.0
|
|
138
200
|
|
|
139
201
|
- Added archived conversation preview that follows the Harness conversation layout, with user messages on the right, assistant messages on the left, paginated message loading, and a responsive turn rail.
|
|
@@ -201,7 +263,7 @@ The suite (`test/*.test.mjs`) covers export records and real ZIP decoding, bound
|
|
|
201
263
|
dsh plugin --profile web remove dsh-archived-chats
|
|
202
264
|
```
|
|
203
265
|
|
|
204
|
-
|
|
266
|
+
Uninstalling does not remove `metadata.json`, `trash.json`, `retention.json`, protection snapshots, or a legacy `pending-deletions.json` under `$DSH_HOME/plugin-data/archived-chats/`, and it never triggers permanent purge. Restore or back up anything you need before manually handling that directory.
|
|
205
267
|
|
|
206
268
|
## License
|
|
207
269
|
|
package/README.md
CHANGED
|
@@ -1,15 +1,31 @@
|
|
|
1
1
|
# dsh-archived-chats
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/dsh-archived-chats)
|
|
4
|
+
[](https://www.npmjs.com/package/dsh-archived-chats)
|
|
5
|
+
[](https://github.com/Ultronen/dsh-archived-chats/actions/workflows/ci.yml)
|
|
6
|
+
[](https://awesome-dsh-plugin.com/p/Ultronen/dsh-archived-chats/)
|
|
7
|
+
|
|
3
8
|
[English](README.en.md) | 中文
|
|
4
9
|
|
|
5
10
|
> 🔎 **归档不再等于消失。** 直接搜索聊天正文、阅读完整对话和工具调用,然后安全备份、恢复或删除。
|
|
6
11
|
|
|
7
|
-
>
|
|
12
|
+
> ♻️ **在本插件中移除归档聊天可以撤销。** 插件会先创建包含会话与附件的本地恢复快照,再移入回收站;只有在回收站中明确选择「永久删除」才会物理清除。
|
|
8
13
|
|
|
9
|
-
为 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)
|
|
14
|
+
为 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 新增一个本地归档聊天中心:搜索和预览完整对话,备份与恢复会话,并通过可撤销回收站、恢复快照、保留策略及来源与分支安全管理历史聊天。
|
|
10
15
|
|
|
11
16
|
在 DeepSeek Harness 里,聊天一旦归档就会从侧边栏消失,界面中没有任何入口可以再看到它,只有工作区存档(`~/.dsh/storages/workspace.json`)还记得它。这个插件在「设置」中补上一个「已归档的聊天」页面,让所有归档会话都可见、可搜索、可管理。
|
|
12
17
|
|
|
18
|
+
[插件市场](https://awesome-dsh-plugin.com/p/Ultronen/dsh-archived-chats/) · [npm](https://www.npmjs.com/package/dsh-archived-chats) · [版本发布](https://github.com/Ultronen/dsh-archived-chats/releases) · [问题交流](https://github.com/Ultronen/dsh-archived-chats/discussions) · [私密报告漏洞](https://github.com/Ultronen/dsh-archived-chats/security/advisories/new)
|
|
19
|
+
|
|
20
|
+
<p align="center">
|
|
21
|
+
<a href="assets/screenshots/04-conversation-preview.png"><img src="assets/screenshots/04-conversation-preview.png" width="49%" alt="归档聊天正文搜索与只读对话预览"></a>
|
|
22
|
+
<a href="assets/screenshots/11-storage-retention.png"><img src="assets/screenshots/11-storage-retention.png" width="49%" alt="空间与策略中的会话目录、恢复快照和保留策略"></a>
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
<p align="center"><sub>无需先取消归档即可搜索和阅读;从本插件移除归档聊天时会先进入带恢复快照的回收站。</sub></p>
|
|
26
|
+
|
|
27
|
+
如果它帮你找回或保护过一次重要对话,欢迎给仓库一个 Star——这能帮助真正需要归档恢复功能的用户更容易发现它。
|
|
28
|
+
|
|
13
29
|
## 🚀 安装
|
|
14
30
|
|
|
15
31
|
```sh
|
|
@@ -26,32 +42,41 @@ dsh plugin --profile web update dsh-archived-chats
|
|
|
26
42
|
|
|
27
43
|
## 兼容性
|
|
28
44
|
|
|
29
|
-
0.
|
|
45
|
+
0.12.0 的完整功能目标是 DeepSeek Harness `0.1.1-rc.2`。较旧宿主仍可使用归档列表,但缺少持久层、附件或运行中会话生命周期能力时,回收、空间分析或血缘功能会返回明确的能力错误,不会猜测宿主内部结构或写入不完整数据。
|
|
30
46
|
|
|
31
47
|
## 预览
|
|
32
48
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-

|
|
52
|
+

|
|
53
|
+

|
|
54
|
+

|
|
55
|
+

|
|
56
|
+

|
|
57
|
+

|
|
58
|
+

|
|
59
|
+

|
|
60
|
+

|
|
61
|
+

|
|
62
|
+

|
|
63
|
+

|
|
64
|
+

|
|
65
|
+

|
|
43
66
|
|
|
44
67
|
## 使用流程
|
|
45
68
|
|
|
46
|
-
1. 在 DSH
|
|
69
|
+
1. 在 DSH 正常聊天的会话菜单中点击归档。宿主确认成功后,页面顶部会显示 3 秒的 **已归档的聊天** 提示,可立即 **查看** 归档中心或 **撤销**;悬停或键盘聚焦时计时暂停。归档只会把会话从侧边栏隐藏,工作区存档仍会保留会话数据。
|
|
47
70
|
2. 打开 **设置 → 已归档的聊天**。页面按工作区分组,并在当前浏览器中记住分组的折叠状态。
|
|
48
71
|
3. 搜索标题、标签、备注、聊天正文或工具结果;点击行内预览按钮可直接阅读归档对话,无需先取消归档。需要多选时点击 **批量选择** 显示复选框。
|
|
49
72
|
4. 点击顶部 **导入备份** 选择本插件导出的 ZIP,预览后确认无冲突会话;点击 **导出备份** 导出当前选中项,未选择时导出全部归档会话。单条会话也可以从行内操作导出。
|
|
50
|
-
5. 点击 **取消归档**
|
|
73
|
+
5. 点击 **取消归档** 将会话放回侧边栏;点击 **移至回收站** 会创建保护快照,可立即点击 **撤销**,也可稍后在 **回收站** 标签恢复。只有回收站中的 **永久删除 / 清空回收站** 会不可撤销地移除原会话和快照。
|
|
74
|
+
6. 打开 **空间与策略** 查看归档/回收站会话目录,以及本插件为它们创建并保留的恢复快照。恢复聊天后快照仍可保留,所以归档列表为空时这里仍可能有数据。保留数量按每个原会话分别计算;保存策略不会执行清理,必须再预览并确认具体候选。**来源与分支** 用可折叠的连接线分支树只读展示已归档/回收站会话从哪里产生、又分出了哪些会话,并可按项目筛选或搜索。
|
|
51
75
|
|
|
52
76
|
## 功能
|
|
53
77
|
|
|
54
78
|
- **完整归档列表**:按工作区(项目)分组并显示每组数量;每个分组都可折叠/展开,状态按浏览器记忆。
|
|
79
|
+
- **归档成功提示**:会话归档成功后,在 DSH 全局浮层显示 3 秒的紧凑提示,提供 **查看**、**撤销** 和关闭操作;鼠标悬停或键盘聚焦会暂停计时,查看/撤销进行中不会自动消失,失败时保留重试入口。
|
|
55
80
|
- **聊天正文全文搜索**:同一个搜索框同时匹配标题、项目、标签、备注、用户消息、助手回答与工具结果,并在结果行显示命中摘要。
|
|
56
81
|
- **原生归档对话预览与轮次导航**:沿用 Harness 会话布局,用户消息靠右、助手消息靠左;以只读方式展示 Markdown、思考过程、工具活动、JSON、代码和可用的已存储图片,并保留可快速跳转的响应式轮次轨道。宿主缺少附件能力时只影响图片,其他预览内容仍可阅读。
|
|
57
82
|
- **筛选与排序**:用类型(全部 / 普通会话 / 子代理会话)、项目和标签筛选,并按最新、最早或标题排序。
|
|
@@ -60,12 +85,25 @@ dsh plugin --profile web update dsh-archived-chats
|
|
|
60
85
|
- **JSON + Markdown 备份**:可导出单条、当前选中项或全部归档会话。每个 ZIP 都包含带版本的清单、用于机器恢复的完整会话 JSON,以及方便阅读的 Markdown 对话稿。
|
|
61
86
|
- **预览后导入与恢复**:选择 ZIP 备份后先检查全部会话,默认选中无冲突 ID 的项目,确认后作为已归档聊天恢复。已有 ID 会跳过,绝不会覆盖。
|
|
62
87
|
- **紧凑顶部操作**:常用的 **导入备份** / **导出备份** 直接可用,低频危险操作收纳在 **更多**;页面专注于 DSH 归档管理,不常驻来源选择器或冗余菜单。
|
|
63
|
-
- **按需多选**:复选框默认隐藏,点击 **批量选择**
|
|
88
|
+
- **按需多选**:复选框默认隐藏,点击 **批量选择** 后才显示;可逐条选择、选择当前筛选结果或整个项目。选中后可一次导出、取消归档或移至回收站,隐藏在其他筛选结果中的选择不会丢失。
|
|
64
89
|
- **取消归档**单个聊天,或从分组的 `⋯` 菜单整组取消——恢复的聊天会立刻回到侧边栏。
|
|
65
|
-
-
|
|
66
|
-
-
|
|
90
|
+
- **四个归档管理视图**:归档、回收站、空间与策略、来源与分支。回收站按原工作区分组并可独立折叠,显示移入时间、快照大小、附件数和 `trashed` / `degraded` / `purge-pending` 状态;复选框默认隐藏,点击 **批量选择** 后才显示。
|
|
91
|
+
- **空间分析**:分别统计归档/回收会话目录与插件保护快照,标出无法统计项、降级快照和重复快照附件字节;会话目录与快照明细从摘要卡片进入可搜索弹窗,不会把保留策略持续向下推,也不会把这些数字描述为 Harness 全局附件可回收空间。
|
|
92
|
+
- **预览优先的保留策略**:可按每个原会话的保留快照数、快照年龄、快照容量和回收站年龄生成候选;默认每个原会话保留一份恢复快照。保存策略绝不自动执行,回收站正在使用或不可用的快照不会被选中,回收站永久删除默认不勾选。
|
|
93
|
+
- **只读来源与分支**:使用 Harness 持久化 `parentSession` 展示已归档/回收站会话的来源、分叉和子代理树,并保留解释关系所需的父子上下文;无关活动会话不会发送到浏览器。管理卡片把来源说明放在卡片内容中,底部独立一排居中显示折叠箭头;可复制完整 ID、点击整张卡片或箭头折叠,使用项目/状态筛选和全局展开/折叠。搜索标题、项目或 ID 时会自动展开命中路径,独立滚动区域避免大树持续推长页面,超过 50 个节点时根分支默认折叠。本版只诊断缺失父节点、循环与委派深度不一致,不修改关系。
|
|
94
|
+
- **自动恢复快照与保留历史**:已归档聊天移入回收站前保存完整会话事件和经校验的图片附件字节。恢复只移除回收记录,不自动删除快照;它会显示为“已保留的恢复快照”,即使当前没有归档聊天。重复恢复/回收会继续保留旧的有效快照,直到用户明确应用保留策略或永久删除该会话。
|
|
95
|
+
- **两级恢复**:原会话仍完好时只移除回收标记,不重写持久层;原件丢失时才使用已验证快照和官方写入能力回退恢复,且绝不覆盖同 ID 会话。
|
|
96
|
+
- **明确的永久删除**:仅回收站提供永久删除与清空。插件先写入 `purge-pending` 崩溃恢复意图,再删除原会话和保护快照;中途失败会在下次启动重试。
|
|
67
97
|
- 适配浅色/深色主题,支持中文和英文界面。
|
|
68
98
|
|
|
99
|
+
## 回收站、隐私与附件限制
|
|
100
|
+
|
|
101
|
+
回收目录 `trash.json` 与保护快照位于 `$DSH_HOME/plugin-data/archived-chats/`,全部只保存在本机。快照会逐个读取附件、校验摘要并使用原子发布;不会上传会话或附件。回收站中的预览也使用单独授权范围。
|
|
102
|
+
|
|
103
|
+
保留策略保存在同目录的 `retention.json`。插件不会在后台、启动时或定时自动应用策略;每次清理都要先生成五分钟有效的单次预览,再由用户选择并确认。
|
|
104
|
+
|
|
105
|
+
永久删除会删掉该会话的快照附件副本,但 Harness 全局附件存储可能仍因其他会话引用或宿主垃圾回收策略保留相同字节;本插件不声称会立即清理宿主的全局附件库。
|
|
106
|
+
|
|
69
107
|
## 标签、备注与统计
|
|
70
108
|
|
|
71
109
|
标签和备注**只保存在本机**的 `$DSH_HOME/plugin-data/archived-chats/metadata.json` 中——不会被上传、同步或发送到任何其他地方。取消归档会保留元数据;物理删除完成后会移除它,而延后或失败的删除会保留它。元数据与统计失败永远不阻塞:即使元数据存储无法读取或某个会话目录无法统计,列表、取消归档和删除仍然可用。
|
|
@@ -112,15 +150,22 @@ JSON 会保留附件引用,但**本版不复制附件二进制,也不包含
|
|
|
112
150
|
</details>
|
|
113
151
|
|
|
114
152
|
<details>
|
|
115
|
-
<summary><b
|
|
153
|
+
<summary><b>移入回收站后可以马上恢复吗?</b></summary>
|
|
116
154
|
|
|
117
|
-
|
|
155
|
+
可以。完成移入后的提示会提供 **撤销**,回收站中也可随时恢复。运行中会话会先按宿主生命周期安全停用或停放,然后才提交回收记录;如果宿主能力不足,操作会明确失败并保留归档会话。
|
|
156
|
+
|
|
157
|
+
</details>
|
|
158
|
+
|
|
159
|
+
<details>
|
|
160
|
+
<summary><b>为什么没有已归档聊天,空间页仍显示恢复快照?</b></summary>
|
|
161
|
+
|
|
162
|
+
恢复快照是在已归档聊天移入回收站前创建的。恢复聊天时插件会移除回收记录,但故意保留已经验证的快照作为恢复历史,因此当前归档列表为空时仍可能占用空间。默认策略按每个原会话保留一份;如需删除,请把数量改为 `0`,保存后再执行 **预览清理 → 应用所选清理**。仅保存策略不会删除数据。
|
|
118
163
|
|
|
119
164
|
</details>
|
|
120
165
|
|
|
121
166
|
## 实现概览
|
|
122
167
|
|
|
123
|
-
插件由两部分组成:Host
|
|
168
|
+
插件由两部分组成:Host 服务层负责读取本地归档、快照、回收目录和恢复/清除事务,浏览器设置页负责搜索、预览、备份、恢复与明确确认。所有修改都通过受保护的本地路由完成;普通移除只提交回收记录,物理清除仅由回收站的崩溃安全 purge 流程触发。
|
|
124
169
|
|
|
125
170
|
普通用户需要了解的数据保存、备份限制、删除结果和兼容性说明已列在本 README 中。路由清单、数据流、恢复事务、实时删除生命周期和失败回退等维护者细节请参阅 [架构文档](docs/ARCHITECTURE.md)。
|
|
126
171
|
|
|
@@ -134,6 +179,23 @@ npm test
|
|
|
134
179
|
|
|
135
180
|
## 版本更新记录
|
|
136
181
|
|
|
182
|
+
### 0.12.0
|
|
183
|
+
|
|
184
|
+
- 归档成功后新增 3 秒顶部提示,可立即查看归档中心或撤销;悬停/聚焦暂停,操作失败保留重试。
|
|
185
|
+
- 新增会话目录与保护快照分账、重复快照附件统计和不可用/降级诊断。
|
|
186
|
+
- 新增按历史数、年龄与容量规划的保留策略;保存与执行分离,清理使用单次短效预览并在执行前重检。
|
|
187
|
+
- 新增只读“来源与分支”树,只展示已归档/回收站会话和必要关系上下文,并诊断缺失父节点、循环和委派深度异常。
|
|
188
|
+
- 重复回收周期不再立即删除上一份有效保护快照;永久删除仍通过 `purge-pending` 事务移除原会话和全部有效快照。
|
|
189
|
+
- **降级提醒:** 0.11.x 不显示或治理多份历史快照,但能容忍它们并在永久删除时清理。降级前请备份 `$DSH_HOME/plugin-data/archived-chats/`。
|
|
190
|
+
|
|
191
|
+
### 0.11.0
|
|
192
|
+
|
|
193
|
+
- 新增 **归档 / 回收站** 双标签、独立批量选择、回收站范围预览、恢复、永久删除和清空。
|
|
194
|
+
- 普通删除改为创建完整本地保护快照并移入回收站,成功后可立即 **撤销**。
|
|
195
|
+
- 恢复优先使用完好原会话;原件丢失时改用已校验的会话+附件快照,不覆盖同 ID 会话。
|
|
196
|
+
- 新增 `purge-pending` 崩溃恢复意图、快照恢复扫描、降级状态,并将旧版 `pending-deletions.json` 安全迁移为可恢复回收记录,不在启动时静默删除。
|
|
197
|
+
- **降级警告**:安装 0.11 后如回退到 0.10,旧版不会识别回收目录和保护快照;回退前请先在 0.11 恢复需要的会话并备份 `$DSH_HOME/plugin-data/archived-chats/`。
|
|
198
|
+
|
|
137
199
|
### 0.10.0
|
|
138
200
|
|
|
139
201
|
- 新增遵循 Harness 会话布局的归档对话预览:用户消息靠右,助手消息靠左,并支持分页与响应式轮次导航。
|
|
@@ -201,7 +263,7 @@ npm test
|
|
|
201
263
|
dsh plugin --profile web remove dsh-archived-chats
|
|
202
264
|
```
|
|
203
265
|
|
|
204
|
-
|
|
266
|
+
卸载不会删除 `$DSH_HOME/plugin-data/archived-chats/` 中的 `metadata.json`、`trash.json`、`retention.json`、保护快照或旧版 `pending-deletions.json`,也不会触发永久删除。这是故意的本地数据保护;请先恢复或备份需要的会话,再手动处理该目录。
|
|
205
267
|
|
|
206
268
|
## License
|
|
207
269
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/docs/ARCHITECTURE.en.md
CHANGED
|
@@ -10,7 +10,7 @@ The plugin has a Host service half and a browser client half:
|
|
|
10
10
|
|
|
11
11
|
- The Host service in lib/index.js runs inside the DSH Web host, reads the workspace registry and session persistence, and exposes local HTTP routes.
|
|
12
12
|
- The browser client in lib/client.js registers the Archived Chats settings.section and renders state and actions.
|
|
13
|
-
- Pure domain logic lives in lib/export.js, lib/import.js, lib/restore.js, lib/metadata.js, lib/search.js, and lib/
|
|
13
|
+
- Pure domain logic lives in lib/export.js, lib/import.js, lib/restore.js, lib/metadata.js, lib/search.js, lib/stats.js, lib/insights.js, lib/retention.js, lib/retention-service.js, and lib/lineage.js. lib/trash.js owns the recycle catalog, lib/snapshot.js owns verified snapshots, and lib/recycle.js composes recycle lifecycle operations.
|
|
14
14
|
|
|
15
15
|
The browser never reads session files directly. All reads and writes go through Host routes.
|
|
16
16
|
|
|
@@ -21,6 +21,11 @@ Current routes:
|
|
|
21
21
|
~~~text
|
|
22
22
|
GET /plugins/dsh-archived-chats/state
|
|
23
23
|
GET /plugins/dsh-archived-chats/stats
|
|
24
|
+
GET /plugins/dsh-archived-chats/insights
|
|
25
|
+
POST /plugins/dsh-archived-chats/retention/policy
|
|
26
|
+
POST /plugins/dsh-archived-chats/retention/preview
|
|
27
|
+
POST /plugins/dsh-archived-chats/retention/apply
|
|
28
|
+
GET /plugins/dsh-archived-chats/lineage
|
|
24
29
|
POST /plugins/dsh-archived-chats/preview
|
|
25
30
|
POST /plugins/dsh-archived-chats/preview/image
|
|
26
31
|
POST /plugins/dsh-archived-chats/search
|
|
@@ -28,13 +33,17 @@ POST /plugins/dsh-archived-chats/export
|
|
|
28
33
|
POST /plugins/dsh-archived-chats/import/inspect
|
|
29
34
|
POST /plugins/dsh-archived-chats/import/restore
|
|
30
35
|
POST /plugins/dsh-archived-chats/metadata
|
|
36
|
+
GET /plugins/dsh-archived-chats/trash
|
|
37
|
+
POST /plugins/dsh-archived-chats/trash/restore
|
|
38
|
+
POST /plugins/dsh-archived-chats/trash/purge
|
|
39
|
+
POST /plugins/dsh-archived-chats/trash/empty
|
|
31
40
|
POST /plugins/dsh-archived-chats/unarchive
|
|
32
41
|
POST /plugins/dsh-archived-chats/unarchive-all
|
|
33
42
|
POST /plugins/dsh-archived-chats/delete
|
|
34
43
|
POST /plugins/dsh-archived-chats/delete-all
|
|
35
44
|
~~~
|
|
36
45
|
|
|
37
|
-
Every mutating route, plus the preview, preview/image, and search routes that return conversation content, requires the `x-dsh-archived-chats: 1` header. preview/image and export are read-only
|
|
46
|
+
Every mutating route, plus the preview, preview/image, and search routes that return conversation content, requires the `x-dsh-archived-chats: 1` header. GET trash, preview/image, and export are read-only. `delete` / `delete-all` return `trashed` and `failed`; `trash/restore` returns `restored`; `trash/purge` / `trash/empty` return `purged`, preserving first-request order.
|
|
38
47
|
|
|
39
48
|
## State and local data
|
|
40
49
|
|
|
@@ -42,15 +51,20 @@ The state route joins archived sessions, workspace, tags, notes, and metadataUpd
|
|
|
42
51
|
|
|
43
52
|
~~~text
|
|
44
53
|
$DSH_HOME/plugin-data/archived-chats/metadata.json
|
|
54
|
+
$DSH_HOME/plugin-data/archived-chats/trash.json
|
|
55
|
+
$DSH_HOME/plugin-data/archived-chats/retention.json
|
|
56
|
+
$DSH_HOME/plugin-data/archived-chats/snapshots/
|
|
45
57
|
~~~
|
|
46
58
|
|
|
47
|
-
|
|
59
|
+
Metadata and recycle catalogs are versioned. Writes serialize and atomically replace their documents through temporary files. An unreadable or unsupported `trash.json` is preserved byte-for-byte, hides no archived sessions, and disables recycle mutations.
|
|
48
60
|
|
|
49
61
|
The stats route measures session directories with concurrency four, skips symbolic links, and caches results for 30 seconds. A measurement failure marks only that row unavailable; list and mutation actions continue. Delete invalidates the affected cache row.
|
|
50
62
|
|
|
63
|
+
Insights joins session measurement with a stream-verified snapshot inventory and counts repeated snapshot attachments only from validated SHA-256 descriptors. The browser keeps totals in summary cards and presents session/snapshot inventories only in bounded searchable dialogs. retention.json uses an exact version-one schema; saving never runs cleanup. Preview issues a five-minute single-use token/nonce and apply revalidates inside the lifecycle queue; recycle candidates still delegate to recycle purge. Lineage uses only durable parentSession edges, caps real nodes at 5,000, never rewrites headers, and resolves titles for at most 100 untitled active source nodes already included in the focused tree.
|
|
64
|
+
|
|
51
65
|
## Preview and full-text search
|
|
52
66
|
|
|
53
|
-
Preview
|
|
67
|
+
Preview accepts visible archived IDs by default and only recycle-catalog IDs with explicit `scope: "trash"`; search remains archive-only. lib/search.js uses Harness append-origin message projection, so replacement copies are never indexed twice. User, assistant, reasoning, tool-call, and tool-result text is searchable, while preview returns bounded pages of structured segments and sanitized image descriptors.
|
|
54
68
|
|
|
55
69
|
The preview/image authorization sequence is fixed: first require POST and `x-dsh-archived-chats: 1`, then bounded-parse `sessionId` and `attachmentId`; next confirm that the session is still in the currently visible archive set, find an exact image-descriptor match in that session's canonical projection, and only then read bytes through the optional `attachments.readImage` service. Both preview and preview/image recheck visible archive state after asynchronous reads and immediately before sending a response, preventing an overlapping unarchive or delete from exposing stale content. Image bytes use `no-store` and `nosniff`; cross-session, non-archived, and unprojected references are rejected, and error responses never echo filesystem paths. A host without attachment-read capability returns `preview-image-unsupported`; this degrades images only and does not block text, Markdown, reasoning, tool, JSON, or code preview.
|
|
56
70
|
|
|
@@ -83,38 +97,28 @@ import/inspect accepts only version-one ZIPs produced by this plugin. Host valid
|
|
|
83
97
|
|
|
84
98
|
The confirmation token expires quickly and can be used once. Hosts without the supported writer capability return restore-unsupported without writing.
|
|
85
99
|
|
|
86
|
-
##
|
|
87
|
-
|
|
88
|
-
A cold delete confirms the physical location, removes the session log, workspace record, and registry indexes, then cleans metadata and stats caches.
|
|
100
|
+
## Recycle and protection-snapshot lifecycle
|
|
89
101
|
|
|
90
|
-
|
|
102
|
+
`trash.json` permits only `trashed`, `purge-pending`, and `degraded`. Legal transitions are `missing -> trashed`, `trashed/degraded -> purge-pending`, and removal of an existing state after a committed transaction. A `purge-pending` record cannot restore.
|
|
91
103
|
|
|
92
|
-
|
|
93
|
-
cancel(disposed)
|
|
94
|
-
-> whenIdle
|
|
95
|
-
-> flush
|
|
96
|
-
-> agent.scope.dispose()
|
|
97
|
-
-> detach agents and sessions
|
|
98
|
-
-> retire persistence writer
|
|
99
|
-
-> remove session files
|
|
100
|
-
~~~
|
|
104
|
+
Protection manifests use `dsh-archived-chats/snapshot` v1 and session payloads use `dsh-archived-chats/snapshot-session` v1. Each recycle record names one active snapshot; older valid snapshots from restore/recycle cycles remain history until explicit retention application or permanent purge. Exact limits remain 4 MiB manifest, 512 MiB session JSON, 10,000 attachments, 32 MiB each, and 8 GiB total.
|
|
101
105
|
|
|
102
|
-
|
|
106
|
+
Move ordering is: validate archive ownership → dispose or park a live session → capture and verify snapshot → recheck ownership → atomically commit `trashed` → invalidate caches. Ordinary move never removes the persistence artifact.
|
|
103
107
|
|
|
104
|
-
|
|
105
|
-
$DSH_HOME/plugin-data/archived-chats/pending-deletions.json
|
|
106
|
-
~~~
|
|
108
|
+
Restore first rejects an existing-ID conflict. With an intact original it restores archive visibility and removes only the recycle record, without rewriting persistence; the snapshot remains history. With a missing original it completes validation and attachment-identity republishing before writing through public `create` / `append` / `saveImage` capabilities. A failure rolls back the new artifact and retains trash.
|
|
107
109
|
|
|
108
|
-
|
|
110
|
+
Permanent purge persists `purge-pending` before physical writes, then removes the original, snapshot, and recycle record in that order. Startup recovery retries only `purge-pending`, never plain `trashed`. Legacy `pending-deletions.json` is strict read-only migration input: each still-archived ID becomes recoverable trash and is never boot-deleted merely because of the old marker.
|
|
109
111
|
|
|
110
112
|
## Browser client
|
|
111
113
|
|
|
112
114
|
client.js registers an order-30 settings.section and uses the DSH rc.7 overlay, state, and design tokens. The page state includes:
|
|
113
115
|
|
|
116
|
+
- A frame-wide archive success notice in `shell.overlay`: during its effect lifetime the plugin wraps the public `workspaces.archiveSession` method, publishes the latest session ID only after the original call succeeds, and restores the method on unload. The notice defaults to three seconds and tracks pointer/focus pause reasons independently. View follows the Host's accessible Settings trigger and Archived Chats nav label; Undo calls the guarded `/unarchive` route and refreshes the workspace projection. Failures remain retryable and never present false success.
|
|
114
117
|
- Archived sessions and workspace groups.
|
|
115
118
|
- Search, type/project/tag filters, and sorting.
|
|
116
119
|
- Tag and note editor.
|
|
117
|
-
- Selected-item export, unarchive, and
|
|
120
|
+
- Selected-item export, unarchive, and move to Recycle Bin.
|
|
121
|
+
- Archived, Recycle Bin, Storage & Retention, and Origins & Branches tabs; storage and relationship requests load on demand and are cancellable. Storage summary cards open searchable session-directory/snapshot dialogs, keeping retention controls stable regardless of inventory size. The projector retains global capability, while the 0.12 route returns only archived/recycled chats, their ancestor chains, and descendant trees; unrelated active chats are never sent to the browser. Necessary source titles resolve on demand, and a recycle record whose original header is gone still appears as a standalone recycled node. Compact rows use visible spines and elbows for parent/child structure. The DOM uses native list/listitem and disclosure-button semantics instead of claiming an incomplete composite ARIA tree keyboard model while rows also contain Copy ID actions. Rows lead with titles and include project plus localized source/type/delegation/branch metadata and one compact ID. The tree supports per-node and global folding, project filtering that retains required ancestors, and title/project/ID search that temporarily reveals matching paths before restoring the user's fold state. It scrolls independently, defaults only root branches to collapsed above 50 nodes, traverses iteratively, and caps visible guide columns at the nearest 12 levels.
|
|
118
122
|
- Import preview, disabled conflicts, and restore results.
|
|
119
123
|
- Responsive settings-page markers and sidebar refresh injection.
|
|
120
124
|
|
|
@@ -128,13 +132,14 @@ The browser never mutates files directly. After an operation, the Host response
|
|
|
128
132
|
|
|
129
133
|
- All state-changing routes require POST and the guard header.
|
|
130
134
|
- Import limits ZIP size, entries, paths, versions, and JSON structure, rejecting traversal, duplicates, and prototype-pollution keys.
|
|
131
|
-
-
|
|
132
|
-
-
|
|
135
|
+
- Ordinary delete never invokes physical purge; only a committed recycle record can enter purge.
|
|
136
|
+
- Snapshot and recycle documents use `0600`, directories use `0700`, and publication is temporary write, sync, atomic rename.
|
|
137
|
+
- Purge removes snapshot attachment copies but does not promise immediate cleanup of identical bytes still retained by Harness's global attachment store.
|
|
133
138
|
- Unknown host capabilities must degrade or return a clear error; they must not be inferred.
|
|
134
139
|
|
|
135
140
|
## Compatibility and testing
|
|
136
141
|
|
|
137
|
-
The
|
|
142
|
+
The complete 0.12.0 target is DeepSeek Harness 0.1.1-rc.2. Version 0.11.x tolerates multiple valid snapshots but does not display or govern history; back up the complete plugin-data directory before downgrading.
|
|
138
143
|
|
|
139
144
|
Coverage includes:
|
|
140
145
|
|
|
@@ -144,6 +149,8 @@ Coverage includes:
|
|
|
144
149
|
- metadata.js versioning, concurrency, and atomic writes.
|
|
145
150
|
- stats.js symlink handling, caching, and concurrency limits.
|
|
146
151
|
- search.js message projection, Unicode search, pagination, partial failures, and TTL/LRU caching.
|
|
152
|
+
- trash.js, snapshot.js, and recycle.js format validation, concurrency, recovery, rollback, crash intent, and legacy migration.
|
|
153
|
+
- insights.js, retention.js, retention-service.js, and lineage.js trusted accounting, policy bounds, short-lived authority, revalidation, and bounded graph projection.
|
|
147
154
|
- Host routes and browser settings smoke/responsive behavior.
|
|
148
155
|
|
|
149
156
|
Run:
|