From c78fcce89b55fdeb278281f03a5b457f90569db3 Mon Sep 17 00:00:00 2001
From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com>
Date: Sat, 22 Aug 2026 11:05:09 -0500
Subject: [PATCH] =?UTF-8?q?refactor(studio):=20partir=20la=20pantalla=20de?=
=?UTF-8?q?l=20agente=20en=20un=20componente=20por=20pesta=C3=B1a?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
AgenteDetail tenía 1026 líneas con las siete pestañas adentro: el estado de
todas mezclado en un solo
+
+
+
+
+ Errores y eventos técnicos de este agente — fallos al llamar a la IA, a una herramienta, al correo o a los canales. Últimos 100.
+
uMind contesta por vos en WhatsApp y en tu sitio, con la información de tu negocio. Entiende las notas de voz y lee las fotos y archivos que te mandan tus clientes.
',4))])):(y(),C("div",ud,[oe(ss,{estado:"normal",tam:64,class:"mx-auto mb-4 text-brand"}),a("h1",cd,O(Re(Be).esPortal?"Elegí tu espacio de la izquierda":"Elegí un espacio de la izquierda"),1),a("p",dd,O(Re(Be).esPortal?"Adentro vas a poder crear y configurar tus agentes.":"o creá uno nuevo para empezar a configurar su agente."),1)]))}},pd={class:"flex flex-col items-center justify-center text-center py-12 px-6"},md={key:0,class:"text-3xl mb-3 opacity-70"},hd={class:"text-sm font-medium text-texto"},vd={key:2,class:"text-xs text-tenue mt-1.5 max-w-sm leading-relaxed"},gd={key:3,class:"mt-4"},Nt={__name:"UiEmptyState",props:{estado:{type:String,default:"durmiendo"},titulo:String,detalle:String,icono:{type:String,default:""}},setup(e){return(t,n)=>(y(),C("div",pd,[e.icono?(y(),C("div",md,O(e.icono),1)):(y(),$e(ss,{key:1,estado:e.estado,tam:64,class:"mb-3 text-brand"},null,8,["estado"])),a("p",hd,O(e.titulo),1),e.detalle?(y(),C("p",vd,O(e.detalle),1)):W("",!0),t.$slots.default?(y(),C("div",gd,[Ql(t.$slots,"default")])):W("",!0)]))}},bd={key:0,class:"mb-6"},xd={class:"flex items-start justify-between gap-4"},yd={class:"text-xl font-semibold text-texto"},_d={class:"text-xs text-tenue mt-1"},wd={key:1,class:"text-sm text-red-600 dark:text-red-400 mb-4"},Cd={class:"flex items-center justify-between mb-4"},kd={class:"flex items-center gap-2"},Ad={key:0,class:"badge-alerta"},$d={key:1,class:"badge-neutro"},Ed=["disabled"],Sd={key:2,class:"text-xs text-tenue -mt-2 mb-4"},Id={key:3,class:"text-xs text-tenue -mt-2 mb-4"},Rd={key:4,class:"grid gap-3 sm:grid-cols-2"},Pd=["disabled"],Td={key:6,class:"grid gap-3 sm:grid-cols-2"},Od={class:"flex items-start gap-3"},Md={class:"min-w-0 flex-1"},Dd={class:"flex items-center gap-2"},Nd={class:"font-medium text-texto truncate"},Vd={class:"text-xs text-tenue mt-0.5 truncate"},jd={class:"flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity shrink-0"},Ud=["onClick"],Ld=["onClick"],Fd=["onClick"],qd={class:"flex items-center gap-4 mt-3.5 pt-3 border-t border-borde text-xs text-tenue"},Hd={class:"tabular-nums"},Bd={class:"text-texto font-medium"},Gd={class:"tabular-nums"},Kd={class:"text-texto font-medium"},Wd={class:"tabular-nums"},zd={class:"text-texto font-medium"},Jd={class:"bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-800 rounded-xl p-6 w-full max-w-lg max-h-[calc(100vh-2rem)] overflow-y-auto"},Qd={class:"font-semibold text-gray-800 dark:text-gray-100 mb-4"},Yd={key:0},Zd={class:"grid gap-1.5"},Xd=["value"],ef={class:"min-w-0"},tf={class:"block text-sm text-texto"},nf={class:"block text-xs text-tenue"},sf={key:0,class:"block text-xs text-tenue mt-0.5"},of=["value"],rf={class:"flex items-center gap-2"},lf={class:"flex items-center gap-2 text-sm text-gray-600 dark:text-gray-300"},af={class:"flex justify-end gap-2 pt-2"},uf={type:"submit",class:"bg-brand hover:bg-brand-dark text-white text-sm font-medium px-4 py-2 rounded-lg"},cf={__name:"TenantAgentes",props:{id:{type:String,required:!0}},setup(e){const t=e,n=xe(()=>Number(t.id)),s=go(),o=H(null),r=H([]),i=H([]),l=H(""),u=H(!1),f=H(null),d=H(A()),p=H(null),h=H({}),x=H(!0);function T(Y){const F=h.value[Y.ID]||{};return Y.activo?F.documentos>0?{tipo:"ok",texto:"listo"}:{tipo:"alerta",texto:"sin conocimiento"}:{tipo:"neutro",texto:"inactivo"}}function w(Y){const F=h.value[Y.ID]||{};return{documentos:F.documentos||0,canales:F.canales||0,conversaciones:F.conversaciones_7d||0}}function P(Y){return String(Y||"?").trim().split(/\s+/).slice(0,2).map(F=>F[0]).join("").toUpperCase()}const V=xe(()=>{if(!p.value)return{sinPlan:!0};const Y=p.value.max_agentes||0;return{sinPlan:!1,nombre:p.value.nombre,ilimitado:Y<=0,max:Y,usados:r.value.length,lleno:Y>0&&r.value.length>=Y}});function A(){return{nombre:"",ai_config_id:null,tono:"",mensaje_bienvenida:"",color:"#8eb02f",activo:!0,plantilla_rubro:""}}const _=H([]);async function b(){l.value="",x.value=!0;try{const[Y,F,Ee,G]=await Promise.all([te.get(ee("/umind/tenants")),te.get(ee(`/umind/agentes?tenant_id=${t.id}`)),te.get(ee("/umind/ai-configs")),te.get(ee("/umind/plantillas-rubro"))]);o.value=(Y.items||[]).find(We=>String(We.ID)===t.id)||null,r.value=F.items||[],p.value=F.plan||null,h.value=F.resumen||{},i.value=Ee.items||[],_.value=G.items||[]}catch(Y){l.value=Y.message}finally{x.value=!1}}async function v(Y){const F=prompt(`Nombre de la copia de "${Y.nombre}":`,`${Y.nombre} (copia)`);if(F!==null){l.value="";try{const Ee=await te.post(ee(`/umind/agentes/${Y.ID}/duplicar`),{tenant_id:Number(n.value),nombre:F.trim()});await b(),Ee.aviso&&alert(Ee.aviso)}catch(Ee){l.value=Ee.message}}}function D(){f.value=null,d.value=A(),u.value=!0}function j(Y){f.value=Y,d.value={nombre:Y.nombre,ai_config_id:Y.ai_config_id,tono:Y.tono,mensaje_bienvenida:Y.mensaje_bienvenida,color:Y.color||"#8eb02f",activo:Y.activo},u.value=!0}async function U(){try{if(f.value)await te.put(ee(`/umind/agentes/${f.value.ID}`),{tenant_id:n.value,...d.value}),u.value=!1,await b();else{const Y=await te.post(ee("/umind/agentes"),{tenant_id:n.value,...d.value});u.value=!1,s.push(`/tenants/${n.value}/agentes/${Y.id}`)}}catch(Y){l.value=Y.message}}async function ye(Y){confirm(`¿Eliminar el agente "${Y.nombre}"? Esto no se puede deshacer.`)&&(await te.del(ee(`/umind/agentes/${Y.ID}`)),await b())}return It(()=>t.id,b,{immediate:!0}),(Y,F)=>{const Ee=mn("router-link");return y(),C("div",null,[o.value?(y(),C("div",bd,[a("div",xd,[a("div",null,[a("h1",yd,O(o.value.nombre),1),a("p",_d,O(o.value.dominios_permitidos||"sin dominios configurados"),1)]),oe(Ee,{to:`/tenants/${n.value??e.id}/ia`,class:"btn-ghost"},{default:nt(()=>[...F[10]||(F[10]=[ie("Tu IA",-1)])]),_:1},8,["to"]),oe(Ee,{to:`/tenants/${n.value??e.id}/uso`,class:"btn-ghost inline-flex items-center gap-1.5"},{default:nt(()=>[oe(Ge,{nombre:"grafico"}),F[11]||(F[11]=ie(" Consumo",-1))]),_:1},8,["to"])])])):W("",!0),l.value?(y(),C("p",wd,O(l.value),1)):W("",!0),a("div",Cd,[a("div",kd,[F[12]||(F[12]=a("h2",{class:"text-sm font-medium text-tenue"},"Agentes",-1)),V.value.sinPlan?(y(),C("span",Ad,"sin plan · sin límite")):V.value.ilimitado?(y(),C("span",$d,O(V.value.nombre)+" · ilimitado",1)):(y(),C("span",{key:2,class:_e(V.value.lleno?"badge-alerta":"badge-neutro")},O(V.value.nombre)+" · "+O(V.value.usados)+" de "+O(V.value.max),3))]),a("button",{class:"btn-primary",disabled:V.value.lleno,onClick:D},"+ Nuevo agente",8,Ed)]),V.value.sinPlan&&!Re(Be).esPortal?(y(),C("p",Sd," Este espacio no tiene plan asignado, así que no se le aplica ningún límite de agentes. Asignale uno desde el lápiz del espacio, en la barra izquierda. ")):V.value.lleno?(y(),C("p",Id," Alcanzaste el máximo de agentes de tu plan. ")):W("",!0),x.value?(y(),C("div",Rd,[(y(),C(re,null,we(2,G=>a("div",{key:G,class:"card p-4 animate-pulse"},[...F[13]||(F[13]=[Ai('
',2)])])),64))])):r.value.length===0?(y(),$e(Nt,{key:5,class:"card",estado:"durmiendo",titulo:"Todavía no hay agentes",detalle:"Creá el primero y cargale su base de conocimiento para que empiece a responder."},{default:nt(()=>[a("button",{class:"btn-primary",disabled:V.value.lleno,onClick:D},"+ Crear el primer agente",8,Pd)]),_:1})):(y(),C("div",Td,[(y(!0),C(re,null,we(r.value,G=>(y(),$e(Ee,{key:G.ID,to:`/tenants/${n.value}/agentes/${G.ID}`,class:"card p-4 relative group hover:shadow-lg hover:-translate-y-0.5 transition-all overflow-hidden"},{default:nt(()=>[a("span",{class:"absolute inset-x-0 top-0 h-1",style:Jt({background:G.color||"#8eb02f"})},null,4),a("div",Od,[a("span",{class:"w-10 h-10 rounded-xl flex items-center justify-center text-white text-sm font-semibold shrink-0",style:Jt({background:G.color||"#8eb02f",opacity:G.activo?1:.4})},O(P(G.nombre)),5),a("div",Md,[a("div",Dd,[a("span",Nd,O(G.nombre),1),a("span",{class:_e(`badge-${T(G).tipo}`)},O(T(G).texto),3)]),a("p",Vd,O(G.tono||"sin tono definido"),1)]),a("div",jd,[a("button",{class:"p-1 text-tenue hover:text-texto",title:"Editar",onClick:Pe(We=>j(G),["prevent","stop"])},[oe(Ge,{nombre:"lapiz",tam:14})],8,Ud),a("button",{class:"p-1 text-tenue hover:text-texto",title:"Duplicar: copia el conocimiento y las herramientas a un agente nuevo",onClick:Pe(We=>v(G),["prevent","stop"])},[oe(Ge,{nombre:"copiar",tam:14})],8,Ld),a("button",{class:"p-1 text-tenue hover:text-red-600",title:"Eliminar",onClick:Pe(We=>ye(G),["prevent","stop"])},[oe(Ge,{nombre:"cerrar",tam:14})],8,Fd)])]),a("div",qd,[a("span",Hd,[a("b",Bd,O(w(G).conversaciones),1),F[14]||(F[14]=ie(" conversaciones · 7d",-1))]),a("span",Gd,[a("b",Kd,O(w(G).documentos),1),F[15]||(F[15]=ie(" fuentes",-1))]),a("span",Wd,[a("b",zd,O(w(G).canales),1),F[16]||(F[16]=ie(" canales",-1))])])]),_:2},1032,["to"]))),128))])),u.value?(y(),C("div",{key:7,class:"fixed inset-0 bg-black/40 flex items-center justify-center p-4 z-50",onClick:F[9]||(F[9]=Pe(G=>u.value=!1,["self"]))},[a("div",Jd,[a("h2",Qd,O(f.value?"Editar agente":"Nuevo agente"),1),a("form",{class:"space-y-3",onSubmit:Pe(U,["prevent"])},[a("div",null,[F[17]||(F[17]=a("label",{class:"label"},"Nombre",-1)),Z(a("input",{"onUpdate:modelValue":F[0]||(F[0]=G=>d.value.nombre=G),required:"",placeholder:"ej: Ventas, Soporte",class:"input"},null,512),[[ue,d.value.nombre]])]),!f.value&&_.value.length?(y(),C("div",Yd,[F[18]||(F[18]=a("label",{class:"label"},"Arrancar con",-1)),a("div",Zd,[(y(!0),C(re,null,we([{clave:"",nombre:"Agente en blanco",descripcion:"Sin conocimiento cargado. Lo escribís vos desde cero."},..._.value],G=>(y(),C("label",{key:G.clave,class:_e(["flex gap-2.5 p-2.5 rounded-lg border cursor-pointer transition-colors",d.value.plantilla_rubro===G.clave?"border-brand bg-brand/5":"border-borde hover:border-brand/40"])},[Z(a("input",{"onUpdate:modelValue":F[1]||(F[1]=We=>d.value.plantilla_rubro=We),type:"radio",value:G.clave,class:"mt-1 text-brand focus:ring-brand"},null,8,Xd),[[ru,d.value.plantilla_rubro]]),a("span",ef,[a("span",tf,O(G.nombre),1),a("span",nf,O(G.descripcion),1),G.notas?(y(),C("span",sf,O(G.notas)+" notas listas para editar · "+O(G.resumen),1)):W("",!0)])],2))),128))]),F[19]||(F[19]=a("p",{class:"text-xs text-tenue mt-1.5"}," Las notas vienen con ejemplos entre corchetes — abrilas y reemplazalas por tus datos reales. ",-1))])):W("",!0),a("div",null,[F[21]||(F[21]=a("label",{class:"label"},"Config de IA",-1)),Z(a("select",{"onUpdate:modelValue":F[2]||(F[2]=G=>d.value.ai_config_id=G),class:"input"},[F[20]||(F[20]=a("option",{value:null},"— sin asignar —",-1)),(y(!0),C(re,null,we(i.value,G=>(y(),C("option",{key:G.ID,value:G.ID},O(G.nombre)+" ("+O(G.provider)+")",9,of))),128))],512),[[un,d.value.ai_config_id]])]),a("div",null,[F[22]||(F[22]=a("label",{class:"label"},"Tono / personalidad",-1)),Z(a("textarea",{"onUpdate:modelValue":F[3]||(F[3]=G=>d.value.tono=G),rows:"2",class:"input"},null,512),[[ue,d.value.tono]])]),a("div",null,[F[23]||(F[23]=a("label",{class:"label"},"Mensaje de bienvenida",-1)),Z(a("input",{"onUpdate:modelValue":F[4]||(F[4]=G=>d.value.mensaje_bienvenida=G),class:"input"},null,512),[[ue,d.value.mensaje_bienvenida]])]),a("div",null,[F[24]||(F[24]=a("label",{class:"label"},"Color del widget",-1)),a("div",rf,[Z(a("input",{"onUpdate:modelValue":F[5]||(F[5]=G=>d.value.color=G),type:"color",class:"w-10 h-9 border border-gray-300 dark:border-gray-700 rounded cursor-pointer bg-white dark:bg-gray-800"},null,512),[[ue,d.value.color]]),Z(a("input",{"onUpdate:modelValue":F[6]||(F[6]=G=>d.value.color=G),type:"text",pattern:"#[0-9a-fA-F]{6}",class:"flex-1 border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-800 dark:text-gray-100 rounded-lg px-3 py-2 text-sm font-mono"},null,512),[[ue,d.value.color]])])]),a("label",lf,[Z(a("input",{"onUpdate:modelValue":F[7]||(F[7]=G=>d.value.activo=G),type:"checkbox"},null,512),[[Pt,d.value.activo]]),F[25]||(F[25]=ie(" Activo ",-1))]),a("div",af,[a("button",{type:"button",class:"px-4 py-2 text-sm text-gray-500 dark:text-gray-400",onClick:F[8]||(F[8]=G=>u.value=!1)},"Cancelar"),a("button",uf,O(f.value?"Guardar":"Crear"),1)])],32)])])):W("",!0)])}}},df={class:"card divide-y divide-borde max-h-[32rem] overflow-y-auto"},ff={class:"cursor-pointer flex items-center gap-2 text-sm"},pf={class:"text-tenue text-xs shrink-0"},mf={class:"text-texto truncate"},hf={class:"text-tenue text-xs ml-auto shrink-0"},vf={key:0,class:"mt-2 bg-elevado border border-borde rounded-lg p-2 text-xs text-gray-600 dark:text-gray-400 overflow-x-auto whitespace-pre-wrap"},gf={__name:"TabAuditoria",props:{eventos:{type:Array,default:()=>[]}},setup(e){const t=xe(()=>s=>({error:"badge-error",warn:"badge-alerta"})[s]||"badge-neutro");function n(s){try{return new Date(s).toLocaleString()}catch{return s}}return(s,o)=>(y(),C("div",null,[o[0]||(o[0]=a("p",{class:"label mb-4"}," Errores y eventos técnicos de este agente — fallos al llamar a la IA, a una herramienta, al correo o a los canales. Últimos 100. ",-1)),a("div",df,[e.eventos.length===0?(y(),$e(Nt,{key:0,estado:"contenta",titulo:"Ningún problema registrado",detalle:"Acá aparecen los errores: una herramienta que no responde, una fuente que no se pudo leer. Que esté vacío es buena señal."})):W("",!0),(y(!0),C(re,null,we(e.eventos,r=>(y(),C("details",{key:r.ID,class:"p-3"},[a("summary",ff,[a("span",{class:_e(["px-1.5 py-0.5 rounded text-xs shrink-0",t.value(r.nivel)])},O(r.nivel),3),a("span",pf,O(r.origen),1),a("span",mf,O(r.mensaje),1),a("span",hf,O(n(r.CreatedAt)),1)]),r.detalle?(y(),C("pre",vf,O(r.detalle),1)):W("",!0)]))),128))])]))}},bf={class:"flex gap-2 mb-4"},xf={class:"card divide-y divide-borde"},yf={class:"font-medium text-texto capitalize"},_f={class:"ml-2 text-sm text-tenue"},wf=["onClick"],Cf={__name:"TabConexiones",props:{agenteId:{type:Number,required:!0},conexiones:{type:Array,default:()=>[]}},emits:["recargar"],setup(e,{emit:t}){const n=e,s=t;function o(i){window.location.href=ee(`/umind/conexiones/conectar?agente_id=${n.agenteId}&proveedor=${i}`)}async function r(i){confirm(`¿Desconectar la cuenta ${i.email||i.proveedor}?`)&&(await te.del(ee(`/umind/conexiones/${i.ID}`)),s("recargar"))}return(i,l)=>(y(),C("div",null,[l[2]||(l[2]=a("p",{class:"label mb-4"}," Conectá una cuenta de correo para que este agente pueda enviar y leer correo en su nombre. Se soporta una cuenta activa a la vez. ",-1)),a("div",bf,[a("button",{class:"border border-borde hover:border-brand text-sm font-medium px-4 py-2 rounded-lg text-gray-700 dark:text-gray-200 transition-colors",onClick:l[0]||(l[0]=u=>o("google"))}," Conectar Google "),a("button",{class:"border border-borde hover:border-brand text-sm font-medium px-4 py-2 rounded-lg text-gray-700 dark:text-gray-200 transition-colors",onClick:l[1]||(l[1]=u=>o("microsoft"))}," Conectar Outlook ")]),a("div",xf,[e.conexiones.length===0?(y(),$e(Nt,{key:0,titulo:"Sin cuentas conectadas",detalle:"Conectando una cuenta de correo, el agente puede leer y responder mensajes con tu dirección."})):W("",!0),(y(!0),C(re,null,we(e.conexiones,u=>(y(),C("div",{key:u.ID,class:"p-4 flex items-center justify-between"},[a("div",null,[a("span",yf,O(u.proveedor),1),a("span",_f,O(u.email),1),a("span",{class:_e(["ml-2 px-1.5 py-0.5 rounded text-xs",u.activo?"badge-ok":"badge-neutro"])},O(u.activo?"activa":"inactiva"),3)]),a("button",{class:"text-red-500 hover:text-red-700 text-sm",onClick:f=>r(u)},"Desconectar",8,wf)]))),128))])]))}},kf={class:"card p-4 flex flex-col h-[28rem]"},Af={class:"flex-1 overflow-y-auto space-y-2 mb-3"},$f={key:0,class:"text-sm text-tenue"},Ef={key:1,class:"flex items-center gap-2"},Sf=["disabled"],If={__name:"TabChat",props:{agenteId:{type:Number,required:!0}},setup(e){const t=e,n=`staff-preview-${Math.random().toString(36).slice(2)}`,s=H([]),o=H(""),r=H(!1);async function i(){const l=o.value.trim();if(!(!l||r.value)){o.value="",s.value.push({role:"user",content:l}),r.value=!0;try{const u=await te.post(ee("/umind/chat"),{agente_id:t.agenteId,session_id:n,mensaje:l});s.value.push({role:"assistant",content:u.respuesta})}catch(u){s.value.push({role:"assistant",content:`⚠ ${u.message}`})}finally{r.value=!1}}}return(l,u)=>(y(),C("div",kf,[a("div",Af,[s.value.length===0?(y(),C("p",$f," Probá este agente tal cual lo va a ver un visitante — usa la misma config de IA, las mismas herramientas y la misma base de conocimiento. ")):W("",!0),(y(!0),C(re,null,we(s.value,(f,d)=>(y(),C("div",{key:d,class:_e(["max-w-[80%] px-3 py-2 rounded-lg text-sm whitespace-pre-wrap",f.role==="user"?"bg-brand text-white ml-auto":"bg-elevado text-texto"])},O(f.content),3))),128)),r.value?(y(),C("div",Ef,[oe(ss,{estado:"pensando",tam:30,class:"text-brand"}),u[1]||(u[1]=a("span",{class:"text-xs text-tenue"},"Pensando…",-1))])):W("",!0)]),a("form",{class:"flex gap-2",onSubmit:Pe(i,["prevent"])},[Z(a("input",{"onUpdate:modelValue":u[0]||(u[0]=f=>o.value=f),placeholder:"Escribí un mensaje de prueba...",class:"flex-1 input"},null,512),[[ue,o.value]]),a("button",{type:"submit",disabled:r.value,class:"btn-primary disabled:opacity-50 transition-colors"}," Enviar ",8,Sf)],32)]))}},Rf={class:"grid grid-cols-3 gap-4"},Pf={class:"col-span-1 card divide-y divide-borde max-h-[28rem] overflow-y-auto"},Tf=["onClick"],Of={class:"text-texto truncate"},Mf={class:"text-xs text-tenue mt-0.5"},Df={class:"col-span-2 card p-4 max-h-[28rem] overflow-y-auto space-y-2"},Nf={key:0,class:"text-sm text-tenue"},Vf={__name:"TabConversaciones",props:{agenteId:{type:Number,required:!0},sesiones:{type:Array,default:()=>[]}},setup(e){const t=e,n=H([]),s=H(null);async function o(r){s.value=r;const i=await te.get(ee(`/umind/historial?agente_id=${t.agenteId}&session_id=${r}`));n.value=i.items||[]}return(r,i)=>(y(),C("div",Rf,[a("div",Pf,[e.sesiones.length===0?(y(),$e(Nt,{key:0,titulo:"Nadie escribió todavía",detalle:"Acá vas a ver todo lo que le preguntan y qué contestó."})):W("",!0),(y(!0),C(re,null,we(e.sesiones,l=>(y(),C("button",{key:l.session_id,class:_e(["w-full text-left p-3 hover:bg-elevado text-sm",s.value===l.session_id?"bg-gray-50 dark:bg-gray-800":""]),onClick:u=>o(l.session_id)},[a("div",Of,O(l.content),1),a("div",Mf,O(l.session_id),1)],10,Tf))),128))]),a("div",Df,[s.value?W("",!0):(y(),C("p",Nf,"Elegí una conversación de la izquierda.")),(y(!0),C(re,null,we(n.value,l=>(y(),C("div",{key:l.ID,class:_e(["max-w-[80%] px-3 py-2 rounded-lg text-sm",l.role==="user"?"bg-brand text-white ml-auto":"bg-elevado text-texto"])},O(l.content),3))),128))])]))}},jf={class:"card divide-y divide-borde"},Uf={class:"text-sm text-texto font-mono"},Lf={class:"label mt-0.5"},Ff={class:"text-xs text-tenue mt-0.5"},qf={key:0,class:"ml-1 text-green-600 dark:text-green-400"},Hf={key:1,class:"ml-1 text-gray-400"},Bf={class:"flex gap-3 text-sm shrink-0"},Gf=["onClick"],Kf=["onClick"],Wf={class:"card p-6 w-full max-w-xl max-h-[85vh] overflow-y-auto"},zf={class:"font-semibold text-texto mb-4"},Jf={class:"border border-borde rounded-lg p-3 space-y-2"},Qf=["onUpdate:modelValue"],Yf=["onUpdate:modelValue"],Zf=["onUpdate:modelValue"],Xf={class:"label flex items-center gap-1"},ep=["onUpdate:modelValue"],tp=["onClick"],np={key:0,class:"text-xs text-gray-400"},sp={class:"border border-borde rounded-lg p-3 space-y-2"},op={class:"flex items-center gap-2 label"},rp={class:"flex items-center gap-2 text-sm text-texto"},ip={class:"flex justify-end gap-2 pt-2"},lp={__name:"TabHerramientas",props:{agenteId:{type:Number,required:!0},tools:{type:Array,default:()=>[]}},emits:["recargar","error"],setup(e,{emit:t}){const n=e,s=t,o=H(!1),r=H(null),i=H(l());function l(){return{nombre:"",descripcion:"",url:"",auth_header_nombre:"",auth_header_valor:"",tocarAuth:!1,parametros:[],activa:!0}}function u(){r.value=null,i.value=l(),o.value=!0}function f(T){r.value=T;let w=[];try{w=JSON.parse(T.parametros_json||"[]")||[]}catch{w=[]}i.value={nombre:T.nombre,descripcion:T.descripcion,url:T.url,auth_header_nombre:T.auth_header_nombre,auth_header_valor:"",tocarAuth:!1,parametros:w,activa:T.activa},o.value=!0}function d(){i.value.parametros.push({nombre:"",tipo:"string",descripcion:"",requerido:!1})}function p(T){i.value.parametros.splice(T,1)}async function h(){const T={agente_id:n.agenteId,nombre:i.value.nombre.trim(),descripcion:i.value.descripcion,url:i.value.url.trim(),auth_header_nombre:i.value.auth_header_nombre,parametros:i.value.parametros,activa:i.value.activa};i.value.tocarAuth&&(T.auth_header_valor=i.value.auth_header_valor);try{r.value?await te.put(ee(`/umind/tools/${r.value.ID}`),T):await te.post(ee("/umind/tools"),T),o.value=!1,s("recargar")}catch(w){s("error",w.message)}}async function x(T){confirm(`¿Eliminar la herramienta "${T.nombre}"?`)&&(await te.del(ee(`/umind/tools/${T.ID}`)),s("recargar"))}return(T,w)=>(y(),C("div",null,[a("div",{class:"flex justify-between items-center mb-4"},[w[9]||(w[9]=a("p",{class:"label"},"Máximo 10 herramientas activas por agente.",-1)),a("button",{class:"btn-primary",onClick:u}," + Nueva herramienta ")]),a("div",jf,[e.tools.length===0?(y(),$e(Nt,{key:0,titulo:"Sin herramientas conectadas",detalle:"Las herramientas le dejan consultar tus sistemas mientras conversa: stock, estado de un pedido, disponibilidad de turnos. Sin ninguna, responde solo con lo que tiene cargado."})):W("",!0),(y(!0),C(re,null,we(e.tools,P=>(y(),C("div",{key:P.ID,class:"p-4 flex items-center justify-between"},[a("div",null,[a("div",Uf,O(P.nombre),1),a("div",Lf,O(P.descripcion),1),a("div",Ff,[ie(O(P.url)+" ",1),P.auth_configurado?(y(),C("span",qf,"· auth configurada")):W("",!0),P.activa?W("",!0):(y(),C("span",Hf,"· inactiva"))])]),a("div",Bf,[a("button",{class:"text-tenue hover:text-gray-800 dark:hover:text-gray-100",onClick:V=>f(P)},"Editar",8,Gf),a("button",{class:"text-red-500 hover:text-red-700",onClick:V=>x(P)},"Eliminar",8,Kf)])]))),128))]),o.value?(y(),C("div",{key:0,class:"fixed inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center p-4 z-50",onClick:w[8]||(w[8]=Pe(P=>o.value=!1,["self"]))},[a("div",Wf,[a("h2",zf,O(r.value?"Editar herramienta":"Nueva herramienta"),1),a("form",{class:"space-y-3",onSubmit:Pe(h,["prevent"])},[a("div",null,[w[10]||(w[10]=a("label",{class:"label"},"Nombre (identificador, ej: consultar_stock)",-1)),Z(a("input",{"onUpdate:modelValue":w[0]||(w[0]=P=>i.value.nombre=P),required:"",pattern:"[a-z][a-z0-9_]{2,63}",class:"input font-mono"},null,512),[[ue,i.value.nombre]])]),a("div",null,[w[11]||(w[11]=a("label",{class:"label"},"Descripción (esto lo lee el modelo para decidir cuándo usarla)",-1)),Z(a("textarea",{"onUpdate:modelValue":w[1]||(w[1]=P=>i.value.descripcion=P),rows:"2",required:"",class:"input"},null,512),[[ue,i.value.descripcion]])]),a("div",null,[w[12]||(w[12]=a("label",{class:"label"},"URL del webhook (https)",-1)),Z(a("input",{"onUpdate:modelValue":w[2]||(w[2]=P=>i.value.url=P),type:"url",required:"",placeholder:"https://...",class:"input"},null,512),[[ue,i.value.url]])]),a("div",Jf,[a("div",{class:"flex items-center justify-between"},[w[13]||(w[13]=a("label",{class:"label"},"Parámetros que completa el modelo",-1)),a("button",{type:"button",class:"text-xs text-brand",onClick:d},"+ agregar")]),(y(!0),C(re,null,we(i.value.parametros,(P,V)=>(y(),C("div",{key:V,class:"flex gap-2 items-center"},[Z(a("input",{"onUpdate:modelValue":A=>P.nombre=A,placeholder:"nombre",class:"flex-1 border border-borde bg-white dark:bg-gray-800 text-texto rounded px-2 py-1 text-xs font-mono"},null,8,Qf),[[ue,P.nombre]]),Z(a("select",{"onUpdate:modelValue":A=>P.tipo=A,class:"border border-borde bg-white dark:bg-gray-800 text-texto rounded px-2 py-1 text-xs"},[...w[14]||(w[14]=[a("option",{value:"string"},"string",-1),a("option",{value:"number"},"number",-1),a("option",{value:"boolean"},"boolean",-1)])],8,Yf),[[un,P.tipo]]),Z(a("input",{"onUpdate:modelValue":A=>P.descripcion=A,placeholder:"descripción",class:"flex-1 border border-borde bg-white dark:bg-gray-800 text-texto rounded px-2 py-1 text-xs"},null,8,Zf),[[ue,P.descripcion]]),a("label",Xf,[Z(a("input",{"onUpdate:modelValue":A=>P.requerido=A,type:"checkbox"},null,8,ep),[[Pt,P.requerido]]),w[15]||(w[15]=ie(" req. ",-1))]),a("button",{type:"button",class:"text-red-400 text-xs",onClick:A=>p(V)},[oe(Ge,{nombre:"cerrar",tam:13})],8,tp)]))),128)),i.value.parametros.length===0?(y(),C("p",np,"Sin parámetros.")):W("",!0)]),a("div",sp,[w[16]||(w[16]=a("label",{class:"label"},"Autenticación saliente (opcional)",-1)),Z(a("input",{"onUpdate:modelValue":w[3]||(w[3]=P=>i.value.auth_header_nombre=P),placeholder:"Nombre del header, ej: Authorization",class:"input"},null,512),[[ue,i.value.auth_header_nombre]]),a("label",op,[Z(a("input",{"onUpdate:modelValue":w[4]||(w[4]=P=>i.value.tocarAuth=P),type:"checkbox"},null,512),[[Pt,i.value.tocarAuth]]),ie(" "+O(r.value?"Cambiar el valor del secreto":"Configurar valor"),1)]),i.value.tocarAuth?Z((y(),C("input",{key:0,"onUpdate:modelValue":w[5]||(w[5]=P=>i.value.auth_header_valor=P),type:"password",placeholder:"Valor del header (ej: Bearer xxxx)",class:"input"},null,512)),[[ue,i.value.auth_header_valor]]):W("",!0)]),a("label",rp,[Z(a("input",{"onUpdate:modelValue":w[6]||(w[6]=P=>i.value.activa=P),type:"checkbox"},null,512),[[Pt,i.value.activa]]),w[17]||(w[17]=ie(" Activa ",-1))]),a("div",ip,[a("button",{type:"button",class:"btn-ghost",onClick:w[7]||(w[7]=P=>o.value=!1)},"Cancelar"),w[18]||(w[18]=a("button",{type:"submit",class:"btn-primary"},"Guardar",-1))])],32)])])):W("",!0)]))}},ap={class:"card p-4 mb-4"},up={class:"flex items-center justify-between mb-2"},cp={class:"bg-elevado border border-borde rounded-lg p-2.5 text-xs text-texto overflow-x-auto"},dp={class:"card divide-y divide-borde"},fp={class:"flex items-center justify-between"},pp={class:"font-medium text-texto capitalize"},mp={class:"flex gap-3 text-sm"},hp=["onClick"],vp=["onClick"],gp={class:"flex gap-4 mt-2 text-xs"},bp={class:"flex items-center gap-1.5 text-texto cursor-pointer"},xp=["checked","onChange"],yp={class:"flex items-center gap-1.5 text-texto cursor-pointer"},_p=["checked","onChange"],wp={class:"flex items-center gap-1.5 text-texto cursor-pointer"},Cp=["checked","onChange"],kp={class:"label mt-1 break-all"},Ap={class:"bg-elevado px-1 rounded"},$p={key:0,class:"text-xs text-tenue mt-1"},Ep={key:1,class:"text-xs text-red-600 dark:text-red-400 mt-1"},Sp={class:"card p-6 w-full max-w-md"},Ip={key:0},Rp={class:"flex flex-col gap-2 pt-1"},Pp={class:"flex items-center gap-2 text-sm text-texto cursor-pointer"},Tp={class:"flex items-center gap-2 text-sm text-texto cursor-pointer"},Op={class:"flex items-center gap-2 text-sm text-texto cursor-pointer"},Mp={class:"flex justify-end gap-2 pt-2"},Dp={__name:"TabCanales",props:{agenteId:{type:Number,required:!0},siteKey:{type:String,default:""},canales:{type:Array,default:()=>[]}},emits:["recargar","error"],setup(e,{emit:t}){const n=e,s=t,o=H(!1),r=H(f()),i=H(!1),l=xe(()=>{const A=n.siteKey||"TU_SITE_KEY";return`
+