Raymon

Ingesta HTTP con estado + servidor MCP + interfaz de terminal para registros estilo Ray.

Documentación

raymon

Crates.io Version CI CodSpeed Crates.io Downloads License Discord Buymecoffee

Raymon es un receptor de logs estilo Ray, local-first, con un endpoint HTTP de ingesta, un servidor MCP Streamable HTTP, almacenamiento JSONL duradero y una interfaz de terminal Ratatui.

Usa Raymon cuando quieras que los volcados compatibles con Ray de tu aplicación sean visibles en una terminal y buscables por agentes de IA a través de MCP.

Raymon terminal UI screenshot

Qué ofrece Raymon

SuperficieQué hace
Ingesta HTTPAcepta sobres JSON estilo Ray en POST /.
Servidor MCPExpone raymon.search y raymon.get_entries en POST /mcp.
Interfaz de terminalNavega por logs en vivo, filtra por pantalla/tipo/color, abre cargas útiles, copia detalles y gestiona archivos JSONL.
AlmacenamientoPersiste entradas en data/entries.jsonl bajo la raíz de almacenamiento activa.
API de crate RustExpone raymon::run() más los módulos públicos raymon_core, raymon_ingest, raymon_storage, raymon_mcp y raymon_tui para integración y pruebas.

Raymon escucha en el puerto predeterminado de Ray, 23517, por lo que muchas bibliotecas cliente de Ray pueden apuntar a él con poca o ninguna configuración.

Inicio rápido

Requisitos previos

  • Un binario de Raymon desde Cargo, Homebrew, GitHub Releases o una compilación local desde el código fuente.
  • Una terminal. El modo de ejecución predeterminado abre la TUI.

Ejecutar con eventos generados

Inicia Raymon en modo demo:

raymon --demo

Resultado esperado: la TUI se abre y los eventos demo comienzan a aparecer. Presiona ? para obtener ayuda o q para detener Raymon.

Ejecutar sin la TUI y enviar un evento

Inicia Raymon en una terminal:

RAYMON_NO_TUI=1 raymon

Envía un evento estilo Ray desde otra terminal:

curl -sS http://127.0.0.1:23517/ \
  -H 'content-type: application/json' \
  -d '{
    "uuid": "readme-demo-1",
    "payloads": [
      {
        "type": "log",
        "content": {
          "message": "hello from Raymon",
          "color": "green"
        },
        "origin": {
          "hostname": "local",
          "fileName": "README.md",
          "lineNumber": 1
        }
      }
    ],
    "meta": {
      "project": "raymon-readme",
      "host": "local",
      "screen": "readme"
    }
  }'

La salida esperada contiene:

{"ok":true,"error":null}

Detén el servidor con Ctrl+C.

Instalación

Cargo

Raymon requiere Rust 1.89 o más reciente.

cargo install raymon

Homebrew

brew install bnomei/raymon/raymon

GitHub Releases

Descarga un archivo precompilado desde GitHub Releases, extráelo y coloca raymon en tu PATH.

Desde el código fuente

git clone https://github.com/bnomei/raymon.git
cd raymon
cargo build --release

El binario se escribe en target/release/raymon.

Envío de logs

Raymon almacena entradas de log estilo Ray. Genéralas con una biblioteca compatible con Ray en tu aplicación y luego apunta esa biblioteca al host y puerto de Raymon.

Las integraciones conocidas de Ray incluyen PHP, JavaScript, Bash, Ruby, Python, Go, Dart y Rust. Para cargas útiles nativas de Rust, consulta ray-dbg.

El endpoint local predeterminado es:

http://127.0.0.1:23517/

Si tu remitente usa los valores predeterminados de escritorio de Ray, Raymon generalmente funciona iniciando raymon antes de emitir logs.

Los sobres entrantes deben incluir un uuid no vacío, al menos una carga útil, un payloads[*].type no vacío y un payloads[*].origin.hostname no vacío. Cuando el mismo UUID se ingiere más de una vez, Raymon fusiona las cargas útiles en una sola entrada y almacena la entrada fusionada antes de publicar el estado en vivo o los eventos.

