From d1e25af0ae00d2fbb3dd76c39db8a3c651bd2fa2 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Fri, 13 Nov 2026 13:59:29 -0800 Subject: [PATCH] Correct mutable read checks and fixture type annotations --- .../session-search-codex-aliases.test.ts | 8 +++++--- .../indexing/session-search-index-pass.ts | 7 ++++--- .../session-scanner-candidate-parse.ts | 8 ++++++-- .../session-scanner-codex-dual-root.test.ts | 19 +++++++++++++------ 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/main/ai-vault-search/indexing/session-search-codex-aliases.test.ts b/src/main/ai-vault-search/indexing/session-search-codex-aliases.test.ts index 660d9cbc239..141f0843abe 100644 --- a/src/main/ai-vault-search/indexing/session-search-codex-aliases.test.ts +++ b/src/main/ai-vault-search/indexing/session-search-codex-aliases.test.ts @@ -4,8 +4,10 @@ import { dirname, join } from 'node:path' import { Readable } from 'node:stream' import { afterEach, beforeEach, expect, it, vi } from 'vitest' import { resetSessionParseCacheForTests } from '../../ai-vault/parse-cache/session-parse-cache-store' -import { resetTranscriptConsumersForTests } from '../../ai-vault/transcripts/session-transcript-consumers' -import { registerTranscriptConsumer } from '../../ai-vault/transcripts/session-transcript-consumers' +import { + resetTranscriptConsumersForTests, + registerTranscriptConsumer +} from '../../ai-vault/transcripts/session-transcript-consumers' import { physicalSessionCandidates } from '../../ai-vault/session-scanner-types' import { isolatedScanRoots } from '../../ai-vault/scanner-fixtures/session-scanner-test-fixtures' import { @@ -21,7 +23,7 @@ import { type SessionSearchIndexFile } from '../storage/session-search-index-test-fixture' -const io = vi.hoisted(() => ({ failed: '', paths: [] as string[] })) +const io = vi.hoisted((): { failed: string; paths: string[] } => ({ failed: '', paths: [] })) vi.mock( '../../native-chat/transcript-filesystem/wsl-transcript-fs-access', async (importOriginal) => { diff --git a/src/main/ai-vault-search/indexing/session-search-index-pass.ts b/src/main/ai-vault-search/indexing/session-search-index-pass.ts index ab7a8bf39a6..bd2224070e6 100644 --- a/src/main/ai-vault-search/indexing/session-search-index-pass.ts +++ b/src/main/ai-vault-search/indexing/session-search-index-pass.ts @@ -32,12 +32,13 @@ export async function runSessionSearchIndexPass( ): Promise<{ stats: SessionParseStats; outOfTime: boolean; left: number }> { const stats = createSessionParseStats() const cutoffMs = store.retentionCutoff + const acceptsReads = () => store.acceptingReads !== false let read = 0 let outOfTime = false let left = 0 for (const choice of candidates) { throwIfAiVaultScanCancelled(options.signal) - if (store.acceptingReads === false) { + if (!acceptsReads()) { break } let deferred = false @@ -45,7 +46,7 @@ export async function runSessionSearchIndexPass( let admitted = false for (const candidate of physicalSessionCandidates(choice)) { throwIfAiVaultScanCancelled(options.signal) - if (store.acceptingReads === false) { + if (!acceptsReads()) { break } const path = candidate.file.path @@ -72,7 +73,7 @@ export async function runSessionSearchIndexPass( continue } throwIfAiVaultScanCancelled(options.signal) - if (store.acceptingReads === false) { + if (!acceptsReads()) { break } admitted = true diff --git a/src/main/ai-vault/parsing/session-scanner-candidate-parse.ts b/src/main/ai-vault/parsing/session-scanner-candidate-parse.ts index c93a29cfe3e..59977a1fcc7 100644 --- a/src/main/ai-vault/parsing/session-scanner-candidate-parse.ts +++ b/src/main/ai-vault/parsing/session-scanner-candidate-parse.ts @@ -1,5 +1,10 @@ import { isTranscriptSourceFailure } from './session-scanner-jsonl-reader' -import { physicalSessionCandidates, type SessionFileChoice } from '../session-scanner-types' +import { + physicalSessionCandidates, + type SessionFileCandidate, + type SessionFileChoice, + type SessionParseResult +} from '../session-scanner-types' import { yieldToEventLoop } from '../../../shared/event-loop-yield' import { isTextTaskRequestSession } from './text-task-request-sessions' import { candidateFileTime } from '../scanners/antigravity/antigravity-transcript-candidates' @@ -26,7 +31,6 @@ import { sessionParseCacheKey } from '../parse-cache/session-parse-cache-store' import { canStopParsingSessions } from './session-scan-cutoff' -import type { SessionFileCandidate, SessionParseResult } from '../session-scanner-types' import { throwIfAiVaultScanCancelled } from '../scan-lifecycle/ai-vault-scan-cancellation' import { noteAiVaultScanWorkChanged } from '../scan-lifecycle/ai-vault-scan-progress' diff --git a/src/main/ai-vault/scanners/codex/session-scanner-codex-dual-root.test.ts b/src/main/ai-vault/scanners/codex/session-scanner-codex-dual-root.test.ts index 636d3a968bf..f81afc87e47 100644 --- a/src/main/ai-vault/scanners/codex/session-scanner-codex-dual-root.test.ts +++ b/src/main/ai-vault/scanners/codex/session-scanner-codex-dual-root.test.ts @@ -9,12 +9,19 @@ import { sessionCandidatesFromDiscoveries } from '../../discovery/session-scanne import { scanAiVaultSessions } from '../../session-scanner' import { isolatedScanRoots, jsonLines } from '../../scanner-fixtures/session-scanner-test-fixtures' -const reads = vi.hoisted(() => ({ - failed: '', - failedSlice: '', - cancel: null as AbortController | null, - paths: [] as string[] -})) +const reads = vi.hoisted( + (): { + failed: string + failedSlice: string + cancel: AbortController | null + paths: string[] + } => ({ + failed: '', + failedSlice: '', + cancel: null, + paths: [] + }) +) vi.mock( '../../../native-chat/transcript-filesystem/wsl-transcript-fs-access', async (importOriginal) => {