dsh-clean-desktop-shell 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -1,91 +1,181 @@
1
- <div align="center">
2
-
3
- # dsh-clean-desktop-shell
4
-
5
- **A clean desktop shell for DeepSeek Harness, shipped as a DSH plugin**
6
-
7
- Does exactly one thing: wraps your already-configured DSH Web in a clean native desktop window — system tray, single instance, auto-launch, just like a normal app. No frosted glass, no fancy materials. **Clean.**
8
-
9
- [English](README.en.md) · [中文](README.md)
10
-
11
- [![Platform](https://img.shields.io/badge/Platform-Windows%20%7C%20macOS-0078D6?logo=windows&logoColor=white)](https://github.com/Icather/dsh-clean-desktop-shell)
12
- [![License](https://img.shields.io/badge/License-MIT-22c55e)](LICENSE)
13
- [![Release](https://img.shields.io/github/v/release/Icather/dsh-clean-desktop-shell?color=blue)](https://github.com/Icather/dsh-clean-desktop-shell/releases/latest)
14
- [![DSH](https://img.shields.io/badge/DeepSeek_Harness-rc.7-4D6BFE)](https://github.com/deepseek-ai/deepseek-harness)
15
-
16
- </div>
17
-
18
- ## What is this
19
-
20
- `dsh-clean-desktop-shell` is a **DSH-plugin-shaped clean desktop shell**: it wraps an already-running DSH Web (default `http://127.0.0.1:3080`) in a native desktop window — system tray, single instance, auto-launch, so it behaves like any normal desktop app. **No visual changes at all**: no frosted glass, no skinning — purely a window shell.
21
-
22
- Key differences from other desktop clients in the ecosystem:
23
-
24
- | | Other desktop clients (e.g. dsh-desktop family) | This plugin |
25
- |:--|:--|:--|
26
- | **Form** | Standalone Electron app with its own profile | **DSH plugin** mounted into your existing profile |
27
- | **Profile** | New `desktop` profile, plugins/config must be reinstalled | **Reuses your web profile**, zero migration |
28
- | **Visual changes** | Custom title bar / frosted glass etc. | **None** pure window shell |
29
- | **Upstream** | Pinned version | **Tracks rc.7** |
30
-
31
- ## Architecture
32
-
33
- ```
34
- ┌─────────────────── Core (dsh web / headless service) ───────────────────┐
35
- │ Sessions · Agent · Plugins · Memory live here, decoupled from UI │
36
- └─────────────────────────────────────────────────────────────────────────┘
37
-
38
- ┌───────────────┴───────────────┐
39
- │ dsh-clean-desktop-shell │
40
- │ Electron shell (client) │
41
- tray · single-instance · │
42
- │ auto-launch │
43
- └────────────────────────────────┘
44
- ```
45
-
46
- - **Default**: loads the local `127.0.0.1:3080` (your configured web profile, zero migration).
47
- - **Remote-capable**: configure any remote DSH address; the shell is just a window. Phones / Linux / other devices can reach the core via browser or PWA — the shell is never bound to a local service.
48
-
49
- ### Platform matrix
50
-
51
- | Platform | Shell | Status |
52
- |:--|:--|:--|
53
- | Windows | ✅ Electron (frameless + native window buttons) | First release target |
54
- | macOS | ✅ Electron (hiddenInset) | Planned |
55
- | Linux | — (browser / PWA to the core) | Not planned |
56
- | Termux / phone / tablet | — (headless / PWA to the core) | Covered by remote core access |
57
-
58
- ## Install
59
-
60
- ```sh
61
- dsh plugin --profile web add dsh-clean-desktop-shell
62
- ```
63
-
64
- Restart `dsh web`, then launch the shell from the tray / shortcut.
65
-
66
- > The shell needs a reachable `dsh web` service (local or configured remote address). See Usage.
67
-
68
- ## Usage
69
-
70
- 1. Start `dsh web` (or configure a remote service address).
71
- 2. Launch the shell: it auto-detects local 3080; if not running it starts the service per configuration.
72
- 3. Drag the window by its top area (right side reserved for native buttons); close minimizes to tray by default.
73
-
74
- ## Development
75
-
76
- ```sh
77
- npm install
78
- npm run build # build the plugin bundle
79
- npm run dev # launch the shell (dev mode)
80
- npm run pack # package NSIS (Win) / DMG (mac)
81
- ```
82
-
83
- ## Changelog
84
-
85
- ### 0.1.0
86
- - Initial release: Electron shell skeleton, system tray / single instance / auto-launch, DSH plugin mounting.
87
-
88
- ## Credits
89
-
90
- - [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) the core.
91
- - Architecture inspired by [Hermes Agent Desktop](https://github.com/NousResearch/hermes-agent)'s shell/core separation.
1
+ <div align="center">
2
+
3
+ # dsh-clean-desktop-shell
4
+
5
+ **A clean desktop shell for DeepSeek Harness, shipped as a DSH plugin**
6
+
7
+ Does exactly one thing: wraps your already-configured DSH Web in a clean native desktop window — system tray, single instance, just like a normal app. No frosted glass, no fancy materials. **Clean.**
8
+
9
+ [English](README.en.md) · [中文](README.md)
10
+
11
+ [![Platform](https://img.shields.io/badge/Platform-Windows%20%7C%20macOS-0078D6?logo=windows&logoColor=white)](https://github.com/Icather/dsh-clean-desktop-shell)
12
+ [![License](https://img.shields.io/badge/License-MIT-22c55e)](LICENSE)
13
+ [![Release](https://img.shields.io/github/v/release/Icather/dsh-clean-desktop-shell?color=blue)](https://github.com/Icather/dsh-clean-desktop-shell/releases/latest)
14
+ [![DSH](https://img.shields.io/badge/DeepSeek_Harness-rc.7-4D6BFE)](https://github.com/deepseek-ai/deepseek-harness)
15
+ [![Contributors](https://img.shields.io/github/contributors/Icather/dsh-clean-desktop-shell?color=blueviolet)](https://github.com/Icather/dsh-clean-desktop-shell/graphs/contributors)
16
+
17
+ </div>
18
+
19
+ ## What is this
20
+
21
+ `dsh-clean-desktop-shell` is a **DSH-plugin-shaped clean desktop shell**: it wraps an already-running DSH Web (default `http://127.0.0.1:3080`) in a native desktop window — system tray, single instance, so it behaves like any normal desktop app. **No visual changes at all**: no frosted glass, no skinning — purely a window shell.
22
+
23
+ Key differences from other desktop clients in the ecosystem:
24
+
25
+ | | Other desktop clients (e.g. dsh-desktop family) | This plugin |
26
+ |:--|:--|:--|
27
+ | **Form** | Standalone Electron app with its own profile | **DSH plugin** mounted into your existing profile |
28
+ | **Profile** | New `desktop` profile, plugins/config must be reinstalled | **Reuses your web profile**, zero migration |
29
+ | **Visual changes** | Custom title bar / frosted glass etc. | **None** — pure window shell |
30
+ | **Upstream** | Pinned version | **Tracks rc.7** |
31
+
32
+ ## Install
33
+
34
+ > **Status**: plugin-market install (Option 2) is under construction, expected live early tomorrow. **Only Option 1 (the installer) is currently available.**
35
+
36
+ **Option 1: download the installer from Releases (recommended for end users — the only full desktop-app install)**
37
+
38
+ - Windows: `DSH-Clean-Desktop-Shell-Setup-<version>.exe`
39
+ - macOS: `DSH-Clean-Desktop-Shell-<version>.dmg` (Intel) or `-arm64.dmg` (Apple Silicon)
40
+
41
+ The installer **creates a desktop shortcut automatically** and provides the full desktop experience (tray). The first time you run the Windows installer you may see a SmartScreen warning — **this is normal for unsigned programs, not a virus**, see "Windows SmartScreen warning" below.
42
+
43
+ **Option 2: register as a DSH plugin (developers/power users only) — ⚠️ this command does NOT install any desktop app**
44
+
45
+ ```sh
46
+ dsh plugin --profile web add dsh-clean-desktop-shell
47
+ ```
48
+
49
+ > **Important**: Option 2 only "registers" the shell into your DSH profile. **No desktop app appears on your machine** — no installer, no desktop icon, no tray. It is meant for developers who want the shell mounted in the DSH ecosystem (reuses your web profile config, future settings integration). **For a double-clickable desktop app, use Option 1** (or run the source with `npm run dev`).
50
+
51
+ > The shell needs a reachable `dsh web` service (local or configured remote address). See Usage.
52
+
53
+ ### Windows SmartScreen warning
54
+
55
+ **Why does the warning appear?**
56
+
57
+ Our installer has **no code signing certificate** (a personal open-source project — certificates cost a few hundred USD per year). Microsoft Defender SmartScreen is a **reputation system**: it decides whether a program is trusted based on download volume plus a history of clean executions. For a rarely-downloaded, unsigned `.exe` it cannot confirm reputation, so it warns. **This does not mean the file is a virus**: the project is fully open source and the binaries are built by GitHub Actions from this repository (see `.github/workflows/build.yml`).
58
+
59
+ **When Edge downloads the file:**
60
+
61
+ It may be flagged as "not commonly downloaded". To keep it:
62
+
63
+ 1. Hover the download entry and click the `...` menu on the right
64
+ 2. Choose **Keep**
65
+ 3. Confirm with **Keep anyway**
66
+
67
+ **When you double-click the installer:**
68
+
69
+ A blue dialog appears: "Windows protected your PC" — Microsoft Defender SmartScreen prevented an unrecognized app from starting.
70
+
71
+ 1. Click **More info**
72
+ 2. Verify the file name is `DSH-Clean-Desktop-Shell-Setup-<version>.exe`
73
+ 3. Click **Run anyway**
74
+
75
+ **Alternative: unblock the file once (recommended)**
76
+
77
+ Right-click the installer → Properties → General → tick **Unblock** at the bottom → OK. No more warnings afterwards.
78
+
79
+ Or bulk-unblock via PowerShell:
80
+
81
+ ```powershell
82
+ Unblock-File -Path "$env:USERPROFILE\Downloads\DSH-Clean-Desktop-Shell-Setup-*.exe"
83
+ ```
84
+
85
+ > A code signing certificate (EV or Azure Trusted Signing) would remove this warning entirely, but it costs money and is rarely worth it for individual open-source maintainers. We may adopt signing when the project allows.
86
+
87
+ ## Architecture
88
+
89
+ ```
90
+ ┌─────────────────── Core (dsh web / headless service) ───────────────────┐
91
+ │ Sessions · Agent · Plugins · Memory live here, decoupled from UI │
92
+ └─────────────────────────────────────────────────────────────────────────┘
93
+
94
+ ┌───────────────┴───────────────┐
95
+ │ dsh-clean-desktop-shell │
96
+ │ Electron shell (client) │
97
+ │ tray · single-instance · │
98
+ │ │
99
+ └────────────────────────────────┘
100
+ ```
101
+
102
+ - **Default**: loads the local `127.0.0.1:3080` (your configured web profile, zero migration).
103
+ - **Remote-capable**: configure any remote DSH address; the shell is just a window. Phones / Linux / other devices can reach the core via browser or PWA — the shell is never bound to a local service.
104
+
105
+ ### Platform matrix
106
+
107
+ | Platform | Shell | Status |
108
+ |:--|:--|:--|
109
+ | Windows | ✅ Electron (frameless + native window buttons) | Released (NSIS installer) |
110
+ | macOS | ✅ Electron (hiddenInset) | Released (CI builds Intel + Apple Silicon DMG) |
111
+ | Linux | — (browser / PWA to the core) | Not planned |
112
+ | Termux / phone / tablet | — (headless / PWA to the core) | Covered by remote core access |
113
+
114
+ ## Usage
115
+
116
+ 1. Start `dsh web` (or configure a remote service address).
117
+ 2. Launch the shell: it auto-detects local 3080 — loads the page if the backend is up, otherwise shows the "backend offline" screen where you can start it in one click.
118
+ 3. Drag the window by its top area (right side reserved for native buttons); close minimizes to tray by default.
119
+
120
+ **All backend controls live in the tray** — the main window stays a pure shell:
121
+
122
+ - Start / restart / stop the backend (with progress dialogs; stopping really
123
+ shuts down the service on 3080, including externally started instances)
124
+ - Auto-detect backend · set the backend install folder (auto-detect default)
125
+ - Reload window · check for updates · repo homepage
126
+
127
+ **Window reliability (Edge-style instant refresh):**
128
+
129
+ - Shows immediately on launch, never waits for the backend
130
+ - While the backend is down, a local "backend offline" screen is shown and
131
+ re-probed; the real page loads automatically the moment it answers
132
+ - The instant the backend stops (tray stop, kill or crash) the window flips
133
+ back to the offline screen — a stale page never fakes "still alive"
134
+ - The offline screen has self-service buttons: reload / start backend /
135
+ auto-detect backend / set backend install folder
136
+
137
+ ## Development
138
+
139
+ ```sh
140
+ npm install
141
+ npm run build # build the plugin bundle
142
+ npm run dev # launch the shell (dev mode)
143
+ npm run pack # package NSIS (Win) / DMG (mac)
144
+ ```
145
+
146
+ ## Changelog
147
+
148
+ ### 0.1.2
149
+ - Windows auto-update: tray "check for updates" now downloads in the
150
+ background with progress and installs on restart (electron-updater);
151
+ macOS keeps the manual download flow.
152
+ - Launch-time backend auto-start removed (fully manual now, no longer
153
+ fights an explicit "stop backend").
154
+ - Contributor files added (CONTRIBUTING / CoC / SECURITY / issue & PR
155
+ templates).
156
+ - README: Windows SmartScreen install guide; clarified that "plugin
157
+ registration ≠ installing the desktop app".
158
+
159
+ ### 0.1.1
160
+ - Backend lifecycle: fixed `spawn EINVAL` / stuck "starting" on Windows;
161
+ "stop backend" now really shuts the service down (including externally
162
+ started instances); start/restart/stop show progress dialogs.
163
+ - Window reliability: shows instantly on double-click; flips to the offline
164
+ screen the moment the backend stops; auto-reconnects when it comes back
165
+ (Edge-style instant refresh).
166
+ - Offline screen self-service: reload / start backend / auto-detect backend /
167
+ set backend install folder.
168
+ - Tray: new "reload window" item; macOS builds released (Intel + Apple
169
+ Silicon DMG).
170
+
171
+ ### 0.1.0
172
+ - Initial release: Electron shell skeleton, system tray / single instance, DSH plugin mounting.
173
+
174
+ ## Contributing
175
+
176
+ Contributions of any kind are welcome — bug fixes, features, docs. Please read [CONTRIBUTING.md](CONTRIBUTING.md) first (project layout, dev conventions, commit style, PR flow) and follow [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md). Security issues: report privately via [SECURITY.md](SECURITY.md).
177
+
178
+ ## Credits
179
+
180
+ - [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) — the core.
181
+ - Architecture inspired by [Hermes Agent Desktop](https://github.com/NousResearch/hermes-agent)'s shell/core separation.
package/README.md CHANGED
@@ -1,90 +1,169 @@
1
- <div align="center">
2
-
3
- # dsh-clean-desktop-shell
4
-
5
- **DeepSeek Harness 的纯净桌面壳(DSH 插件形态)**
6
-
7
- 只做一件事:给已配置好的 DSH Web 加一层干净的桌面窗口——系统托盘、单实例、开机自启、像普通软件一样用。无毛玻璃、无花哨材质,**纯净**。
8
-
9
- [English](README.en.md) · [中文](README.md)
10
-
11
- [![Platform](https://img.shields.io/badge/Platform-Windows%20%7C%20macOS-0078D6?logo=windows&logoColor=white)](https://github.com/Icather/dsh-clean-desktop-shell)
12
- [![License](https://img.shields.io/badge/License-MIT-22c55e)](LICENSE)
13
- [![Release](https://img.shields.io/github/v/release/Icather/dsh-clean-desktop-shell?color=blue)](https://github.com/Icather/dsh-clean-desktop-shell/releases/latest)
14
- [![DSH](https://img.shields.io/badge/DeepSeek_Harness-rc.7-4D6BFE)](https://github.com/deepseek-ai/deepseek-harness)
15
-
16
- </div>
17
-
18
- ## 这是什么
19
-
20
- `dsh-clean-desktop-shell` 是一个 **DSH 插件形态** 的纯净桌面壳:它给已经跑起来的 DSH Web(默认 `http://127.0.0.1:3080`)套一层原生桌面窗口——系统托盘、单实例、开机自启,像普通桌面软件一样使用。**不做任何视觉改造**:不加毛玻璃、不改界面,纯粹是"窗口壳"。
21
-
22
- 与生态里其他桌面端方案的最大区别:
23
-
24
- | | 其他桌面端(如 dsh-desktop 系列) | 本插件 |
25
- |:--|:--|:--|
26
- | **形态** | 独立 Electron 应用,自带独立 profile | **DSH 插件**,挂载进现有 profile |
27
- | **Profile** | 新建 desktop profile,插件/配置要重装 | **复用现有 web profile**,零迁移 |
28
- | **视觉改造** | 自绘标题栏 / 毛玻璃等 | **零改造**,纯净窗口壳 |
29
- | **跟随上游** | 固定版本 | **跟随 rc.7** |
30
-
31
- ## 架构
32
-
33
- ```
34
- ┌──────────────────── 内核(dsh web / headless 服务) ────────────────────┐
35
- │ 会话 · Agent · 插件 · 记忆 都在这层,与界面解耦 │
36
- └─────────────────────────────────────────────────────────────────────────┘
37
-
38
- ┌───────────────┴───────────────┐
39
- │ dsh-clean-desktop-shell │
40
- │ Electron 壳(客户端) │
41
- │ 托盘 · 单实例 · 开机自启 │
42
- └────────────────────────────────┘
43
- ```
44
-
45
- - **默认**:加载本地 `127.0.0.1:3080`(已配置好的 web profile,零迁移)。
46
- - **可配远程**:在设置里填入任意远程 DSH 地址,壳只当窗口——手机 / Linux / 其他设备通过浏览器或 PWA 也能接入内核,壳本身不绑定本地服务。
47
-
48
- ### 平台矩阵
49
-
50
- | 平台 | 壳 | 状态 |
51
- |:--|:--|:--|
52
- | Windows | ✅ Electron(无边框 + 原生窗口按钮) | 首发目标 |
53
- | macOS | ✅ Electron(hiddenInset) | 规划中 |
54
- | Linux | —(浏览器 / PWA 直连内核) | 不做 |
55
- | Termux / 手机 / 平板 | —(headless / PWA 直连内核) | 由内核远程访问支持 |
56
-
57
- ## 安装
58
-
59
- ```sh
60
- dsh plugin --profile web add dsh-clean-desktop-shell
61
- ```
62
-
63
- 重启 `dsh web` 后,从系统托盘/快捷方式启动桌面壳即可。
64
-
65
- > 桌面壳需要本机有可用的 `dsh web` 服务(或配置的远程地址)。见下方「使用」。
66
-
67
- ## 使用
68
-
69
- 1. 启动 `dsh web`(或配置远程服务地址)。
70
- 2. 启动桌面壳:自动检测本地 3080;未运行时按配置拉起服务。
71
- 3. 窗口顶部(右侧留系统按钮)可拖动窗口;关闭默认缩到托盘。
72
-
73
- ## 开发
74
-
75
- ```sh
76
- npm install
77
- npm run build # 构建插件 bundle
78
- npm run dev # 启动壳(开发模式)
79
- npm run pack # 打包 NSIS (Win) / DMG (mac)
80
- ```
81
-
82
- ## 更新历史
83
-
84
- ### 0.1.0
85
- - 初始版本:Electron 壳骨架,系统托盘/单实例/开机自启,DSH 插件挂载。
86
-
87
- ## 致谢
88
-
89
- - [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) —— 内核本体。
90
- - 架构参考 [Hermes Agent Desktop](https://github.com/NousResearch/hermes-agent) 的壳/内核分离设计。
1
+ <div align="center">
2
+
3
+ # dsh-clean-desktop-shell
4
+
5
+ **DeepSeek Harness 的纯净桌面壳(DSH 插件形态)**
6
+
7
+ 只做一件事:给已配置好的 DSH Web 加一层干净的桌面窗口——系统托盘、单实例、像普通软件一样用。无毛玻璃、无花哨材质,**纯净**。
8
+
9
+ [English](README.en.md) · [中文](README.md)
10
+
11
+ [![Platform](https://img.shields.io/badge/Platform-Windows%20%7C%20macOS-0078D6?logo=windows&logoColor=white)](https://github.com/Icather/dsh-clean-desktop-shell)
12
+ [![License](https://img.shields.io/badge/License-MIT-22c55e)](LICENSE)
13
+ [![Release](https://img.shields.io/github/v/release/Icather/dsh-clean-desktop-shell?color=blue)](https://github.com/Icather/dsh-clean-desktop-shell/releases/latest)
14
+ [![DSH](https://img.shields.io/badge/DeepSeek_Harness-rc.7-4D6BFE)](https://github.com/deepseek-ai/deepseek-harness)
15
+ [![Contributors](https://img.shields.io/github/contributors/Icather/dsh-clean-desktop-shell?color=blueviolet)](https://github.com/Icather/dsh-clean-desktop-shell/graphs/contributors)
16
+
17
+ </div>
18
+
19
+ ## 这是什么
20
+
21
+ `dsh-clean-desktop-shell` 是一个 **DSH 插件形态** 的纯净桌面壳:它给已经跑起来的 DSH Web(默认 `http://127.0.0.1:3080`)套一层原生桌面窗口——系统托盘、单实例,像普通桌面软件一样使用。**不做任何视觉改造**:不加毛玻璃、不改界面,纯粹是"窗口壳"。
22
+
23
+ 与生态里其他桌面端方案的最大区别:
24
+
25
+ | | 其他桌面端(如 dsh-desktop 系列) | 本插件 |
26
+ |:--|:--|:--|
27
+ | **形态** | 独立 Electron 应用,自带独立 profile | **DSH 插件**,挂载进现有 profile |
28
+ | **Profile** | 新建 desktop profile,插件/配置要重装 | **复用现有 web profile**,零迁移 |
29
+ | **视觉改造** | 自绘标题栏 / 毛玻璃等 | **零改造**,纯净窗口壳 |
30
+ | **跟随上游** | 固定版本 | **跟随 rc.7** |
31
+
32
+ ## 安装
33
+
34
+ > **状态提示**:插件形式安装(方式二)施工中,预计今日凌晨上线。**当前仅支持方式一安装包安装**。
35
+
36
+ **方式一:从 Release 下载安装包(推荐普通用户,唯一完整的桌面应用安装方式)**
37
+
38
+ - Windows:下载 `DSH-Clean-Desktop-Shell-Setup-<版本>.exe`
39
+ - macOS:下载 `DSH-Clean-Desktop-Shell-<版本>.dmg`(Intel)或 `-arm64.dmg`(Apple Silicon)
40
+
41
+ 安装包会**自动创建桌面快捷方式**,并提供系统托盘等完整桌面体验。首次运行 Windows 安装包可能触发 SmartScreen 警告——**这是未签名程序的正常现象,不是病毒**,见下方「Windows SmartScreen 警告说明」。
42
+
43
+ **方式二:作为 DSH 插件注册(仅开发者/高级用户)——⚠️ 这个命令不会安装任何桌面应用**
44
+
45
+ ```sh
46
+ dsh plugin --profile web add dsh-clean-desktop-shell
47
+ ```
48
+
49
+ > **重要**:方式二只是把壳"登记"进 DSH profile,**你的电脑上不会多出任何桌面应用**——没有安装包、没有桌面图标、没有系统托盘。它只用于开发者把壳挂进 DSH 生态(复用 web profile 配置、供未来设置集成)。**想要可双击使用的桌面应用,请用方式一**(或源码 `npm run dev` 运行)。
50
+
51
+ > 桌面壳需要本机有可用的 `dsh web` 服务(或配置的远程地址)。见下方「使用」。
52
+
53
+ ### Windows SmartScreen 警告说明
54
+
55
+ **为什么会看到警告?**
56
+
57
+ 我们的安装包**没有代码签名证书**(个人开源项目暂未购买,证书年费约数百美元)。Windows 的 Microsoft Defender SmartScreen 是一个**信誉系统**——它根据"下载量 + 干净运行的记录"判断一个程序是否可信。对下载量少、未签名的 exe,它无法确认信誉,就会警告。**这不代表文件有病毒**:本项目完全开源,代码可审阅,也可本地构建比对(见下)。
58
+
59
+ **Edge 下载时会看到:**
60
+
61
+ 下载面板里该文件被标记为"不常下载的文件",需要手动保留:
62
+
63
+ 1. 悬停下载项,点击右侧的 `...` 菜单
64
+ 2. 选择「保留」(Keep)
65
+ 3. 弹窗确认,选择「仍要保留」(Keep anyway)
66
+
67
+ **双击安装时会看到:**
68
+
69
+ 蓝色对话框「Windows 已保护你的电脑」——Microsoft Defender SmartScreen 阻止了无法识别的应用启动:
70
+
71
+ 1. 点击「更多信息」(More info)
72
+ 2. 核对文件名确实是 `DSH-Clean-Desktop-Shell-Setup-<版本>.exe`
73
+ 3. 点击「仍要运行」(Run anyway)
74
+
75
+ **备选:一次性解除锁定(推荐)**
76
+
77
+ 右键安装包 属性 常规 → 底部勾选「解除锁定」→ 确定。之后双击不再有警告。
78
+
79
+ PowerShell 批量解除:
80
+
81
+ ```powershell
82
+ Unblock-File -Path "$env:USERPROFILE\Downloads\DSH-Clean-Desktop-Shell-Setup-*.exe"
83
+ ```
84
+
85
+ **关于文件安全性的说明**
86
+
87
+ 安装包由 GitHub Actions 从本仓库源码自动构建(见 `.github/workflows/build.yml`),代码完全开源可审阅。如仍有疑虑,可自行 `git clone` 后按「开发」一节本地构建比对,或稍等下载量积累——SmartScreen 信誉度上去后警告会自动消失。
88
+
89
+ > 说明:代码签名证书(EV Azure Trusted Signing)可以彻底消除这个警告,但需要付费且对个人开源维护者不划算。本仓库会在条件允许时考虑接入签名。
90
+
91
+ ## 架构
92
+
93
+ ```
94
+ ┌──────────────────── 内核(dsh web / headless 服务) ────────────────────┐
95
+ │ 会话 · Agent · 插件 · 记忆 都在这层,与界面解耦 │
96
+ └─────────────────────────────────────────────────────────────────────────┘
97
+
98
+ ┌───────────────┴───────────────┐
99
+ │ dsh-clean-desktop-shell │
100
+ │ Electron 壳(客户端) │
101
+ │ 托盘 · 单实例 │
102
+ └────────────────────────────────┘
103
+ ```
104
+
105
+ - **默认**:加载本地 `127.0.0.1:3080`(已配置好的 web profile,零迁移)。
106
+ - **可配远程**:在设置里填入任意远程 DSH 地址,壳只当窗口——手机 / Linux / 其他设备通过浏览器或 PWA 也能接入内核,壳本身不绑定本地服务。
107
+
108
+ ### 平台矩阵
109
+
110
+ | 平台 | 壳 | 状态 |
111
+ |:--|:--|:--|
112
+ | Windows | ✅ Electron(无边框 + 原生窗口按钮) | 已发布(NSIS 安装包) |
113
+ | macOS | ✅ Electron(hiddenInset) | 已发布(CI 构建 Intel + Apple Silicon DMG) |
114
+ | Linux | —(浏览器 / PWA 直连内核) | 不做 |
115
+ | Termux / 手机 / 平板 | —(headless / PWA 直连内核) | 由内核远程访问支持 |
116
+
117
+ ## 使用
118
+
119
+ 1. 启动 `dsh web`(或配置远程服务地址)。
120
+ 2. 启动桌面壳:自动检测本地 3080——后端在跑则直接加载,未运行则显示「后端未连接」页,可在离线页一键启动。
121
+ 3. 窗口顶部(右侧留系统按钮)可拖动窗口;关闭默认缩到托盘。
122
+
123
+ **后端的一切操作都在托盘右键**,主窗口保持纯壳:
124
+
125
+ - 启动 / 重启 / 关闭后端(带进度弹窗;关闭会真正停掉 3080 上的服务,包括外部启动的实例)
126
+ - 自动探测后端 · 设置后端安装文件夹(默认自动探测定位)
127
+ - 刷新窗口 · 检查更新 · 仓库主页
128
+
129
+ **窗口的可靠性(Edge 式即时刷新)**:
130
+
131
+ - 双击启动立即出窗,不等后端就绪
132
+ - 后端没起来时显示「后端未连接」页,自动探测;后端一通立即加载
133
+ - 后端关闭 / 被杀的一刻,窗口立刻切回离线页——不会停在旧页面假装还活着
134
+ - 离线页内置快捷按钮:重新加载 / 启动后端 / 自动探测后端 / 设置后端安装文件夹
135
+
136
+ ## 开发
137
+
138
+ ```sh
139
+ npm install
140
+ npm run build # 构建插件 bundle
141
+ npm run dev # 启动壳(开发模式)
142
+ npm run pack # 打包 NSIS (Win) / DMG (mac)
143
+ ```
144
+
145
+ ## 更新历史
146
+
147
+ ### 0.1.2
148
+ - Windows 自动更新:托盘「检查更新」改为后台下载 + 进度显示 + 重启安装(electron-updater);macOS 仍为手动下载。
149
+ - 移除启动时自动拉起后端(改纯手动,与「关闭后端」不冲突)。
150
+ - 新增贡献者全套文件(CONTRIBUTING / 行为准则 / 安全策略 / Issue 与 PR 模板)。
151
+ - README:新增 Windows SmartScreen 安装指引;澄清「插件注册 ≠ 安装桌面应用」。
152
+
153
+ ### 0.1.1
154
+ - 后端生命周期:修复 Windows 下启动报 `spawn EINVAL`、卡「启动中」的问题;「关闭后端」现在能真正停掉后端(含外部启动的实例);启动 / 重启 / 关闭带进度弹窗。
155
+ - 窗口可靠性:双击立即出窗;后端关闭窗口立刻切离线黑屏;后端恢复自动重连(Edge 式即时刷新)。
156
+ - 离线页自助:重新加载 / 启动后端 / 自动探测后端 / 设置后端安装文件夹。
157
+ - 托盘:新增「刷新窗口」;macOS 构建发布(Intel + Apple Silicon DMG)。
158
+
159
+ ### 0.1.0
160
+ - 初始版本:Electron 壳骨架,系统托盘/单实例,DSH 插件挂载。
161
+
162
+ ## 贡献
163
+
164
+ 欢迎任何形式的贡献——修 bug、加功能、改进文档都行。请先阅读 [CONTRIBUTING.md](CONTRIBUTING.md)(含项目结构、开发约定、提交规范、PR 流程),并遵守 [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)。安全漏洞请走 [SECURITY.md](SECURITY.md) 的私密报告流程。
165
+
166
+ ## 致谢
167
+
168
+ - [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) —— 内核本体。
169
+ - 架构参考 [Hermes Agent Desktop](https://github.com/NousResearch/hermes-agent) 的壳/内核分离设计。
@@ -4,10 +4,8 @@
4
4
  * Fields:
5
5
  * - targetUrl: default 'http://127.0.0.1:3080' — set to any remote
6
6
  * DSH address to run the shell as a pure window.
7
- * - autoStartService: default true — only applies to the local default URL.
8
7
  * - closeToTray: default true.
9
8
  * - windowMode: 'advanced' (mica/vibrancy) | 'compatibility'.
10
- * - autoLaunch: open at login.
11
9
  */
12
10
  import { app } from 'electron'
13
11
  import { readFileSync, writeFileSync, mkdirSync } from 'node:fs'
@@ -15,11 +13,12 @@ import { dirname, join } from 'node:path'
15
13
 
16
14
  const DEFAULTS = {
17
15
  targetUrl: 'http://127.0.0.1:3080',
18
- autoStartService: true,
19
16
  closeToTray: true,
20
17
  windowMode: 'advanced',
21
- autoLaunch: false,
22
18
  backendPath: null,
19
+ // True once the first-run "create a desktop shortcut?" prompt was shown
20
+ // (so it never nags again). The tray item stays available regardless.
21
+ shortcutAsked: false,
23
22
  }
24
23
 
25
24
  let cached = null