fix(KB): guardrail bypass during estimate load + Transition sibling (PR #901 review)

- Disable TierSelectionModal Submit while the embed-estimate query is in
flight, so a fast click can't slip past the guardrail with an undefined
estimate.
- Move KbGuardrailModal out of the outer <Transition> and render it as a
Fragment sibling — Headless UI's Transition expects Transition.Child
descendants, not raw conditional siblings.
This commit is contained in:
Jake Turner 2026-05-17 06:30:22 +00:00 committed by Jake Turner
parent 21d9929926
commit 47e6c134e8
1 changed files with 15 additions and 13 deletions

View File

@ -74,7 +74,7 @@ const TierSelectionModal: React.FC<TierSelectionModalProps> = ({
[selectedTierResources] [selectedTierResources]
) )
const { data: embedEstimate } = useQuery({ const { data: embedEstimate, isLoading: isEstimating } = useQuery({
queryKey: ['embedEstimateBatch', embedEstimateRequest], queryKey: ['embedEstimateBatch', embedEstimateRequest],
queryFn: () => api.estimateEmbeddingBatch(embedEstimateRequest), queryFn: () => api.estimateEmbeddingBatch(embedEstimateRequest),
enabled: embedEstimateRequest.length > 0, enabled: embedEstimateRequest.length > 0,
@ -158,6 +158,7 @@ const TierSelectionModal: React.FC<TierSelectionModalProps> = ({
} }
return ( return (
<>
<Transition appear show={isOpen} as={Fragment}> <Transition appear show={isOpen} as={Fragment}>
<Dialog as="div" className="relative z-50" onClose={onClose}> <Dialog as="div" className="relative z-50" onClose={onClose}>
<Transition.Child <Transition.Child
@ -345,7 +346,7 @@ const TierSelectionModal: React.FC<TierSelectionModalProps> = ({
variant='primary' variant='primary'
size='lg' size='lg'
onClick={handleSubmit} onClick={handleSubmit}
disabled={!localSelectedSlug} disabled={!localSelectedSlug || (embedEstimateRequest.length > 0 && isEstimating)}
> >
Submit Submit
</StyledButton> </StyledButton>
@ -355,18 +356,19 @@ const TierSelectionModal: React.FC<TierSelectionModalProps> = ({
</div> </div>
</div> </div>
</Dialog> </Dialog>
{guardrailVerdict && (
<KbGuardrailModal
isOpen={true}
verdict={guardrailVerdict}
onConfirm={() => {
setGuardrailVerdict(null)
finalizeSubmit()
}}
onCancel={() => setGuardrailVerdict(null)}
/>
)}
</Transition> </Transition>
{guardrailVerdict && (
<KbGuardrailModal
isOpen={true}
verdict={guardrailVerdict}
onConfirm={() => {
setGuardrailVerdict(null)
finalizeSubmit()
}}
onCancel={() => setGuardrailVerdict(null)}
/>
)}
</>
) )
} }