# dsh-desktop **Repository Path**: coldcgh/dsh-desktop ## Basic Information - **Project Name**: dsh-desktop - **Description**: dsh-desktop - DeepSeek Harness Windows portable launcher (Wails v3) - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-17 - **Last Updated**: 2026-08-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DeepSeek Harness Desktop 把 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 的网页端 GUI 打包成 Windows 桌面客户端。基于 **Go + Wails v3**。 ## 目录结构(部署形态) harness 源码和打包后的 exe 放在**同一个目录**: ``` DeepSeekHarness/ ← 部署目录 ├─ dsh-desktop.exe ← 打包后的客户端 └─ deepseek-harness/ ← harness 源码(git 仓库 + 依赖) ├─ .git/ ← 支持 git pull 更新 ├─ package.json ├─ apps/cli/src/bin.ts └─ node_modules/ ← pnpm install 生成 ``` 开发工程位于 `dsh-desktop/`,`wails3 build` 会把 exe 输出到上一级目录(与 `deepseek-harness/` 同级)。 ## 运行逻辑 - **启动即进应用页**:打开程序自动启动 harness(自动选空闲端口),就绪后把界面**内嵌**到主窗口; - **无顶部菜单**:改用**系统托盘**; - **托盘右键**菜单:`打开应用` / `打开控制台` / `退出`;左键点击切换主窗口显示; - **控制台以独立窗口打开**:提供 Git 更新、安装依赖、编译、启动/停止、日志与状态。 关闭主窗口或控制台窗口只会**隐藏**,程序驻留托盘,通过托盘「退出」真正结束。 ## 功能 - **自动检测** harness 目录(环境变量 → exe 同级 → 当前目录及父目录); - **自动选端口**:从 3080 起自动挑一个空闲端口; - **Git 更新 / 安装依赖 / 编译**:对 harness 源码执行 `git pull`、`pnpm install`、`pnpm run build:web`; - **实时日志与状态**(启动中 / 已就绪 / 已退出)。 ## 环境要求 - Go 1.25+(开发时 1.26) - Node.js 22.19+ 或 24+ - [Microsoft Edge WebView2 Runtime](https://developer.microsoft.com/microsoft-edge/webview2/)(Win10/11 通常已内置) - 首次使用前在 `deepseek-harness/` 执行一次 `pnpm install` ## 构建 ```powershell go install github.com/wailsapp/wails/v3/cmd/wails3@latest # 首次安装 Wails v3 CLI cd dsh-desktop wails3 build # exe 输出到上一级目录(与 deepseek-harness 同级) ``` 若 `wails3` 不在 PATH,把 `$(go env GOPATH)/bin` 加入 PATH。 ## 运行 / 打包 - 开发模式(热重载):`wails3 dev` - 直接运行部署目录下的 `dsh-desktop.exe` - 生成 NSIS 安装包(需 NSIS):`wails3 package` ## 工作原理 - **隐藏控制台**:Wails 应用以 GUI 子系统编译(`-H windowsgui`);harness 子进程设 `HideWindow` + `CREATE_NO_WINDOW`,node 也不弹黑框。 - **启动命令**:`node --import tsx/esm apps/cli/src/bin.ts web --port <自动端口>`。 - **内嵌**:就绪后 Go 侧 `mainWindow.SetURL(http://127.0.0.1:<端口>)` 把界面载入主窗口。 - **托盘**:`app.SystemTray.New()` + 菜单,右键弹出;窗口关闭通过 `WindowClosing` 钩子改为隐藏。 - **停止**:`taskkill /F /T /PID` 结束整个进程树。