97 lines
2.9 KiB
Python
97 lines
2.9 KiB
Python
# CP2A2.2B — L1 Red Queen Worker: Tool-Capability-Test
|
|
# STRICTLY NON-AUTONOMOUS / NON-PRODUCTIVE.
|
|
#
|
|
# Verifiziert, dass der Worker KEINE verbotenen Tools/Faehigkeiten besitzt.
|
|
# Verboten: terminal, generic shell, execute_code, write_file auf externe/
|
|
# shared Ziele, patch, git push, SSH, Docker, cronjob, send_message,
|
|
# delegation, arbitrary command execution. MAX_SUBAGENTS=0.
|
|
#
|
|
# Ground-Truth-Check: prueft die tatsaechlich geladenen Toolsets, nicht nur
|
|
# die Config. Der Worker nutzt ein minimales read-only Toolset.
|
|
|
|
import os
|
|
import sys
|
|
|
|
# Verbotene Tool-Namen (Ground-Truth-Check gegen geladene Toolsets)
|
|
FORBIDDEN_TOOLS = [
|
|
"terminal",
|
|
"process",
|
|
"execute_code",
|
|
"write_file",
|
|
"patch",
|
|
"git_push",
|
|
"ssh",
|
|
"docker",
|
|
"cronjob",
|
|
"send_message",
|
|
"delegate_task",
|
|
"browser_navigate",
|
|
"browser_click",
|
|
"browser_type",
|
|
"computer_use",
|
|
]
|
|
|
|
# Erlaubte (read-only) Tools
|
|
ALLOWED_TOOLS = [
|
|
"web_extract",
|
|
"web_search",
|
|
"vision_analyze",
|
|
"read_file",
|
|
"search_files",
|
|
"session_search",
|
|
"memory",
|
|
"todo",
|
|
"clarify",
|
|
"skills_list",
|
|
"skill_view",
|
|
]
|
|
|
|
|
|
def get_loaded_toolsets() -> list[str]:
|
|
"""Ermittelt die tatsaechlich geladenen Toolsets (Ground Truth)."""
|
|
# Aus ENV: HERMES_TUI_TOOLSETS oder via hermes CLI
|
|
env_toolsets = os.environ.get("HERMES_TUI_TOOLSETS", "")
|
|
if env_toolsets:
|
|
return [t.strip() for t in env_toolsets.split(",") if t.strip()]
|
|
return []
|
|
|
|
|
|
def check_forbidden_tools(toolsets: list[str]) -> list[str]:
|
|
"""Prueft, ob verbotene Tools in den geladenen Toolsets enthalten sind."""
|
|
found = []
|
|
# Mapping Toolset -> Tools (statisch, aus toolsets.py Ground Truth)
|
|
toolset_tools = {
|
|
"web": ["web_search", "web_extract"],
|
|
"vision": ["vision_analyze"],
|
|
"file": ["read_file", "write_file", "patch", "search_files"],
|
|
"terminal": ["terminal", "process"],
|
|
"code_execution": ["execute_code"],
|
|
"delegation": ["delegate_task"],
|
|
"cronjob": ["cronjob"],
|
|
"browser": ["browser_navigate", "browser_snapshot", "browser_click",
|
|
"browser_type", "browser_scroll", "browser_back",
|
|
"browser_press", "browser_get_images", "browser_console",
|
|
"web_search"],
|
|
"computer_use": ["computer_use"],
|
|
}
|
|
for ts in toolsets:
|
|
for tool in toolset_tools.get(ts, []):
|
|
if tool in FORBIDDEN_TOOLS:
|
|
found.append(f"{ts}:{tool}")
|
|
return found
|
|
|
|
|
|
def main() -> int:
|
|
toolsets = get_loaded_toolsets()
|
|
forbidden = check_forbidden_tools(toolsets)
|
|
|
|
print("=== CP2A2.2B TOOL-CAPABILITY TEST ===")
|
|
print(f"Loaded toolsets: {toolsets if toolsets else 'NONE (default)'}")
|
|
print(f"Forbidden tools found: {forbidden if forbidden else 'ABSENT'}")
|
|
print(f"RESULT: {'PASS' if not forbidden else 'FAIL'}")
|
|
|
|
return 0 if not forbidden else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|