from __future__ import annotations import logging from yuxi.channel.extensions.github.api import GitHubApiClient logger = logging.getLogger(__name__) class GitHubAgentTools: def __init__(self, api_client: GitHubApiClient): self._api = api_client async def search_issues(self, query: str, owner: str, repo: str) -> list[dict]: client = await self._api._get_client() full_query = f"{query} repo:{owner}/{repo}" resp = await client.rest.search.issues_issues(q=full_query, per_page=10) items = resp.parsed_data.items return [ {"number": item.number, "title": item.title, "state": item.state, "url": item.html_url} for item in items ] async def create_issue( self, owner: str, repo: str, title: str, body: str = "", labels: list[str] | None = None, ) -> dict: return await self._api.create_issue(owner, repo, title, body, labels) async def close_issue(self, owner: str, repo: str, issue_number: int) -> dict: return await self._api.close_issue(owner, repo, issue_number) async def reopen_issue(self, owner: str, repo: str, issue_number: int) -> dict: return await self._api.reopen_issue(owner, repo, issue_number) async def add_labels(self, owner: str, repo: str, issue_number: int, labels: list[str]) -> dict: return await self._api.add_labels(owner, repo, issue_number, labels) async def remove_labels(self, owner: str, repo: str, issue_number: int, labels: list[str]) -> dict: return await self._api.remove_labels(owner, repo, issue_number, labels) async def list_issues(self, owner: str, repo: str, state: str = "open", labels: str = "") -> list[dict]: return await self._api.list_issues(owner, repo, state=state, labels=labels) async def get_issue(self, owner: str, repo: str, issue_number: int) -> dict: return await self._api.get_issue(owner, repo, issue_number) async def set_assignees(self, owner: str, repo: str, issue_number: int, assignees: list[str]) -> dict: return await self._api.set_assignees(owner, repo, issue_number, assignees) async def get_issue_comments(self, owner: str, repo: str, issue_number: int) -> list[dict]: return await self._api.get_issue_comments(owner, repo, issue_number)