DeepSeek Harness 桌面启动器——一键本地 Web UI 与 Tailscale 安全远程访问。
数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
dsh plugin --profile web add sperictao/dsh-pro-max状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
安装兼容性检查需源码安装缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
源码安装时若 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 });
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
功能亮点
- 一键打开本地WebUI
- 插件市场与模型配置
DeepSeek Harness 桌面启动器——一键打开本地 Web UI,用 Tailscale 加密远程访问,还有插件市场和模型配置。基于 Tauri 2 + React + TypeScript 构建。
README
由 DeepSeek 最新模型翻译生成展开完整文档(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预览分享卡片长什么样 ↓
DeepSeek Harness 桌面启动器——一键本地 Web UI 与 Tailscale 安全远程访问。
相关插件 · 市场 / 管理
这是你的仓库?认领条目