Move a session to another folder from the Web UI via drag & drop or a menu picker, permanently delete a session with a risk-consent dialog, and AI-rename a session by summarizing the whole conversation (typo-aware). Each action also ships as an agent tool.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:reinocheong/dsh-session-move
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
Manage DeepSeek Harness sessions from the Web UI — move, delete, and AI-rename, with drag & drop.
A dual-face (host + browser) plugin for DeepSeek Harness (dsh). It fills the gaps the official UI leaves open:
| Feature | Official dsh | With this plugin |
|---|---|---|
| Move a session to another folder (workspace) | ❌ sessions are locked to the folder they were created in | ✅ drag & drop or menu → picker dialog |
| Permanently delete a session | ❌ archive only (hidden, never really gone) | ✅ menu → risk-consent dialog → full removal |
| AI-rename a session | ⚠️ auto-titles exist, but only from the first message | ✅ one-click: LLM summarizes the whole conversation |
Each feature also ships as an agent tool (workbench_session_move, workbench_session_delete, workbench_session_rename_ai), so your agents can organize sessions too.
Install
# from GitHub (recommended until published to npm)
dsh plugin --profile web add https://github.com/reinocheong/dsh-session-move/archive/refs/tags/v0.1.0.tar.gz
Restart the profile for the plugin to load:
# systemd-managed installs
sudo systemctl restart dsh
Note for manual installs (copying the package into
~/.dsh/profiles/node_modules/yourself): you must also register it in the profile'scordis.patch.yml:- insert: - id: session-move name: dsh-session-move
dsh plugin adddoes this automatically.
Usage
🗂 Move a session to another folder
Drag & drop — grab any session row in the sidebar and drop it onto the title of another folder. The target folder highlights while you hover; release to move.
Menu — open a session's ... menu → Move to folder… → pick the target folder → confirm.
Moving a session relocates its working directory: the session header's cwd is rewritten, the persisted log is moved to the target folder's storage slug, and the workspace accounting is updated — history travels with it, and the session keeps working in the new directory afterwards.
🗑 Delete a session
Open a session's ... menu → Delete session → tick "I understand the consequences" → confirm.
Deletion is complete and permanent: running agents are stopped first, then the log directory, projection-cache row, and workspace accounting are removed. Nothing lingers in "Ungrouped".
✨ AI rename
Open a session's ... menu → AI Rename — the LLM reads a representative sample across the whole conversation (evenly sampled to fit the token budget), fixes any typos, and writes a concise title in the conversation's language.
By default it uses the session's own model route. To pin a different provider/model, configure the plugin row:
- id: session-move
name: dsh-session-move
config:
renameAi:
provider: deepseek-official
model: deepseek-v4-flash
targetWords: 6
targetCjkCharacters: 14
maxInputBytes: 8192
maxOutputTokens: 96
timeoutMs: 60000
Agent tools
| Tool | Description |
|---|---|
workbench_session_move |
Move a session to another workspace (by session id + workspace id). |
workbench_session_delete |
Permanently delete a session. |
workbench_session_rename_ai |
AI-rename a session. |
HTTP endpoints
These power the UI; they are also usable directly:
| Endpoint | Method | Body | Returns |
|---|---|---|---|
/__sessionmove/info |
GET | — | all workspaces + the session's current workspace |
/__sessionmove/move |
POST | { sessionId, workspaceId } |
move result (old/new cwd, workspace ids) |
/__sessionmove/delete |
POST | { sessionId } |
what was removed |
/__sessionmove/rename-ai |
POST | { sessionId } |
the new title |
How it works (the short version)
dsh folders ("workspaces") are not free-form containers. A session belongs to the workspace whose path equals the session's working directory (cwd), which is frozen in the header line of the session's zstd-compressed log. Moving a session therefore means:
- stop/flush any live agent,
- rewrite the header line's
cwdto the target folder's path (decompress the first zstd frame, patch the JSON, recompress, keep the trailing frames byte-for-byte), - physically move the log directory to the target folder's storage slug,
- detach from the old workspace and attach to the new one through the workspace registry (which also refreshes the in-memory index, so the UI updates instantly — no restart needed).
All storage mutation goes through dsh's own storageDomain, keeping memory and disk consistent; nothing is left half-accounted.
Performance & footprint
The plugin is designed to be lightweight:
- Zero runtime dependencies — it only uses Node built-ins plus packages dsh already ships (
dsh-tools,dsh-llm,dsh-session-title,dsh-session-title-llm). Nothing new is installed. - No background work — no timers, polling, or resident connections. Move/delete/rename are purely request-driven: work happens while the request runs, then the plugin goes idle.
- Tiny footprint — the whole plugin is ~85 KB of source; its resident memory is negligible against a running dsh process.
- Fast operations — the stateless endpoints answer in ~1 ms (e.g.
/__sessionmove/info); the only potentially slow step is AI rename, which calls the LLM once on demand (a few seconds, timeout-configurable) and never runs otherwise. - Cheap client side — one DOM observer plus three dialogs that render only when opened; nothing runs in the browser while idle.
Requirements
- Node.js
^22.19.0 || >=24.0.0(same as dsh) - dsh
0.1.0-rc.6or newer - AI rename additionally needs the official
@deepseek-ai/dsh-session-title/@deepseek-ai/dsh-session-title-llmpackages (bundled with dsh)
License
MIT
Links
More in this category
Anionex/dsh-turn-rewind★ 50
Rewind conversation and workspace state, powered by a persistent Change Ledger.
Nwflower/dsh-chat-import★ 30
Import full-fidelity chat histories from 13 coding agents (Claude Code, Codex, ChatGPT, Cursor, Gemini, opencode, and more) as resumable DeepSeek Harness sessions, with reverse export back to Claude Code.
Chinesezjc/dsh-interconnect★ 26
Cross-instance message and event handoff between DSH instances via an interconnect server.
whyihaveyou/dsh-suite#plugin-session-export★ 21
Export the append-only session log as human-readable Markdown or HTML, grouped by trajectory source.
hellodigua/dsh-share★ 18
Share your conversations with one click.
Moeblack/dsh-message-edit★ 18
Branch-based message editing, reroll, retry, and a version timeline.