diff --git a/MISSION_BRIEF.md b/MISSION_BRIEF.md index f8e0a344..bb60ac5f 100644 --- a/MISSION_BRIEF.md +++ b/MISSION_BRIEF.md @@ -1,5 +1,5 @@ -# 🚀 GADDS MISSION BRIEFING - 2026-02-17 15:10 +# 🚀 GADDS MISSION BRIEFING - 2026-02-17 14:49 ## 📊 Status do Sistema - **Git Status:** ✅ Limpo e Sincronizado diff --git a/gadds-dev/gadds-brain/__pycache__/main.cpython-312.pyc b/gadds-dev/gadds-brain/__pycache__/main.cpython-312.pyc new file mode 100644 index 00000000..54cae8e6 Binary files /dev/null and b/gadds-dev/gadds-brain/__pycache__/main.cpython-312.pyc differ diff --git a/gadds-dev/gadds-brain/routers/__pycache__/integrations.cpython-312.pyc b/gadds-dev/gadds-brain/routers/__pycache__/integrations.cpython-312.pyc new file mode 100644 index 00000000..789553fb Binary files /dev/null and b/gadds-dev/gadds-brain/routers/__pycache__/integrations.cpython-312.pyc differ diff --git a/gadds-dev/gadds-brain/routers/__pycache__/system.cpython-312.pyc b/gadds-dev/gadds-brain/routers/__pycache__/system.cpython-312.pyc new file mode 100644 index 00000000..8837a24e Binary files /dev/null and b/gadds-dev/gadds-brain/routers/__pycache__/system.cpython-312.pyc differ diff --git a/gadds-dev/gadds-brain/routers/agent.py b/gadds-dev/gadds-brain/routers/agent.py index 91016598..f0da44d9 100644 --- a/gadds-dev/gadds-brain/routers/agent.py +++ b/gadds-dev/gadds-brain/routers/agent.py @@ -2,7 +2,7 @@ from pydantic import BaseModel from typing import Optional import os -from services import agent_service +from services import agent_service, gemini_service router = APIRouter( prefix="/agent", @@ -34,3 +34,8 @@ def get_diagnostics(token: str = Depends(verify_agent_token)): def execute_action(request: AgentActionRequest, token: str = Depends(verify_agent_token)): result = agent_service.execute_action(request.action, request.target) return result + +@router.get("/manifest") +def agent_manifest(): + """Returns the Function Calling definitions for Gemini/LLMs.""" + return {"tools": gemini_service.get_tool_manifest()} diff --git a/gadds-dev/gadds-brain/routers/integrations.py b/gadds-dev/gadds-brain/routers/integrations.py new file mode 100644 index 00000000..5c1da9a0 --- /dev/null +++ b/gadds-dev/gadds-brain/routers/integrations.py @@ -0,0 +1,26 @@ +from fastapi import APIRouter, Header, HTTPException +from pydantic import BaseModel +from services import agent_service, cloudflare_service + +router = APIRouter( + tags=["Integrations"], +) + +class DNSRecordRequest(BaseModel): + zone_id: str + type: str + name: str + content: str + proxied: bool = True + +@router.get("/integrations/cloudflare/zones") +def cf_list_zones(x_agent_token: str = Header(None)): + if not agent_service.verify_token(x_agent_token): + raise HTTPException(status_code=403, detail="Unauthorized") + return cloudflare_service.list_zones() + +@router.post("/integrations/cloudflare/dns") +def cf_add_dns(req: DNSRecordRequest, x_agent_token: str = Header(None)): + if not agent_service.verify_token(x_agent_token): + raise HTTPException(status_code=403, detail="Unauthorized") + return cloudflare_service.add_dns_record(req.zone_id, req.type, req.name, req.content, req.proxied) diff --git a/gadds-dev/gadds-brain/routers/system.py b/gadds-dev/gadds-brain/routers/system.py new file mode 100644 index 00000000..ee8649d7 --- /dev/null +++ b/gadds-dev/gadds-brain/routers/system.py @@ -0,0 +1,39 @@ +from fastapi import APIRouter +from pydantic import BaseModel +import json +import os + +router = APIRouter( + tags=["System"], +) + +class MaintenanceSettings(BaseModel): + enabled: bool + +# --- HELPERS --- +SETTINGS_FILE = "system_config.json" + +def load_settings(): + if not os.path.exists(SETTINGS_FILE): + return {"maintenance_enabled": False} + try: + with open(SETTINGS_FILE, "r") as f: + return json.load(f) + except: + return {"maintenance_enabled": False} + +def save_settings(settings): + with open(SETTINGS_FILE, "w") as f: + json.dump(settings, f) + +@router.get("/settings/maintenance") +def get_maintenance_settings(): + settings = load_settings() + return {"enabled": settings.get("maintenance_enabled", False)} + +@router.post("/settings/maintenance") +def update_maintenance_settings(settings: MaintenanceSettings): + current_settings = load_settings() + current_settings["maintenance_enabled"] = settings.enabled + save_settings(current_settings) + return {"status": "updated", "enabled": settings.enabled} diff --git a/gadds-dev/gadds-brain/services/__pycache__/gemini_service.cpython-312.pyc b/gadds-dev/gadds-brain/services/__pycache__/gemini_service.cpython-312.pyc new file mode 100644 index 00000000..ac371940 Binary files /dev/null and b/gadds-dev/gadds-brain/services/__pycache__/gemini_service.cpython-312.pyc differ diff --git a/gadds-dev/gadds-brain/test_devops_router.py b/gadds-dev/gadds-brain/test_devops_router.py index cca5bd00..892acd0a 100644 --- a/gadds-dev/gadds-brain/test_devops_router.py +++ b/gadds-dev/gadds-brain/test_devops_router.py @@ -1,5 +1,6 @@ from fastapi.testclient import TestClient from main import app, get_current_user +from routers.devops import get_current_admin_user from unittest.mock import patch client = TestClient(app) @@ -7,7 +8,11 @@ def mock_get_current_user(): return "testuser" +def mock_get_current_admin_user(): + return {"username": "admin", "role": "admin"} + app.dependency_overrides[get_current_user] = mock_get_current_user +app.dependency_overrides[get_current_admin_user] = mock_get_current_admin_user def test_devops_router_registered(): response = client.get("/openapi.json")