dsh_session_folders
Session folders for the DSH web sidebar: one-level named folders per workspace, drag-and-drop or context menu to group sessions, server-side persistence. No harness changes.
- Stars
- 1
- Language
- JavaScript
- Created
- Aug 19, 2026
- Updated
- Aug 19, 2026
Introduction
dsh-session-folders
A session-folders plugin for the DeepSeek Harness web UI: the sidebar workspace browser is replaced with a browser that adds session folders — one level of named folders per workspace. Sessions can be dragged into folders or moved via the context menu; folder data is persisted server-side and survives page reloads. Status badges mirror the built-in session browser. No harness changes.
Features
- Session folders: one level of named folders per workspace; sessions outside folders live in the "inbox" (loose) bucket
- Move sessions: drag-and-drop a session onto a folder, or use the row context menu — "Move to folder…", with a "New folder…" entry that creates a folder and moves the session into it on the spot; the submenu's "Workspace" entry returns a session from a folder to the loose bucket
- Folder management: create, rename, delete (with confirmation); names are unique per workspace (case-insensitive)
- Collapse / expand all: the chevron button pair in the browser header folds and unfolds every workspace group and folder in one click
- Session search with match highlighting — by title and content
- Status badges Running / Completed — mirroring the built-in session browser
- Server-side persistence: folders live in a DSH storage domain and survive page reloads; view state (collapsed folders, etc.) lives in browser localStorage
- The server is the source of truth: every action is validated server-side (workspace existence, session membership, name conflicts); the client only mirrors the rules
- Bilingual UI: adapts to the page language (zh / en)
Installation
From GitHub
dsh plugin --profile web add 'github:EugeneVl/dsh_session_folders#v0.3.0'
From a local directory
dsh plugin --profile web add /absolute/path/to/dsh-session-folders
From a tarball
pnpm pack
dsh plugin --profile web add /absolute/path/to/dsh-session-folders-0.3.0.tgz
Restart dsh web after installing (the host plugin and the client bundle are loaded at startup).
Usage
- Open the sidebar: in each workspace, folders are shown above the loose sessions
- Create a folder — workspace context menu → "New folder"; the name must be unique within the workspace
- Move a session — drag the session row onto a folder (only into a folder of the same workspace), or context menu → "Move to folder…" → pick a folder, or "New folder…" to create one and move right away
- Move back to the loose area — context menu → "Move to folder…" → "Workspace" (the first entry)
- Rename / delete a folder — folder context menu; deletion asks for confirmation and the folder's sessions become loose
- Search — the field at the top of the browser; matches are highlighted and clickable
- Collapse / expand everything — the chevron button pair at the top of the browser:
- collapse: folds all workspace groups and folders
- expand: unfolds them again
How it works
| Layer | Implementation |
|---|---|
| Host | lib/index.js — a cordis plug-in: 5 POST routes /dsh-session-folders/{list,create,rename,delete,move}; its own storage domain dsh_session_folders (one global record holding the folder list); mutations are serialized through a promise tail so two browsers cannot overwrite each other; workspace and session membership are validated via ctx.workspaceRegistry |
| Client | lib/client.js — a bundle loaded via window.__ModuleLoader__.load, registered in the sidebar.workspaces slot (priority -1); services slots / locale / sessions / workspaces; view state in localStorage (dsh.session-folders.view.v1) |
- Folders do not touch session accounting: the workspace owns sessions, folders are only grouping. A session listed in no folder is loose by definition
- Deleting a workspace does not delete folder records: they stop being served (filtered by live workspace ids) and stay harmlessly in storage
- DSH domains guarantee durability-first writes; the storage file is
~/.dsh/storages/dsh_session_folders.json - No system-prompt changes, no new model tools — zero token impact
Limitations
- One folder level only: nested folders are not supported
- A session can only be moved into a folder of the workspace that owns it; a session outside every workspace (unaccounted) cannot enter a folder
- Folder names are capped at 80 characters; duplicate names are rejected (case-insensitive)
Compatibility
Current version targets DSH 0.1.0-rc.6 (the sidebar.workspaces slot, webServer / storageDomain / workspaceRegistry services, @deepseek-ai/dsh-storage-domain, @deepseek-ai/dsh-workspace, zod). A DSH upgrade that changes slot/service APIs may require adaptation.
Development
There is no build step: lib/ is the committed bundle (host + client). Edit the files directly and syntax-check:
node --check lib/index.js
node --check lib/client.js
Client-side changes (menu items, buttons, rendering) usually only need a browser refresh — the bundle is served on demand; host-side changes (routes, validation) need a dsh web restart.
Release checklist
- Bump
versioninpackage.jsonand add aCHANGELOG.mdentry - Commit, tag
vN.N.N, push master and the tag - Point the profile at the new release:
dsh plugin --profile web add 'github:EugeneVl/dsh_session_folders#vN.N.N', then restartdsh web