diff --git a/CHANGELOG.md b/CHANGELOG.md index 6495f84cf..8fb047aa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Added optional `visibility` parameter to `/api/chat/blocking` endpoint and MCP `ask_codebase` tool to allow controlling chat session visibility in shared environments. [#903](https://github.com/sourcebot-dev/sourcebot/pull/903) +- Added `defaultBranch`, `isFork`, and `isArchived` fields to the `/api/repos` endpoint response and MCP `list_repos` tool. [#905](https://github.com/sourcebot-dev/sourcebot/pull/905) ## [4.11.1] - 2026-02-18 diff --git a/packages/mcp/CHANGELOG.md b/packages/mcp/CHANGELOG.md index 1a5e07615..3a91719bd 100644 --- a/packages/mcp/CHANGELOG.md +++ b/packages/mcp/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Added optional `visibility` parameter to `ask_codebase` tool to allow controlling chat session visibility in shared environments. [#903](https://github.com/sourcebot-dev/sourcebot/pull/903) +- Added `defaultBranch`, `isFork`, and `isArchived` fields to the `list_repos` tool response. [#905](https://github.com/sourcebot-dev/sourcebot/pull/905) ## [1.0.16] - 2026-02-10 diff --git a/packages/mcp/src/index.ts b/packages/mcp/src/index.ts index a31cd2fbd..aa8b27513 100644 --- a/packages/mcp/src/index.ts +++ b/packages/mcp/src/index.ts @@ -211,6 +211,9 @@ server.tool( name: repo.repoName, url: repo.webUrl, pushedAt: repo.pushedAt, + defaultBranch: repo.defaultBranch, + isFork: repo.isFork, + isArchived: repo.isArchived, })), totalCount: result.totalCount, }) diff --git a/packages/mcp/src/schemas.ts b/packages/mcp/src/schemas.ts index 4cbc7e574..a72fbf116 100644 --- a/packages/mcp/src/schemas.ts +++ b/packages/mcp/src/schemas.ts @@ -155,6 +155,9 @@ export const repositoryQuerySchema = z.object({ imageUrl: z.string().optional(), indexedAt: z.coerce.date().optional(), pushedAt: z.coerce.date().optional(), + defaultBranch: z.string().optional(), + isFork: z.boolean(), + isArchived: z.boolean(), }); export const listReposResponseSchema = repositoryQuerySchema.array(); diff --git a/packages/web/src/actions.ts b/packages/web/src/actions.ts index 35d4a2211..1ad6bc30a 100644 --- a/packages/web/src/actions.ts +++ b/packages/web/src/actions.ts @@ -28,8 +28,8 @@ import InviteUserEmail from "./emails/inviteUserEmail"; import JoinRequestApprovedEmail from "./emails/joinRequestApprovedEmail"; import JoinRequestSubmittedEmail from "./emails/joinRequestSubmittedEmail"; import { AGENTIC_SEARCH_TUTORIAL_DISMISSED_COOKIE_NAME, MOBILE_UNSUPPORTED_SPLASH_SCREEN_DISMISSED_COOKIE_NAME, SINGLE_TENANT_ORG_DOMAIN, SOURCEBOT_GUEST_USER_ID, SOURCEBOT_SUPPORT_EMAIL } from "./lib/constants"; -import { orgDomainSchema, orgNameSchema, repositoryQuerySchema } from "./lib/schemas"; -import { ApiKeyPayload, TenancyMode } from "./lib/types"; +import { orgDomainSchema, orgNameSchema } from "./lib/schemas"; +import { ApiKeyPayload, RepositoryQuery, TenancyMode } from "./lib/types"; import { withAuthV2, withOptionalAuthV2 } from "./withAuthV2"; import { getBrowsePath } from "./app/[domain]/browse/hooks/utils"; @@ -479,7 +479,7 @@ export const getRepos = async ({ const baseUrl = env.AUTH_URL; - return repos.map((repo) => repositoryQuerySchema.parse({ + return repos.map((repo) => ({ codeHostType: repo.external_codeHostType, repoId: repo.id, repoName: repo.name, @@ -494,7 +494,10 @@ export const getRepos = async ({ imageUrl: repo.imageUrl ?? undefined, indexedAt: repo.indexedAt ?? undefined, pushedAt: repo.pushedAt ?? undefined, - })) + defaultBranch: repo.defaultBranch ?? undefined, + isFork: repo.isFork, + isArchived: repo.isArchived, + } satisfies RepositoryQuery)) })); /** diff --git a/packages/web/src/app/api/(server)/repos/listReposApi.ts b/packages/web/src/app/api/(server)/repos/listReposApi.ts index 2bbe2906f..d5f743cbb 100644 --- a/packages/web/src/app/api/(server)/repos/listReposApi.ts +++ b/packages/web/src/app/api/(server)/repos/listReposApi.ts @@ -1,6 +1,5 @@ import { sew } from "@/actions"; -import { repositoryQuerySchema } from "@/lib/schemas"; -import { ListReposQueryParams } from "@/lib/types"; +import { ListReposQueryParams, RepositoryQuery } from "@/lib/types"; import { withOptionalAuthV2 } from "@/withAuthV2"; import { getBrowsePath } from "@/app/[domain]/browse/hooks/utils"; import { env } from "@sourcebot/shared"; @@ -34,7 +33,7 @@ export const listRepos = async ({ query, page, perPage, sort, direction }: ListR ]); return { - data: repos.map((repo) => repositoryQuerySchema.parse({ + data: repos.map((repo) => ({ codeHostType: repo.external_codeHostType, repoId: repo.id, repoName: repo.name, @@ -49,7 +48,10 @@ export const listRepos = async ({ query, page, perPage, sort, direction }: ListR imageUrl: repo.imageUrl ?? undefined, indexedAt: repo.indexedAt ?? undefined, pushedAt: repo.pushedAt ?? undefined, - })), + defaultBranch: repo.defaultBranch ?? undefined, + isFork: repo.isFork, + isArchived: repo.isArchived, + } satisfies RepositoryQuery)), totalCount, }; }) diff --git a/packages/web/src/lib/schemas.ts b/packages/web/src/lib/schemas.ts index 6bdd7a80b..fb5e26d95 100644 --- a/packages/web/src/lib/schemas.ts +++ b/packages/web/src/lib/schemas.ts @@ -22,6 +22,9 @@ export const repositoryQuerySchema = z.object({ imageUrl: z.string().optional(), indexedAt: z.coerce.date().optional(), pushedAt: z.coerce.date().optional(), + defaultBranch: z.string().optional(), + isFork: z.boolean(), + isArchived: z.boolean(), }); export const searchContextQuerySchema = z.object({