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

桌面套壳窗口 Aaaaamadeus/dsh-gui

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

把本机 dsh 装进原生窗口,免开浏览器即用官方界面

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Aaaaamadeus/dsh-gui
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/26·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 80 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 48 处,展示前 44 条)
  • 写入本地文件
    src/main.js:21
    try { fs.mkdirSync(LOG_DIR, { recursive: true }); } catch {}
  • 写入本地文件
    src/main.js:25
    try { fs.appendFileSync(guiLog, line); } catch {}
  • 读取本地文件
    src/main.js:39
    try { return JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8')).version || '0.0.0'; }
  • 读取本地文件
    src/main.js:62
    return fs.existsSync(ico) ? ico : undefined;
  • 读取本地文件
    plugin/dsh-gui-desktop.mjs:50
    if (existsSync(electronExe)) return false;
  • 执行外部命令来自配置/变量
    plugin/dsh-gui-desktop.mjs:56
    spawn(launcher, args, {
  • 执行外部命令来自配置/变量
    plugin/dsh-gui-desktop.mjs:112
    spawn(launcher, args, {
  • 执行外部命令固定命令
    src/shortcut.cjs:25
    return spawnSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-EncodedCommand', encoded], {
  • 执行外部命令固定命令
    src/shortcut.cjs:33
    const res = spawnSync('powershell.exe', [
  • 写入本地文件
    src/shortcut.cjs:43
    fs.mkdirSync(assetDir, { recursive: true });
  • 写入本地文件
    src/shortcut.cjs:46
    fs.writeFileSync(vbs, [
  • 写入本地文件
    src/shortcut.cjs:73
    fs.mkdirSync(assetDir, { recursive: true });
  • 读取本地文件
    src/shortcut.cjs:76
    if (iconPng && fs.existsSync(iconPng)) {
  • 读取本地文件
    src/shortcut.cjs:77
    const png = fs.readFileSync(iconPng);
  • 写入本地文件
    src/shortcut.cjs:79
    fs.writeFileSync(target, pngToIco(png));
  • 读取本地文件
    src/shortcut.cjs:83
    if (fs.existsSync(target)) return target;
  • 读取本地文件
    src/shortcut.cjs:84
    if (fs.existsSync(bundled)) {
  • 写入本地文件
    src/shortcut.cjs:85
    fs.copyFileSync(bundled, target);
  • 写入本地文件
    src/shortcut.cjs:96
    fs.mkdirSync(dir, { recursive: true });
  • 读取本地文件
    src/plugins/manager.js:215
    if (!fs.existsSync(root)) return [];
  • 读取本地文件
    src/plugins/manager.js:218
    for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
  • 读取本地文件
    src/plugins/manager.js:221
    if (fs.existsSync(path.join(dir, MANIFEST_NAME))) out.push(dir);
  • 读取本地文件
    src/plugins/protocol.js:51
    const data = fs.readFileSync(file);
  • 读取本地文件
    src/plugins/manifest.js:70
    if (checkFiles && !fs.existsSync(entry)) return fail(`${field} does not exist: ${raw[field]}`);
  • 读取本地文件
    src/plugins/manifest.js:80
    if (checkFiles && !fs.existsSync(entry)) return fail(`style does not exist: ${style}`);
  • 读取本地文件
    src/plugins/manifest.js:119
    if (!fs.existsSync(file)) return null;
  • 读取本地文件
    src/plugins/manifest.js:121
    return JSON.parse(fs.readFileSync(file, 'utf8'));
  • 读取本地文件
    src/kernel/host-manager.js:34
    return fs.existsSync(explicit) && explicit.endsWith('.js') ? explicit : null;
  • 执行外部命令来自配置/变量
    src/kernel/host-manager.js:39
    const out = spawnSync(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['root', '-g'], {
  • 读取本地文件
    src/kernel/host-manager.js:62
    if (fs.existsSync(bin)) return bin;
  • 执行外部命令来自配置/变量
    src/kernel/host-manager.js:66
    const out = spawnSync(process.platform === 'win32' ? 'where.exe' : 'which', ['dsh'], {
  • 读取本地文件
    src/kernel/host-manager.js:73
    if (!/ (cmd|ps1)$/i.test(line) && fs.existsSync(line)) continue;
  • 读取本地文件
    src/kernel/host-manager.js:75
    try { text = fs.readFileSync(line, 'utf8'); } catch { continue; }
  • 读取本地文件
    src/kernel/host-manager.js:79
    if (fs.existsSync(bin)) return bin;
  • 读取本地文件
    src/kernel/host-manager.js:90
    const parsed = JSON.parse(fs.readFileSync(pkg, 'utf8'));
  • 执行外部命令来自配置/变量
    src/kernel/host-manager.js:130
    const probe = spawnSync(launcher.file, [bin, 'web', '--help'], {
  • 写入本地文件
    src/kernel/host-manager.js:177
    fs.mkdirSync(LOG_DIR, { recursive: true });
  • 写入本地文件
    src/kernel/host-manager.js:187
    const logStream = fs.createWriteStream(logPath, { flags: 'a' });
  • 执行外部命令来自配置/变量
    src/kernel/host-manager.js:256
    return spawn(launcher.file, args, {
  • 执行外部命令来自配置/变量
    src/kernel/host-manager.js:268
    bindChild(spawn(launcher.file, args, {
  • 发起网络请求
    src/kernel/host-manager.js:294
    const res = await fetch(`http://127.0.0.1:${port}${contract.WIRE.unaryPath}host.describe`, {
  • 执行外部命令固定命令
    src/kernel/host-manager.js:335
    execFile('taskkill', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true });
  • 发起网络请求
    src/kernel/http-adapter.js:78
    response = await fetch(`${this.baseUrl}${contract.WIRE.unaryPath}${method}`, {
  • 发起网络请求
    src/kernel/http-adapter.js:122
    const response = await fetch(`${this.baseUrl}${contract.WIRE.respondPath}`, {
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 原生窗口运行dsh
  • 免开浏览器使用官方界面
  • 作为配置档包安装

README

由 DeepSeek 最新模型翻译生成
dsh-gui dsh-plugin license platform dsh dsh-gui 是 DeepSeek Harness(dsh)的原生桌面套壳:不打开浏览器、不重新实现 agent 逻辑,只把本机安装的 dsh 作为内核拉起来,再在 Electron 原生窗口里加载 dsh 官方 Web UI。 它也以 dsh 原生插件的形式发布:声明了 dsh.bundle.patch,可以直接用 dsh plugin 安装,并自动创建/维护桌面快捷方式。 特性 - 🪟 Web 套壳:窗口内是官方 Web UI;官方前端/内核更新后无需改动本壳 - 🧩 dsh 插件化安装:dsh plugin --profile web add github:Aaaaamadeus/dsh-gui - 🔗 自动快捷方式:每次 dsh profile 启动都会幂等刷新桌面快捷方式(含图标、隐藏控制台启动) - 🧠 低耦合内核:只依赖 dsh 的 host-apiproxy 线协议,不 import 任何 @deepseek-ai/ 包 - 🛡️ 沙箱渲染:contextIsolation + sandbox,外链交给系统默认浏览器 - 🧬 一切皆插件:main 进程插件、RPC 权限声明、dshgui-plugin:// 资产协议、原生模式内置 UI 插件
展开完整文档(README 剩余 1 节)
dsh-gui

dsh-plugin
license
platform
dsh

dsh-gui 是 DeepSeek Harness(dsh)的原生桌面套壳:不打开浏览器、不重新实现 agent 逻辑,只把本机安装的 dsh 作为内核拉起来,再在 Electron 原生窗口里加载 dsh 官方 Web UI。

它也以 dsh 原生插件的形式发布:声明了 dsh.bundle.patch,可以直接用
dsh plugin 安装,并自动创建/维护桌面快捷方式。

特性

- 🪟 Web 套壳:窗口内是官方 Web UI;官方前端/内核更新后无需改动本壳
- 🧩 dsh 插件化安装:dsh plugin --profile web add github:Aaaaamadeus/dsh-gui
- 🔗 自动快捷方式:每次 dsh profile 启动都会幂等刷新桌面快捷方式(含图标、隐藏控制台启动)
- 🧠 低耦合内核:只依赖 dsh 的 host-apiproxy 线协议,不 import 任何 @deepseek-ai/ 包
- 🛡️ 沙箱渲染:contextIsolation + sandbox,外链交给系统默认浏览器
- 🧬 一切皆插件:main 进程插件、RPC 权限声明、dshgui-plugin:// 资产协议、原生模式内置 UI 插件

快速安装(作为 dsh 插件)

前置:已安装 dsh CLI 与 pnpm。

:: 1. 安装为 web profile 的 bundle 插件
dsh plugin --profile web add "github:Aaaaamadeus/dsh-gui"

:: 2. 启动一次 dsh web(会执行插件并自动创建桌面快捷方式;之后可关闭)
dsh web

装完后 %USERPROFILE%\.dsh\profiles\web\package.json 会自动变成:

{
"dependencies": { "dsh-gui": "github:Aaaaamadeus/dsh-gui" },
"dsh": { "profile": { "bundles": [..., "dsh-gui"] } }
}

不需要手改 cordis.yml。以后双击桌面的 dsh-gui 即可:

1. 如果环境里已有运行中的 DSH_WEB_URL → 直接加载该地址;
2. 否则自动拉起 dsh web(默认 127.0.0.1:31680,端口占用自动换随机端口)→ 加载官方 Web UI。

卸载:

dsh plugin --profile web remove dsh-gui

pnpm 会拦截 Electron 二进制后置下载;dsh-gui.cmd 首次启动时会自动补齐 Electron
运行时(一次性下载)。需要镜像时可设置
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/。

从源码安装 / 开发

git clone https://github.com/Aaaaamadeus/dsh-gui
cd dsh-gui
npm install --ignore-scripts
node node_modules\electron\install.js

:: 安装为 dsh 插件并立即创建快捷方式
scripts\install-as-dsh-plugin.cmd

直接启动(不安装为插件):

dsh-gui.cmd

工作方式

┌────────────────────────── dsh-gui(Electron 壳) ──────────────────────────┐ │ Web shell(默认): BrowserWindow ──加载──▶ dsh 官方 Web UI(内核提供) │ │ Native UI(可选): renderer/shell.js + builtin/ 插件 │ │ ▲ IPC / HTTP │ │ src/bridge.js —— IPC:按插件 manifest 动态授权 RPC、插件作用域 IPC │ │ src/plugins/* —— manifest 校验、发现/激活、dshgui-plugin:// 资产协议 │ │ src/kernel/* —— 唯一知道 dsh 线协议的地方 │ │ ├─ http-adapter POST /api/、/api/respond、WebSocket downlink │ │ ├─ host-manager 每次启动重新探测已安装 dsh CLI,dsh web 子进程 │ │ └─ contract 信封/能力/方法别名/版本兼容 │ │ dsh(agent 循环、工具、目标、任务、会话持久化) │ └─────────────────────────────────────────────────────────────────────────────┘

- 会话/工作区/目标/任务与 CLI、浏览器 Web UI 共用 $DSH_HOME 下的同一份数据。
- 窗口外链(文档等)交给系统默认浏览器,套壳窗口不变成浏览器。
内核升级兼容策略

1. 不打包、不锁版本:每次启动重新探测已安装的 dsh (npm root -g / where dsh),npm i -g @deepseek-ai/dsh@latest 后重启即生效。
2. 启动参数自适应:先探测 dsh web --help 是否仍有 --host/--port,否则回退 --profile web;未来 CLI 变化可临时用 DSH_GUI_DSH_ARGS 覆盖内层参数。
3. 外挂内核:DSH_GUI_KERNEL_URL=http://127.0.0.1: 不 spawn 子进程;环境中已有 DSH_WEB_URL 时自动挂接。
4. 方法别名:call 遇到 method-not-found 类错误按别名重试,别名集中在 src/kernel/contract.js,也可用 DSH_GUI_METHOD_ALIASES 注入。
5. 事件前向兼容:未知 mux/host 帧忽略,host.describe 新字段保留并推导能力。
6. 兼容声明:插件 manifest 的 compat.dsh 只做提示/拦截,壳不因版本号拒绝启动。

配置

| 变量 | 默认 | 说明 |
| DSH_GUI_MODE | web | web = 官方 Web UI 套壳;native = 实验性自绘插件 UI |
| DSH_HOME | dsh 默认 | 内核数据目录;GUI 插件目录为 $DSH_HOME/gui-plugins |
| DSH_GUI_PORT | 31680 | 内部 dsh host 端口(占用时自动换随机端口) |
| DSH_GUI_DSH_CLI | 自动探测 | 显式指定 dsh 的 lib/bin.js |
| DSH_GUI_DSH_ARGS | 自动探测 | 覆盖传给 dsh 的内层 web 参数 |
| DSH_GUI_KERNEL_URL | 未设置 | 连接指定 host 的官方 Web UI |
| DSH_GUI_METHOD_ALIASES | 内置空表 | JSON 方法改名别名 |
| DSH_GUI_PLUGIN_DIRS | 未设置 | 追加插件目录(Windows 用 ; 分隔) |
| DSH_GUI_SHORTCUT_NAME | dsh-gui | 快捷方式名称 |
| DSH_GUI_SHORTCUT_DIR | 桌面 | 快捷方式目录(诊断用) |
| DSH_GUI_ICON | 内置 ico | 自定义快捷方式图标(PNG/ICO) |

日志:logs/gui.log、logs/dsh-host.log。

dsh 插件机制

本仓库根 package.json 声明:

"dsh": { "bundle": { "patch": "dsh-gui.patch.yml" } }

dsh-gui.patch.yml 通过 insert 向 booted profile 注入一个宿主层插件 dsh-gui-desktop(plugin/dsh-gui-desktop.mjs)。它只做两件事:

1. 创建/刷新桌面快捷方式(wscript → 隐藏启动器 → dsh-gui.cmd);
2. 可选 autoOpen: true(在 patch 配置里打开)——dsh 启动时自动拉起 GUI。

快捷方式失败只会写日志,绝不阻塞 dsh profile 启动。

插件开发(native 模式 / 主进程扩展)

Web shell 窗口内是 dsh 官方前端,renderer 插件不注入其中;main 插件、manifest 权限与内核别名机制始终生效。renderer 扩展点在 DSH_GUI_MODE=native 下可用。

一个插件 = 目录 + dsh-gui-plugin.json:

{
"id": "example.hello",
"name": "Hello Plugin",
"version": "0.1.0",
"main": "main.js",
"renderer": "renderer.js",
"permissions": { "calls": ["session.list"] },
"compat": { "shell": ">=0.2.0", "dsh": "*" },
"order": 500
}

安装位置:builtin/ → plugins/ → $DSH_HOME/gui-plugins/ → DSH_GUI_PLUGIN_DIRS。

renderer 插件运行在沙箱里,只能通过 window.dsh / DSHGUI 白名单 API 调用 manifest 已声明的 RPC;main 插件与 dsh 插件同信任级,可通过
ctx.ipc.handle(channel, fn) 注册本插件命名空间 IPC。完整示例见
examples/hello-plugin。

目录结构

src/
kernel/ 内核适配层(线协议、host 管理、能力/别名) plugins/ GUI 插件系统(manifest、发现、资产协议) main.js Electron 壳入口 bridge.js IPC 动态权限桥 state.js 内核事件缓存 plugin/ dsh bundle 插件(自动快捷方式) renderer/ native UI 壳与内置样式 builtin/ native UI 内置插件 examples/ 示例插件 scripts/ 安装器与 smoke 测试 assets/ 图标(dsh-gui.ico)

验证

node scripts\smoke.js :: 24 项内核/插件/协议端到端检查
node scripts\renderer-smoke.js :: 10 项 renderer 插件 DOM 检查(jsdom 可用时)

Electron 主进程 headless 检查:

set DSH_GUI_HEADLESS=1
set DSH_GUI_KERNEL_URL=http://127.0.0.1:3080
node_modules\.bin\electron .

兼容范围

- 开发验证:DeepSeek Harness 0.1.0-rc.5 / 0.1.0-rc.6,Windows,Node.js ≥ 20,Electron 37。
- dsh 仍是开发者预览版,未来可能有破坏性变更;协议修复集中在 src/kernel/。

许可证

MIT。本项目不包含 DeepSeek Harness 代码;dsh 及其生态的许可见各自仓库。
预览分享卡片长什么样 ↓Aaaaamadeus/dsh-gui
分享 · DeepSeek Harness Hub
Aaaaamadeus/dsh-gui

把本机 dsh 装进原生窗口,免开浏览器即用官方界面

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部