Preface¶
When using DSH to run multiple projects, the list of “Workspaces” in the sidebar keeps piling up: recently messaged projects get mixed among dozens of workspaces, requiring scrolling to find them. After a while, a batch of empty workspaces with no conversations accumulates. The official sidebar provides options to add, search, and view, but workspace order cannot be dragged, nor can it be cleaned up in one click; moving a workspace’s directory from Drive D to NAS requires manual handling of conversation attribution, easily leading to “Unassigned” conversations.
Below is an introduction to the client plugin aeroscis/dsh-workspace-manager maintained by Aeroscis. It adds an icon entry in the sidebar’s “Workspaces” title row, consolidating order adjustment, pinning, empty workspace cleanup, and path migration (can move folders and conversations together) into a single panel. Changes are written to the Host’s registry, so other windows see the same order.
What is it¶
One-sentence definition: A workspace manager for the DSH Web sidebar, npm package name @aeroscis/dsh-workspace-manager, maintained by Aeroscis, license MIT.
After installation, it does three things: adjust workspace order (active auto-elevation, pinning, drag-and-drop, one-click organize), clean up workspaces (delete single workspace, bulk remove empty workspaces), migrate paths (point workspace to new path, can move directory and conversation together). It is developed and verified on DSH 0.2.1-rc.3, with engines.dsh declared as ^0.2.1-rc.3.
The plugin provides both Host-side logic and a Web client: Host handles writing order and executing migration, while the client only handles the panel and interaction in the sidebar.
Core Functions¶
Auto-elevation¶
Workspaces that have just sent a message automatically rise above the “first non-running workspace”. It only recognizes new messages sent by the user: opening or browsing conversations, or assistant replies do not trigger elevation; currently running workspaces remain above the elevated position.
“Activity” comes from updatedAt in the DSH session list (the last persisted human prompt time), not the currently open conversation; blank new conversations and sub-agent conversations are not counted. Therefore, after refreshing the page, workspaces that have recently sent messages are still recognized as active workspaces. The top switch can disable this behavior, and the switch is saved in browser localStorage.
Pinning¶
Manually pin workspaces to the front of the list, pinned order follows the selection order. Pinned workspaces display a pin icon in the official sidebar row; clicking this pin un-pins it without needing to open the panel. When hovered, the pin appears side-by-side with the official sidebar buttons without obscuring them. The pinned list is also stored in localStorage.
Drag-and-drop sorting¶
A hamburger handle is on the left of each row; drag up or down to drop at any position. While dragging, the row lifts with the hand, other rows make way in real-time, and it slides into the new position upon release. Auto-scrolling occurs with the scroll wheel or when hitting the edge; Esc cancels. Once the handle gains focus, the row can be fine-tuned using the ↑ / ↓ keys.
One-click organize and remove¶
“One-click organize” reorders once according to “Pinned -> Running -> Recently Sent Message -> Rest (by recent conversation time)”. It only executes when clicked and does not jump repeatedly based on state changes.
Removing a workspace requires confirmation, displaying the number of conversations in that workspace, with an extra prompt when conversations are running. Batch “Clean Empty Workspaces” lists workspaces with no conversations at once and removes them after confirmation.
Open directory and path migration¶
A folder button appears on the right when hovering over a row, opening that workspace’s directory in the system file manager; this button does not appear if the host has no desktop environment.
The “Modify Path” dialog fills in the complete new path:
- When “Move folder together” is checked, the plugin performs the directory move (rename, auto-degrading to copy+delete across volumes if needed); otherwise, only the registration is changed, and the directory stays put. Workspaces whose original directory no longer exists (folder manually moved or renamed) have the switch automatically disabled; this is equivalent to rebinding the workspace to the folder at the new location.
- Settling old conversations:
cwdis directly reattached to the new path (session id unchanged, zero log copy); others are cloned to the new path according to the official fork seed mechanism, keeping conversations continuous and not falling into “Unassigned”; if none are settled successfully, an empty conversation placeholder is created, and remaining old conversations are archived. - Before migration, the current round of live conversations for that workspace is aborted; on Windows, if the directory is locked by a terminal or editor, it reports “In Use” and prompts to close the session/terminal first; if migration fails, the directory is rolled back, leaving no half-state.
After migration success, a result card is displayed, detailing the migration method, session destination, number of old conversations archived, and whether the sort position was preserved.
Panel entry and filtering¶
An extra icon button appears between the sidebar “Workspaces” title and the search icon. It is a normal element in the title row, sitting in the same layout as the Search, View Options, and Add Workspace buttons: it moves together when the sidebar scrolls, collapses, or is dragged to change width; the positions of the official three buttons remain unchanged. When the title row is too narrow to fit the third button, the button is automatically hidden and reappears after the column width increases.
The panel expands downwards from the button’s left edge (covering a section of the conversation area). The button remains visible and shows an active state. Clicking it again, clicking outside the panel, or pressing Esc closes it. The panel defaults to a width based on the longest workspace name; the right edge can be dragged to adjust width; double-clicking the edge restores the default. The top filter box filters in real-time by keys, matching only the name displayed on the row, not the path; Esc clears the filter term. Each row displays the title, number of conversations, and number of running conversations. Renaming is not in the panel; the official sidebar row’s “⋮” menu already has it.
Installation and enablement¶
Install into a profile:
dsh plugin --profile <name> add @aeroscis/dsh-workspace-manager
When modifying the plugin itself, you can directly install the current directory, with the profile referenced via a link; refresh the page after changes:
dsh plugin --profile <name> add ./
After installation, refresh the Web page to load the client part. If the button does not appear, first check if the host version is within the ^0.2.1-rc.3 range, or if the title row width is sufficient to fit the third button.
Typical usage¶
The daily usage order is roughly: install, refresh page -> open panel -> pin or drag as needed -> clean empty workspaces.
Want to move the directory elsewhere. First click “Modify Path” on the row, fill in the complete new path in the dialog; to move the folder together, check “Move folder together”. The plugin will then abort the current round of the workspace’s running conversations, execute the move, and clone old conversations to the new path; if you don’t want to move the directory and only change registration, do not check it. Wait for the result card to appear, confirming the migration method and session destination.
Just want to organize the current list. Click “One-click organize” directly. It reorders based on pinned priority, running second, recently sent messages third, and the rest by recent conversation time. If a project has just sent a message and you want to keep the manual position, just turn off the top “Auto-elevation” switch.
Run tests and release self-checks on the dev side:
npm test # activity judgment, auto-elevation convergence, drag geometry, migration core (validation/move/seed)
npm run check # release shape self-check + test + build preview
Implementation details (panel entry, order writing, two-pass rules for auto-elevation, drag geometry, test chunking methods) are in docs/DESIGN.md, which is an internal design document and does not affect usage.
Data and side effects¶
Order writing to Host registry¶
Order modifications are written to the Host’s workspace registry (global.workspaceIds in $DSH_HOME/storages/workspace.json), not just the current page, so other windows see the same order.
Preferences stay in browser local storage¶
The auto-elevation switch and pinned list are stored in browser localStorage with the key dsh-workspace-manager:prefs:v1. After switching browsers or clearing cache, preferences return to default values (auto-elevation on, no pinned items).
Removing workspaces does not delete conversations¶
Removal only deletes the entry in the registry: conversations are not deleted and will appear under “Unassigned”. Re-registering the same path will not reattach old conversations to the new workspace because conversation attribution is recorded on the new workspace id. The removal operation has no undo entry.
Path migration changes the id¶
Path migration will change the workspace’s registry id (records use realpath as the key; the official implementation has no setPath). Pinned preferences will automatically swap the old id for the new id after a successful migration; the new node is what appears in the sidebar after migration. Migration relies on the host’s optional services like workspaceRegistry / sessionQuery / agents; if the host is missing, the migration panel will explicitly report the reason for the missing service, while other functions remain unaffected.
Applicability and notes¶
Suitable for users who open multiple workspaces in the DSH Web client simultaneously and need to frequently adjust the list order or clean up empty directories; also suitable for scenarios where workspace directories need to be migrated to another drive or NAS, while maintaining continuous history.
A few notes:
- The plugin runs with the permissions of the current dsh process; it will read/write the workspace registry, execute directory moves, and abort the current round of conversations. Before installing, check the source code and
LICENSE(MIT), and confirm the target path and backup as needed. - The button is positioned using CSS Modules generated class names (
sectionHeader,searchSlot). If DSH changes the sidebar structure, the button may no longer appear; theengines.dshdeclaration of^0.2.1-rc.3reflects this limitation. - Only supports the grouping method of the current sidebar version; under “Group by Workspace Tree”, the order is still interpreted according to the Host’s order of sibling workspaces.
- The official “View Options -> Recently Updated” sorts conversations inside each workspace, not workspaces themselves; workspace order is always determined by the manual order saved by the Host, so this option appears to “not take effect”.
- Ecosystem background: DSH’s philosophy is “Everything is a plugin,” the community directory is an independent site, with no official affiliation to DeepSeek / Hypersphere.
Conclusion¶
The value of this plugin lies in consolidating scattered workspace operations in the sidebar into one place: order has rules to follow, empty workspaces can be bulk cleaned, and when moving directories, conversations can follow along. If you maintain multiple workspaces on the Web at the same time, it is worth installing and trying.
- Directory: https://www.skillhub.cn/plugins/Aeroscis/dsh-workspace-manager
- GitHub: https://github.com/Aeroscis/dsh-workspace-manager