From 70f88e4757c613443a926c25d089ec9f87af81a2 Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 24 Feb 2026 16:22:08 -0800 Subject: [PATCH 1/3] feat(web): add PostHog event for askgh repo index trigger Fires `wa_askgh_repo_index_triggered` with owner, repo, and repoId when a user triggers a new repository to be indexed in the Ask GitHub flow (i.e., when `addGithubRepo` is called for a repo that doesn't yet exist). Co-Authored-By: Claude Opus 4.6 --- .../[repo]/components/repoIndexedGuard.tsx | 21 +++++++++++++++++-- .../[domain]/askgh/[owner]/[repo]/page.tsx | 8 +++---- packages/web/src/lib/posthogEvents.ts | 5 +++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/packages/web/src/app/[domain]/askgh/[owner]/[repo]/components/repoIndexedGuard.tsx b/packages/web/src/app/[domain]/askgh/[owner]/[repo]/components/repoIndexedGuard.tsx index 863f9b284..83d4f0d43 100644 --- a/packages/web/src/app/[domain]/askgh/[owner]/[repo]/components/repoIndexedGuard.tsx +++ b/packages/web/src/app/[domain]/askgh/[owner]/[repo]/components/repoIndexedGuard.tsx @@ -1,11 +1,12 @@ 'use client'; +import { captureEvent } from "@/hooks/useCaptureEvent"; import { ServiceError } from "@/lib/serviceError"; import { unwrapServiceError } from "@/lib/utils"; import { useQuery } from "@tanstack/react-query"; import { Loader2 } from "lucide-react"; import { usePrevious } from "@uidotdev/usehooks"; -import { useEffect } from "react"; +import { useEffect, useRef } from "react"; import { useBrowserNotification } from "@/hooks/useBrowserNotification"; import { RepoInfo } from "../types"; @@ -13,11 +14,27 @@ const REINDEX_INTERVAL_MS = 2000; interface Props { initialRepoInfo: RepoInfo; + isNewlyTriggered: boolean; + owner: string; + repo: string; children: React.ReactNode; } -export function RepoIndexedGuard({ initialRepoInfo, children }: Props) { +export function RepoIndexedGuard({ initialRepoInfo, isNewlyTriggered, owner, repo, children }: Props) { const { requestPermission, showNotification } = useBrowserNotification(); + const hasFiredEvent = useRef(false); + + // Fire event when a new repo index is triggered + useEffect(() => { + if (isNewlyTriggered && !hasFiredEvent.current) { + hasFiredEvent.current = true; + captureEvent('wa_askgh_repo_index_triggered', { + owner, + repo, + repoId: initialRepoInfo.id, + }); + } + }, [isNewlyTriggered, owner, repo, initialRepoInfo.id]); const { data: repoInfo, isError } = useQuery({ queryKey: ['repo-status', initialRepoInfo.id], diff --git a/packages/web/src/app/[domain]/askgh/[owner]/[repo]/page.tsx b/packages/web/src/app/[domain]/askgh/[owner]/[repo]/page.tsx index ee1ad7d48..947c26413 100644 --- a/packages/web/src/app/[domain]/askgh/[owner]/[repo]/page.tsx +++ b/packages/web/src/app/[domain]/askgh/[owner]/[repo]/page.tsx @@ -20,7 +20,7 @@ export default async function GitHubRepoPage(props: PageProps) { const { owner, repo } = params; const session = await auth(); - const repoId = await (async () => { + const { repoId, isNewlyTriggered } = await (async () => { // 1. Look up repo by owner/repo const displayName = `${owner}/${repo}`; const existingRepo = await prisma.repo.findFirst({ @@ -33,7 +33,7 @@ export default async function GitHubRepoPage(props: PageProps) { }); if (existingRepo) { - return existingRepo.id; + return { repoId: existingRepo.id, isNewlyTriggered: false }; } // 2. If it doesn't exist, attempt to create it @@ -43,7 +43,7 @@ export default async function GitHubRepoPage(props: PageProps) { throw new ServiceErrorException(response); } - return response.repoId; + return { repoId: response.repoId, isNewlyTriggered: true }; })(); const repoInfo = await unwrapServiceError(getRepoInfo(repoId)); @@ -51,7 +51,7 @@ export default async function GitHubRepoPage(props: PageProps) { const providers = getIdentityProviderMetadata(); return ( - + Date: Tue, 24 Feb 2026 16:22:38 -0800 Subject: [PATCH 2/3] docs: add CHANGELOG entry for #936 Co-Authored-By: Claude Opus 4.6 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 584f6aa3b..822b55297 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added permission syncing support for Bitbucket Cloud. [#925](https://github.com/sourcebot-dev/sourcebot/pull/925) - Added `wa_user_created` PostHog event fired on successful user sign-up. [#933](https://github.com/sourcebot-dev/sourcebot/pull/933) - Added `wa_askgh_login_wall_prompted` PostHog event fired when an unauthenticated user attempts to ask a question on Ask GitHub. [#933](https://github.com/sourcebot-dev/sourcebot/pull/933) +- Added `wa_askgh_repo_index_triggered` PostHog event fired when a user triggers a new repo to be indexed in Ask GitHub. [#936](https://github.com/sourcebot-dev/sourcebot/pull/936) ### Changed - Hide version upgrade toast for askgithub deployment (`EXPERIMENT_ASK_GH_ENABLED`). [#931](https://github.com/sourcebot-dev/sourcebot/pull/931) From 29012371a67267ccb4f2f0f9789b72340f463a78 Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 24 Feb 2026 16:23:58 -0800 Subject: [PATCH 3/3] refactor: combine owner/repo into single repo property Co-Authored-By: Claude Opus 4.6 --- .../[owner]/[repo]/components/repoIndexedGuard.tsx | 10 ++++------ .../web/src/app/[domain]/askgh/[owner]/[repo]/page.tsx | 2 +- packages/web/src/lib/posthogEvents.ts | 1 - 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/web/src/app/[domain]/askgh/[owner]/[repo]/components/repoIndexedGuard.tsx b/packages/web/src/app/[domain]/askgh/[owner]/[repo]/components/repoIndexedGuard.tsx index 83d4f0d43..68c7b6b9b 100644 --- a/packages/web/src/app/[domain]/askgh/[owner]/[repo]/components/repoIndexedGuard.tsx +++ b/packages/web/src/app/[domain]/askgh/[owner]/[repo]/components/repoIndexedGuard.tsx @@ -15,12 +15,11 @@ const REINDEX_INTERVAL_MS = 2000; interface Props { initialRepoInfo: RepoInfo; isNewlyTriggered: boolean; - owner: string; - repo: string; + repoFullName: string; children: React.ReactNode; } -export function RepoIndexedGuard({ initialRepoInfo, isNewlyTriggered, owner, repo, children }: Props) { +export function RepoIndexedGuard({ initialRepoInfo, isNewlyTriggered, repoFullName, children }: Props) { const { requestPermission, showNotification } = useBrowserNotification(); const hasFiredEvent = useRef(false); @@ -29,12 +28,11 @@ export function RepoIndexedGuard({ initialRepoInfo, isNewlyTriggered, owner, rep if (isNewlyTriggered && !hasFiredEvent.current) { hasFiredEvent.current = true; captureEvent('wa_askgh_repo_index_triggered', { - owner, - repo, + repo: repoFullName, repoId: initialRepoInfo.id, }); } - }, [isNewlyTriggered, owner, repo, initialRepoInfo.id]); + }, [isNewlyTriggered, repoFullName, initialRepoInfo.id]); const { data: repoInfo, isError } = useQuery({ queryKey: ['repo-status', initialRepoInfo.id], diff --git a/packages/web/src/app/[domain]/askgh/[owner]/[repo]/page.tsx b/packages/web/src/app/[domain]/askgh/[owner]/[repo]/page.tsx index 947c26413..f44f689fe 100644 --- a/packages/web/src/app/[domain]/askgh/[owner]/[repo]/page.tsx +++ b/packages/web/src/app/[domain]/askgh/[owner]/[repo]/page.tsx @@ -51,7 +51,7 @@ export default async function GitHubRepoPage(props: PageProps) { const providers = getIdentityProviderMetadata(); return ( - +