52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from .commands import PORTED_COMMANDS, execute_command
|
|
from .tools import PORTED_TOOLS, execute_tool
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class MirroredCommand:
|
|
name: str
|
|
source_hint: str
|
|
|
|
def execute(self, prompt: str) -> str:
|
|
return execute_command(self.name, prompt).message
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class MirroredTool:
|
|
name: str
|
|
source_hint: str
|
|
|
|
def execute(self, payload: str) -> str:
|
|
return execute_tool(self.name, payload).message
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class ExecutionRegistry:
|
|
commands: tuple[MirroredCommand, ...]
|
|
tools: tuple[MirroredTool, ...]
|
|
|
|
def command(self, name: str) -> MirroredCommand | None:
|
|
lowered = name.lower()
|
|
for command in self.commands:
|
|
if command.name.lower() == lowered:
|
|
return command
|
|
return None
|
|
|
|
def tool(self, name: str) -> MirroredTool | None:
|
|
lowered = name.lower()
|
|
for tool in self.tools:
|
|
if tool.name.lower() == lowered:
|
|
return tool
|
|
return None
|
|
|
|
|
|
def build_execution_registry() -> ExecutionRegistry:
|
|
return ExecutionRegistry(
|
|
commands=tuple(MirroredCommand(module.name, module.source_hint) for module in PORTED_COMMANDS),
|
|
tools=tuple(MirroredTool(module.name, module.source_hint) for module in PORTED_TOOLS),
|
|
)
|