fix: remove http delete-kinds regression

This commit is contained in:
2026-08-08 18:21:20 +02:00
parent 32cd2165eb
commit 820b237239
8 changed files with 130 additions and 27 deletions
@@ -253,6 +253,12 @@ def test_http_delete_generation_legacy_404_fails_closed_without_body_leak(monkey
assert "secret" not in str(error.value)
def test_http_rest_client_does_not_advertise_nonexistent_delete_kinds_rpc():
client = VectorRestClient(RestConfig(base_url="https://vectors.test", api_key="writer"))
assert hasattr(client, "delete_kinds") is False
def test_http_list_evidence_generations_exact_rpc_and_legacy_fail_closed(monkeypatch):
calls = []
monkeypatch.setattr(
@@ -161,4 +161,5 @@ def test_memory_clear_accepts_qdrant_only_runtime_config(tmp_path, monkeypatch):
res = CliRunner().invoke(app, ["memory", "clear", "--yes", "-c", str(cfg)])
assert res.exit_code == 0, res.output
assert store.deleted == [("memory", ["memory"])]
assert not registry.exists()
@@ -35,6 +35,7 @@ def test_http_store_supports_writer_without_reader():
assert store.capabilities.search is False
assert store.capabilities.existing_hashes is True
assert store.capabilities.upsert is True
assert hasattr(store, "delete_kinds") is False
with pytest.raises(VectorReadUnavailable):
store.search(["memory"], [0.1], limit=1)
@@ -155,14 +155,6 @@ class ThothHttpVectorStore:
except VectorRestError as exc:
raise VectorStoreError(str(exc)) from exc
def delete_kinds(self, collection: str, kinds: list[str]) -> int:
_collection("vectors", collection)
_validate_collection_kinds(collection, kinds)
try:
return self._require_writer().delete_kinds(collection, kinds)
except VectorRestError as exc:
raise VectorStoreError(str(exc)) from exc
def delete_generation(self, collection: str, generation: str, workspace_id: str) -> int:
if collection != "evidence" or re.fullmatch(r"gen:[0-9a-f]{32}", generation) is None:
raise VectorStoreError("Only exact Evidence generations may be deleted")
+8 -1
View File
@@ -45,8 +45,15 @@ def _resync_memory(cfg):
def clear_memory_index(cfg):
from tht.adapters.factory import build_vector_store
from tht.cli.vector_cmd import make_embedder, open_store, require_direct_vector_cfg
return build_vector_store(cfg, require_write=True).delete_kinds("memory", ["memory"])
if cfg.vectors is not None and cfg.vectors.type == "qdrant":
return build_vector_store(cfg, require_write=True).delete_kinds("memory", ["memory"])
require_direct_vector_cfg(cfg)
legacy_store = open_store(cfg, "memory")
legacy_store.sync([], make_embedder(cfg.embeddings), kinds={"memory"})
return 0
@memory_app.command("promote")
-2
View File
@@ -80,8 +80,6 @@ class VectorStore(Protocol):
def upsert(self, collection: str, records: list[VectorWriteRecord]) -> int: ...
def delete_kinds(self, collection: str, kinds: list[str]) -> int: ...
def delete_generation(self, collection: str, generation: str, workspace_id: str) -> int: ...
def list_evidence_generations(self, collection: str, workspace_id: str) -> list[str]: ...
-16
View File
@@ -150,22 +150,6 @@ class VectorRestClient:
return int(payload.get("deleted", 0))
return 0
def delete_kinds(self, table_name: str, kinds: list[str]) -> int:
try:
payload = self._call(
"delete_vector_kinds",
{"table_name": table_name, "kinds": kinds},
)
except VectorRestError as error:
if "HTTP 404" in str(error):
raise VectorRestError(
"delete_vector_kinds RPC is unavailable; deploy the cleanup migration"
) from None
raise
if isinstance(payload, dict):
return int(payload.get("deleted", 0))
return 0
def list_evidence_generations(self, table_name: str, workspace_id: str) -> list[str]:
if re.fullmatch(r"[a-z][a-z0-9_-]{0,63}", workspace_id) is None:
raise ValueError("workspace namespace must be canonical")