Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions ymir/tools/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import copy
from typing import Self

from beeai_framework.tools.tool import TInput, Tool, TOutput, TRunOptions


class CloneableTool(Tool[TInput, TRunOptions, TOutput]):
async def clone(self) -> Self:
cloned = copy.copy(self)
cloned.middlewares = list(self.middlewares)
cloned._cache = await self.cache.clone()
Comment thread
nforro marked this conversation as resolved.
if self._options is not None:
cloned._options = copy.copy(self._options)
return cloned
Comment thread
nforro marked this conversation as resolved.
2 changes: 1 addition & 1 deletion ymir/tools/privileged/copr.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
from beeai_framework.tools import (
JSONToolOutput,
StringToolOutput,
Tool,
ToolError,
ToolRunOptions,
)
Expand All @@ -23,6 +22,7 @@
from ymir.common import load_rhel_config
from ymir.common.base_utils import KerberosError, init_kerberos_ticket
from ymir.common.validators import AbsolutePath
from ymir.tools.base import CloneableTool as Tool
from ymir.tools.constants import AIOHTTP_TIMEOUT

COPR_CONFIG = {
Expand Down
3 changes: 2 additions & 1 deletion ymir/tools/privileged/distgit.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@
import koji
from beeai_framework.context import RunContext
from beeai_framework.emitter import Emitter
from beeai_framework.tools import StringToolOutput, Tool, ToolError, ToolRunOptions
from beeai_framework.tools import StringToolOutput, ToolError, ToolRunOptions
from pydantic import BaseModel, Field

from ymir.common.base_utils import KerberosError, init_kerberos_ticket
from ymir.tools.base import CloneableTool as Tool
from ymir.tools.constants import BREWHUB_URL

SYNC_TIMEOUT = 1 * 60 * 60 # seconds
Expand Down
2 changes: 1 addition & 1 deletion ymir/tools/privileged/gitlab.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
from beeai_framework.tools import (
JSONToolOutput,
StringToolOutput,
Tool,
ToolError,
ToolRunOptions,
)
Expand All @@ -29,6 +28,7 @@
OpenMergeRequestResult,
)
from ymir.common.validators import AbsolutePath
from ymir.tools.base import CloneableTool as Tool
from ymir.tools.constants import AIOHTTP_TIMEOUT
from ymir.tools.privileged.utils import clean_stale_repositories

Expand Down
2 changes: 1 addition & 1 deletion ymir/tools/privileged/jira.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
from beeai_framework.tools import (
JSONToolOutput,
StringToolOutput,
Tool,
ToolError,
ToolRunOptions,
)
Expand All @@ -22,6 +21,7 @@
from ymir.common.base_utils import get_jira_auth_headers
from ymir.common.constants import JIRA_SEARCH_PATH
from ymir.common.version_utils import get_fix_version_variants, normalize_fix_version, parse_rhel_version
from ymir.tools.base import CloneableTool as Tool
from ymir.tools.constants import AIOHTTP_TIMEOUT

if os.getenv("MOCK_JIRA", "False").lower() == "true":
Expand Down
3 changes: 2 additions & 1 deletion ymir/tools/privileged/lookaside.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@

from beeai_framework.context import RunContext
from beeai_framework.emitter import Emitter
from beeai_framework.tools import StringToolOutput, Tool, ToolError, ToolRunOptions
from beeai_framework.tools import StringToolOutput, ToolError, ToolRunOptions
from pydantic import BaseModel, Field

from ymir.common.base_utils import KerberosError, init_kerberos_ticket, is_cs_branch
from ymir.common.validators import AbsolutePath
from ymir.tools.base import CloneableTool as Tool

logger = logging.getLogger(__name__)

Expand Down
3 changes: 2 additions & 1 deletion ymir/tools/privileged/zstream_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@

from beeai_framework.context import RunContext
from beeai_framework.emitter import Emitter
from beeai_framework.tools import JSONToolOutput, Tool, ToolError, ToolRunOptions
from beeai_framework.tools import JSONToolOutput, ToolError, ToolRunOptions
from pydantic import BaseModel, Field

