Skip to content

Commit 12a13b6

Browse files
committed
cli: harden ask-user state and preserve pending images on followups
1 parent cdca138 commit 12a13b6

File tree

2 files changed

+52
-32
lines changed

2 files changed

+52
-32
lines changed

cli/src/chat.tsx

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -625,8 +625,9 @@ export const Chat = ({
625625
) => {
626626
ensureQueueActiveBeforeSubmit()
627627

628+
const preserveInput = options?.preserveInputValue === true
628629
const previousInputValue =
629-
options?.preserveInputValue === true
630+
preserveInput
630631
? (() => {
631632
const {
632633
inputValue: text,
@@ -636,39 +637,58 @@ export const Chat = ({
636637
return { text, cursorPosition, lastEditDueToNav }
637638
})()
638639
: null
640+
const preservedPendingImages =
641+
preserveInput && useChatStore.getState().pendingImages.length > 0
642+
? [...useChatStore.getState().pendingImages]
643+
: null
639644

640-
const result = await routeUserPrompt({
641-
abortControllerRef,
642-
agentMode: mode,
643-
inputRef,
644-
inputValue: content,
645-
isChainInProgressRef,
646-
isStreaming,
647-
logoutMutation,
648-
streamMessageIdRef,
649-
addToQueue,
650-
clearMessages,
651-
saveToHistory,
652-
scrollToLatest,
653-
sendMessage,
654-
setCanProcessQueue,
655-
setInputFocused,
656-
setInputValue,
657-
setIsAuthenticated,
658-
setMessages,
659-
setUser,
660-
stopStreaming,
661-
})
645+
if (preserveInput && preservedPendingImages) {
646+
useChatStore.getState().clearPendingImages()
647+
}
662648

663-
if (previousInputValue) {
664-
setInputValue({
665-
text: previousInputValue.text,
666-
cursorPosition: previousInputValue.cursorPosition,
667-
lastEditDueToNav: previousInputValue.lastEditDueToNav,
649+
try {
650+
const result = await routeUserPrompt({
651+
abortControllerRef,
652+
agentMode: mode,
653+
inputRef,
654+
inputValue: content,
655+
isChainInProgressRef,
656+
isStreaming,
657+
logoutMutation,
658+
streamMessageIdRef,
659+
addToQueue,
660+
clearMessages,
661+
saveToHistory,
662+
scrollToLatest,
663+
sendMessage,
664+
setCanProcessQueue,
665+
setInputFocused,
666+
setInputValue,
667+
setIsAuthenticated,
668+
setMessages,
669+
setUser,
670+
stopStreaming,
668671
})
669-
}
670672

671-
return result
673+
return result
674+
} finally {
675+
if (previousInputValue) {
676+
setInputValue({
677+
text: previousInputValue.text,
678+
cursorPosition: previousInputValue.cursorPosition,
679+
lastEditDueToNav: previousInputValue.lastEditDueToNav,
680+
})
681+
}
682+
683+
if (preserveInput && preservedPendingImages) {
684+
const currentPending = useChatStore.getState().pendingImages
685+
if (currentPending.length === 0) {
686+
useChatStore.setState((state) => {
687+
state.pendingImages = preservedPendingImages
688+
})
689+
}
690+
}
691+
}
672692
},
673693
)
674694

cli/src/components/ask-user/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ export const MultipleChoiceForm: React.FC<MultipleChoiceFormProps> = ({
124124
) => {
125125
setAnswers((prev) => {
126126
const nextAnswers = new Map(prev)
127-
const previousAnswer = prev.get(questionIndex)
127+
const previousAnswer = prev.get(questionIndex) ?? {}
128128
nextAnswers.set(questionIndex, updater(previousAnswer))
129129
return nextAnswers
130130
})
@@ -226,7 +226,7 @@ export const MultipleChoiceForm: React.FC<MultipleChoiceFormProps> = ({
226226

227227
setAnswers((prev) => {
228228
const newAnswers = new Map(prev)
229-
const currentAnswer = prev.get(questionIndex)
229+
const currentAnswer: AccordionAnswer = prev.get(questionIndex) ?? {}
230230

231231
if (optionIndex === OTHER_OPTION_INDEX) {
232232
toggledOtherOn = !(currentAnswer?.isOther ?? false)

0 commit comments

Comments
 (0)