Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- 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 Bitbucket Server (Data Center) OAuth 2.0 SSO identity provider support (`provider: "bitbucket-server"`). [#934](https://github.com/sourcebot-dev/sourcebot/pull/934)
- 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)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,38 @@
'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";

const REINDEX_INTERVAL_MS = 2000;

interface Props {
initialRepoInfo: RepoInfo;
isNewlyTriggered: boolean;
repoFullName: string;
children: React.ReactNode;
}

export function RepoIndexedGuard({ initialRepoInfo, children }: Props) {
export function RepoIndexedGuard({ initialRepoInfo, isNewlyTriggered, repoFullName, 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', {
repo: repoFullName,
repoId: initialRepoInfo.id,
});
}
}, [isNewlyTriggered, repoFullName, initialRepoInfo.id]);

const { data: repoInfo, isError } = useQuery({
queryKey: ['repo-status', initialRepoInfo.id],
Expand Down
8 changes: 4 additions & 4 deletions packages/web/src/app/[domain]/askgh/[owner]/[repo]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand All @@ -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
Expand All @@ -43,15 +43,15 @@ 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));
const languageModels = await unwrapServiceError(getConfiguredLanguageModelsInfo());
const providers = getIdentityProviderMetadata();

return (
<RepoIndexedGuard initialRepoInfo={repoInfo}>
<RepoIndexedGuard initialRepoInfo={repoInfo} isNewlyTriggered={isNewlyTriggered} repoFullName={`${owner}/${repo}`}>
<CustomSlateEditor>
<LandingPage
languageModels={languageModels}
Expand Down
4 changes: 4 additions & 0 deletions packages/web/src/lib/posthogEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,10 @@ export type PosthogEventMap = {
},
//////////////////////////////////////////////////////////////////
wa_askgh_login_wall_prompted: {},
wa_askgh_repo_index_triggered: {
repo: string,
repoId: number,
Copy link
Contributor

@brendan-kellam brendan-kellam Feb 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I would use repo name instead of the repo's id since it is opaque

},
//////////////////////////////////////////////////////////////////
wa_demo_docs_link_pressed: {},
wa_demo_search_example_card_pressed: {
Expand Down