tool_status() called _get_collection() with the default create=False, which throws when the ChromaDB collection does not exist yet (valid palace, zero drawers). The exception was swallowed and status returned "No palace found" even though init had completed successfully. Switching to create=True bootstraps an empty collection on first status call, matching what the write path already does. Fix suggested by @hkevinchu in the issue.
This commit is contained in:
committed by
GitHub
parent
f20f45a2da
commit
54a386d925
@@ -269,7 +269,11 @@ def _sanitize_optional_name(value: str = None, field_name: str = "name") -> str:
|
|||||||
|
|
||||||
|
|
||||||
def tool_status():
|
def tool_status():
|
||||||
col = _get_collection()
|
# Use create=True only when a palace DB already exists on disk -- this
|
||||||
|
# bootstraps the ChromaDB collection on a valid-but-empty palace without
|
||||||
|
# accidentally creating a palace in a non-existent directory (#830).
|
||||||
|
db_exists = os.path.isfile(os.path.join(_config.palace_path, "chroma.sqlite3"))
|
||||||
|
col = _get_collection(create=db_exists)
|
||||||
if not col:
|
if not col:
|
||||||
return _no_palace()
|
return _no_palace()
|
||||||
count = col.count()
|
count = col.count()
|
||||||
|
|||||||
@@ -212,6 +212,25 @@ class TestHandleRequest:
|
|||||||
|
|
||||||
|
|
||||||
class TestReadTools:
|
class TestReadTools:
|
||||||
|
def test_status_cold_start_no_collection(self, monkeypatch, config, palace_path, kg):
|
||||||
|
"""Status on a valid palace with no ChromaDB collection yet (#830).
|
||||||
|
|
||||||
|
After `mempalace init`, chroma.sqlite3 exists but the mempalace_drawers
|
||||||
|
collection has not been created (no mine or add_drawer yet). Status
|
||||||
|
should return total_drawers: 0, not 'No palace found'.
|
||||||
|
"""
|
||||||
|
import chromadb
|
||||||
|
|
||||||
|
_patch_mcp_server(monkeypatch, config, kg)
|
||||||
|
# Create the DB file (init does this) but NOT the collection
|
||||||
|
client = chromadb.PersistentClient(path=palace_path)
|
||||||
|
del client
|
||||||
|
from mempalace.mcp_server import tool_status
|
||||||
|
|
||||||
|
result = tool_status()
|
||||||
|
assert "error" not in result, f"cold-start should not error: {result}"
|
||||||
|
assert result["total_drawers"] == 0
|
||||||
|
|
||||||
def test_status_empty_palace(self, monkeypatch, config, palace_path, kg):
|
def test_status_empty_palace(self, monkeypatch, config, palace_path, kg):
|
||||||
_patch_mcp_server(monkeypatch, config, kg)
|
_patch_mcp_server(monkeypatch, config, kg)
|
||||||
_client, _col = _get_collection(palace_path, create=True)
|
_client, _col = _get_collection(palace_path, create=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user