English | 中文
Wails v2 window that supervises dsh --profile web and loads the existing Web GUI in a WebView. It does not reimplement the product UI or replace the HTTP/WebSocket host.
- Go
1.22+and the Wails v2 CLIv2.10.2+(wailsonPATH; older CLIs fail against current Go export data) - Repository toolchain: Node, pnpm, and a built frontend dist (
pnpm run buildor at leastpnpm run build:webso@deepseek-ai/dsh-web-frontend/distexists) DEEPSEEK_API_KEY(or root / Harness-home.env) for real model turns; the shell still boots the GUI without a key
From the repository root, build host artifacts once (or after a clean), then start the shell:
pnpm run build
pnpm run desktop:devdsh --profile web needs both package lib/ outputs and apps/web/dist. Without them the child exits immediately (the shell now fails fast when apps/web/dist/index.html or packages/bundle/web-app/lib/index.js is missing).
That runs wails dev in this directory with DSH_DESKTOP_REPO_ROOT set to the repo root. The shell picks a free loopback port, starts pnpm dsh --profile web --host 127.0.0.1 --port <n>, waits for the dsh web: http://127.0.0.1:<n> line, then navigates the WebView to that URL.
Override the checkout path only when the working directory is not under the monorepo:
DSH_DESKTOP_REPO_ROOT=/path/to/deepseek-harness pnpm run desktop:devpnpm run desktop:buildThe macOS/Windows/Linux binary lands under apps/desktop/build/bin/. The packaged app still expects pnpm and this checkout (or a layout findRepoRoot can resolve) at runtime for the Node host; shipping a self-contained Node runtime is out of scope for this thin shell.
- Allocate
127.0.0.1:0, then pass the chosen port todsh. - Inherit the process environment (credentials,
DSH_HOME, …). - On window close, SIGTERM the process group, then SIGKILL after a short wait.
- Product UI remains the loopback
dsh webstack; there is no IPC/file://carrier yet (GUI layering). - No system tray, custom native menus, or single-instance lock in this cut.
- Native directory-picker via Wails dialogs is not wired; the Web profile keeps its existing picker backends.