Feature Request
Current
While the agent is speaking, the voice status pill shows a "Speaking…" label. It is purely informational — the pill is not interactive in that state (resolveVoiceStatus returns tap: false for the speak tone), so there's no quick way to stop playback except waiting it out or using another control.
Desired
Show a stop affordance on the Speaking pill — e.g. "Speaking · tap to stop" — and make the pill tappable in that state. Tapping it should immediately cancel the current TTS (and any queued speech), the same as voice.cancelSpeak().
- Current:
Speaking…
- Desired:
Speaking · tap to stop, and tapping calls the TTS stop/cancel immediately.
Likely files
packages/sdk/src/voice/convo.ts — resolveVoiceStatus() builds the pill ({ label, tone, tap, icon }); the speaking branch currently returns label: "Speaking…", tap: false.
store/console/src/pages/InstanceDetail.tsx — renders the status pill (onClick={s.tap ? voice.toggleTalk : undefined}).
agents/coder/web/src/CopilotView.tsx — renders the same status pill.
packages/sdk/src/voice/use-voice.ts — cancelSpeak() (the stop function), already exposed on the hook.
Notes
- The pill's tap currently routes to
toggleTalk; for the Speaking state it must route to cancelSpeak instead. Simplest: keep tap as "is the pill interactive" and pick the action by tone (speak → cancelSpeak, else toggleTalk).
- Applies to both the Assistant chat (InstanceDetail) and the Co-pilot (CopilotView).
Feature Request
Current
While the agent is speaking, the voice status pill shows a "Speaking…" label. It is purely informational — the pill is not interactive in that state (
resolveVoiceStatusreturnstap: falsefor the speak tone), so there's no quick way to stop playback except waiting it out or using another control.Desired
Show a stop affordance on the Speaking pill — e.g. "Speaking · tap to stop" — and make the pill tappable in that state. Tapping it should immediately cancel the current TTS (and any queued speech), the same as
voice.cancelSpeak().Speaking…Speaking · tap to stop, and tapping calls the TTS stop/cancel immediately.Likely files
packages/sdk/src/voice/convo.ts—resolveVoiceStatus()builds the pill ({ label, tone, tap, icon }); thespeakingbranch currently returnslabel: "Speaking…", tap: false.store/console/src/pages/InstanceDetail.tsx— renders the status pill (onClick={s.tap ? voice.toggleTalk : undefined}).agents/coder/web/src/CopilotView.tsx— renders the same status pill.packages/sdk/src/voice/use-voice.ts—cancelSpeak()(the stop function), already exposed on the hook.Notes
toggleTalk; for the Speaking state it must route tocancelSpeakinstead. Simplest: keeptapas "is the pill interactive" and pick the action by tone (speak → cancelSpeak, elsetoggleTalk).