soulnet-dsh-sidebar
已验证soulnet-dsh-sidebar · v0.1.0 · MIT · Web 界面
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
安装
dsh plugin add soulnet-dsh-sidebar 用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。
源码
发布到 npm 但没有公开仓库。安装前请检查包内容。
标签
说明文档
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