From e9182bae1dd6f05e5ce1176173aac0f4b186417b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 22 Sep 2026 01:48:11 +0000 Subject: [PATCH 01/15] fix(web): default home to Ask when experiment is enabled Co-authored-by: Michael Sukkarieh --- .../components/defaultSidebar/index.tsx | 8 ++++++-- packages/web/src/app/(app)/page.tsx | 8 +++++++- .../(app)/settings/general/generalPage.tsx | 10 ++++++++-- .../src/app/(app)/settings/general/page.tsx | 3 +++ packages/web/src/hooks/useHomeView.ts | 18 ++++++++--------- packages/web/src/lib/homeView.test.ts | 20 +++++++++++++++++++ packages/web/src/lib/homeView.ts | 16 +++++++++++++++ 7 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 packages/web/src/lib/homeView.test.ts create mode 100644 packages/web/src/lib/homeView.ts diff --git a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx index 85880f908..aa6793b25 100644 --- a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx +++ b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx @@ -1,7 +1,7 @@ import { cookies } from "next/headers"; import { auth } from "@/auth"; import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; -import { HomeView } from "@/hooks/useHomeView"; +import { getDefaultHomeView, resolveHomeView } from "@/lib/homeView"; import { getOrgAccountRequests } from "@/features/membership/actions"; import { isServiceError } from "@/lib/utils"; import { ServiceErrorException } from "@/lib/serviceError"; @@ -21,7 +21,11 @@ export const SIDEBAR_REPO_VISITS_LIMIT = 10; export async function DefaultSidebar() { const session = await auth(); const cookieStore = await cookies(); - const homeView = (cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value ?? "search") as HomeView; + const defaultHomeView = getDefaultHomeView(env.EXPERIMENT_ASK_GH_ENABLED === "true"); + const homeView = resolveHomeView( + cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value, + defaultHomeView, + ); // Chat history is part of the Ask experience; hide it when the deployment // is not on a plan that includes Ask. diff --git a/packages/web/src/app/(app)/page.tsx b/packages/web/src/app/(app)/page.tsx index 998aef646..f1660cbca 100644 --- a/packages/web/src/app/(app)/page.tsx +++ b/packages/web/src/app/(app)/page.tsx @@ -1,7 +1,9 @@ import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; +import { getDefaultHomeView, resolveHomeView } from "@/lib/homeView"; import { cookies } from "next/headers"; import { ChatLandingPage } from "./chat/chatLandingPage"; import SearchPage from "./search/page"; +import { env } from "@sourcebot/shared"; interface Props { searchParams: Promise<{ query?: string }>; @@ -9,7 +11,11 @@ interface Props { export default async function Home(props: Props) { const cookieStore = await cookies(); - const homeView = cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value; + const defaultHomeView = getDefaultHomeView(env.EXPERIMENT_ASK_GH_ENABLED === "true"); + const homeView = resolveHomeView( + cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value, + defaultHomeView, + ); if (homeView === "ask") { return ; } diff --git a/packages/web/src/app/(app)/settings/general/generalPage.tsx b/packages/web/src/app/(app)/settings/general/generalPage.tsx index 5e3d9655a..a7d714043 100644 --- a/packages/web/src/app/(app)/settings/general/generalPage.tsx +++ b/packages/web/src/app/(app)/settings/general/generalPage.tsx @@ -29,11 +29,17 @@ interface GeneralPageProps { userName?: string; userEmail?: string; userImage?: string; + defaultHomeView: HomeView; } -export function GeneralPage({ userName, userEmail, userImage }: GeneralPageProps) { +export function GeneralPage({ + userName, + userEmail, + userImage, + defaultHomeView, +}: GeneralPageProps) { const { theme: _theme, setTheme } = useTheme(); - const [homeView, setHomeView] = useHomeView(); + const [homeView, setHomeView] = useHomeView(defaultHomeView); const [keymapType, setKeymapType] = useKeymapType(); const theme = useMemo(() => { diff --git a/packages/web/src/app/(app)/settings/general/page.tsx b/packages/web/src/app/(app)/settings/general/page.tsx index ffeaed5dc..f8acaeb2c 100644 --- a/packages/web/src/app/(app)/settings/general/page.tsx +++ b/packages/web/src/app/(app)/settings/general/page.tsx @@ -1,4 +1,6 @@ import { authenticatedPage } from "@/middleware/authenticatedPage"; +import { getDefaultHomeView } from "@/lib/homeView"; +import { env } from "@sourcebot/shared"; import { GeneralPage } from "./generalPage"; export default authenticatedPage(async ({ user }) => { @@ -7,6 +9,7 @@ export default authenticatedPage(async ({ user }) => { userName={user.name ?? undefined} userEmail={user.email ?? undefined} userImage={user.image ?? undefined} + defaultHomeView={getDefaultHomeView(env.EXPERIMENT_ASK_GH_ENABLED === "true")} /> ); }); diff --git a/packages/web/src/hooks/useHomeView.ts b/packages/web/src/hooks/useHomeView.ts index 4c0c64de6..d11a928e3 100644 --- a/packages/web/src/hooks/useHomeView.ts +++ b/packages/web/src/hooks/useHomeView.ts @@ -2,22 +2,20 @@ import { useCallback, useState } from "react"; import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; +import { resolveHomeView, type HomeView } from "@/lib/homeView"; -export type HomeView = "search" | "ask"; +export type { HomeView } from "@/lib/homeView"; const COOKIE_NAME = HOME_VIEW_COOKIE_NAME; -function getHomeViewFromCookie(): HomeView { +function getHomeViewFromCookie(defaultHomeView: HomeView): HomeView { if (typeof document === "undefined") { - return "search"; + return defaultHomeView; } const cookies = document.cookie.split(';').map(c => c.trim()); const cookie = cookies.find(c => c.startsWith(`${COOKIE_NAME}=`)); - if (!cookie) { - return "search"; - } - const value = cookie.substring(`${COOKIE_NAME}=`.length); - return value === "ask" ? "ask" : "search"; + const value = cookie?.substring(`${COOKIE_NAME}=`.length); + return resolveHomeView(value, defaultHomeView); } function setHomeViewCookie(value: HomeView) { @@ -29,8 +27,8 @@ function setHomeViewCookie(value: HomeView) { document.cookie = `${COOKIE_NAME}=${value}; expires=${expires.toUTCString()}; path=/; SameSite=Lax`; } -export const useHomeView = (): [HomeView, (value: HomeView) => void] => { - const [homeView, setHomeViewState] = useState(getHomeViewFromCookie); +export const useHomeView = (defaultHomeView: HomeView = "search"): [HomeView, (value: HomeView) => void] => { + const [homeView, setHomeViewState] = useState(() => getHomeViewFromCookie(defaultHomeView)); const setHomeView = useCallback((value: HomeView) => { setHomeViewState(value); diff --git a/packages/web/src/lib/homeView.test.ts b/packages/web/src/lib/homeView.test.ts new file mode 100644 index 000000000..93c51dfaf --- /dev/null +++ b/packages/web/src/lib/homeView.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, test } from "vitest"; +import { getDefaultHomeView, resolveHomeView } from "./homeView"; + +describe("home view selection", () => { + test("defaults to Ask when the experiment is enabled and no cookie is set", () => { + expect(resolveHomeView(undefined, getDefaultHomeView(true))).toBe("ask"); + }); + + test("defaults to Code Search when the experiment is disabled and no cookie is set", () => { + expect(resolveHomeView(undefined, getDefaultHomeView(false))).toBe("search"); + }); + + test("respects an explicit Code Search cookie when the experiment is enabled", () => { + expect(resolveHomeView("search", getDefaultHomeView(true))).toBe("search"); + }); + + test("respects an explicit Ask cookie when the experiment is disabled", () => { + expect(resolveHomeView("ask", getDefaultHomeView(false))).toBe("ask"); + }); +}); diff --git a/packages/web/src/lib/homeView.ts b/packages/web/src/lib/homeView.ts new file mode 100644 index 000000000..0bd11e64c --- /dev/null +++ b/packages/web/src/lib/homeView.ts @@ -0,0 +1,16 @@ +export type HomeView = "search" | "ask"; + +export function getDefaultHomeView(isAskGhEnabled: boolean): HomeView { + return isAskGhEnabled ? "ask" : "search"; +} + +export function resolveHomeView( + cookieValue: string | undefined, + defaultHomeView: HomeView, +): HomeView { + if (cookieValue === "ask" || cookieValue === "search") { + return cookieValue; + } + + return defaultHomeView; +} From 28d2975e4d0885b6ce871d9a94c6692123fbac66 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 22 Sep 2026 01:48:39 +0000 Subject: [PATCH 02/15] docs: add SOU-2303 changelog entry Co-authored-by: Michael Sukkarieh --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d67263859..0d04f9075 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [EE] Fixed missing account-linking prompts during OAuth authorization and restored prompts when new optional providers are configured. [#1663](https://github.com/sourcebot-dev/sourcebot/pull/1663) - Prevented browser performance instrumentation from breaking code views when `performance.measure()` returns no value. [#1665](https://github.com/sourcebot-dev/sourcebot/pull/1665) - Added specific authentication error messages and recovery guidance shared by the login form and error page. [#1669](https://github.com/sourcebot-dev/sourcebot/pull/1669) +- Defaulted the home page to Ask when `EXPERIMENT_ASK_GH_ENABLED` is enabled and no preference is set. [#1672](https://github.com/sourcebot-dev/sourcebot/pull/1672) ## [5.1.13] - 2026-09-12 From 00abdd9e41a68c303deac40b9978eede058e1128 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 22 Sep 2026 17:55:49 +0000 Subject: [PATCH 03/15] refactor(web): resolve Ask GH default in server module Co-authored-by: Michael Sukkarieh --- .../(app)/@sidebar/components/defaultSidebar/index.tsx | 6 +++--- packages/web/src/app/(app)/page.tsx | 6 +++--- packages/web/src/app/(app)/settings/general/page.tsx | 5 ++--- packages/web/src/lib/homeView.server.ts | 6 ++++++ packages/web/src/lib/homeView.test.ts | 10 +++++----- packages/web/src/lib/homeView.ts | 4 ---- 6 files changed, 19 insertions(+), 18 deletions(-) create mode 100644 packages/web/src/lib/homeView.server.ts diff --git a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx index aa6793b25..89908e250 100644 --- a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx +++ b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx @@ -1,7 +1,8 @@ import { cookies } from "next/headers"; import { auth } from "@/auth"; import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; -import { getDefaultHomeView, resolveHomeView } from "@/lib/homeView"; +import { resolveHomeView } from "@/lib/homeView"; +import { getDefaultHomeView } from "@/lib/homeView.server"; import { getOrgAccountRequests } from "@/features/membership/actions"; import { isServiceError } from "@/lib/utils"; import { ServiceErrorException } from "@/lib/serviceError"; @@ -13,7 +14,6 @@ import { RepoVisitHistory } from "./repoVisitHistory"; import { getAuthContext, withAuth } from "@/middleware/withAuth"; import { sew } from "@/middleware/sew"; import { hasEntitlement, isValidLicenseActive } from "@/lib/entitlements"; -import { env } from "@sourcebot/shared"; const SIDEBAR_CHAT_LIMIT = 30; export const SIDEBAR_REPO_VISITS_LIMIT = 10; @@ -21,7 +21,7 @@ export const SIDEBAR_REPO_VISITS_LIMIT = 10; export async function DefaultSidebar() { const session = await auth(); const cookieStore = await cookies(); - const defaultHomeView = getDefaultHomeView(env.EXPERIMENT_ASK_GH_ENABLED === "true"); + const defaultHomeView = getDefaultHomeView(); const homeView = resolveHomeView( cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value, defaultHomeView, diff --git a/packages/web/src/app/(app)/page.tsx b/packages/web/src/app/(app)/page.tsx index f1660cbca..e06d746c1 100644 --- a/packages/web/src/app/(app)/page.tsx +++ b/packages/web/src/app/(app)/page.tsx @@ -1,9 +1,9 @@ import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; -import { getDefaultHomeView, resolveHomeView } from "@/lib/homeView"; +import { resolveHomeView } from "@/lib/homeView"; +import { getDefaultHomeView } from "@/lib/homeView.server"; import { cookies } from "next/headers"; import { ChatLandingPage } from "./chat/chatLandingPage"; import SearchPage from "./search/page"; -import { env } from "@sourcebot/shared"; interface Props { searchParams: Promise<{ query?: string }>; @@ -11,7 +11,7 @@ interface Props { export default async function Home(props: Props) { const cookieStore = await cookies(); - const defaultHomeView = getDefaultHomeView(env.EXPERIMENT_ASK_GH_ENABLED === "true"); + const defaultHomeView = getDefaultHomeView(); const homeView = resolveHomeView( cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value, defaultHomeView, diff --git a/packages/web/src/app/(app)/settings/general/page.tsx b/packages/web/src/app/(app)/settings/general/page.tsx index f8acaeb2c..d9f6a57b1 100644 --- a/packages/web/src/app/(app)/settings/general/page.tsx +++ b/packages/web/src/app/(app)/settings/general/page.tsx @@ -1,6 +1,5 @@ import { authenticatedPage } from "@/middleware/authenticatedPage"; -import { getDefaultHomeView } from "@/lib/homeView"; -import { env } from "@sourcebot/shared"; +import { getDefaultHomeView } from "@/lib/homeView.server"; import { GeneralPage } from "./generalPage"; export default authenticatedPage(async ({ user }) => { @@ -9,7 +8,7 @@ export default authenticatedPage(async ({ user }) => { userName={user.name ?? undefined} userEmail={user.email ?? undefined} userImage={user.image ?? undefined} - defaultHomeView={getDefaultHomeView(env.EXPERIMENT_ASK_GH_ENABLED === "true")} + defaultHomeView={getDefaultHomeView()} /> ); }); diff --git a/packages/web/src/lib/homeView.server.ts b/packages/web/src/lib/homeView.server.ts new file mode 100644 index 000000000..f20c3168a --- /dev/null +++ b/packages/web/src/lib/homeView.server.ts @@ -0,0 +1,6 @@ +import { env } from "@sourcebot/shared"; +import type { HomeView } from "./homeView"; + +export function getDefaultHomeView(): HomeView { + return env.EXPERIMENT_ASK_GH_ENABLED === "true" ? "ask" : "search"; +} diff --git a/packages/web/src/lib/homeView.test.ts b/packages/web/src/lib/homeView.test.ts index 93c51dfaf..26ce0dc8a 100644 --- a/packages/web/src/lib/homeView.test.ts +++ b/packages/web/src/lib/homeView.test.ts @@ -1,20 +1,20 @@ import { describe, expect, test } from "vitest"; -import { getDefaultHomeView, resolveHomeView } from "./homeView"; +import { resolveHomeView } from "./homeView"; describe("home view selection", () => { test("defaults to Ask when the experiment is enabled and no cookie is set", () => { - expect(resolveHomeView(undefined, getDefaultHomeView(true))).toBe("ask"); + expect(resolveHomeView(undefined, "ask")).toBe("ask"); }); test("defaults to Code Search when the experiment is disabled and no cookie is set", () => { - expect(resolveHomeView(undefined, getDefaultHomeView(false))).toBe("search"); + expect(resolveHomeView(undefined, "search")).toBe("search"); }); test("respects an explicit Code Search cookie when the experiment is enabled", () => { - expect(resolveHomeView("search", getDefaultHomeView(true))).toBe("search"); + expect(resolveHomeView("search", "ask")).toBe("search"); }); test("respects an explicit Ask cookie when the experiment is disabled", () => { - expect(resolveHomeView("ask", getDefaultHomeView(false))).toBe("ask"); + expect(resolveHomeView("ask", "search")).toBe("ask"); }); }); diff --git a/packages/web/src/lib/homeView.ts b/packages/web/src/lib/homeView.ts index 0bd11e64c..3b0dbf216 100644 --- a/packages/web/src/lib/homeView.ts +++ b/packages/web/src/lib/homeView.ts @@ -1,9 +1,5 @@ export type HomeView = "search" | "ask"; -export function getDefaultHomeView(isAskGhEnabled: boolean): HomeView { - return isAskGhEnabled ? "ask" : "search"; -} - export function resolveHomeView( cookieValue: string | undefined, defaultHomeView: HomeView, From b6e5f07b753dc4241307b9daa10e2d26c9fc5581 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 22 Sep 2026 17:57:04 +0000 Subject: [PATCH 04/15] fix(web): retain sidebar environment access Co-authored-by: Michael Sukkarieh --- .../src/app/(app)/@sidebar/components/defaultSidebar/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx index 89908e250..3a673e2d0 100644 --- a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx +++ b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx @@ -14,6 +14,7 @@ import { RepoVisitHistory } from "./repoVisitHistory"; import { getAuthContext, withAuth } from "@/middleware/withAuth"; import { sew } from "@/middleware/sew"; import { hasEntitlement, isValidLicenseActive } from "@/lib/entitlements"; +import { env } from "@sourcebot/shared"; const SIDEBAR_CHAT_LIMIT = 30; export const SIDEBAR_REPO_VISITS_LIMIT = 10; From b4d8fa4fefd212b759f1e553161a9ff5493db202 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 02:54:09 +0000 Subject: [PATCH 05/15] docs: move home default entry to unreleased Co-authored-by: Michael Sukkarieh --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d04f9075..e8cd3d4c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- Defaulted the home page to Ask when `EXPERIMENT_ASK_GH_ENABLED` is enabled and no preference is set. [#1677](https://github.com/sourcebot-dev/sourcebot/pull/1677) + ## [5.1.14] - 2026-09-17 ### Added @@ -17,7 +20,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [EE] Fixed missing account-linking prompts during OAuth authorization and restored prompts when new optional providers are configured. [#1663](https://github.com/sourcebot-dev/sourcebot/pull/1663) - Prevented browser performance instrumentation from breaking code views when `performance.measure()` returns no value. [#1665](https://github.com/sourcebot-dev/sourcebot/pull/1665) - Added specific authentication error messages and recovery guidance shared by the login form and error page. [#1669](https://github.com/sourcebot-dev/sourcebot/pull/1669) -- Defaulted the home page to Ask when `EXPERIMENT_ASK_GH_ENABLED` is enabled and no preference is set. [#1672](https://github.com/sourcebot-dev/sourcebot/pull/1672) ## [5.1.13] - 2026-09-12 From 6b857e84d4f7f02efa32c6c414cea297e68c9a61 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 03:48:10 +0000 Subject: [PATCH 06/15] feat(web): configure the default home view Co-authored-by: Michael Sukkarieh --- packages/shared/src/env.server.ts | 1 + packages/web/src/lib/homeView.server.test.ts | 35 ++++++++++++++++++++ packages/web/src/lib/homeView.server.ts | 2 +- packages/web/src/lib/homeView.test.ts | 8 ++--- 4 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 packages/web/src/lib/homeView.server.test.ts diff --git a/packages/shared/src/env.server.ts b/packages/shared/src/env.server.ts index 618e1a857..733442726 100644 --- a/packages/shared/src/env.server.ts +++ b/packages/shared/src/env.server.ts @@ -362,6 +362,7 @@ const options = { // @NOTE: Take care to update actions.ts when changing the name of this. EXPERIMENT_SELF_SERVE_REPO_INDEXING_GITHUB_TOKEN: z.string().optional(), PERMISSION_SYNC_REPO_DRIVEN_ENABLED: booleanSchema.default('true'), + DEFAULT_HOME_VIEW_PAGE: z.enum(["search", "ask"]).default("search"), EXPERIMENT_ASK_GH_ENABLED: booleanSchema.default('false'), EXPERIMENT_ASK_GH_GITHUB_TOKEN: z.string().optional(), diff --git a/packages/web/src/lib/homeView.server.test.ts b/packages/web/src/lib/homeView.server.test.ts new file mode 100644 index 000000000..323fefed4 --- /dev/null +++ b/packages/web/src/lib/homeView.server.test.ts @@ -0,0 +1,35 @@ +import { beforeEach, describe, expect, test, vi } from "vitest"; + +const mocks = vi.hoisted(() => ({ + env: { + DEFAULT_HOME_VIEW_PAGE: undefined as string | undefined, + }, +})); + +vi.mock("@sourcebot/shared", () => ({ + env: mocks.env, +})); + +import { getDefaultHomeView } from "./homeView.server"; + +describe("getDefaultHomeView", () => { + beforeEach(() => { + mocks.env.DEFAULT_HOME_VIEW_PAGE = undefined; + }); + + test("defaults to Search when DEFAULT_HOME_VIEW_PAGE is unset", () => { + expect(getDefaultHomeView()).toBe("search"); + }); + + test("returns Ask when DEFAULT_HOME_VIEW_PAGE is ask", () => { + mocks.env.DEFAULT_HOME_VIEW_PAGE = "ask"; + + expect(getDefaultHomeView()).toBe("ask"); + }); + + test("falls back to Search for an unsupported value", () => { + mocks.env.DEFAULT_HOME_VIEW_PAGE = "unsupported"; + + expect(getDefaultHomeView()).toBe("search"); + }); +}); diff --git a/packages/web/src/lib/homeView.server.ts b/packages/web/src/lib/homeView.server.ts index f20c3168a..4c70f12e2 100644 --- a/packages/web/src/lib/homeView.server.ts +++ b/packages/web/src/lib/homeView.server.ts @@ -2,5 +2,5 @@ import { env } from "@sourcebot/shared"; import type { HomeView } from "./homeView"; export function getDefaultHomeView(): HomeView { - return env.EXPERIMENT_ASK_GH_ENABLED === "true" ? "ask" : "search"; + return env.DEFAULT_HOME_VIEW_PAGE === "ask" ? "ask" : "search"; } diff --git a/packages/web/src/lib/homeView.test.ts b/packages/web/src/lib/homeView.test.ts index 26ce0dc8a..c96d8d9e5 100644 --- a/packages/web/src/lib/homeView.test.ts +++ b/packages/web/src/lib/homeView.test.ts @@ -2,19 +2,19 @@ import { describe, expect, test } from "vitest"; import { resolveHomeView } from "./homeView"; describe("home view selection", () => { - test("defaults to Ask when the experiment is enabled and no cookie is set", () => { + test("uses Ask when the configured default is Ask and no cookie is set", () => { expect(resolveHomeView(undefined, "ask")).toBe("ask"); }); - test("defaults to Code Search when the experiment is disabled and no cookie is set", () => { + test("uses Code Search when the configured default is Search and no cookie is set", () => { expect(resolveHomeView(undefined, "search")).toBe("search"); }); - test("respects an explicit Code Search cookie when the experiment is enabled", () => { + test("respects an explicit Code Search cookie when Ask is the configured default", () => { expect(resolveHomeView("search", "ask")).toBe("search"); }); - test("respects an explicit Ask cookie when the experiment is disabled", () => { + test("respects an explicit Ask cookie when Search is the configured default", () => { expect(resolveHomeView("ask", "search")).toBe("ask"); }); }); From dc9c9fed494e14789bbe4ba70e3db803ed2763a3 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 04:06:03 +0000 Subject: [PATCH 07/15] fix(web): require the configured home view default Co-authored-by: Michael Sukkarieh --- CHANGELOG.md | 2 +- packages/web/src/hooks/useHomeView.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b9075e74..83060a329 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removed the Ask Sourcebot first-visit tutorial banner. [#1675](https://github.com/sourcebot-dev/sourcebot/pull/1675) ### Fixed -- Defaulted the home page to Ask when `EXPERIMENT_ASK_GH_ENABLED` is enabled and no preference is set. [#1677](https://github.com/sourcebot-dev/sourcebot/pull/1677) +- Made the default home page configurable with `DEFAULT_HOME_VIEW_PAGE`, defaulting to Code Search and supporting Ask. [#1677](https://github.com/sourcebot-dev/sourcebot/pull/1677) - Removed suggested example queries from the Ask landing page. [#1674](https://github.com/sourcebot-dev/sourcebot/pull/1674) - Require authentication for the streaming and blocking Ask APIs in Public SaaS deployments. [#1679](https://github.com/sourcebot-dev/sourcebot/pull/1679) diff --git a/packages/web/src/hooks/useHomeView.ts b/packages/web/src/hooks/useHomeView.ts index d11a928e3..9e5eddda3 100644 --- a/packages/web/src/hooks/useHomeView.ts +++ b/packages/web/src/hooks/useHomeView.ts @@ -27,7 +27,7 @@ function setHomeViewCookie(value: HomeView) { document.cookie = `${COOKIE_NAME}=${value}; expires=${expires.toUTCString()}; path=/; SameSite=Lax`; } -export const useHomeView = (defaultHomeView: HomeView = "search"): [HomeView, (value: HomeView) => void] => { +export const useHomeView = (defaultHomeView: HomeView): [HomeView, (value: HomeView) => void] => { const [homeView, setHomeViewState] = useState(() => getHomeViewFromCookie(defaultHomeView)); const setHomeView = useCallback((value: HomeView) => { From 3106226fed6dfc5ed6d3123444b637ec4fa5d56d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 04:07:52 +0000 Subject: [PATCH 08/15] fix(web): preserve search fallback for missing home env Co-authored-by: Michael Sukkarieh --- packages/shared/src/env.server.ts | 2 +- packages/web/src/lib/homeView.server.test.ts | 6 ------ packages/web/src/lib/homeView.server.ts | 3 ++- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/shared/src/env.server.ts b/packages/shared/src/env.server.ts index 733442726..850bd72f4 100644 --- a/packages/shared/src/env.server.ts +++ b/packages/shared/src/env.server.ts @@ -362,7 +362,7 @@ const options = { // @NOTE: Take care to update actions.ts when changing the name of this. EXPERIMENT_SELF_SERVE_REPO_INDEXING_GITHUB_TOKEN: z.string().optional(), PERMISSION_SYNC_REPO_DRIVEN_ENABLED: booleanSchema.default('true'), - DEFAULT_HOME_VIEW_PAGE: z.enum(["search", "ask"]).default("search"), + DEFAULT_HOME_VIEW_PAGE: z.enum(["search", "ask"]).optional(), EXPERIMENT_ASK_GH_ENABLED: booleanSchema.default('false'), EXPERIMENT_ASK_GH_GITHUB_TOKEN: z.string().optional(), diff --git a/packages/web/src/lib/homeView.server.test.ts b/packages/web/src/lib/homeView.server.test.ts index 323fefed4..e287a35dc 100644 --- a/packages/web/src/lib/homeView.server.test.ts +++ b/packages/web/src/lib/homeView.server.test.ts @@ -26,10 +26,4 @@ describe("getDefaultHomeView", () => { expect(getDefaultHomeView()).toBe("ask"); }); - - test("falls back to Search for an unsupported value", () => { - mocks.env.DEFAULT_HOME_VIEW_PAGE = "unsupported"; - - expect(getDefaultHomeView()).toBe("search"); - }); }); diff --git a/packages/web/src/lib/homeView.server.ts b/packages/web/src/lib/homeView.server.ts index 4c70f12e2..4d26b56cc 100644 --- a/packages/web/src/lib/homeView.server.ts +++ b/packages/web/src/lib/homeView.server.ts @@ -2,5 +2,6 @@ import { env } from "@sourcebot/shared"; import type { HomeView } from "./homeView"; export function getDefaultHomeView(): HomeView { - return env.DEFAULT_HOME_VIEW_PAGE === "ask" ? "ask" : "search"; + // Preserve the Code Search default for versions before DEFAULT_HOME_VIEW_PAGE existed. + return env.DEFAULT_HOME_VIEW_PAGE ?? "search"; } From cd61fe8e5d26bec2c8fed1f219d1f40bcd497112 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 04:12:33 +0000 Subject: [PATCH 09/15] refactor(web): simplify home view resolution Co-authored-by: Michael Sukkarieh --- .../(app)/@sidebar/components/defaultSidebar/index.tsx | 4 ++-- packages/web/src/app/(app)/page.tsx | 4 ++-- packages/web/src/hooks/useHomeView.ts | 2 +- packages/web/src/lib/homeView.ts | 8 ++------ 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx index 3a673e2d0..af5868820 100644 --- a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx +++ b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx @@ -1,7 +1,7 @@ import { cookies } from "next/headers"; import { auth } from "@/auth"; import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; -import { resolveHomeView } from "@/lib/homeView"; +import { resolveHomeView, type HomeView } from "@/lib/homeView"; import { getDefaultHomeView } from "@/lib/homeView.server"; import { getOrgAccountRequests } from "@/features/membership/actions"; import { isServiceError } from "@/lib/utils"; @@ -24,7 +24,7 @@ export async function DefaultSidebar() { const cookieStore = await cookies(); const defaultHomeView = getDefaultHomeView(); const homeView = resolveHomeView( - cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value, + cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value as HomeView | undefined, defaultHomeView, ); diff --git a/packages/web/src/app/(app)/page.tsx b/packages/web/src/app/(app)/page.tsx index e06d746c1..e727da979 100644 --- a/packages/web/src/app/(app)/page.tsx +++ b/packages/web/src/app/(app)/page.tsx @@ -1,5 +1,5 @@ import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; -import { resolveHomeView } from "@/lib/homeView"; +import { resolveHomeView, type HomeView } from "@/lib/homeView"; import { getDefaultHomeView } from "@/lib/homeView.server"; import { cookies } from "next/headers"; import { ChatLandingPage } from "./chat/chatLandingPage"; @@ -13,7 +13,7 @@ export default async function Home(props: Props) { const cookieStore = await cookies(); const defaultHomeView = getDefaultHomeView(); const homeView = resolveHomeView( - cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value, + cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value as HomeView | undefined, defaultHomeView, ); if (homeView === "ask") { diff --git a/packages/web/src/hooks/useHomeView.ts b/packages/web/src/hooks/useHomeView.ts index 9e5eddda3..f43b89250 100644 --- a/packages/web/src/hooks/useHomeView.ts +++ b/packages/web/src/hooks/useHomeView.ts @@ -14,7 +14,7 @@ function getHomeViewFromCookie(defaultHomeView: HomeView): HomeView { } const cookies = document.cookie.split(';').map(c => c.trim()); const cookie = cookies.find(c => c.startsWith(`${COOKIE_NAME}=`)); - const value = cookie?.substring(`${COOKIE_NAME}=`.length); + const value = cookie?.substring(`${COOKIE_NAME}=`.length) as HomeView | undefined; return resolveHomeView(value, defaultHomeView); } diff --git a/packages/web/src/lib/homeView.ts b/packages/web/src/lib/homeView.ts index 3b0dbf216..12f06e938 100644 --- a/packages/web/src/lib/homeView.ts +++ b/packages/web/src/lib/homeView.ts @@ -1,12 +1,8 @@ export type HomeView = "search" | "ask"; export function resolveHomeView( - cookieValue: string | undefined, + cookieValue: HomeView | undefined, defaultHomeView: HomeView, ): HomeView { - if (cookieValue === "ask" || cookieValue === "search") { - return cookieValue; - } - - return defaultHomeView; + return cookieValue ?? defaultHomeView; } From 32d276a0dbe5e89ccfc4b5fd3c791add44d35c41 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 04:20:32 +0000 Subject: [PATCH 10/15] fix(shared): default home page env to search Co-authored-by: Michael Sukkarieh --- packages/shared/src/env.server.test.ts | 22 ++++++++++++++++++++++ packages/shared/src/env.server.ts | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/shared/src/env.server.test.ts b/packages/shared/src/env.server.test.ts index 7f9bf0bca..967e9bbdb 100644 --- a/packages/shared/src/env.server.test.ts +++ b/packages/shared/src/env.server.test.ts @@ -82,3 +82,25 @@ describe('SOURCEBOT_MCP_TOOL_CALL_TIMEOUT_MS', () => { await expect(import('./env.server.js')).rejects.toThrow(); }); }); + +describe('DEFAULT_HOME_VIEW_PAGE', () => { + beforeEach(() => { + vi.resetModules(); + delete process.env.DEFAULT_HOME_VIEW_PAGE; + }); + + afterEach(() => { + delete process.env.DEFAULT_HOME_VIEW_PAGE; + }); + + test('defaults to search when not set', async () => { + const { env } = await import('./env.server.js'); + expect(env.DEFAULT_HOME_VIEW_PAGE).toBe('search'); + }); + + test('accepts ask', async () => { + process.env.DEFAULT_HOME_VIEW_PAGE = 'ask'; + const { env } = await import('./env.server.js'); + expect(env.DEFAULT_HOME_VIEW_PAGE).toBe('ask'); + }); +}); diff --git a/packages/shared/src/env.server.ts b/packages/shared/src/env.server.ts index 850bd72f4..733442726 100644 --- a/packages/shared/src/env.server.ts +++ b/packages/shared/src/env.server.ts @@ -362,7 +362,7 @@ const options = { // @NOTE: Take care to update actions.ts when changing the name of this. EXPERIMENT_SELF_SERVE_REPO_INDEXING_GITHUB_TOKEN: z.string().optional(), PERMISSION_SYNC_REPO_DRIVEN_ENABLED: booleanSchema.default('true'), - DEFAULT_HOME_VIEW_PAGE: z.enum(["search", "ask"]).optional(), + DEFAULT_HOME_VIEW_PAGE: z.enum(["search", "ask"]).default("search"), EXPERIMENT_ASK_GH_ENABLED: booleanSchema.default('false'), EXPERIMENT_ASK_GH_GITHUB_TOKEN: z.string().optional(), From 40247f4b4c3dbf0ec4d3414dc090db3e9a5ea3f2 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 04:25:33 +0000 Subject: [PATCH 11/15] refactor(web): inline home view cookie fallback Co-authored-by: Michael Sukkarieh --- .../components/defaultSidebar/index.tsx | 11 +++---- packages/web/src/app/(app)/page.tsx | 12 ++++---- .../src/app/(app)/settings/general/page.tsx | 4 +-- packages/web/src/hooks/useHomeView.ts | 4 +-- packages/web/src/lib/homeView.server.test.ts | 29 ------------------- packages/web/src/lib/homeView.server.ts | 7 ----- packages/web/src/lib/homeView.test.ts | 20 ------------- packages/web/src/lib/homeView.ts | 7 ----- 8 files changed, 13 insertions(+), 81 deletions(-) delete mode 100644 packages/web/src/lib/homeView.server.test.ts delete mode 100644 packages/web/src/lib/homeView.server.ts delete mode 100644 packages/web/src/lib/homeView.test.ts diff --git a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx index af5868820..b26067378 100644 --- a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx +++ b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx @@ -1,8 +1,7 @@ import { cookies } from "next/headers"; import { auth } from "@/auth"; import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; -import { resolveHomeView, type HomeView } from "@/lib/homeView"; -import { getDefaultHomeView } from "@/lib/homeView.server"; +import type { HomeView } from "@/lib/homeView"; import { getOrgAccountRequests } from "@/features/membership/actions"; import { isServiceError } from "@/lib/utils"; import { ServiceErrorException } from "@/lib/serviceError"; @@ -22,11 +21,9 @@ export const SIDEBAR_REPO_VISITS_LIMIT = 10; export async function DefaultSidebar() { const session = await auth(); const cookieStore = await cookies(); - const defaultHomeView = getDefaultHomeView(); - const homeView = resolveHomeView( - cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value as HomeView | undefined, - defaultHomeView, - ); + const defaultHomeView = env.DEFAULT_HOME_VIEW_PAGE; + const cookieValue = cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value as HomeView | undefined; + const homeView = cookieValue ?? defaultHomeView; // Chat history is part of the Ask experience; hide it when the deployment // is not on a plan that includes Ask. diff --git a/packages/web/src/app/(app)/page.tsx b/packages/web/src/app/(app)/page.tsx index e727da979..d9cfe9350 100644 --- a/packages/web/src/app/(app)/page.tsx +++ b/packages/web/src/app/(app)/page.tsx @@ -1,9 +1,9 @@ import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; -import { resolveHomeView, type HomeView } from "@/lib/homeView"; -import { getDefaultHomeView } from "@/lib/homeView.server"; +import type { HomeView } from "@/lib/homeView"; import { cookies } from "next/headers"; import { ChatLandingPage } from "./chat/chatLandingPage"; import SearchPage from "./search/page"; +import { env } from "@sourcebot/shared"; interface Props { searchParams: Promise<{ query?: string }>; @@ -11,11 +11,9 @@ interface Props { export default async function Home(props: Props) { const cookieStore = await cookies(); - const defaultHomeView = getDefaultHomeView(); - const homeView = resolveHomeView( - cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value as HomeView | undefined, - defaultHomeView, - ); + const defaultHomeView = env.DEFAULT_HOME_VIEW_PAGE; + const cookieValue = cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value as HomeView | undefined; + const homeView = cookieValue ?? defaultHomeView; if (homeView === "ask") { return ; } diff --git a/packages/web/src/app/(app)/settings/general/page.tsx b/packages/web/src/app/(app)/settings/general/page.tsx index d9f6a57b1..7b469f9bc 100644 --- a/packages/web/src/app/(app)/settings/general/page.tsx +++ b/packages/web/src/app/(app)/settings/general/page.tsx @@ -1,5 +1,5 @@ import { authenticatedPage } from "@/middleware/authenticatedPage"; -import { getDefaultHomeView } from "@/lib/homeView.server"; +import { env } from "@sourcebot/shared"; import { GeneralPage } from "./generalPage"; export default authenticatedPage(async ({ user }) => { @@ -8,7 +8,7 @@ export default authenticatedPage(async ({ user }) => { userName={user.name ?? undefined} userEmail={user.email ?? undefined} userImage={user.image ?? undefined} - defaultHomeView={getDefaultHomeView()} + defaultHomeView={env.DEFAULT_HOME_VIEW_PAGE} /> ); }); diff --git a/packages/web/src/hooks/useHomeView.ts b/packages/web/src/hooks/useHomeView.ts index f43b89250..b6da964d9 100644 --- a/packages/web/src/hooks/useHomeView.ts +++ b/packages/web/src/hooks/useHomeView.ts @@ -2,7 +2,7 @@ import { useCallback, useState } from "react"; import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; -import { resolveHomeView, type HomeView } from "@/lib/homeView"; +import type { HomeView } from "@/lib/homeView"; export type { HomeView } from "@/lib/homeView"; @@ -15,7 +15,7 @@ function getHomeViewFromCookie(defaultHomeView: HomeView): HomeView { const cookies = document.cookie.split(';').map(c => c.trim()); const cookie = cookies.find(c => c.startsWith(`${COOKIE_NAME}=`)); const value = cookie?.substring(`${COOKIE_NAME}=`.length) as HomeView | undefined; - return resolveHomeView(value, defaultHomeView); + return value ?? defaultHomeView; } function setHomeViewCookie(value: HomeView) { diff --git a/packages/web/src/lib/homeView.server.test.ts b/packages/web/src/lib/homeView.server.test.ts deleted file mode 100644 index e287a35dc..000000000 --- a/packages/web/src/lib/homeView.server.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from "vitest"; - -const mocks = vi.hoisted(() => ({ - env: { - DEFAULT_HOME_VIEW_PAGE: undefined as string | undefined, - }, -})); - -vi.mock("@sourcebot/shared", () => ({ - env: mocks.env, -})); - -import { getDefaultHomeView } from "./homeView.server"; - -describe("getDefaultHomeView", () => { - beforeEach(() => { - mocks.env.DEFAULT_HOME_VIEW_PAGE = undefined; - }); - - test("defaults to Search when DEFAULT_HOME_VIEW_PAGE is unset", () => { - expect(getDefaultHomeView()).toBe("search"); - }); - - test("returns Ask when DEFAULT_HOME_VIEW_PAGE is ask", () => { - mocks.env.DEFAULT_HOME_VIEW_PAGE = "ask"; - - expect(getDefaultHomeView()).toBe("ask"); - }); -}); diff --git a/packages/web/src/lib/homeView.server.ts b/packages/web/src/lib/homeView.server.ts deleted file mode 100644 index 4d26b56cc..000000000 --- a/packages/web/src/lib/homeView.server.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { env } from "@sourcebot/shared"; -import type { HomeView } from "./homeView"; - -export function getDefaultHomeView(): HomeView { - // Preserve the Code Search default for versions before DEFAULT_HOME_VIEW_PAGE existed. - return env.DEFAULT_HOME_VIEW_PAGE ?? "search"; -} diff --git a/packages/web/src/lib/homeView.test.ts b/packages/web/src/lib/homeView.test.ts deleted file mode 100644 index c96d8d9e5..000000000 --- a/packages/web/src/lib/homeView.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { describe, expect, test } from "vitest"; -import { resolveHomeView } from "./homeView"; - -describe("home view selection", () => { - test("uses Ask when the configured default is Ask and no cookie is set", () => { - expect(resolveHomeView(undefined, "ask")).toBe("ask"); - }); - - test("uses Code Search when the configured default is Search and no cookie is set", () => { - expect(resolveHomeView(undefined, "search")).toBe("search"); - }); - - test("respects an explicit Code Search cookie when Ask is the configured default", () => { - expect(resolveHomeView("search", "ask")).toBe("search"); - }); - - test("respects an explicit Ask cookie when Search is the configured default", () => { - expect(resolveHomeView("ask", "search")).toBe("ask"); - }); -}); diff --git a/packages/web/src/lib/homeView.ts b/packages/web/src/lib/homeView.ts index 12f06e938..0bb40ec19 100644 --- a/packages/web/src/lib/homeView.ts +++ b/packages/web/src/lib/homeView.ts @@ -1,8 +1 @@ export type HomeView = "search" | "ask"; - -export function resolveHomeView( - cookieValue: HomeView | undefined, - defaultHomeView: HomeView, -): HomeView { - return cookieValue ?? defaultHomeView; -} From 11f79d4cd3f7a7b807962348d6d0b66c40cd73e6 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 04:28:54 +0000 Subject: [PATCH 12/15] refactor(web): inline home page env fallback Co-authored-by: Michael Sukkarieh --- .../src/app/(app)/@sidebar/components/defaultSidebar/index.tsx | 3 +-- packages/web/src/app/(app)/page.tsx | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx index b26067378..d499951e7 100644 --- a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx +++ b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx @@ -21,9 +21,8 @@ export const SIDEBAR_REPO_VISITS_LIMIT = 10; export async function DefaultSidebar() { const session = await auth(); const cookieStore = await cookies(); - const defaultHomeView = env.DEFAULT_HOME_VIEW_PAGE; const cookieValue = cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value as HomeView | undefined; - const homeView = cookieValue ?? defaultHomeView; + const homeView = cookieValue ?? env.DEFAULT_HOME_VIEW_PAGE; // Chat history is part of the Ask experience; hide it when the deployment // is not on a plan that includes Ask. diff --git a/packages/web/src/app/(app)/page.tsx b/packages/web/src/app/(app)/page.tsx index d9cfe9350..e1cb9d11f 100644 --- a/packages/web/src/app/(app)/page.tsx +++ b/packages/web/src/app/(app)/page.tsx @@ -11,9 +11,8 @@ interface Props { export default async function Home(props: Props) { const cookieStore = await cookies(); - const defaultHomeView = env.DEFAULT_HOME_VIEW_PAGE; const cookieValue = cookieStore.get(HOME_VIEW_COOKIE_NAME)?.value as HomeView | undefined; - const homeView = cookieValue ?? defaultHomeView; + const homeView = cookieValue ?? env.DEFAULT_HOME_VIEW_PAGE; if (homeView === "ask") { return ; } From 7842715ec9d75eb32d8cc35b46911efd833da50d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 04:34:44 +0000 Subject: [PATCH 13/15] refactor(web): keep home view type with hook Co-authored-by: Michael Sukkarieh --- .../src/app/(app)/@sidebar/components/defaultSidebar/index.tsx | 2 +- packages/web/src/app/(app)/page.tsx | 2 +- packages/web/src/hooks/useHomeView.ts | 3 +-- packages/web/src/lib/homeView.ts | 1 - 4 files changed, 3 insertions(+), 5 deletions(-) delete mode 100644 packages/web/src/lib/homeView.ts diff --git a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx index d499951e7..0779b7a24 100644 --- a/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx +++ b/packages/web/src/app/(app)/@sidebar/components/defaultSidebar/index.tsx @@ -1,7 +1,7 @@ import { cookies } from "next/headers"; import { auth } from "@/auth"; import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; -import type { HomeView } from "@/lib/homeView"; +import type { HomeView } from "@/hooks/useHomeView"; import { getOrgAccountRequests } from "@/features/membership/actions"; import { isServiceError } from "@/lib/utils"; import { ServiceErrorException } from "@/lib/serviceError"; diff --git a/packages/web/src/app/(app)/page.tsx b/packages/web/src/app/(app)/page.tsx index e1cb9d11f..d9d71c645 100644 --- a/packages/web/src/app/(app)/page.tsx +++ b/packages/web/src/app/(app)/page.tsx @@ -1,5 +1,5 @@ import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; -import type { HomeView } from "@/lib/homeView"; +import type { HomeView } from "@/hooks/useHomeView"; import { cookies } from "next/headers"; import { ChatLandingPage } from "./chat/chatLandingPage"; import SearchPage from "./search/page"; diff --git a/packages/web/src/hooks/useHomeView.ts b/packages/web/src/hooks/useHomeView.ts index b6da964d9..62969e2ba 100644 --- a/packages/web/src/hooks/useHomeView.ts +++ b/packages/web/src/hooks/useHomeView.ts @@ -2,9 +2,8 @@ import { useCallback, useState } from "react"; import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; -import type { HomeView } from "@/lib/homeView"; -export type { HomeView } from "@/lib/homeView"; +export type HomeView = "search" | "ask"; const COOKIE_NAME = HOME_VIEW_COOKIE_NAME; diff --git a/packages/web/src/lib/homeView.ts b/packages/web/src/lib/homeView.ts deleted file mode 100644 index 0bb40ec19..000000000 --- a/packages/web/src/lib/homeView.ts +++ /dev/null @@ -1 +0,0 @@ -export type HomeView = "search" | "ask"; From 06d112c3de8b96b7cbfcad6df4746300f9934808 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 04:49:03 +0000 Subject: [PATCH 14/15] docs: document default home view environment variable Co-authored-by: Michael Sukkarieh --- docs/docs/configuration/environment-variables.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/configuration/environment-variables.mdx b/docs/docs/configuration/environment-variables.mdx index 9bbe31de4..c95e1b259 100644 --- a/docs/docs/configuration/environment-variables.mdx +++ b/docs/docs/configuration/environment-variables.mdx @@ -39,6 +39,7 @@ The following environment variables allow you to configure your Sourcebot deploy | `SOURCEBOT_STRUCTURED_LOGGING_FILE` | - |

Optional file to log to if structured logging is enabled

| | `SOURCEBOT_TELEMETRY_DISABLED` | `false` |

Enables/disables telemetry collection in Sourcebot. See [this doc](/docs/misc/telemetry) for more info.

| | `DEFAULT_MAX_MATCH_COUNT` | `10000` |

The default maximum number of search results to return when using search in the web app.

| +| `DEFAULT_HOME_VIEW_PAGE` | `search` |

Sets the default home page when no `sb.home-view` cookie preference is set. Use `ask` to default to Ask Sourcebot or `search` to default to Code Search.

| | `ALWAYS_INDEX_FILE_PATTERNS` | - |

A comma separated list of glob patterns matching file paths that should always be indexed, regardless of size or number of trigrams.

| | `SOURCEBOT_CHAT_ATTACHMENT_MAX_IMAGE_BYTES` | `10485760` (10 MiB) |

Maximum size in bytes of a single image attachment uploaded to Ask Sourcebot. Enforced server-side at upload time.

| | `SOURCEBOT_CHAT_ATTACHMENT_ORPHAN_TTL_HOURS` | `24` |

How long in hours an uploaded-but-unsent attachment is retained before being deleted by the orphan sweep. Set to `0` to disable the sweep.

| From 6cd7e4c60068c27cb38d828f64c8dfc25f5631b6 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 04:52:39 +0000 Subject: [PATCH 15/15] docs: clarify home page preference wording Co-authored-by: Michael Sukkarieh --- docs/docs/configuration/environment-variables.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/configuration/environment-variables.mdx b/docs/docs/configuration/environment-variables.mdx index c95e1b259..6316d6c9f 100644 --- a/docs/docs/configuration/environment-variables.mdx +++ b/docs/docs/configuration/environment-variables.mdx @@ -39,7 +39,7 @@ The following environment variables allow you to configure your Sourcebot deploy | `SOURCEBOT_STRUCTURED_LOGGING_FILE` | - |

Optional file to log to if structured logging is enabled

| | `SOURCEBOT_TELEMETRY_DISABLED` | `false` |

Enables/disables telemetry collection in Sourcebot. See [this doc](/docs/misc/telemetry) for more info.

| | `DEFAULT_MAX_MATCH_COUNT` | `10000` |

The default maximum number of search results to return when using search in the web app.

| -| `DEFAULT_HOME_VIEW_PAGE` | `search` |

Sets the default home page when no `sb.home-view` cookie preference is set. Use `ask` to default to Ask Sourcebot or `search` to default to Code Search.

| +| `DEFAULT_HOME_VIEW_PAGE` | `search` |

Sets the default home page when no user home page preference is set. Use `ask` to default to Ask Sourcebot or `search` to default to Code Search.

| | `ALWAYS_INDEX_FILE_PATTERNS` | - |

A comma separated list of glob patterns matching file paths that should always be indexed, regardless of size or number of trigrams.

| | `SOURCEBOT_CHAT_ATTACHMENT_MAX_IMAGE_BYTES` | `10485760` (10 MiB) |

Maximum size in bytes of a single image attachment uploaded to Ask Sourcebot. Enforced server-side at upload time.

| | `SOURCEBOT_CHAT_ATTACHMENT_ORPHAN_TTL_HOURS` | `24` |

How long in hours an uploaded-but-unsent attachment is retained before being deleted by the orphan sweep. Set to `0` to disable the sweep.

|