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
This commit is contained in:
weishu
2026-01-26 14:08:35 +08:00
parent ae9650ca7c
commit 40c232ef8b
2 changed files with 16 additions and 2 deletions
@@ -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()
}
}
@@ -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