Skip to content
Back

DeepSeek Harness: my plugin finally announces what the agent is doing

Edit this post on GitHub

When you drive an AI agent like the DeepSeek Harness, being a blind user gives you a problem that sighted users never notice: the agent works invisibly in the background. It calls tools, gets results, and composes an answer. But what is actually happening right now? That stayed hidden from me for a long time - until I built a small accessibility plugin for it.

The result is dsh-a11y-focus, a plugin for the DeepSeek Harness web UI. It announces what the agent is doing, directly through an aria-live region. NVDA, JAWS and VoiceOver read that region aloud automatically - without me having to move my focus.

What the plugin announces

At its core are two signals that make the difference for me:

Tool calls immediately. As soon as the agent invokes a tool, it is announced right away (“Tool: name and content”). The moment it starts matters, not when it finishes. On a search request or a file access, I hear what is happening instantly instead of waiting in the dark.

Finished answers. The last completed assistant answer is read out in full over the live region - but only once it is really done, not while it is still streaming. Detection runs on text stability: only when the text has stayed unchanged for 900 milliseconds is it treated as finished.

How it works

Technically it is a client plugin that watches the Harness chat container with a MutationObserver. New elements and text changes are captured. For the announcement there is a hidden but assistive-visible div with aria-live="polite" and role="status".

Two details kept me busy while building it:

What deliberately does not happen

The plugin does not move my focus. No element.focus(), which would disrupt use. And when you load an old session, nothing is replayed: only new events from now on are announced, not messages that are already present.

Deep-diving status

While the agent’s “Deep diving…” status is active (meaning the agent is working), that is repeated every five seconds for as long as the state lasts. Detection runs over a role="status" element whose text contains “Deep diving” - important, because the Harness may additionally render an empty role="status" element. That is why it matches on text content, not on the first role="status".

Context

The plugin is the runtime foundation of my work with coding agents. If tool calls and intermediate steps are not announced, being a blind user means relying on guesses or having to ask over and over. With dsh-a11y-focus I simply listen to what the agent is doing - like anyone else looking at the screen.

The source code is on GitHub: slohmaier/dsh-a11y-focus. The README there also covers how to install it into the Harness. If you want to get started with the unfamiliar terms dsh, cordis and the different bundle profiles, the concrete steps are in the README.


Edit this post on GitHub
Share this post on:

Previous Post
DeepSeek Harness: Jetzt sagt mir mein Plugin endlich an, was der Agent tut
Next Post
LangDetectSpeech: Automatischer Sprachwechsel fĂĽr NVDA