Saltar al contenido
Menú

Producto

Soluciones

Integraciones

Desarrolladores

Idioma

Producto

Qué guarda y qué sale de tu máquina

Una instalación por defecto escucha solo en tu máquina y no tiene telemetría. Oculta las credenciales reconocidas antes de almacenar el texto capturado, pero el filtro puede dejar pasar información sensible. Los servidores remotos y proveedores opcionales en la nube cambian el destino de los datos.

Por defecto, todo es local.

Instálalo, ejecútalo, y lo único que puede hablar con él es tu propia máquina.

  • Solo loopback

    El servidor escucha en 127.0.0.1:49374. Ningún proceso de fuera de la máquina puede llegar a él. Una instalación nueva igualmente genera un bearer token en un archivo accesible solo para su dueño, que leen los hooks y la CLI, así que nada queda abierto ni siquiera en loopback.

  • Sin telemetría

    El binario de ai-memory no tiene analítica, informes de fallos ni seguimiento de uso. La captura y búsqueda locales por defecto no envían contenido del proyecto a proveedores externos de modelos.

  • Un directorio que es tuyo

    Las páginas de la wiki y el archivo SQLite viven en un solo directorio de datos. En Unix, los directorios nuevos se crean con 0700 y los archivos nuevos con 0600.

  • Sin cifrado en reposo

    Los datos almacenados dependen de los permisos del sistema de archivos. Las instalaciones existentes no reciben chmod automáticamente. Usa cifrado de disco si necesitas protección con la máquina apagada.

El texto capturado se filtra antes de almacenarlo.

Los payloads de hooks son texto no confiable. Pasan por un sanitizer que oculta credenciales reconocidas y limita su tamaño. Puede dejar pasar información sensible.

Payload del hook

sanitize()

Secretos fuera

Guardado

Tamaño limitado

El sanitizer es el único camino de un payload de hook hacia el store.
  • Una sola entrada

    El tipo que se guarda solo lo puede construir sanitize(). El código que se salte la limpieza de privacidad no compila.

  • Los secretos se reemplazan

    Las coincidencias se convierten en marcadores tipados como [REDACTED:github_token] o [REDACTED:jwt]. Eso cubre secretos dentro de JSON y rutas de credenciales de Windows, y se eliminan las secuencias de escape de terminal. La limpieza es best effort.

  • Los tamaños tienen tope

    Los extractos de herramientas se cortan a 2 KB y los prompts a 16 KiB. Un tope final de 16 KiB se aplica a todo cuerpo guardado, después de la redacción.

  • Las entradas de herramientas no se conservan

    Los eventos PreToolUse nunca retienen comandos, argumentos, rutas ni cuerpos de entrada. Las observaciones son un rastro de auditoría, nunca una transcripción completa. El opcional [ingest] index_file_paths añade un campo: la ruta relativa al checkout del único archivo que nombró una llamada de herramienta conservada, nunca su contenido, y una ruta ignorada sigue sin enviar nada.

Deja fuera una ruta o un repositorio

  • Un bloque [capture] en .ai-memory.toml lista las rutas a ignorar. Los eventos que coinciden se descartan en tu máquina, antes de la cola local, de la red y de los logs.
  • El modo allowlist lo invierte: un repositorio sin el archivo no emite ningún evento.
  • Un conjunto de reglas inválido cae a solo metadatos. Nunca aplica media política.
  • Las rutas de archivos y los argumentos de shell reconocidos se analizan léxicamente. Los enlaces simbólicos, las variables de shell y los scripts leídos de archivos pueden eludir el filtro; los prompts no se filtran por ruta. El filtro de captura tiene límites y no ofrece DLP completo.
  • La salida del asistente nunca se guarda por defecto. Hacen falta un flag en el servidor y otro en el cliente, los dos a la vez.
  • El backfill y las importaciones de workstreams gestionados aplican las mismas reglas de captura a las llamadas de herramientas y sus resultados. Las llamadas excluidas se omiten; si la política no puede comprobar que una llamada es segura, solo conserva metadatos de la familia de herramientas.
reglas de captura por repositorio
# .ai-memory.toml en el repositorio
[capture]
ignore_paths = ["private/**", "~/personal-notes/**"]

