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(
|
const handleDictationTranscript = useCallback(
|
||||||
(text: string, _meta: { requestId: string }) => {
|
(text: string, _meta: { requestId: string }) => {
|
||||||
|
console.log("[MessageInput] handleDictationTranscript: text=%s, sendAfterTranscript=%s", JSON.stringify(text), sendAfterTranscriptRef.current);
|
||||||
if (!text) return;
|
if (!text) return;
|
||||||
const current = valueRef.current;
|
const current = valueRef.current;
|
||||||
const shouldPad = current.length > 0 && !/\s$/.test(current);
|
const shouldPad = current.length > 0 && !/\s$/.test(current);
|
||||||
@@ -328,12 +329,14 @@ export const MessageInput = forwardRef<MessageInputRef, MessageInputProps>(funct
|
|||||||
|
|
||||||
if (shouldAutoSend) {
|
if (shouldAutoSend) {
|
||||||
const imageAttachments = images.length > 0 ? images : undefined;
|
const imageAttachments = images.length > 0 ? images : undefined;
|
||||||
|
console.log("[MessageInput] handleDictationTranscript: auto-sending, forceSend=%s", isAgentRunning);
|
||||||
onSubmit({
|
onSubmit({
|
||||||
text: nextValue,
|
text: nextValue,
|
||||||
images: imageAttachments,
|
images: imageAttachments,
|
||||||
forceSend: isAgentRunning || undefined,
|
forceSend: isAgentRunning || undefined,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
console.log("[MessageInput] handleDictationTranscript: inserting text into input");
|
||||||
onChangeText(nextValue);
|
onChangeText(nextValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,11 +467,13 @@ export const MessageInput = forwardRef<MessageInputRef, MessageInputProps>(funct
|
|||||||
}, [cancelDictation]);
|
}, [cancelDictation]);
|
||||||
|
|
||||||
const handleAcceptRecording = useCallback(async () => {
|
const handleAcceptRecording = useCallback(async () => {
|
||||||
|
console.log("[MessageInput] handleAcceptRecording (insert only)");
|
||||||
sendAfterTranscriptRef.current = false;
|
sendAfterTranscriptRef.current = false;
|
||||||
await confirmDictation();
|
await confirmDictation();
|
||||||
}, [confirmDictation]);
|
}, [confirmDictation]);
|
||||||
|
|
||||||
const handleAcceptAndSendRecording = useCallback(async () => {
|
const handleAcceptAndSendRecording = useCallback(async () => {
|
||||||
|
console.log("[MessageInput] handleAcceptAndSendRecording (auto-send)");
|
||||||
sendAfterTranscriptRef.current = true;
|
sendAfterTranscriptRef.current = true;
|
||||||
await confirmDictation();
|
await confirmDictation();
|
||||||
}, [confirmDictation]);
|
}, [confirmDictation]);
|
||||||
|
|||||||
@@ -205,11 +205,14 @@ export function useDictation(options: UseDictationOptions): UseDictationResult {
|
|||||||
|
|
||||||
const transcriptText =
|
const transcriptText =
|
||||||
text.trim().length > 0 ? text.trim() : latestPartialTranscriptRef.current.trim();
|
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();
|
clearStreamingState();
|
||||||
|
|
||||||
if (!transcriptText) {
|
if (!transcriptText) {
|
||||||
|
console.warn("[useDictation] transcriptionSuccess: empty transcript, skipping callback");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
console.log("[useDictation] transcriptionSuccess: calling onTranscript");
|
||||||
onTranscriptRef.current?.(transcriptText, { requestId });
|
onTranscriptRef.current?.(transcriptText, { requestId });
|
||||||
},
|
},
|
||||||
[clearStreamingState],
|
[clearStreamingState],
|
||||||
@@ -328,13 +331,19 @@ export function useDictation(options: UseDictationOptions): UseDictationResult {
|
|||||||
|
|
||||||
const confirmDictation = useCallback(async () => {
|
const confirmDictation = useCallback(async () => {
|
||||||
if (actionGateRef.current.confirming) {
|
if (actionGateRef.current.confirming) {
|
||||||
|
console.warn("[useDictation] confirmDictation: already confirming, skipping");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!isRecordingRef.current || isProcessingRef.current) {
|
if (!isRecordingRef.current || isProcessingRef.current) {
|
||||||
|
console.warn("[useDictation] confirmDictation: guard failed", {
|
||||||
|
isRecording: isRecordingRef.current,
|
||||||
|
isProcessing: isProcessingRef.current,
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const confirmAllowed = canConfirm ? canConfirm() : true;
|
const confirmAllowed = canConfirm ? canConfirm() : true;
|
||||||
if (!confirmAllowed) {
|
if (!confirmAllowed) {
|
||||||
|
console.warn("[useDictation] confirmDictation: canConfirm returned false");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -355,18 +364,23 @@ export function useDictation(options: UseDictationOptions): UseDictationResult {
|
|||||||
setIsRecording(false);
|
setIsRecording(false);
|
||||||
|
|
||||||
const finalSeq = senderRef.current?.getFinalSeq() ?? -1;
|
const finalSeq = senderRef.current?.getFinalSeq() ?? -1;
|
||||||
|
console.log("[useDictation] confirmDictation: finalSeq=%d, segments=%d", finalSeq, senderRef.current?.getSegmentCount() ?? 0);
|
||||||
if (finalSeq < 0) {
|
if (finalSeq < 0) {
|
||||||
|
console.warn("[useDictation] confirmDictation: no segments, returning empty");
|
||||||
handleStreamingTranscriptionSuccess("", generateMessageId());
|
handleStreamingTranscriptionSuccess("", generateMessageId());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const transcriptText = await ensureFinalTranscript(finalSeq);
|
const transcriptText = await ensureFinalTranscript(finalSeq);
|
||||||
attemptGuardRef.current.assertCurrent(attemptId);
|
attemptGuardRef.current.assertCurrent(attemptId);
|
||||||
|
console.log("[useDictation] confirmDictation: got transcript, length=%d", transcriptText.length);
|
||||||
handleStreamingTranscriptionSuccess(transcriptText, generateMessageId());
|
handleStreamingTranscriptionSuccess(transcriptText, generateMessageId());
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err instanceof Error && err.name === "AttemptCancelledError") {
|
if (err instanceof Error && err.name === "AttemptCancelledError") {
|
||||||
|
console.warn("[useDictation] confirmDictation: attempt cancelled");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
console.error("[useDictation] confirmDictation: failure", err);
|
||||||
handleDictationFailure(err);
|
handleDictationFailure(err);
|
||||||
} finally {
|
} finally {
|
||||||
actionGateRef.current.confirming = false;
|
actionGateRef.current.confirming = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user