dsh-webui-market-plugin

94Star3Fork2Issue0Watching

把 awesome-dsh-plugin.com 插件目录搬进 dsh Web 设置页:浏览、搜索、FIFO 队列一键安装/卸载/更新,含白名单 + 试装验证,可跨 profile 同步,可热挂载免重启。

机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
JavaScript
License
MIT
分支
master
agent-harnessdeepseekdsh-pluginplugin-marketuiweb

安装

$ dsh plugin --profile web add github:Sanqi-normal/dsh-webui-market-plugin

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 Sanqi-normal/dsh-webui-market-plugin:先查看仓库 https://github.com/Sanqi-normal/dsh-webui-market-plugin.git 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

把 awesome-dsh-plugin.com 插件目录搬进 dsh Web 设置页的可视化插件市场:打开「设置 → 插件 → 插件市场」即可浏览、搜索、一键安装/卸载/更新社区插件,并把 web 已装的插件一键同步到桌面端等其他 profile。

核心能力

  • 浏览和搜索来自 awesome-dsh-plugin.com 的社区插件目录(含分类、星标数、收录日期、中英文描述),按「最热 / 最新」排序
  • 一键安装、更新、卸载,按 FIFO 队列串行执行;实时显示「排队中 / 校验中 / 执行中 / 完成 / 失败 / 已终止 / 超时」状态和 pnpm 日志
  • 安装前两层安全把关:来源白名单(只接受精选目录里的 github: 源)+ 试装验证(web profile 在临时环境实际启动一次)
  • 跨 profile 一键同步:把 web 已装的插件按本地复制方式补装到桌面端等其他已初始化 profile,只增不删
  • 停用 / 启用:保留依赖文件,只切换激活状态;停用状态在重启后仍然保留
  • 一键更新全部 + 单插件更新:github 源对比 lockfile commit 与 HEAD,npm 源对比 dist-tag.latest
  • 本机插件清单:列出所有由依赖管理的插件(含市场外安装的),标注目录内 / 目录外、来源类型、停用状态
  • 安装成功后简单插件可热挂载到当前运行组合,无需重启 Web 服务即可使用

技术实现

  • 语言: TypeScript(编译产物为 ESM JS,源码构建为 lib/host.js + lib/client.js
  • 关键依赖: @deepseek-ai/cordis(宿主框架,peerDependency);@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-slots(浏览器侧注册设置页 tab);react ^18.2.0(写面板 UI)
  • 架构模式: Cordis 双形态插件 —— 宿主半通过 apply(ctx)webServer 服务上注册 /api/dsh-market HTTP 路由,浏览器半通过 exports["./client"] + dsh.client.platform: "web" 声明被前端 ModuleLoader 加载,注册到 settings.plugins.tab 槽位;安装/更新/卸载通过 node:child_process 调起 dsh plugin 子进程执行,写操作要求同源 POST
  • 入口文件: 宿主入口 lib/host.js(导出 name: 'dsh-market-plugin'inject: ['webServer']apply);客户端入口 lib/client.js(导出 inject: ['slots','sessions','workspaces']apply,注册到 settings.plugins.tab 槽位)

适用场景

日常用 dsh web 或桌面端、希望在图形界面里浏览和安装社区插件而不手敲 dsh plugin add 命令的用户;需要在 web 和桌面端等多个 profile 间同步插件的人;以及希望对每个插件的状态(停用 / 启用 / 已安装 / 有更新)有可视化掌控、并能在失败时一键询问 DSH 排查问题的运维型用户。

前置依赖与兼容性

依赖最低版本说明
Node.js^22.19.0 或 >=24.0.0package.json:37-39engines.node 强制要求;使用了 AbortSignal.timeout 等较新 API
DSH 宿主未声明具体版本peerDependencies 仅写 *;宿主必须暴露 webServer 服务(宿主半 inject: ['webServer'])、slots / sessions / workspaces(浏览器半 inject)与 settings.plugins.tab 槽位
pnpm≥11 推荐安装走宿主自带 pnpm;pnpm 11 起默认开启 24h minimumReleaseAgeERR_PNPM_IGNORED_BUILDS 拦截,市场能自动加白名单并重试
平台macOS / Windows / Linux跨平台;Windows 单独处理 .cmd/.bat shim、shell:true 启动与 taskkill /T /F 杀进程树(lib/host.js:101-112, 300-309
原生模块仅用 Node.js 内建模块(node:fs / node:child_process / node:os / node:path / node:url / AbortSignal.timeout

安装方式

dsh plugin --profile web add github:Sanqi-normal/dsh-webui-market-plugin

配置项

本插件不需要在 cordis patch 里写配置;所有面向用户的开关都在面板「安装设置」和「跨 Profile 同步」里。

配置类型说明默认值
自动同步到其它 profile(安装设置)面板开关开启后安装插件时自动同步到本机所有已初始化的 profile;关闭后仅装到安装时选择的 profile开启
跳过安全检查(web profile 安装)面板勾选同时跳过来源白名单 + 试装验证,可能装入未收录来源或装坏 web 启动,风险自负关闭
跳过来源白名单检查(非 web profile 安装)面板勾选仅跳过白名单(仍做安装前快照),可能装入未收录来源关闭
安装到 Profile面板下拉安装确认框里可选目标 profile(默认 web);自动同步开启时选定目标会自动补装到其它 profileweb
dsh CLI 路径(探测失败时填写)面板输入框自动探测失败时手动填写 dsh 仓库根目录下的 apps/cli/lib/bin.js,或设置 DSH_BIN 环境变量并重启 web;已记忆上次填写

环境变量(在宿主进程环境里设置):

环境变量说明默认值
DSH_MARKET_OP_TIMEOUT_MS单个安装 / 更新 / 卸载任务的硬超时(毫秒),超时后自动终止 pnpm 子进程120000
DSH_MARKET_FETCH_TIMEOUT_MSpnpm 单次网络拉取的超时(毫秒)30000
DSH_MARKET_FETCH_RETRIESpnpm 拉取失败时的重试次数1
DSH_MARKET_FETCH_RETRY_MINTIMEOUT_MS / MAXTIMEOUT_MSpnpm 重试间隔的下界 / 上界(毫秒)1000 / 10000
DSH_BIN显式指定 dsh CLI 入口文件路径(用于源码启动场景)未设置
DSH_HOME宿主 / 插件读取的 DSH 数据根目录~/.dsh

常见问题

Q: 这个插件和 awesome-dsh-plugin.com 是什么关系?

A: 列表直接来自 awesome-dsh-plugin.com 的 plugins.json 接口(lib/host.js:973, 1069-1077),自动跟随系统语言返回中英文描述;首次拉取失败时会回退到内置离线快照 data/catalog-snapshot.json。本地安装默认只接受精选目录里的 github: 源,目录外的会被白名单拒绝。

Q: 安装后一定要重启 Web 服务吗?

A: 简单插件(cordis.patch.yml 只有 - id: / name: 插入行)会尝试热挂载到当前运行组合并自动刷新页面生效(lib/host.js:1152-1176);如果 patch 较复杂或环境不支持,市场会回退为「下次重启 Web 后生效」,不会自动重启宿主。

Q: 安装时遇到 pnpm 的 "Blocked build scripts" 怎么解决?

A: pnpm ≥11 默认拦截未在 allowBuilds 中放行的构建脚本。市场在任务失败时会自动把被拦截的包名加入 profile 的 pnpm-workspace.yamlallowBuilds 并重试一次(lib/host.js:442-468, 685-695);如果该依赖确实不需要执行构建脚本,把对应项写成 false(明确拒绝)即可,不会被自动重新放行。

Q: 试装验证会不会改动我的真实 profile?

A: 不会。试装验证在临时目录(mkdtempSync(tmpdir() + 'dsh-mkts-probe-'))里按 web profile 模板重建组合、用同一套 dsh CLI 装入候选插件、再以 --port 0 实际启动一次,只有出现 dsh web: 就绪行才判定可装(lib/host.js:823-893);真实 profile 全程未被写入,验证结束无论成败都会清理临时目录。

Q: 为什么有些插件装不上(被拒绝)?

A: 默认情况下只有精选目录收录的 github: 源能通过白名单;registry/link 源不受此限制但仍走白名单 + 安装前快照;试装启动失败也会被拒并返回真实启动错误(lib/host.js:601-617)。如确需安装目录外或试装失败的插件,可勾选「跳过安全检查」(风险自负)。

Q: 怎么把装到 web 的插件同步到桌面端?

A: 面板顶部「跨 Profile 同步」区会列出本机所有已初始化的 profile(如 desktop);点「同步到 xxx」会把 web 里已装但目标 profile 缺失的插件按本地复制方式补装过去(lib/host.js:1492-1506),同步只新增、不删除或降级目标 profile 里现有的任何内容,装完重启对应应用生效。同步携带 syncFrom 校验:仅当目标源确为源 profile 已装依赖时才放行,所以装在 web 但不在精选目录的插件(如 aegis)也能同步。

Q: 停用插件和卸载插件有什么区别?

A: 停用保留依赖与磁盘文件,只把插件从 dsh.profile.bundles 里移出并写入 dsh.market.disabled,重启后仍保持停用(lib/host.js:1284-1318);卸载会把依赖连同 bundle 一起删除。注意:在命令行手工执行 dsh plugin add/remove/update 会触发 reconcile 短暂恢复停用项,下次市场操作或重启会再次停用。

Q: 安装/更新失败时怎么处理?

A: 失败行有「询问 DSH」按钮,点击后会在新对话里把操作目标、状态、环境信息(DSH_HOME / node / dsh 探测结果)和完整错误日志作为 prompt 发送给 AI,方便直接排查(lib/client.js:165, 740)。网络类错误(ETIMEDOUT / ECONNRESET 等)市场会自动重试一次(lib/host.js:700-707),持续失败时会提示检查代理或镜像。

Q: 一键更新全部会把所有插件都更新吗?

A: 不会。一键更新只会重新安装 updateAvailable=true 的插件(lib/host.js:1820-1840):github 源对比 lockfile commit 与 GitHub HEAD,npm 源对比 dist-tags.latest 与已装版本,并考虑了 pnpm 11 的 24h minimumReleaseAge;本地 link/file 链接不参与检测。检测失败会静默降级为「无更新」,不会阻塞列表。

上手难度

入门 — 安装后无需任何配置就能直接用;如果自动探测 dsh CLI 失败才需要在面板填一下 apps/cli/lib/bin.js 路径或设置 DSH_BIN,绝大多数情况下零配置上手。

已知问题与限制

  • 大多数插件安装后需要重启 Web 服务才能生效;只有 patch 是纯 - id: / name: 插入行的简单插件才会热挂载并自动刷新页面生效(lib/host.js:1152-1176, 1201-1217
  • 试装验证仅对 web profile 执行:非 web profile(如 desktop)的组合由对应桌面壳定义、市场无法在临时环境复刻,其安装由「来源白名单 + 安装前快照」把关,没有启动判定(README.md:66lib/host.js:599-617
  • 在命令行手工执行 dsh plugin add/remove/update 会触发 reconcile 短暂恢复停用项,需要重启或下一次市场操作才会再次停用(README.md:75
  • 单个任务默认 120 秒超时,可在宿主环境里通过 DSH_MARKET_OP_TIMEOUT_MS 调大(如 300000);pnpm 子进程固定以 CI 模式运行,避免无 TTY 时静默卡住(lib/host.js:32, 52-58, 656
  • pnpm 11 的 24h minimumReleaseAgeERR_PNPM_IGNORED_BUILDS 拦截会自动修复并重试一次;如果在试装环境里临时批准了构建脚本,那次审批只作用于试装目录,不写入真实 profile(lib/host.js:676-695, 866-878
  • 跨 profile 同步是只新增、绝不删除或降级;如果目标 profile 已经装了同名依赖(哪怕是不同版本),同步会跳过它(lib/host.js:1492-1506
  • 写操作(install / uninstall / update / disable / enable / kill / clear)只接受同源 POST(Origin 头与 Host 一致),跨源请求一律返回 403(lib/host.js:221-230, 1822-1825, 1843-1845, 1878-1881, 1885-1887, 1900-1903, 1921-1924

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/Sanqi-normal/dsh-webui-market-plugin)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录