from collections.abc import Awaitable, Callable from dataclasses import dataclass, field @dataclass class Plugin: id: str title: str description: str = "" skeleton_fn: Callable[[], Awaitable[str]] | None = field(default=None) open_fn: Callable[[], Awaitable[None]] | None = field(default=None) close_fn: Callable[[], Awaitable[None]] | None = field(default=None) async def skeleton(self) -> str: if self.skeleton_fn is None: raise NotImplementedError return await self.skeleton_fn() async def open(self) -> None: if self.open_fn is not None: await self.open_fn() async def close(self) -> None: if self.close_fn is not None: await self.close_fn()