Skip to content

Commit 2d78110

Browse files
committed
fix(watcher): queue refresh during indexing
1 parent f300961 commit 2d78110

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

src/index.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@ const indexState: IndexState = {
252252
status: 'idle'
253253
};
254254

255+
let autoRefreshQueued = false;
256+
255257
const server: Server = new Server(
256258
{
257259
name: 'codebase-context',
@@ -512,7 +514,7 @@ async function extractGitMemories(): Promise<number> {
512514
return added;
513515
}
514516

515-
async function performIndexing(incrementalOnly?: boolean): Promise<void> {
517+
async function performIndexingOnce(incrementalOnly?: boolean): Promise<void> {
516518
indexState.status = 'indexing';
517519
const mode = incrementalOnly ? 'incremental' : 'full';
518520
console.error(`Indexing (${mode}): ${ROOT_PATH}`);
@@ -566,6 +568,22 @@ async function performIndexing(incrementalOnly?: boolean): Promise<void> {
566568
}
567569
}
568570

571+
async function performIndexing(incrementalOnly?: boolean): Promise<void> {
572+
let nextMode = incrementalOnly;
573+
for (;;) {
574+
await performIndexingOnce(nextMode);
575+
576+
const shouldRunQueuedRefresh = autoRefreshQueued && indexState.status === 'ready';
577+
autoRefreshQueued = false;
578+
if (!shouldRunQueuedRefresh) return;
579+
580+
if (process.env.CODEBASE_CONTEXT_DEBUG) {
581+
console.error('[file-watcher] Running queued auto-refresh');
582+
}
583+
nextMode = true;
584+
}
585+
}
586+
569587
async function shouldReindex(): Promise<boolean> {
570588
const indexPath = PATHS.keywordIndex;
571589
try {
@@ -735,13 +753,16 @@ async function main() {
735753
debounceMs,
736754
onChanged: () => {
737755
if (indexState.status === 'indexing') {
756+
autoRefreshQueued = true;
738757
if (process.env.CODEBASE_CONTEXT_DEBUG) {
739-
console.error('[file-watcher] Index in progress — skipping auto-refresh');
758+
console.error('[file-watcher] Index in progress — queueing auto-refresh');
740759
}
741760
return;
742761
}
743-
console.error('[file-watcher] Changes detected — incremental reindex starting');
744-
performIndexing(true);
762+
if (process.env.CODEBASE_CONTEXT_DEBUG) {
763+
console.error('[file-watcher] Changes detected — incremental reindex starting');
764+
}
765+
void performIndexing(true);
745766
}
746767
});
747768

tests/file-watcher.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ describe('FileWatcher', () => {
4949
});
5050

5151
try {
52+
// Give chokidar a moment to finish initializing before the first write
53+
await new Promise((resolve) => setTimeout(resolve, 100));
5254
// Write 5 files in quick succession — all within the debounce window
5355
for (let i = 0; i < 5; i++) {
5456
await fs.writeFile(path.join(tempDir, `file${i}.ts`), `export const x${i} = ${i};`);
@@ -72,6 +74,8 @@ describe('FileWatcher', () => {
7274
onChanged: () => { callCount++; },
7375
});
7476

77+
// Give chokidar a moment to finish initializing before the first write
78+
await new Promise((resolve) => setTimeout(resolve, 100));
7579
await fs.writeFile(path.join(tempDir, 'cancel.ts'), 'export const y = 99;');
7680
// Let chokidar detect the event but stop before debounce fires
7781
await new Promise((resolve) => setTimeout(resolve, 150));

0 commit comments

Comments
 (0)