diff --git a/apps/code/src/renderer/assets/images/graphs-hog.png b/apps/code/src/renderer/assets/images/graphs-hog.png new file mode 100644 index 000000000..fa0b1e9c7 Binary files /dev/null and b/apps/code/src/renderer/assets/images/graphs-hog.png differ diff --git a/apps/code/src/renderer/features/inbox/components/InboxSignalsTab.tsx b/apps/code/src/renderer/features/inbox/components/InboxSignalsTab.tsx index e759cef77..a3a5698a3 100644 --- a/apps/code/src/renderer/features/inbox/components/InboxSignalsTab.tsx +++ b/apps/code/src/renderer/features/inbox/components/InboxSignalsTab.tsx @@ -13,21 +13,21 @@ import { useInboxSignalsSidebarStore } from "@features/inbox/stores/inboxSignals import { buildSignalTaskPrompt } from "@features/inbox/utils/buildSignalTaskPrompt"; import { buildSignalReportListOrdering, + buildStatusFilterParam, filterReportsBySearch, } from "@features/inbox/utils/filterReports"; -import { - INBOX_PIPELINE_STATUS_FILTER, - INBOX_REFETCH_INTERVAL_MS, -} from "@features/inbox/utils/inboxConstants"; +import { INBOX_REFETCH_INTERVAL_MS } from "@features/inbox/utils/inboxConstants"; import { useDraftStore } from "@features/message-editor/stores/draftStore"; import { useSettingsDialogStore } from "@features/settings/stores/settingsDialogStore"; import { useCreateTask } from "@features/tasks/hooks/useTasks"; import { useFeatureFlag } from "@hooks/useFeatureFlag"; import { useRepositoryIntegration } from "@hooks/useIntegrations"; import { + ArrowDownIcon, ArrowSquareOutIcon, ClockIcon, Cloud as CloudIcon, + GithubLogoIcon, XIcon, } from "@phosphor-icons/react"; import { @@ -40,10 +40,13 @@ import { Select, Text, } from "@radix-ui/themes"; +import graphsHog from "@renderer/assets/images/graphs-hog.png"; import { getCloudUrlFromRegion } from "@shared/constants/oauth"; import type { + SignalReportArtefact, SignalReportArtefactsResponse, SignalReportsQueryParams, + SuggestedReviewersArtefact, } from "@shared/types"; import { useNavigationStore } from "@stores/navigationStore"; import { useRendererWindowFocusStore } from "@stores/rendererWindowFocusStore"; @@ -118,6 +121,7 @@ export function InboxSignalsTab() { const sortField = useInboxSignalsFilterStore((s) => s.sortField); const sortDirection = useInboxSignalsFilterStore((s) => s.sortDirection); const searchQuery = useInboxSignalsFilterStore((s) => s.searchQuery); + const statusFilter = useInboxSignalsFilterStore((s) => s.statusFilter); const { data: signalSourceConfigs } = useSignalSourceConfigs(); const hasSignalSources = signalSourceConfigs?.some((c) => c.enabled) ?? false; const openSettings = useSettingsDialogStore((s) => s.open); @@ -128,10 +132,10 @@ export function InboxSignalsTab() { const inboxQueryParams = useMemo( (): SignalReportsQueryParams => ({ - status: INBOX_PIPELINE_STATUS_FILTER, + status: buildStatusFilterParam(statusFilter), ordering: buildSignalReportListOrdering(sortField, sortDirection), }), - [sortField, sortDirection], + [statusFilter, sortField, sortDirection], ); const { @@ -201,7 +205,16 @@ export function InboxSignalsTab() { const artefactsQuery = useInboxReportArtefacts(selectedReport?.id ?? "", { enabled: !!selectedReport, }); - const visibleArtefacts = artefactsQuery.data?.results ?? []; + const allArtefacts = artefactsQuery.data?.results ?? []; + const visibleArtefacts = allArtefacts.filter( + (a): a is SignalReportArtefact => a.type !== "suggested_reviewers", + ); + const suggestedReviewers = useMemo(() => { + const reviewerArtefact = allArtefacts.find( + (a): a is SuggestedReviewersArtefact => a.type === "suggested_reviewers", + ); + return reviewerArtefact?.content ?? []; + }, [allArtefacts]); const artefactsUnavailableReason = artefactsQuery.data?.unavailableReason; const showArtefactsUnavailable = !artefactsQuery.isLoading && @@ -318,28 +331,70 @@ export function InboxSignalsTab() { direction="column" align="center" justify="center" - gap="5" height="100%" px="5" - style={{ maxWidth: 480, margin: "0 auto" }} + style={{ margin: "0 auto" }} > - + + + - Enable Inbox - - - Inbox automatically analyzes your product data and prioritizes - actionable tasks. Choose which sources to enable for this project. + Welcome to your Inbox + + + + + Background analysis of your data — while you sleep. + +
+ Session recordings watched automatically. Issues, tickets, and + evals analyzed around the clock. +
+ + + + + + Ready-to-run fixes for real user problems. + +
+ Each report includes evidence and impact numbers — just execute + the prompt in your agent. +
+
+ +
-
); } @@ -497,6 +552,46 @@ export function InboxSignalsTab() { + {suggestedReviewers.length > 0 && ( + + + Suggested reviewers + + + {suggestedReviewers.map((reviewer) => ( + + + + {reviewer.user?.first_name ?? + reviewer.github_name ?? + reviewer.github_login} + + + @{reviewer.github_login} + + + ))} + + + )} + {signals.length > 0 && (