Introduction

In dsh web, typing longer prompts often takes several minutes. The input box itself lacks a voice entry point; to dictate, one usually has to rely on system dictation and paste, or directly hack Harness’s DOM to inject controls into the page—the latter is likely to fail after a page upgrade.

The dsh-speech-input introduced below takes a different path: it adds a native microphone button to the right of the input box via the official slot. Clicking starts dictation, the recognition result is written to the current draft in real-time, and clicking again stops it and completes the sentence-ending punctuation, with no auto-send of messages throughout the process.

DSH’s philosophy is “Everything is a plugin,” and input enhancement is exactly within the scope of the plugin system.

What is it

dsh-speech-input is a DeepSeek Harness plugin maintained by liznee, currently version v0.2.3 (2026-08-29), under the MIT license. It is a pure browser plugin: it does not require extra API keys, a server, or model downloads.

It solves a specific problem: adding a native microphone button to the DeepSeek Harness Web input box. Click to start dictation, write recognition results to the current draft in real-time, click again to stop and complete the sentence-ending punctuation, and never auto-send messages.

Core Features

Integration: Official Slot and Public Interface

The plugin uses the official conversation.input.right slot to render the microphone button; it does not query or rewrite Harness’s DOM. The recognized text is only written to the regular draft via the Harness public inputActions.setDraft() method; the model cannot see the audio or recognition status.

Dictation Behavior

  • Supports Chrome/Edge Web Speech API, with Chinese and English following the browser language.
  • Intermediate recognition results are updated in place and will not repeatedly stack the same sentence.
  • Content added manually during dictation is preserved.
  • Automatically stops after 5 seconds of silence and retains the dictated text; the duration can be adjusted in DEFAULT_SILENCE_TIMEOUT_MS in src/client/index.js. Setting it to 0 disables auto-stop.
  • Pressing Enter during dictation stops immediately and retains the dictated text (with punctuation added).

Interface During Dictation

When dictating, the input box displays an oval capsule: the left circle is the cancel ×, the middle is the real-time volume bar, and the right side has five volume bars for the stop button.

The volume bar is not a fake loop animation: the plugin calculates the microphone RMS locally using the Web Audio API and displays the last 16 real volume samples.

During dictation, Harness’s send button and Enter-to-send are disabled via the official interface and restored after stopping or canceling. There is no risk of a message being sent mid-sentence.

Cancel and Resource Cleanup

  • Clicking cancel removes all text generated by this round of voice input and retains the draft before starting dictation.
  • Hard errors regarding permissions, microphone, or network provide clear prompts.
  • Recognition is aborted and the microphone is released when switching pages or uninstalling the plugin.
  • Supports keyboard focus, screen reader status announcements, and reduced motion preferences.

Installation and Enablement

Install to web profile from GitHub:

dsh plugin --profile web add github:liznee/dsh-speech-input

The plugin is published to npm and can be installed directly:

dsh plugin --profile web add dsh-speech-input

For local verification, you can pack a tarball first and then install:

npm ci
npm test
npm pack
dsh plugin --profile web add ./dsh-speech-input-0.2.1.tgz

Pre-built lib/ has been committed to the repository. Git install does not execute build scripts, and allowBuilds does not need to be authorized in pnpm-workspace.yaml. You need to restart dsh web after installation or upgrade.

For local development, you need Node.js 20 or higher. Common commands are:

npm ci
npm test
npm run test:coverage
npm run pack:check

The build artifacts are in Harness’s lazy-loaded CommonJS module-factory format.

Typical Usage

  1. Click the microphone button on the right side of the input box to start dictation; the recognition result is written to the current draft in real-time, with intermediate results updated in place.
  2. Click again to stop; the plugin will complete the sentence-ending punctuation.
  3. To end directly, press Enter: dictation stops immediately and retains the dictated text (with punctuation added), then pressing Enter again sends it.
  4. To discard the current round of content, click the cancel on the left side of the capsule; all text generated by this round of voice input is removed, and the draft is restored to the state before dictation started.

Privacy and Known Limitations

First, regarding the plugin’s own behavior: it does not save audio, write logs, or upload audio, nor will it send audio to Harness or DeepSeek. To display real volume, the plugin opens an extra local microphone stream that only connects to the Web Audio AnalyserNode to calculate RMS; it does not play, record, or upload. The audio track is closed immediately upon stopping or canceling.

Special attention needs to be paid to the recognition path: the processing by the Web Speech API is determined by the browser. Edge/Chrome usually delegates the recognition audio to the browser vendor’s online speech service; this is not offline recognition. If you cannot accept this data path, please do not authorize the microphone.

Known limitations:
- Firefox currently has no available Web Speech SpeechRecognition implementation; the button will be disabled.
- Browser language is the recognition language; the first version has no independent language settings.
- The plugin only writes to the draft and never auto-sends.

Applicable Scenarios and Notes

Suitable for two types of people:
- Users who frequently input long prompts in dsh web and want to reduce typing;
- Developers who want to reference the implementation of input enhancement plugins; its integration method (adding conversation.input.right slot + inputActions.setDraft()) itself serves as a reference implementation.

Pre-use notes:
- The plugin runs with the permissions of the current dsh process. It is recommended to check the source code and license before installing. The license is MIT; see LICENSE and NOTICE in the repository for details.
- Recognition for Chrome/Edge goes through the browser vendor’s online service. Before using in privacy-sensitive environments, confirm that you can accept this path.
- Firefox users currently cannot use it.

Conclusion

dsh-speech-input does a small thing: a microphone button, real-time dictation, and a path that only writes to drafts. However, the implementation is quite restrained—using the official slot for integration, writing to drafts via public interfaces, releasing the microphone on exit, and clearly writing out the privacy impact of the recognition path. If you frequently type long prompts in dsh web, or are looking for a reference implementation of input enhancement plugins, it is worth a try.

  • Community directory page: https://www.skillhub.cn/plugins/liznee/dsh-speech-input
  • Source code repository: https://github.com/liznee/dsh-speech-input

The directory is an independently maintained community site with no official affiliation with DeepSeek or Huanfang.