@@ -788,6 +788,7 @@ async def search(self, payload, page, page_size):
788788 @dataclass
789789 class StubConfig :
790790 semantic_search_enabled : bool = True
791+ default_search_type : str | None = None
791792
792793 @dataclass
793794 class StubContainer :
@@ -849,6 +850,7 @@ async def search(self, payload, page, page_size):
849850 @dataclass
850851 class StubConfig :
851852 semantic_search_enabled : bool = False
853+ default_search_type : str | None = None
852854
853855 @dataclass
854856 class StubContainer :
@@ -909,6 +911,7 @@ async def search(self, payload, page, page_size):
909911 @dataclass
910912 class StubConfig :
911913 semantic_search_enabled : bool = True
914+ default_search_type : str | None = None
912915
913916 @dataclass
914917 class StubContainer :
@@ -976,7 +979,11 @@ def raise_runtime_error():
976979 lambda : type (
977980 "StubConfigManager" ,
978981 (),
979- {"config" : type ("Cfg" , (), {"semantic_search_enabled" : True })()},
982+ {
983+ "config" : type (
984+ "Cfg" , (), {"semantic_search_enabled" : True , "default_search_type" : None }
985+ )()
986+ },
980987 )(),
981988 )
982989
@@ -1037,7 +1044,11 @@ def raise_runtime_error():
10371044 lambda : type (
10381045 "StubConfigManager" ,
10391046 (),
1040- {"config" : type ("Cfg" , (), {"semantic_search_enabled" : False })()},
1047+ {
1048+ "config" : type (
1049+ "Cfg" , (), {"semantic_search_enabled" : False , "default_search_type" : None }
1050+ )()
1051+ },
10411052 )(),
10421053 )
10431054
@@ -1567,3 +1578,54 @@ async def search(self, payload, page, page_size):
15671578
15681579 # "note_type" aliased to "type", "priority" passes through unchanged
15691580 assert captured_payload ["metadata_filters" ] == {"type" : "spec" , "priority" : "high" }
1581+
1582+
1583+ def test_default_search_type_uses_config_value ():
1584+ """_default_search_type should return config.default_search_type when set."""
1585+ import sys
1586+ from unittest .mock import MagicMock , patch
1587+
1588+ search_module = sys .modules ["basic_memory.mcp.tools.search" ]
1589+
1590+ mock_config = MagicMock ()
1591+ mock_config .default_search_type = "vector"
1592+ mock_config .semantic_search_enabled = True
1593+ mock_container = MagicMock ()
1594+ mock_container .config = mock_config
1595+
1596+ with patch .object (search_module , "get_container" , return_value = mock_container ):
1597+ assert search_module ._default_search_type () == "vector"
1598+
1599+
1600+ def test_default_search_type_falls_back_to_hybrid_when_semantic_enabled ():
1601+ """When default_search_type is None and semantic is enabled, default to hybrid."""
1602+ import sys
1603+ from unittest .mock import MagicMock , patch
1604+
1605+ search_module = sys .modules ["basic_memory.mcp.tools.search" ]
1606+
1607+ mock_config = MagicMock ()
1608+ mock_config .default_search_type = None
1609+ mock_config .semantic_search_enabled = True
1610+ mock_container = MagicMock ()
1611+ mock_container .config = mock_config
1612+
1613+ with patch .object (search_module , "get_container" , return_value = mock_container ):
1614+ assert search_module ._default_search_type () == "hybrid"
1615+
1616+
1617+ def test_default_search_type_falls_back_to_text_when_semantic_disabled ():
1618+ """When default_search_type is None and semantic is disabled, default to text."""
1619+ import sys
1620+ from unittest .mock import MagicMock , patch
1621+
1622+ search_module = sys .modules ["basic_memory.mcp.tools.search" ]
1623+
1624+ mock_config = MagicMock ()
1625+ mock_config .default_search_type = None
1626+ mock_config .semantic_search_enabled = False
1627+ mock_container = MagicMock ()
1628+ mock_container .config = mock_config
1629+
1630+ with patch .object (search_module , "get_container" , return_value = mock_container ):
1631+ assert search_module ._default_search_type () == "text"
0 commit comments