Missher12/deepseek-harness-desktop--packages-client-ui-plugin-manager ↗★ 0
@deepseek-ai/dsh-client-ui-plugin-manager
Plugin management for the dsh web client: the sidebar Plugins panel installs, enables, disables, retries, and composes installed plugin packages 适合需要通过侧边栏面板直观管理和配置DSH插件的Web端用户。
Install
This plugin has no verified bundle, or compatibility checks failed. Read the repository notes first. Read the full README ↗
README
Read the full README ↗Configuration pages
A plugin that carries its own configuration renders it on this page rather than in Settings, through three slots the page declares: plugins.item (list) for an official plugin, listed in the Official group by its label; plugins.bundle.config (keyed by the bundle's package name) for a bundle's own configuration, shown on the bundle's page between its description and its rows; and plugins.row.config (keyed by #) for one row's configuration, which gives that row a Configure control opening the row's page. The page asks every entry for two views through its owner props: view: 'summary' for the one-liner under the title, view: 'page' for the form with its own save control. Only a save writes: the page draws the title, icon, and crumb, and the entry's form drops its staged edits when the page is left. The four host-plane pages the installation ships — the shell executor, the agent loop, subagent model selection, and the DeepSeek search provider — come from ui-settings-plugins, registered while the Host serves their namespaces. A bundle's browser half registers the same way:
ctx.slots.inject('plugins.row.config', () => ctx.slots.register({
name: 'plugins.row.config',
key: '@acme/dsh-sidebar#sidebar',
locale: 'acmeSidebar',
}, ({ t, view }) => view === 'summary' ? t('summary') : ))
The bundle's patch must declare the row under that id, and the registration exists while the bundle is on, so a bundle that is off shows no configure control.
Configuration slots
The page's main registration declares plugins.item, plugins.bundle.config, and plugins.row.config as its children, so the slots exist while the page does and a registrant's ctx.slots.inject waits for them. configLedgerSource projects the three ledgers into one observable — the official items in ledger order with their labels resolved in the active locale, and the bundle and row keys — cached until a ledger or the locale moves; the page binds it as useConfigLedger beside the store and never names a configurable plugin itself. Which page is open is page-local state: the cards, a bundle, an official plugin, or a row of a bundle. A registration lives with the browser half that made it. dsh-client-modules attaches a package's browser half to the Loader row whose specifier is the bare package name, so every page a bundle registers, for itself or for any of its rows, goes away when that row is switched off; a sub-plugin whose page must outlive the other rows ships as its own package.