🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

桌面启动器 sperictao/dsh-pro-max

DeepSeek Harness
sperictao33 天前有提交已提供中文文档扫描:含敏感能力

DeepSeek Harness 桌面启动器——一键本地 Web UI 与 Tailscale 安全远程访问。

30.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add sperictao/dsh-pro-max
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · market
装得上吗
作者未把包发布到 npm,只能用源码安装
插件本身没问题,是分发方式不同
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 33 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-pro-max(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/13 09:40:36

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 63 处,展示前 63 条)
  • 写入本地文件
    e2e/capture-models-add-custom-model.mjs:65
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-add-custom-model.mjs:186
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-add-provider.mjs:73
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-add-provider.mjs:203
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-advanced-settings.mjs:73
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-advanced-settings.mjs:206
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-base-url-validation.mjs:55
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-base-url-validation.mjs:172
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-catalog-retry.mjs:64
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-catalog-retry.mjs:173
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-custom-endpoint.mjs:73
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-custom-endpoint.mjs:201
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-default-model.mjs:114
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-default-model.mjs:196
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-edit-provider.mjs:67
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-edit-provider.mjs:201
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-fetch-list.mjs:74
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-fetch-list.mjs:191
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-fetch-retry.mjs:114
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-fetch-retry.mjs:253
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-image-input-override.mjs:107
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-image-input-override.mjs:263
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-import-configuration.mjs:94
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-import-configuration.mjs:187
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-main.mjs:143
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-main.mjs:250
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-make-default.mjs:116
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-make-default.mjs:231
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-model-advanced.mjs:66
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-model-advanced.mjs:195
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-model-checkbox.mjs:126
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-model-checkbox.mjs:268
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-provider-card-fetch-list.mjs:120
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-provider-card-fetch-list.mjs:306
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-provider-card-test-connection.mjs:111
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-provider-card-test-connection.mjs:283
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-provider-dialog-close.mjs:100
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-provider-dialog-close.mjs:263
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-provider-headers.mjs:59
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-provider-headers.mjs:213
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-provider-save-retry.mjs:138
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-provider-save-retry.mjs:369
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-reasoning-effort.mjs:114
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-reasoning-effort.mjs:199
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-refresh-catalog.mjs:93
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-refresh-catalog.mjs:196
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-remove-model.mjs:66
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-remove-model.mjs:185
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-remove-provider.mjs:116
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-remove-provider.mjs:262
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-search-model-id.mjs:126
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-search-model-id.mjs:300
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-select-all.mjs:134
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-select-all.mjs:286
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-service-picker.mjs:100
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-service-picker.mjs:254
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-test-connection-retry.mjs:118
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-test-connection-retry.mjs:297
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-test-connection.mjs:83
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-test-connection.mjs:227
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/capture-models-thinking-levels.mjs:79
    mkdirSync(OUT_DIR, { recursive: true });
  • 写入本地文件
    e2e/capture-models-thinking-levels.mjs:229
    if (recorded !== stable) renameSync(recorded, stable);
  • 写入本地文件
    e2e/smoke.mjs:757
    mkdirSync(dir, { recursive: true });
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 一键打开本地WebUI
  • 插件市场与模型配置

DeepSeek Harness 桌面启动器——一键打开本地 Web UI,用 Tailscale 加密远程访问,还有插件市场和模型配置。基于 Tauri 2 + React + TypeScript 构建。

README

由 DeepSeek 最新模型翻译生成
DSH Pro Max DeepSeek Harness 桌面启动器——一键本地 Web UI 与 Tailscale 安全远程访问。 English · 简体中文 ✨ 亮点 - 🌐 DeepSeek Harness 远程访问——通过内置身份授权插件一键开通 dsh Web UI 的 Tailscale HTTPS 访问,8 步进度时间线展示全过程,支持兼容性修复与开机自启 - 🛍 插件市场——浏览 awesome-dsh-plugin.com 精选目录(2700+ 插件),一键安装/移除 web profile 插件 - 🖥 桌面应用形态——把官方 DeepSeek Harness 桌面应用作为第二档纳管形态:检测/打开/退出/新版本提示,并经一次性安装的桥接插件管理它自己的插件与运行档配置。
展开完整文档(README 剩余 1 节)
DSH Pro Max

DeepSeek Harness 桌面启动器——一键本地 Web UI 与 Tailscale 安全远程访问。

