From 9cfb34c15c0e0aee2d0954d0a8f80de406869516 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 22 May 2026 21:25:55 +0000 Subject: [PATCH 1/2] fix: pass team header when fetching default templates The /templates/defaults endpoint now requires team auth to filter templates for BYOC customers. Update the dashboard to send the X-Supabase-Team header when calling this endpoint. Changes: - Change createDefaultTemplatesRepository to use TeamRequestScope - Pass scope.teamId to auth headers in the API call - Use protectedTeamProcedure + withTeamAuthedRequestRepository in tRPC router - Update terminal page to pass teamId Co-Authored-By: ben@e2b.dev --- src/app/dashboard/terminal/page.tsx | 1 + src/core/modules/templates/repository.server.ts | 9 +++------ src/core/server/api/routers/templates.ts | 14 ++++---------- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/app/dashboard/terminal/page.tsx b/src/app/dashboard/terminal/page.tsx index 431bc1a7b..5c70803fc 100644 --- a/src/app/dashboard/terminal/page.tsx +++ b/src/app/dashboard/terminal/page.tsx @@ -206,6 +206,7 @@ async function isTerminalTemplateAvailable({ const defaultTemplatesRepository = createDefaultTemplatesRepository({ accessToken, + teamId, }) const teamTemplatesRepository = createTemplatesRepository({ accessToken, diff --git a/src/core/modules/templates/repository.server.ts b/src/core/modules/templates/repository.server.ts index 9d282af3e..4fee26982 100644 --- a/src/core/modules/templates/repository.server.ts +++ b/src/core/modules/templates/repository.server.ts @@ -15,10 +15,7 @@ import { } from '@/core/modules/users/auth-user-emails.server' import { api, infra } from '@/core/shared/clients/api' import { repoErrorFromHttp } from '@/core/shared/errors' -import type { - RequestScope, - TeamRequestScope, -} from '@/core/shared/repository-scope' +import type { TeamRequestScope } from '@/core/shared/repository-scope' import { err, ok, type RepoResult } from '@/core/shared/result' type TemplatesRepositoryDeps = { @@ -142,7 +139,7 @@ export function createTemplatesRepository( } export function createDefaultTemplatesRepository( - scope: RequestScope, + scope: TeamRequestScope, deps: Pick = { apiClient: api, authHeaders: SUPABASE_AUTH_HEADERS, @@ -159,7 +156,7 @@ export function createDefaultTemplatesRepository( const { data, error, response } = await deps.apiClient.GET( '/templates/defaults', { - headers: deps.authHeaders(scope.accessToken), + headers: deps.authHeaders(scope.accessToken, scope.teamId), next: { tags: [CACHE_TAGS.DEFAULT_TEMPLATES] }, } ) diff --git a/src/core/server/api/routers/templates.ts b/src/core/server/api/routers/templates.ts index d063c251c..ce1756bdc 100644 --- a/src/core/server/api/routers/templates.ts +++ b/src/core/server/api/routers/templates.ts @@ -5,18 +5,12 @@ import { createTemplatesRepository, } from '@/core/modules/templates/repository.server' import { throwTRPCErrorFromRepoError } from '@/core/server/adapters/errors' -import { - withAuthedRequestRepository, - withTeamAuthedRequestRepository, -} from '@/core/server/api/middlewares/repository' +import { withTeamAuthedRequestRepository } from '@/core/server/api/middlewares/repository' import { createTRPCRouter } from '@/core/server/trpc/init' -import { - protectedProcedure, - protectedTeamProcedure, -} from '@/core/server/trpc/procedures' +import { protectedTeamProcedure } from '@/core/server/trpc/procedures' -const templatesRepositoryProcedure = protectedProcedure.use( - withAuthedRequestRepository( +const templatesRepositoryProcedure = protectedTeamProcedure.use( + withTeamAuthedRequestRepository( createDefaultTemplatesRepository, (templatesRepository) => ({ templatesRepository, From d9887dbe8b48e7d7353b1b627f173ebd0cf841dc Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 22 May 2026 21:55:28 +0000 Subject: [PATCH 2/2] fix: pass teamSlug to getDefaultTemplatesCached query The tRPC procedure now requires teamSlug input since it uses protectedTeamProcedure. Update the frontend caller to pass it. Co-Authored-By: ben@e2b.dev --- src/features/dashboard/templates/list/table.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/features/dashboard/templates/list/table.tsx b/src/features/dashboard/templates/list/table.tsx index 922c195ef..0c153f44d 100644 --- a/src/features/dashboard/templates/list/table.tsx +++ b/src/features/dashboard/templates/list/table.tsx @@ -48,11 +48,14 @@ export default function TemplatesTable() { ) const { data: defaultTemplatesData } = useSuspenseQuery( - trpc.templates.getDefaultTemplatesCached.queryOptions(undefined, { - refetchOnMount: false, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - }) + trpc.templates.getDefaultTemplatesCached.queryOptions( + { teamSlug }, + { + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + } + ) ) const templates = useMemo(