diff --git a/apps/app/src/components/promptbox/PromptBoxInternal.tsx b/apps/app/src/components/promptbox/PromptBoxInternal.tsx
index 514924688..8f5dfb840 100644
--- a/apps/app/src/components/promptbox/PromptBoxInternal.tsx
+++ b/apps/app/src/components/promptbox/PromptBoxInternal.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
import { atom, useAtom } from "jotai";
import { RESET, atomWithStorage } from "jotai/utils";
import type {
@@ -1132,6 +1133,7 @@ export function PromptBoxInternal({
promptBoxRef,
focusEndKey,
}: PromptBoxInternalProps) {
+ renderProbe("PromptBoxInternal");
const focusComposerShortcut = useAppCommandShortcut("composer.focus");
const {
isSubmitting = false,
diff --git a/apps/app/src/components/thread/embedded-chat/EmbeddedThreadChat.tsx b/apps/app/src/components/thread/embedded-chat/EmbeddedThreadChat.tsx
index e1b991ad2..288019ca6 100644
--- a/apps/app/src/components/thread/embedded-chat/EmbeddedThreadChat.tsx
+++ b/apps/app/src/components/thread/embedded-chat/EmbeddedThreadChat.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
import {
useCallback,
useEffect,
@@ -270,6 +271,7 @@ function EmbeddedThreadChatHostedFooter({
scrollOverlay,
surface,
}: EmbeddedThreadChatHostedFooterProps) {
+ renderProbe("EmbeddedThreadChatHostedFooter");
return (
getViewRows(props.timelineRows),
diff --git a/apps/app/src/components/thread/timeline/ThreadTimelineSurface.tsx b/apps/app/src/components/thread/timeline/ThreadTimelineSurface.tsx
index 978011b31..6b41497a6 100644
--- a/apps/app/src/components/thread/timeline/ThreadTimelineSurface.tsx
+++ b/apps/app/src/components/thread/timeline/ThreadTimelineSurface.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
import { useEffect, useMemo, useState, type ReactNode } from "react";
import type {
ActiveThinking,
@@ -178,6 +179,7 @@ export function ThreadTimelineSurface({
unreadDividerPlacement,
workspaceRootPath,
}: ThreadTimelineSurfaceProps) {
+ renderProbe("ThreadTimelineSurface");
const preferredTheme = usePreferredTheme();
const showActiveThinking =
activeThinking !== null && ongoingIndicatorLabel === undefined;
diff --git a/apps/app/src/views/thread-detail/ThreadDetailPromptArea.tsx b/apps/app/src/views/thread-detail/ThreadDetailPromptArea.tsx
index bc2815413..0832ff124 100644
--- a/apps/app/src/views/thread-detail/ThreadDetailPromptArea.tsx
+++ b/apps/app/src/views/thread-detail/ThreadDetailPromptArea.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
import { useCallback, useMemo, useRef, useState } from "react";
import { createPortal } from "react-dom";
import { NavLink, useNavigate } from "react-router-dom";
@@ -346,6 +347,7 @@ export function ThreadDetailPromptArea({
composerFocusRequestNonce,
thread,
}: ThreadDetailPromptAreaProps) {
+ renderProbe("ThreadDetailPromptArea");
const navigate = useNavigate();
const defaultExecutionOptionsQuery = useThreadDefaultExecutionOptions(
thread.id,
diff --git a/apps/app/src/views/thread-detail/ThreadDetailSecondaryContent.tsx b/apps/app/src/views/thread-detail/ThreadDetailSecondaryContent.tsx
index fe23cf36a..6fa495375 100644
--- a/apps/app/src/views/thread-detail/ThreadDetailSecondaryContent.tsx
+++ b/apps/app/src/views/thread-detail/ThreadDetailSecondaryContent.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
import { useMemo, type ComponentProps, type ReactNode } from "react";
import { Skeleton } from "@bb/shared-ui/skeleton";
import { cn } from "@bb/shared-ui/lib/utils";
@@ -78,6 +79,7 @@ function ThreadDetailSecondaryContentBody({
secondaryPanel,
timeline,
}: ThreadDetailSecondaryContentProps) {
+ renderProbe("ThreadDetailSecondaryContentBody");
const composerHost = usePluginComposerHost();
const { renderBrowserDeck, ...threadSecondaryPanelProps } = secondaryPanel;
diff --git a/apps/app/src/views/thread-detail/ThreadDetailView.tsx b/apps/app/src/views/thread-detail/ThreadDetailView.tsx
index a2a4724bd..a8d1e5942 100644
--- a/apps/app/src/views/thread-detail/ThreadDetailView.tsx
+++ b/apps/app/src/views/thread-detail/ThreadDetailView.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
import {
useCallback,
useEffect,
@@ -503,6 +504,7 @@ export function ThreadDetailView(props: ThreadDetailViewProps) {
}
function ThreadDetailViewInternal(props: ThreadDetailViewInternalProps) {
+ renderProbe("ThreadDetailViewInternal");
const { projectId, threadId } = props;
const { isFocused, navigateInPane, onRequestClose, isBoundedPane } =
usePaneContext();
diff --git a/apps/app/src/views/thread-detail/ThreadTimelinePane.tsx b/apps/app/src/views/thread-detail/ThreadTimelinePane.tsx
index 7d323f95c..7c112546e 100644
--- a/apps/app/src/views/thread-detail/ThreadTimelinePane.tsx
+++ b/apps/app/src/views/thread-detail/ThreadTimelinePane.tsx
@@ -1,3 +1,4 @@
+import { renderProbe } from "@/lib/render-probe";
import type { ReactNode } from "react";
import type { ThreadTimelineUnreadDividerPlacement } from "@/components/thread/timeline";
import type { PromptMentionLinkResolver } from "@/components/promptbox/editor/prompt-mention-link";
@@ -27,6 +28,7 @@ export function ThreadTimelinePane({
footer,
...surface
}: ThreadTimelinePaneProps) {
+ renderProbe("ThreadTimelinePane");
return (