Repository navigation
Conversation
…o abierto El traspaso llamaba tickets.create() y setOpenTicket() en cada mensaje, así que el mismo pedido dejaba varios tickets open y un aviso al dueño por cada uno. Si open_ticket_id apunta a un ticket sin resolver, se le añade el contexto y no se vuelve a notificar. Co-authored-by: santmun <santmun@users.noreply.github.com>
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: true
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Qué cambia
El traspaso a humano deja de abrir un ticket nuevo en cada mensaje de la misma conversación. Si ya hay un ticket sin resolver colgado de
conversations.open_ticket_id, se le añade el contexto y no se vuelve a avisar al dueño.Por qué
Ticket de soporte #1EB810 (plantilla v1.0.77). Un cliente pidió hablar con una persona y preguntó dos veces más por la misma llamada: 3 tickets
open, 3 avisos, yopen_ticket_idquedó apuntando solo al último. Los anteriores seguían contando como pendientes en el panel.En este repo el mismo defecto está en
handoffHumanTool(src/tools/handoffHuman.ts): cada ejecución llamatickets.create()y despuésconvs.setOpenTicket(), que es unUPDATEciego. No existecreateHandoffTicket()(ese nombre es de la plantilla publicada).Los 5 bugs del ticket
1. Ticket nuevo por mensaje — arreglado aquí
open_ticket_idantes de crear.setOpenTicketpisa el puntero y deja los tickets viejos abiertos pero desenganchados.resolved(incluyein_progress),TicketsRepo.appendSummary()añade[motivo] resumeny la tool regresa ese id, sin email ninotifyOwner. Un ticket ya resuelto sí abre uno nuevo y vuelve a avisar.test/tools/handoffHuman.test.ts— tres traspasos seguidos dejan 1 ticket y 1 aviso de Telegram; después deresolve()el siguiente traspaso abre otro y avisa otra vez. Antes del arreglo el segundo id no coincidía con el primero.2. Blindaje rompe el modo espejo — no está en este repo
src/blindaje/verify.ts,src/idioma.tsytest/idioma.test.tsno existen ensantmun/forja. No se puede reproducir ni cubrir con un test aquí.La pista del miembro sí cuadra con la plantilla que sirve
forjabot update(verifiqué el árbol público de esa línea, v1.0.74, mismas líneas que cita el ticket en v1.0.77):verify.ts:394llamasafeConfirmReply(env.BOT_LANGUAGE, opts.channel)con las cadenas fijas deSAFE_REPLY_BY_LANG/SAFE_REPLY_WEB_BY_LANG.idiomaEfectivo()en modoespejodevuelve a propósito el idioma base (test/idioma.test.ts:86). La frase de seguridad no pasa por el modelo, así que no espeja.Decisión: el arreglo tiene que caer en el checkout que empaqueta
horizontes-license-server/scripts/publish.mjs(../horizontes-bot-template). En GitHub,Horizontes-IA/horizontes-bot-templatesigue en el árbol de julio 2026 (package0.1.0, sinsrc/blindaje). La v1.0.77 publicada no está en este remoto. No publiqué artifact ni subí versión.Arreglo sugerido, sin tocar el pin de
{{LANGUAGE}}: siespejaAlCliente(env), detectar el idioma del último mensaje del cliente y pasarlo asafeConfirmReply().3. Zoom de iOS al enfocar el input — no está en este repo
No hay
src/web/temas.ts. En la plantilla publicada eltextareallevafont-size:14.5px(línea 214) y el@media (max-width:420px)no lo sube. iOS Safari hace zoom por debajo de 16px y no lo devuelve.Decisión: en ese CSS, dentro del media query de 420px, subir el
textareaa16pxpara no mover el diseño de escritorio.4. Autofoco abre el teclado en el celular — no está en este repo
No hay
src/web/script.ts. En la plantilla,abrir()llamata.focus()siempre (línea 176). No haymatchMedia.Decisión: enfocar solo si
window.matchMedia("(min-width:421px)").matches, el mismo corte que ya usa el CSS.5. Asteriscos en vez de negritas en el widget — no está en este repo
No hay widget web ni
src/owner/leadmagnet.ts. Aquí el<style_guide>ya pide texto plano ystripMarkdown()(src/replies/chunker.ts) quita**negrita**antes de enviar; eso ya tiene test entest/replies/chunker.test.ts.En la plantilla publicada el prompt todavía permite markdown y
agrega()pinta contextContent(script.ts:160).renderMarkdown()enleadmagnet.tsya escapa HTML y cubre negritas, itálicas, listas y links.Decisión: reutilizar
renderMarkdown()en el widget (escapado, sin HTML crudo) en vez de solo prohibir markdown en el prompt. El cliente ve la negrita; el escape evita XSS. No aplicarinnerHTMLdel texto del modelo sin ese escape.Cómo lo probaste
pnpm testpasa (79 archivos, 564 pruebas)pnpm typechecklimpioEl test de reutilización falló antes del cambio (
expectedel id del primer ticket,receiveduno nuevo) y pasa después.Checklist
member/(config de cada quien)No se publicó a npm, no se bumpeó versión y no se mergeó. Los miembros en v1.0.77 no reciben este arreglo con
forjabot updatehasta que el mismo guard se copie al checkout de la plantilla y se publique un artifact nuevo.