zat-dsh-engine

76Star4Fork6Issue0Watching

DSH 网页端的可视化插件市场:浏览/搜索/一键安装/更新/卸载 dsh-plugin 社区,自带国内镜像、AI 找插件、装前体检与对话管理。

语言
TypeScript
License
MIT
分支
main
deepseek-harnessdshdsh-plugin

安装

$ dsh plugin --profile web add github:mishibeikejie/zat-dsh-engine

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

一句话定位

zat-dsh-engine 是 DeepSeek Harness 的可视化插件市场:在网页端「设置 → 插件」里点开 🛒 插件市场,就能搜索 GitHub 上打 dsh-plugin 标签的全部社区插件、一键安装/更新/卸载,并自带国内镜像、AI 找插件、装前体检与安全扫描、对话管理和自更新。

核心能力

  • 浏览和搜索 GitHub dsh-plugin 主题社区的全部插件,按 12 个分类筛选,支持中英双语简介和实时搜索(无需回车)
  • 一键安装 / 更新 / 卸载:底层走宿主 pnpm,安装/卸载/启停都带实时进度条、自动回滚与一键备份;失败时还原 profile 并提示怎么救
  • 装前体检 + 安全扫描:自动检查入口文件、构建脚本、官方包依赖写法、peer 依赖、运行命令、系统/CPU 支持、网络去向、混淆/可疑外发;客观硬伤直接拦,模糊风险只提示
  • AI 找插件:模型调用 find_plugin 工具按用户描述搜索市场,每个候选自动附带装前体检与安全扫描结论(✅/⚠️/❌),不盲目推荐
  • 国内无 VPN 也能用:镜像优先 → 系统代理 → 直连 → curl → wget → Node fetch 六级降级,npm 走 npmmirror 加速
  • 一键检测 / 修复 / 启停 / 星标 / 自更新 / 对话管理:扫描全部已装插件的冲突/缺失依赖/系统兼容/挂载行重复;卡片上直接启停、复用本机 git 凭据点星(不弹登录窗);设置页多出 🗑 对话管理标签页,可永久删除已归档会话

技术实现

  • 语言: TypeScript(Node ESM 宿主 + 浏览器 CJS 客户端,React 18 写 UI)
  • 关键依赖: @deepseek-ai/cordis ^4.0.1(宿主框架,peerDep);@deepseek-ai/dsh-typert-protocol(Typert Remote 服务协议,peerDep);js-yaml ^4.1.0(解析 cordis.patch.yml 的 !!js 语法);zod ^4.0.0(手写 typert-loader 清单的 schema 定义)
  • 架构模式: 双形态 Typert 插件 —— 宿主侧在 cordis Loader 里通过 cordis.patch.yml 注入一个 plugin-market 行(自动挂载一个 Remote 服务,命名空间 pluginMarket,22 个 @Remote 方法);客户端侧在浏览器用 React 组件 + Typert strict descriptor 远程调用宿主方法,并在 settings.plugins.tabsettings.section 两个 slot 上注册 🛒 插件市场 与 🗑 对话管理 两个标签页
  • 入口文件: 宿主入口 src/index.tsexport default ZatMarketGateway,4004 行);客户端入口 src/client/index.tsxexport const injectexport async function apply(ctx),1647 行);构建配置 tsdown.config.ts(ESM + CJS 双产物,宿主走 Node ES2024、客户端走浏览器 CJS)

适用场景

日常用 DSH 网页端、想从社区里挑插件而不是手敲 dsh plugin add 命令的普通用户;在没 VPN 的国内环境想装/更新插件的人;插件装多了不确定哪个冲突、想一键体检修复的人;以及想用 AI 帮自己找插件、又想看到每个候选是不是真能装的人。

前置依赖与兼容性

