Skip to content

Commit 104b2ef

Browse files
committed
Add some logging to help identify bug where sending input does nothing
1 parent 86f69cb commit 104b2ef

File tree

2 files changed

+80
-16
lines changed

2 files changed

+80
-16
lines changed

cli/src/hooks/use-message-queue.ts

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { useCallback, useEffect, useRef, useState } from 'react'
22

3+
import { logger } from '../utils/logger'
4+
35
import type { PendingImage } from '../state/chat-store'
46

57
export type StreamStatus = 'idle' | 'waiting' | 'streaming'
@@ -54,14 +56,52 @@ export const useMessageQueue = (
5456
}, [clearStreaming])
5557

5658
useEffect(() => {
57-
if (!canProcessQueue || queuePaused) return
58-
if (streamStatus !== 'idle') return
59-
if (streamMessageIdRef.current) return
60-
if (isChainInProgressRef.current) return
61-
if (activeAgentStreamsRef.current > 0) return
62-
6359
const queuedList = queuedMessagesRef.current
64-
if (queuedList.length === 0) return
60+
const queueLength = queuedList.length
61+
62+
if (queueLength === 0) return
63+
64+
// Log why queue is blocked (only when there are messages waiting)
65+
if (!canProcessQueue || queuePaused) {
66+
logger.debug(
67+
{ queueLength, canProcessQueue, queuePaused },
68+
'[message-queue] Queue blocked: canProcessQueue or paused',
69+
)
70+
return
71+
}
72+
if (streamStatus !== 'idle') {
73+
logger.debug(
74+
{ queueLength, streamStatus },
75+
'[message-queue] Queue blocked: stream not idle',
76+
)
77+
return
78+
}
79+
if (streamMessageIdRef.current) {
80+
logger.debug(
81+
{ queueLength, streamMessageId: streamMessageIdRef.current },
82+
'[message-queue] Queue blocked: streamMessageId set',
83+
)
84+
return
85+
}
86+
if (isChainInProgressRef.current) {
87+
logger.debug(
88+
{ queueLength, isChainInProgress: isChainInProgressRef.current },
89+
'[message-queue] Queue blocked: chain in progress',
90+
)
91+
return
92+
}
93+
if (activeAgentStreamsRef.current > 0) {
94+
logger.debug(
95+
{ queueLength, activeAgentStreams: activeAgentStreamsRef.current },
96+
'[message-queue] Queue blocked: active agent streams',
97+
)
98+
return
99+
}
100+
101+
logger.info(
102+
{ queueLength },
103+
'[message-queue] Processing next message from queue',
104+
)
65105

66106
const timeoutId = setTimeout(() => {
67107
const nextMessage = queuedList[0]
@@ -86,6 +126,10 @@ export const useMessageQueue = (
86126
const newQueue = [...queuedMessagesRef.current, queuedMessage]
87127
queuedMessagesRef.current = newQueue
88128
setQueuedMessages(newQueue)
129+
logger.info(
130+
{ newQueueLength: newQueue.length, messageLength: message.length },
131+
'[message-queue] Message added to queue',
132+
)
89133
}, [])
90134

91135
const pauseQueue = useCallback(() => {

cli/src/hooks/use-send-message.ts

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -237,19 +237,27 @@ export const useSendMessage = ({
237237
setIsRetrying(false)
238238

239239
// Prepare user message (bash context, images, mode divider)
240-
const { userMessageId, messageContent, bashContextForPrompt, finalContent } =
241-
await prepareUserMessage({
242-
content,
243-
agentMode,
244-
postUserMessage,
245-
attachedImages,
246-
})
240+
const {
241+
userMessageId,
242+
messageContent,
243+
bashContextForPrompt,
244+
finalContent,
245+
} = await prepareUserMessage({
246+
content,
247+
agentMode,
248+
postUserMessage,
249+
attachedImages,
250+
})
247251

248252
// Validate before sending (e.g., agent config checks)
249253
try {
250254
const validationResult = await onBeforeMessageSend()
251255

252256
if (!validationResult.success) {
257+
logger.warn(
258+
{ errors: validationResult.errors },
259+
'[send-message] Validation failed',
260+
)
253261
const errorsToAttach =
254262
validationResult.errors.length === 0
255263
? [
@@ -277,7 +285,7 @@ export const useSendMessage = ({
277285
} catch (error) {
278286
logger.error(
279287
{ error },
280-
'Validation before message send failed with exception',
288+
'[send-message] Validation before message send failed with exception',
281289
)
282290

283291
setMessages((prev) => [
@@ -303,7 +311,7 @@ export const useSendMessage = ({
303311
if (!client) {
304312
logger.error(
305313
{},
306-
'No Codebuff client available. Please ensure you are authenticated.',
314+
'[send-message] No Codebuff client available. Please ensure you are authenticated.',
307315
)
308316
return
309317
}
@@ -376,6 +384,7 @@ export const useSendMessage = ({
376384
signal: abortController.signal,
377385
})
378386

387+
logger.info({ runConfig }, '[send-message] Sending message with sdk run config')
379388
const runState = await client.run(runConfig)
380389

381390
// Finalize: persist state and mark complete
@@ -413,6 +422,17 @@ export const useSendMessage = ({
413422
updateChainInProgress,
414423
})
415424
} finally {
425+
// Defensive reset: ensure chain state is always cleared even if handlers throw.
426+
// This prevents the system from getting stuck in "chain in progress" state.
427+
if (isChainInProgressRef.current) {
428+
logger.warn(
429+
{},
430+
'[send-message] Chain still in progress after try/catch, forcing reset',
431+
)
432+
updateChainInProgress(false)
433+
setStreamStatus('idle')
434+
setCanProcessQueue(!isQueuePausedRef?.current)
435+
}
416436
// Ensure the batched updater's flush interval is always cleaned up,
417437
// even if handleRunCompletion or handleRunError throw unexpectedly.
418438
// dispose() is safe to call multiple times.

0 commit comments

Comments
 (0)