# O captura solo los repositorios que se apunten
ai-memory install-hooks --apply --capture-mode allowlist

Protege según tu despliegue

El acceso remoto necesita autenticación y TLS, también en la LAN. Aplica todos los requisitos de tu configuración antes de conectar clientes.

  1. Una persona, una máquina

    Loopback, un token en un archivo

    ai-memory init crea el token en <data_dir>/auth-tokens/default y los hooks, la CLI y el puente MCP lo leen de ahí. Una instalación anterior a la 3.0 sigue funcionando sin autenticación hasta que ejecutes ai-memory auth enable, que genera el token y vuelve a registrar cada cliente.

  2. Un equipo de homelab o una segunda máquina

    Bearer token para la LAN

    Crea un token con ai-memory generate-auth-token y define AI_MEMORY_AUTH_TOKEN. Se compara en tiempo constante y protege /mcp, /hook, /handoff y las rutas de administración y de la API. Define también AI_MEMORY_ALLOWED_HOSTS; bloquea el DNS rebinding y no sustituye al token.

  3. Cualquier cosa más allá de loopback

    TLS con un proxy inverso

    ai-memory no termina TLS, por diseño. Los bearer tokens viajan sin cifrar por la red, así que pon delante Caddy, nginx o un Cloudflare Tunnel. El repo trae plantillas de compose para Caddy y cloudflared. Define AI_MEMORY_AUTH__SECURE_COOKIE=true cuando la gente inicie sesión desde otras máquinas.

  4. Escribe más de una persona

    Cuentas y claves de API

    Las contraseñas se guardan como hashes Argon2id. Cada máquina recibe una clave aim_ que se imprime una vez y no se vuelve a mostrar. Con ai-memory api-key rotate <id> la clave antigua empieza a devolver 401 al instante. La primera cuenta deja todas las rutas /admin/* solo para root.

  5. Tu equipo ya tiene Keycloak, Okta o Entra ID

    Autenticación OIDC por dispositivo para los hooks

    Los hooks nativos y la CLI pueden llevar un token obtenido con ai-memory auth login oidc-device. El servidor no valida tokens OIDC por sí mismo, así que esto necesita delante un gateway compatible con OIDC. Es autenticación de hooks y de CLI a través de un gateway, y el servidor no trae login SSO integrado.

Qué sale de la máquina, y cuándo.

Estas opciones pueden enviar contenido de memoria a un proveedor de modelos; están desactivadas por defecto. Los hooks hacia servidores remotos, los webhooks de admisión configurados y tus destinos de copia son otras rutas de datos que debes revisar.

RutaQué se envíaCómo se activaPor defecto
Embeddings remotosEl texto completo de cada página guardada. Si lo activas más tarde, también se procesa el corpus que ya existe. Esta ruta no se sanea como las demás.embedding_provider = openai | voyage | google | openai-compatApagado
Captura de la salida del asistenteEl texto del último turno del asistente, y solo si además has configurado un LLM en la nube. Es global a la instalación y solo para Claude Code y Codex.capture_assistant en el servidor y install-hooks --capture-assistant en el clienteApagado
Rerank con LLMCada consulta en vivo, más hasta 30 títulos y fragmentos de página acotados. La consulta no se redacta, porque la redacción podría cambiar su significado.AI_MEMORY_RERANKER=llmApagado
Consolidación y lint con LLMLos prompts construidos con observaciones y páginas guardadas van al proveedor que hayas elegido. Apúntalo a un modelo local y no sale nada.AI_MEMORY_LLM_PROVIDERApagado

Tu máquina

Hooks

Wiki e índice

Embedder local

Terceros

Wiki e índice

Embeddings en la nube

LLM en la nube

Rerank con LLM

Opt-in, apagado de inicio

Las líneas continuas se quedan dentro. Las discontinuas solo existen después de que cambies un ajuste.

La captura y búsqueda locales predeterminadas no envían contenido del proyecto a proveedores de modelos. Si eliges un proveedor en la nube, revisa sus condiciones y tratamiento de datos. Consulta las notas de tratamiento de datos del proyecto.

Quién lo escribió y cómo quitarlo.

Atribución y auditoría

  • Con las cuentas activadas, cada escritura lleva su autor. Las páginas registran author_id y un bloque last_modified_by en el frontmatter.
  • Cada mutación queda en una tabla audit_log, con la identidad del usuario en las filas atribuidas.
  • La wiki es un repositorio git, así que cada cambio de página es también un commit al que puedes hacer diff y que puedes restaurar.
  • Los webhooks de admisión reciben el actor y pueden rechazar una operación.
  • Todavía no hay una pantalla para el registro de auditoría. Las filas están en SQLite.

Qué elimina un purge

Purge elimina lógicamente los datos del proyecto seleccionado. El historial y las copias de seguridad anteriores pueden conservar copias. Por separado, las reglas de retención pueden eliminar páginas de sesiones sin uso, y las fechas explícitas de caducidad pueden eliminar otras páginas. Sin --confirm, purge solo muestra lo que eliminaría.

purge
# Elimina una sesión
ai-memory purge-session --workspace default --project my-app --session-id <uuid> --confirm

# Elimina un proyecto entero
ai-memory purge-project --project experimental --confirm
Después de un purgePor defectoCon --compact
Accesible por la API o las herramientas MCPNoNo
Aparece en las búsquedasNoNo
Archivo markdown vivo en la wikiNo, best effortNo, best effort
Bytes que siguen dentro de memory.sqliteSí, en páginas libresNo
Texto que sigue en el historial git de la wikiSíSí
Presente en copias de seguridad anterioresSíSí

--compact no es un borrado forense. Para quitar texto del historial tienes que reescribir el historial git de la wiki y rotar tus copias de seguridad por tu cuenta. Las operaciones de ciclo de vida tienen el procedimiento completo.

Hasta dónde llega.

Reportar una vulnerabilidad

  • No abras un issue público. Abre un aviso de seguridad privado en GitHub.
  • Recibes respuesta en un plazo de 7 días. El objetivo para el parche es de 30 días, con mención en el changelog salvo que prefieras que no.
  • Solo la última versión recibe correcciones de seguridad.
  • Los archivos de cada versión se publican con su SHA-256, y las actions de CI están fijadas a commits revisados.

Modelo de amenazas y política en SECURITY.md

Preguntas y respuestas

¿ai-memory envía mi código o mis prompts a algún sitio?

Por defecto, ai-memory mantiene el contenido capturado del proyecto en tu máquina. Si te conectas a un servidor compartido, lo envía allí. Los embeddings en la nube o las funciones opcionales de modelos de lenguaje envían datos a los proveedores que configures. Tu agente de programación tiene sus propios ajustes de datos y conexiones con proveedores.

¿El embedder local necesita red?

Al iniciarse por primera vez, el embedder local descarga unos 87 MB de archivos del modelo de Hugging Face y verifica sus checksums. No envía contenido del proyecto para esa descarga. Define embedding_provider = "none" o proporciona los archivos del modelo para evitarla.

¿Se guardan los secretos?

Todo payload de hook pasa por un sanitizer antes de guardarse. Las credenciales reconocidas se reemplazan por marcadores tipados [REDACTED:kind] y los cuerpos tienen tope de tamaño. El sanitizer es una limpieza de credenciales best effort y no da ninguna garantía.

¿Puedo borrar una sesión para siempre?

El purge es un borrado lógico. El contenido deja de ser accesible y de aparecer en las búsquedas, pero el texto sigue en el historial git de la wiki y en las copias de seguridad anteriores. El flag --compact limpia las páginas libres de SQLite y no es un borrado forense.

¿ai-memory es multi-tenant?

No. Los permisos por proyecto pueden restringir cuentas de usuarios de la base de datos, pero sigue siendo un servicio de un solo tenant. Root tiene acceso a todos los proyectos y los despliegues con proxy de confianza aplican el control de acceso en el proxy. Usa servidores separados para equipos que necesiten aislamiento independiente.

Pruébalo primero en loopback.

Empieza con un proyecto local sin datos sensibles. Revisa qué se captura antes de conectar un servidor compartido o un proveedor en la nube.