diff --git a/packages/app/src/components/message-input.tsx b/packages/app/src/components/message-input.tsx index 8519126b8..f5b20feb8 100644 --- a/packages/app/src/components/message-input.tsx +++ b/packages/app/src/components/message-input.tsx @@ -318,6 +318,7 @@ export const MessageInput = forwardRef(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(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(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]); diff --git a/packages/app/src/hooks/use-dictation.ts b/packages/app/src/hooks/use-dictation.ts index eff44f045..0d4707f29 100644 --- a/packages/app/src/hooks/use-dictation.ts +++ b/packages/app/src/hooks/use-dictation.ts @@ -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;