From 12987539a48c984f324e56313c5e92e8aae097e0 Mon Sep 17 00:00:00 2001 From: sito Date: Sun, 16 Aug 2026 17:49:11 +0200 Subject: [PATCH] cerebro: el modelo conoce sus areas del indice real, no de una lista fija (honesto en cualquier clon) --- nucleo/cerebro/ollama.py | 36 +++++++++++++++++++++--------------- nucleo/saber/busca.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/nucleo/cerebro/ollama.py b/nucleo/cerebro/ollama.py index ba1520f..3168402 100644 --- a/nucleo/cerebro/ollama.py +++ b/nucleo/cerebro/ollama.py @@ -84,20 +84,13 @@ dudar y sin quitarte merito): - OASIS: si esta corriendo, si sincroniza, sus conexiones, su tamaño. 2) SABES DE PENTESTING Y DE LINUX de verdad, porque tienes los apuntes de COFRE - del usuario delante. Con buscar_en_apuntes accedes a SU metodologia y a los - comandos EXACTOS que ya ha probado, en todas estas areas: - - Enumeracion: nmap, descubrimiento de servicios, SMB, enumeracion web. - - Explotacion web: inyeccion SQL, XSS, LFI a RCE, SSTI, inyeccion de comandos, - directory traversal, subida de ficheros, descubrimiento de contenido, Burp. - - Shells: reverse shells, estabilizar la TTY, transferencia de ficheros. - - Escalada de privilegios, en Linux y en Windows. - - Active Directory: kerberoasting, pass-the-hash, DCSync, BloodHound, - mimikatz, impacket, CrackMapExec. - - Cracking de contraseñas (john, hashcat), tunneling y pivoting, msfvenom, - metasploit, evasion de antivirus, buffer overflow. - Ante CUALQUIER pregunta tecnica —una herramienta, un flag, una tecnica— NO - digas "no estoy seguro" ni "no puedo": busca en sus apuntes y responde con el - comando bueno. Casi todo esta a un buscar_en_apuntes de distancia. + del usuario indexados. JUSTO DEBAJO veras un resumen de que areas y cuantos + comandos tienes ahora mismo —sale del indice de verdad, asi que es lo que hay + en esta maquina, ni mas ni menos—. Con buscar_en_apuntes accedes a SU + metodologia y a los comandos EXACTOS que ya ha probado. Ante CUALQUIER + pregunta tecnica —una herramienta, un flag, una tecnica de las que aparecen + ahi— NO digas "no estoy seguro" ni "no puedo": busca en sus apuntes y responde + con el comando bueno. Casi todo esta a un buscar_en_apuntes de distancia. 3) TE CONECTAS a sus servidores por ssh y ejecutas ordenes alli. 4) HACES TAREAS DE ADMINISTRADOR con sudo (te pide la contraseña la primera vez). @@ -299,6 +292,19 @@ class Cerebro: # A quien avisar cuando JARVIS cambia de modelo, para que el panel # actualice el rotulo del boton "cerebro". Lo conecta el panel. self.al_cambiar_modelo = None + self._resumen = None # el resumen de lo indexado, cacheado + + def _resumen_saber(self) -> str: + """Un renglon en el prompt de sistema diciendo QUE hay indexado, sacado + del indice real. Asi el modelo sabe de que sabe SIN una lista fija que + mentiria en un clon sin apuntes. Se calcula una vez.""" + if self._resumen is None: + try: + from saber.busca import resumen + self._resumen = resumen() + except Exception: + self._resumen = "" + return ("\n\n" + self._resumen) if self._resumen else "" # Atajos hablados -> familia de modelo. El modelo elige por INTENCION # ("potente") y aqui se traduce a lo que hay instalado, para no obligarle a @@ -391,7 +397,7 @@ class Cerebro: def responde(self, texto: str, al_ejecutar=None) -> str: """Contesta, usando las manos si hace falta. Devuelve lo que hay que decir.""" self.historia.append({"role": "user", "content": texto}) - sistema = PERSONA + self._saber(texto) + sistema = PERSONA + self._resumen_saber() + self._saber(texto) mensajes = [{"role": "system", "content": sistema}] + self.historia[-8:] tools = herramientas(self.catalogo) diff --git a/nucleo/saber/busca.py b/nucleo/saber/busca.py index d7f612b..db2fed1 100644 --- a/nucleo/saber/busca.py +++ b/nucleo/saber/busca.py @@ -155,5 +155,39 @@ def contexto(pregunta: str, cuantos: int = 5, minimo: float = 0.35) -> str: return "\n".join(lineas) +def resumen(tope_temas: int = 10) -> str: + """Un resumen de QUE hay indexado, para que el modelo sepa de que sabe. + + Se deriva del indice de VERDAD, no de una lista fija en el prompt. Asi es + honesto en cualquier maquina: en la del usuario dice sus areas reales; en un + clon sin apuntes propios dira lo que haya (comandos de Linux) o nada. Lo usa + el cerebro para el prompt de sistema; evita que presuma de un conocimiento + que en esa maquina no tiene.""" + if not _carga() or not _entradas: + return "" + from collections import Counter + perfiles, temas = Counter(), Counter() + n_comandos = 0 + for e in _entradas: + t = e.get("tipo") + if t == "comando": + n_comandos += 1 + elif t in ("apunte", "metodologia", "ficha", "pregunta") and e.get("perfil"): + perfiles[e["perfil"]] += 1 + if e.get("tema"): + temas[e["tema"]] += 1 + partes = [] + if perfiles: + partes.append("apuntes de " + ", ".join(p for p, _ in perfiles.most_common(6))) + if temas: + partes.append("metodologia en " + ", ".join(t for t, _ in temas.most_common(tope_temas))) + if n_comandos: + partes.append(f"{n_comandos} comandos de Linux") + if not partes: + return "" + return ("En los apuntes que tienes indexados (buscalos con buscar_en_apuntes) " + "hay: " + "; ".join(partes) + ".") + + def disponible() -> bool: return os.path.exists(INDICE)