File size: 2,760 Bytes
0f336cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from typing import Dict
from schemas.enums import SafetyLevel
from schemas.models import ToolDefinition, ToolRequest, ToolResponse


class ToolPermissionEngine:
    """Manages catalog of colony tools and validates execution permissions against safety guardrails."""

    def __init__(self):
        self.catalog: Dict[str, ToolDefinition] = {
            "Playwright": ToolDefinition(
                name="Playwright", category="Browser", description="Automated web browser navigation and interaction", permission_level=SafetyLevel.INTERACTIVE_FORM
            ),
            "HTTP": ToolDefinition(
                name="HTTP", category="Network", description="Send HTTP/REST requests to external endpoints", permission_level=SafetyLevel.READ_ONLY
            ),
            "Vision": ToolDefinition(
                name="Vision", category="Perception", description="Visual OCR and screen element analysis", permission_level=SafetyLevel.READ_ONLY
            ),
            "SQLite": ToolDefinition(
                name="SQLite", category="Database", description="Read and store local structured operational data", permission_level=SafetyLevel.READ_ONLY
            ),
            "Memory": ToolDefinition(
                name="Memory", category="Memory", description="Search and persist vector/text memories", permission_level=SafetyLevel.READ_ONLY
            ),
            "Embeddings": ToolDefinition(
                name="Embeddings", category="AI", description="Generate semantic vector embeddings", permission_level=SafetyLevel.READ_ONLY
            ),
            "Filesystem": ToolDefinition(
                name="Filesystem", category="System", description="Read and write safe workspace files", permission_level=SafetyLevel.SENSITIVE_ACTION
            ),
            "Search": ToolDefinition(
                name="Search", category="Research", description="Execute web search and citation retrieval", permission_level=SafetyLevel.READ_ONLY
            ),
        }

    def evaluate_request(self, req: ToolRequest) -> ToolResponse:
        tool = self.catalog.get(req.tool_name)
        if not tool:
            return ToolResponse(tool_name=req.tool_name, allowed=False, reason=f"Tool '{req.tool_name}' not registered in catalog.")

        if not tool.enabled:
            return ToolResponse(tool_name=req.tool_name, allowed=False, reason=f"Tool '{req.tool_name}' is currently disabled.")

        if tool.permission_level == SafetyLevel.DESTRUCTIVE_BLOCKED:
            return ToolResponse(tool_name=req.tool_name, allowed=False, reason=f"Action blocked by safety policy: Destructive operations prohibited.")

        return ToolResponse(tool_name=req.tool_name, allowed=True, reason="Permission granted.", result={"status": "READY"})