1import{b as ge,u as l,c as W,j as e}from"./vendor-query-C6SyRbdw.js";import{d as y,al as pe,X as a,aq as ve,T as je,z as c,Y as d,Z as h,aL as L,E as m,aN as ye,_ as f,a7 as fe,aK as _e,L as $,D as Ne,e as we,f as ke,g as be,h as Se,bf as De,aO as _}from"./main-i0KCCftL.js";import{P as Ae,c as p}from"./pill-tabs-CZcrvdQn.js";import{R as Ce}from"./ResponsiveTabBar-p-wUfoOx.js";import{S}from"./StatCard-CF-O9N5h.js";import{r as z}from"./vendor-react-DxfWP9Wl.js";import{u as Re}from"./usePersistentTab-abhDWTdz.js";import{c as i}from"./adminApi-PoH-cW1a.js";import{R as N}from"./ResponsiveTable-BuWPXfGm.js";import{S as Te}from"./switch-DN-Txfbk.js";import{T as Pe}from"./textarea-C3z-8R2d.js";import{W as U}from"./wifi-jdZnBuw0.js";import{D as E}from"./database-D-M-2Agu.js";import{L as J}from"./lock-open-D9N9KCX6.js";import{A as Le}from"./activity-C_STx1IH.js";import{C as Ee}from"./circle-x-Du2z-dV_.js";import{C as Fe}from"./circle-check-big-BK0aicvo.js";import{f as D}from"./format-C6IkcCEG.js";import"./vendor-three-Fnt8Q7UY.js";import"./vendor-charts-CyLQTaN5.js";import"./vendor-motion-D8wnYSAT.js";import"./vendor-supabase-1iNng4U8.js";import"./table-Bb6NmQy0.js";import"./en-US-Bfz1jvxT.js";import"./differenceInCalendarDays-Bsqi-xJB.js";import"./getTimezoneOffsetInMilliseconds-C1-43des.js";const ls=()=>{var Q;const[V,X]=Re("ai-hack","overview"),[r,w]=z.useState(null),[A,C]=z.useState(""),R=ge(),{data:o=[],isLoading:Y,refetch:Z}=l({queryKey:["behavior-alerts"],queryFn:async()=>{const{data:s,error:t}=await i({operation:"list-behavior-alerts",orderBy:{column:"created_at",ascending:!1},limit:100});if(t)throw new Error(t);return s||[]}}),{data:F=[],isLoading:G}=l({queryKey:["behavior-baselines"],queryFn:async()=>{const{data:s,error:t}=await i({operation:"list-behavior-baselines"});if(t)throw new Error(t);return s||[]}}),{data:ee=[],isLoading:se}=l({queryKey:["behavior-settings"],queryFn:async()=>{const{data:s,error:t}=await i({operation:"list-behavior-settings"});if(t)throw new Error(t);return s||[]}});l({queryKey:["behavior-stats"],queryFn:async()=>{const{data:s,error:t}=await i({operation:"get-behavior-stats"});if(t)throw new Error(t);return s||[]}});const{data:v=[],isLoading:te,refetch:ae}=l({queryKey:["hijack-events"],queryFn:async()=>{const{data:s,error:t}=await i({operation:"list-hijack-events",orderBy:{column:"created_at",ascending:!1},limit:100});if(t)throw new Error(t);return s||[]}}),{data:q=[]}=l({queryKey:["hijack-stats"],queryFn:async()=>{const{data:s,error:t}=await i({operation:"get-hijack-stats"});if(t)throw new Error(t);return s||[]}}),{data:j=[],isLoading:re,refetch:ie}=l({queryKey:["exfiltration-attempts"],queryFn:async()=>{const{data:s,error:t}=await i({operation:"list-exfiltration-attempts",orderBy:{column:"created_at",ascending:!1},limit:100});if(t)throw new Error(t);return s||[]}}),{data:B=[]}=l({queryKey:["exfiltration-stats"],queryFn:async()=>{const{data:s,error:t}=await i({operation:"get-exfiltration-stats"});if(t)throw new Error(t);return s||[]}}),k=W({mutationFn:async({id:s,isFalsePositive:t,notes:n})=>{const{error:x}=await i({operation:"update-behavior-alert",filters:{id:s},data:{is_false_positive:t,review_notes:n,reviewed_at:new Date().toISOString()}});if(x)throw new Error(x)},onSuccess:()=>{_.success("Alert reviewed successfully"),R.invalidateQueries({queryKey:["behavior-alerts"]}),R.invalidateQueries({queryKey:["behavior-stats"]}),w(null),C("")},onError:s=>{_.error("Failed to update. Please try again.")}}),ne=W({mutationFn:async({id:s,value:t})=>{const{error:n}=await i({operation:"update-behavior-setting",filters:{id:s},data:{setting_value:t,updated_at:new Date().toISOString()}});if(n)throw new Error(n)},onSuccess:()=>{_.success("Setting updated"),R.invalidateQueries({queryKey:["behavior-settings"]})},onError:s=>{_.error("Failed to update. Please try again.")}}),u=s=>{const t={critical:"destructive",high:"destructive",medium:"default",low:"secondary"};return e.jsx(a,{variant:t[s]||"outline",children:s})},K=s=>({unusual_login_time:"Unusual Login Time",new_ip_range:"New IP Range",new_device:"New Device",rapid_actions:"Rapid Actions",new_data_access:"New Data Access",permission_change:"Permission Change"})[s]||s,H=s=>({device_mismatch:"Device Mismatch",ip_region_switch:"IP Region Switch",concurrent_location:"Concurrent Locations",geo_velocity_violation:"Impossible Travel"})[s]||s,I=s=>
1({large_data_read:"Large Data Read",rapid_pagination:"Rapid Pagination",bulk_export:"Bulk Export",systematic_scraping:"Systematic Scraping"})[s]||s,oe=s=>["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][s]||s,T=o.filter(s=>!s.reviewed_at);o.filter(s=>s.severity==="critical"&&!s.is_false_positive),o.filter(s=>s.severity==="high"&&!s.is_false_positive);const le=o.length>0?Math.round(o.filter(s=>s.is_false_positive).length/o.length*100):0,ce=v.length,de=v.filter(s=>s.session_revoked).length,O=v.filter(s=>s.severity==="critical").length,he=j.length,M=j.filter(s=>s.session_locked).length,me=j.reduce((s,t)=>s+(t.records_accessed||0),0),xe=()=>{Z(),ae(),ie(),_.success("Data refreshed")};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"relative rounded-xl bg-gradient-to-b from-[#0A3D7C] to-[#0D2B5E] p-6 text-white shadow-lg overflow-hidden",children:[e.jsx("div",{className:"absolute inset-0 bg-[radial-gradient(ellipse_at_top_right,_rgba(255,255,255,0.15)_0%,_transparent_60%)]"}),e.jsxs("div",{className:"relative flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold",children:"AI Hack Detection"}),e.jsx("p",{className:"text-white/80 mt-1",children:"AI-powered threat detection and session monitoring"})]}),e.jsxs(y,{onClick:xe,variant:"outline",size:"sm",className:"text-white border-white/30 hover:bg-white/10",children:[e.jsx(pe,{className:"h-4 w-4 mr-2"}),"Refresh"]})]})]}),e.jsxs(Ae,{value:V,onValueChange:X,children:[e.jsx(Ce,{tabs:[{value:"overview",label:"Overview"},{value:"threats",label:"Behavior",badge:T.length>0?e.jsx(a,{variant:"destructive",className:"ml-2",children:T.length}):null},{value:"hijacking",label:"Hijacking",badge:O>0?e.jsx(a,{variant:"destructive",className:"ml-2",children:O}):null},{value:"exfiltration",label:"Exfiltration",shortLabel:"Exfil",badge:M>0?e.jsx(a,{variant:"destructive",className:"ml-2",children:M}):null},{value:"analysis",label:"Analysis"},{value:"settings",label:"Settings"}]}),e.jsxs(p,{value:"overview",children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-4",children:[e.jsx(S,{title:"Behavior Alerts",value:T.length,icon:ve,accent:"amber",sub:"Pending review"}),e.jsx(S,{title:"Hijack Attempts",value:ce,icon:U,accent:"red",sub:`${de} sessions revoked`}),e.jsx(S,{title:"Exfiltration Alerts",value:he,icon:E,accent:"amber",sub:`${me.toLocaleString()} records flagged`}),e.jsx(S,{title:"False Positive Rate",value:`${le}%`,icon:je,accent:"blue",sub:"Of reviewed alerts"})]}),e.jsxs("div",{className:"grid gap-4 md:grid-cols-2 mt-4",children:[e.jsxs(c,{children:[e.jsx(d,{children:e.jsxs(h,{className:"flex items-center gap-2",children:[e.jsx(L,{className:"h-5 w-5"}),"Session Hijacking (30 Days)"]})}),e.jsx(m,{children:q.length===0?e.jsx("p",{className:"text-muted-foreground text-sm",children:"No hijacking attempts detected"}):e.jsx(N,{rows:q,getRowKey:(s,t)=>t,columns:[{key:"type",header:"Type",primary:!0,render:s=>H(s.detection_type)},{key:"severity",header:"Severity",render:s=>u(s.severity)},{key:"count",header:"Count",render:s=>s.count},{key:"revoked",header:"Revoked",render:s=>s.sessions_revoked}]})})]}),e.jsxs(c,{children:[e.jsx(d,{children:e.jsxs(h,{className:"flex items-center gap-2",children:[e.jsx(E,{className:"h-5 w-5"}),"Exfiltration Detection (30 Days)"]})}),e.jsx(m,{children:B.length===0?e.jsx("p",{className:"text-muted-foreground text-sm",children:"No exfiltration attempts detected"}):e.jsx(N,{rows:B,getRowKey:(s,t)=>t,columns:[{key:"type",header:"Type",primary:!0,render:s=>I(s.detection_type)},{key:"severity",header:"Severity",render:s=>u(s.severity)},{key:"count",header:"Count",render:s=>s.count},{key:"records",header:"Records",render:s=>{var t;return((t=s.total_records_accessed)==null?void 0:t.toLocaleString())||0}}]})})]})]})]}),e.jsx(p,{value:"threats",children:e.jsxs(c,{children:[e.jsxs(d,{children:[e.jsxs(h,{className:"flex items-center gap-2",children:[e.jsx(ye,{className:"h-5 w-5"}),"Behavior Alerts"]}),e.jsx(f,{children:"Detected anomalies in admin behavior patterns"})]}),e.jsx(m,{children:Y?e.jsx("p",{className:"text-muted-foreground",children:"Loading alerts..."}):o.length===0?e.jsx("p",{className:"text-muted-foreground",children:"No behavior alerts detected"}):e.jsx(N,{rows:o,getRowKey:s=>s.id,cardClassName:"data-[fp=true]:opacity-50",columns:[{key:"time",header:"Time",primary:!0,render:s=>D(new Date(s.created_at),"PP p")},{key:"type",header:"Type",render:s=>K(s.alert_type)},{key:"severity",header:"Severity",render:s=>u(s.severity)},{key:"details",header:"Details",render:s=>{var t;return e.jsx("span",{className:"block max-w-xs truncate",children:((t=s.details)==null?void 0:t.message)||JSON.stringify(s.details)})}},{key:"score",header:"Score",render:s=>{var t;return e.jsx("span",{className:s.deviation_score>=75?"text-destructive font-bold":"",children:(t=s.deviation_score)==null?void 0:t.toFixed(0)})}},{key:"action",header:"Action",render:s=>e.jsx(a,{variant:"outline",children:s.action_taken})},{key:"status",header:"Status",render:s=>s.is_false_positive?e.jsx(a,{variant:"secondary",children:"False Positive"}):s.reviewed_at?e.jsx(a,{variant:"outline",className:"bg-green-500/10",children:"Reviewed"}):e.jsx(a,{variant:"destructive",children:"Pending"})},{key:"actions",header:"",mobileFooter:!0,render:s=>e.jsx(y,{size:"sm",variant:"ghost",onClick:()=>{w(s),C(s.review_notes||"")},children:"Review"})}]})})]})}),e.jsx(p,{value:"hijacking",children:e.jsxs(c,{children:[e.jsxs(d,{children:[e.jsxs(h,{className:"flex items-center gap-2",children:[e.jsx(U,{className:"h-5 w-5"}),"Session Hijacking Events"]}),e.jsx(f,{children:"Real-time detection of session hijacking attempts including IP switching, device mismatches, and concurrent locations"})]}),e.jsx(m,{children:te?e.jsx("p",{className:"text-muted-foreground",children:"Loading hijack events..."}):v.length===0?e.jsx("p",{className:"text-muted-foreground",children:"No session hijacking attempts detected"}):e.jsx(N,{rows:v,getRowKey:s=>s.id,columns:[{key:"time",header:"Time",primary:!0,render:s=>D(new Date(s.created_at),"PP p")},{key:"type",header:"Detection Type",render:s=>H(s.detection_type)},{key:"severity",header:"Severity",render:s=>u(s.severity)},{key:"orig",header:"Original IP",render:s=>e.jsx("span",{className:"font-mono text-xs",children:s.original_ip||"-"})},{key:"det",header:"Detected IP",render:s=>e.jsx("span",{className:"font-mono text-xs",children:s.detected_ip||"-"})},{key:"risk",header:"Risk Score",render:s=>{var t;return e.jsx("span",{className:s.risk_score>=75?"text-destructive font-bold":"",children:(t=s.risk_score)==null?void 0:t.toFixed(0)})}},{key:"action",header:"Action",render:s=>e.jsx(a,{variant:"outline",children:s.action_taken})},{key:"revoked",header:"Revoked",render:s=>s.session_revoked?e.jsx(L,{className:"h-4 w-4 text-destructive"}):e.jsx(J,{className:"h-4 w-4 text-muted-foreground"})}]})})]})}),e.jsx(p,{value:"exfiltration",children:e.jsxs(c,{children:[e.jsxs(d,{children:[e.jsxs(h,{className:"flex items-center gap-2",children:[e.jsx(E,{className:"h-5 w-5"}),"Exfiltration Attempts"]}),e.jsx(f,{children:"Detection of potential data exfiltration through large reads, rapid pagination, and bulk exports"})]}),e.jsx(m,{children:re?e.jsx("p",{className:"text-muted-foreground",children:"Loading exfiltration attempts..."}):j.length===0?e.jsx("p",{className:"text-muted-foreground",children:"No exfiltration attempts detected"}):e.jsx(N,{rows:j,getRowKey:s=>s.id,columns:[{key:"time",header:"Time",primary:!0,render:s=>D(new Date(s.created_at),"PP p")},{key:"type",header:"Detection Type",render:s=>I(s.detection_type)},{key:"severity",header:"Severity",render:s=>u(s.severity)},{key:"table",header:"Table",render:s=>e.jsx("span",{className:"font-mono text-xs",children:s.table_name})},{key:"records",header:"Records",render:s=>{var t;
1return((t=s.records_accessed)==null?void 0:t.toLocaleString())||0}},{key:"risk",header:"Risk Score",render:s=>{var t;return e.jsx("span",{className:s.risk_score>=75?"text-destructive font-bold":"",children:(t=s.risk_score)==null?void 0:t.toFixed(0)})}},{key:"action",header:"Action",render:s=>e.jsx(a,{variant:"outline",children:s.action_taken})},{key:"locked",header:"Locked",render:s=>s.session_locked?e.jsx(L,{className:"h-4 w-4 text-destructive"}):e.jsx(J,{className:"h-4 w-4 text-muted-foreground"})}]})})]})}),e.jsx(p,{value:"analysis",children:e.jsxs(c,{children:[e.jsxs(d,{children:[e.jsxs(h,{className:"flex items-center gap-2",children:[e.jsx(Le,{className:"h-5 w-5"}),"Admin Behavior Baselines"]}),e.jsx(f,{children:"Historical behavior patterns for each admin"})]}),e.jsx(m,{children:G?e.jsx("p",{className:"text-muted-foreground",children:"Loading baselines..."}):F.length===0?e.jsx("p",{className:"text-muted-foreground",children:"No baselines established yet. Baselines are built from login and activity history."}):e.jsx("div",{className:"space-y-6",children:F.map(s=>{var t,n,x,b,g;return e.jsxs(c,{className:"bg-muted/30",children:[e.jsx(d,{className:"pb-2",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(h,{className:"text-lg flex items-center gap-2",children:[e.jsx(fe,{className:"h-4 w-4"}),"Admin: ",s.user_id.substring(0,8),"..."]}),e.jsxs(a,{variant:"outline",children:[s.sample_size," sessions"]})]})}),e.jsxs(m,{children:[e.jsxs("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground mb-1",children:"Typical Login Hours"}),e.jsx("p",{className:"text-sm",children:((t=s.typical_login_hours)==null?void 0:t.length)>0?s.typical_login_hours.sort((P,ue)=>P-ue).map(P=>`${P}:00`).join(", "):"Not established"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground mb-1",children:"Typical Days"}),e.jsx("p",{className:"text-sm",children:((n=s.typical_login_days)==null?void 0:n.length)>0?s.typical_login_days.map(oe).join(", "):"Not established"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground mb-1",children:"Known IP Ranges"}),e.jsx("p",{className:"text-sm",children:((x=s.typical_ip_ranges)==null?void 0:x.length)>0?s.typical_ip_ranges.slice(0,3).join(", ")+(s.typical_ip_ranges.length>3?"...":""):"Not established"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground mb-1",children:"Avg Session Duration"}),e.jsx("p",{className:"text-sm",children:s.avg_session_duration_minutes?`${Math.round(s.avg_session_duration_minutes)} min`:"Not established"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground mb-1",children:"Sessions/Day"}),e.jsx("p",{className:"text-sm",children:((b=s.avg_sessions_per_day)==null?void 0:b.toFixed(1))||"Not established"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground mb-1",children:"Typical Tables"}),e.jsx("p",{className:"text-sm",children:((g=s.typical_tables_accessed)==null?void 0:g.length)>0?s.typical_tables_accessed.slice(0,5).join(", ")+(s.typical_tables_accessed.length>5?"...":""):"Not established"})]})]}),e.jsxs("p",{className:"text-xs text-muted-foreground mt-4",children:["Last updated: ",D(new Date(s.last_updated),"PPp")]})]})]},s.id)})})})]})}),e.jsx(p,{value:"settings",children:e.jsxs(c,{children:[e.jsxs(d,{children:[e.jsxs(h,{className:"flex items-center gap-2",children:[e.jsx(_e,{className:"h-5 w-5"}),"Detection Settings"]}),e.jsx(f,{children:"Configure AI hack detection, session hijacking, and exfiltration parameters"})]}),e.jsx(m,{children:se?e.jsx("p",{className:"text-muted-foreground",children:"Loading settings..."}):e.jsx("div",{className:"space-y-6",children:ee.map(s=>{const t=typeof s.setting_value=="boolean"||s.setting_value==="true"||s.setting_value==="false",n=s.setting_value===!0||s.setting_value==="true",x=s.setting_key.startsWith("hijack_"),b=s.setting_key.startsWith("exfil_");return e.jsxs("div",{className:"flex items-center justify-between py-3 border-b last:border-0",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx($,{className:"text-base",children:s.setting_key.replace(/_/g," ").replace(/\b\w/g,g=>g.toUpperCase())}),x&&e.jsx(a,{variant:"outline",className:"text-xs",children:"Hijacking"}),b&&e.jsx(a,{variant:"outline",className:"text-xs",children:"Exfiltration"})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:s.description})]}),t?e.jsx(Te,{checked:n,onCheckedChange:g=>{ne.mutate({id:s.id,value:g})}}):e.jsx(a,{variant:"outline",className:"font-mono",children:typeof s.setting_value=="string"?s.setting_value.replace(/"/g,""):JSON.stringify(s.setting_value)})]},s.id)})})})]})})]}),e.jsx(Ne,{open:!!r,onOpenChange:()=>w(null),children:e.jsxs(we,{children:[e.jsxs(ke,{children:[e.jsx(be,{children:"Review Alert"}),e.jsx(Se,{children:"Review this behavior alert and mark it as confirmed or false positive."})]}),r&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-sm",children:[e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-muted-foreground",children:"Alert Type"}),e.jsx("p",{children:K(r.alert_type)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-muted-foreground",children:"Severity"}),u(r.severity)]}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-muted-foreground",children:"Deviation Score"}),e.jsxs("p",{children:[(Q=r.deviation_score)==null?void 0:Q.toFixed(0),"/100"]})]}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-muted-foreground",children:"Action Taken"}),e.jsx("p",{children:r.action_taken})]})]}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-muted-foreground text-sm mb-1",children:"Details"}),e.jsx("pre",{className:"text-xs bg-muted p-2 rounded overflow-auto max-h-32",children:JSON.stringify(r.details,null,2)})]}),e.jsxs("div",{children:[e.jsx($,{htmlFor:"review-notes",children:"Review Notes"}),e.jsx(Pe,{id:"review-notes",value:A,onChange:s=>C(s.target.value),placeholder:"Add notes about this alert...",className:"mt-1"})]})]}),e.jsxs(De,{className:"gap-2",children:[e.jsx(y,{variant:"outline",onClick:()=>w(null),children:"Cancel"}),e.jsxs(y,{variant:"secondary",onClick:()=>{r&&k.mutate({id:r.id,isFalsePositive:!0,notes:A})},disabled:k.isPending,children:[e.jsx(Ee,{className:"h-4 w-4 mr-2"}),"False Positive"]}),e.jsxs(y,{variant:"destructive",onClick:()=>{r&&k.mutate({id:r.id,isFalsePositive:!1,notes:A})},disabled:k.isPending,children:[e.jsx(Fe,{className:"h-4 w-4 mr-2"}),"Confirm Threat"]})]})]})})]})};export{ls as default}; 2//# sourceMappingURL=AIHackDetection-DdOXCZox.js.map
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.