English · 简体中文

✨ 亮点

- 🌐 DeepSeek Harness 远程访问——通过内置身份授权插件一键开通 dsh Web UI 的 Tailscale HTTPS 访问,8 步进度时间线展示全过程,支持兼容性修复与开机自启
- 🛍 插件市场——浏览 awesome-dsh-plugin.com 精选目录(2700+ 插件),一键安装/移除 web profile 插件
- 🖥 桌面应用形态——把官方 DeepSeek Harness 桌面应用作为第二档纳管形态:检测/打开/退出/新版本提示,并经一次性安装的桥接插件管理它自己的插件与运行档配置。设置里选择纳管哪些形态——至少一档,可两档并存
- 🧠 模型配置——在应用内编辑 dsh 的默认模型与自定义 LLM 提供商路由(OpenAI 兼容 / Anthropic 协议),密钥只存环境变量名
- 🔌 内置授权插件——两个固定版本的插件(dsh-client-connection-authz + dsh-auth-tailscale)随安装包分发,自动装入 dsh web profile
- 🔐 基于 Capability 的授权——配置你自己的管理/使用 capability 域名与额外允许的 Tailscale 登录名;不配置 capability 时远程特权接口恒 403
- 🎨 主题——42 个 tweakcn 主题族,原生亮/暗/跟随系统模式;UI 字体全部应用内自托管,完全离线
- 🌍 多语言——英文与简体中文界面,默认跟随系统
- 🔄 自更新——内置 Tauri Updater:检查、下载、重启,完成
- ⌨️ 键盘——Cmd/Ctrl + , 打开设置

📸 截图

| 一键 Tailscale 远程访问 | 插件市场 |
| 一键 Tailscale 远程访问,8 步进度时间线全部就绪 | 插件市场浏览 awesome-dsh-plugin.com 精选目录 |
| 模型配置 | 主题与外观 |
| 默认模型与 LLM 提供商路由 | 42 个主题族,亮 / 暗 / 跟随系统模式 |

📦 安装

从 Releases 下载对应平台的最新安装包(macOS .dmg、Windows -setup.exe、Linux .AppImage / .deb)。

dsh 功能的前置条件:Node.js 18+;远程访问另需 Tailscale 并启用 MagicDNS 与 HTTPS Certificates(应用内逐步引导;详见 docs/dsh-remote-access-setup.md)。

🚀 快速上手:开启远程访问

前提:宿主机装好 Node.js 18+,Tailscale 1.92+ 已登录并启用 MagicDNS 与 HTTPS Certificates。

1. 在主页打开 Remote access(远程访问)开关。
2. 点 一键启动 dsh web——8 步时间线自动完成:安装锁定版 dsh 与两个授权插件、启动 dsh Web、配置 tailscale serve,并校验远程端点。
3. 在 Tailscale admin console(Access controls)中放行远程身份到宿主节点的 443 端口(app capability 不会自动放行端口):

{
"grants": [
{ "src": ["alice@example.com"], "dst": ["autogroup:member"], "ip": ["tcp:443"] }
]
}

4. 从任意登录同一 tailnet 的设备打开 https://<hostname>.ts.net——时间线走完后主页会显示该地址。

宿主机当前用户始终在允许名单内;其他 Tailscale 账号与远程管理能力(settings / credentials)按需在 设置 → DeepSeek Harness → Remote authorization 中开启。

→ 典型场景、capability 配置与故障排查:docs/dsh-remote-access-setup.md

🛠 开发

git clone --recurse-submodules https://github.com/sperictao/dsh-pro-max.git
cd dsh-pro-max
pnpm install
pnpm tauri dev

领域术语与语义边界见 CONTEXT.md;设计决策见 docs/adr/。

质量门禁:pnpm test(主题 + 组件测试)、pnpm run check:i18n 与 pnpm test:e2e(mock Tauri IPC 的浏览器冒烟,需 Chrome)。

📖 来源

DSH 模块于 v1.10.0 从 Codex Pro Max(原名 dashi-taskboard-launcher)中拆分为独立应用。

许可证

MIT
预览分享卡片长什么样 ↓sperictao/dsh-pro-max
分享 · DeepSeek Harness Hub
sperictao/dsh-pro-max

DeepSeek Harness 桌面启动器——一键本地 Web UI 与 Tailscale 安全远程访问。

这是你的仓库?认领条目

回到顶部