35 lines
1.4 KiB
Python
35 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from app.core.contracts import ToolResult, UserTask
|
|
from app.tools.base import BaseTool
|
|
from app.tools.sandbox import ToolSandbox
|
|
|
|
|
|
class Tool(BaseTool):
|
|
name = "file_read"
|
|
description = "Read file contents"
|
|
|
|
def __init__(self, sandbox: ToolSandbox) -> None:
|
|
self._sandbox = sandbox
|
|
|
|
def execute(self, task: UserTask, args: dict[str, object]) -> ToolResult:
|
|
path = args.get("path")
|
|
if not path:
|
|
return ToolResult(tool=self.name, ok=False, error="Missing path")
|
|
try:
|
|
resolved = self._sandbox.ensure_path_allowed(str(path))
|
|
if not resolved.exists():
|
|
return ToolResult(tool=self.name, ok=False, error=f"File not found: {path}")
|
|
content = resolved.read_text(encoding="utf-8")
|
|
return ToolResult(
|
|
tool=self.name,
|
|
ok=True,
|
|
output=content,
|
|
metadata={"path": str(resolved), "size": len(content)},
|
|
)
|
|
except PermissionError as e:
|
|
return ToolResult(tool=self.name, ok=False, error=f"Access denied: {e}")
|
|
except FileNotFoundError as e:
|
|
return ToolResult(tool=self.name, ok=False, error=f"File not found: {path}")
|
|
except Exception as e:
|
|
return ToolResult(tool=self.name, ok=False, error=f"Error: {e}") |