debug(app): add dictation pipeline logging

Trace the full dictation flow — confirm, transcript, and auto-send
paths — to diagnose transcription delivery issues.
This commit is contained in:
Mohamed Boudra
2026-03-23 22:04:24 +07:00
parent a237285808
commit e36784e510
2 changed files with 19 additions and 0 deletions
@@ -318,6 +318,7 @@ export const MessageInput = forwardRef<MessageInputRef, MessageInputProps>(funct
const handleDictationTranscript = useCallback(
(text: string, _meta: { requestId: string }) => {
console.log("[MessageInput] handleDictationTranscript: text=%s, sendAfterTranscript=%s", JSON.stringify(text), sendAfterTranscriptRef.current);
if (!text) return;
const current = valueRef.current;
const shouldPad = current.length > 0 && !/\s$/.test(current);
@@ -328,12 +329,14 @@ export const MessageInput = forwardRef<MessageInputRef, MessageInputProps>(funct
if (shouldAutoSend) {
const imageAttachments = images.length > 0 ? images : undefined;
console.log("[MessageInput] handleDictationTranscript: auto-sending, forceSend=%s", isAgentRunning);
onSubmit({
text: nextValue,
images: imageAttachments,
forceSend: isAgentRunning || undefined,
});
} else {
console.log("[MessageInput] handleDictationTranscript: inserting text into input");
onChangeText(nextValue);
}
@@ -464,11 +467,13 @@ export const MessageInput = forwardRef<MessageInputRef, MessageInputProps>(funct
}, [cancelDictation]);
const handleAcceptRecording = useCallback(async () => {
console.log("[MessageInput] handleAcceptRecording (insert only)");
sendAfterTranscriptRef.current = false;
await confirmDictation();
}, [confirmDictation]);
const handleAcceptAndSendRecording = useCallback(async () => {
console.log("[MessageInput] handleAcceptAndSendRecording (auto-send)");
sendAfterTranscriptRef.current = true;
await confirmDictation();
}, [confirmDictation]);
+14
View File
@@ -205,11 +205,14 @@ export function useDictation(options: UseDictationOptions): UseDictationResult {
const transcriptText =
text.trim().length > 0 ? text.trim() : latestPartialTranscriptRef.current.trim();
console.log("[useDictation] transcriptionSuccess: text=%s, partial=%s, final=%s", JSON.stringify(text), JSON.stringify(latestPartialTranscriptRef.current), JSON.stringify(transcriptText));
clearStreamingState();
if (!transcriptText) {
console.warn("[useDictation] transcriptionSuccess: empty transcript, skipping callback");
return;
}
console.log("[useDictation] transcriptionSuccess: calling onTranscript");
onTranscriptRef.current?.(transcriptText, { requestId });
},
[clearStreamingState],
@@ -328,13 +331,19 @@ export function useDictation(options: UseDictationOptions): UseDictationResult {
const confirmDictation = useCallback(async () => {
if (actionGateRef.current.confirming) {
console.warn("[useDictation] confirmDictation: already confirming, skipping");
return;
}
if (!isRecordingRef.current || isProcessingRef.current) {
console.warn("[useDictation] confirmDictation: guard failed", {
isRecording: isRecordingRef.current,
isProcessing: isProcessingRef.current,
});
return;
}
const confirmAllowed = canConfirm ? canConfirm() : true;
if (!confirmAllowed) {
console.warn("[useDictation] confirmDictation: canConfirm returned false");
return;
}
@@ -355,18 +364,23 @@ export function useDictation(options: UseDictationOptions): UseDictationResult {
setIsRecording(false);
const finalSeq = senderRef.current?.getFinalSeq() ?? -1;
console.log("[useDictation] confirmDictation: finalSeq=%d, segments=%d", finalSeq, senderRef.current?.getSegmentCount() ?? 0);
if (finalSeq < 0) {
console.warn("[useDictation] confirmDictation: no segments, returning empty");
handleStreamingTranscriptionSuccess("", generateMessageId());
return;
}
const transcriptText = await ensureFinalTranscript(finalSeq);
attemptGuardRef.current.assertCurrent(attemptId);
console.log("[useDictation] confirmDictation: got transcript, length=%d", transcriptText.length);
handleStreamingTranscriptionSuccess(transcriptText, generateMessageId());
} catch (err) {
if (err instanceof Error && err.name === "AttemptCancelledError") {
console.warn("[useDictation] confirmDictation: attempt cancelled");
return;
}
console.error("[useDictation] confirmDictation: failure", err);
handleDictationFailure(err);
} finally {
actionGateRef.current.confirming = false;