From 3339165d4fc44ab7cf549ca0c41f8916919d684e Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Wed, 29 Jul 2026 16:02:38 -0700 Subject: [PATCH] fix(opencode): honor scanner config directory Co-authored-by: Orca --- .../session-scanner-opencode-sources.test.ts | 50 ++++++++++++++++++- .../opencode/opencode-data-directory.test.ts | 23 +++++++-- src/main/opencode/opencode-data-directory.ts | 6 ++- 3 files changed, 72 insertions(+), 7 deletions(-) diff --git a/src/main/ai-vault/session-scanner-opencode-sources.test.ts b/src/main/ai-vault/session-scanner-opencode-sources.test.ts index 12ca270871a..939a44f39d4 100644 --- a/src/main/ai-vault/session-scanner-opencode-sources.test.ts +++ b/src/main/ai-vault/session-scanner-opencode-sources.test.ts @@ -21,9 +21,55 @@ describe('opencodeDiscoveries', () => { vi.clearAllMocks() }) - it('discovers local storage from the OpenCode XDG data directory', async () => { + it('prefers the OpenCode config directory for local storage', async () => { vi.stubEnv('XDG_DATA_HOME', '/xdg/data') - vi.stubEnv('OPENCODE_CONFIG_DIR', '/opencode/config') + vi.stubEnv('OPENCODE_CONFIG_DIR', ' /opencode/config ') + listOpenCodeDatabasesMock.mockResolvedValue([]) + discoverOpenCodeSessionsMock.mockResolvedValue({ + agent: 'opencode', + rootDir: '/opencode/config/storage', + files: [] + }) + const issues = [] + + await Promise.all(opencodeDiscoveries({}, [], 25, issues)) + + expect(discoverOpenCodeSessionsMock).toHaveBeenCalledWith({ + storageDir: join('/opencode/config', 'storage'), + dbPaths: [], + limitPerAgent: 25, + issues + }) + }) + + it('keeps WSL discovery on the guest data path', async () => { + vi.stubEnv('OPENCODE_CONFIG_DIR', '/windows/opencode/config') + discoverOpenCodeSessionsMock.mockResolvedValue({ + agent: 'opencode', + rootDir: '/home/wsl/.local/share/opencode/storage', + files: [] + }) + const issues = [] + + await Promise.all(opencodeDiscoveries({ opencodeDbPaths: [] }, ['/home/wsl'], 25, issues)) + + expect(discoverOpenCodeSessionsMock).toHaveBeenNthCalledWith(1, { + storageDir: join('/windows/opencode/config', 'storage'), + dbPaths: [], + limitPerAgent: 25, + issues + }) + expect(discoverOpenCodeSessionsMock).toHaveBeenNthCalledWith(2, { + storageDir: join('/home/wsl', '.local', 'share', 'opencode', 'storage'), + dbPaths: [], + limitPerAgent: 25, + issues + }) + }) + + it('falls back to the OpenCode XDG data directory', async () => { + vi.stubEnv('XDG_DATA_HOME', '/xdg/data') + vi.stubEnv('OPENCODE_CONFIG_DIR', ' ') listOpenCodeDatabasesMock.mockResolvedValue([]) discoverOpenCodeSessionsMock.mockResolvedValue({ agent: 'opencode', diff --git a/src/main/opencode/opencode-data-directory.test.ts b/src/main/opencode/opencode-data-directory.test.ts index e3b9073aa17..11dcc05f90c 100644 --- a/src/main/opencode/opencode-data-directory.test.ts +++ b/src/main/opencode/opencode-data-directory.test.ts @@ -38,9 +38,24 @@ describe('resolveOpenCodeDataDirectory', () => { } ) - it('derives legacy storage from the same data directory', () => { - expect(resolveOpenCodeStorageDirectory({}, '/users/test')).toBe( - join('/users/test', '.local', 'share', 'opencode', 'storage') - ) + it('prefers OPENCODE_CONFIG_DIR for legacy storage', () => { + expect( + resolveOpenCodeStorageDirectory( + { + OPENCODE_CONFIG_DIR: ' /custom/config ', + XDG_DATA_HOME: '/custom/data' + }, + '/users/test' + ) + ).toBe(join('/custom/config', 'storage')) + }) + + it('derives legacy storage from the data directory without a config override', () => { + expect( + resolveOpenCodeStorageDirectory( + { OPENCODE_CONFIG_DIR: ' ', XDG_DATA_HOME: '/custom/data' }, + '/users/test' + ) + ).toBe(join('/custom/data', 'opencode', 'storage')) }) }) diff --git a/src/main/opencode/opencode-data-directory.ts b/src/main/opencode/opencode-data-directory.ts index b3db5598cee..b9aa5fa7678 100644 --- a/src/main/opencode/opencode-data-directory.ts +++ b/src/main/opencode/opencode-data-directory.ts @@ -13,5 +13,9 @@ export function resolveOpenCodeStorageDirectory( environment: NodeJS.ProcessEnv = process.env, homeDirectory = homedir() ): string { - return join(resolveOpenCodeDataDirectory(environment, homeDirectory), 'storage') + const configDirectory = environment.OPENCODE_CONFIG_DIR?.trim() + return join( + configDirectory || resolveOpenCodeDataDirectory(environment, homeDirectory), + 'storage' + ) }