Releases: fountunt/dsh-session-cleaner
Release list
dsh-session-cleaner v1.0.0 — stable
🎉 v1.0.0 — stable release
The delete-session feature is officially stable:
- ⋮ menu delete item only — the sidebar session row menu now has a single 🗑 "Delete session" item at the bottom (the v0.2.0 header button was removed per user request)
- idle agents are stopped first (via
fiber._unload) so sessions opened in the UI can be deleted - running sessions are refused; ambiguous titles skip the item for safety
- unit tests 4/4; verified end-to-end on a running web profile
History: 0.1.0 (API endpoint) → 0.2.x (Web UI) → 1.0.0 (stable)
dsh-session-cleaner v0.2.4 — fix idle-agent disposal
v0.2.4 — fix idle-agent disposal
The previous release used ctx.dispose to stop idle agents, but cordis contexts are proxies and dispose is not a valid property there (cannot get property "dispose" without inject).
Now the plugin unloads the agent through its fiber: agent.ctx.fiber._unload() — the same teardown path the runtime itself uses, running the agent-loop effect cleanup (and the ordered session teardown) correctly.
- idle agents are stopped before their session is deleted
- running sessions are still refused
- unit tests updated for the fiber API (4/4 passing)
dsh-session-cleaner v0.2.3 — delete open sessions
v0.2.3 — delete sessions that are open in the web UI
Sessions opened in the web UI carry an attached (idle) agent, which the old guard refused to delete. Now:
- idle agents are disposed first (via their own fiber, tearing down agent + session lifecycle in order), then the session is deleted
- running sessions are still refused — a turn in flight is never interrupted
- unit tests for the new disposal path (4/4 passing)
This makes the sidebar ⋮ menu delete item and the header 🗑 button work for every non-running session, including ones you have opened.
dsh-session-cleaner v0.2.2 — fixes
v0.2.2 — fix + polish
- console diagnostics (logs every step: apply / observer / catalog / augment)
- robust menu-to-row pairing (click-capture fallback for portaled menus)
- delete item is now disabled (greyed) for running sessions instead of clickable-but-refused
- fixed package.json BOM that broke pnpm installs
The sidebar ⋮ menu item and the header 🗑 button are both confirmed working via browser console logs.
dsh-session-cleaner v0.2.1 — sidebar menu delete item
v0.2.1 — delete item in the sidebar ⋮ menu
The client half now also appends a 🗑 "Delete session" item to the bottom of the session row menu (the three-dot menu in the sidebar):
- resolves the row's session id from its title (skips ambiguous duplicate titles for safety)
- danger-styled separator + item, confirm dialog, sidebar refresh after deletion
Existing v0.2.0 header button unchanged.
Install / upgrade:
dsh plugin --profile web add dsh-session-cleaner # or update + restart dsh web
dsh-session-cleaner v0.2.0 — Web UI delete button
v0.2.0 — Web UI delete button
The client half now adds a delete button (🗑) to the conversation header actions area:
- One click + confirm deletes the session and refreshes the sidebar
- Disabled while the session is running
- Sessions with an attached agent are refused by the server — the current conversation can never be deleted
Install / upgrade
\\sh
dsh plugin --profile web add dsh-session-cleaner # or update + restart dsh web
\\
Full changelog: v0.1.0 (API endpoint) → v0.2.0 (Web UI button).
dsh-session-cleaner v0.1.0
What's inside
Delete DeepSeek Harness sessions from a running web runtime — no restart needed:
- Live store detach — removes the session from the in-memory SessionStore (fixes ghost sessions that linger in the sidebar after their files are gone)
- Workspace records — detaches the session from every workspace
- On-disk artifacts — deletes the session directory under $DSH_HOME/sessions
Safety: sessions with an attached agent (running or idle) are refused — the current conversation can never be deleted.
Install
\\sh
from npm
dsh plugin --profile web add dsh-session-cleaner
from git
dsh plugin --profile web add github:fountunt/dsh-session-cleaner
\\
Then restart \dsh web.
Usage
\\js
await fetch(/api-ext/session.delete, {
method: POST,
headers: { content-type: application/json },
body: JSON.stringify({ sessionId: session-xxxx }),
}).then(r => r.json());
// -> { ok: true, value: { detached: true, workspaces: 1, files: 1 } }
\\
Changelog
- 0.1.0 — initial release (verified end-to-end against a running web profile; 3/3 unit tests)