From 075b0fc1d8e198240981433b56542990d3589bde Mon Sep 17 00:00:00 2001 From: Michael Chihlas Date: Thu, 23 Apr 2026 15:48:33 -0400 Subject: [PATCH] feat(pilot): EscalateInterceptDialog popover Anchored above the Escalate button, captures fix outcome before the engineer hands off the ticket. Defaults to 'didn't work' on Enter (the common case). Alternatives: 'worked, escalating for another reason' (preserves success) and 'never actually applied' (dismiss). Task 11 will wire this to AssistantChatPage's Escalate handler. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../pilot/EscalateInterceptDialog.tsx | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 frontend/src/components/pilot/EscalateInterceptDialog.tsx diff --git a/frontend/src/components/pilot/EscalateInterceptDialog.tsx b/frontend/src/components/pilot/EscalateInterceptDialog.tsx new file mode 100644 index 00000000..d97654e5 --- /dev/null +++ b/frontend/src/components/pilot/EscalateInterceptDialog.tsx @@ -0,0 +1,76 @@ +/** + * EscalateInterceptDialog — popover anchored above the Escalate button. + * + * Fires when the engineer clicks Escalate while a fix is in Verifying or + * Partial state. Captures the fix outcome before the escalation so the + * handoff narrative is honest for whoever picks up the ticket. + * + * Visual reference: docs/FlowAssist_Migration/mockups/07-verify-states.html + * (panel C). + */ +import { X, AlertCircle, Check } from 'lucide-react' +import type { FixOutcome } from '@/api/sessionSuggestedFixes' + +export type InterceptChoice = FixOutcome | 'never_applied' + +export interface EscalateInterceptDialogProps { + fixTitle: string + onChoose: (choice: InterceptChoice) => void + onClose: () => void +} + +export function EscalateInterceptDialog({ + fixTitle, + onChoose, + onClose, +}: EscalateInterceptDialogProps) { + return ( + <> +