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:
@@ -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]);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user