fix(umind): prohíbe inventar URLs y contactos, y hace clickeables los enlaces
El agente estaba dando https://escuelametropolitana.com/login.php, una ruta que no existe: el prompt decía "no inventes datos" pero no decía nada de URLs, teléfonos ni correos, que es justo lo que un modelo confabula con más confianza porque "sabe" que un login suele estar en /login.php. Un enlace inventado deja a la persona sin poder completar el trámite, peor que no responder. - Regla explícita: URLs, teléfonos, WhatsApp y correos solo si aparecen LITERALMENTE en los resultados de buscar_conocimiento, copiados carácter por carácter, sin completar rutas ni cambiar el dominio. - Widget: los enlaces se vuelven clickeables. El contenido sale de páginas crawleadas, así que NO se inserta como HTML: se parte por URL y cada trozo va con createTextNode o un <a> con rel=noopener noreferrer nofollow. Verificado que un <img onerror> o un <script> en la respuesta quedan escapados como texto inerte. - WhatsApp: preview_url=true, así el primer enlace se ve como tarjeta clickeable en vez de texto pelado. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
4995c5fca5
commit
7146539f86
@@ -134,6 +134,8 @@ const umindWidgetJS = `(function () {
|
||||
'.umind-msg{margin-bottom:10px;padding:9px 12px;border-radius:13px;max-width:82%;white-space:pre-wrap;}',
|
||||
'.umind-msg-bot{background:#fff;color:#222;border:1px solid #ececec;border-bottom-left-radius:4px;}',
|
||||
'.umind-msg-user{color:#fff;margin-left:auto;border-bottom-right-radius:4px;}',
|
||||
'.umind-msg-bot a{color:var(--umind-color);text-decoration:underline;word-break:break-all;}',
|
||||
'.umind-msg-user a{color:#fff;text-decoration:underline;word-break:break-all;}',
|
||||
'.umind-inputbar{display:flex;align-items:center;border-top:1px solid #eee;padding:8px;gap:6px;background:#fff;flex-shrink:0;}',
|
||||
'.umind-inputbar input{flex:1;border:1px solid #e5e5e5;border-radius:20px;padding:9px 14px;font-size:13px;outline:none;}',
|
||||
'.umind-inputbar button{border:none;color:#fff;width:34px;height:34px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;}',
|
||||
@@ -178,6 +180,9 @@ const umindWidgetJS = `(function () {
|
||||
if (!c) return;
|
||||
color = c;
|
||||
ring.style.setProperty('--umind-color', color);
|
||||
// También en el panel, que es el ancestro de las burbujas: los enlaces
|
||||
// dentro de un mensaje toman el color de marca desde esta variable.
|
||||
panel.style.setProperty('--umind-color', color);
|
||||
bubble.style.background = 'radial-gradient(circle at 30% 28%, rgba(255,255,255,.35), transparent 55%), ' + color;
|
||||
panel.querySelector('#umind-header').style.background = color;
|
||||
panel.querySelector('#umind-send').style.background = color;
|
||||
@@ -190,9 +195,31 @@ const umindWidgetJS = `(function () {
|
||||
var sessionId = null;
|
||||
var abierto = false;
|
||||
|
||||
// El contenido del agente sale de páginas crawleadas, así que NUNCA se
|
||||
// inserta como HTML. Se parte por URL y cada trozo se agrega con
|
||||
// createTextNode / un <a> cuyo href se arma con la URL ya validada: el
|
||||
// texto sigue siendo inerte y los enlaces quedan clickeables.
|
||||
function pintarConEnlaces(el, texto) {
|
||||
var partes = String(texto).split(/(https?:\/\/[^\s<>"')\]]+)/g);
|
||||
for (var i = 0; i < partes.length; i++) {
|
||||
var p = partes[i];
|
||||
if (!p) continue;
|
||||
if (i % 2 === 1) {
|
||||
var a = document.createElement('a');
|
||||
a.href = p;
|
||||
a.target = '_blank';
|
||||
a.rel = 'noopener noreferrer nofollow';
|
||||
a.textContent = p;
|
||||
el.appendChild(a);
|
||||
} else {
|
||||
el.appendChild(document.createTextNode(p));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function agregarMensaje(texto, quien) {
|
||||
var burbuja = document.createElement('div');
|
||||
burbuja.textContent = texto;
|
||||
pintarConEnlaces(burbuja, texto == null ? '' : texto);
|
||||
var esUser = quien === 'user';
|
||||
burbuja.className = 'umind-msg ' + (esUser ? 'umind-msg-user' : 'umind-msg-bot');
|
||||
if (esUser) burbuja.style.background = color;
|
||||
|
||||
Reference in New Issue
Block a user