Modos de ejecución

TUI local

raymon

Esto inicia el endpoint HTTP de ingesta, el endpoint MCP y la TUI en 127.0.0.1:23517.

Servidor local sin interfaz

RAYMON_NO_TUI=1 raymon

Úsalo para registro en segundo plano, flujos de trabajo solo MCP o pruebas.

Servidor remoto con autenticación

export RAYMON_AUTH_TOKEN="change-me"
RAYMON_ALLOW_REMOTE=1 \
RAYMON_HOST=0.0.0.0 \
RAYMON_NO_TUI=1 \
raymon

Raymon rechaza enlaces que no sean de bucle local a menos que RAYMON_ALLOW_REMOTE=1 esté configurado. Si la dirección de enlace no es de bucle local, Raymon también requiere RAYMON_AUTH_TOKEN a menos que establezcas explícitamente RAYMON_ALLOW_INSECURE_REMOTE=1.

Referencia de CLI

raymon [OPTIONS]
OpciónSignificado
--host <HOST>Sobrescribir el host de enlace HTTP.
--port <PORT>Sobrescribir el puerto de enlace HTTP.
--config <PATH>Cargar un archivo de configuración JSON específico en lugar de buscar ray.json.
--ide <COMMAND>Comando usado por la TUI para abrir archivos de origen.
--editor <COMMAND>Comando usado por la TUI para abrir cargas útiles de detalle seleccionadas en un archivo temporal.
--jq <COMMAND>Comando jq usado para búsquedas en el panel de detalle.
--tuiHabilitar la TUI.
--no-tuiDeshabilitar la TUI.
--demoGenerar eventos demo locales.
-v, --verboseHabilitar registro de información. Usa -vv para registro de depuración.
-h, --helpImprimir ayuda de CLI.
-V, --versionImprimir la versión de Raymon.

La precedencia de configuración es:

  1. Valores predeterminados.
  2. ray.json.
  3. Variables de entorno.
  4. Banderas de CLI.

Configuración

Raymon busca ray.json desde el directorio actual hacia arriba. Si encuentra uno, el directorio que contiene ese archivo se convierte en la raíz de almacenamiento. Sin ray.json, el directorio de trabajo actual es la raíz de almacenamiento.

Ejemplo de ray.json:

{
  "host": "127.0.0.1",
  "port": 23517,
  "tui": true,
  "max_entries": 10000,
  "storage_max_entries": 100000,
  "mcp_redact_payloads": false
}

Las variables de entorno usan los mismos conceptos con nombres RAYMON_:

