fix: use selected vault for mcp bridge

This commit is contained in:
lucaronin
2026-04-28 02:13:24 +02:00
parent 49717dc671
commit e912ab9a9f
12 changed files with 283 additions and 24 deletions

View File

@@ -15,6 +15,7 @@ const mockInvokeFn = vi.fn((cmd: string, args?: Record<string, unknown>): Promis
return Promise.resolve(null)
}
if (cmd === 'get_default_vault_path') return Promise.resolve(mockDefaultVaultPath)
if (cmd === 'sync_mcp_bridge_vault') return Promise.resolve(args?.vaultPath ? 'started' : 'stopped')
if (cmd === 'check_vault_exists') return Promise.resolve(true)
return Promise.resolve(null)
})
@@ -56,6 +57,7 @@ describe('useVaultSwitcher', () => {
return Promise.resolve(null)
}
if (cmd === 'get_default_vault_path') return Promise.resolve(mockDefaultVaultPath)
if (cmd === 'sync_mcp_bridge_vault') return Promise.resolve(args?.vaultPath ? 'started' : 'stopped')
if (cmd === 'check_vault_exists') {
const checkVaultExists = overrides.checkVaultExists
return Promise.resolve(typeof checkVaultExists === 'function'
@@ -228,6 +230,46 @@ describe('useVaultSwitcher', () => {
expect(mockVaultListStore.active_vault).toBeNull()
})
it('stops the MCP bridge when there is no selected active vault', async () => {
await renderLoadedVaultSwitcher()
await waitFor(() => {
expect(mockInvokeFn).toHaveBeenCalledWith('sync_mcp_bridge_vault', { vaultPath: null })
})
})
it('syncs the MCP bridge to a persisted active vault', async () => {
mockVaultListStore = {
vaults: [{ label: 'Work', path: '/work/vault' }],
active_vault: '/work/vault',
hidden_defaults: [],
}
await renderLoadedVaultSwitcher()
await waitFor(() => {
expect(mockInvokeFn).toHaveBeenCalledWith('sync_mcp_bridge_vault', { vaultPath: '/work/vault' })
})
})
it('syncs the MCP bridge after switching vaults', async () => {
mockVaultListStore = {
vaults: [{ label: 'Work', path: '/work/vault' }],
active_vault: null,
hidden_defaults: [],
}
const { result } = await renderLoadedVaultSwitcher()
act(() => {
result.current.switchVault('/work/vault')
})
await waitFor(() => {
expect(mockInvokeFn).toHaveBeenCalledWith('sync_mcp_bridge_vault', { vaultPath: '/work/vault' })
})
})
it('keeps the implicit default vault out of the list when its path is missing', async () => {
setMockInvokeBehavior({ checkVaultExists: false })

View File

@@ -162,6 +162,17 @@ function syncDefaultVaultExport(path: string) {
DEFAULT_VAULTS[0] = { label: GETTING_STARTED_LABEL, path }
}
function selectedBridgeVaultPath(selectedVaultPath: string | null): string | null {
const path = selectedVaultPath?.trim()
return path ? path : null
}
async function syncMcpBridgeVault(selectedVaultPath: string | null): Promise<void> {
await tauriCall<string>('sync_mcp_bridge_vault', {
vaultPath: selectedBridgeVaultPath(selectedVaultPath),
})
}
function isCanonicalGettingStartedPath(path: string, resolvedDefaultPath: string): boolean {
return path === resolvedDefaultPath
}
@@ -522,6 +533,16 @@ function usePersistedVaultState(onSwitchRef: MutableRefObject<() => void>): Pers
}
}
function useMcpBridgeVaultSync(loaded: boolean, selectedVaultPath: string | null) {
useEffect(() => {
if (!loaded) return
syncMcpBridgeVault(selectedVaultPath).catch(err => {
console.warn('Failed to sync MCP bridge vault:', err)
})
}, [loaded, selectedVaultPath])
}
function formatGettingStartedRestoreError(err: unknown): string {
const message =
typeof err === 'string'
@@ -1145,6 +1166,8 @@ export function useVaultSwitcher({ onSwitch, onToast }: UseVaultSwitcherOptions)
selectedVaultPath,
vaultPath,
} = persistedState
useMcpBridgeVaultSync(loaded, selectedVaultPath)
const { allVaults, defaultVaults, isGettingStartedHidden } = useVaultCollections(
defaultAvailable,
defaultPath,

View File

@@ -486,6 +486,7 @@ export const mockHandlers: Record<string, (args: any) => any> = {
},
register_mcp_tools: () => 'registered',
check_mcp_status: () => 'installed',
sync_mcp_bridge_vault: (args: { vaultPath?: string | null }) => args.vaultPath ? 'started' : 'stopped',
repair_vault: (): string => {
mockVaultAiGuidanceStatus = {
agents_state: 'managed',