from ymir.common.utils import run_tool
from ymir.common.version_utils import is_older_zstream, parse_rhel_version
from ymir.tools.base import CloneableTool as Tool
from ymir.tools.privileged.jira import (
GetJiraDevStatusTool,
SearchJiraIssuesTool,
Expand Down
3 changes: 2 additions & 1 deletion ymir/tools/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "ymir-tools"
version = "0.3.1"
version = "0.3.2"
description = "Ymir MCP tools for AI workflows"
requires-python = ">=3.13"
dynamic = ["dependencies"]
Expand Down Expand Up @@ -36,3 +36,4 @@ packages = []
"privileged" = "ymir/tools/privileged"
"unprivileged" = "ymir/tools/unprivileged"
"constants.py" = "ymir/tools/constants.py"
"base.py" = "ymir/tools/base.py"
3 changes: 2 additions & 1 deletion ymir/tools/unprivileged/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@

from beeai_framework.context import RunContext
from beeai_framework.emitter import Emitter
from beeai_framework.tools import JSONToolOutput, Tool, ToolError, ToolRunOptions
from beeai_framework.tools import JSONToolOutput, ToolError, ToolRunOptions
from pydantic import BaseModel, Field

from ymir.common.base_utils import run_subprocess
from ymir.tools.base import CloneableTool as Tool

TIMEOUT = 10 * 60 # seconds
ELLIPSIZED_LINES = 200
Expand Down
4 changes: 3 additions & 1 deletion ymir/tools/unprivileged/distgit_detector.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

from beeai_framework.context import RunContext
from beeai_framework.emitter import Emitter
from beeai_framework.tools import JSONToolOutput, Tool, ToolRunOptions
from beeai_framework.tools import JSONToolOutput, ToolRunOptions
from pydantic import BaseModel, Field

from ymir.tools.base import CloneableTool as Tool


class DistgitDetectorInput(BaseModel):
url: str = Field(description="URL to check if it's from a dist-git source")
Expand Down
3 changes: 2 additions & 1 deletion ymir/tools/unprivileged/filesystem.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@

from beeai_framework.context import RunContext
from beeai_framework.emitter import Emitter
from beeai_framework.tools import StringToolOutput, Tool, ToolError, ToolRunOptions
from beeai_framework.tools import StringToolOutput, ToolError, ToolRunOptions
from pydantic import BaseModel, Field

from ymir.common.utils import get_absolute_path
from ymir.tools.base import CloneableTool as Tool


class GetCWDToolInput(BaseModel):
Expand Down
3 changes: 2 additions & 1 deletion ymir/tools/unprivileged/greenwave.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
import aiohttp
from beeai_framework.context import RunContext
from beeai_framework.emitter import Emitter
from beeai_framework.tools import StringToolOutput, Tool, ToolRunOptions
from beeai_framework.tools import StringToolOutput, ToolRunOptions
from pydantic import BaseModel, Field

from ymir.tools.base import CloneableTool as Tool
from ymir.tools.constants import AIOHTTP_TIMEOUT

logger = logging.getLogger(__name__)
Expand Down
2 changes: 1 addition & 1 deletion ymir/tools/unprivileged/specfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from beeai_framework.tools import (
JSONToolOutput,
StringToolOutput,
Tool,
ToolError,
ToolRunOptions,
)
Expand All @@ -23,6 +22,7 @@
)

from ymir.common.utils import get_absolute_path
from ymir.tools.base import CloneableTool as Tool
from ymir.tools.constants import BREWHUB_URL


Expand Down
3 changes: 2 additions & 1 deletion ymir/tools/unprivileged/text.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@

from beeai_framework.context import RunContext
from beeai_framework.emitter import Emitter
from beeai_framework.tools import StringToolOutput, Tool, ToolError, ToolRunOptions
from beeai_framework.tools import StringToolOutput, ToolError, ToolRunOptions
from pydantic import BaseModel, Field

from ymir.common.utils import get_absolute_path
from ymir.common.validators import NonEmptyString
from ymir.tools.base import CloneableTool as Tool


class CreateToolInput(BaseModel):
Expand Down
3 changes: 2 additions & 1 deletion ymir/tools/unprivileged/upstream_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@
import aiohttp
from beeai_framework.context import RunContext
from beeai_framework.emitter import Emitter
from beeai_framework.tools import JSONToolOutput, Tool, ToolError, ToolRunOptions
from beeai_framework.tools import JSONToolOutput, ToolError, ToolRunOptions
from pydantic import BaseModel, Field

from ymir.tools.base import CloneableTool as Tool
from ymir.tools.constants import AIOHTTP_TIMEOUT

logger = logging.getLogger(__name__)
Expand Down
2 changes: 1 addition & 1 deletion ymir/tools/unprivileged/upstream_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@
from beeai_framework.tools import (
JSONToolOutput,
StringToolOutput,
Tool,
ToolError,
ToolRunOptions,
)
from pydantic import BaseModel, Field

from ymir.common.base_utils import run_subprocess
from ymir.common.validators import AbsolutePath
from ymir.tools.base import CloneableTool as Tool
from ymir.tools.constants import AIOHTTP_TIMEOUT


Expand Down
3 changes: 2 additions & 1 deletion ymir/tools/unprivileged/version_mapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

from beeai_framework.context import RunContext
from beeai_framework.emitter import Emitter
from beeai_framework.tools import JSONToolOutput, Tool, ToolRunOptions
from beeai_framework.tools import JSONToolOutput, ToolRunOptions
from pydantic import BaseModel, Field

from ymir.common.config import load_rhel_config
from ymir.tools.base import CloneableTool as Tool


class VersionMapperInput(BaseModel):
Expand Down
3 changes: 2 additions & 1 deletion ymir/tools/unprivileged/wicked_git.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from beeai_framework.context import RunContext
from beeai_framework.emitter import Emitter
from beeai_framework.tools import StringToolOutput, Tool, ToolError, ToolRunOptions
from beeai_framework.tools import StringToolOutput, ToolError, ToolRunOptions
from pydantic import BaseModel, Field

from ymir.common.base_utils import run_subprocess
from ymir.common.validators import AbsolutePath
from ymir.tools.base import CloneableTool as Tool


class GitPreparePackageSourcesInput(BaseModel):
Expand Down
Loading