VariablePredeterminadoSignificado
RAYMON_ENABLEDtrueHabilitar o deshabilitar Raymon.
RAYMON_HOST127.0.0.1Dirección de enlace HTTP.
RAYMON_PORT23517Puerto de enlace HTTP.
RAYMON_TUItrueHabilitar la TUI.
RAYMON_NO_TUIfalseDeshabilitar la TUI. Tiene prioridad sobre RAYMON_TUI.
RAYMON_IDEcodeComando de IDE usado para saltos de archivo de origen. Para saltos de línea de VS Code, usa code --goto.
RAYMON_EDITORVISUAL/EDITOR/vimComando de editor usado para cargas útiles de detalle seleccionadas.
RAYMON_JQjqComando jq usado para búsqueda de detalle.
RAYMON_MAX_BODY_BYTES1048576Tamaño máximo del cuerpo de solicitud HTTP y del tamaño de entrada fusionada almacenada.
RAYMON_MAX_QUERY_LEN265Longitud máxima de búsqueda, comando, selector y consulta MCP en bytes.
RAYMON_MAX_ENTRIES10000Máximo de entradas mantenidas en memoria para MCP y resincronización en vivo. 0 deshabilita la expulsión en memoria.
RAYMON_STORAGE_MAX_ENTRIES100000Máximo de entradas distintas mantenidas en data/entries.jsonl. 0 deshabilita la retención de almacenamiento.
RAYMON_JQ_TIMEOUT_MS10000Tiempo de espera de búsqueda de detalle jq en milisegundos.
RAYMON_ALLOW_REMOTEfalsePermitir enlace a direcciones que no sean de bucle local.
RAYMON_ALLOW_INSECURE_REMOTEfalsePermitir enlace sin bucle local sin autenticación. Evita esto a menos que aceptes el riesgo de exposición.
RAYMON_INSECURE_REMOTEsin configurarAlias para RAYMON_ALLOW_INSECURE_REMOTE.
RAYMON_ALLOW_MCP_SHUTDOWNfalsePermitir que los métodos personalizados MCP ray/quit, ray/exit, raymon/quit y raymon/exit detengan Raymon.
RAYMON_MCP_REDACT_PAYLOADSfalseRedactar campos de carga útil de apariencia sensible en resultados MCP y notificaciones de eventos.
RAYMON_AUTH_TOKENsin configurarRequerir Authorization: Bearer <token> o x-raymon-token: <token> para todas las solicitudes HTTP.
RAYMON_TOKENsin configurarAlias para RAYMON_AUTH_TOKEN.
RAYMON_TUI_PALETTEsin configurarSobrescribir la paleta de la TUI con 18 colores separados por comas.
RAYMON_PALETTEsin configurarAlias para RAYMON_TUI_PALETTE.
RAYMON_LOGsin configurarFiltro de rastreo. Se usa RUST_LOG cuando no está configurado.

RAYMON_TUI_PALETTE espera:

fg,bg,black,red,green,yellow,blue,magenta,cyan,white,bright_black,bright_red,bright_green,bright_yellow,bright_blue,bright_magenta,bright_cyan,bright_white

Cada color puede ser #RRGGBB, rgb:RR/GG/BB o rgb:RRRR/GGGG/BBBB.

Almacenamiento

Raymon almacena entradas como JSON delimitado por nuevas líneas en:

data/entries.jsonl

El directorio data/ se crea bajo la raíz de almacenamiento activa. La TUI también escribe archivos de sesión bajo:

data/archives/

Al iniciar, Raymon restaura las entradas almacenadas en el estado central para que la búsqueda MCP pueda ver los logs persistidos. La TUI comienza con una vista en vivo nueva y te permite navegar por los archivos de archivo desde el panel de archivos.

La retención mantiene los UUIDs distintos más recientes. Durante la restauración, Raymon omite líneas JSONL corruptas y entradas de blob heredadas en lugar de abortar el inicio.

API HTTP

Método y rutaPropósito
POST /Endpoint de ingesta de Ray para sobres de carga útil de Ray.
POST /mcpEndpoint MCP Streamable HTTP. Prefiere esta ruta para clientes MCP.

POST / también acepta solicitudes JSON-RPC de MCP como respaldo de compatibilidad cuando el análisis de ingesta rechaza el cuerpo y el JSON parece JSON-RPC de MCP. Prefiere /mcp para nuevos clientes MCP.

Cuando RAYMON_AUTH_TOKEN está configurado, cada solicitud debe incluir uno de estos encabezados:

Authorization: Bearer <token>
x-raymon-token: <token>

Las respuestas de ingesta usan códigos de estado HTTP:

EstadoSignificado
200El sobre se almacenó y publicó.
400El cuerpo de la solicitud era JSON inválido.
413La entrada fusionada excedió RAYMON_MAX_BODY_BYTES.
422Al sobre le faltaban campos requeridos o tenía datos inválidos.
500Falló el manejo de almacenamiento, estado o bus de eventos.

Configuración de MCP

Agrega un servidor MCP local de Raymon a Codex:

codex mcp add raymon --url http://127.0.0.1:23517/mcp

Configuración remota con autenticación de token portador:

codex mcp add raymon \
  --url http://<host>:23517/mcp \
  --bearer-token-env-var RAYMON_AUTH_TOKEN

JSON MCP equivalente:

{
  "mcpServers": {
    "raymon": {
      "url": "http://127.0.0.1:23517/mcp"
    }
  }
}

JSON MCP remoto con autenticación:

{
  "mcpServers": {
    "raymon": {
      "url": "http://<host>:23517/mcp",
      "headers": {
        "Authorization": "Bearer ${RAYMON_AUTH_TOKEN}"
      }
    }
  }
}

Herramientas MCP

Raymon expone dos herramientas de solo lectura.

raymon.search

Busca entradas almacenadas y devuelve resúmenes compactos.

Entrada:

{
  "query": "string (optional; plain text or /regex/)",
  "types": ["string"],
  "colors": ["string"],
  "screen": "string (optional)",
  "project": "string (optional)",
  "host": "string (optional)",
  "limit": "number (optional)",
  "offset": "number (optional)"
}

types y colors también aceptan cadenas separadas por comas:

{ "types": "error,exception", "colors": "red" }

Resultado:

{
  "entries": [
    {
      "uuid": "string",
      "received_at": 0,
      "project": "string",
      "host": "string",
      "screen": "string",
      "payload_count": 1,
      "payload_types": ["log"]
    }
  ],
  "count": 1,
  "limit": 100,
  "offset": 0,
  "scan_limit": 5000
}

Valores predeterminados y límites:

CampoPredeterminadoLímite
limit100500
offset05000
scan_limit5000Ventana fija de escaneo de entradas más recientes
querysin configurarRAYMON_MAX_QUERY_LEN bytes

raymon.get_entries

Obtiene entradas completas por UUID.

Entrada:

{
  "uuids": ["<uuid>"],
  "redact": false
}

Alias de entrada admitidos:

{ "uuid": "<uuid>" }
{ "uuids": "<uuid-1>,<uuid-2>" }

redacted y redact_payloads son alias para redact. Cuando la redacción está habilitada, Raymon reemplaza campos de carga útil de apariencia sensible como contraseñas, tokens, claves de API, cookies y secretos.

Resultado:

{
  "entries": [
    {
      "uuid": "string",
      "received_at": 0,
      "project": "string",
      "host": "string",
      "screen": "string",
      "session_id": null,
      "payloads": [
        {
          "type": "log",
          "content": {},
          "origin": {
            "project": "string",
            "host": "string",
            "screen": "string",
            "session_id": null,
            "function_name": null,
            "file": null,
            "line_number": null
          }
        }
      ]
    }
  ]
}

Límites:

LímiteValor
UUIDs por solicitud100
Bytes por UUID265
Resultado de herramienta serializado1048576 bytes

Los pares MCP conectados reciben notificaciones ray/event para eventos insertados, actualizados, borrados y con retraso. Si un cliente recibe una notificación de retraso, debe actualizarse con raymon.search.

TUI

La TUI está orientada al teclado y tiene ayuda integrada. Presiona ? para el mapa de teclas completo.

