* fix(tui): restore classic CLI voice push-to-talk parity (cherry picked from commit 93b9ae301bb89f5b5e01b4b9f8ac91ffa74fbd9d) * 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)
|
|
})
|
|
})
|