dsh-session-manager 0.5.2 → 0.5.4
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 +264 -247
- package/README.md +163 -139
- package/README.zh.md +163 -137
- package/lib/annotation-store.js +198 -198
- package/lib/client.js +2793 -2772
- package/lib/clipboard-parser.js +207 -207
- package/lib/index.js +13 -2
- package/lib/session-files.js +212 -193
- package/package.json +9 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,247 +1,264 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
- **
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
- **
|
|
41
|
-
|
|
42
|
-
- **
|
|
43
|
-
|
|
44
|
-
- **fix(
|
|
45
|
-
|
|
46
|
-
- **
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
- **
|
|
56
|
-
|
|
57
|
-
- **
|
|
58
|
-
|
|
59
|
-
- **
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
- **
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
- **
|
|
68
|
-
|
|
69
|
-
- **
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
- **fix(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
- **
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
- **fix(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
- **
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
- **chore**:
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
- **
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
- **
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
- **
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
- **fix(move)**:
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
- **
|
|
226
|
-
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
- **
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
1
|
+
|
|
2
|
+
## 0.5.4 — 2026-09-30
|
|
3
|
+
|
|
4
|
+
- **docs**: update project description and metadata to reflect official Web UI and Desktop app support; clarify client synchronization, install profiles, and runtime requirements.
|
|
5
|
+
|
|
6
|
+
## 0.5.3 — 2026-09-26
|
|
7
|
+
|
|
8
|
+
- **fix**: issue #17.2 (panel `MoveDialog` now forwards `t` so labels render translated) and issue #17.4 (row Open unarchives archived sessions first).
|
|
9
|
+
|
|
10
|
+
- **fix**: issue #18 — `moveSession` stamps `header.version` from the target filename so v4-named artifacts don't carry stale v0 headers (which broke DSH startup's `listArtifacts`).
|
|
11
|
+
|
|
12
|
+
- **fix**: dialog descriptions (`confirm.move.desc`, `confirm.delete.desc`) show only the friendly `displayTitle`, never the raw id. The title-bar lookup is resolved once per render via IIFE — an earlier attempt invoked `useSessions()` inside an event handler, which crashed the slot framework's `useSyncExternalStore` subscriber and let `SlotErrorBoundary` replace the whole `conversation.session.header.actions` slot with `<div data-slot-error="…" />`, taking every title-bar button down.
|
|
13
|
+
|
|
14
|
+
- **fix**: drop UTF-8 BOM from `package.json` (`JSON.parse` was rejecting it and surfacing the plugin as "all components disabled").
|
|
15
|
+
|
|
16
|
+
- **chore**: remove leftover `TEMP DEBUG` block in `lib/index.js` (issue #18 debugging residue that spammed the log every 2 s).
|
|
17
|
+
|
|
18
|
+
- **test**: regression guard added in `test/issue-17-static-guards.test.mjs`; existing `test/issue-18-move-version.test.mjs` covers #18.
|
|
19
|
+
|
|
20
|
+
## 0.5.2 — 2026-09-23
|
|
21
|
+
|
|
22
|
+
- **fix(bulk management)**: add a missing entry-point for batch operations. The previous build gated the row checkboxes and `BulkActionBar` behind `selectedIds.size > 0`, so neither was ever reachable from the UI. A new **Select** toggle in the panel header now reveals the row checkboxes and the bulk action bar; toggling it a second time clears the selection and exits selection mode. Selection-mode state is also reset whenever the panel closes.
|
|
23
|
+
|
|
24
|
+
- **fix(bulk management)**: the SessionManagerPanel had a duplicated `return` statement above the bulk-dialog declarations (`bulkPreviewDialog`, `bulkProgressDialog`, `bulkResultDialog`, `bulkTagDialog`, `bulkPriorityDialog`, `bulkMoveDialog`, `bulkPresetDialog`). The early return made every bulk dialog unreachable, so the user never saw the confirmation preview, progress bar, or per-id success / failed / skipped result dialog. The duplicate return has been removed; the panel now keeps every dialog declaration live and renders them all in the final Fragment.
|
|
25
|
+
|
|
26
|
+
- **feat(bulk management)**: add the **Migrate preset…** button to the bulk action bar. Selecting rows and clicking the new button opens a preset picker (sourced from `/preset-scan`) and, on confirm, runs the `preset-migrate` action against every selected session through the existing `/batch` endpoint. Sessions already on the chosen preset are reported as skipped in the result dialog; failed sessions can be retried individually.
|
|
27
|
+
|
|
28
|
+
- **fix(host /batch)**: the `/session-manager/api/batch` host handler had four regressions that were hidden by the bulk-dialog UI bug fixed in the same release:
|
|
29
|
+
|
|
30
|
+
1. **archive** called `ctx.workspaces.archiveSession(sessionId)` directly from the per-request dispatch; Cordis rejected it with `cannot get property 'workspaces' without inject`. The host now exposes an `archiveSession` helper that mirrors `unarchiveSession` and updates `workspaceRegistry.archivedSessionIds` atomically.
|
|
31
|
+
|
|
32
|
+
2. **favorite / review / set-priority / add-tags / remove-tags** threw `annotations is not a function` on the first id because the original `runBatchAction` signature destructured `annotations` from its parameter object and callers did not pass it. `runBatchAction` now resolves the annotation accessor from the surrounding closure so it can never again be silently `undefined`.
|
|
33
|
+
|
|
34
|
+
3. **unfavorite / unreview** were not in the `BATCH_ACTIONS` set and were rejected with `action not supported: unfavorite`. Both are now first-class annotation actions; `annotationPatchFromBatchAction` maps them to `{ favorite: false }` / `{ reviewLater: false }`.
|
|
35
|
+
|
|
36
|
+
4. the `BATCH_ACTIONS` set, the annotation action set inside `runBatchAction`, and `annotationPatchFromBatchAction` have been kept in sync.
|
|
37
|
+
|
|
38
|
+
As a hygiene cleanup, an orphan copy of the same handler that was left inside the file header JSDoc (between `/**` and the real `* @dsh-session-manager` description) has been removed. **Important:** if any of these errors were seen before this fix, hard-refresh DSH (Ctrl+Shift+R) so the cached plugin bundle is replaced with the new one.
|
|
39
|
+
|
|
40
|
+
- **fix(bulk dialog positioning)**: the bulk preview / progress / result / tag-input / priority / move / preset-migrate dialogs had only a `z-index` rule on `.sm-bulkDialog.sm-nativeDialogLayer` and inherited the default `position: static`, so they rendered in normal document flow at the bottom of the panel (below the row list). They now reuse the same fixed-position `inset: calc(50vh - 90px) auto auto calc(50vw + 308px)` as `.sm-confirmDialog.sm-nativeDialogLayer` and pop up to the right of the panel, matching every other per-row dialog.
|
|
41
|
+
|
|
42
|
+
- **fix(bulk dialog dark mode)**: every `[data-sm-theme=dark]` override that previously covered `.sm-panelDialog` / `.sm-confirmDialog` / `.sm-migrateDialog` now also covers `.sm-bulkDialog`. Without this, dark mode rendered the bulk dialog body, header, footer, list, result list, progress bar and progress fill in default white-on-white, making the dialog text invisible.
|
|
43
|
+
|
|
44
|
+
- **fix(footer)**: FooterAction now reads `props.wide` from `SidebarFooterActionOwnerProps` and renders differently for collapsed (`scope: 'root'` rail, 36x36 icon-only button) vs expanded (full-width row, icon + label, left-aligned) sidebar (DSH 0.1.6+ `sidebar.footer.action` slot contract).
|
|
45
|
+
- **test(bulk management)**: add client-side coverage for issue #13: est/client-bulk-selection.test.mjs (static guards on the selection-state hooks), est/client-bulk-actions.test.mjs (static guards on the BulkActionBar wiring + locale coverage), est/client-bulk-runbatch.test.mjs (unit coverage for the runBatch wrapper via runInNewContext with a stubbed fetch), and est/client-bulk-static-guards.test.mjs (cross-cutting structural invariants -- namespace ownership, panel dialog sibling layout, fan-out refresh, host/client action vocabulary). Total tests: 225 (188 pre-existing + 37 new).
|
|
46
|
+
- **feat(bulk management)**: add multi-select checkboxes to session rows plus a sticky bulk action bar with archive, unarchive, favorite, unfavorite, mark-for-review, clear-review, add-tags, clear-tags, set-priority, move-to-workspace, and delete actions. Destructive actions run through a BatchPreviewDialog with per-id skip/fail grouping; non-destructive ones fire immediately. Progress, success/failure counts, per-item error reasons, and a one-click **Retry failed** re-arm the failed ids back into the selection. The /batch endpoint is reused so per-id errors surface as partial failures without aborting the batch. Bulk state is reset when the panel closes or the filter excludes a selected row.
|
|
47
|
+
- **feat(sessions)**: `ARTIFACT_NAMES` now lists `session.v4.jsonl.zstd` first so DSH 0.1.7 V4-default session artifacts are picked up by the list-snapshot reader. Existing V3/V2/V1 files remain readable; the reader is version-agnostic and parses the header JSON regardless of declared version, so no per-version code paths are required.
|
|
48
|
+
|
|
49
|
+
## 0.5.1 — 2026-09-18
|
|
50
|
+
|
|
51
|
+
- **feat(annotations)**: add favorites, manual review flags, tags, multiline notes and priority (1 highest → 5 lowest, default **3 Normal**) to the manager and title bar. Add annotation search/filtering and priority sorting. Persist separately from session history with atomic writes, an inter-process lock, strict limits, conflict detection and deletion cleanup; synchronize browser surfaces and preserve unsaved drafts on failure.
|
|
52
|
+
|
|
53
|
+
- **feat(annotations)**: add an opt-in AI-assisted workflow in the annotation editor. A **Copy Prompt** button copies a strict-JSON prompt (Chinese or English, matched to the UI locale) to the clipboard for the user to paste into the current conversation. An **Import** button reads the clipboard, extracts the first JSON object (tolerating Markdown fences, conversational wrappers, smart quotes, stray backslashes and a leading BOM), validates tags/note/priority against the same limits, and populates the editor fields. Oversized notes are truncated and flagged in the status message; invalid tags/priority are dropped with reasons. Importing into a dirty draft triggers a confirm. Both buttons stay out of the conversation history — the plugin never calls the model directly. The parser is also exported as `parseClipboardAnnotation` from `lib/clipboard-parser.js` for tests and potential server-side reuse.
|
|
54
|
+
|
|
55
|
+
- **feat(annotations)**: add inline clear buttons inside the **Tags** and **Note** fields of the annotation editor. Each button only appears while the corresponding field has content and clears it without touching the other controls. Both buttons are disabled while a save is in flight and respect the existing Escape / IME handling.
|
|
56
|
+
|
|
57
|
+
- **feat(annotations)**: redesign the annotation editor layout. Favorite and review flags stack vertically on the left; priority and its small help text occupy the right column. The **Tags**, **Note**, and AI **paste** textareas all share the same `sm-noteInput` style and `rows: 3` height (60px min-height), so the three input boxes line up visually. The "{count} / 2000 chars" note counter and the privacy hint are removed; help text is moved into each input's `placeholder`. In the AI paste block the two buttons now sit **above** the paste textarea (Import on the left, Copy Prompt on the right) so the editor footer stays consistent. The priority label now uses the same 13px font as the favorite / review checkboxes.
|
|
58
|
+
|
|
59
|
+
- **feat(annotations)**: remove the "Not set" priority option. Priority is always one of 1–5, and the default is **3 (Normal)**; legacy data with `priority: null` is normalized to 3 in display, sort and filter, so there is no longer a separate "always-sorts-last" state. The priority filter dropdown, row badges and header badge all reflect the unified 1–5 scale; AI-returned `"priority": null` is also normalized to 3 by the clipboard parser. The priority help text now reads "1 is highest, 5 is lowest. Default is 3 (Normal)."
|
|
60
|
+
|
|
61
|
+
- **fix(annotations)**: in the manager's row badges, P1–P5 now always render (legacy `null` renders as P3) so the priority column is visually consistent across all rows instead of being absent for unset entries. The header shortcut button likewise always shows the current P-number badge.
|
|
62
|
+
|
|
63
|
+
- **fix(annotations)**: the AI copy/paste prompt now follows the active UI language. The dialog detects the language from the t() function (probing `marks.favorite`) instead of relying on `window.__smActiveLanguage`, which was never set; the prompt button writes Chinese under a Chinese UI and English under an English UI even when the global flag is missing.
|
|
64
|
+
|
|
65
|
+
- **fix(annotations)**: the AI paste workflow's error message now appends the actual `JSON.parse` error position from each recovery attempt (raw / fix quotes & backslashes / scan object / scan object + fix), so users can see exactly which character broke parsing when the auto-repair still fails. The parser also strips a leading UTF-8 BOM, normalizes smart quotes, and repairs stray single backslashes inside string values.
|
|
66
|
+
|
|
67
|
+
- **feat(annotations)**: tag input accepts both English `,` and Chinese `,` as separators (regex `/[,,\n]/`), trims whitespace around each tag, drops empty entries, and merges case-insensitive duplicates — so AI outputs in either locale parse cleanly without the user having to re-type the separator.
|
|
68
|
+
|
|
69
|
+
- **feat(manager)**: add case-insensitive title/session-ID search, workspace/ungrouped filtering, four time-order modes, matching/total counts and reset controls; combine them with the existing archive filter. Creation times are supplied from cached host headers when DSH summaries omit them, without reading logs. Add workspace load/retry handling, stale-request cancellation, narrow-screen layout, IME-safe Escape handling and real-bundle interaction tests.
|
|
70
|
+
|
|
71
|
+
- **fix(safety)**: validate session IDs, directory containment, symlinks/junctions and artifact identity before deletion or file rewrites; reject an already occupied move destination.
|
|
72
|
+
- **fix(persistence)**: separate backup/publication/rollback phases; never delete the original after a failed backup rename. Preserve recovery files and report their paths if rollback fails, and clean uncommitted temporary files after write failures.
|
|
73
|
+
- **fix(zstd)**: use structural frame decoding on every rewrite path and reject corrupt/torn logs instead of publishing a decoded prefix.
|
|
74
|
+
- **fix(startup)**: distinguish incomplete scans from empty libraries; normalize snapshot headers, preserve live/concurrently attached sessions, and reconcile using a fresh immutable registry state.
|
|
75
|
+
- **perf**: read only orphan artifact headers during enumeration and avoid duplicate full readRaw decoding for mutations.
|
|
76
|
+
- **chore(test)**: test the real plugin routes instead of a copied move implementation; cover traversal, junctions, corruption, rollback failures, concurrent mutations, and startup read failures. Run module imports, tests, and package checks on Windows/Linux with Node 22.15.0/24; declare the Zstd-capable Node requirement.
|
|
77
|
+
|
|
78
|
+
## 0.4.11 — 2026-09-14
|
|
79
|
+
|
|
80
|
+
- **chore(client)**: drop `@deepseek-ai/dsh-client-runtime` from `dsh.client.inject`. The package is no longer shipped by DSH 0.1.5-rc.2 / 0.1.2-alpha or newer (its client-bootstrap role was folded into `@deepseek-ai/dsh-client-store`). This plugin's bundle never required it, so removing the stale reference is a no-op at runtime and only cleans up the published manifest (#12).
|
|
81
|
+
|
|
82
|
+
## 0.4.10 — 2026-09-13
|
|
83
|
+
|
|
84
|
+
- **fix(move)**: cross-workspace move no longer breaks the live JSONL writer. The DSH JSONL backend keeps one `JsonlSessionHandle` per session id in an in-process tracker; its `header.cwd` is captured at construction, and the api-gateway's `session/event` router writes through that handle, so a session whose header was rewritten in memory but whose writer was still pointing at the pre-move directory started throwing `ENOENT` on the first new message (issue #8). `moveSession` now mutates the live writer's `header` in place so its persist path flips to the target `cwd` while the same handle, queue, cursor, and lease are retained; the Agent's owned handle therefore stays consistent with the tracker entry, and no `session/disposed` is fabricated. If the runtime does not expose a rebindable writer (older DSH builds or a custom backend), the move now refuses up front with a clear message instead of silently leaving the live session writing to a deleted path. Adds `test/issue-8-move-enoent.test.mjs` (post-move writer identity stability + a "no-fix ENOENT" regression guard) and `test/issue-8-repro/` (a standalone reproducer script).
|
|
85
|
+
|
|
86
|
+
- **chore**: bump version to 0.4.10.
|
|
87
|
+
|
|
88
|
+
## 0.4.9 — 2026-09-12
|
|
89
|
+
|
|
90
|
+
- **fix(ui)**: Session manager panel and inner dialogs (Delete / Move /
|
|
91
|
+
Migrate confirmations) now close on Esc regardless of focus
|
|
92
|
+
position (issue #7). The original layer-bound onKeyDown was
|
|
93
|
+
unreachable because the sidebar toggle / row button that opened
|
|
94
|
+
each modal stayed focused -- focus is a sibling of the layer,
|
|
95
|
+
not a descendant, so keydown never bubbles into the modal subtree.
|
|
96
|
+
ConfirmDialog / MoveDialog are also used by the title-bar Delete
|
|
97
|
+
/ Move actions, so this fix applies there too.
|
|
98
|
+
|
|
99
|
+
- **fix(ui)**: Modals now close ONLY via Esc or their explicit close
|
|
100
|
+
buttons. The original 0.4.7 behavior (close on backdrop click)
|
|
101
|
+
was removed per user feedback -- a stray click outside the panel
|
|
102
|
+
was dismissing it accidentally. Every `.sm-nativeDialogBackdrop`
|
|
103
|
+
`onMouseDown` handler is gone; the dim backdrop itself is also
|
|
104
|
+
gone so opening a modal never darkens the page (sidebar or
|
|
105
|
+
content area).
|
|
106
|
+
|
|
107
|
+
- **refactor(ui)**: Esc handling moved from per-layer `onKeyDown`
|
|
108
|
+
to a `window`-level `keydown` listener via `useEffect` on every
|
|
109
|
+
modal. A `useRef` lets the listener see the latest state values
|
|
110
|
+
without re-subscribing on every render. The panel listener
|
|
111
|
+
returns early when any inner dialog is open so the child
|
|
112
|
+
dialog's listener gets the first shot at Esc.
|
|
113
|
+
|
|
114
|
+
- **fix(ui)**: After a keyboard-driven close (Esc), the originally
|
|
115
|
+
focused trigger button (sidebar toggle / row button / Cancel
|
|
116
|
+
button) no longer leaves a lingering `:focus-visible` ring. The
|
|
117
|
+
four Esc handlers `blur()` the active element after the close
|
|
118
|
+
call. Mouse-driven closes are not affected -- `:focus-visible`
|
|
119
|
+
only activates for keyboard-acquired focus.
|
|
120
|
+
|
|
121
|
+
- **fix(ui)**: ConfirmDialog no longer listens for Enter at the
|
|
122
|
+
layer level. The previous handler raced with the focused Cancel
|
|
123
|
+
button's native Enter handler -- both fired (`onCancel` +
|
|
124
|
+
`onConfirm`). Enter now lives only on the focused button.
|
|
125
|
+
|
|
126
|
+
- **cleanup(ui)**: Remove three dead `<section>` `ref={(el) =>
|
|
127
|
+
el.focus()}` callbacks (sections have no `tabindex` and are
|
|
128
|
+
not focusable, so the focus calls were silent no-ops). Also
|
|
129
|
+
remove the now-unused `onPanelKey` callback and `tabIndex: -1`
|
|
130
|
+
attributes on the modal layers. The `.sm-nativeDialogBackdrop`
|
|
131
|
+
divs are no longer rendered at all -- they had no behavior left
|
|
132
|
+
after removing the click-to-close.
|
|
133
|
+
|
|
134
|
+
- **chore**: bump version to 0.4.9.
|
|
135
|
+
|
|
136
|
+
## 0.4.7 — 2026-09-10
|
|
137
|
+
|
|
138
|
+
- **fix(disk scan)**: include `session.v3.jsonl.zstd` in the on-disk
|
|
139
|
+
filename list used by readSessionArtifact() and listSessionHeaders().
|
|
140
|
+
DSH 0.1.5-rc.1's persistence backend writes generation v3 artifacts at
|
|
141
|
+
that filename; the 0.4.6 release scanned only v2/plaintext names, so
|
|
142
|
+
fresh sessions appeared to have no disk record and the move/migrate
|
|
143
|
+
endpoints failed with "session has no artifact".
|
|
144
|
+
|
|
145
|
+
- **chore**: bump version to 0.4.7.
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
## 0.4.6 — 2026-09-05
|
|
149
|
+
|
|
150
|
+
- **fix(persistence)**: read all concatenated Zstandard frames in a session
|
|
151
|
+
artifact. DSH writes one frame for the header and additional frames for
|
|
152
|
+
event batches; reading only the first frame made sessions appear to lose
|
|
153
|
+
their event history after refresh.
|
|
154
|
+
- **fix(move)**: preserve the session generation/header version when
|
|
155
|
+
re-homing an artifact, and synchronize the live session, persistence
|
|
156
|
+
coordinator, registry indexes, and workspace accounting after a move.
|
|
157
|
+
This avoids stale-path `ENOENT` failures and v2/v0 filename/header
|
|
158
|
+
mismatches on the next DSH startup.
|
|
159
|
+
- **fix(preset migration)**: fall back to an id-based artifact scan when a
|
|
160
|
+
persistence locate result points at a stale path, and mirror cold-path
|
|
161
|
+
migrations into the live session projection.
|
|
162
|
+
- **fix(client)**: stop calling the removed/unavailable
|
|
163
|
+
`noteAgentPreset` client method; refresh the session projection instead.
|
|
164
|
+
- **recovery**: add `scripts/heal-v2-sessions.ps1` for the DSH 0.1.1-rc.2
|
|
165
|
+
boot-time quirk where `session.v2.jsonl.zstd` contains a `version: 0`
|
|
166
|
+
header. Run it before starting DSH; this repair must happen before DSH's
|
|
167
|
+
workspace initialization, which is earlier than user plugin `apply()`.
|
|
168
|
+
|
|
169
|
+
- **docs**: bump version to 0.4.6.
|
|
170
|
+
## 0.4.5 — 2026-09-05
|
|
171
|
+
|
|
172
|
+
- **fix(move)**: keep the live session and agent in place during a cross-workspace
|
|
173
|
+
move. The previous code tore down the live agent/session, moved the file, then
|
|
174
|
+
called `ctx.agents.resume` to re-create the agent. DSH's `agent/status` event
|
|
175
|
+
is only emitted on phase changes, so a freshly resumed agent never told the
|
|
176
|
+
client it was now idle, leaving the sidebar's model selector and send button
|
|
177
|
+
disabled ("session unavailable") until a manual browser refresh. The new path flushes
|
|
178
|
+
pending events to disk, updates the in-memory session header + coordinator
|
|
179
|
+
state + workspace accounting in place, and atomically renames the artifact,
|
|
180
|
+
so the agent's UI keeps showing the same in-memory session with no client
|
|
181
|
+
re-init.
|
|
182
|
+
- **fix(preset migration)**: drop the over-strict `persistence.readRaw` /
|
|
183
|
+
`persistence.list` precondition that caused the
|
|
184
|
+
`/session-manager/api/preset-scan` endpoint to fail with
|
|
185
|
+
`current persistence backend does not support readRaw/list` on a default DSH
|
|
186
|
+
build. The actual `JsonlSessionPersistence` backend exposes both methods, so
|
|
187
|
+
the precondition is replaced with a try/catch around `listSessionHeaders` that
|
|
188
|
+
converts any missing-method failure into a useful
|
|
189
|
+
`failed to enumerate sessions: <detail>` message.
|
|
190
|
+
- **chore**: remove the now-unused `quietLive` / `releaseLiveSession` helpers
|
|
191
|
+
and squash the per-route indentation noise around `/move` and `/workspaces`.
|
|
192
|
+
|
|
193
|
+
## 0.4.4 — 2026-09-03
|
|
194
|
+
|
|
195
|
+
- **docs**: rename the English README wording from `conversation` to `session` to align with the plugin name (`dsh-session-manager`), the Chinese README (`README.zh.md`), the DSH host APIs, and the [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin) registry entry.
|
|
196
|
+
- **chore**: rewrite `package.json` `description` to use `Session manager` / `sessions` for the same alignment, and bump the version to `0.4.4`.
|
|
197
|
+
- **chore(repo)**: update the GitHub repository description to match.
|
|
198
|
+
|
|
199
|
+
## 0.4.3 — 2026-09-03
|
|
200
|
+
|
|
201
|
+
- **docs**: add the [Awesome DSH Plugin](https://awesome-dsh-plugin.com) badge to `README.md` / `README.zh.md` so the repo surfaces its curated registry membership.
|
|
202
|
+
|
|
203
|
+
## 0.4.2 — 2026-09-03
|
|
204
|
+
|
|
205
|
+
- **feat(theme)**: dialogs now auto-follow DSH''s dark/light theme (`data-ds-dark-theme` / ` `code-scheme` / `data-theme`) via a single `data-sm-theme` attribute and scoped CSS variables, with inline `background` / `color` / `border-color` applied to each dialog root so they stay opaque regardless of how DSH resolves its own tokens. The previous manual light/dark toggle button is removed.
|
|
206
|
+
- **docs**: aligned bilingual README structure, dropped the obsolete "no bulk migration" wording, and added an Acknowledgments section that thanks the users and the contributors filing issues and opening PRs. Listed [dsh-market](https://github.com/dsh-market/dsh-market) and [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin) as install sources.
|
|
207
|
+
- **chore**: rewrote `package.json` `description` to match the new English summary.
|
|
208
|
+
|
|
209
|
+
## 0.4.1 — 2026-08-28
|
|
210
|
+
|
|
211
|
+
- **fix(ui)**: keep the title-bar **Delete conversation** button readable on hover with a red background, white text, and red border; remove the unused legacy danger-button rules.
|
|
212
|
+
|
|
213
|
+
## 0.4.0 — 2026-08-28
|
|
214
|
+
|
|
215
|
+
- **feat(session preset migration)**: replaces the former bulk workflow with a
|
|
216
|
+
per-conversation **Migrate preset** action in Session manager. It resolves the
|
|
217
|
+
effective preset from the latest `agent-preset/selected` event or, when absent,
|
|
218
|
+
the session header, then safely updates that one conversation.
|
|
219
|
+
- **fix(lifecycle)**: moving a conversation or migrating its preset now retires stale
|
|
220
|
+
live agents and persistence owners before refresh. This prevents resume failures
|
|
221
|
+
such as `already has a live persistence owner`.
|
|
222
|
+
- **fix(move)**: refreshes session and workspace state immediately and once more after
|
|
223
|
+
the host event race, so a moved conversation reappears in its target workspace
|
|
224
|
+
without a manual browser refresh.
|
|
225
|
+
- **ui**: finalizes header actions and Session manager dialogs: red delete actions,
|
|
226
|
+
per-row preset migration, consistent dialog placement, readable hover states, and
|
|
227
|
+
a close button beside the manager title.
|
|
228
|
+
- **docs**: refreshes bilingual documentation and npm metadata for the single-session
|
|
229
|
+
preset migration workflow.
|
|
230
|
+
|
|
231
|
+
## 0.3.0 — 2026-08-27
|
|
232
|
+
|
|
233
|
+
- **feat(preset migration)**: introduced preset migration support for conversations
|
|
234
|
+
whose configured Agent preset was renamed or removed.
|
|
235
|
+
- **feat(move)**: added workspace move handling and client-side workspace refreshes.
|
|
236
|
+
|
|
237
|
+
## 0.2.1 — 2026-08-26
|
|
238
|
+
|
|
239
|
+
- **fix(move)**: reimplemented cross-workspace moves so the session artifact, stored
|
|
240
|
+
`cwd`, and workspace accounting are moved together while preserving history,
|
|
241
|
+
title, archive state, and derived-session relationships.
|
|
242
|
+
- **feat(workspaces API)**: added the workspace projection endpoint used by the move UI.
|
|
243
|
+
- **guard**: reject subagent and transient blank-session placeholders for move actions.
|
|
244
|
+
|
|
245
|
+
## 0.2.0 — 2026-08-16
|
|
246
|
+
|
|
247
|
+
> ⚠️ The initial workspace-move implementation was superseded by 0.2.1.
|
|
248
|
+
|
|
249
|
+
- **feat(move)**: added the initial move-to-workspace UI and host endpoints.
|
|
250
|
+
|
|
251
|
+
## 0.1.2 — 2026-08-16
|
|
252
|
+
|
|
253
|
+
- **docs**: synchronized package metadata and bilingual README files for publication.
|
|
254
|
+
|
|
255
|
+
## 0.1.1 — 2026-08-16
|
|
256
|
+
|
|
257
|
+
- **fix(panel)**: hide transient blank-session placeholders from the manager panel.
|
|
258
|
+
- **test**: added the host API smoke test.
|
|
259
|
+
- **ci**: added syntax and package-content verification.
|
|
260
|
+
|
|
261
|
+
## 0.1.0 — 2026-08-16
|
|
262
|
+
|
|
263
|
+
- **feat**: initial session deletion with confirmation, archive management, and the
|
|
264
|
+
Session manager panel.
|