1import{u as ae,v as N,r as q,x as D,j as e,aH as ne,a6 as ie,aG as z,c7 as re,a9 as de,J as le,eH as oe}from"./vendor-DGvMVYXi.js";import{a as ce,h as j,B as V,C as l,e as o,b as v,c as C,d as w}from"./index-CPX2cHFp.js";import{B as xe}from"./badge-COnvzEf9.js";import{S as me}from"./switch-Duw2ypFc.js";import{L as S}from"./label-Dm3OlCQF.js";import{S as E,a as F,b as L,c as H,d as U}from"./select-y3Ncnru8.js";import{T as ge,a as ue,b as k,c as O}from"./tabs-C245byfV.js";import{N as he}from"./navigation-CcENAcSp.js";import"./dropdown-menu-BDWL7jNN.js";import"./scroll-area-Ck4DPvdb.js";import"./credit-upgrade-header-jWYGeZzA.js";import"./linkedin-setup-wizard-c05RgmuZ.js";import"./textarea-C6xKemI9.js";function Z(s,d={}){const a=d.now??new Date,r=new Date(a);return r.setUTCHours(s,0,0,0),r.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",timeZone:d.timeZone})}function pe(s={}){var a;return((a=new Intl.DateTimeFormat([],{timeZoneName:"short",timeZone:s.timeZone}).formatToParts(s.now??new Date).find(r=>r.type==="timeZoneName"))==null?void 0:a.value)??"local"}function ye(s,d,a=new Date){const r=new Date(a);r.setUTCHours(d,0,0,0);const c=(s-r.getUTCDay()+7)%7;return r.setUTCDate(r.getUTCDate()+c),r.getTime()<a.getTime()&&r.setUTCDate(r.getUTCDate()+7),r}function je(s,d,a={}){const r=ye(s,d,a.now??new Date);return{dayName:r.toLocaleDateString([],{weekday:"long",timeZone:a.timeZone}),time:r.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",timeZone:a.timeZone})}}const fe={infrastructure:"Infrastructure",job_queue:"Job Queue",monitor:"Monitors",campaign:"Campaign",domain:"Domain & Deliverability",content:"Content Quality",other:"Other"},be=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],_={critical:{label:"Critical",color:"bg-red-100 text-red-800 border-red-200",icon:oe},warning:{label:"Warning",color:"bg-orange-100 text-orange-800 border-orange-200",icon:le},info:{label:"Info",color:"bg-blue-100 text-blue-800 border-blue-200",icon:de}};function Ne({severity:s}){const d=_[s]??_.info,a=d.icon;return e.jsxs("span",{className:`inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium border ${d.color}`,children:[e.jsx(a,{className:"h-3 w-3"}),d.label]})}function ve({category:s}){return e.jsx(xe,{variant:"secondary",className:"text-xs",children:fe[s]??s})}function $({issue:s,onReverse:d}){const[a,r]=q.useState(!1),c=s.body&&Object.keys(s.body).length>0;return e.jsxs("div",{className:`border rounded-lg p-3 mb-2 ${s.severity==="critical"?"border-red-200 bg-red-50/30":"border-gray-200 bg-white"}`,children:[e.jsxs("div",{className:"flex items-start gap-2 flex-wrap",children:[e.jsx(Ne,{severity:s.severity}),e.jsx(ve,{category:s.category}),s.autoFixAttempted&&!s.autoFixReversed&&e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium bg-green-100 text-green-800 border border-green-200",children:[e.jsx(z,{className:"h-3 w-3"})," Auto-fixed"]}),s.autoFixReversed&&e.jsx("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium bg-gray-100 text-gray-600 border border-gray-200",children:"Reversed"}),s.digestSentAt&&e.jsx("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs bg-gray-100 text-gray-500 border border-gray-200",children:"Sent in digest"}),e.jsx("span",{className:"ml-auto text-xs text-gray-500",children:new Date(s.createdAt).toLocaleString("en-US",{timeZone:"UTC",timeZoneName:"short"})})]}),e.jsx("div",{className:"mt-1.5 font-medium text-sm text-gray-900",children:s.title}),s.clientId&&e.jsxs("div",{className:"text-xs text-gray-500 mt-0.5",children:["Client: ",s.clientId]}),s.autoFixResult&&!s.autoFixReversed&&e.jsx("div",{className:"mt-1.5 text-xs text-green-700 bg-green-50 rounded px-2 py-1.5",children:s.autoFixResult}),e.jsxs("div",{className:"mt-1.5 flex items-center gap-2",children:[c&&e.jsx("button",{className:"text-xs text-blue-600 hover:underline",onClick:()=>r(g=>!g),children:a?"Hide details":"Show details"}),s.autoFixAttempted&&!s.autoFixReversed&&e.jsxs("button",{className:"text-xs text-orange-600 hover:underline flex items-center gap-0.5",onClick:()=>
1d(s.id),children:[e.jsx(re,{className:"h-3 w-3"})," Reverse auto-fix"]})]}),a&&c&&e.jsx("pre",{className:"mt-2 text-xs bg-gray-50 rounded p-2 overflow-auto max-h-48 border border-gray-200",children:JSON.stringify(s.body,null,2)})]})}function m({label:s,description:d,value:a,onChange:r}){return e.jsxs("div",{className:"flex items-start justify-between py-3 border-b border-gray-100 last:border-0",children:[e.jsxs("div",{className:"flex-1 min-w-0 pr-4",children:[e.jsx(S,{className:"font-medium text-sm",children:s}),e.jsx("p",{className:"text-xs text-gray-500 mt-0.5",children:d})]}),e.jsx(me,{checked:a,onCheckedChange:r})]})}function ke(){var J,K;const{toast:s}=ce(),d=ae(),{data:a,refetch:r,isLoading:c}=N({queryKey:["/api/admin/digest/summary"],refetchInterval:6e4}),{data:g,refetch:M,isLoading:P}=N({queryKey:["/api/admin/digest/issues",{sent:"false"}],queryFn:()=>j("/api/admin/digest/issues?sent=false&limit=100"),refetchInterval:6e4}),{data:T,refetch:Q}=N({queryKey:["/api/admin/digest/issues",{sent:"true"}],queryFn:()=>j("/api/admin/digest/issues?sent=true&limit=100")}),{data:u,isLoading:B}=N({queryKey:["/api/admin/digest/settings"]}),[n,h]=q.useState(null);q.useEffect(()=>{u!=null&&u.settings&&!n&&h(u.settings)},[u]);const f=D({mutationFn:t=>j("/api/admin/digest/settings",{method:"PATCH",body:t}),onSuccess:()=>{d.invalidateQueries({queryKey:["/api/admin/digest/settings"]}),s({title:"Settings saved"})},onError:t=>s({title:"Save failed",description:t.message,variant:"destructive"})}),R=D({mutationFn:()=>j("/api/admin/digest/send-now",{method:"POST"}),onSuccess:t=>{s({title:t.sent?"Digest sent":"Nothing to send",description:t.message}),d.invalidateQueries({queryKey:["/api/admin/digest/issues"]}),r(),Q()},onError:t=>s({title:"Send failed",description:t.message,variant:"destructive"})}),W=D({mutationFn:t=>j(`/api/admin/digest/issues/${t}/reverse`,{method:"POST"}),onSuccess:()=>{s({title:"Auto-fix reversed"}),M()},onError:t=>s({title:"Reverse failed",description:t.message,variant:"destructive"})});function p(t,i){if(!n)return;const se={...n,[t]:i};h(se),f.mutate({[t]:i})}function G(t){if(!n)return;const i={...n,digestHourUtc:parseInt(t,10)};h(i),f.mutate({digestHourUtc:parseInt(t,10)})}function Y(t){if(!n)return;const i={...n,croReportDayOfWeek:parseInt(t,10)};h(i),f.mutate({croReportDayOfWeek:parseInt(t,10)})}function X(t){if(!n)return;const i={...n,croReportHourUtc:parseInt(t,10)};h(i),f.mutate({croReportHourUtc:parseInt(t,10)})}const x=(g==null?void 0:g.issues)??[],b=(T==null?void 0:T.issues)??[],y=pe(),ee=Z((n==null?void 0:n.digestHourUtc)??7),A=je((n==null?void 0:n.croReportDayOfWeek)??1,(n==null?void 0:n.croReportHourUtc)??7),te=((J=a==null?void 0:a.today)==null?void 0:J.reduce((t,i)=>t+i.cnt,0))??0,I=((K=a==null?void 0:a.today)==null?void 0:K.filter(t=>t.severity==="critical").reduce((t,i)=>t+i.cnt,0))??0;return e.jsxs("div",{className:"min-h-screen bg-gray-50 dark:bg-gray-900",children:[e.jsx(he,{}),e.jsxs("div",{className:"p-6 max-w-5xl mx-auto space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"System Digest & Automation"}),e.jsx("p",{className:"text-gray-500 text-sm mt-1",children:"All system issues collected in one place â sent as a daily digest email."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(V,{variant:"outline",size:"sm",onClick:()=>{r(),M(),Q()},disabled:c||P,children:[e.jsx(ne,{className:"h-4 w-4 mr-1"})," Refresh"]}),e.jsxs(V,{size:"sm",onClick:()=>R.mutate(),disabled:R.isPending,children:[e.jsx(ie,{className:"h-4 w-4 mr-1"}),R.isPending?"Sendingâ¦":"Send Digest Now"]})]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(l,{children:e.jsxs(o,{className:"pt-4",children:[e.jsx("div",{className:"text-2xl font-bold",children:te}),e.jsx("div",{className:"text-xs text-gray-500 mt-0.5",children:"Issues today"})]})}),e.jsx(l,{className:I>0?"border-red-200 bg-red-50":"",children:e.jsxs(o,{className:"pt-4",children:[e.jsx("div",{className:`text-2xl font-bold ${I>0?"text-red-700":""}`,children:I}),e.jsx("div",{className:"text-xs text-gray-500 mt-0.5",children:"Critical today"})]})}),e.jsx(l,{className:a!=null&&a.autoFixedToday?"border-green-200 bg-green-50":"",children:e.jsxs(o,{className:"pt-4",children:[e.jsx("div",{className:`text-2xl font-bold ${a!=null&&a.autoFixedToday?"text-green-700":""}`,children:(a==null?void 0:a.autoFixedToday)??0}),e.jsx("div",{className:"text-xs text-gray-500 mt-0.5",children:"Auto-fixed today"})]})})]}),e.jsxs(ge,{defaultValue:"pending",children:[e.jsxs(ue,{children:[e.jsxs(k,{value:"pending",children:["Pending Issues",x.length>0&&e.jsx("span",{className:"ml-1.5 px-1.5 py-0.5 rounded bg-orange-100 text-orange-800 text-xs",children:x.length})]}),e.jsxs(k,{value:"history",children:["Digest History",b.length>0&&e.jsx("span",{className:"ml-1.5 px-1.5 py-0.5 rounded bg-gray-100 text-gray-600 text-xs",children:b.length})]}),e.jsx(k,{value:"settings",children:"Settings & Auto-Fix"})]}),e.jsx(O,{value:"pending",className:"mt-4",children:e.jsxs(l,{children:[e.jsxs(v,{className:"pb-3",children:[e.jsx(C,{className:"text-base",children:"Buffered Issues (not yet in digest)"}
1),e.jsx(w,{children:x.length===0?"No pending issues â all clear.":`${x.length} issue(s) will be included in the next digest email.`})]}),e.jsxs(o,{children:[x.length===0&&!P&&e.jsxs("div",{className:"text-center py-8 text-gray-400",children:[e.jsx(z,{className:"h-8 w-8 mx-auto mb-2 text-green-400"}),e.jsx("p",{children:"All clear â no pending issues"})]}),x.map(t=>e.jsx($,{issue:t,onReverse:i=>W.mutate(i)},t.id))]})]})}),e.jsx(O,{value:"history",className:"mt-4",children:e.jsxs(l,{children:[e.jsxs(v,{className:"pb-3",children:[e.jsx(C,{className:"text-base",children:"Past Issues (already sent in digest)"}),e.jsx(w,{children:"Issues from the last 30 days that were included in a digest email."})]}),e.jsx(o,{children:b.length===0?e.jsx("div",{className:"text-center py-8 text-gray-400",children:e.jsx("p",{children:"No digest history yet"})}):b.map(t=>e.jsx($,{issue:t,onReverse:i=>W.mutate(i)},t.id))})]})}),e.jsx(O,{value:"settings",className:"mt-4",children:e.jsxs("div",{className:"grid gap-4",children:[e.jsxs(l,{children:[e.jsxs(v,{className:"pb-3",children:[e.jsx(C,{className:"text-base",children:"Digest Schedule"}),e.jsx(w,{children:"Configure when the daily system digest is sent, and which day and time the weekly CRO digest lands."})]}),e.jsx(o,{children:B?e.jsx("p",{className:"text-sm text-gray-500",children:"Loading settingsâ¦"}):e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(S,{className:"text-sm w-40",children:"Send digest at"}),e.jsxs(E,{value:String((n==null?void 0:n.digestHourUtc)??7),onValueChange:G,children:[e.jsx(F,{className:"w-56",children:e.jsx(L,{})}),e.jsx(H,{children:Array.from({length:24},(t,i)=>e.jsxs(U,{value:String(i),children:[String(i).padStart(2,"0"),":00 UTC (",Z(i)," ",y,")"]},i))})]}),e.jsxs("span",{className:"text-sm text-gray-500",children:["= ",ee," ",y]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(S,{className:"text-sm w-40",children:"Weekly digest day"}),e.jsxs(E,{value:String((n==null?void 0:n.croReportDayOfWeek)??1),onValueChange:Y,children:[e.jsx(F,{className:"w-36",children:e.jsx(L,{})}),e.jsx(H,{children:be.map((t,i)=>e.jsx(U,{value:String(i),children:t},i))})]}),e.jsxs("span",{className:"text-sm text-gray-500",children:["= ",A.dayName," ",y]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(S,{className:"text-sm w-40",children:"Weekly digest at"}),e.jsxs(E,{value:String((n==null?void 0:n.croReportHourUtc)??7),onValueChange:X,children:[e.jsx(F,{className:"w-56",children:e.jsx(L,{})}),e.jsx(H,{children:Array.from({length:24},(t,i)=>e.jsxs(U,{value:String(i),children:[String(i).padStart(2,"0"),":00 UTC (",Z(i)," ",y,")"]},i))})]}),e.jsxs("span",{className:"text-sm text-gray-500",children:["= ",A.dayName," ",A.time," ",y]})]})]})})]}),e.jsxs(l,{children:[e.jsxs(v,{className:"pb-3",children:[e.jsx(C,{className:"text-base",children:"Auto-Fix Engine"}),e.jsx(w,{children:"Enable or disable automatic fixes per category. All fixes are reversible and logged. Infrastructure is always log-only for safety."})]}),e.jsx(o,{children:B||!n?e.jsx("p",{className:"text-sm text-gray-500",children:"Loadingâ¦"}):e.jsxs("div",{children:[e.jsx(m,{label:"Infrastructure",description:"DB pool saturation, connection errors. Auto-fix is disabled â too risky to act automatically.",value:!1,onChange:()=>{}}),e.jsx(m,{label:"Job Queue",description:"Retry stuck running jobs (excluding scan/enrichment). Resets status back to pending.",value:n.autofixEnabledJobQueue,onChange:t=>p("autofixEnabledJobQueue",t)}),e.jsx(m,{label:"Monitors",description:"Reset overdue monitor scan schedules to be immediately eligible for catch-up.",value:n.autofixEnabledMonitors,onChange:t=>p("autofixEnabledMonitors",t)}),e.jsx(m,{label:"Campaigns",description:"Set minimum daily send floor if value is 0 or null.",value:n.autofixEnabledCampaigns,onChange:t=>p("autofixEnabledCampaigns",t)}),e.jsx(m,{label:"Domain & Deliverability",description:"Pause sends for domains in healing mode. Escalate DMARC policy when criteria met.",value:n.autofixEnabledDomains,onChange:t=>p("autofixEnabledDomains",t)}),e.jsx(m,{label:"Content Quality",description:"Content issues are log-only by default â human review recommended.",value:n.autofixEnabledContent,onChange:t=>p("autofixEnabledContent",t)})]})})]})]})})]})]})]})}export{ke 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.