From 1faf72bbda52fd2bd7e059a9edd7aa8aa17cdff1 Mon Sep 17 00:00:00 2001 From: Diego Rodrigues de Sa e Souza <8016841+diegosouzapw@users.noreply.github.com> Date: Thu, 18 Jun 2026 00:25:52 -0300 Subject: [PATCH] feat(traffic-inspector): live (in-flight) request filter (Gap 5) (#4130) Integrated into release/v3.8.29 --- .../TrafficInspectorPageClient.tsx | 14 ++- .../components/TopBarControls.tsx | 23 +++++ .../hooks/useTrafficFilters.ts | 7 ++ .../hooks/useTrafficStream.ts | 20 +---- src/i18n/messages/en.json | 1 + src/lib/inspector/matchesTrafficFilter.ts | 37 ++++++++ tests/unit/traffic-filter-live.test.ts | 89 +++++++++++++++++++ 7 files changed, 171 insertions(+), 20 deletions(-) create mode 100644 src/lib/inspector/matchesTrafficFilter.ts create mode 100644 tests/unit/traffic-filter-live.test.ts diff --git a/src/app/(dashboard)/dashboard/tools/traffic-inspector/TrafficInspectorPageClient.tsx b/src/app/(dashboard)/dashboard/tools/traffic-inspector/TrafficInspectorPageClient.tsx index 9e7bd8aa25..a1537f236d 100644 --- a/src/app/(dashboard)/dashboard/tools/traffic-inspector/TrafficInspectorPageClient.tsx +++ b/src/app/(dashboard)/dashboard/tools/traffic-inspector/TrafficInspectorPageClient.tsx @@ -19,8 +19,16 @@ export function TrafficInspectorPageClient() { const [containerHeight, setContainerHeight] = useState(600); const listContainerRef = useRef(null); const [selectedRequest, setSelectedRequest] = useState(null); - const { filters, setProfile, setHost, setAgent, setStatus, setSessionId, setSameContext } = - useTrafficFilters(); + const { + filters, + setProfile, + setHost, + setAgent, + setStatus, + setSessionId, + setSameContext, + toggleLive, + } = useTrafficFilters(); const [{ listWidth, collapsed }, { startDrag, toggleCollapse }] = useResizablePanels(); const [streamState, streamActions] = useTrafficStream(filters); const recorder = useSessionRecorder(); @@ -108,6 +116,8 @@ export function TrafficInspectorPageClient() { onHostChange={setHost} onAgentChange={setAgent} onStatusChange={setStatus} + liveOnly={filters.liveOnly ?? false} + onToggleLive={toggleLive} paused={streamState.paused} onPause={streamActions.pause} onResume={streamActions.resume} diff --git a/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/TopBarControls.tsx b/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/TopBarControls.tsx index 03ff373ee4..50ac648e58 100644 --- a/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/TopBarControls.tsx +++ b/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/TopBarControls.tsx @@ -19,6 +19,8 @@ interface TopBarControlsProps { onHostChange: (h: string | undefined) => void; onAgentChange: (a: AgentId | undefined) => void; onStatusChange: (s: ListFilters["status"]) => void; + liveOnly: boolean; + onToggleLive: () => void; paused: boolean; onPause: () => void; onResume: () => void; @@ -46,6 +48,8 @@ export function TopBarControls({ onHostChange, onAgentChange, onStatusChange, + liveOnly, + onToggleLive, paused, onPause, onResume, @@ -125,6 +129,25 @@ export function TopBarControls({ + {/* Live (in-flight) toggle — Gap 5 */} + + {/* Action buttons */}