From 40c232ef8b6fdfc20ba85ae7c979787784495d3d Mon Sep 17 00:00:00 2001 From: weishu Date: Mon, 26 Jan 2026 14:08:35 +0800 Subject: [PATCH] fix: handle option highlighting in request_user_input component - Trim selected value to match option labels during comparison - Parse tool.result as JSON when loaded from history, as it's stored as string --- web/src/components/ToolCard/requestUserInput.ts | 3 ++- .../ToolCard/views/RequestUserInputView.tsx | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/web/src/components/ToolCard/requestUserInput.ts b/web/src/components/ToolCard/requestUserInput.ts index c31a49fb..19a7f87a 100644 --- a/web/src/components/ToolCard/requestUserInput.ts +++ b/web/src/components/ToolCard/requestUserInput.ts @@ -134,7 +134,8 @@ export function parseRequestUserInputAnswers( if (item.startsWith('user_note: ')) { userNote = item.slice('user_note: '.length).trim() } else if (!selected) { - selected = item + // Trim to match option labels which are also trimmed + selected = item.trim() } } diff --git a/web/src/components/ToolCard/views/RequestUserInputView.tsx b/web/src/components/ToolCard/views/RequestUserInputView.tsx index a0c7c230..5aafc689 100644 --- a/web/src/components/ToolCard/views/RequestUserInputView.tsx +++ b/web/src/components/ToolCard/views/RequestUserInputView.tsx @@ -9,10 +9,23 @@ function getSelectionMark(isSelected: boolean): string { return isSelected ? '●' : '○' } +function parseResultAsAnswers(result: unknown): unknown { + // tool.result from history may be a JSON string + if (typeof result === 'string') { + try { + return JSON.parse(result) + } catch { + return undefined + } + } + return result +} + export function RequestUserInputView(props: ToolViewProps) { const parsed = parseRequestUserInputInput(props.block.tool.input) const questions = parsed.questions - const rawAnswers = props.block.tool.permission?.answers ?? undefined + // Try permission.answers first (live), fall back to tool.result (history) + const rawAnswers = props.block.tool.permission?.answers ?? parseResultAsAnswers(props.block.tool.result) ?? undefined const parsedAnswers = rawAnswers ? parseRequestUserInputAnswers(rawAnswers) : null const hasAnswers = parsedAnswers && Object.keys(parsedAnswers).length > 0