soulnet-dsh-sidebar
Verifiedsoulnet-dsh-sidebar Β· v0.1.0 Β· MIT Β· Web UI
SoulMirror sidebar for DeepSeek Harness: replaces dsh's left column and brand with the SoulMirror ones, keeps every stock sidebar seat, and adds new seats (primary nav, header actions) other plugins can fill
Install
dsh plugin add soulnet-dsh-sidebar Confirm the layer applied with dsh --profile default --dump-config β see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Readme
soulnet-dsh-sidebar
The SoulMirror sidebar for DeepSeek Harness (dsh): a dsh bundle that takes over the left column and the brand of the dsh web UI β and nothing else.
- Same skeleton as the stock column (brand row + fold toggle, New Session, the workspace/session browser, footer actions, Settings, the 56px rail when collapsed), so dsh works exactly as before.
- Every stock inner seat is declared again β
sidebar.brand.mark,sidebar.brand.name,sidebar.workspaces,sidebar.settings,sidebar.footer.actionβ so ui-workspace, ui-settings and any footer action mount untouched. - Two new seats for other plugins:
sidebar.nav.primary(navigation rows under New Session; icon-only in the rail) andsidebar.header.action(icon buttons in the brand row, wide only). - The SoulMirror icon and wordmark replace the official brand in the sidebar
and in the new-session hero (
conversation.hero.brand.mark).
How it works
dsh's web UI is a roster of plugin rows (ui-layout, ui-sidebar,
ui-brand-official, β¦). This package's cordis.patch.yml disables the two
rows ui-sidebar and ui-brand-official and inserts itself; its browser half
registers the layout's sidebar seat (the whole left column) and the three
brand seats. No dsh code is forked or patched.
npx -y @deepseek-ai/[email protected] plugin --profile web add soulnet-dsh-sidebar
npx -y @deepseek-ai/[email protected] web --port 3099
Roll back: dsh plugin --profile web remove soulnet-dsh-sidebar β the stock
rows come back on their own.
Filling the new seats (from another plugin)
ctx.slots.inject('sidebar.nav.primary', () => ctx.slots.register(
{ name: 'sidebar.nav.primary', id: 'my-entry', order: 10 },
MyRow, // receives { wide: boolean } (+ t when the registration has a locale)
))
The inject callback fires only once this sidebar has declared the seat, so a
plugin can register into a new seat and a stock one (say sidebar.footer.action)
and stay correct on a stock dsh β see how soulnet-dsh moves its SoulMirror entry.
Types for the two seats (SidebarNavPrimaryOwnerProps,
SidebarHeaderActionOwnerProps) come from soulnet-dsh-sidebar/client
(type-only import; the bundle purity gate erases it).
Layout
packages/sidebar/
βββ cordis.patch.yml disables ui-sidebar + ui-brand-official, inserts soulmirror-sidebar
βββ src/index.ts host half: empty apply (Loader needs a host row)
βββ src/client/
βββ index.ts registers the `sidebar` seat + the three brand seats
βββ SidebarRoot.tsx the column (stock fold state machine + the two new seats)
βββ brand.tsx SoulmirrorBrandMark / SoulmirrorBrandName
βββ brand-assets.ts the app icon, 128px PNG data URI (dsh/scripts/brand-asset.py)
βββ slots.ts SlotMap augmentation for sidebar.nav.primary / sidebar.header.action
βββ locales.ts zh/en (`soulmirror-sidebar` namespace)
βββ styles.ts one <style>, --dsw-* tokens only