ClaveAcción
?Abrir los atajos de teclado.
qSalir de Raymon y detener el servidor HTTP/MCP.
SpaceAbrir el menú de selección.
/ o fBuscar mensajes y rutas de archivos con búsqueda difusa.
rIniciar una búsqueda con expresiones regulares.
:Buscar dentro del payload de detalle seleccionado. Usa jq para consultas JSON cuando esté disponible.
j/k, flechasMoverse en el panel enfocado.
h/l, flechas izquierda/derechaMover el foco a la izquierda o a la derecha.
J/K, PageUp/PageDownDesplazarse por el panel de detalle.
Tab, Shift+TabMover el foco entre registros, detalle y archivos.
gIr a una posición de registro.
GSaltar al último registro.
sAjustar los filtros de color y tipo a la entrada de registro seleccionada.
uRestablecer búsqueda y filtros.
pPausar o reanudar las actualizaciones en vivo.
aAlternar el panel de archivos.
xArchivar la vista actual en un archivo JSONL.
EnterCargar el archivo seleccionado cuando el panel de archivos tenga el foco.
nRenombrar el archivo seleccionado. Los archivos en vivo no se pueden renombrar.
dEliminar el archivo seleccionado tras la confirmación. Los archivos en vivo no se pueden eliminar.
yCopiar la entrada de lista seleccionada.
YCopiar el payload de detalle seleccionado.
zAlternar la representación JSON expandida.
ZAlternar la representación JSON sin procesar.
mAlternar los payloads de estilo y metadatos en el panel de detalle.
1 hasta 6Alternar columnas de lista: punto de color, marca de tiempo, etiqueta de tipo, archivo, mensaje, UUID.
oAbrir el archivo de origen en el IDE configurado.
eAbrir el payload de detalle seleccionado en el editor configurado.
Ctrl+lLimpiar la lista de registros en vivo sin eliminar las entradas almacenadas.
Ctrl+cSalir desde cualquier lugar.

El soporte de ratón está habilitado: haz clic para enfocar o seleccionar, y usa la rueda para desplazarte por el panel bajo el puntero.

Raymon usa la paleta ANSI del terminal por defecto, por lo que hereda los temas de terminal claros, oscuros y estilo base16. Usa RAYMON_TUI_PALETTE cuando necesites una paleta fija.

Habilidad del agente

Este repositorio incluye un manual orientado a IA en skills/raymon/SKILL.md. Enseña a los agentes cómo:

  • Generar eventos estilo Ray con integraciones comunes de Ray.
  • Añadir Raymon como servidor MCP local o remoto.
  • Usar raymon.search antes de raymon.get_entries para inspeccionar registros de manera eficiente.

La habilidad es documentación para agentes. No es código de ejecución.

Estructura del código fuente

RutaPropósito
src/cli.rsCiclo de vida del runtime, configuración, restauración de almacenamiento, modo demo y orquestación TUI/servidor.
src/cli/http.rsRouter Axum, autenticación, límites de cuerpo, límites de concurrencia, ingesta y montaje MCP.
src/raymon_core.rsTipos de dominio sin E/S, filtros, eventos y normalización de envolturas Ray.
src/raymon_ingest.rsAnálisis de ingesta HTTP, validación, fusión de UUID duplicados, almacenamiento y emisión de eventos.
src/raymon_mcp.rsHerramientas MCP, notificaciones, límites de consulta, límites de resultados y enlaces de apagado.
src/raymon_mcp/schema.rsEsquemas de solicitud y respuesta MCP.
src/raymon_storage/Persistencia JSONL, indexación, listado y retención.
src/raymon_tui.rsEstado TUI, renderizado, búsqueda, filtrado, manejo de teclas, integración con editor y flujos de archivo.
tests/ray_php_local.rsPrueba de integración PHP/Ray local ignorada.

Desarrollo

Ejecuta la suite de pruebas de Rust:

cargo test --all-targets

Ejecuta las comprobaciones de formato y clippy:

cargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warnings

Ejecuta los hooks de pre-commit cuando prek esté instalado:

prek validate-config prek.toml
prek run --all-files
prek install

Ejecuta la prueba de integración PHP Ray solo local después de instalar el helper global de PHP ray():

cargo test --test ray_php_local -- --ignored ray_php_local_integration

Compila y empaqueta los artefactos de lanzamiento:

TARGET=x86_64-apple-darwin scripts/build-release.sh
VERSION=0.7.0 TARGET=x86_64-apple-darwin scripts/package-release.sh

El flujo de lanzamiento compila objetivos Linux musl (x86_64, aarch64), macOS (x86_64, aarch64) y Windows MSVC (x86_64). Los artefactos Unix son archivos .tar.gz, los artefactos Windows son archivos .zip, y cada paquete recibe un archivo .sha256.

Licencia

MIT. Ver LICENSE.