fix: hash full content in tool_add_drawer drawer ID (#716)

* fix: hash full content in tool_add_drawer drawer ID

* style: apply ruff format

* style: fix ruff format for CI ruff 0.4.x
This commit is contained in:
shafdev
2026-04-13 10:10:46 +05:30
committed by GitHub
parent 3a50966766
commit f4226047cb
2 changed files with 26 additions and 1 deletions
+3 -1
View File
@@ -481,7 +481,9 @@ def tool_add_drawer(
if not col: if not col:
return _no_palace() return _no_palace()
drawer_id = f"drawer_{wing}_{room}_{hashlib.sha256((wing + room + content[:100]).encode()).hexdigest()[:24]}" drawer_id = (
f"drawer_{wing}_{room}_{hashlib.sha256((wing + room + content).encode()).hexdigest()[:24]}"
)
_wal_log( _wal_log(
"add_drawer", "add_drawer",
+23
View File
@@ -401,6 +401,29 @@ class TestWriteTools:
assert result2["success"] is True assert result2["success"] is True
assert result2["reason"] == "already_exists" assert result2["reason"] == "already_exists"
def test_add_drawer_shared_header_no_collision(self, monkeypatch, config, palace_path, kg):
"""Documents sharing a >100-char header must get distinct IDs (full-content hash)."""
_patch_mcp_server(monkeypatch, config, kg)
_client, _col = _get_collection(palace_path, create=True)
del _client
from mempalace.mcp_server import tool_add_drawer
header = "# ACME Corp Knowledge Base\n**Project:** Alpha | **Team:** Backend | **Status:** Active\n\n"
doc1 = (
header
+ "Decision: Use PostgreSQL for primary storage. Rationale: ACID compliance required."
)
doc2 = header + "Decision: Use Redis for session caching. Rationale: sub-ms latency needed."
result1 = tool_add_drawer(wing="work", room="decisions", content=doc1)
result2 = tool_add_drawer(wing="work", room="decisions", content=doc2)
assert result1["success"] is True
assert result2["success"] is True
assert (
result1["drawer_id"] != result2["drawer_id"]
), "Documents with shared header but different content must have distinct drawer IDs"
def test_delete_drawer(self, monkeypatch, config, palace_path, seeded_collection, kg): def test_delete_drawer(self, monkeypatch, config, palace_path, seeded_collection, kg):
_patch_mcp_server(monkeypatch, config, kg) _patch_mcp_server(monkeypatch, config, kg)
from mempalace.mcp_server import tool_delete_drawer from mempalace.mcp_server import tool_delete_drawer