mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-08 03:01:47 +00:00
* fix(tui): restore classic CLI voice push-to-talk parity
(cherry picked from commit 93b9ae301b)
* fix(tui): harden voice push-to-talk stop flow
Address review feedback from PR #16189 by stopping the active recorder before background transcription, documenting single-shot voice capture, and covering the TUI gateway flags with regression tests.
* fix(tui): preserve silent voice strike tracking
Keep single-shot voice recording's no-speech counter alive across starts so the TUI can still emit the three-strikes auto-disable event, and bind the auto-restart state at module scope for type checking.
* fix(tui): clean up voice stop failure path
Address follow-up review by naming the TUI flow as single-shot push-to-talk and cancelling the recorder when forced stop cannot produce a WAV.
* fix(tui): report busy voice capture starts
Return explicit start state from the voice wrapper so the TUI gateway does not report recording while forced-stop transcription is still cleaning up.
* fix(tui): handle busy voice record responses
Apply the gateway busy status immediately in the TUI and route forced-stop voice events to the session that sent the stop request.
* fix(tui): clear voice recording on null response
Treat a null voice.record RPC result as a failed optimistic start so the REC badge cannot stick after gateway-side errors.
* fix(tui): count silent manual voice stops
Preserve single-shot voice no-speech strikes through forced stop transcription so empty push-to-talk captures still trigger the three-strikes guard.
---------
Co-authored-by: Montbra <montbra@gmail.com>
37 lines
1.3 KiB
TypeScript
37 lines
1.3 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest'
|
|
|
|
import { applyVoiceRecordResponse } from '../app/useInputHandlers.js'
|
|
|
|
describe('applyVoiceRecordResponse', () => {
|
|
it('reverts optimistic REC state when the gateway reports voice busy', () => {
|
|
const setProcessing = vi.fn()
|
|
const setRecording = vi.fn()
|
|
const sys = vi.fn()
|
|
|
|
applyVoiceRecordResponse({ status: 'busy' }, true, { setProcessing, setRecording }, sys)
|
|
|
|
expect(setRecording).toHaveBeenCalledWith(false)
|
|
expect(setProcessing).toHaveBeenCalledWith(true)
|
|
expect(sys).toHaveBeenCalledWith('voice: still transcribing; try again shortly')
|
|
})
|
|
|
|
it('keeps optimistic REC state for successful recording starts', () => {
|
|
const setProcessing = vi.fn()
|
|
const setRecording = vi.fn()
|
|
|
|
applyVoiceRecordResponse({ status: 'recording' }, true, { setProcessing, setRecording }, vi.fn())
|
|
|
|
expect(setRecording).not.toHaveBeenCalled()
|
|
expect(setProcessing).not.toHaveBeenCalled()
|
|
})
|
|
|
|
it('reverts optimistic REC state when the gateway returns null', () => {
|
|
const setProcessing = vi.fn()
|
|
const setRecording = vi.fn()
|
|
|
|
applyVoiceRecordResponse(null, true, { setProcessing, setRecording }, vi.fn())
|
|
|
|
expect(setRecording).toHaveBeenCalledWith(false)
|
|
expect(setProcessing).toHaveBeenCalledWith(false)
|
|
})
|
|
})
|