feat(umind): ver qué se leyó de cada fuente, fragmento por fragmento

Una fuente crawleada decía "9 fragmentos" y nada más. Las notas y archivos al
menos tienen Editar, que muestra su texto; un sitio no tiene nada — era una
caja negra, sin forma de saber si el crawler leyó los precios o el pie de
página. Y cuando el agente contesta mal, la primera pregunta es justamente
qué tiene cargado de verdad.

Cada fuente gana un "Ver" que abre sus fragmentos tal como quedaron indexados,
numerados y en orden, con la advertencia que importa: esto es exactamente lo
que el asistente puede consultar — si acá falta algo, eso mismo le va a faltar
en las respuestas.

El botón se apaga cuando la fuente no tiene fragmentos todavía (procesando o
con error): abrir un visor vacío no informa nada.

El endpoint pasa por accesoDocumento como todos los sub-recursos, y devuelve
solo el contenido — el embedding no viaja: son miles de números que no le
sirven a nadie en pantalla.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-23 19:42:18 -05:00
co-authored by Claude Opus 5
parent be01d95631
commit ffa24a068f
9 changed files with 150 additions and 29 deletions
@@ -1092,3 +1092,26 @@ func DuplicarUmindAgenteHandler(c *fiber.Ctx) error {
"aviso": "El conocimiento se está copiando en segundo plano. Los canales y las claves de las herramientas no se copian: hay que configurarlos en la copia.",
})
}
// GetFragmentosDocumentoHandler muestra lo que se leyó de una fuente, fragmento
// por fragmento. Es la única ventana a lo que el agente tiene de verdad: el
// contenido nunca se muestra entero en ningún otro lado.
// GET /umind/documentos/:id/fragmentos
func GetFragmentosDocumentoHandler(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 64)
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "id inválido"})
}
if err := accesoDocumento(c, uint(id)); err != nil {
return err
}
chunks, err := models.GetUmindChunksByDocumento(uint(id))
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
out := make([]fiber.Map, len(chunks))
for i, ch := range chunks {
out[i] = fiber.Map{"ID": ch.ID, "contenido": ch.Contenido}
}
return c.JSON(fiber.Map{"items": out})
}