PageSourceSearch

https://esqalar.lovable.app/assets/AutonomousAgentsAdmin-D9sGpmhU.js

js esqalar.lovable.app collected 2026-10-03 03:32:45 UTC 15,140 bytes, 1 lines download raw bytes

1import{r as E,j as e}from"./vendor-D9aQfD3t.js";import{u as te}from"./usePageTitle-BmUNDIiU.js";import{a as oe,u as b,b as F}from"./query-C5UYIduZ.js";import{c as x,d as g,B as f,L as P}from"./index-c2NiDRaX.js";import{A as ie}from"./AdminPageHeader-kOlsbPp_.js";import{C as K,b as G,c as X,a as $}from"./card-DgsjEpgj.js";import{B as N}from"./use-mobile-BHf7_s-V.js";import{T as ce,a as le,b as D,c as I}from"./tabs-Ceg23YkS.js";import{T as H,a as L,b as y,c,d as R,e as i}from"./table-BOSVyrTq.js";import{D as de,b as ue,c as me,d as xe,e as he,q as je}from"./ProtectedAppShell-Cuw8kiq-.js";import{S as W,a as Y,b as U,c as Z,d as O}from"./select-BDfwd4kP.js";import{T as pe}from"./textarea-DExYLDAV.js";import{M as ge}from"./ModuleErrorBoundary-usegu5pF.js";import{Q as ye,cc as se,bX as ee,q as ve,o as S,k as fe,b6 as _e}from"./ui-BNjj7LdU.js";import{f as be}from"./format-DQQzCJG2.js";import"./charts-CTUEvTGs.js";import"./export-docs-BIedqnVR.js";import"./supabase-CXidNrjy.js";import"./ModuleBadge-BN_PLcon.js";import"./RequireSuiteAuth-DoDK0Ph4.js";import"./skeleton-CD-_2FAj.js";import"./input-QA6mP7Vw.js";import"./traceClient-CIrJqbeJ.js";import"./sheet-ywXamaa8.js";function Ne(){const l=oe(),T=b({queryKey:["autonomous-agents-catalog"],queryFn:async()=>{const{data:s,error:a}=await x.from("autonomous_agents_catalog").select("*").order("category").order("agent_key");if(a)throw a;return s||[]}}),w=b({queryKey:["autonomous-agent-runs"],queryFn:async()=>{const{data:s,error:a}=await x.from("autonomous_agent_runs").select("*").order("started_at",{ascending:!1}).limit(100);if(a)throw a;return s||[]}}),k=b({queryKey:["autonomous-agents-health"],queryFn:async()=>{const{data:s,error:a}=await x.from("v_autonomous_agents_health").select("*");if(a)throw a;return s||[]}}),Q=b({queryKey:["agent-secret-status"],queryFn:async()=>{const{data:s,error:a}=await x.from("v_agent_secret_status").select("*");if(a)throw a;return s||[]}}),j=b({queryKey:["agent-run-quotas"],queryFn:async()=>{const{data:s,error:a}=await x.from("agent_run_quotas").select("*");if(a)throw a;return s||[]}}),q=F({mutationFn:async s=>{const{data:a,error:o}=await x.functions.invoke("agent-orchestrator",{body:{agent_key:s.agent_key,input:s.input??{},environment:s.environment??"dev",dry_run:s.dry_run??!1}});if(o)throw o;if(a!=null&&a.error)throw new Error(a.error);return a},onSuccess:()=>
1{g.success("Ejecución iniciada"),l.invalidateQueries({queryKey:["autonomous-agent-runs"]}),l.invalidateQueries({queryKey:["autonomous-agents-health"]})},onError:s=>g.error((s==null?void 0:s.message)||"Error al ejecutar agente")}),A=b({queryKey:["autonomous-agents-by-env"],queryFn:async()=>{const{data:s,error:a}=await x.from("v_autonomous_agents_by_env").select("*");if(a)throw a;return s||[]}}),t=F({mutationFn:async s=>{const{data:a,error:o}=await x.functions.invoke("agent-fixture-seed",{body:{action:"seed",...s??{}}});if(o)throw o;if(a!=null&&a.error)throw new Error(a.error);return a},onSuccess:s=>{var p;const a=((s==null?void 0:s.seeded)??[]).reduce((u,v)=>u+Math.max(0,v.inserted??0),0),o=(p=s==null?void 0:s.business)==null?void 0:p.summary,h=o?Object.values(o).reduce((u,v)=>u+(Number(v)||0),0):0;g.success(`Fixtures: ${a} runs${h?` + ${h} filas de negocio`:""} en ${(s==null?void 0:s.environment)??"—"}`),l.invalidateQueries({queryKey:["autonomous-agent-runs"]}),l.invalidateQueries({queryKey:["autonomous-agents-health"]}),l.invalidateQueries({queryKey:["autonomous-agents-by-env"]})},onError:s=>g.error((s==null?void 0:s.message)||"Error al generar fixtures")}),_=F({mutationFn:async s=>{const{data:a,error:o}=await x.functions.invoke("agent-fixture-seed",{body:{action:"cleanup",environment:s==null?void 0:s.environment,with_business_data:(s==null?void 0:s.with_business_data)??!1}});if(o)throw o;if(a!=null&&a.error)throw new Error(a.error);return a},onSuccess:s=>{var p,u;const a=((p=s==null?void 0:s.runs)==null?void 0:p.deleted)??(s==null?void 0:s.deleted)??0,o=(u=s==null?void 0:s.business)==null?void 0:u.deleted,h=o?Object.values(o).reduce((v,B)=>v+(Number(B)||0),0):0;g.success(`Sintéticos eliminados: ${a} runs${h?` + ${h} filas de negocio`:""}`),l.invalidateQueries({queryKey:["autonomous-agent-runs"]}),l.invalidateQueries({queryKey:["autonomous-agents-health"]}),l.invalidateQueries({queryKey:["autonomous-agents-by-env"]})},onError:s=>g.error((s==null?void 0:s.message)||"Error al limpiar fixtures")}),C=F({mutationFn:async s=>{const{data:a,error:o}=await x.rpc("promote_agent_to_prod",{p_agent_key:s.agent_key,p_promote:s.promote});if(o)throw o;return a},onSuccess:(s,a)=>{g.success(a.promote?"Agente promovido a prod":"Promoción revocada"),l.invali
1dateQueries({queryKey:["autonomous-agents-catalog"]})},onError:s=>g.error((s==null?void 0:s.message)||"Error al cambiar prod_ready")});return{catalog:T,runs:w,health:k,invoke:q,secretStatus:Q,quotas:j,byEnv:A,seedFixtures:t,cleanupFixtures:_,promoteToProd:C}}const we={strategy:"Estrategia",delivery:"Delivery",talent:"Talento",research:"Investigación",platform:"Plataforma"};function ke({status:l}){return l==="running"||l==="pending"?e.jsx(S,{className:"h-4 w-4 animate-spin text-blue-500"}):l==="completed"||l==="success"?e.jsx(fe,{className:"h-4 w-4 text-emerald-500"}):l==="awaiting_approval"?e.jsx(se,{className:"h-4 w-4 text-amber-500"}):e.jsx(_e,{className:"h-4 w-4 text-red-500"})}function We(){var M,z,J;te("Admin: Agentes Autónomos");const{catalog:l,runs:T,health:w,invoke:k,byEnv:Q,seedFixtures:j,cleanupFixtures:q,promoteToProd:A}=Ne(),[t,_]=E.useState(null),[C,s]=E.useState("dev"),[a,o]=E.useState("{}"),[h,p]=E.useState(!0),[u,v]=E.useState("qa"),B=new Map(((M=w.data)==null?void 0:M.map(n=>[n.agent_key,n]))||[]),ne=async()=>{if(!t)return;let n={};try{n=JSON.parse(a||"{}")}catch{}await k.mutateAsync({agent_key:t.agent_key,input:n,environment:C,dry_run:h}),_(null)},ae=(l.data||[]).reduce((n,m)=>{var r;return(n[r=m.category]||(n[r]=[])).push(m),n},{}),re=["dev","qa","prod"].map(n=>{const m=(Q.data||[]).filter(r=>r.environment===n);return{env:n,runs_24h:m.reduce((r,d)=>r+Number(d.runs_24h||0),0),ok_24h:m.reduce((r,d)=>r+Number(d.ok_24h||0),0),failed_24h:m.reduce((r,d)=>r+Number(d.failed_24h||0),0),awaiting:m.reduce((r,d)=>r+Number(d.awaiting_approval||0),0),synthetic:m.reduce((r,d)=>r+Number(d.synthetic_total||0),0)}});return e.jsx(ge,{moduleName:"AutonomousAgentsAdmin",children:e.jsxs("div",{className:"container mx-auto p-6 space-y-6",children:[e.jsx(ie,{title:"Agentes Autónomos",description:"Catálogo, salud y ejecución de agentes con loop Plan → Tool → Synthesis. Mutación en prod requiere aprobación HITL + agente promovido.",icon:ye}),e.jsxs(ce,{defaultValue:"catalog",children:[e.jsxs(le,{children:[e.jsx(D,{value:"catalog",children:"Catálogo"}),e.jsx(D,{value:"runs",children:"Ejecuciones"}),e.jsx(D,{value:"health",children:"Salud"}),e.jsx(D,{value:"environments",children:"Ambientes"})]}),e.jsx(I,{value:"catalog",className:"space-y-6",children:Object.entries(ae).map(([n,m])=>e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-sm font-semibold uppercase tracking-wider text-muted-foreground",children:we[n]||n}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:m.map(r=>{const d=B.get(r.agent_key);return e.jsxs(K,{className:"hover:shadow-md transition-shadow",children:[e.jsxs(G,{className:"pb-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx(X,{className:"text-base",children:r.name}),e.jsxs("div",{className:"flex flex-col gap-1 items-end",children:[r.mutates_business_data&&e.jsxs(N,{variant:"outline",className:"text-amber-600 border-amber-300",children:[e.jsx(se,{className:"h-3 w-3 mr-1"}),"HITL"]}),r.prod_ready?e.jsx(N,{variant:"outline",className:"text-emerald-600 border-emerald-300",children:"prod ready"}):e.jsx(N,{variant:"outline",className:"text-muted-foreground",children:"dev/qa only"})]})]}),e.jsx("p",{className:"text-xs text-muted-foreground line-clamp-2",children:r.description})]}),e.jsxs($,{className:"space-y-3",children:[e.jsx("div",{className:"flex flex-wrap gap-1",children:r.environments_allowed.map(V=>e.jsx(N,{variant:"secondary",className:"text-xs",children:V},V))}),e.jsxs("div",{className:"flex items-center justify-between text-xs text-muted-foreground",children:[e.jsx("span",{children:r.default_model}),e.jsx("span",{children:d?`${d.runs_ok}✓ / ${d.runs_failed}✗`:"sin runs"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(f,{size:"sm",className:"flex-1",disabled:!r.enabled,onClick:()=>{_(r),o("{}"),p(!0),s("dev")},"data-trace":`autonomous-agent-invoke:${r.agent_key}`,children:[e.jsx(ee,{className:"h-3 w-3 mr-2"}),"Ejecutar"]}),e.jsx(f,{size:"sm",variant:r.prod_ready?"outline":"secondary",onClick:()=>A.mutate({agent_key:r.agent_key,promote:!r.prod_ready}),disabled:A.isPending,"data-trace":`autonomous-agent-promote:${r.agent_key}`,"aria-label":r.prod_ready?"Revocar promoción a prod":"Promover a prod",title:r.prod_ready?"Revocar promoción":"Promover a prod (C1)",children:r.prod_ready?"Revocar":"Prod"})]})]})]},r.agent_key)})})]},n))}),e.jsx(I,{value:"runs",children:e.jsx(K,{children:e.jsx($,{className:"pt-6",children:e.jsxs(H,{
1children:[e.jsx(L,{children:e.jsxs(y,{children:[e.jsx(c,{children:"Estado"}),e.jsx(c,{children:"Agente"}),e.jsx(c,{children:"Env"}),e.jsx(c,{children:"Pasos"}),e.jsx(c,{children:"Duración"}),e.jsx(c,{children:"Costo"}),e.jsx(c,{children:"Inicio"})]})}),e.jsxs(R,{children:[(T.data||[]).slice(0,50).map(n=>e.jsxs(y,{children:[e.jsx(i,{children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ke,{status:n.status}),n.status]})}),e.jsx(i,{className:"font-mono text-xs",children:n.agent_key}),e.jsx(i,{children:e.jsx(N,{variant:"outline",children:n.environment})}),e.jsx(i,{children:n.steps_count}),e.jsx(i,{children:n.duration_ms?`${(n.duration_ms/1e3).toFixed(1)}s`:"—"}),e.jsx(i,{children:n.cost_estimate_usd?`$${Number(n.cost_estimate_usd).toFixed(4)}`:"—"}),e.jsx(i,{className:"text-xs text-muted-foreground",children:be(new Date(n.started_at),"yyyy-MM-dd HH:mm")})]},n.id)),!((z=T.data)!=null&&z.length)&&e.jsx(y,{children:e.jsx(i,{colSpan:7,className:"text-center text-muted-foreground py-8",children:"Sin ejecuciones registradas"})})]})]})})})}),e.jsx(I,{value:"health",children:e.jsx(K,{children:e.jsx($,{className:"pt-6",children:e.jsxs(H,{children:[e.jsx(L,{children:e.jsxs(y,{children:[e.jsx(c,{children:"Agente"}),e.jsx(c,{children:"OK"}),e.jsx(c,{children:"Fallidos"}),e.jsx(c,{children:"Activos"}),e.jsx(c,{children:"Pass rate"})]})}),e.jsxs(R,{children:[(w.data||[]).map(n=>e.jsxs(y,{children:[e.jsx(i,{className:"font-mono text-xs",children:n.agent_key}),e.jsx(i,{className:"text-emerald-600",children:n.runs_ok}),e.jsx(i,{className:"text-red-600",children:n.runs_failed}),e.jsx(i,{children:n.runs_active}),e.jsx(i,{children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ve,{className:"h-3 w-3"}),Number(n.pass_rate||0).toFixed(1),"%"]})})]},n.agent_key)),!((J=w.data)!=null&&J.length)&&e.jsx(y,{children:e.jsx(i,{colSpan:5,className:"text-center text-muted-foreground py-8",children:"Sin datos de salud"})})]})]})})})}),e.jsx(I,{value:"environments",className:"space-y-4",children:e.jsxs(K,{children:[e.jsxs(G,{children:[e.jsx(X,{className:"text-base",children:"Sembrar / limpiar datos sintéticos"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Bloqueado en prod por diseño. Genera runs ficticios para validar el dashboard, salud y E2E."})]}),e.jsxs($,{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-wrap items-end gap-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(P,{className:"text-xs",children:"Ambiente destino"}),e.jsxs(W,{value:u,onValueChange:n=>v(n),children:[e.jsx(Y,{className:"w-32",children:e.jsx(U,{})}),e.jsxs(Z,{children:[e.jsx(O,{value:"qa",children:"qa"}),e.jsx(O,{value:"dev",children:"dev"})]})]})]}),e.jsxs(f,{onClick:()=>j.mutate({environment:u}),disabled:j.isPending,"data-trace":"autonomous-agents-seed-fixtures",children:[j.isPending?e.jsx(S,{className:"h-4 w-4 animate-spin mr-2"}):null,"Sembrar fixtures"]}),e.jsxs(f,{variant:"secondary",onClick:()=>j.mutate({environment:u,with_business_data:!0}),disabled:j.isPending,"data-trace":"autonomous-agents-seed-business",title:"Inserta opportunities, projects, WBS, timesheets, expenses, staffing, gates y CRs",children:[j.isPending?e.jsx(S,{className:"h-4 w-4 animate-spin mr-2"}):null,"Sembrar datos de negocio"]}),e.jsxs(f,{variant:"outline",onClick:()=>q.mutate({environment:u,with_business_data:!0}),disabled:q.isPending,"data-trace":"autonomous-agents-cleanup-fixtures",children:[q.isPending?e.jsx(S,{className:"h-4 w-4 animate-spin mr-2"}):null,"Limpiar sintéticos"]})]}
1),e.jsxs(H,{children:[e.jsx(L,{children:e.jsxs(y,{children:[e.jsx(c,{children:"Ambiente"}),e.jsx(c,{children:"Runs 24h"}),e.jsx(c,{children:"OK"}),e.jsx(c,{children:"Fallidos"}),e.jsx(c,{children:"Awaiting HITL"}),e.jsx(c,{children:"Sintéticos"})]})}),e.jsx(R,{children:re.map(n=>e.jsxs(y,{children:[e.jsx(i,{children:e.jsx(N,{variant:n.env==="prod"?"default":"secondary",children:n.env})}),e.jsx(i,{children:n.runs_24h}),e.jsx(i,{className:"text-emerald-600",children:n.ok_24h}),e.jsx(i,{className:"text-red-600",children:n.failed_24h}),e.jsx(i,{className:"text-amber-600",children:n.awaiting}),e.jsx(i,{className:"text-muted-foreground",children:n.synthetic})]},n.env))})]})]})]})})]}),e.jsx(de,{open:!!t,onOpenChange:n=>!n&&_(null),children:e.jsxs(ue,{className:"max-w-lg",children:[e.jsxs(me,{children:[e.jsxs(xe,{children:["Ejecutar: ",t==null?void 0:t.name]}),e.jsx(he,{children:t!=null&&t.mutates_business_data?"Este agente puede mutar datos. En prod requiere aprobación HITL.":"Agente read-only. No muta datos de negocio."})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(P,{children:"Entorno"}),e.jsxs(W,{value:C,onValueChange:n=>s(n),children:[e.jsx(Y,{children:e.jsx(U,{})}),e.jsx(Z,{children:((t==null?void 0:t.environments_allowed)||["dev"]).map(n=>e.jsx(O,{value:n,children:n},n))})]})]}),e.jsxs("div",{children:[e.jsx(P,{children:"Input JSON"}),e.jsx(pe,{value:a,onChange:n=>o(n.target.value),className:"font-mono text-xs h-32",placeholder:'{"key": "value"}'})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",id:"dry_run",checked:h,onChange:n=>p(n.target.checked)}),e.jsx(P,{htmlFor:"dry_run",className:"cursor-pointer",children:"Dry-run (no muta datos)"})]}),C==="prod"&&(t==null?void 0:t.mutates_business_data)&&!h&&e.jsxs("div",{className:"text-xs text-amber-600 bg-amber-50 dark:bg-amber-900/20 p-2 rounded",children:["Esta ejecución requerirá aprobación ",(t==null?void 0:t.needs_approval_role)||"C1"," antes de mutar datos."]})]}),e.jsxs(je,{children:[e.jsx(f,{variant:"outline",onClick:()=>_(null),children:"Cancelar"}),e.jsxs(f,{onClick:ne,disabled:k.isPending,"data-trace":"autonomous-agent-confirm-invoke",children:[k.isPending?e.jsx(S,{className:"h-4 w-4 animate-spin mr-2"}):e.jsx(ee,{className:"h-4 w-4 mr-2"}),"Ejecutar"]})]})]})})]})})}export{We as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.