Overview

Busy Mode is a desktop plugin for Hermes Agent (Electron) that adds a visible busy-mode toggle to the composer controls โ€” closing the gap between the CLI /busy command and the desktop UI. Built by Woodsy as a contribution to the open-source Hermes Agent project by Nous Research.

When Hermes is working, a new icon button appears in the composer controls row (between dictation and steer). Click to cycle through three modes. Toast notification confirms each change.

Modes

โšก Layers3

Message waits in queue, runs after current response completes

๐ŸŽฎ SteeringWheel

Nudges the current run (same as Mod+Enter)

โ–  Square

Stops current response immediately, submits your message

Mode Icon Behavior
Queue (default)
Steer
Interrupt

Demo

Animated demo GIF โ€” showing the busy mode button in action on the Hermes desktop composer.

Installation

Busy Mode is included in the surfdib fork of hermes-agent on the feature/busy-mode-selector branch:

# Clone the surfdib fork
git clone https://github.com/surfdib/hermes-agent.git
cd hermes-agent

# Switch to the busy mode branch
git checkout feature/busy-mode-selector

# Build the desktop app
cd apps/desktop
npm install
npm run build

GitHub

File Changes

3 files changed, +/-60 lines:

NEW โ€” nanostore atom $busyMode + cycleBusyMode()

MODIFIED โ€” busy mode toggle button with icons, tooltips, haptic feedback

MODIFIED โ€” submitDraft() reads $busyMode and dispatches accordingly

File Change
apps/desktop/src/store/busy-mode.ts
apps/desktop/src/app/chat/composer/controls.tsx
apps/desktop/src/app/chat/composer/index.tsx

How It Works

Uses nanostores for state management. The key integration is in submitDraft() inside composer/index.tsx:

} else if (payloadPresent) {
  const mode = $busyMode.get()
  if (mode === 'steer' && canSteer) {
    steerDraft()
  } else if (mode === 'interrupt') {
    triggerHaptic('cancel')
    void Promise.resolve(onCancel()).then(() => {
      const submittedAttachments = cloneAttachments(attachments)
      triggerHaptic('submit')
      clearDraft()
      clearComposerAttachments()
      dispatchSubmit(text, submittedAttachments)
    })
  } else {
    queueCurrentDraft()
  }
}

Includes haptic feedback on mode changes and toast notifications confirming the active mode. Closes GitHub issue #1804.

Changelog

Initial release โ€” Queue/Steer/Interrupt modes, toast notifications, haptic feedback

Version Changes
1.0

Author: Woodsy (surfdib) ยท License: MIT ยท Status: Ready for testing