依赖最低版本说明
DSH>= 0.1.0-rc.6客户端需要 @deepseek-ai/dsh-client-connection-locale-runtime-ui-settings-dsh-api-remotes 五个共享客户端包(package.json#dsh.client.inject);宿主需要 @deepseek-ai/dsh-toolsdsh-subprocessdsh-fsdsh-llmdsh-typert-protocolcordis 全部为 peerDep
Node.js未声明package.json 未设 engines@types/node ^26.2.0,TypeScript 目标 ES2024,使用 node:fsnode:path 内建模块
pnpm任意可解析装/更新/装插件构建脚本全靠宿主自带的 pnpm;缺失时一键修复会先 corepack enable,再不行就 npm i -g pnpm(src/index.ts:3464-3471 / src/index.ts:3684-3692)
平台macOS / Windows / Linux跨平台代码;Windows 单独走 PowerShell(-NoProfile -NonInteractive)、PowerShell 隐藏窗口;非 Windows 走 /bin/sh -c(src/index.ts:32 / src/index.ts:767-789)
原生模块仅用 Node.js 内建模块与 js-yaml / zod 两个纯 JS 依赖
系统命令curl / git(可选)网络请求自动在 curl → wget → Node fetch 之间降级;点星需要 git 凭据助手已配置

安装方式

dsh plugin --profile web add github:mishibeikejie/zat-dsh-engine

安装后请重启 dsh,市场才会出现在设置页里。

配置项

配置类型说明默认值
cordis.patch.yml 里的 plugin-market 节点 config.mirror字符串国内镜像地址;安装/搜索/点星都按这条镜像失败后再回退直连https://gh-proxy.com/
环境变量 DSH_HOME路径覆盖 dsh 主目录;不设时按 ~/.dsh 推断(Windows 下走 USERPROFILE / C:\Users~/.dsh
环境变量 DSH_PROFILE字符串覆盖当前要操作的 profile 名;不设时从 profiles 目录里挑(优先 web第一个含 package.json 的 profile
环境变量 GITHUB_TOKEN / GH_TOKEN字符串优先于 zat-market.json 和 git 凭据;非空时所有 GitHub API 请求都带上 token(命中率从 60/h 升到 5000/h)
profile 目录 zat-market.json 里的 githubToken字符串在市场底部手动填的 GitHub Token,仅写本机、不发往任何服务器;下次点星优先用它

其他系统代理、HTTP_PROXY / HTTPS_PROXY 等环境变量会被自动识别并优先用于网络请求;profile 名也可在 dsh plugin --profile <name> ... 里直接指定(src/index.ts:1850-1853 / src/index.ts:1693-1731)。

常见问题

Q: 「全部」视图最多只显示 1000 个插件,其他怎么找?

A: 这是 GitHub 搜索 API 单次查询的硬上限。在搜索框里输入关键词或用分类筛选,能绕过这个限制命中任意插件(src/index.ts:2430-2472)。

Q: 装某个插件之后 dsh 起不来了,怎么办?

A: 市场每次成功操作后都会把 package.json / cordis.patch.yml / pnpm-lock.yaml 这三个文件备份到 profile 目录下的 zat-backup/,并把装崩前的 bundle 列表从启用名单里移走。按 README 给的命令(macOS/Linux 用 cp ~/.dsh/profiles/<你的profile>/zat-backup/* ~/.dsh/profiles/<你的profile>/,Windows 用 PowerShell 的 Copy-Item)把三个文件拷回去重启即可(src/index.ts:960-1000 / README.zh.md:101-108)。

Q: 装了某个插件显示「不支持当前系统」被直接拦下来,是什么意思?

A: 这是装前体检的客观硬伤之一。插件的 package.json 里有 os(如 ["linux"])或 cpu(如 ["!arm64"])字段声明了支持范围,与你当前系统不匹配就会拦截——这种情况下装了也会让 dsh 起不来。如果插件确实能在你机器上跑,建议联系作者修正 manifest(src/index.ts:1302-1309 / src/index.ts:1497-1503)。

Q: 为什么点星标需要我提供 GitHub Token?我不想登录。

A: 市场从不强制弹窗——优先读 GITHUB_TOKEN / GH_TOKEN 环境变量、本地 zat-market.json 里你保存过的 Token,都没有才会非交互地读 git 凭据助手(只读已保存的,绝不触发登录弹窗)。没凭据也不会报错,只是点星会失败并提示怎么填 Token(src/index.ts:3868-3922)。

Q: 安装时报 pnpm 找不到怎么办?

A: 在设置页里点「🩺 一键检测」然后点「一键修复」,市场会自动跑 corepack enable,不行再 npm i -g pnpm,装好后继续原流程;终端里手动一行命令也能解决(src/index.ts:3684-3692)。

Q: 我装了某个插件,但市场列表里还是显示「安装」按钮?

A: 缓存里残留了旧的「未安装」状态。点一下列表右上角的刷新,或重启 dsh 让缓存重新加载;如果还是不行,跑「一键检测」通常能识别出冲突或禁用状态(src/index.ts:2404-2413 / src/index.ts:3528-3535)。

Q: 两个市场插件能同时装吗?

A: 不能。安装门会拦:两个市场类插件(mishibeikejie/zat-dsh-engine、lx2000wasd/dsh-web-plugin-manager、sanqi-normal/dsh-webui-market-plugin,或名称/行为符合「市场/插件市场」模式的)会注册相同的设置页与服务,互相覆盖甚至让 dsh 起不来(src/index.ts:62-66 / src/index.ts:1007-1037)。

Q: 市场怎么升级?会不会把自己卸了?

A: 启动后自动比对 GitHub HEAD 版本,新版就在标题旁显示更新按钮,点击走与安装相同的镜像回退链路。卸载接口明确拒绝从市场内部调用 uninstall('zat-dsh-engine'),必须用官方 dsh plugin remove(src/index.ts:2804-2876 / src/index.ts:3043-3047)。

上手难度

入门 — 装好重启即用,零配置即可浏览/搜索/安装社区插件;遇到 pnpm 缺失、网络不通、入口缺失、挂载行冲突等具体问题时,市场会用中英双语给出可操作的指引和「一键修复」按钮,不需要查文档。

已知问题与限制

  • 同一个 profile 里两个插件声明了相同的 loader row id 时会被体检出来,禁用其中一方或手动选择;新装的插件如果与已启用插件 id 重复会在装前体检就拦住(src/index.ts:3542-3553 / src/index.ts:1310-1316)
  • 大型 GitHub 源插件(整仓下载)在慢网下可能比较久,进度条会随 pnpm 实时输出更新;如果 60 秒内没动静,src/index.ts:1857-1968 这条链会自动换直连或镜像
  • pnpm 默认会拦依赖的 prepare/preinstall 构建脚本,市场会在装前/出错时自动把对应包名写进 pnpm-workspace.yamlallowBuilds 再重试一次;如果重试仍失败,需要手动确认(src/index.ts:2279-2295 / src/index.ts:939-954)
  • 静态安全扫描只能提示、不能证明安全:它把混淆/读敏感凭据/可疑外发地址这类模式摆出来,但误判也常见(比如「给 Discord/Telegram 发通知」的插件就会命中 webhook 钩子),所以只警告不拦截——真正的硬拦截交给入口缺失/系统不支持这些客观项(src/index.ts:488-524 / src/index.ts:1354-1362)
  • 通过 link: / 本地路径安装的市场自身不会从 GitHub 检查更新,避免本地改动被远程覆盖;想换回 GitHub 版需先卸载再装(src/index.ts:2809-2823)
  • 当 DSH 安装在 macOS 的 /Applications 里且子进程拿不到完整 PATH 时,安装时市场会自动补 /opt/homebrew/bin/usr/local/bin~/.local/bin 等常见路径;极少数 PATH 完全为空的场景仍需在终端里启动 DSH(src/index.ts:1638-1666 / src/index.ts:1834-1855)
  • 「全部」视图受 GitHub 搜索 API 单次 1000 条上限限制,搜索框和分类筛选能命中任意插件(src/index.ts:2430-2472)
  • 同一候选插件如果名字/作者看起来像市场但实际不是,已通过功能特征检测(pnpm / dsh plugin / slots.register)+ 已知仓库清单的双重判断兜底,但仍可能漏掉新出现的同类插件(src/index.ts:78-82 / src/index.ts:1173-1177)