diff --git a/src/client/app.tsx b/src/client/app.tsx index 8177f43..bd6ac7e 100644 --- a/src/client/app.tsx +++ b/src/client/app.tsx @@ -54,9 +54,13 @@ export function App() { return filters.filterMessages(currentSession.messages); }, [currentSession, filters.filterMessages]); + const progressEnabled = filters.enabledCategories.has("hook_progress"); + + // Count across all session messages (not just filtered) — recompute only on session change. + // This avoids re-running 37 regex patterns whenever filter toggles change. const sensitiveCount = useMemo( - () => countSensitiveMessages(filteredMessages), - [filteredMessages] + () => countSensitiveMessages(currentSession?.messages || []), + [currentSession?.messages] ); // Track which filtered-message indices match the search query @@ -224,7 +228,7 @@ export function App() { {/* Main */}
-
+
{/* Left spacer — mirrors right side width to keep search centered */}
@@ -239,7 +243,7 @@ export function App() { onPrev={goToPrevMatch} /> {filters.selectedForRedaction.size > 0 && ( -
+
{filters.selectedForRedaction.size} selected @@ -285,6 +289,8 @@ export function App() { onToggleRedactionSelection={filters.toggleRedactionSelection} autoRedactEnabled={filters.autoRedactEnabled} focusedIndex={activeFocusIndex} + toolProgress={currentSession?.toolProgress} + progressEnabled={progressEnabled} />
diff --git a/src/client/components/MessageBubble.tsx b/src/client/components/MessageBubble.tsx index d52c302..8566e53 100644 --- a/src/client/components/MessageBubble.tsx +++ b/src/client/components/MessageBubble.tsx @@ -5,6 +5,7 @@ import { CATEGORY_COLORS } from "../lib/constants"; import { renderMarkdown, highlightSearchText } from "../lib/markdown"; import { redactMessage } from "../../shared/sensitive-redactor"; import { escapeHtml } from "../../shared/escape-html"; +import { ProgressBadge } from "./ProgressBadge"; interface Props { message: ParsedMessage; @@ -13,6 +14,8 @@ interface Props { selectedForRedaction: boolean; onToggleRedactionSelection: () => void; autoRedactEnabled: boolean; + progressEvents?: ParsedMessage[]; + progressEnabled?: boolean; } /** @@ -29,6 +32,8 @@ export function MessageBubble({ selectedForRedaction, onToggleRedactionSelection, autoRedactEnabled, + progressEvents, + progressEnabled, }: Props) { const colors = CATEGORY_COLORS[message.category]; const label = CATEGORY_LABELS[message.category]; @@ -110,7 +115,7 @@ export function MessageBubble({
{/* Header bar */} -
+
{isCollapsible && (