Back to home@EugeneVl

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
GitHub repo

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

  1. Open the sidebar: in each workspace, folders are shown above the loose sessions
  2. Create a folder — workspace context menu → "New folder"; the name must be unique within the workspace
  3. 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
  4. Move back to the loose area — context menu → "Move to folder…" → "Workspace" (the first entry)
  5. Rename / delete a folder — folder context menu; deletion asks for confirmation and the folder's sessions become loose
  6. Search — the field at the top of the browser; matches are highlighted and clickable
  7. 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

LayerImplementation
Hostlib/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
Clientlib/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

  1. Bump version in package.json and add a CHANGELOG.md entry
  2. Commit, tag vN.N.N, push master and the tag
  3. Point the profile at the new release: dsh plugin --profile web add 'github:EugeneVl/dsh_session_folders#vN.N.N', then restart dsh web