DSH Status Notifier: Displaying Agent Status in the macOS Menu Bar

Introduction

In DSH’s plugin system, many interactions occur during the agent execution process: permission approvals, task running, and task completion. These states are only visible within the Harness window by default. If you switch to another application, you can only rely on the window title or check the logs later. DSH Status Notifier is built for this problem: it renders the agent’s status into the macOS menu bar and sends system notifications when the window is not visible.

What is it

DSH Status Notifier is a DSH bundle maintained by Carlos5986515, with the repository at https://github.com/Carlos5986515/dsh-status-notifier, categorized as a client plugin, and has 1 star on GitHub. Its positioning is clear: to put the agent’s real-time status in the menu bar (depending on SwiftBar), rather than making a new panel.

The main components are divided into two halves: the Host half (index.js) runs in the DSH Host process, responsible for observing persistent events and rendering SwiftBar scripts; the Client half (client.js) runs in the Web GUI, responsible for sending notifications when the page leaves.

Core Features

The menu bar icon is colored based on status, with the meanings as follows:

Menu Bar Display Meaning
⚠ 1 (Orange) There is a permission request waiting for your approval
● 1 (Blue) There is a task running
✓ 1 (Green) There is a task ending within 30 minutes
○ Idle (Gray) Idle

Clicking the menu bar item pops up a dropdown list listing sessions under each state; clicking any line, or the “Open DeepSeek Harness” row, will bring the Harness window to the foreground. The menu bar status refreshes every 5 seconds.

There are two paths for notifications, and they will not trigger repeatedly:

  • When the page is open but the window is hidden or unfocused, the Client half triggers browser notifications (based on the framework’s own uiSession.sessionStatus, with values running / pendingInteraction / completionUnread).
  • When the window is closed but the Host is still running, the Host half triggers macOS system notifications via osascript. The Host only sends notifications when there is no page connection, so the two paths won’t double-notify.

The Host half observes persistent, order-independent event signals: approval/asked and approval/decided (approval audit pairs appended by the Approval service) inside session/event, and the running↔idle conversion of agent/status. It renders dsh-status.5s.sh and its output to the plugin directory; the rendered status files are placed outside the plugin directory to avoid SwiftBar mistaking them for plugins.

Installation and Enablement

Prerequisites: macOS, and SwiftBar installed; DSH supports plugin bundles. First install SwiftBar:

brew install --cask swiftbar

Then follow the steps below to install the bundle.

  1. Clone the repository to any location, or copy the directory to your workspace.

  2. Install this bundle in DSH. Choose one of two ways: select “install local bundle” in Plugin Manager; or let the agent execute plugin_manager’s install_bundle, passing this directory as the target.

  3. Point SwiftBar to the plugin directory. Choose one:
    - Create ~/.swiftbar and point SwiftBar’s Preferences → General → Plugin Folder to it;
    - Or keep SwiftBar’s own directory, and write its path to the first line of ~/.dsh/swiftbar-dir.txt.

  4. Restart DeepSeek Harness to load the Host half. The menu bar item will appear within a few seconds.

Note: The official method is local installation after cloning; do not try to construct commands like dsh plugin add github:owner/repo based on the plugin name.

Configuration

Changing behavior relies on these variables or files:

Variable / File Function
DSH_SWIFTBAR_DIR SwiftBar plugin directory (highest priority)
~/.dsh/swiftbar-dir.txt First line is the plugin directory path
DSH_SWIFTBAR_STATE_DIR Storage location for rendered status files, default ~/.dsh/swiftbar-state

Parsing order: DSH_SWIFTBAR_DIR → ~/.dsh/swiftbar-dir.txt → ~/.swiftbar. The state directory is parsed when plugins load; changes require restarting DSH to take effect.

Local Testing of Rendering Logic

The test-render.mjs in the repository will run the Host half using mocked Cordis context, simulating approval / running / idle events, and checks the rendered SwiftBar output and old file cleanup:

node test-render.mjs

You can run it first when changing rendering logic.

Use Cases and Notes

Suitable for people using DSH on macOS who want to see status when long tasks run, but don’t want to frequently switch back to the Harness window.

A few practical limitations to know in advance:

  • The menu bar item is essentially a SwiftBar script; if SwiftBar isn’t running, the menu bar item won’t appear.
  • Clicking a line only brings the Harness window to the foreground; it cannot yet directly deep-link into a specific session.
  • The plugin runs with the permissions of the current DSH process and reads and writes the directories mentioned above in your local environment. Read the source code and LICENSE (MIT license) before installing.

Conclusion

The value of DSH Status Notifier is simple: provide an outlet for agent status that can be seen without switching windows, filling the status blind spot when DSH’s window is in the background. The community directory page is https://www.skillhub.cn/plugins/Carlos5986515/dsh-status-notifier, source code and README at https://github.com/Carlos5986515/dsh-status-notifier.

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye