Merged
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 numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Fixed
- Upgraded Next.js to 16.3.1 to bound memory retained by high-cardinality dynamic route cache entries. [#1594](https://github.com/sourcebot-dev/sourcebot/pull/1594)
Comment thread
brendan-kellam marked this conversation as resolved.
- Fixed memory leak attributed to CodeMirror allocating objects on heap that were never freed. [#1580](https://github.com/sourcebot-dev/sourcebot/pull/1580)
- Kept Git provider credentials out of subprocess arguments and on-disk configuration by using isolated in-memory credential caches. [#1584](https://github.com/sourcebot-dev/sourcebot/pull/1584)

Expand Down
2 changes: 1 addition & 1 deletion packages/web/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -162,7 +162,7 @@
"micromatch": "^4.0.8",
"minidenticons": "^4.2.1",
"motion": "^12.42.0",
"next": "^16.2.11",
"next": "^16.3.1",
"next-auth": "^5.0.0-beta.32",
"next-navigation-guard": "^0.2.0",
"next-themes": "^0.3.0",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,7 @@ afterEach(() => {
// A minimal underlying App Router for the guard library to wrap. Without an
// outer router there is nothing to intercept, so the guard never engages.
const makeMockRouter = (): AppRouterInstance => ({
bfcacheId: "test",
push: vi.fn(),
replace: vi.fn(),
refresh: vi.fn(),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,7 +68,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, SINGLE_REVIEW);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('line', 10);
expect(call).not.toHaveProperty('start_line');
});
Expand All@@ -84,7 +84,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, multiLineReviews);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('start_line', 5);
expect(call).toHaveProperty('line', 15);
expect(call).toHaveProperty('start_side', 'RIGHT');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,7 +48,11 @@ const MOCK_MR_API_RESPONSE = {
},
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: Partial<typeof MOCK_MR_API_RESPONSE> = {}) {
type MockMrApiResponseOverrides = Omit<Partial<typeof MOCK_MR_API_RESPONSE>, 'description'> & {
description?: string | null;
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: MockMrApiResponseOverrides = {}) {
return {
MergeRequests: {
show: vi.fn().mockResolvedValue({ ...MOCK_MR_API_RESPONSE, ...mrOverrides }),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -101,7 +101,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('src/foo.ts');
});

Expand All@@ -116,7 +116,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, multiLineReviews);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('10');
expect(noteBody).toContain('20');
expect(noteBody).toContain('Refactor this block');
Expand DownExpand Up@@ -272,9 +272,9 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, payloadWithDiffs, addedLineReview);

const call = client.MergeRequestDiscussions.create.mock.calls[0][3];
expect(call.position).not.toHaveProperty('oldLine');
expect(call.position.newLine).toBe('2');
const position = vi.mocked(client.MergeRequestDiscussions.create).mock.calls[0]![3]!.position!;
expect(position).not.toHaveProperty('oldLine');
expect(position.newLine).toBe('2');
});

test('uses new path for both oldPath and newPath when old path is /dev/null (added file)', async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/features/git/getFileSourceApi.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -83,7 +83,7 @@ describe('getFileSourceForRepo', () => {

const mockPrisma = {
repo: { findFirst: mockFindFirst },
} as Parameters<typeof getFileSourceForRepo>[1]['prisma'];
} as unknown as Parameters<typeof getFileSourceForRepo>[1]['prisma'];

beforeEach(() => {
vi.clearAllMocks();
Expand Down
1 change: 1 addition & 0 deletions packages/web/src/features/mcp/prismaScope.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,6 +10,7 @@ const user = {
emailVerified: null,
image: null,
sessionVersion: 0,
lastActiveAt: null,
createdAt: new Date('2026-01-01T00:00:00Z'),
updatedAt: new Date('2026-01-01T00:00:00Z'),
accounts: [],
Expand Down
9 changes: 9 additions & 0 deletions packages/web/src/middleware/withAuth.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1053,6 +1053,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand DownExpand Up@@ -1080,6 +1083,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand All@@ -1101,6 +1107,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
prisma.apiKey.findUnique.mockResolvedValue({ ...MOCK_API_KEY, hash: 'apikey', createdById: userId });
setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' }));
Expand Down
109 changes: 60 additions & 49 deletions yarn.lock
Original file line numberDiff line numberDiff line change
Expand Up@@ -3714,10 +3714,10 @@ __metadata:
languageName: node
linkType: hard

"@next/env@npm:16.2.11":
version: 16.2.11
resolution: "@next/env@npm:16.2.11"
checksum: 10c0/fdb5ff54037f5e554c7452a31f745e40a02ea55416b80c9abf5ebb3b6fba54beaa15e080fc8470f9a59b3a0506c7ce775764134256d413f17e17e4f92802cee3
"@next/env@npm:16.3.1":
version: 16.3.1
resolution: "@next/env@npm:16.3.1"
checksum: 10c0/c2c61e12c31a8d3be6738fc18b4d7c1e6a151336fb386b4eff8961ee0c72cabb33867febe903a2aacf26aed75be9aa77d4947b15c45162fc0279c0f612884f5a
languageName: node
linkType: hard

Expand All@@ -3730,58 +3730,58 @@ __metadata:
languageName: node
linkType: hard

"@next/swc-darwin-arm64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-arm64@npm:16.2.11"
"@next/swc-darwin-arm64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-arm64@npm:16.3.1"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard

"@next/swc-darwin-x64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-x64@npm:16.2.11"
"@next/swc-darwin-x64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-x64@npm:16.3.1"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard

"@next/swc-linux-arm64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-gnu@npm:16.2.11"
"@next/swc-linux-arm64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-gnu@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-arm64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-musl@npm:16.2.11"
"@next/swc-linux-arm64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-musl@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard

"@next/swc-linux-x64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-gnu@npm:16.2.11"
"@next/swc-linux-x64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-gnu@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-x64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-musl@npm:16.2.11"
"@next/swc-linux-x64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-musl@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard

"@next/swc-win32-arm64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-arm64-msvc@npm:16.2.11"
"@next/swc-win32-arm64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-arm64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard

"@next/swc-win32-x64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-x64-msvc@npm:16.2.11"
"@next/swc-win32-x64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-x64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
Expand DownExpand Up@@ -9069,7 +9069,7 @@ __metadata:
micromatch: "npm:^4.0.8"
minidenticons: "npm:^4.2.1"
motion: "npm:^12.42.0"
next: "npm:^16.2.11"
next: "npm:^16.3.1"
next-auth: "npm:^5.0.0-beta.32"
next-navigation-guard: "npm:^0.2.0"
next-themes: "npm:^0.3.0"
Expand DownExpand Up@@ -9156,12 +9156,12 @@ __metadata:
languageName: node
linkType: hard

"@swc/helpers@npm:0.5.15":
version: 0.5.15
resolution: "@swc/helpers@npm:0.5.15"
"@swc/helpers@npm:0.5.23":
version: 0.5.23
resolution: "@swc/helpers@npm:0.5.23"
dependencies:
tslib: "npm:^2.8.0"
checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4
checksum: 10c0/02da7b4df465693933ecd4851cc193ec729c309939c8a84eccae5ec0010aafc3894e713b8ef8d13a6ba401759f0e900c88e2dcfef5872c27bb91e70f73275cce
languageName: node
linkType: hard

Expand DownExpand Up@@ -18302,24 +18302,24 @@ __metadata:
languageName: node
linkType: hard

"next@npm:^16.2.11":
version: 16.2.11
resolution: "next@npm:16.2.11"
"next@npm:^16.2.11, next@npm:^16.3.1":
version: 16.3.1
resolution: "next@npm:16.3.1"
dependencies:
"@next/env": "npm:16.2.11"
"@next/swc-darwin-arm64": "npm:16.2.11"
"@next/swc-darwin-x64": "npm:16.2.11"
"@next/swc-linux-arm64-gnu": "npm:16.2.11"
"@next/swc-linux-arm64-musl": "npm:16.2.11"
"@next/swc-linux-x64-gnu": "npm:16.2.11"
"@next/swc-linux-x64-musl": "npm:16.2.11"
"@next/swc-win32-arm64-msvc": "npm:16.2.11"
"@next/swc-win32-x64-msvc": "npm:16.2.11"
"@swc/helpers": "npm:0.5.15"
"@next/env": "npm:16.3.1"
"@next/swc-darwin-arm64": "npm:16.3.1"
"@next/swc-darwin-x64": "npm:16.3.1"
"@next/swc-linux-arm64-gnu": "npm:16.3.1"
"@next/swc-linux-arm64-musl": "npm:16.3.1"
"@next/swc-linux-x64-gnu": "npm:16.3.1"
"@next/swc-linux-x64-musl": "npm:16.3.1"
"@next/swc-win32-arm64-msvc": "npm:16.3.1"
"@next/swc-win32-x64-msvc": "npm:16.3.1"
"@swc/helpers": "npm:0.5.23"
baseline-browser-mapping: "npm:^2.9.19"
caniuse-lite: "npm:^1.0.30001579"
postcss: "npm:8.4.31"
sharp: "npm:^0.34.5"
postcss: "npm:8.5.23"
sharp: "npm:^0.35.3"
styled-jsx: "npm:5.1.6"
peerDependencies:
"@opentelemetry/api": ^1.1.0
Expand DownExpand Up@@ -18358,7 +18358,7 @@ __metadata:
optional: true
bin:
next: dist/bin/next
checksum: 10c0/81f85262cf01ad6b4fd4a8be369925dfe206806a33e967733033d7adcf367aa0ba1f911272de6169a3d09315821eddf6b57594337a456ad134ba5aa8870a80b1
checksum: 10c0/a071c6fdb9d02fc97b520d2c94aacfce693cf1847287129e0eaec42e8715433d925d165b8c800aff102f40820c8cf4a2e0306905d4d9912b5864a16e4f223bf0
languageName: node
linkType: hard

Expand DownExpand Up@@ -19395,6 +19395,17 @@ __metadata:
languageName: node
linkType: hard

"postcss@npm:8.5.23":
version: 8.5.23
resolution: "postcss@npm:8.5.23"
dependencies:
nanoid: "npm:^3.3.16"
picocolors: "npm:^1.1.1"
source-map-js: "npm:^1.2.1"
checksum: 10c0/ed714e635b330bb42666ecdd0c0b4f30224ded15b0b0052d6bc2b92832f2cf17d1c1141359453f96f0a84f8fbf4c405a74df187f559163b8f31131b2535455aa
languageName: node
linkType: hard

"postcss@npm:^8.4.47, postcss@npm:^8.5.12, postcss@npm:^8.5.15":
version: 8.5.25
resolution: "postcss@npm:8.5.25"
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
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 numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Fixed
- Upgraded Next.js to 16.3.1 to bound memory retained by high-cardinality dynamic route cache entries. [#1594](https://github.com/sourcebot-dev/sourcebot/pull/1594)
Comment thread
brendan-kellam marked this conversation as resolved.
- Fixed memory leak attributed to CodeMirror allocating objects on heap that were never freed. [#1580](https://github.com/sourcebot-dev/sourcebot/pull/1580)
- Kept Git provider credentials out of subprocess arguments and on-disk configuration by using isolated in-memory credential caches. [#1584](https://github.com/sourcebot-dev/sourcebot/pull/1584)

Expand Down
2 changes: 1 addition & 1 deletion packages/web/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -162,7 +162,7 @@
"micromatch": "^4.0.8",
"minidenticons": "^4.2.1",
"motion": "^12.42.0",
"next": "^16.2.11",
"next": "^16.3.1",
"next-auth": "^5.0.0-beta.32",
"next-navigation-guard": "^0.2.0",
"next-themes": "^0.3.0",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,7 @@ afterEach(() => {
// A minimal underlying App Router for the guard library to wrap. Without an
// outer router there is nothing to intercept, so the guard never engages.
const makeMockRouter = (): AppRouterInstance => ({
bfcacheId: "test",
push: vi.fn(),
replace: vi.fn(),
refresh: vi.fn(),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,7 +68,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, SINGLE_REVIEW);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('line', 10);
expect(call).not.toHaveProperty('start_line');
});
Expand All@@ -84,7 +84,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, multiLineReviews);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('start_line', 5);
expect(call).toHaveProperty('line', 15);
expect(call).toHaveProperty('start_side', 'RIGHT');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,7 +48,11 @@ const MOCK_MR_API_RESPONSE = {
},
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: Partial<typeof MOCK_MR_API_RESPONSE> = {}) {
type MockMrApiResponseOverrides = Omit<Partial<typeof MOCK_MR_API_RESPONSE>, 'description'> & {
description?: string | null;
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: MockMrApiResponseOverrides = {}) {
return {
MergeRequests: {
show: vi.fn().mockResolvedValue({ ...MOCK_MR_API_RESPONSE, ...mrOverrides }),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -101,7 +101,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('src/foo.ts');
});

Expand All@@ -116,7 +116,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, multiLineReviews);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('10');
expect(noteBody).toContain('20');
expect(noteBody).toContain('Refactor this block');
Expand DownExpand Up@@ -272,9 +272,9 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, payloadWithDiffs, addedLineReview);

const call = client.MergeRequestDiscussions.create.mock.calls[0][3];
expect(call.position).not.toHaveProperty('oldLine');
expect(call.position.newLine).toBe('2');
const position = vi.mocked(client.MergeRequestDiscussions.create).mock.calls[0]![3]!.position!;
expect(position).not.toHaveProperty('oldLine');
expect(position.newLine).toBe('2');
});

test('uses new path for both oldPath and newPath when old path is /dev/null (added file)', async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/features/git/getFileSourceApi.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -83,7 +83,7 @@ describe('getFileSourceForRepo', () => {

const mockPrisma = {
repo: { findFirst: mockFindFirst },
} as Parameters<typeof getFileSourceForRepo>[1]['prisma'];
} as unknown as Parameters<typeof getFileSourceForRepo>[1]['prisma'];

beforeEach(() => {
vi.clearAllMocks();
Expand Down
1 change: 1 addition & 0 deletions packages/web/src/features/mcp/prismaScope.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,6 +10,7 @@ const user = {
emailVerified: null,
image: null,
sessionVersion: 0,
lastActiveAt: null,
createdAt: new Date('2026-01-01T00:00:00Z'),
updatedAt: new Date('2026-01-01T00:00:00Z'),
accounts: [],
Expand Down
9 changes: 9 additions & 0 deletions packages/web/src/middleware/withAuth.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1053,6 +1053,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand DownExpand Up@@ -1080,6 +1083,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand All@@ -1101,6 +1107,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
prisma.apiKey.findUnique.mockResolvedValue({ ...MOCK_API_KEY, hash: 'apikey', createdById: userId });
setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' }));
Expand Down
109 changes: 60 additions & 49 deletions yarn.lock
Original file line numberDiff line numberDiff line change
Expand Up@@ -3714,10 +3714,10 @@ __metadata:
languageName: node
linkType: hard

"@next/env@npm:16.2.11":
version: 16.2.11
resolution: "@next/env@npm:16.2.11"
checksum: 10c0/fdb5ff54037f5e554c7452a31f745e40a02ea55416b80c9abf5ebb3b6fba54beaa15e080fc8470f9a59b3a0506c7ce775764134256d413f17e17e4f92802cee3
"@next/env@npm:16.3.1":
version: 16.3.1
resolution: "@next/env@npm:16.3.1"
checksum: 10c0/c2c61e12c31a8d3be6738fc18b4d7c1e6a151336fb386b4eff8961ee0c72cabb33867febe903a2aacf26aed75be9aa77d4947b15c45162fc0279c0f612884f5a
languageName: node
linkType: hard

Expand All@@ -3730,58 +3730,58 @@ __metadata:
languageName: node
linkType: hard

"@next/swc-darwin-arm64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-arm64@npm:16.2.11"
"@next/swc-darwin-arm64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-arm64@npm:16.3.1"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard

"@next/swc-darwin-x64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-x64@npm:16.2.11"
"@next/swc-darwin-x64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-x64@npm:16.3.1"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard

"@next/swc-linux-arm64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-gnu@npm:16.2.11"
"@next/swc-linux-arm64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-gnu@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-arm64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-musl@npm:16.2.11"
"@next/swc-linux-arm64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-musl@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard

"@next/swc-linux-x64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-gnu@npm:16.2.11"
"@next/swc-linux-x64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-gnu@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-x64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-musl@npm:16.2.11"
"@next/swc-linux-x64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-musl@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard

"@next/swc-win32-arm64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-arm64-msvc@npm:16.2.11"
"@next/swc-win32-arm64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-arm64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard

"@next/swc-win32-x64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-x64-msvc@npm:16.2.11"
"@next/swc-win32-x64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-x64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
Expand DownExpand Up@@ -9069,7 +9069,7 @@ __metadata:
micromatch: "npm:^4.0.8"
minidenticons: "npm:^4.2.1"
motion: "npm:^12.42.0"
next: "npm:^16.2.11"
next: "npm:^16.3.1"
next-auth: "npm:^5.0.0-beta.32"
next-navigation-guard: "npm:^0.2.0"
next-themes: "npm:^0.3.0"
Expand DownExpand Up@@ -9156,12 +9156,12 @@ __metadata:
languageName: node
linkType: hard

"@swc/helpers@npm:0.5.15":
version: 0.5.15
resolution: "@swc/helpers@npm:0.5.15"
"@swc/helpers@npm:0.5.23":
version: 0.5.23
resolution: "@swc/helpers@npm:0.5.23"
dependencies:
tslib: "npm:^2.8.0"
checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4
checksum: 10c0/02da7b4df465693933ecd4851cc193ec729c309939c8a84eccae5ec0010aafc3894e713b8ef8d13a6ba401759f0e900c88e2dcfef5872c27bb91e70f73275cce
languageName: node
linkType: hard

Expand DownExpand Up@@ -18302,24 +18302,24 @@ __metadata:
languageName: node
linkType: hard

"next@npm:^16.2.11":
version: 16.2.11
resolution: "next@npm:16.2.11"
"next@npm:^16.2.11, next@npm:^16.3.1":
version: 16.3.1
resolution: "next@npm:16.3.1"
dependencies:
"@next/env": "npm:16.2.11"
"@next/swc-darwin-arm64": "npm:16.2.11"
"@next/swc-darwin-x64": "npm:16.2.11"
"@next/swc-linux-arm64-gnu": "npm:16.2.11"
"@next/swc-linux-arm64-musl": "npm:16.2.11"
"@next/swc-linux-x64-gnu": "npm:16.2.11"
"@next/swc-linux-x64-musl": "npm:16.2.11"
"@next/swc-win32-arm64-msvc": "npm:16.2.11"
"@next/swc-win32-x64-msvc": "npm:16.2.11"
"@swc/helpers": "npm:0.5.15"
"@next/env": "npm:16.3.1"
"@next/swc-darwin-arm64": "npm:16.3.1"
"@next/swc-darwin-x64": "npm:16.3.1"
"@next/swc-linux-arm64-gnu": "npm:16.3.1"
"@next/swc-linux-arm64-musl": "npm:16.3.1"
"@next/swc-linux-x64-gnu": "npm:16.3.1"
"@next/swc-linux-x64-musl": "npm:16.3.1"
"@next/swc-win32-arm64-msvc": "npm:16.3.1"
"@next/swc-win32-x64-msvc": "npm:16.3.1"
"@swc/helpers": "npm:0.5.23"
baseline-browser-mapping: "npm:^2.9.19"
caniuse-lite: "npm:^1.0.30001579"
postcss: "npm:8.4.31"
sharp: "npm:^0.34.5"
postcss: "npm:8.5.23"
sharp: "npm:^0.35.3"
styled-jsx: "npm:5.1.6"
peerDependencies:
"@opentelemetry/api": ^1.1.0
Expand DownExpand Up@@ -18358,7 +18358,7 @@ __metadata:
optional: true
bin:
next: dist/bin/next
checksum: 10c0/81f85262cf01ad6b4fd4a8be369925dfe206806a33e967733033d7adcf367aa0ba1f911272de6169a3d09315821eddf6b57594337a456ad134ba5aa8870a80b1
checksum: 10c0/a071c6fdb9d02fc97b520d2c94aacfce693cf1847287129e0eaec42e8715433d925d165b8c800aff102f40820c8cf4a2e0306905d4d9912b5864a16e4f223bf0
languageName: node
linkType: hard

Expand DownExpand Up@@ -19395,6 +19395,17 @@ __metadata:
languageName: node
linkType: hard

"postcss@npm:8.5.23":
version: 8.5.23
resolution: "postcss@npm:8.5.23"
dependencies:
nanoid: "npm:^3.3.16"
picocolors: "npm:^1.1.1"
source-map-js: "npm:^1.2.1"
checksum: 10c0/ed714e635b330bb42666ecdd0c0b4f30224ded15b0b0052d6bc2b92832f2cf17d1c1141359453f96f0a84f8fbf4c405a74df187f559163b8f31131b2535455aa
languageName: node
linkType: hard

"postcss@npm:^8.4.47, postcss@npm:^8.5.12, postcss@npm:^8.5.15":
version: 8.5.25
resolution: "postcss@npm:8.5.25"
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
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 numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Fixed
- Upgraded Next.js to 16.3.1 to bound memory retained by high-cardinality dynamic route cache entries. [#1594](https://github.com/sourcebot-dev/sourcebot/pull/1594)
Comment thread
brendan-kellam marked this conversation as resolved.
- Fixed memory leak attributed to CodeMirror allocating objects on heap that were never freed. [#1580](https://github.com/sourcebot-dev/sourcebot/pull/1580)
- Kept Git provider credentials out of subprocess arguments and on-disk configuration by using isolated in-memory credential caches. [#1584](https://github.com/sourcebot-dev/sourcebot/pull/1584)

Expand Down
2 changes: 1 addition & 1 deletion packages/web/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -162,7 +162,7 @@
"micromatch": "^4.0.8",
"minidenticons": "^4.2.1",
"motion": "^12.42.0",
"next": "^16.2.11",
"next": "^16.3.1",
"next-auth": "^5.0.0-beta.32",
"next-navigation-guard": "^0.2.0",
"next-themes": "^0.3.0",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,7 @@ afterEach(() => {
// A minimal underlying App Router for the guard library to wrap. Without an
// outer router there is nothing to intercept, so the guard never engages.
const makeMockRouter = (): AppRouterInstance => ({
bfcacheId: "test",
push: vi.fn(),
replace: vi.fn(),
refresh: vi.fn(),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,7 +68,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, SINGLE_REVIEW);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('line', 10);
expect(call).not.toHaveProperty('start_line');
});
Expand All@@ -84,7 +84,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, multiLineReviews);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('start_line', 5);
expect(call).toHaveProperty('line', 15);
expect(call).toHaveProperty('start_side', 'RIGHT');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,7 +48,11 @@ const MOCK_MR_API_RESPONSE = {
},
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: Partial<typeof MOCK_MR_API_RESPONSE> = {}) {
type MockMrApiResponseOverrides = Omit<Partial<typeof MOCK_MR_API_RESPONSE>, 'description'> & {
description?: string | null;
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: MockMrApiResponseOverrides = {}) {
return {
MergeRequests: {
show: vi.fn().mockResolvedValue({ ...MOCK_MR_API_RESPONSE, ...mrOverrides }),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -101,7 +101,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('src/foo.ts');
});

Expand All@@ -116,7 +116,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, multiLineReviews);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('10');
expect(noteBody).toContain('20');
expect(noteBody).toContain('Refactor this block');
Expand DownExpand Up@@ -272,9 +272,9 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, payloadWithDiffs, addedLineReview);

const call = client.MergeRequestDiscussions.create.mock.calls[0][3];
expect(call.position).not.toHaveProperty('oldLine');
expect(call.position.newLine).toBe('2');
const position = vi.mocked(client.MergeRequestDiscussions.create).mock.calls[0]![3]!.position!;
expect(position).not.toHaveProperty('oldLine');
expect(position.newLine).toBe('2');
});

test('uses new path for both oldPath and newPath when old path is /dev/null (added file)', async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/features/git/getFileSourceApi.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -83,7 +83,7 @@ describe('getFileSourceForRepo', () => {

const mockPrisma = {
repo: { findFirst: mockFindFirst },
} as Parameters<typeof getFileSourceForRepo>[1]['prisma'];
} as unknown as Parameters<typeof getFileSourceForRepo>[1]['prisma'];

beforeEach(() => {
vi.clearAllMocks();
Expand Down
1 change: 1 addition & 0 deletions packages/web/src/features/mcp/prismaScope.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,6 +10,7 @@ const user = {
emailVerified: null,
image: null,
sessionVersion: 0,
lastActiveAt: null,
createdAt: new Date('2026-01-01T00:00:00Z'),
updatedAt: new Date('2026-01-01T00:00:00Z'),
accounts: [],
Expand Down
9 changes: 9 additions & 0 deletions packages/web/src/middleware/withAuth.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1053,6 +1053,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand DownExpand Up@@ -1080,6 +1083,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand All@@ -1101,6 +1107,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
prisma.apiKey.findUnique.mockResolvedValue({ ...MOCK_API_KEY, hash: 'apikey', createdById: userId });
setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' }));
Expand Down
109 changes: 60 additions & 49 deletions yarn.lock
Original file line numberDiff line numberDiff line change
Expand Up@@ -3714,10 +3714,10 @@ __metadata:
languageName: node
linkType: hard

"@next/env@npm:16.2.11":
version: 16.2.11
resolution: "@next/env@npm:16.2.11"
checksum: 10c0/fdb5ff54037f5e554c7452a31f745e40a02ea55416b80c9abf5ebb3b6fba54beaa15e080fc8470f9a59b3a0506c7ce775764134256d413f17e17e4f92802cee3
"@next/env@npm:16.3.1":
version: 16.3.1
resolution: "@next/env@npm:16.3.1"
checksum: 10c0/c2c61e12c31a8d3be6738fc18b4d7c1e6a151336fb386b4eff8961ee0c72cabb33867febe903a2aacf26aed75be9aa77d4947b15c45162fc0279c0f612884f5a
languageName: node
linkType: hard

Expand All@@ -3730,58 +3730,58 @@ __metadata:
languageName: node
linkType: hard

"@next/swc-darwin-arm64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-arm64@npm:16.2.11"
"@next/swc-darwin-arm64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-arm64@npm:16.3.1"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard

"@next/swc-darwin-x64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-x64@npm:16.2.11"
"@next/swc-darwin-x64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-x64@npm:16.3.1"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard

"@next/swc-linux-arm64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-gnu@npm:16.2.11"
"@next/swc-linux-arm64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-gnu@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-arm64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-musl@npm:16.2.11"
"@next/swc-linux-arm64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-musl@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard

"@next/swc-linux-x64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-gnu@npm:16.2.11"
"@next/swc-linux-x64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-gnu@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-x64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-musl@npm:16.2.11"
"@next/swc-linux-x64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-musl@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard

"@next/swc-win32-arm64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-arm64-msvc@npm:16.2.11"
"@next/swc-win32-arm64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-arm64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard

"@next/swc-win32-x64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-x64-msvc@npm:16.2.11"
"@next/swc-win32-x64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-x64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
Expand DownExpand Up@@ -9069,7 +9069,7 @@ __metadata:
micromatch: "npm:^4.0.8"
minidenticons: "npm:^4.2.1"
motion: "npm:^12.42.0"
next: "npm:^16.2.11"
next: "npm:^16.3.1"
next-auth: "npm:^5.0.0-beta.32"
next-navigation-guard: "npm:^0.2.0"
next-themes: "npm:^0.3.0"
Expand DownExpand Up@@ -9156,12 +9156,12 @@ __metadata:
languageName: node
linkType: hard

"@swc/helpers@npm:0.5.15":
version: 0.5.15
resolution: "@swc/helpers@npm:0.5.15"
"@swc/helpers@npm:0.5.23":
version: 0.5.23
resolution: "@swc/helpers@npm:0.5.23"
dependencies:
tslib: "npm:^2.8.0"
checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4
checksum: 10c0/02da7b4df465693933ecd4851cc193ec729c309939c8a84eccae5ec0010aafc3894e713b8ef8d13a6ba401759f0e900c88e2dcfef5872c27bb91e70f73275cce
languageName: node
linkType: hard

Expand DownExpand Up@@ -18302,24 +18302,24 @@ __metadata:
languageName: node
linkType: hard

"next@npm:^16.2.11":
version: 16.2.11
resolution: "next@npm:16.2.11"
"next@npm:^16.2.11, next@npm:^16.3.1":
version: 16.3.1
resolution: "next@npm:16.3.1"
dependencies:
"@next/env": "npm:16.2.11"
"@next/swc-darwin-arm64": "npm:16.2.11"
"@next/swc-darwin-x64": "npm:16.2.11"
"@next/swc-linux-arm64-gnu": "npm:16.2.11"
"@next/swc-linux-arm64-musl": "npm:16.2.11"
"@next/swc-linux-x64-gnu": "npm:16.2.11"
"@next/swc-linux-x64-musl": "npm:16.2.11"
"@next/swc-win32-arm64-msvc": "npm:16.2.11"
"@next/swc-win32-x64-msvc": "npm:16.2.11"
"@swc/helpers": "npm:0.5.15"
"@next/env": "npm:16.3.1"
"@next/swc-darwin-arm64": "npm:16.3.1"
"@next/swc-darwin-x64": "npm:16.3.1"
"@next/swc-linux-arm64-gnu": "npm:16.3.1"
"@next/swc-linux-arm64-musl": "npm:16.3.1"
"@next/swc-linux-x64-gnu": "npm:16.3.1"
"@next/swc-linux-x64-musl": "npm:16.3.1"
"@next/swc-win32-arm64-msvc": "npm:16.3.1"
"@next/swc-win32-x64-msvc": "npm:16.3.1"
"@swc/helpers": "npm:0.5.23"
baseline-browser-mapping: "npm:^2.9.19"
caniuse-lite: "npm:^1.0.30001579"
postcss: "npm:8.4.31"
sharp: "npm:^0.34.5"
postcss: "npm:8.5.23"
sharp: "npm:^0.35.3"
styled-jsx: "npm:5.1.6"
peerDependencies:
"@opentelemetry/api": ^1.1.0
Expand DownExpand Up@@ -18358,7 +18358,7 @@ __metadata:
optional: true
bin:
next: dist/bin/next
checksum: 10c0/81f85262cf01ad6b4fd4a8be369925dfe206806a33e967733033d7adcf367aa0ba1f911272de6169a3d09315821eddf6b57594337a456ad134ba5aa8870a80b1
checksum: 10c0/a071c6fdb9d02fc97b520d2c94aacfce693cf1847287129e0eaec42e8715433d925d165b8c800aff102f40820c8cf4a2e0306905d4d9912b5864a16e4f223bf0
languageName: node
linkType: hard

Expand DownExpand Up@@ -19395,6 +19395,17 @@ __metadata:
languageName: node
linkType: hard

"postcss@npm:8.5.23":
version: 8.5.23
resolution: "postcss@npm:8.5.23"
dependencies:
nanoid: "npm:^3.3.16"
picocolors: "npm:^1.1.1"
source-map-js: "npm:^1.2.1"
checksum: 10c0/ed714e635b330bb42666ecdd0c0b4f30224ded15b0b0052d6bc2b92832f2cf17d1c1141359453f96f0a84f8fbf4c405a74df187f559163b8f31131b2535455aa
languageName: node
linkType: hard

"postcss@npm:^8.4.47, postcss@npm:^8.5.12, postcss@npm:^8.5.15":
version: 8.5.25
resolution: "postcss@npm:8.5.25"
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
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 numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Fixed
- Upgraded Next.js to 16.3.1 to bound memory retained by high-cardinality dynamic route cache entries. [#1594](https://github.com/sourcebot-dev/sourcebot/pull/1594)
Comment thread
brendan-kellam marked this conversation as resolved.
- Fixed memory leak attributed to CodeMirror allocating objects on heap that were never freed. [#1580](https://github.com/sourcebot-dev/sourcebot/pull/1580)
- Kept Git provider credentials out of subprocess arguments and on-disk configuration by using isolated in-memory credential caches. [#1584](https://github.com/sourcebot-dev/sourcebot/pull/1584)

Expand Down
2 changes: 1 addition & 1 deletion packages/web/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -162,7 +162,7 @@
"micromatch": "^4.0.8",
"minidenticons": "^4.2.1",
"motion": "^12.42.0",
"next": "^16.2.11",
"next": "^16.3.1",
"next-auth": "^5.0.0-beta.32",
"next-navigation-guard": "^0.2.0",
"next-themes": "^0.3.0",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,7 @@ afterEach(() => {
// A minimal underlying App Router for the guard library to wrap. Without an
// outer router there is nothing to intercept, so the guard never engages.
const makeMockRouter = (): AppRouterInstance => ({
bfcacheId: "test",
push: vi.fn(),
replace: vi.fn(),
refresh: vi.fn(),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,7 +68,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, SINGLE_REVIEW);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('line', 10);
expect(call).not.toHaveProperty('start_line');
});
Expand All@@ -84,7 +84,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, multiLineReviews);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('start_line', 5);
expect(call).toHaveProperty('line', 15);
expect(call).toHaveProperty('start_side', 'RIGHT');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,7 +48,11 @@ const MOCK_MR_API_RESPONSE = {
},
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: Partial<typeof MOCK_MR_API_RESPONSE> = {}) {
type MockMrApiResponseOverrides = Omit<Partial<typeof MOCK_MR_API_RESPONSE>, 'description'> & {
description?: string | null;
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: MockMrApiResponseOverrides = {}) {
return {
MergeRequests: {
show: vi.fn().mockResolvedValue({ ...MOCK_MR_API_RESPONSE, ...mrOverrides }),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -101,7 +101,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('src/foo.ts');
});

Expand All@@ -116,7 +116,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, multiLineReviews);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('10');
expect(noteBody).toContain('20');
expect(noteBody).toContain('Refactor this block');
Expand DownExpand Up@@ -272,9 +272,9 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, payloadWithDiffs, addedLineReview);

const call = client.MergeRequestDiscussions.create.mock.calls[0][3];
expect(call.position).not.toHaveProperty('oldLine');
expect(call.position.newLine).toBe('2');
const position = vi.mocked(client.MergeRequestDiscussions.create).mock.calls[0]![3]!.position!;
expect(position).not.toHaveProperty('oldLine');
expect(position.newLine).toBe('2');
});

test('uses new path for both oldPath and newPath when old path is /dev/null (added file)', async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/features/git/getFileSourceApi.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -83,7 +83,7 @@ describe('getFileSourceForRepo', () => {

const mockPrisma = {
repo: { findFirst: mockFindFirst },
} as Parameters<typeof getFileSourceForRepo>[1]['prisma'];
} as unknown as Parameters<typeof getFileSourceForRepo>[1]['prisma'];

beforeEach(() => {
vi.clearAllMocks();
Expand Down
1 change: 1 addition & 0 deletions packages/web/src/features/mcp/prismaScope.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,6 +10,7 @@ const user = {
emailVerified: null,
image: null,
sessionVersion: 0,
lastActiveAt: null,
createdAt: new Date('2026-01-01T00:00:00Z'),
updatedAt: new Date('2026-01-01T00:00:00Z'),
accounts: [],
Expand Down
9 changes: 9 additions & 0 deletions packages/web/src/middleware/withAuth.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1053,6 +1053,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand DownExpand Up@@ -1080,6 +1083,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand All@@ -1101,6 +1107,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
prisma.apiKey.findUnique.mockResolvedValue({ ...MOCK_API_KEY, hash: 'apikey', createdById: userId });
setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' }));
Expand Down
109 changes: 60 additions & 49 deletions yarn.lock
Original file line numberDiff line numberDiff line change
Expand Up@@ -3714,10 +3714,10 @@ __metadata:
languageName: node
linkType: hard

"@next/env@npm:16.2.11":
version: 16.2.11
resolution: "@next/env@npm:16.2.11"
checksum: 10c0/fdb5ff54037f5e554c7452a31f745e40a02ea55416b80c9abf5ebb3b6fba54beaa15e080fc8470f9a59b3a0506c7ce775764134256d413f17e17e4f92802cee3
"@next/env@npm:16.3.1":
version: 16.3.1
resolution: "@next/env@npm:16.3.1"
checksum: 10c0/c2c61e12c31a8d3be6738fc18b4d7c1e6a151336fb386b4eff8961ee0c72cabb33867febe903a2aacf26aed75be9aa77d4947b15c45162fc0279c0f612884f5a
languageName: node
linkType: hard

Expand All@@ -3730,58 +3730,58 @@ __metadata:
languageName: node
linkType: hard

"@next/swc-darwin-arm64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-arm64@npm:16.2.11"
"@next/swc-darwin-arm64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-arm64@npm:16.3.1"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard

"@next/swc-darwin-x64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-x64@npm:16.2.11"
"@next/swc-darwin-x64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-x64@npm:16.3.1"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard

"@next/swc-linux-arm64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-gnu@npm:16.2.11"
"@next/swc-linux-arm64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-gnu@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-arm64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-musl@npm:16.2.11"
"@next/swc-linux-arm64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-musl@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard

"@next/swc-linux-x64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-gnu@npm:16.2.11"
"@next/swc-linux-x64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-gnu@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-x64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-musl@npm:16.2.11"
"@next/swc-linux-x64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-musl@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard

"@next/swc-win32-arm64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-arm64-msvc@npm:16.2.11"
"@next/swc-win32-arm64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-arm64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard

"@next/swc-win32-x64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-x64-msvc@npm:16.2.11"
"@next/swc-win32-x64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-x64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
Expand DownExpand Up@@ -9069,7 +9069,7 @@ __metadata:
micromatch: "npm:^4.0.8"
minidenticons: "npm:^4.2.1"
motion: "npm:^12.42.0"
next: "npm:^16.2.11"
next: "npm:^16.3.1"
next-auth: "npm:^5.0.0-beta.32"
next-navigation-guard: "npm:^0.2.0"
next-themes: "npm:^0.3.0"
Expand DownExpand Up@@ -9156,12 +9156,12 @@ __metadata:
languageName: node
linkType: hard

"@swc/helpers@npm:0.5.15":
version: 0.5.15
resolution: "@swc/helpers@npm:0.5.15"
"@swc/helpers@npm:0.5.23":
version: 0.5.23
resolution: "@swc/helpers@npm:0.5.23"
dependencies:
tslib: "npm:^2.8.0"
checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4
checksum: 10c0/02da7b4df465693933ecd4851cc193ec729c309939c8a84eccae5ec0010aafc3894e713b8ef8d13a6ba401759f0e900c88e2dcfef5872c27bb91e70f73275cce
languageName: node
linkType: hard

Expand DownExpand Up@@ -18302,24 +18302,24 @@ __metadata:
languageName: node
linkType: hard

"next@npm:^16.2.11":
version: 16.2.11
resolution: "next@npm:16.2.11"
"next@npm:^16.2.11, next@npm:^16.3.1":
version: 16.3.1
resolution: "next@npm:16.3.1"
dependencies:
"@next/env": "npm:16.2.11"
"@next/swc-darwin-arm64": "npm:16.2.11"
"@next/swc-darwin-x64": "npm:16.2.11"
"@next/swc-linux-arm64-gnu": "npm:16.2.11"
"@next/swc-linux-arm64-musl": "npm:16.2.11"
"@next/swc-linux-x64-gnu": "npm:16.2.11"
"@next/swc-linux-x64-musl": "npm:16.2.11"
"@next/swc-win32-arm64-msvc": "npm:16.2.11"
"@next/swc-win32-x64-msvc": "npm:16.2.11"
"@swc/helpers": "npm:0.5.15"
"@next/env": "npm:16.3.1"
"@next/swc-darwin-arm64": "npm:16.3.1"
"@next/swc-darwin-x64": "npm:16.3.1"
"@next/swc-linux-arm64-gnu": "npm:16.3.1"
"@next/swc-linux-arm64-musl": "npm:16.3.1"
"@next/swc-linux-x64-gnu": "npm:16.3.1"
"@next/swc-linux-x64-musl": "npm:16.3.1"
"@next/swc-win32-arm64-msvc": "npm:16.3.1"
"@next/swc-win32-x64-msvc": "npm:16.3.1"
"@swc/helpers": "npm:0.5.23"
baseline-browser-mapping: "npm:^2.9.19"
caniuse-lite: "npm:^1.0.30001579"
postcss: "npm:8.4.31"
sharp: "npm:^0.34.5"
postcss: "npm:8.5.23"
sharp: "npm:^0.35.3"
styled-jsx: "npm:5.1.6"
peerDependencies:
"@opentelemetry/api": ^1.1.0
Expand DownExpand Up@@ -18358,7 +18358,7 @@ __metadata:
optional: true
bin:
next: dist/bin/next
checksum: 10c0/81f85262cf01ad6b4fd4a8be369925dfe206806a33e967733033d7adcf367aa0ba1f911272de6169a3d09315821eddf6b57594337a456ad134ba5aa8870a80b1
checksum: 10c0/a071c6fdb9d02fc97b520d2c94aacfce693cf1847287129e0eaec42e8715433d925d165b8c800aff102f40820c8cf4a2e0306905d4d9912b5864a16e4f223bf0
languageName: node
linkType: hard

Expand DownExpand Up@@ -19395,6 +19395,17 @@ __metadata:
languageName: node
linkType: hard

"postcss@npm:8.5.23":
version: 8.5.23
resolution: "postcss@npm:8.5.23"
dependencies:
nanoid: "npm:^3.3.16"
picocolors: "npm:^1.1.1"
source-map-js: "npm:^1.2.1"
checksum: 10c0/ed714e635b330bb42666ecdd0c0b4f30224ded15b0b0052d6bc2b92832f2cf17d1c1141359453f96f0a84f8fbf4c405a74df187f559163b8f31131b2535455aa
languageName: node
linkType: hard

"postcss@npm:^8.4.47, postcss@npm:^8.5.12, postcss@npm:^8.5.15":
version: 8.5.25
resolution: "postcss@npm:8.5.25"
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
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 numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Fixed
- Upgraded Next.js to 16.3.1 to bound memory retained by high-cardinality dynamic route cache entries. [#1594](https://github.com/sourcebot-dev/sourcebot/pull/1594)
Comment thread
brendan-kellam marked this conversation as resolved.
- Fixed memory leak attributed to CodeMirror allocating objects on heap that were never freed. [#1580](https://github.com/sourcebot-dev/sourcebot/pull/1580)
- Kept Git provider credentials out of subprocess arguments and on-disk configuration by using isolated in-memory credential caches. [#1584](https://github.com/sourcebot-dev/sourcebot/pull/1584)

Expand Down
2 changes: 1 addition & 1 deletion packages/web/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -162,7 +162,7 @@
"micromatch": "^4.0.8",
"minidenticons": "^4.2.1",
"motion": "^12.42.0",
"next": "^16.2.11",
"next": "^16.3.1",
"next-auth": "^5.0.0-beta.32",
"next-navigation-guard": "^0.2.0",
"next-themes": "^0.3.0",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,7 @@ afterEach(() => {
// A minimal underlying App Router for the guard library to wrap. Without an
// outer router there is nothing to intercept, so the guard never engages.
const makeMockRouter = (): AppRouterInstance => ({
bfcacheId: "test",
push: vi.fn(),
replace: vi.fn(),
refresh: vi.fn(),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,7 +68,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, SINGLE_REVIEW);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('line', 10);
expect(call).not.toHaveProperty('start_line');
});
Expand All@@ -84,7 +84,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, multiLineReviews);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('start_line', 5);
expect(call).toHaveProperty('line', 15);
expect(call).toHaveProperty('start_side', 'RIGHT');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,7 +48,11 @@ const MOCK_MR_API_RESPONSE = {
},
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: Partial<typeof MOCK_MR_API_RESPONSE> = {}) {
type MockMrApiResponseOverrides = Omit<Partial<typeof MOCK_MR_API_RESPONSE>, 'description'> & {
description?: string | null;
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: MockMrApiResponseOverrides = {}) {
return {
MergeRequests: {
show: vi.fn().mockResolvedValue({ ...MOCK_MR_API_RESPONSE, ...mrOverrides }),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -101,7 +101,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('src/foo.ts');
});

Expand All@@ -116,7 +116,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, multiLineReviews);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('10');
expect(noteBody).toContain('20');
expect(noteBody).toContain('Refactor this block');
Expand DownExpand Up@@ -272,9 +272,9 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, payloadWithDiffs, addedLineReview);

const call = client.MergeRequestDiscussions.create.mock.calls[0][3];
expect(call.position).not.toHaveProperty('oldLine');
expect(call.position.newLine).toBe('2');
const position = vi.mocked(client.MergeRequestDiscussions.create).mock.calls[0]![3]!.position!;
expect(position).not.toHaveProperty('oldLine');
expect(position.newLine).toBe('2');
});

test('uses new path for both oldPath and newPath when old path is /dev/null (added file)', async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/features/git/getFileSourceApi.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -83,7 +83,7 @@ describe('getFileSourceForRepo', () => {

const mockPrisma = {
repo: { findFirst: mockFindFirst },
} as Parameters<typeof getFileSourceForRepo>[1]['prisma'];
} as unknown as Parameters<typeof getFileSourceForRepo>[1]['prisma'];

beforeEach(() => {
vi.clearAllMocks();
Expand Down
1 change: 1 addition & 0 deletions packages/web/src/features/mcp/prismaScope.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,6 +10,7 @@ const user = {
emailVerified: null,
image: null,
sessionVersion: 0,
lastActiveAt: null,
createdAt: new Date('2026-01-01T00:00:00Z'),
updatedAt: new Date('2026-01-01T00:00:00Z'),
accounts: [],
Expand Down
9 changes: 9 additions & 0 deletions packages/web/src/middleware/withAuth.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1053,6 +1053,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand DownExpand Up@@ -1080,6 +1083,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand All@@ -1101,6 +1107,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
prisma.apiKey.findUnique.mockResolvedValue({ ...MOCK_API_KEY, hash: 'apikey', createdById: userId });
setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' }));
Expand Down
109 changes: 60 additions & 49 deletions yarn.lock
Original file line numberDiff line numberDiff line change
Expand Up@@ -3714,10 +3714,10 @@ __metadata:
languageName: node
linkType: hard

"@next/env@npm:16.2.11":
version: 16.2.11
resolution: "@next/env@npm:16.2.11"
checksum: 10c0/fdb5ff54037f5e554c7452a31f745e40a02ea55416b80c9abf5ebb3b6fba54beaa15e080fc8470f9a59b3a0506c7ce775764134256d413f17e17e4f92802cee3
"@next/env@npm:16.3.1":
version: 16.3.1
resolution: "@next/env@npm:16.3.1"
checksum: 10c0/c2c61e12c31a8d3be6738fc18b4d7c1e6a151336fb386b4eff8961ee0c72cabb33867febe903a2aacf26aed75be9aa77d4947b15c45162fc0279c0f612884f5a
languageName: node
linkType: hard

Expand All@@ -3730,58 +3730,58 @@ __metadata:
languageName: node
linkType: hard

"@next/swc-darwin-arm64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-arm64@npm:16.2.11"
"@next/swc-darwin-arm64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-arm64@npm:16.3.1"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard

"@next/swc-darwin-x64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-x64@npm:16.2.11"
"@next/swc-darwin-x64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-x64@npm:16.3.1"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard

"@next/swc-linux-arm64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-gnu@npm:16.2.11"
"@next/swc-linux-arm64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-gnu@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-arm64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-musl@npm:16.2.11"
"@next/swc-linux-arm64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-musl@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard

"@next/swc-linux-x64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-gnu@npm:16.2.11"
"@next/swc-linux-x64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-gnu@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-x64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-musl@npm:16.2.11"
"@next/swc-linux-x64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-musl@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard

"@next/swc-win32-arm64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-arm64-msvc@npm:16.2.11"
"@next/swc-win32-arm64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-arm64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard

"@next/swc-win32-x64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-x64-msvc@npm:16.2.11"
"@next/swc-win32-x64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-x64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
Expand DownExpand Up@@ -9069,7 +9069,7 @@ __metadata:
micromatch: "npm:^4.0.8"
minidenticons: "npm:^4.2.1"
motion: "npm:^12.42.0"
next: "npm:^16.2.11"
next: "npm:^16.3.1"
next-auth: "npm:^5.0.0-beta.32"
next-navigation-guard: "npm:^0.2.0"
next-themes: "npm:^0.3.0"
Expand DownExpand Up@@ -9156,12 +9156,12 @@ __metadata:
languageName: node
linkType: hard

"@swc/helpers@npm:0.5.15":
version: 0.5.15
resolution: "@swc/helpers@npm:0.5.15"
"@swc/helpers@npm:0.5.23":
version: 0.5.23
resolution: "@swc/helpers@npm:0.5.23"
dependencies:
tslib: "npm:^2.8.0"
checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4
checksum: 10c0/02da7b4df465693933ecd4851cc193ec729c309939c8a84eccae5ec0010aafc3894e713b8ef8d13a6ba401759f0e900c88e2dcfef5872c27bb91e70f73275cce
languageName: node
linkType: hard

Expand DownExpand Up@@ -18302,24 +18302,24 @@ __metadata:
languageName: node
linkType: hard

"next@npm:^16.2.11":
version: 16.2.11
resolution: "next@npm:16.2.11"
"next@npm:^16.2.11, next@npm:^16.3.1":
version: 16.3.1
resolution: "next@npm:16.3.1"
dependencies:
"@next/env": "npm:16.2.11"
"@next/swc-darwin-arm64": "npm:16.2.11"
"@next/swc-darwin-x64": "npm:16.2.11"
"@next/swc-linux-arm64-gnu": "npm:16.2.11"
"@next/swc-linux-arm64-musl": "npm:16.2.11"
"@next/swc-linux-x64-gnu": "npm:16.2.11"
"@next/swc-linux-x64-musl": "npm:16.2.11"
"@next/swc-win32-arm64-msvc": "npm:16.2.11"
"@next/swc-win32-x64-msvc": "npm:16.2.11"
"@swc/helpers": "npm:0.5.15"
"@next/env": "npm:16.3.1"
"@next/swc-darwin-arm64": "npm:16.3.1"
"@next/swc-darwin-x64": "npm:16.3.1"
"@next/swc-linux-arm64-gnu": "npm:16.3.1"
"@next/swc-linux-arm64-musl": "npm:16.3.1"
"@next/swc-linux-x64-gnu": "npm:16.3.1"
"@next/swc-linux-x64-musl": "npm:16.3.1"
"@next/swc-win32-arm64-msvc": "npm:16.3.1"
"@next/swc-win32-x64-msvc": "npm:16.3.1"
"@swc/helpers": "npm:0.5.23"
baseline-browser-mapping: "npm:^2.9.19"
caniuse-lite: "npm:^1.0.30001579"
postcss: "npm:8.4.31"
sharp: "npm:^0.34.5"
postcss: "npm:8.5.23"
sharp: "npm:^0.35.3"
styled-jsx: "npm:5.1.6"
peerDependencies:
"@opentelemetry/api": ^1.1.0
Expand DownExpand Up@@ -18358,7 +18358,7 @@ __metadata:
optional: true
bin:
next: dist/bin/next
checksum: 10c0/81f85262cf01ad6b4fd4a8be369925dfe206806a33e967733033d7adcf367aa0ba1f911272de6169a3d09315821eddf6b57594337a456ad134ba5aa8870a80b1
checksum: 10c0/a071c6fdb9d02fc97b520d2c94aacfce693cf1847287129e0eaec42e8715433d925d165b8c800aff102f40820c8cf4a2e0306905d4d9912b5864a16e4f223bf0
languageName: node
linkType: hard

Expand DownExpand Up@@ -19395,6 +19395,17 @@ __metadata:
languageName: node
linkType: hard

"postcss@npm:8.5.23":
version: 8.5.23
resolution: "postcss@npm:8.5.23"
dependencies:
nanoid: "npm:^3.3.16"
picocolors: "npm:^1.1.1"
source-map-js: "npm:^1.2.1"
checksum: 10c0/ed714e635b330bb42666ecdd0c0b4f30224ded15b0b0052d6bc2b92832f2cf17d1c1141359453f96f0a84f8fbf4c405a74df187f559163b8f31131b2535455aa
languageName: node
linkType: hard

"postcss@npm:^8.4.47, postcss@npm:^8.5.12, postcss@npm:^8.5.15":
version: 8.5.25
resolution: "postcss@npm:8.5.25"
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
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 numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Fixed
- Upgraded Next.js to 16.3.1 to bound memory retained by high-cardinality dynamic route cache entries. [#1594](https://github.com/sourcebot-dev/sourcebot/pull/1594)
Comment thread
brendan-kellam marked this conversation as resolved.
- Fixed memory leak attributed to CodeMirror allocating objects on heap that were never freed. [#1580](https://github.com/sourcebot-dev/sourcebot/pull/1580)
- Kept Git provider credentials out of subprocess arguments and on-disk configuration by using isolated in-memory credential caches. [#1584](https://github.com/sourcebot-dev/sourcebot/pull/1584)

Expand Down
2 changes: 1 addition & 1 deletion packages/web/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -162,7 +162,7 @@
"micromatch": "^4.0.8",
"minidenticons": "^4.2.1",
"motion": "^12.42.0",
"next": "^16.2.11",
"next": "^16.3.1",
"next-auth": "^5.0.0-beta.32",
"next-navigation-guard": "^0.2.0",
"next-themes": "^0.3.0",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,7 @@ afterEach(() => {
// A minimal underlying App Router for the guard library to wrap. Without an
// outer router there is nothing to intercept, so the guard never engages.
const makeMockRouter = (): AppRouterInstance => ({
bfcacheId: "test",
push: vi.fn(),
replace: vi.fn(),
refresh: vi.fn(),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,7 +68,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, SINGLE_REVIEW);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('line', 10);
expect(call).not.toHaveProperty('start_line');
});
Expand All@@ -84,7 +84,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, multiLineReviews);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('start_line', 5);
expect(call).toHaveProperty('line', 15);
expect(call).toHaveProperty('start_side', 'RIGHT');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,7 +48,11 @@ const MOCK_MR_API_RESPONSE = {
},
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: Partial<typeof MOCK_MR_API_RESPONSE> = {}) {
type MockMrApiResponseOverrides = Omit<Partial<typeof MOCK_MR_API_RESPONSE>, 'description'> & {
description?: string | null;
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: MockMrApiResponseOverrides = {}) {
return {
MergeRequests: {
show: vi.fn().mockResolvedValue({ ...MOCK_MR_API_RESPONSE, ...mrOverrides }),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -101,7 +101,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('src/foo.ts');
});

Expand All@@ -116,7 +116,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, multiLineReviews);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('10');
expect(noteBody).toContain('20');
expect(noteBody).toContain('Refactor this block');
Expand DownExpand Up@@ -272,9 +272,9 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, payloadWithDiffs, addedLineReview);

const call = client.MergeRequestDiscussions.create.mock.calls[0][3];
expect(call.position).not.toHaveProperty('oldLine');
expect(call.position.newLine).toBe('2');
const position = vi.mocked(client.MergeRequestDiscussions.create).mock.calls[0]![3]!.position!;
expect(position).not.toHaveProperty('oldLine');
expect(position.newLine).toBe('2');
});

test('uses new path for both oldPath and newPath when old path is /dev/null (added file)', async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/features/git/getFileSourceApi.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -83,7 +83,7 @@ describe('getFileSourceForRepo', () => {

const mockPrisma = {
repo: { findFirst: mockFindFirst },
} as Parameters<typeof getFileSourceForRepo>[1]['prisma'];
} as unknown as Parameters<typeof getFileSourceForRepo>[1]['prisma'];

beforeEach(() => {
vi.clearAllMocks();
Expand Down
1 change: 1 addition & 0 deletions packages/web/src/features/mcp/prismaScope.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,6 +10,7 @@ const user = {
emailVerified: null,
image: null,
sessionVersion: 0,
lastActiveAt: null,
createdAt: new Date('2026-01-01T00:00:00Z'),
updatedAt: new Date('2026-01-01T00:00:00Z'),
accounts: [],
Expand Down
9 changes: 9 additions & 0 deletions packages/web/src/middleware/withAuth.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1053,6 +1053,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand DownExpand Up@@ -1080,6 +1083,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand All@@ -1101,6 +1107,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
prisma.apiKey.findUnique.mockResolvedValue({ ...MOCK_API_KEY, hash: 'apikey', createdById: userId });
setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' }));
Expand Down
109 changes: 60 additions & 49 deletions yarn.lock
Original file line numberDiff line numberDiff line change
Expand Up@@ -3714,10 +3714,10 @@ __metadata:
languageName: node
linkType: hard

"@next/env@npm:16.2.11":
version: 16.2.11
resolution: "@next/env@npm:16.2.11"
checksum: 10c0/fdb5ff54037f5e554c7452a31f745e40a02ea55416b80c9abf5ebb3b6fba54beaa15e080fc8470f9a59b3a0506c7ce775764134256d413f17e17e4f92802cee3
"@next/env@npm:16.3.1":
version: 16.3.1
resolution: "@next/env@npm:16.3.1"
checksum: 10c0/c2c61e12c31a8d3be6738fc18b4d7c1e6a151336fb386b4eff8961ee0c72cabb33867febe903a2aacf26aed75be9aa77d4947b15c45162fc0279c0f612884f5a
languageName: node
linkType: hard

Expand All@@ -3730,58 +3730,58 @@ __metadata:
languageName: node
linkType: hard

"@next/swc-darwin-arm64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-arm64@npm:16.2.11"
"@next/swc-darwin-arm64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-arm64@npm:16.3.1"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard

"@next/swc-darwin-x64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-x64@npm:16.2.11"
"@next/swc-darwin-x64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-x64@npm:16.3.1"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard

"@next/swc-linux-arm64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-gnu@npm:16.2.11"
"@next/swc-linux-arm64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-gnu@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-arm64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-musl@npm:16.2.11"
"@next/swc-linux-arm64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-musl@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard

"@next/swc-linux-x64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-gnu@npm:16.2.11"
"@next/swc-linux-x64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-gnu@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-x64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-musl@npm:16.2.11"
"@next/swc-linux-x64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-musl@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard

"@next/swc-win32-arm64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-arm64-msvc@npm:16.2.11"
"@next/swc-win32-arm64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-arm64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard

"@next/swc-win32-x64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-x64-msvc@npm:16.2.11"
"@next/swc-win32-x64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-x64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
Expand DownExpand Up@@ -9069,7 +9069,7 @@ __metadata:
micromatch: "npm:^4.0.8"
minidenticons: "npm:^4.2.1"
motion: "npm:^12.42.0"
next: "npm:^16.2.11"
next: "npm:^16.3.1"
next-auth: "npm:^5.0.0-beta.32"
next-navigation-guard: "npm:^0.2.0"
next-themes: "npm:^0.3.0"
Expand DownExpand Up@@ -9156,12 +9156,12 @@ __metadata:
languageName: node
linkType: hard

"@swc/helpers@npm:0.5.15":
version: 0.5.15
resolution: "@swc/helpers@npm:0.5.15"
"@swc/helpers@npm:0.5.23":
version: 0.5.23
resolution: "@swc/helpers@npm:0.5.23"
dependencies:
tslib: "npm:^2.8.0"
checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4
checksum: 10c0/02da7b4df465693933ecd4851cc193ec729c309939c8a84eccae5ec0010aafc3894e713b8ef8d13a6ba401759f0e900c88e2dcfef5872c27bb91e70f73275cce
languageName: node
linkType: hard

Expand DownExpand Up@@ -18302,24 +18302,24 @@ __metadata:
languageName: node
linkType: hard

"next@npm:^16.2.11":
version: 16.2.11
resolution: "next@npm:16.2.11"
"next@npm:^16.2.11, next@npm:^16.3.1":
version: 16.3.1
resolution: "next@npm:16.3.1"
dependencies:
"@next/env": "npm:16.2.11"
"@next/swc-darwin-arm64": "npm:16.2.11"
"@next/swc-darwin-x64": "npm:16.2.11"
"@next/swc-linux-arm64-gnu": "npm:16.2.11"
"@next/swc-linux-arm64-musl": "npm:16.2.11"
"@next/swc-linux-x64-gnu": "npm:16.2.11"
"@next/swc-linux-x64-musl": "npm:16.2.11"
"@next/swc-win32-arm64-msvc": "npm:16.2.11"
"@next/swc-win32-x64-msvc": "npm:16.2.11"
"@swc/helpers": "npm:0.5.15"
"@next/env": "npm:16.3.1"
"@next/swc-darwin-arm64": "npm:16.3.1"
"@next/swc-darwin-x64": "npm:16.3.1"
"@next/swc-linux-arm64-gnu": "npm:16.3.1"
"@next/swc-linux-arm64-musl": "npm:16.3.1"
"@next/swc-linux-x64-gnu": "npm:16.3.1"
"@next/swc-linux-x64-musl": "npm:16.3.1"
"@next/swc-win32-arm64-msvc": "npm:16.3.1"
"@next/swc-win32-x64-msvc": "npm:16.3.1"
"@swc/helpers": "npm:0.5.23"
baseline-browser-mapping: "npm:^2.9.19"
caniuse-lite: "npm:^1.0.30001579"
postcss: "npm:8.4.31"
sharp: "npm:^0.34.5"
postcss: "npm:8.5.23"
sharp: "npm:^0.35.3"
styled-jsx: "npm:5.1.6"
peerDependencies:
"@opentelemetry/api": ^1.1.0
Expand DownExpand Up@@ -18358,7 +18358,7 @@ __metadata:
optional: true
bin:
next: dist/bin/next
checksum: 10c0/81f85262cf01ad6b4fd4a8be369925dfe206806a33e967733033d7adcf367aa0ba1f911272de6169a3d09315821eddf6b57594337a456ad134ba5aa8870a80b1
checksum: 10c0/a071c6fdb9d02fc97b520d2c94aacfce693cf1847287129e0eaec42e8715433d925d165b8c800aff102f40820c8cf4a2e0306905d4d9912b5864a16e4f223bf0
languageName: node
linkType: hard

Expand DownExpand Up@@ -19395,6 +19395,17 @@ __metadata:
languageName: node
linkType: hard

"postcss@npm:8.5.23":
version: 8.5.23
resolution: "postcss@npm:8.5.23"
dependencies:
nanoid: "npm:^3.3.16"
picocolors: "npm:^1.1.1"
source-map-js: "npm:^1.2.1"
checksum: 10c0/ed714e635b330bb42666ecdd0c0b4f30224ded15b0b0052d6bc2b92832f2cf17d1c1141359453f96f0a84f8fbf4c405a74df187f559163b8f31131b2535455aa
languageName: node
linkType: hard

"postcss@npm:^8.4.47, postcss@npm:^8.5.12, postcss@npm:^8.5.15":
version: 8.5.25
resolution: "postcss@npm:8.5.25"
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
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 numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Fixed
- Upgraded Next.js to 16.3.1 to bound memory retained by high-cardinality dynamic route cache entries. [#1594](https://github.com/sourcebot-dev/sourcebot/pull/1594)
Comment thread
brendan-kellam marked this conversation as resolved.
- Fixed memory leak attributed to CodeMirror allocating objects on heap that were never freed. [#1580](https://github.com/sourcebot-dev/sourcebot/pull/1580)
- Kept Git provider credentials out of subprocess arguments and on-disk configuration by using isolated in-memory credential caches. [#1584](https://github.com/sourcebot-dev/sourcebot/pull/1584)

Expand Down
2 changes: 1 addition & 1 deletion packages/web/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -162,7 +162,7 @@
"micromatch": "^4.0.8",
"minidenticons": "^4.2.1",
"motion": "^12.42.0",
"next": "^16.2.11",
"next": "^16.3.1",
"next-auth": "^5.0.0-beta.32",
"next-navigation-guard": "^0.2.0",
"next-themes": "^0.3.0",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,7 @@ afterEach(() => {
// A minimal underlying App Router for the guard library to wrap. Without an
// outer router there is nothing to intercept, so the guard never engages.
const makeMockRouter = (): AppRouterInstance => ({
bfcacheId: "test",
push: vi.fn(),
replace: vi.fn(),
refresh: vi.fn(),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,7 +68,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, SINGLE_REVIEW);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('line', 10);
expect(call).not.toHaveProperty('start_line');
});
Expand All@@ -84,7 +84,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, multiLineReviews);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('start_line', 5);
expect(call).toHaveProperty('line', 15);
expect(call).toHaveProperty('start_side', 'RIGHT');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,7 +48,11 @@ const MOCK_MR_API_RESPONSE = {
},
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: Partial<typeof MOCK_MR_API_RESPONSE> = {}) {
type MockMrApiResponseOverrides = Omit<Partial<typeof MOCK_MR_API_RESPONSE>, 'description'> & {
description?: string | null;
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: MockMrApiResponseOverrides = {}) {
return {
MergeRequests: {
show: vi.fn().mockResolvedValue({ ...MOCK_MR_API_RESPONSE, ...mrOverrides }),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -101,7 +101,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('src/foo.ts');
});

Expand All@@ -116,7 +116,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, multiLineReviews);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('10');
expect(noteBody).toContain('20');
expect(noteBody).toContain('Refactor this block');
Expand DownExpand Up@@ -272,9 +272,9 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, payloadWithDiffs, addedLineReview);

const call = client.MergeRequestDiscussions.create.mock.calls[0][3];
expect(call.position).not.toHaveProperty('oldLine');
expect(call.position.newLine).toBe('2');
const position = vi.mocked(client.MergeRequestDiscussions.create).mock.calls[0]![3]!.position!;
expect(position).not.toHaveProperty('oldLine');
expect(position.newLine).toBe('2');
});

test('uses new path for both oldPath and newPath when old path is /dev/null (added file)', async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/features/git/getFileSourceApi.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -83,7 +83,7 @@ describe('getFileSourceForRepo', () => {

const mockPrisma = {
repo: { findFirst: mockFindFirst },
} as Parameters<typeof getFileSourceForRepo>[1]['prisma'];
} as unknown as Parameters<typeof getFileSourceForRepo>[1]['prisma'];

beforeEach(() => {
vi.clearAllMocks();
Expand Down
1 change: 1 addition & 0 deletions packages/web/src/features/mcp/prismaScope.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,6 +10,7 @@ const user = {
emailVerified: null,
image: null,
sessionVersion: 0,
lastActiveAt: null,
createdAt: new Date('2026-01-01T00:00:00Z'),
updatedAt: new Date('2026-01-01T00:00:00Z'),
accounts: [],
Expand Down
9 changes: 9 additions & 0 deletions packages/web/src/middleware/withAuth.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1053,6 +1053,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand DownExpand Up@@ -1080,6 +1083,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand All@@ -1101,6 +1107,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
prisma.apiKey.findUnique.mockResolvedValue({ ...MOCK_API_KEY, hash: 'apikey', createdById: userId });
setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' }));
Expand Down
109 changes: 60 additions & 49 deletions yarn.lock
Original file line numberDiff line numberDiff line change
Expand Up@@ -3714,10 +3714,10 @@ __metadata:
languageName: node
linkType: hard

"@next/env@npm:16.2.11":
version: 16.2.11
resolution: "@next/env@npm:16.2.11"
checksum: 10c0/fdb5ff54037f5e554c7452a31f745e40a02ea55416b80c9abf5ebb3b6fba54beaa15e080fc8470f9a59b3a0506c7ce775764134256d413f17e17e4f92802cee3
"@next/env@npm:16.3.1":
version: 16.3.1
resolution: "@next/env@npm:16.3.1"
checksum: 10c0/c2c61e12c31a8d3be6738fc18b4d7c1e6a151336fb386b4eff8961ee0c72cabb33867febe903a2aacf26aed75be9aa77d4947b15c45162fc0279c0f612884f5a
languageName: node
linkType: hard

Expand All@@ -3730,58 +3730,58 @@ __metadata:
languageName: node
linkType: hard

"@next/swc-darwin-arm64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-arm64@npm:16.2.11"
"@next/swc-darwin-arm64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-arm64@npm:16.3.1"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard

"@next/swc-darwin-x64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-x64@npm:16.2.11"
"@next/swc-darwin-x64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-x64@npm:16.3.1"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard

"@next/swc-linux-arm64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-gnu@npm:16.2.11"
"@next/swc-linux-arm64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-gnu@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-arm64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-musl@npm:16.2.11"
"@next/swc-linux-arm64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-musl@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard

"@next/swc-linux-x64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-gnu@npm:16.2.11"
"@next/swc-linux-x64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-gnu@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-x64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-musl@npm:16.2.11"
"@next/swc-linux-x64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-musl@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard

"@next/swc-win32-arm64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-arm64-msvc@npm:16.2.11"
"@next/swc-win32-arm64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-arm64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard

"@next/swc-win32-x64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-x64-msvc@npm:16.2.11"
"@next/swc-win32-x64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-x64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
Expand DownExpand Up@@ -9069,7 +9069,7 @@ __metadata:
micromatch: "npm:^4.0.8"
minidenticons: "npm:^4.2.1"
motion: "npm:^12.42.0"
next: "npm:^16.2.11"
next: "npm:^16.3.1"
next-auth: "npm:^5.0.0-beta.32"
next-navigation-guard: "npm:^0.2.0"
next-themes: "npm:^0.3.0"
Expand DownExpand Up@@ -9156,12 +9156,12 @@ __metadata:
languageName: node
linkType: hard

"@swc/helpers@npm:0.5.15":
version: 0.5.15
resolution: "@swc/helpers@npm:0.5.15"
"@swc/helpers@npm:0.5.23":
version: 0.5.23
resolution: "@swc/helpers@npm:0.5.23"
dependencies:
tslib: "npm:^2.8.0"
checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4
checksum: 10c0/02da7b4df465693933ecd4851cc193ec729c309939c8a84eccae5ec0010aafc3894e713b8ef8d13a6ba401759f0e900c88e2dcfef5872c27bb91e70f73275cce
languageName: node
linkType: hard

Expand DownExpand Up@@ -18302,24 +18302,24 @@ __metadata:
languageName: node
linkType: hard

"next@npm:^16.2.11":
version: 16.2.11
resolution: "next@npm:16.2.11"
"next@npm:^16.2.11, next@npm:^16.3.1":
version: 16.3.1
resolution: "next@npm:16.3.1"
dependencies:
"@next/env": "npm:16.2.11"
"@next/swc-darwin-arm64": "npm:16.2.11"
"@next/swc-darwin-x64": "npm:16.2.11"
"@next/swc-linux-arm64-gnu": "npm:16.2.11"
"@next/swc-linux-arm64-musl": "npm:16.2.11"
"@next/swc-linux-x64-gnu": "npm:16.2.11"
"@next/swc-linux-x64-musl": "npm:16.2.11"
"@next/swc-win32-arm64-msvc": "npm:16.2.11"
"@next/swc-win32-x64-msvc": "npm:16.2.11"
"@swc/helpers": "npm:0.5.15"
"@next/env": "npm:16.3.1"
"@next/swc-darwin-arm64": "npm:16.3.1"
"@next/swc-darwin-x64": "npm:16.3.1"
"@next/swc-linux-arm64-gnu": "npm:16.3.1"
"@next/swc-linux-arm64-musl": "npm:16.3.1"
"@next/swc-linux-x64-gnu": "npm:16.3.1"
"@next/swc-linux-x64-musl": "npm:16.3.1"
"@next/swc-win32-arm64-msvc": "npm:16.3.1"
"@next/swc-win32-x64-msvc": "npm:16.3.1"
"@swc/helpers": "npm:0.5.23"
baseline-browser-mapping: "npm:^2.9.19"
caniuse-lite: "npm:^1.0.30001579"
postcss: "npm:8.4.31"
sharp: "npm:^0.34.5"
postcss: "npm:8.5.23"
sharp: "npm:^0.35.3"
styled-jsx: "npm:5.1.6"
peerDependencies:
"@opentelemetry/api": ^1.1.0
Expand DownExpand Up@@ -18358,7 +18358,7 @@ __metadata:
optional: true
bin:
next: dist/bin/next
checksum: 10c0/81f85262cf01ad6b4fd4a8be369925dfe206806a33e967733033d7adcf367aa0ba1f911272de6169a3d09315821eddf6b57594337a456ad134ba5aa8870a80b1
checksum: 10c0/a071c6fdb9d02fc97b520d2c94aacfce693cf1847287129e0eaec42e8715433d925d165b8c800aff102f40820c8cf4a2e0306905d4d9912b5864a16e4f223bf0
languageName: node
linkType: hard

Expand DownExpand Up@@ -19395,6 +19395,17 @@ __metadata:
languageName: node
linkType: hard

"postcss@npm:8.5.23":
version: 8.5.23
resolution: "postcss@npm:8.5.23"
dependencies:
nanoid: "npm:^3.3.16"
picocolors: "npm:^1.1.1"
source-map-js: "npm:^1.2.1"
checksum: 10c0/ed714e635b330bb42666ecdd0c0b4f30224ded15b0b0052d6bc2b92832f2cf17d1c1141359453f96f0a84f8fbf4c405a74df187f559163b8f31131b2535455aa
languageName: node
linkType: hard

"postcss@npm:^8.4.47, postcss@npm:^8.5.12, postcss@npm:^8.5.15":
version: 8.5.25
resolution: "postcss@npm:8.5.25"
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
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 numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Fixed
- Upgraded Next.js to 16.3.1 to bound memory retained by high-cardinality dynamic route cache entries. [#1594](https://github.com/sourcebot-dev/sourcebot/pull/1594)
Comment thread
brendan-kellam marked this conversation as resolved.
- Fixed memory leak attributed to CodeMirror allocating objects on heap that were never freed. [#1580](https://github.com/sourcebot-dev/sourcebot/pull/1580)
- Kept Git provider credentials out of subprocess arguments and on-disk configuration by using isolated in-memory credential caches. [#1584](https://github.com/sourcebot-dev/sourcebot/pull/1584)

Expand Down
2 changes: 1 addition & 1 deletion packages/web/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -162,7 +162,7 @@
"micromatch": "^4.0.8",
"minidenticons": "^4.2.1",
"motion": "^12.42.0",
"next": "^16.2.11",
"next": "^16.3.1",
"next-auth": "^5.0.0-beta.32",
"next-navigation-guard": "^0.2.0",
"next-themes": "^0.3.0",
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,7 @@ afterEach(() => {
// A minimal underlying App Router for the guard library to wrap. Without an
// outer router there is nothing to intercept, so the guard never engages.
const makeMockRouter = (): AppRouterInstance => ({
bfcacheId: "test",
push: vi.fn(),
replace: vi.fn(),
refresh: vi.fn(),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,7 +68,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, SINGLE_REVIEW);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('line', 10);
expect(call).not.toHaveProperty('start_line');
});
Expand All@@ -84,7 +84,7 @@ describe('githubPushPrReviews', () => {

await githubPushPrReviews(octokit, MOCK_PAYLOAD, multiLineReviews);

const call = octokit.rest.pulls.createReviewComment.mock.calls[0][0];
const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0];
expect(call).toHaveProperty('start_line', 5);
expect(call).toHaveProperty('line', 15);
expect(call).toHaveProperty('start_side', 'RIGHT');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,7 +48,11 @@ const MOCK_MR_API_RESPONSE = {
},
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: Partial<typeof MOCK_MR_API_RESPONSE> = {}) {
type MockMrApiResponseOverrides = Omit<Partial<typeof MOCK_MR_API_RESPONSE>, 'description'> & {
description?: string | null;
};

function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: MockMrApiResponseOverrides = {}) {
return {
MergeRequests: {
show: vi.fn().mockResolvedValue({ ...MOCK_MR_API_RESPONSE, ...mrOverrides }),
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -101,7 +101,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('src/foo.ts');
});

Expand All@@ -116,7 +116,7 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, multiLineReviews);

const noteBody = client.MergeRequestNotes.create.mock.calls[0][2] as string;
const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string;
expect(noteBody).toContain('10');
expect(noteBody).toContain('20');
expect(noteBody).toContain('Refactor this block');
Expand DownExpand Up@@ -272,9 +272,9 @@ describe('gitlabPushMrReviews', () => {

await gitlabPushMrReviews(client, 101, payloadWithDiffs, addedLineReview);

const call = client.MergeRequestDiscussions.create.mock.calls[0][3];
expect(call.position).not.toHaveProperty('oldLine');
expect(call.position.newLine).toBe('2');
const position = vi.mocked(client.MergeRequestDiscussions.create).mock.calls[0]![3]!.position!;
expect(position).not.toHaveProperty('oldLine');
expect(position.newLine).toBe('2');
});

test('uses new path for both oldPath and newPath when old path is /dev/null (added file)', async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/features/git/getFileSourceApi.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -83,7 +83,7 @@ describe('getFileSourceForRepo', () => {

const mockPrisma = {
repo: { findFirst: mockFindFirst },
} as Parameters<typeof getFileSourceForRepo>[1]['prisma'];
} as unknown as Parameters<typeof getFileSourceForRepo>[1]['prisma'];

beforeEach(() => {
vi.clearAllMocks();
Expand Down
1 change: 1 addition & 0 deletions packages/web/src/features/mcp/prismaScope.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,6 +10,7 @@ const user = {
emailVerified: null,
image: null,
sessionVersion: 0,
lastActiveAt: null,
createdAt: new Date('2026-01-01T00:00:00Z'),
updatedAt: new Date('2026-01-01T00:00:00Z'),
accounts: [],
Expand Down
9 changes: 9 additions & 0 deletions packages/web/src/middleware/withAuth.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -1053,6 +1053,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand DownExpand Up@@ -1080,6 +1083,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' }));

Expand All@@ -1101,6 +1107,9 @@ describe('getAuthContext', () => {
userId,
orgId: MOCK_ORG.id,
role: OrgRole.MEMBER,
suspendedAt: null,
scimExternalId: null,
lastActiveAt: null,
});
prisma.apiKey.findUnique.mockResolvedValue({ ...MOCK_API_KEY, hash: 'apikey', createdById: userId });
setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' }));
Expand Down
109 changes: 60 additions & 49 deletions yarn.lock
Original file line numberDiff line numberDiff line change
Expand Up@@ -3714,10 +3714,10 @@ __metadata:
languageName: node
linkType: hard

"@next/env@npm:16.2.11":
version: 16.2.11
resolution: "@next/env@npm:16.2.11"
checksum: 10c0/fdb5ff54037f5e554c7452a31f745e40a02ea55416b80c9abf5ebb3b6fba54beaa15e080fc8470f9a59b3a0506c7ce775764134256d413f17e17e4f92802cee3
"@next/env@npm:16.3.1":
version: 16.3.1
resolution: "@next/env@npm:16.3.1"
checksum: 10c0/c2c61e12c31a8d3be6738fc18b4d7c1e6a151336fb386b4eff8961ee0c72cabb33867febe903a2aacf26aed75be9aa77d4947b15c45162fc0279c0f612884f5a
languageName: node
linkType: hard

Expand All@@ -3730,58 +3730,58 @@ __metadata:
languageName: node
linkType: hard

"@next/swc-darwin-arm64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-arm64@npm:16.2.11"
"@next/swc-darwin-arm64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-arm64@npm:16.3.1"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard

"@next/swc-darwin-x64@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-darwin-x64@npm:16.2.11"
"@next/swc-darwin-x64@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-darwin-x64@npm:16.3.1"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard

"@next/swc-linux-arm64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-gnu@npm:16.2.11"
"@next/swc-linux-arm64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-gnu@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-arm64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-arm64-musl@npm:16.2.11"
"@next/swc-linux-arm64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-arm64-musl@npm:16.3.1"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard

"@next/swc-linux-x64-gnu@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-gnu@npm:16.2.11"
"@next/swc-linux-x64-gnu@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-gnu@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard

"@next/swc-linux-x64-musl@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-linux-x64-musl@npm:16.2.11"
"@next/swc-linux-x64-musl@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-linux-x64-musl@npm:16.3.1"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard

"@next/swc-win32-arm64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-arm64-msvc@npm:16.2.11"
"@next/swc-win32-arm64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-arm64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard

"@next/swc-win32-x64-msvc@npm:16.2.11":
version: 16.2.11
resolution: "@next/swc-win32-x64-msvc@npm:16.2.11"
"@next/swc-win32-x64-msvc@npm:16.3.1":
version: 16.3.1
resolution: "@next/swc-win32-x64-msvc@npm:16.3.1"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
Expand DownExpand Up@@ -9069,7 +9069,7 @@ __metadata:
micromatch: "npm:^4.0.8"
minidenticons: "npm:^4.2.1"
motion: "npm:^12.42.0"
next: "npm:^16.2.11"
next: "npm:^16.3.1"
next-auth: "npm:^5.0.0-beta.32"
next-navigation-guard: "npm:^0.2.0"
next-themes: "npm:^0.3.0"
Expand DownExpand Up@@ -9156,12 +9156,12 @@ __metadata:
languageName: node
linkType: hard

"@swc/helpers@npm:0.5.15":
version: 0.5.15
resolution: "@swc/helpers@npm:0.5.15"
"@swc/helpers@npm:0.5.23":
version: 0.5.23
resolution: "@swc/helpers@npm:0.5.23"
dependencies:
tslib: "npm:^2.8.0"
checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4
checksum: 10c0/02da7b4df465693933ecd4851cc193ec729c309939c8a84eccae5ec0010aafc3894e713b8ef8d13a6ba401759f0e900c88e2dcfef5872c27bb91e70f73275cce
languageName: node
linkType: hard

Expand DownExpand Up@@ -18302,24 +18302,24 @@ __metadata:
languageName: node
linkType: hard

"next@npm:^16.2.11":
version: 16.2.11
resolution: "next@npm:16.2.11"
"next@npm:^16.2.11, next@npm:^16.3.1":
version: 16.3.1
resolution: "next@npm:16.3.1"
dependencies:
"@next/env": "npm:16.2.11"
"@next/swc-darwin-arm64": "npm:16.2.11"
"@next/swc-darwin-x64": "npm:16.2.11"
"@next/swc-linux-arm64-gnu": "npm:16.2.11"
"@next/swc-linux-arm64-musl": "npm:16.2.11"
"@next/swc-linux-x64-gnu": "npm:16.2.11"
"@next/swc-linux-x64-musl": "npm:16.2.11"
"@next/swc-win32-arm64-msvc": "npm:16.2.11"
"@next/swc-win32-x64-msvc": "npm:16.2.11"
"@swc/helpers": "npm:0.5.15"
"@next/env": "npm:16.3.1"
"@next/swc-darwin-arm64": "npm:16.3.1"
"@next/swc-darwin-x64": "npm:16.3.1"
"@next/swc-linux-arm64-gnu": "npm:16.3.1"
"@next/swc-linux-arm64-musl": "npm:16.3.1"
"@next/swc-linux-x64-gnu": "npm:16.3.1"
"@next/swc-linux-x64-musl": "npm:16.3.1"
"@next/swc-win32-arm64-msvc": "npm:16.3.1"
"@next/swc-win32-x64-msvc": "npm:16.3.1"
"@swc/helpers": "npm:0.5.23"
baseline-browser-mapping: "npm:^2.9.19"
caniuse-lite: "npm:^1.0.30001579"
postcss: "npm:8.4.31"
sharp: "npm:^0.34.5"
postcss: "npm:8.5.23"
sharp: "npm:^0.35.3"
styled-jsx: "npm:5.1.6"
peerDependencies:
"@opentelemetry/api": ^1.1.0
Expand DownExpand Up@@ -18358,7 +18358,7 @@ __metadata:
optional: true
bin:
next: dist/bin/next
checksum: 10c0/81f85262cf01ad6b4fd4a8be369925dfe206806a33e967733033d7adcf367aa0ba1f911272de6169a3d09315821eddf6b57594337a456ad134ba5aa8870a80b1
checksum: 10c0/a071c6fdb9d02fc97b520d2c94aacfce693cf1847287129e0eaec42e8715433d925d165b8c800aff102f40820c8cf4a2e0306905d4d9912b5864a16e4f223bf0
languageName: node
linkType: hard

Expand DownExpand Up@@ -19395,6 +19395,17 @@ __metadata:
languageName: node
linkType: hard

"postcss@npm:8.5.23":
version: 8.5.23
resolution: "postcss@npm:8.5.23"
dependencies:
nanoid: "npm:^3.3.16"
picocolors: "npm:^1.1.1"
source-map-js: "npm:^1.2.1"
checksum: 10c0/ed714e635b330bb42666ecdd0c0b4f30224ded15b0b0052d6bc2b92832f2cf17d1c1141359453f96f0a84f8fbf4c405a74df187f559163b8f31131b2535455aa
languageName: node
linkType: hard

"postcss@npm:^8.4.47, postcss@npm:^8.5.12, postcss@npm:^8.5.15":
version: 8.5.25
resolution: "postcss@npm:8.5.25"
Expand Down
Loading