diff --git a/src/timmy/tools.py b/src/timmy/tools.py index 95f0f645..38ca74b1 100644 --- a/src/timmy/tools.py +++ b/src/timmy/tools.py @@ -909,82 +909,35 @@ def _experiment_tool_catalog() -> dict: } +_CREATIVE_CATALOG_SOURCES: list[tuple[str, str, list[str]]] = [ + ("creative.tools.git_tools", "GIT_TOOL_CATALOG", ["forge", "helm", "orchestrator"]), + ("creative.tools.image_tools", "IMAGE_TOOL_CATALOG", ["pixel", "orchestrator"]), + ("creative.tools.music_tools", "MUSIC_TOOL_CATALOG", ["lyra", "orchestrator"]), + ("creative.tools.video_tools", "VIDEO_TOOL_CATALOG", ["reel", "orchestrator"]), + ("creative.director", "DIRECTOR_TOOL_CATALOG", ["orchestrator"]), + ("creative.assembler", "ASSEMBLER_TOOL_CATALOG", ["reel", "orchestrator"]), +] + + def _import_creative_catalogs(catalog: dict) -> None: """Import and merge creative tool catalogs from creative module.""" - # ── Git tools ───────────────────────────────────────────────────────────── - try: - from creative.tools.git_tools import GIT_TOOL_CATALOG + for module_path, attr_name, available_in in _CREATIVE_CATALOG_SOURCES: + _merge_catalog(catalog, module_path, attr_name, available_in) - for tool_id, info in GIT_TOOL_CATALOG.items(): + +def _merge_catalog( + catalog: dict, module_path: str, attr_name: str, available_in: list[str] +) -> None: + """Import a single creative catalog and merge its entries.""" + try: + from importlib import import_module + + source_catalog = getattr(import_module(module_path), attr_name) + for tool_id, info in source_catalog.items(): catalog[tool_id] = { "name": info["name"], "description": info["description"], - "available_in": ["forge", "helm", "orchestrator"], - } - except ImportError: - pass - - # ── Image tools ──────────────────────────────────────────────────────────── - try: - from creative.tools.image_tools import IMAGE_TOOL_CATALOG - - for tool_id, info in IMAGE_TOOL_CATALOG.items(): - catalog[tool_id] = { - "name": info["name"], - "description": info["description"], - "available_in": ["pixel", "orchestrator"], - } - except ImportError: - pass - - # ── Music tools ──────────────────────────────────────────────────────────── - try: - from creative.tools.music_tools import MUSIC_TOOL_CATALOG - - for tool_id, info in MUSIC_TOOL_CATALOG.items(): - catalog[tool_id] = { - "name": info["name"], - "description": info["description"], - "available_in": ["lyra", "orchestrator"], - } - except ImportError: - pass - - # ── Video tools ──────────────────────────────────────────────────────────── - try: - from creative.tools.video_tools import VIDEO_TOOL_CATALOG - - for tool_id, info in VIDEO_TOOL_CATALOG.items(): - catalog[tool_id] = { - "name": info["name"], - "description": info["description"], - "available_in": ["reel", "orchestrator"], - } - except ImportError: - pass - - # ── Creative pipeline ────────────────────────────────────────────────────── - try: - from creative.director import DIRECTOR_TOOL_CATALOG - - for tool_id, info in DIRECTOR_TOOL_CATALOG.items(): - catalog[tool_id] = { - "name": info["name"], - "description": info["description"], - "available_in": ["orchestrator"], - } - except ImportError: - pass - - # ── Assembler tools ─────────────────────────────────────────────────────── - try: - from creative.assembler import ASSEMBLER_TOOL_CATALOG - - for tool_id, info in ASSEMBLER_TOOL_CATALOG.items(): - catalog[tool_id] = { - "name": info["name"], - "description": info["description"], - "available_in": ["reel", "orchestrator"], + "available_in": available_in, } except ImportError: pass