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.

  1. 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.
  2. 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).
  3. Remote endpoint: The plugin registers an openInApp service on the host and provides four methods: listApps, openWith, openDefault, and openDefaultEditor, 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

  1. Locate the control in the upper-right corner of the chat window.
  2. Click the folder icon directly to open the workspace with the default or last selected application.
  3. Click the dropdown arrow and select a specific application (such as Terminal or VS Code) to open.
  4. To customize the whitelist, edit the WHITELIST array in lib/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 .icns files to 32px PNG using sips, then uses open -a "<app>" <path>.
    • Windows: Extracts embedded icons from .exe files using PowerShell, then uses cmd /c start "" <exe> <path>.
    • Linux: Parses .desktop files, then uses gtk-launch <id> <path> or falls back to xdg-open.
  • 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.

Plugin directory | GitHub repository