dsh-plugin-settings-float
DeepSeek Harness plugin that turns the settings dialog into a draggable, edge-resizable floating window, so you can keep the chat visible (and usable) while changing settings.
The native settings surface is a centered modal with a full-screen scrim: it covers the conversation and cannot be moved. This plugin keeps the same React tree but lifts the panel out of the modal — no scrim, a floating panel you can drag by its header and resize from any edge or corner.
⚠️ This is a DOM-level enhancement built against the current DSH settings shell. The upstream bundle is never modified, and if a DSH upgrade changes the settings markup the plugin simply stops applying (the settings page keeps working as the native modal). Treat it as a convenience layer, not a fork.
Features
- Draggable — grab the nav title or content header and move the window anywhere.
- Eight resize handles — drag any edge (↑↓←→) or corner (⤡ ⤢); opposite edges stay anchored.
- Chat stays alive — the dark scrim is removed and the overlay stops swallowing pointer events, so the conversation is visible and clickable behind the window.
- Remembers geometry — position and size persist in
localStorageper browser profile. - Reset shortcuts — double-click a header to snap back to the default spot; double-click a resize handle to restore the default size.
- Configurable — defaults, minimum size, enable switch and optional click-outside-to-close are exposed as a DSH plugin config card.
Install
dsh plugin --profile <your-profile> add dsh-plugin-settings-float
Then make sure the bundle is listed in the profile's package.json (the Plugins page does this for you when installed from the GUI):
"dsh": {
"profile": {
"bundles": [ "...", "dsh-plugin-settings-float" ]
}
}
Restart the DSH host — client bundles are composed at boot, so a page refresh is not enough.
Usage
| Action | Result |
|---|---|
| Drag nav title / content header | Move the window |
| Drag any edge or corner | Resize (min size applies, viewport-clamped) |
| Double-click a header | Reset position to the default spot (right side, vertically centered) |
| Double-click a resize handle | Reset size to the configured default |
| Esc / ✕ | Close settings (unchanged) |
Configuration
Open Settings → Plugins → Settings Float (the card is generated from the plugin schema), or set the row config in the profile patch:
- id: settings-float
name: dsh-plugin-settings-float
config:
enabled: true
defaultWidth: 760
defaultHeight: 720
minWidth: 480
minHeight: 320
closeOnOutsideClick: false
| Key | Default | Meaning |
|---|---|---|
enabled |
true |
false keeps the native centered modal |
defaultWidth / defaultHeight |
760 / 720 |
Initial size, used until the user resizes once |
minWidth / minHeight |
480 / 320 |
Smallest size the window can be dragged to |
closeOnOutsideClick |
false |
Sends Escape when the chat behind the window is clicked |
Compatibility
- Verified against DSH
0.2.1-rc.3(desktop and web profile share the same settings shell). - The panel is found by
role="dialog"+ settings-only children, with the release's hashed class only as a fast path — so a rename usually degrades gracefully instead of breaking. - Requires a web-capable DSH surface (
dsh.clientplatformweb).
Privacy
- No network requests, no host-side changes, no telemetry.
- Only two
localStoragekeys are written:dsh.settings-float.pos.v1anddsh.settings-float.size.v1.
Development
npm install
npm test # jsdom smoke tests: mount, 8-direction resize, drag, reset, config
Layout:
lib/index.js host row: plugin entry + Config schema (the settings card)
lib/client.js browser half: DOM enhancement, drag & resize
test/ jsdom smoke tests driving real pointer events
The client bundle uses DSH's client-module ABI (window.__ModuleLoader__.load({ id, factory })); id must match the package name.
License
MIT
No comments yet. Be the first to write one.