Introduction¶
When developing agents using DeepSeek Harness (DSH) Web UI, developers often need to switch from the browser environment back to the local file system and open the workspace folder of the current session. Such cross-window operations can interrupt the workflow. The dsh-open-in-app plugin integrates a Codex-style control into the session header toolbar in DSH Web UI, providing a one-click folder-opening capability.
Core Features¶
This plugin adds a capsule-shaped split control to the session header toolbar. The control contains a folder button and a dropdown arrow.
- Folder button: Clicking it opens the folder using the last selected application for that workspace. If no history exists, it falls back to the default editor (priority: VS Code > Cursor > Windsurf > Zed > …). The corresponding application icon is displayed on the button.
- Dropdown arrow: Clicking it expands a menu containing “Recently Used”, “System Default App”, and a whitelist of installed terminals and editors on the host. Each item includes an application icon (such as Finder on macOS or File Explorer on Windows).
- Remote endpoint: The plugin registers an
openInAppservice on the host and provides four methods:listApps,openWith,openDefault, andopenDefaultEditor, for use by other plugins or logic.
Installation and Enablement¶
The plugin installation command is as follows:
dsh plugin --profile web add dsh-open-in-app
After installation, you must restart the dsh web application. The plugin loader and client module graph are composed at startup, and newly added plugins do not support hot reloading. After restarting, the control appears next to the session title.
Typical Usage¶
- Locate the control in the upper-right corner of the chat window.
- Click the folder icon directly to open the workspace with the default or last selected application.
- Click the dropdown arrow and select a specific application (such as Terminal or VS Code) to open.
- To customize the whitelist, edit the
WHITELISTarray inlib/apps.js.
Whitelist and Configuration¶
The applications shown in the menu are controlled by a whitelist. The default whitelist includes common terminals and editors, such as Terminal, iTerm2, Ghostty, Warp, VS Code, Cursor, Zed, and others.
To add or remove entries, edit the WHITELIST array in lib/apps.js. Each entry has the structure { id, category, match, exact? }:
* id: Canonical display name (also the name that the native open command must be able to find).
* match: Alias used for substring matching.
* exact: Used for full-name matching to prevent short-name conflicts (for example, code accidentally matching CodeRunner).
Technical Details and Notes¶
- Platform implementation:
- macOS: Converts
.icnsfiles to 32px PNG usingsips, then usesopen -a "<app>" <path>. - Windows: Extracts embedded icons from
.exefiles using PowerShell, then usescmd /c start "" <exe> <path>. - Linux: Parses
.desktopfiles, then usesgtk-launch <id> <path>or falls back toxdg-open.
- macOS: Converts
- Icon resolution: Only reads enumerated application paths and freedesktop icon theme directories, with a buffer limit of 256KB. Caching is based on source path + mtime to reduce repeated-opening overhead.
- Security and permissions:
- The remote endpoint is not in the privileged methods list and is restricted to loopback or trusted host access.
- Opening a path spawns a native process, and the path is derived from the session’s own
cwd. - Command failures (such as a missing application) display an error line in the menu and do not throw exceptions.
- Development constraints: The client bundle must remain self-contained with no build step.
Conclusion¶
dsh-open-in-app simplifies environment switching in agent development by embedding native file system operations into the Web UI. The plugin is open-sourced under the MIT license and is suitable for developers who frequently switch between the browser and local editors.