diff --git a/src/__init__.py b/src/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/__pycache__/__init__.cpython-313.pyc b/src/__pycache__/__init__.cpython-313.pyc
deleted file mode 100644
index 8f305df..0000000
Binary files a/src/__pycache__/__init__.cpython-313.pyc and /dev/null differ
diff --git a/src/__pycache__/config.cpython-313.pyc b/src/__pycache__/config.cpython-313.pyc
deleted file mode 100644
index bcf9b5f..0000000
Binary files a/src/__pycache__/config.cpython-313.pyc and /dev/null differ
diff --git a/src/__pycache__/openai_client.cpython-313.pyc b/src/__pycache__/openai_client.cpython-313.pyc
deleted file mode 100644
index 9e801f4..0000000
Binary files a/src/__pycache__/openai_client.cpython-313.pyc and /dev/null differ
diff --git a/src/__pycache__/run.cpython-313.pyc b/src/__pycache__/run.cpython-313.pyc
deleted file mode 100644
index 838094c..0000000
Binary files a/src/__pycache__/run.cpython-313.pyc and /dev/null differ
diff --git a/src/agent/__init__.py b/src/agent/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/agent/__pycache__/__init__.cpython-313.pyc b/src/agent/__pycache__/__init__.cpython-313.pyc
deleted file mode 100644
index 3f60f4a..0000000
Binary files a/src/agent/__pycache__/__init__.cpython-313.pyc and /dev/null differ
diff --git a/src/agent/__pycache__/orchestrator.cpython-313.pyc b/src/agent/__pycache__/orchestrator.cpython-313.pyc
deleted file mode 100644
index b3cfe80..0000000
Binary files a/src/agent/__pycache__/orchestrator.cpython-313.pyc and /dev/null differ
diff --git a/src/agent/__pycache__/planner.cpython-313.pyc b/src/agent/__pycache__/planner.cpython-313.pyc
deleted file mode 100644
index 44681e2..0000000
Binary files a/src/agent/__pycache__/planner.cpython-313.pyc and /dev/null differ
diff --git a/src/agent/orchestrator.py b/src/agent/orchestrator.py
deleted file mode 100644
index 440057c..0000000
--- a/src/agent/orchestrator.py
+++ /dev/null
@@ -1,21 +0,0 @@
-"""Minimal orchestrator that can call planner (GPT-5) to pick actions.
-For MVP we call hardcoded skills; planner integration is available for future loops.
-"""
-from typing import Dict, Any, Callable
-from . import planner
-from ..skills import login, xss_reflected_low, sqli_low, xss_stored_low, xss_dom_low, xss_reflected_low_smart, sqli_low_smart
-
-SKILLS: Dict[str, Callable[[str], Dict[str, Any]]] = {
- "login": lambda base: login.run(base),
- "xss_stored_low": lambda base: xss_stored_low.run(base),
- "xss_reflected_low": lambda base: xss_reflected_low.run(base),
- "xss_dom_low": lambda base: xss_dom_low.run(base),
- "sqli_low": lambda base: sqli_low.run(base),
- "sqli_low_smart": lambda base: sqli_low_smart.run(base),
- "xss_reflected_low_smart": lambda base: xss_reflected_low_smart.run(base),
-}
-
-def run_skill(base_url: str, skill: str) -> Dict[str, Any]:
- if skill not in SKILLS:
- raise KeyError(f"Unknown skill: {skill}")
- return SKILLS[skill](base_url)
diff --git a/src/agent/planner.py b/src/agent/planner.py
deleted file mode 100644
index b5cb7a0..0000000
--- a/src/agent/planner.py
+++ /dev/null
@@ -1,39 +0,0 @@
-from typing import Dict, Any, List
-from ..models import get_provider
-
-_provider = get_provider()
-
-def decide(context: dict) -> dict:
- """Mantém compat com o antigo: planejar uma ação simples."""
- system = "You are a safe web security agent. Return STRICT JSON."
- user = (
- "Given this context, propose one next action as JSON:\n"
- "{'tool':'navigate|fill_form|click|noop','target':'url|selector','data':null|{...},'why':'short'}\n\n"
- f"Context:\n{context}"
- )
- res = _provider.complete_json(system, user)
- if not isinstance(res, dict):
- res = {"tool":"noop","target":"","data":None,"why":"fallback"}
- return res
-
-def propose_fuzz_payloads(category: str, page_context: dict, seeds: List[str], budget: int=8) -> List[str]:
- """Pede ao modelo variações de payload com base nos seeds e contexto da página."""
- system = "You are an offensive security payload generator. Return STRICT JSON: {'payloads': [..]}."
- user = (
- f"Category: {category}\n"
- f"Seeds: {seeds}\n"
- f"Page context (inputs, hints, server msgs): {page_context}\n"
- f"Generate up to {budget} diverse payloads. Focus on low-noise, high-signal candidates for DVWA Low.\n"
- "Only return JSON: {'payloads': ['...','...']}."
- )
- res = _provider.complete_json(system, user)
- pls = res.get("payloads", []) if isinstance(res, dict) else []
- # sanity filter
- uniq = []
- for p in pls:
- if not isinstance(p, str): continue
- p = p.strip()
- if p and p not in uniq and len(p) < 256:
- uniq.append(p)
- # fallback: se nada vier, retorne seeds
- return uniq or seeds[:budget]
diff --git a/src/agent/score.py b/src/agent/score.py
deleted file mode 100644
index 28cbae9..0000000
--- a/src/agent/score.py
+++ /dev/null
@@ -1,26 +0,0 @@
-import json, argparse
-from .agent.orchestrator import run_skill
-
-SUITE = [
- ("xss_reflected_low", {}),
- ("xss_stored_low", {}),
- ("sqli_low", {}),
- # depois: ("command_injection_low", {}), ("csrf_low", {}), ("upload_low", {})
-]
-
-def main():
- ap = argparse.ArgumentParser()
- ap.add_argument('--target', required=True)
- args = ap.parse_args()
- results = []
- ok_count = 0
- for skill, kwargs in SUITE:
- res = run_skill(args.target, skill)
- results.append((skill, res))
- ok_count += 1 if res.get("ok") else 0
- print(f"[{skill}] -> {'OK' if res.get('ok') else 'FAIL'}")
- print(f"\nScore: {ok_count}/{len(SUITE)}")
- print(json.dumps({k: v for k, v in results}, indent=2, ensure_ascii=False))
-
-if __name__ == "__main__":
- main()
diff --git a/src/config.py b/src/config.py
deleted file mode 100644
index d954c69..0000000
--- a/src/config.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from pydantic import BaseModel
-import os
-
-class Settings(BaseModel):
- # Provider: "openai", "ollama", "llamacpp"
- model_provider: str = os.getenv("MODEL_PROVIDER", "openai").lower()
-
- # OpenAI
- openai_api_key: str = os.getenv("OPENAI_API_KEY", "")
- openai_model: str = os.getenv("OPENAI_MODEL", "gpt-5")
-
- # Ollama (LLaMA)
- llama_base_url: str = os.getenv("LLAMA_BASE_URL", "http://localhost:11434")
- llama_model: str = os.getenv("LLAMA_MODEL", "llama3.1") # ex: llama3.1, llama3.2:latest
-
- # llama.cpp (local python)
- llamacpp_model_path: str = os.getenv("LLAMACPP_MODEL_PATH", "")
- llamacpp_n_threads: int = int(os.getenv("LLAMACPP_N_THREADS", "4"))
-
- # Safety / target
- allowlist_hosts: list[str] = [h.strip() for h in os.getenv("ALLOWLIST_HOSTS", "localhost,127.0.0.1,dvwa").split(",")]
- dvwa_url_env: str = os.getenv("DVWA_URL", "").strip()
- headless: bool = os.getenv("HEADLESS", "true").lower() == "true"
-
-settings = Settings()
diff --git a/src/detectors/__init__.py b/src/detectors/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/detectors/__pycache__/__init__.cpython-313.pyc b/src/detectors/__pycache__/__init__.cpython-313.pyc
deleted file mode 100644
index b30f559..0000000
Binary files a/src/detectors/__pycache__/__init__.cpython-313.pyc and /dev/null differ
diff --git a/src/detectors/__pycache__/sql_errors.cpython-313.pyc b/src/detectors/__pycache__/sql_errors.cpython-313.pyc
deleted file mode 100644
index ff05aa8..0000000
Binary files a/src/detectors/__pycache__/sql_errors.cpython-313.pyc and /dev/null differ
diff --git a/src/detectors/sql_errors.py b/src/detectors/sql_errors.py
deleted file mode 100644
index c819b62..0000000
--- a/src/detectors/sql_errors.py
+++ /dev/null
@@ -1,13 +0,0 @@
-import re
-
-SQL_ERRORS = [
- r"SQL syntax.*MySQL",
- r"Warning: mysql_",
- r"Unclosed quotation mark",
- r"SQLSTATE\[HY000\]",
- r"You have an error in your SQL syntax",
-]
-compiled = [re.compile(p, re.IGNORECASE) for p in SQL_ERRORS]
-
-def has_sql_error(text: str) -> bool:
- return any(c.search(text) for c in compiled)
diff --git a/src/fuzz/__pycache__/engine.cpython-313.pyc b/src/fuzz/__pycache__/engine.cpython-313.pyc
deleted file mode 100644
index 8a70788..0000000
Binary files a/src/fuzz/__pycache__/engine.cpython-313.pyc and /dev/null differ
diff --git a/src/fuzz/__pycache__/seeds.cpython-313.pyc b/src/fuzz/__pycache__/seeds.cpython-313.pyc
deleted file mode 100644
index 5ed9b76..0000000
Binary files a/src/fuzz/__pycache__/seeds.cpython-313.pyc and /dev/null differ
diff --git a/src/fuzz/engine.py b/src/fuzz/engine.py
deleted file mode 100644
index 081484f..0000000
--- a/src/fuzz/engine.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from typing import List, Dict, Any, Callable
-from ..agent.planner import propose_fuzz_payloads
-
-def generate_candidates(category: str, page_ctx: dict, seeds: List[str], budget: int=8) -> List[str]:
- """Combina seeds + LLM proposals."""
- props = propose_fuzz_payloads(category, page_ctx, seeds, budget)
- pool = list(dict.fromkeys(seeds + props)) # dedup preservando ordem
- return pool[: max(budget, len(seeds))]
-
-def try_candidates(try_func: Callable[[str], Dict[str, Any]], candidates: List[str]) -> Dict[str, Any]:
- """Executa candidatos até achar sucesso, retornando o melhor resultado."""
- best = {"ok": False}
- for p in candidates:
- res = try_func(p)
- if res.get("ok"):
- return res
- # guarda “quase bom” se tiver um reason/signal
- if not best.get("ok") and len(res.get("evidence_excerpt","")) > len(best.get("evidence_excerpt","")):
- best = res
- return best
diff --git a/src/fuzz/seeds.py b/src/fuzz/seeds.py
deleted file mode 100644
index 00c9b70..0000000
--- a/src/fuzz/seeds.py
+++ /dev/null
@@ -1,19 +0,0 @@
-SQLI_SEEDS = [
- "1' OR '1'='1' -- ",
- "' OR '1'='1' -- ",
- "1' OR 1=1 -- ",
- "1' OR '1'='1'#",
-]
-
-XSS_REFLECTED_SEEDS = [
- '',
- '">',
- '
',
- '