dsh-workspace-mover 2.2.0 โ 2.3.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/CHANGELOG.md +285 -0
- package/README.md +40 -8
- package/README_EN.md +346 -0
- package/client/client.js +376 -37
- package/docs/ARCHITECTURE.md +17 -9
- package/docs/compatibility/dsh-0.2.0-rc.2-2026-10-04.md +39 -0
- package/docs/compatibility/dsh-0.2.0-rc.2-2026-10-13.md +45 -0
- package/lib/index.js +1465 -141
- package/package.json +102 -99
- package/test/client-dom.test.mjs +129 -0
- package/test/e2e-sandbox.test.mjs +417 -10
package/README_EN.md
ADDED
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
# dsh-workspace-mover
|
|
2
|
+
|
|
3
|
+
> [!IMPORTANT]
|
|
4
|
+
> Unofficial project, independently developed and maintained by community members.
|
|
5
|
+
|
|
6
|
+
<!-- Hero -->
|
|
7
|
+
<div align="center">
|
|
8
|
+
<b style="font-size: 1.15em;">Drag a session onto another workspace in the sidebarโa true move of the original archive, not a copy</b><br /><br />
|
|
9
|
+
|
|
10
|
+
<p style="font-size: 0; line-height: 1;">
|
|
11
|
+
<a href="https://github.com/PianoPrince/dsh-workspace-mover/actions/workflows/test.yml"><img alt="CI" src="https://github.com/PianoPrince/dsh-workspace-mover/actions/workflows/test.yml/badge.svg" style="height:20px; margin:0 2px;" /></a>
|
|
12
|
+
<a href="https://www.npmjs.com/package/dsh-workspace-mover"><img alt="npm version" src="https://img.shields.io/npm/v/dsh-workspace-mover" style="height:20px; margin:0 2px;" /></a>
|
|
13
|
+
<a href="https://www.npmjs.com/package/dsh-workspace-mover"><img alt="npm weekly downloads" src="https://img.shields.io/npm/dw/dsh-workspace-mover" style="height:20px; margin:0 2px;" /></a>
|
|
14
|
+
<img alt="plugin version" src="https://img.shields.io/badge/dsh--plugin-2.3.0-4d6bfe" style="height:20px; margin:0 2px;" />
|
|
15
|
+
<img alt="DSH tested 0.2.0-rc.2" src="https://img.shields.io/badge/DSH_tested-0.2.0--rc.2-4c8dff" style="height:20px; margin:0 2px;" />
|
|
16
|
+
<img alt="Node" src="https://img.shields.io/badge/Node-%E2%89%A522-339933" style="height:20px; margin:0 2px;" />
|
|
17
|
+
</p>
|
|
18
|
+
<p style="font-size: 0; line-height: 1;">
|
|
19
|
+
<a href="https://github.com/PianoPrince/dsh-workspace-mover/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/PianoPrince/dsh-workspace-mover" style="height:20px; margin:0 2px;" /></a>
|
|
20
|
+
<a href="./LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-yellow.svg" style="height:20px; margin:0 2px;" /></a>
|
|
21
|
+
<a href="https://awesome-dsh-plugin.com"><img alt="Awesome DSH Plugin" src="https://awesome-dsh-plugin.com/badge.svg" style="height:20px; margin:0 2px;" /></a>
|
|
22
|
+
<a href="https://www.dsh.so/artifact/dsh-workspace-mover/"><img alt="dsh.so risk: low" src="https://www.dsh.so/badge/dsh-workspace-mover.svg" style="height:20px; margin:0 2px;" /></a>
|
|
23
|
+
<img alt="True move" src="https://img.shields.io/badge/-True%20move-4d6bfe" style="height:20px; margin:0 2px;" />
|
|
24
|
+
<img alt="Zero token cost" src="https://img.shields.io/badge/-Zero%20token%20cost-4d6bfe" style="height:20px; margin:0 2px;" />
|
|
25
|
+
<img alt="Backup and rollback" src="https://img.shields.io/badge/-Backup%20%26%20rollback-4d6bfe" style="height:20px; margin:0 2px;" />
|
|
26
|
+
</p>
|
|
27
|
+
<p style="font-size: 0; line-height: 1;">
|
|
28
|
+
<img alt="GitHub clones observed (cumulative since 2026-08-25, with uniques)" src="https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FPianoPrince%2Fc14345658550a4a308570acfbaf9d170%2Fraw%2Fwsm-clones-total.json" style="height:20px; margin:0 2px;" />
|
|
29
|
+
<!-- release-downloads-badge:start --><!-- release-downloads-badge:end -->
|
|
30
|
+
</p>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<div align="center">
|
|
34
|
+
๐ <a href="./README.md"><b>ไธญๆ</b></a> ยท English
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
## ๐ Table of Contents
|
|
38
|
+
|
|
39
|
+
- [โจ Features](#-features)
|
|
40
|
+
- [๐ Install](#-install)
|
|
41
|
+
- [๐ผ๏ธ Tour](#๏ธ-tour)
|
|
42
|
+
- [โจ๏ธ Usage](#๏ธ-usage)
|
|
43
|
+
- [๐ How it integrates with DSH](#-how-it-integrates-with-dsh)
|
|
44
|
+
- [๐ค Coexistence with other plugins](#-coexistence-with-other-plugins)
|
|
45
|
+
- [๐งฉ Compatibility and uninstall](#-compatibility-and-uninstall)
|
|
46
|
+
- [๐ Safety Ledger](#-safety-ledger-ๅฎๅ
จๅฐ่ดฆ)
|
|
47
|
+
- [โ ๏ธ Known limitations](#๏ธ-known-limitations)
|
|
48
|
+
- [๐ Recent version](#-recent-version)
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## โจ Features
|
|
53
|
+
|
|
54
|
+
DeepSeek Harness's sidebar supports drag-to-reorder **within** a workspace, but dropping a session onto **another workspace** is silently ignored. This plugin adds cross-workspace migration:
|
|
55
|
+
|
|
56
|
+
- **๐ฑ๏ธ Drag-and-drop move**: drag an idle session row onto a target workspace title row and confirm
|
|
57
|
+
- **๐ฆ Bulk move / group merge**: multi-select with Ctrl/Shift and drag the set, or use a workspace header's "โฏ" โ "Move whole groupโฆ"; an emptied source group can be deleted in one confirmation (up to 50 per batch, failures isolated)
|
|
58
|
+
- **๐ True move ยท zero tokens**: session id and full history are preserved as-is โ no duplicates, no context re-injection
|
|
59
|
+
- **๐ Move-home wizard**: after a project folder was moved or renamed, re-point the broken workspace in place; id, title, order, and archive flags stay, and member sessions plus strays migrate together
|
|
60
|
+
- **๐ Session rescue** (Settings โ Session Rescue): recover lost / unregistered / misfiled sessions; restore archived sessions; one-click repair and filtering
|
|
61
|
+
- **๐๏ธ Recycle bin and backups**: deletes go to the recycle bin first and can be restored; migrations create recovery snapshots that can be restored or cleaned up
|
|
62
|
+
- **๐ก๏ธ Data protection**: identical session content keeps one physical snapshot, so back-and-forth moves do not grow storage without bound; every move still appears in history with snapshot counts and footprint visible
|
|
63
|
+
- **โช Move history and undo**: last 100 cross-workspace moves; bulk operations aggregate into one undoable entry
|
|
64
|
+
- **๐งพ Task center**: bulk moves persist per-item state (done/failed, last error and attempt time); failed items retry in one click โ from each session's CURRENT location, never a stale path
|
|
65
|
+
- **โณ Busy-session queue**: running sessions are never touched; queued work is persistent, with per-item cancel/retry and batch retry for failed items
|
|
66
|
+
- **๐ Migration preview**: before confirmation, show source, target path, collisions, running state, adapter mode, and estimated new backup bytes; reuse is called out when a matching snapshot already exists
|
|
67
|
+
- **๐ Empty-group cleanup / open folder**: only truly empty workspaces are listed; open a group directory in your file manager
|
|
68
|
+
- **๐ค Agent tools**: four model-callable tools โ `mover_list_sessions` / `mover_move_session` / `mover_repair_sessions` / `mover_doctor` โ so "move this session to group X" in the conversation runs the same backup-first pipeline as the panel; mutating tools ask for user approval first, and hosts without `dsh-tools` skip them automatically
|
|
69
|
+
|
|
70
|
+
## ๐ Install
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
dsh plugin --profile web add "github:PianoPrince/dsh-workspace-mover"
|
|
74
|
+
# Restart dsh web once
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
> **Zero-build install**: pure JavaScript source-as-product (no TypeScript, no build step). Installing from GitHub does **not** require `allowBuilds`.
|
|
78
|
+
|
|
79
|
+
<details>
|
|
80
|
+
<summary><b>npm channel</b></summary>
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
dsh plugin --profile web add dsh-workspace-mover
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
</details>
|
|
87
|
+
|
|
88
|
+
<details>
|
|
89
|
+
<summary><b>Local development install</b></summary>
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
dsh plugin --profile web add "link:C:/path/to/dsh-workspace-mover"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
</details>
|
|
96
|
+
|
|
97
|
+
<details>
|
|
98
|
+
<summary><b>Desktop app install (DSH v0.2 desktop client)</b></summary>
|
|
99
|
+
|
|
100
|
+
1. Install and open the official desktop app, go to the ใๆไปถใ/ Plugins page in the left menu;
|
|
101
|
+
2. Click "Add plugin" and search for `dsh-workspace-mover`, then install and enable it;
|
|
102
|
+
3. Done โ the desktop profile is independent from the web profile, so install once per profile.
|
|
103
|
+
|
|
104
|
+
> The desktop profile is managed exclusively by the Electron application (the standalone CLI rejects `--profile desktop`); use the in-app plugin page.
|
|
105
|
+
|
|
106
|
+
</details>
|
|
107
|
+
|
|
108
|
+
<details>
|
|
109
|
+
<summary><b>Troubleshooting</b></summary>
|
|
110
|
+
|
|
111
|
+
| Symptom | What to do |
|
|
112
|
+
|---|---|
|
|
113
|
+
| Drag does nothing | Use **grouped view** and drop on a **workspace title row**; flat list view has no title rows and stays inactive |
|
|
114
|
+
| Session is running | Wait for the current turn to finish, then move |
|
|
115
|
+
| Move failed toast | There is a backup and automatic rollback; retry after following the toast. Details are in the host log under `MOVE FAILED` |
|
|
116
|
+
| Move succeeded but sidebar didn't regroup | Refresh the page |
|
|
117
|
+
| Some sessions vanished from the sidebar | Open **Settings โ Session Rescue** to scan and recover them |
|
|
118
|
+
| After upgrading to DSH 0.2, switching models on old sessions fails with `Unknown agent preset` | 0.2 no longer reads the 0.1.x legacy custom-preset directory; presets must be migrated to declaration rows โ unrelated to this plugin, full steps in [docs/dsh-0.2-preset-migration.md](docs/dsh-0.2-preset-migration.md) |
|
|
119
|
+
|
|
120
|
+
</details>
|
|
121
|
+
|
|
122
|
+
## ๐ผ๏ธ Tour
|
|
123
|
+
|
|
124
|
+
> Real UI screenshots (click to enlarge).
|
|
125
|
+
|
|
126
|
+
### Drag across workspaces
|
|
127
|
+
|
|
128
|
+
| | |
|
|
129
|
+
|---|---|
|
|
130
|
+
| **Drag an idle session row onto a target workspace title row** | **Confirm dialog shows the destination path** |
|
|
131
|
+
|  |  |
|
|
132
|
+
| **Settings โ Session Rescue** | |
|
|
133
|
+
|  | |
|
|
134
|
+
|
|
135
|
+
### Bulk move ยท multi-select
|
|
136
|
+
|
|
137
|
+
| |
|
|
138
|
+
|---|
|
|
139
|
+
| **Ctrl+click to multi-select (the open session is included automatically), count badge bottom-left; drag any selected row; Esc clears** |
|
|
140
|
+
|  |
|
|
141
|
+
| **Header "โฏ" โ "Move whole groupโฆ" for group merge** |
|
|
142
|
+
|  |
|
|
143
|
+
|
|
144
|
+
### Move-home wizard ยท walkthrough
|
|
145
|
+
|
|
146
|
+
A real rename: folder `Test1` โ `Test2`, then repair the workspace in place.
|
|
147
|
+
|
|
148
|
+
| | |
|
|
149
|
+
|---|---|
|
|
150
|
+
| **Before rename** | **After rename (folder gone on disk)** |
|
|
151
|
+
|  |  |
|
|
152
|
+
| **Health panel marks the path invalid** | **Confirm old โ new path and session count** |
|
|
153
|
+
|  |  |
|
|
154
|
+
| **Done: group renamed to Test2, history intact** | |
|
|
155
|
+
|  | |
|
|
156
|
+
|
|
157
|
+
## โจ๏ธ Usage
|
|
158
|
+
|
|
159
|
+
### Drag across workspaces
|
|
160
|
+
|
|
161
|
+
1. After restart, open **grouped view** in the sidebar and hold an idle session row;
|
|
162
|
+
2. Drop it on a target workspace title row;
|
|
163
|
+
3. Confirm the destination path โ **Move**;
|
|
164
|
+
4. Toast confirms; refresh the page if the sidebar does not regroup automatically.
|
|
165
|
+
|
|
166
|
+
Mid-turn sessions are rejected; failed moves roll back automatically.
|
|
167
|
+
|
|
168
|
+
### Session rescue panel
|
|
169
|
+
|
|
170
|
+
1. **Settings โ Session Rescue** scans on open;
|
|
171
|
+
2. **Lost / orphaned**: pick a target workspace โ **Move**;
|
|
172
|
+
3. **Unregistered**: **Attach** in place to the matching workspace;
|
|
173
|
+
4. **Misfiled**: **Home** or **Home all**;
|
|
174
|
+
5. **One-click repair** runs fixable items with per-item isolation;
|
|
175
|
+
6. Filter by title / session id / path / group;
|
|
176
|
+
7. **Archived / recycle bin / backups**: restore archived sessions; restore or purge deleted sessions; restore or clean backups.
|
|
177
|
+
|
|
178
|
+
### Conversational moves (agent tools)
|
|
179
|
+
|
|
180
|
+
1. Hosts with `dsh-tools` (web and desktop by default) register four model tools: listing and doctor (both read-only), move, and one-click repair;
|
|
181
|
+
2. Say "list my sessions", "move session X to group Y", "run a repair", or "run a self-check" โ the model resolves names into exact ids with the listing tool first, then acts;
|
|
182
|
+
3. Mutating tools raise a host approval prompt before acting (same level as the panel confirm); dismissing or denying means nothing happens; the two read-only tools never prompt;
|
|
183
|
+
4. Hosts without `dsh-tools` skip the tools automatically โ the panel and drag flows are unaffected.
|
|
184
|
+
|
|
185
|
+
### Bulk move
|
|
186
|
+
|
|
187
|
+
1. **Ctrl/Cmd+click** to select, **Shift+click** for a range, **Esc** to clear;
|
|
188
|
+
2. Drag any selected row โ **Move all**;
|
|
189
|
+
3. Or **"โฏ" โ "Move whole groupโฆ"**; delete an emptied source group to merge.
|
|
190
|
+
|
|
191
|
+
### Move-home wizard
|
|
192
|
+
|
|
193
|
+
1. After a folder move/rename, health check marks the group **path invalid**;
|
|
194
|
+
2. Enter the folder's current full path โ **Move**;
|
|
195
|
+
3. Confirm paths and session count; running sessions skip โ rerun to finish the rest.
|
|
196
|
+
|
|
197
|
+
## ๐ How it integrates with DSH
|
|
198
|
+
|
|
199
|
+
For users, the integration contract is:
|
|
200
|
+
|
|
201
|
+
1. Mounted through **official DSH extension points** โ DSH and dsh-market install files are not modified;
|
|
202
|
+
2. Workspace membership changes use the host's **official interfaces** โ no forged persistence data;
|
|
203
|
+
3. Plugin-owned data (history, backups, recycle bin) lives in a **separate data directory**, apart from session archives;
|
|
204
|
+
4. Official same-group sidebar sorting is **left alone** โ only cross-workspace drops are handled.
|
|
205
|
+
|
|
206
|
+
Implementation details: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
|
|
207
|
+
|
|
208
|
+
## ๐ค Coexistence with other plugins
|
|
209
|
+
|
|
210
|
+
Built to coexist: private communication/style namespaces, no rewrites of official install files, official interfaces for membership writes.
|
|
211
|
+
|
|
212
|
+
| Plugin category | Compatibility | Notes |
|
|
213
|
+
| --- | --- | --- |
|
|
214
|
+
| Official built-in plugins (the eight shipped since 0.2: terminal / web search / subagents / โฆ) | โ
No conflict | Disjoint feature surfaces; agent tools coexist through the official `dsh-tools` registry โ this plugin's tools are namespaced with a `mover_` prefix |
|
|
215
|
+
| Sidebar enhancements / better-sidebar / terminals / cost meters / memory / export & share | โ
No conflict | Different panels and data surfaces |
|
|
216
|
+
| Archive managers | โ
Compatible | Both use official archive data; panel features may overlap |
|
|
217
|
+
| Recycle-bin / session-delete plugins | โ
Isolated data | Each plugin keeps its own recycle-bin directory, none shared; enable one delete entry point to avoid confusion |
|
|
218
|
+
| Sort / pin plugins | โ ๏ธ Mostly compatible | Moves re-sort "Recently updated" precisely; display order in other plugins may differ slightly |
|
|
219
|
+
| Plugins that redraw the sidebar | โ ๏ธ Graceful degradation | If the official sidebar structure is replaced, features may stop triggering โ **no data damage** |
|
|
220
|
+
| Other session movers | โ Pick one | Two drag interceptors can double-handle one drag; this plugin covers move / bulk / merge / homing / archive restore |
|
|
221
|
+
|
|
222
|
+
## ๐งฉ Compatibility and uninstall
|
|
223
|
+
|
|
224
|
+
### Why does the storage adapter show a warning?
|
|
225
|
+
|
|
226
|
+
DSH currently exposes no public raw archive path or raw-byte relocation API. The plugin uses the host storage root and checked JSONL layout, reported as `filesystem-fallback`. This is a compatibility warning; check the storage-layout result as well. Run doctor again after host upgrades and stop migration if the layout is unknown or damaged. Handle-only providers without physical paths cannot relocate archives.
|
|
227
|
+
|
|
228
|
+
Recovery snapshots are separate from primary archives. A reused snapshot retains its original saved path; restoration uses that path unless another workspace is selected. History does not guarantee indefinite snapshot retention: policy limits or manual cleanup can remove a referenced snapshot.
|
|
229
|
+
|
|
230
|
+
### Version compatibility matrix
|
|
231
|
+
|
|
232
|
+
| Plugin version | Verified DeepSeek Harness | Node | Notes |
|
|
233
|
+
|----------------|---------------------------|------|-------|
|
|
234
|
+
| 2.3.0 | `0.2.0-rc.2` Desktop (partial user verification) | `โฅ22` | Idle migration and snapshot reuse confirmed; Web, queue process restart, and full runtime smoke pending |
|
|
235
|
+
| 2.2.0 | `0.1.5-rc.1`, `0.1.5-rc.2`, **`0.2.0 desktop`** (0.2.0-rc.2 core) | `โฅ22` | Storage-layout check; Agent tools + desktop verified; tools auto-skip on hosts without `dsh-tools` |
|
|
236
|
+
| 2.0.3 | `0.1.5-rc.1`, `0.1.5-rc.2` | `โฅ22` | True move / bulk / rescue / recycle bin / backups; first npm publish |
|
|
237
|
+
| โ | `0.2.0 web` (0.2.0-rc.2) | `โฅ22` | Same core as the desktop build, adapted on the same code paths; web boot regression pending |
|
|
238
|
+
|
|
239
|
+
### Session archive format validation
|
|
240
|
+
|
|
241
|
+
โLocal passโ below means repository sandbox fixtures, not an official DSH runtime test. Desktop idle migration and snapshot reuse have user confirmation; remaining runtime checks are pending; see the [compatibility report](docs/compatibility/dsh-0.2.0-rc.2-2026-10-13.md).
|
|
242
|
+
|
|
243
|
+
| Archive layout | Local sandbox | Official DSH runtime |
|
|
244
|
+
| --- | --- | --- |
|
|
245
|
+
| v3 / v4 Zstd | Move and undo pass; highest generation selected while older files are preserved | Pending |
|
|
246
|
+
| Legacy / v3 plain JSONL | Move and undo pass without upgrading the generation | Pending |
|
|
247
|
+
| Mixed compression encodings | Explicitly rejected | Pending |
|
|
248
|
+
| Filename/header generation mismatch | Rejected before move when the header declares a generation; bytes remain unchanged | Pending |
|
|
249
|
+
|
|
250
|
+
- **Engines**: `package.json` โ `engines.dsh` โฅ `0.1.5-rc.1`, `engines.node` โฅ `22` (aligned with the CI Node 22/24 matrix).
|
|
251
|
+
- **Other known combination**: dsh-market `1.45.1`. Does not patch DSH source; official extension points only.
|
|
252
|
+
- **Quality gate**: run `npm run check` before opening a PR (syntax + tests + `npm pack --dry-run`); CI runs the same steps on ubuntu / windows / macos ร Node 22/24.
|
|
253
|
+
- **Marketplace "host requirement unknown"**: GitHub-only packages without an npm manifest may show unknown โ that is metadata, not runtime incompatibility.
|
|
254
|
+
- **DSH 0.2 preset migration**: 0.2 no longer reads the 0.1.x legacy custom-preset directory (`$DSH_HOME\.agent-presets\`); resuming old sessions fails with `Unknown agent preset` (a host change, unrelated to this plugin). Migration steps and a real-world record: [docs/dsh-0.2-preset-migration.md](docs/dsh-0.2-preset-migration.md).
|
|
255
|
+
- **Uninstall is reversible**: removing the plugin does not delete session archives, workspaces, or official bookkeeping. Plugin history/tasks/backups/recycle-bin data stay in the plugin data directory (see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)); refresh or restart DSH to clear injected UI.
|
|
256
|
+
- **Coexistence**: do not enable a second cross-workspace drag mover; other categories can follow the table above.
|
|
257
|
+
- **Storage fallback is visible**: `mover.status` reports `filesystem-fallback`, `official-handle`, or `unavailable`. Handle-only providers remain diagnostic/preview capable, while physical moves fail explicitly with `unsupported` instead of guessing a path.
|
|
258
|
+
|
|
259
|
+
Some advanced actions need newer DSH capabilities; when unavailable the UI says so instead of failing silently.
|
|
260
|
+
|
|
261
|
+
## ๐ Safety Ledger (ๅฎๅ
จๅฐ่ดฆ)
|
|
262
|
+
|
|
263
|
+
Every migration runs through the same safety-bounded pipeline: **byte-level backup first โ stepwise rollback โ post-move verification โ recovery ledger as the last resort**. Any failure returns to the pre-move state; the extreme case where even the rollback fails writes a durable recovery record and raises a red row in the rescue panel for manual review โ data never disappears.
|
|
264
|
+
|
|
265
|
+
**Never-does:**
|
|
266
|
+
|
|
267
|
+
- Never performs any git write operations (no commit / stash / reset / checkout);
|
|
268
|
+
- Never touches a file before the byte-level backup is on disk;
|
|
269
|
+
- Never silently discards session data โ unrecoverable extremes are flagged in red with the scene preserved;
|
|
270
|
+
- Never runs a destructive action without confirmation (conversational move / repair additionally requires the host approval prompt);
|
|
271
|
+
- Never uploads any local data โ the plugin makes no network requests, everything runs locally.
|
|
272
|
+
|
|
273
|
+
**Concrete guarantees:**
|
|
274
|
+
|
|
275
|
+
- **Automatic recovery snapshot before every move**; identical content (ignoring migration-only `cwd` changes) reuses an existing snapshot, then the landed session identity and path are re-checked โ mismatch rolls the whole move back;
|
|
276
|
+
- **Every move remains in history** with source, target, and the snapshot used, so deduplication never hides the operation trail;
|
|
277
|
+
- **On failure, restore to the pre-move state** (files and bookkeeping together);
|
|
278
|
+
- **Deletes go to the recycle bin first** and can be restored to the original spot or any group; permanent delete needs a second confirmation;
|
|
279
|
+
- **If automatic recovery is not possible**, the rescue panel flags it for manual review; session files and backups are kept;
|
|
280
|
+
- **Recently opened sessions still resident in Harness memory** cannot be deleted until you restart Harness (the UI says so clearly).
|
|
281
|
+
|
|
282
|
+
> Failure paths prefer keeping your data โ sessions are never silently dropped.<br>
|
|
283
|
+
> This is **not** a claim that every error auto-recovers: extreme cases need manual action, with data left in place.
|
|
284
|
+
|
|
285
|
+
## โ ๏ธ Known limitations
|
|
286
|
+
|
|
287
|
+
- Moving into the "Ungrouped" bucket is not supported;
|
|
288
|
+
- Sessions still resident in Harness memory (opened recently) cannot be deleted until you restart Harness;
|
|
289
|
+
- If a third-party plugin fully redraws the sidebar, features may stop triggering (**no data damage**);
|
|
290
|
+
- Flat list view has no workspace title rows โ the plugin stays inactive there;
|
|
291
|
+
- Major host upgrades that change internal structures may degrade some actions or require a restart; the move-home wizard aborts before touching files if it cannot write safely.
|
|
292
|
+
|
|
293
|
+
## ๐ Recent version
|
|
294
|
+
|
|
295
|
+
### v2.3.0 ยท 2026-10-13
|
|
296
|
+
|
|
297
|
+
- **Reusable recovery snapshots**: identical content reuses an existing snapshot, ignoring migration-only `cwd` changes. Changed content creates a new backup. Every move retains its source, target, and snapshot reference in history; up to 20 physical snapshots are retained by default, with legacy backups supported.
|
|
298
|
+
- **Clearer preview**: shows actual source, target path, collisions, running state, and newly required backup bytes. Reuse is explicit. A workspace selector fixes incorrect return-move targets.
|
|
299
|
+
- **Busy-session queue**: running sessions remain untouched and wait in a persistent queue for idle. Cancel and individual/batch retry are available; real DSH process-restart recovery remains unverified.
|
|
300
|
+
- **Storage and format diagnostics**: reports adapter mode and degradation reasons. Sandbox coverage includes v3/v4 and plain/Zstd, unsupported formats, unknown layouts, and damaged data without forced upgrades.
|
|
301
|
+
- **Branch and portable-bundle APIs**: optional descendant selection, export, checksums, and dry-run import. Conflicts and known insufficient space block import. These features have sandbox coverage but remain unverified in a real runtime.
|
|
302
|
+
- **Recovery fixes**: default restoration selects the newest backup; bundle space estimates include attachments. Added the npm weekly downloads badge.
|
|
303
|
+
|
|
304
|
+
### v2.2.0 ยท 2026-10-09
|
|
305
|
+
|
|
306
|
+
- **Batch moves no longer *guess* a session's identity**: when the authoritative id channel is unavailable, the old fallback substituted the next id in order; unresolvable rows are now skipped and reported in the confirm dialog, and a move with nothing resolvable aborts without touching any file
|
|
307
|
+
- **Target-group resolution must prove itself**: it no longer falls back to DOM position when neither title nor path matches โ the official sidebar hides groups whose folder is gone, and the positional fallback moved sessions into a neighbouring group
|
|
308
|
+
- **Client hot-reload no longer stacks instances**: all seven document listeners and the menu observer are released through the host effect channel, plus a duplicate-apply guard; re-loading used to stack a second copy (double confirm dialogs, duplicate requests)
|
|
309
|
+
- **Storage-layout self-check**: one real session's directory is reverse-derived and verified, surfacing in `mover.status` and the Doctor panel (`data-layout`) so "one day everything is unfindable" becomes a visible degraded state instead
|
|
310
|
+
- **Orphan backups are visible and cleanable**: a purged session left up to 20 migration backups on disk forever; orphans are now flagged with one-click cleanup, and "purge" offers to remove them too
|
|
311
|
+
- **Archived list explains truncation**: the scan parses only the newest 400 archives, so older archived sessions can be missing โ the UI now says so
|
|
312
|
+
- **Tunable policies**: physical snapshot retention / history length / batch cap / repoint cap / scan cap / cleanup age accept environment overrides (`DSH_WORKSPACE_MOVER_*`)
|
|
313
|
+
- **Official APIs replace private coupling**: unarchive uses the official `registry.unarchiveSession` (with a fallback path); title sync uses official `entity.setTitle` and is decoupled from the path redirect; `record.sessionIds` reads are consolidated into one accessor
|
|
314
|
+
- **Accessibility and copy**: dialogs gain `aria-labelledby`, initial focus and a Tab trap; Esc respects "not while typing in the composer"; dead strings removed and two hard-coded English strings localized, with a zh/en key-parity warning
|
|
315
|
+
- **Ecosystem metadata**: `screenshots.json` lets the plugin control its storefront card; host-package `peerDependencies` are declared as `*` and optional (metadata only โ the real floor is `engines.dsh`, and any runtime mismatch is reported through capability flags); long-standing tool-count and compatibility drift in the READMEs/ARCHITECTURE is corrected
|
|
316
|
+
- **Fixed**: those peer ranges were first written in the ecosystem's "explicit prerelease branch" idiom, which made the host declare this plugin **incompatible with `0.2.0-rc.2`** โ an upper bound of `<0.2.0-0` excludes *every* 0.2.0 prerelease, because npm evaluates each `||` alternative as a set and `0.2.0-rc.2 > 0.2.0-0`. All eight are now `*`, with a regression test spanning 0.1.5-rc.1 through 1.0.0
|
|
317
|
+
- Tests 108 โ 144 (10 client DOM cases, 13 policy/Config/peer-range cases, plus host-side capability-flag, self-check and backup-GC coverage)
|
|
318
|
+
|
|
319
|
+
### v2.1.1 ยท 2026-10-05
|
|
320
|
+
|
|
321
|
+
- `mover.doctor` self-check: a "Doctor" button in the rescue panel plus a `mover_doctor` agent tool โ ~13 checks over host services, data directories, recovery records and workspace paths, reported as pass/warn/fail; run it after a DSH upgrade before attempting anything else
|
|
322
|
+
- Trust assets: the npm one-liner featured under the tagline (the `dsh://` deep-link button was removed โ GitHub strips custom-protocol links), dsh.so risk badge (listed, L5 run-tested / risk low), dsh-plugin-registry badge, "DSH tested 0.2.0-rc.2" badge
|
|
323
|
+
- Compatibility report: `docs/compatibility/` records the desktop verification; every future DSH adaptation adds a dated copy
|
|
324
|
+
- Security section rebranded as **Safety Ledger** with an explicit never-does list
|
|
325
|
+
|
|
326
|
+
### v2.1.0 ยท 2026-10-04
|
|
327
|
+
|
|
328
|
+
- Agent tools: `mover_list_sessions` (read-only listing) / `mover_move_session` / `mover_repair_sessions` register into the official `dsh-tools` registry and become callable from the conversation
|
|
329
|
+
- Mutating tools ask through the host approval seam before acting: denial, dismissal, or no answerer means nothing happens (fail-closed)
|
|
330
|
+
- They share the panel's locked, backup-first, post-move-verified pipeline; hosts without `dsh-tools` skip registration
|
|
331
|
+
- Desktop (0.2) verified in real use: fixed the post-hot-reload "inactive context" move error, and the confirm dialog is now opaque instead of blending with the text underneath
|
|
332
|
+
- `mover.status` gains an `agentTools` capability flag
|
|
333
|
+
|
|
334
|
+
### v2.0.3 ยท 2026-09-21
|
|
335
|
+
|
|
336
|
+
- First publish to npm: `dsh plugin --profile web add dsh-workspace-mover`
|
|
337
|
+
- Local quality gate `npm run check`; CI mirrors the same steps
|
|
338
|
+
- README npm / DSH badges and host compatibility matrix
|
|
339
|
+
|
|
340
|
+
Full history: [CHANGELOG.md](CHANGELOG.md).<br>
|
|
341
|
+
Architecture: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
|
|
342
|
+
|
|
343
|
+
## License
|
|
344
|
+
|
|
345
|
+
MIT
|
|
346
|
+
|