dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
在 DSH 插件页的「已安装」分组标题右端加一个勾选式开关:点开是当前方向下非官方插件的清单,默认全选,只切换你保留勾选的那些;全部停用后按钮翻转成启用侧。只做启用/停用,从不卸载插件、也不删除插件文件与配置,界面文案跟随应用语言。
English | 中文
Adds a Disable unofficial plugins… button to the right end of the Installed group header on the DSH Plugins page. It opens a checklist of the unofficial plugins in the current direction — all checked by default — and toggles only the ones you leave checked; once everything is disabled the button flips to Enable unofficial plugins…. Disabling and enabling only: it never uninstalls a plugin and never deletes plugin files or configuration data.
Note on language. This file is the English documentation; the Chinese original is README.zh.md. The copy this plugin injects into the Plugins page follows the software language (Settings → General → Language): it registers a Chinese and an English dictionary with the host locale service and repaints itself — button, open dialog and result report — the moment you switch. Strings below are quoted in English, with the Chinese original in parentheses.
section[data-plugin-group="bundles"]), vertically centered with that row's title and count; the title and count nodes keep their positions and the row keeps its height.全选 / 全不选 in Chinese) and a live counter N of M selected (已选 N / M), and the primary button label follows the selection (e.g. Disable 17 plugins / 停用 17 个插件); with nothing checked the primary button is greyed out and does nothing when clicked.Full diagnostics (完整诊断) collapsible area, collapsed by default — a long diagnostic will not distort the package name on the same row.A plugin enters the checklist only when all of the following hold:
@deepseek-ai/dsh-base, @deepseek-ai/dsh-web-app, @deepseek-ai/dsh-headless, @deepseek-ai/dsh-sdk-app, @deepseek-ai/dsh-acp-app, @deepseek-ai/dsh-sdk-minimal;@deepseek-ai/ — every bundle shipped with a DSH install is published under that scope, so community and third-party plugins (including other scopes such as @michengai/ and @liustack/) all fall outside it;Matching plugins are then split three ways by what can actually be done to them:
| Class | Meaning | Handling |
|---|---|---|
| Disableable | Currently enabled and changeable through the profile bundle layer | Listed in the disable side checklist |
| Enableable | Unofficial, but already disabled | Listed in the enable side checklist once everything is disabled |
| Read-only | Carries a readOnlyReason (officially managed, not manageable) | Excluded from both directions, with the reason reported honestly in the confirm dialog and in the result |
The button greys itself out and gives the specific reason on hover:
No switchable unofficial plugins (N read-only entries can be neither disabled nor enabled) — 没有可切换的非官方插件(N 个只读项既停不了也启用不了)No unofficial plugins are installed — 没有安装任何非官方插件Reading the plugin list… / Disabling unofficial plugins… — 正在读取插件列表… / 正在停用非官方插件… (while reading and while running)The plugin management service is not ready (remote is present, remote.pluginManager is not mounted yet; waiting) — 插件管理服务未就绪(remote 已在,remote.pluginManager 尚未挂载,正在等待). When the host remote service mounts later than the page, the button greys out, retries automatically, and recovers by itself once the service is ready.Hover hints while the button is usable:
Choose the unofficial plugins to disable (N can be disabled; disable only, never uninstall) — 选择要停用的非官方插件(共 N 个可停用,只停用不卸载)Choose the unofficial plugins to enable (N can be enabled; enable only, never install) — 选择要启用的非官方插件(共 N 个可启用,只启用不安装); N read-only entries will be skipped is appended — ,另有 N 个只读项会被跳过From the npm registry:
dsh plugin --profile <profile> add dsh-disable-unofficial-plugins
Or straight from GitHub:
dsh plugin --profile <profile> add github:WhatCannotBeSaid/dsh-disable-unofficial-plugins
Replace <profile> with the target profile name (for example web or dsh-tui). Restart DSH after installing: the client bundle is only refreshed when the module graph is recomposed, so a plain page refresh hits the old cache.
dsh plugin --profile web remove dsh-disable-unofficial-plugins
Uninstalling removes this plugin itself, but it does not re-enable the plugins it disabled, and does not disable the plugins it enabled.
inject = [], empty apply).listBundles() and setBundleEnabled(name, enabled) on ctx.get('remote.pluginManager'). Note that the remote namespaces are separate cordis services named in dotted form remote.<namespace>, so ctx.get('remote').pluginManager cannot be used.dsh.profile.bundles), so some changes only take effect after restarting DSH; the result report calls those items out separately.--dsw-*), each with a fallback value, so it follows the current theme.inject = ['remote', 'locale'], and its package declares the matching client modules in dsh.client.inject (@deepseek-ai/dsh-api-remotes, @deepseek-ai/dsh-client-locale). It registers its own disableUnofficialPlugins namespace as a { zh, en } dictionary with the official locale service (ctx.locale.register + ctx.locale.bind); the host half stays side-effect free (inject = []).cancel / close are not duplicated in this plugin's dictionary — they come from the locale service's own common namespace, so every host-provided translation of those two words is picked up at once.locale/en.json (the English root, "One-Click Plugin Toggle") and locale/zh.json ("插件一键启停") declare meta.title / meta.description, and exports maps ./locale/* straight through so every language file in that directory resolves through this package. Three rules the Host reader enforces: locale/en.json is the anchor — without it no sibling file is read at all; a file whose name (minus .json) is not a plain language id, or whose resolved path leaves locale/, throws and costs you the whole title; and a file present on disk but missing from exports does the same, which is why the mapping is a pattern rather than one entry per language.插件一键启停 / "One-Click Plugin Toggle") instead of the bare package name. No behaviour change.MIT, see LICENSE.