Source code for rossum_mcp.tools.resource_tracking

from __future__ import annotations

import logging
from dataclasses import asdict, is_dataclass
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from typing import Any

logger = logging.getLogger(__name__)

TRACKED_RESOURCES_KEY = "_tracked_resources"


[docs] def track_resource( tracked: list[dict[str, Any]], entity_type: str, entity_id: int | str, data: Any, ) -> None: """Append a side-effect resource to the tracked list. Converts dataclass/dict data to a plain dict for serialization. Non-convertible data is silently skipped. """ if isinstance(data, dict): payload = data elif is_dataclass(data) and not isinstance(data, type): payload = asdict(data) else: logger.warning(f"track_resource: cannot convert {type(data).__name__} to dict, skipping") return tracked.append({"entity_type": entity_type, "entity_id": str(entity_id), "data": payload})
[docs] def embed_tracked_resources(result: Any, tracked: list[dict[str, Any]]) -> Any: """Embed tracked resources into the tool result if any were collected. If tracked is non-empty, converts the result to a dict (via dataclass asdict if needed) and adds the _tracked_resources key. Returns result unchanged if tracked is empty or result is not convertible. """ if not tracked: return result if isinstance(result, dict): result_dict = dict(result) elif is_dataclass(result) and not isinstance(result, type): result_dict = asdict(result) else: logger.warning(f"embed_tracked_resources: cannot convert {type(result).__name__} to dict") return result result_dict[TRACKED_RESOURCES_KEY] = tracked return result_dict