1import{r as i,j as e}from"./react-vendor-CdbEkvHB.js";import{T as gs,a as bs,b as me,c as xe}from"./tabs-BnaPPXWd.js";import{f as qe,B as _,n as ce,L as J,q as Je,A as Fe,b as Pe,c as Ue,d as $e,r as Ns,v as ws,w as ys,x as _s,y as Ss,z as ks,E as Cs,G as As}from"./index-D5ldX8nG.js";import{C as v,a as k,b as C,c as L,d as b}from"./card-heWL1pcs.js";import{I as re}from"./input-CgvMgJmt.js";import{L as D}from"./label-BDZC01Zc.js";import{S as Rs}from"./switch-ftUvet5y.js";import{S as U,a as $,b as G,c as V,d as f}from"./select-D6CUkacY.js";import{o as Ge,ab as He,m as We,ao as Es,R as Qe,a5 as ge,F as Ve,D as Ke,ap as he,y as Ye,aq as Ts,e as Xe,ar as Ze,a6 as Ds,ai as Ls,h as Is,as as Os}from"./icons-D5q0hyss.js";import{B as u}from"./badge-CrK0__Ya.js";import{T as je,a as pe,b as M,c as p,d as fe,e as x}from"./table-DvEYLw_y.js";import{C as te}from"./checkbox-BekCOBCt.js";import{a1 as es,a2 as Ms,a3 as Fs,a4 as ss,a5 as Ps}from"./radix-ui-CSxGpBRr.js";import{S as Us,a as $s,b as Gs,c as Vs,d as zs}from"./sheet-DQC01caT.js";import{T as Bs}from"./textarea-B3bO-cSJ.js";import"./supabase-CxM-nLeM.js";const ze=[{value:"ce",label:"Codex Everywhere (CE)"},{value:"openai",label:"OpenAI Direct"},{value:"openrouter",label:"OpenRouter"},{value:"google",label:"Google AI Studio Direct"}],qs=[{value:"auto",label:"Auto (per-model default)",hint:"Historical behavior"},{value:"none",label:"None",hint:"No reasoning tokens"},{value:"minimal",label:"Minimal",hint:"Fastest, cheapest"},{value:"low",label:"Low",hint:"Balanced"},{value:"medium",label:"Medium",hint:"More depth, more cost"},{value:"high",label:"High",hint:"Max depth, slowest"}];function Js(){const{toast:s}=qe(),[r,t]=i.useState(!0),[n,N]=i.useState(!1),[j,S]=i.useState("ce"),[g,A]=i.useState("gemini-3.8-flash"),[I,d]=i.useState("auto"),[w,H]=i.useState(!1),[F,W]=i.useState("google"),[P,z]=i.useState(""),[R,O]=i.useState(10);i.useEffect(()=>{async function c(){t(!0);try{const{data:m,error:E}=await ce.from("app_config").select("primary_provider, primary_model, reasoning_effort, fallback_enabled, fallback_provider, fallback_model, free_mentor_daily_limit").eq("id","global").maybeSingle();if(E)throw E;m&&(m.primary_provider&&S(m.primary_provider),m.primary_model&&A(m.primary_model),m.reasoning_effort&&d(m.reasoning_effort),H(!!m.fallback_enabled),m.fallback_provider&&W(m.fallback_provider),m.fallback_model&&z(m.fallback_model),typeof m.free_mentor_daily_limit=="number"&&O(m.free_mentor_daily_limit))}catch(m){s({title:"Error loading configuration",description:m.message||"Failed to load global AI routing config",variant:"destructive"})}finally{t(!1)}}c()},[s]);const Q=async()=>{const c=g.trim();if(!c){s({title:"Validation Error",description:"Primary model cannot be empty.",variant:"destructive"});return}const m=P.trim();if(w&&!m){s({title:"Validation Error",description:"Fallback model cannot be empty when fallback is enabled.",variant:"destructive"});return}const E=Number(R);if(!Number.isInteger(E)||E<1||E>100){s({title:"Validation Error",description:"Free mentor daily limit must be an integer between 1 and 100.",variant:"destructive"});return}N(!0);try{const o={primary_provider:j,primary_model:c,reasoning_effort:I,fallback_enabled:w,fallback_provider:w?F:null,fallback_model:w?m:null,free_mentor_daily_limit:E,updated_at:new Date().toISOString()},{error:T}=await ce.from("app_config").update(o).eq("id","global");if(T)throw T;s({title:"Settings Saved",description:"Global AI routing and quota configuration updated successfully."})}catch(o){s({title:"Save Failed",description:o.message||"Could not update app_config",variant:"destructive"})}finally{N(!1)}};return r?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(Ge,{className:"h-6 w-6 animate-spin text-primary"})}):e.jsx("div",{className:"max-w-4xl space-y-6",children:e.jsxs(v,{children:[e.jsxs(k,{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(He,{className:"h-5 w-5 text-primary"}),e.jsx(C,{children:"Global AI Routing & Model Configuration"})]}),e.jsx(L,{children:"Configure the single global AI provider and model used for all chart scans, plan reviews, and mentor conversations."})]}),e.jsxs(b,{className:"space-y-6",children:[e.jsxs("div",{className:"space-y-4 rounded-lg border p-4",children:[e.jsxs("div",{className:"flex items-center gap-2 font-medium",children:[e.jsx(We,{className:"h-4 w-4 text-primary"}),"Primary Route"]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{htmlFor:"primaryProvi
1der",children:"Provider"}),e.jsxs(U,{value:j,onValueChange:c=>S(c),children:[e.jsx($,{id:"primaryProvider",children:e.jsx(G,{placeholder:"Select provider"})}),e.jsx(V,{children:ze.map(c=>e.jsx(f,{value:c.value,children:c.label},c.value))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{htmlFor:"primaryModel",children:"Model Identifier"}),e.jsx(re,{id:"primaryModel",value:g,onChange:c=>A(c.target.value),placeholder:"e.g. gemini-3.8-flash"})]})]}),e.jsxs("div",{className:"space-y-2 pt-2",children:[e.jsx(D,{htmlFor:"reasoningEffort",children:"Global Reasoning Effort"}),e.jsxs(U,{value:I,onValueChange:c=>d(c),children:[e.jsx($,{id:"reasoningEffort",children:e.jsx(G,{placeholder:"Select effort"})}),e.jsx(V,{children:qs.map(c=>e.jsxs(f,{value:c.value,children:[c.label," â ",e.jsx("span",{className:"text-muted-foreground",children:c.hint})]},c.value))})]})]})]}),e.jsxs("div",{className:"space-y-4 rounded-lg border p-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx(D,{htmlFor:"fallbackEnabled",className:"text-base font-medium",children:"Enable Automatic Fallback"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Attempt a secondary route once if the primary route encounters missing credentials, a timeout, or a 5xx server error."})]}),e.jsx(Rs,{id:"fallbackEnabled",checked:w,onCheckedChange:H})]}),w&&e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 pt-2",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{htmlFor:"fallbackProvider",children:"Fallback Provider"}),e.jsxs(U,{value:F,onValueChange:c=>W(c),children:[e.jsx($,{id:"fallbackProvider",children:e.jsx(G,{placeholder:"Select fallback provider"})}),e.jsx(V,{children:ze.map(c=>e.jsx(f,{value:c.value,children:c.label},c.value))})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{htmlFor:"fallbackModel",children:"Fallback Model Identifier"}),e.jsx(re,{id:"fallbackModel",value:P,onChange:c=>z(c.target.value),placeholder:"e.g. gemini-2.5-flash"})]})]})]}),e.jsxs("div",{className:"space-y-4 rounded-lg border p-4",children:[e.jsx(D,{htmlFor:"freeLimit",className:"font-medium",children:"Free Daily Mentor Messages Limit"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Number of generated mentor messages allowed per UTC day for free-tier traders. Covers both screenshot-free replies and screenshot-grounded follow-ups."}),e.jsx(re,{id:"freeLimit",type:"number",min:1,max:100,value:R,onChange:c=>O(Number(c.target.value)),className:"max-w-[200px]"})]}),e.jsx("div",{className:"flex justify-end pt-4",children:e.jsxs(_,{onClick:Q,disabled:n,className:"gap-2",children:[n?e.jsx(Ge,{className:"h-4 w-4 animate-spin"}):e.jsx(Es,{className:"h-4 w-4"}),"Save Configuration"]})})]})]})})}function Z(s){return s===null?"â":`${s.toFixed(1)}%`}function Hs(s){return s?new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"short"}).format(new Date(s)):"â"}function Ws(){const[s,r]=i.useState(30),[t,n]=i.useState(null),[N,j]=i.useState(!0),[S,g]=i.useState(null),A=i.useCallback(async()=>{j(!0),g(null);const{data:d,error:w}=await ce.functions.invoke("admin-analysis-health",{body:{windowDays:s}});w||d?.error?g(w?.message||d?.error||"Could not load analysis health"):n(d),j(!1)},[s]);i.useEffect(()=>{A()},[A]);const I=!!(t&&(t.market.timedOut>0||t.market.withErrors>0));return e.jsxs("div",{className:"space-y-6",children:[e.jsxs(v,{children:[e.jsxs(k,{className:"flex-row items-start justify-between gap-4 space-y-0",children:[e.jsxs("div",{children:[e.jsx(C,{children:"Analysis health"}),e.jsx(L,{children:"Read-only coverage for market enrichment and screenshot-grounded pattern detection. Recognition rate is not an accuracy score."})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(U,{value:String(s),onValueChange:d=>r(Number(d)),children:[e.jsx($,{className:"w-28","aria-label":"Analysis health window",children:e.jsx(G,{})}),e.jsx(V,{children:[7,30,90].map(d=>e.jsxs(f,{value:String(d),children:[d," days"]},d))})]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>{A()},disabled:N,children:[e.jsx(Qe,{className:"mr-2 h-4 w-4"})," Refresh"]})]})]}),e.jsxs(b,{children:[S?e.jsx("p",{className:"text-sm text-destructive",children:S}):N&&!t?e.jsxs("div",{className:"flex items-center justify-center py-10 text-muted-foreground",children:[e.jsx(J,{className:"mr-2 h-5 w-5"})," Loading health"]}):t?e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-5",children:[e.jsx(ee,{label:"Responses",value:String(t.overall.sampledRows)}),e.jsx(ee,{label:"Success",value:Z(t.overall.successRate)}),e.jsx(ee,{label:"Market context observed",value:String(t.market.observedRows)}),e.jsx(ee,{label:"Context used",value:Z(t.market.usageRate)}),e.jsx(ee,{label:"Patterns recognized",value:Z(t.patterns.recognitionRate)})]}):null,t?.truncated?e.jsx("p",{className:"mt-4 text-xs text-muted-foreground",children:"Aggregation reached the 5,000-row safety cap; rates use that newest-row sample."}):null]})]}),I?e.jsxs("div",{className:"flex gap-3 rounded-md border border-destructive/40 bg-destructive/5 p-4 text-sm",children:[e.jsx(ge,{className:"mt-0.5 h-4 w-4 shrink-0 text-destructive"}),e.jsxs("p",{children:["Market ingestion recorded ",t?.market.timedOut||0," timeout(s) and"," ",t?.market.withErrors||0," response(s) with provider errors in this window."]})]}):null,t?e.jsxs(e.Fragment,{children:[e.jsxs(v,{children:[e.jsxs(k,{children:[e.jsx(C,{children:"Market ingestion"}),e.jsxs(L,{children:["Latest context ",Hs(t.market.latestContextAt)," ·"," ","price context used ",t.market.priceContextUsed," times · providers"," ",t.market.providers.map(d=>`${d.key} (${d.count})`).join(", ")||"none"]})]}),e.jsxs(b,{children:[e.jsxs(je,{children:[e.jsx(pe,{children:e.jsxs(M,{children:[e.jsx(p,{children:"Asset"}),e.jsx(p,{children:"Observed"}),e.jsx(p,{children:"Used"}),e.jsx(p,{children:"Price"}),e.jsx(p,{children:"Issues"}),e.jsx(p,{children:"Usage rate"})]})}),e.jsxs(fe,{children:[t.market.assets.map(d=>e.jsxs(M,{children:[e.jsx(x,{className:"font-medium",children:d.assetClass}),e.jsx(x,{children:d.observed}),e.jsx(x,{children:d.anyContextUsed}),e.jsx(x,{children:d.priceContextUsed}),e.jsx(x,{children:e.jsx(u,{variant:d.issues?"destructive":"outline",children:d.issues})}),e.jsx(x,{children:Z(d.usageRate)})]},d.assetClass)),t.market.assets.length===0?e.jsx(M,{children:e.jsx(x,{colSpan:6,className:"text-center text-muted-foreground",children:"No persisted market-context rows in this window."})}):null]})]}),t.market.skippedReasons.length?e.jsxs("p",{className:"mt-4 text-xs text-muted-foreground",children:["Skips: ",t.market.skippedReasons.map(d=>`${d.key} (${d.count}
1)`).join(", ")]}):null]})]}),e.jsxs(v,{children:[e.jsxs(k,{children:[e.jsx(C,{children:"Pattern recognition"}),e.jsxs(L,{children:["Evaluated ",t.patterns.evaluated," setup scans; ",t.patterns.confirmed," confirmed, ",t.patterns.forming," forming, ",t.patterns.failed," failed. Evidence present on ",Z(t.patterns.evidenceRate)," of recognized patterns."]})]}),e.jsx(b,{children:e.jsxs(je,{children:[e.jsx(pe,{children:e.jsxs(M,{children:[e.jsx(p,{children:"Pattern"}),e.jsx(p,{children:"Recognized"})]})}),e.jsxs(fe,{children:[t.patterns.names.map(d=>e.jsxs(M,{children:[e.jsx(x,{className:"font-medium",children:d.key.replace(/_/g," ")}),e.jsx(x,{children:d.count})]},d.key)),t.patterns.names.length===0?e.jsx(M,{children:e.jsx(x,{colSpan:2,className:"text-center text-muted-foreground",children:"No patterns recognized in this window."})}):null]})]})})]})]}):null]})}function ee({label:s,value:r}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:s}),e.jsx("p",{className:"text-2xl font-semibold",children:r})]})}function Y(s){return s===null?"â":`${Math.round(s*100)}%`}function as(s){return s==="verified"?"default":s==="mixed"?"secondary":s==="low_support"?"destructive":"outline"}function rs(s){return s==="low_support"?"Low support":s==="verified"?"Verified":s==="mixed"?"Mixed":"Not evaluated"}const Qs=[{value:"missed_chart_detail",label:"Missed chart detail"},{value:"wrong_direction",label:"Wrong direction"},{value:"bad_risk_reward",label:"Bad risk/reward"},{value:"hallucinated_level",label:"Hallucinated level"},{value:"bad_json",label:"Bad JSON"},{value:"too_verbose",label:"Too verbose"},{value:"too_generic",label:"Too generic"},{value:"unsafe_advice",label:"Unsafe advice"},{value:"slow_response",label:"Slow response"},{value:"other",label:"Other"}],Ks=[{value:"7d",label:"7d"},{value:"30d",label:"30d"},{value:"90d",label:"90d"},{value:"all",label:"All"}],se=50;function Ys(s){if(s==="all")return;const r=s==="7d"?7:s==="90d"?90:30;return new Date(Date.now()-r*864e5).toISOString()}function ts(s){return s?new Date(s).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"-"}function Xs(s){return s.mode_label==="Mentor opened"||s.mode_label==="Mentor reply"||typeof s.mode_label=="string"&&s.mode_label.trim()?s.mode_label:s.response_kind==="setup_text"&&(!s.review_mode||s.review_mode==="review")?"Setup Scan":s.response_kind==="trade_review"||s.review_mode==="trade_evaluator"?"Legacy Marked Setup":s.review_mode==="trade_evaluator_fallback"?"Marked Setup Fallback":s.response_kind==="follow_up_text"?"Follow-up":s.review_mode||s.response_kind||"-"}function Zs(s){return s?s<1024*1024?`${Math.round(s/1024)} KB`:`${(s/1024/1024).toFixed(1)} MB`:"-"}function ls(s){return s==="good"?"default":s==="acceptable"?"secondary":s==="bad"?"destructive":"outline"}function ve(s,r,t){const n=new Blob([r],{type:t}),N=URL.createObjectURL(n),j=document.createElement("a");j.href=N,j.download=s,j.click(),URL.revokeObjectURL(N)}function be(s){return JSON.stringify(s??null,null,2)}async function B(s){const{data:r,error:t}=await ce.functions.invoke("admin-analysis-logs",{body:s});if(t)throw t;if(r?.error)throw new Error(r.error);return r}function de({value:s}){return e.jsx("pre",{className:"max-h-80 overflow-auto rounded-md border border-border bg-muted/40 p-3 text-xs leading-relaxed whitespace-pre-wrap break-words",children:be(s)})}function ea(s){const r=s?.parsed_output,t=r?.marketContext||r?.market_context;return!t||typeof t!="object"?null:t}function Be(s){return!!(s?.macroEventsUsed||s?.sessionContextUsed||s?.priceContextUsed||s?.benchmarkContextUsed)}function q(s){return typeof s=="string"&&s.trim()?s.trim():null}function y({label:s,value:r}){const t=typeof r=="number"&&Number.isFinite(r)?String(r):q(r)||"â";return e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs uppercase tracking-wide text-muted-foreground",children:s}),e.jsx("dd",{className:"mt-1 break-words text-sm font-medium",children:t})]})}function sa({parsed:s}){if(!s||typeof s!="object")return e.jsx(v,{children:e.jsxs(k,{children:[e.jsx(C,{className:"text-base",children:"Scan Summary"}),e.jsx(L,{children:"No structured scan output is available for this log."})]})});const r=s,t=r.signal||r.signals?.[0]||null,n=r.watchCondition||r.watch_condition||null,N=q(r.mentorSummary)||q(r.mentor_summary)||q(r.analysis)||"No mentor summary was returned.",j=q(r.detectedContext)||q(r.detected_context),S=(r.gateReasons||r.gate_reasons||[]).filter(g=>!!q(g));return e.jsxs(v,{children:[e.jsxs(k,{children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(C,{className:"text-base",children:"Scan Summary"}),r.scanOutcome?e.jsx(u,{variant:"outline",children:r.scanOutcome}):null,r.overallRating?e.jsx(u,{variant:"secondary",children:r.overallRating}):null]}),e.jsx(L,{children:"Human-readable view of the structured provider output."})]}),e.jsxs(b,{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsx("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:"Mentor summary"}),e.jsx("p",{className:"mt-2 whitespace-pre-wrap text-sm leading-relaxed",children:N})]}),t?e.jsxs("div",{className:"rounded-md border border-border p-4",children:[e.jsx("h4",{className:"mb-3 font-semibold",children:"Signal"}),e.jsxs("dl",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:[e.jsx(y,{label:"Direction",value:t.direction}),e.jsx(y,{label:"Order",value:t.orderType}),e.jsx(y,{label:"Entry",value:t.entry}),e.jsx(y,{label:"Stop",value:t.stopLoss}),e.jsx(y,{label:"Target",value:t.takeProfit}),e.jsx(y,{label:"Confidence",value:typeof t.confidence=="number"?`${t.confidence}%`:null}),e.jsx(y,{label:"Risk / reward",value:t.riskReward}),e.jsx(y,{label:"Trigger",value:t.triggerRule}),e.jsx(y,{label:"Cancel if",value:t.cancelRule})]})]}
1):n?e.jsxs("div",{className:"rounded-md border border-border p-4",children:[e.jsx("h4",{className:"mb-3 font-semibold",children:"Watch condition"}),e.jsxs("dl",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(y,{label:"Direction",value:n.direction}),e.jsx(y,{label:"Confidence",value:typeof n.confidence=="number"?`${n.confidence}%`:null}),e.jsx(y,{label:"Trigger",value:n.trigger}),e.jsx(y,{label:"Alert level",value:n.alertLevel}),e.jsx(y,{label:"Cancel if",value:n.cancelCondition}),e.jsx(y,{label:"Expiry",value:n.expiry})]}),n.reason?e.jsx("p",{className:"mt-4 text-sm text-muted-foreground",children:n.reason}):null]}):e.jsx("p",{className:"rounded-md border border-dashed border-border p-4 text-sm text-muted-foreground",children:"No signal or watch condition was returned."}),j||S.length>0?e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[j?e.jsxs("div",{children:[e.jsx("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:"Detected context"}),e.jsx("p",{className:"mt-2 text-sm",children:j})]}):null,S.length>0?e.jsxs("div",{children:[e.jsx("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:"Gate reasons"}),e.jsx("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm",children:S.map((g,A)=>e.jsx("li",{children:g},`${g}-${A}`))})]}):null]}):null]})]})}const is=i.forwardRef(({className:s,children:r,...t},n)=>e.jsxs(es,{ref:n,className:Je("relative overflow-hidden",s),...t,children:[e.jsx(Ms,{className:"h-full w-full rounded-[inherit]",children:r}),e.jsx(ns,{}),e.jsx(Fs,{})]}));is.displayName=es.displayName;const ns=i.forwardRef(({className:s,orientation:r="vertical",...t},n)=>e.jsx(ss,{ref:n,orientation:r,className:Je("flex touch-none select-none transition-colors",r==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",r==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",s),...t,children:e.jsx(Ps,{className:"relative flex-1 rounded-full bg-border"})}));ns.displayName=ss.displayName;
1function aa({selected:s,setSelected:r,detailLoading:t,selectedMarketContext:n,reviewRating:N,setReviewRating:j,reviewTags:S,reviewNotes:g,setReviewNotes:A,goldenDataset:I,setGoldenDataset:d,eligibleForTraining:w,setEligibleForTraining:H,savingReview:F,deleteAllOpen:W,setDeleteAllOpen:P,deleteConfirm:z,setDeleteConfirm:R,copyRequestId:O,toggleTag:Q,saveEvaluation:c,deleteOne:m,deleteAll:E}){return e.jsxs(e.Fragment,{children:[e.jsx(Us,{open:t||!!s,onOpenChange:o=>{o||r(null)},children:e.jsxs($s,{side:"right",className:"flex w-full flex-col gap-0 overflow-hidden p-0 sm:max-w-5xl",children:[e.jsxs(Gs,{className:"border-b border-border px-6 py-5",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(Vs,{children:"AI Log"}),s&&e.jsx(u,{variant:s.status==="success"?"default":"destructive",children:s.status}),s?.reviewer_rating&&e.jsx(u,{variant:ls(s.reviewer_rating),children:s.reviewer_rating})]}),e.jsx(zs,{children:s?`${s.request_id} · ${ts(s.created_at)}`:"Loading log detail"})]}),t&&!s?e.jsx("div",{className:"flex flex-1 items-center justify-center",children:e.jsx(J,{className:"h-6 w-6 text-primary"})}):s?e.jsx(is,{className:"flex-1",children:e.jsx("div",{className:"space-y-6 p-6",children:e.jsxs("div",{className:"grid gap-4 lg:grid-cols-[minmax(0,1fr)_340px]",children:[e.jsxs("div",{className:"space-y-4",children:[s.log_source!=="mentor"?e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("h3",{className:"font-semibold",children:"Screenshot"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>O(s.request_id),children:[e.jsx(Ve,{className:"mr-1.5 h-3.5 w-3.5"}),"ID"]}),e.jsxs(_,{variant:"outline",size:"sm",disabled:!s.screenshot_url,onClick:()=>s.screenshot_url&&window.open(s.screenshot_url,"_blank","noopener,noreferrer"),children:[e.jsx(Ke,{className:"mr-1.5 h-3.5 w-3.5"}),"Screenshot"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>ve(`ai-log-${s.request_id}.json`,be(s),"application/json;charset=utf-8"),children:[e.jsx(he,{className:"mr-1.5 h-3.5 w-3.5"}),"Log JSON"]})]})]}),s.screenshot_url?e.jsx("div",{className:"overflow-hidden rounded-md border border-border bg-muted/30",children:e.jsx("img",{src:s.screenshot_url,alt:"Analyzed chart screenshot",className:"max-h-[520px] w-full object-contain"})}):e.jsx("div",{className:"rounded-md border border-dashed border-border p-8 text-center text-sm text-muted-foreground",children:"Screenshot unavailable."})]}),e.jsx(sa,{parsed:s.parsed_output})]}):e.jsxs("section",{className:"space-y-3 rounded-md border border-border bg-muted/20 p-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("h3",{className:"font-semibold",children:"Mentor conversation"}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>O(s.request_id),children:[e.jsx(Ve,{className:"mr-1.5 h-3.5 w-3.5"}),"ID"]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:"Trader"}),e.jsx("p",{className:"whitespace-pre-wrap break-words text-sm",children:String(s.ai_request_payload||"No trader message for this turn.")})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:"ChartMentor"}),e.jsx("p",{className:"whitespace-pre-wrap break-words text-sm",children:s.raw_assistant_content||"No assistant message was stored."})]})]}),e.jsx(Fe,{type:"single",collapsible:!0,children:e.jsxs(Pe,{value:"raw-json",children:[e.jsx(Ue,{children:"Raw JSON (debug)"}),e.jsxs($e,{className:"space-y-4",children:[e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"font-semibold",children:"AI Input"}),e.jsx(de,{value:s.ai_request_payload})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"font-semibold",children:"Raw AI Output"}),e.jsx(de,{value:s.ai_response_payload})]}),e.jsxs("section",{className:"space-y-2",children:[e.jsx("h3",{className:"font-semibold",children:"Parsed Output"}),e.jsx(de,{value:s.parsed_output})]})]})]})})]}),e.jsxs("aside",{className:"space-y-4",children:[e.jsxs(v,{children:[e.jsx(k,{children:e.jsx(C,{className:"text-base",children:"Metadata"})}),e.jsxs(b,{className:"space-y-2 text-sm",children:[e.jsxs("div",{className:"flex justify-between gap-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"User"}),e.jsx("span",{className:"truncate",children:s.user_email||s.user_id})]}),e.jsxs("div",{className:"flex justify-between gap-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"Chart"}),e.jsxs("span",{children:[s.symbol||"UNKNOWN"," /"," ",s.timeframe||"N/A"]})]}),e.jsxs("div",{className:"flex justify-between gap-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"Model"}),e.jsx("span",{className:"max-w-48 truncate",children:s.model||"-"})]}),e.jsxs("div",{className:"flex justify-between gap-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"Provider"}),e.jsx("span",{children:s.provider||"-"})]}),e.jsxs("div",{className:"flex justify-between gap-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"Duration"}),e.jsxs("span",{children:[s.duration_ms??"-"," ms"]})]}),s.log_source!=="mentor"&&e.jsxs("div",{className:"flex justify-between gap-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"Image"}),e.jsx("span",{children:Zs(s.screenshot_size_bytes)})]})]})]}),s.log_source==="mentor"&&s.jev_verification&&e.jsxs(v,{children:[e.jsxs(k,{children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx(C,{className:"text-base",children:"Jev verification"}),e.jsx(u,{variant:as(s.jev_verification.status),children:rs(s.jev_verification.status)})]}),e.jsx(L,{children:s.jev_verification.mode==="shadow"?"Measured after delivery. It did n
1ot alter this reply.":"Active verification result."})]}),e.jsxs(b,{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex justify-between gap-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"Support confidence"}),e.jsx("span",{className:"font-medium",children:Y(s.jev_verification.supportConfidence)})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-2 text-center text-xs",children:[e.jsx(ue,{label:"Grounded",passed:s.jev_verification.isGrounded}),e.jsx(ue,{label:"Consistent",passed:s.jev_verification.isConsistent}),e.jsx(ue,{label:"Complete",passed:s.jev_verification.isComplete})]}),e.jsxs("div",{className:"flex justify-between gap-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"Retry performed"}),e.jsx("span",{children:s.jev_verification.retryAttempted?"Yes":"No"})]}),e.jsx(Fe,{type:"single",collapsible:!0,children:e.jsxs(Pe,{value:"jev-debug",children:[e.jsx(Ue,{className:"text-sm",children:"Evaluation details"}),e.jsx($e,{children:e.jsx(de,{value:{metrics:s.jev_verification.metrics,evaluatorOutput:s.jev_verification.evaluatorOutput}})})]})})]})]}),n&&e.jsxs(v,{children:[e.jsxs(k,{children:[e.jsx(C,{className:"text-base",children:"Market Context"}),e.jsx(L,{children:Be(n)?"Server-side context injected into the AI prompt.":`Skipped${n.skippedReason?`: ${n.skippedReason}`:""}`})]}),e.jsxs(b,{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex flex-wrap gap-1",children:[n.priceContextUsed&&e.jsx(u,{variant:"secondary",children:"price"}),n.macroEventsUsed&&e.jsx(u,{variant:"secondary",children:"macro"}),n.sessionContextUsed&&e.jsx(u,{variant:"secondary",children:"session"}),n.benchmarkContextUsed&&e.jsx(u,{variant:"secondary",children:"benchmark"}),!Be(n)&&e.jsx(u,{variant:"outline",children:"not used"})]}),e.jsxs("div",{className:"flex justify-between gap-3",children:[e.jsx("span",{className:"text-muted-foreground",children:"Duration"}),e.jsxs("span",{children:[n.durationMs??"-"," ms"]})]}),n.providers?.length?e.jsxs("div",{className:"space-y-1",children:[e.jsx("div",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:"Providers"}),e.jsx("div",{className:"break-words text-xs",children:n.providers.join(", ")})]}):null,n.summary?e.jsxs("div",{className:"space-y-1",children:[e.jsx("div",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:"Injected summary"}),e.jsx("pre",{className:"max-h-44 overflow-auto whitespace-pre-wrap rounded-md border border-border bg-muted/40 p-2 text-xs leading-relaxed",children:n.summary})]}):null]})]}),s.error_message&&e.jsxs(v,{className:"border-destructive/30",children:[e.jsx(k,{children:e.jsxs(C,{className:"flex items-center gap-2 text-base text-destructive",children:[e.jsx(ge,{className:"h-4 w-4"}),"Error"]})}),e.jsxs(b,{className:"space-y-2 text-sm",children:[e.jsx(u,{variant:"destructive",children:s.error_code||"error"}),e.jsx("p",{className:"whitespace-pre-wrap break-words text-muted-foreground",children:s.error_message})]})]}),s.log_source!=="mentor"&&e.jsxs(v,{children:[e.jsxs(k,{children:[e.jsx(C,{className:"text-base",children:"Model Evaluation"}),e.jsx(L,{children:"Use this to build clean evals and training exports."})]}),e.jsxs(b,{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{children:"Rating"}),e.jsxs(U,{value:N||"unreviewed",onValueChange:o=>j(o==="unreviewed"?null:o),children:[e.jsx($,{children:e.jsx(G,{})}),e.jsxs(V,{children:[e.jsx(f,{value:"unreviewed",children:"Unreviewed"}),e.jsx(f,{value:"good",children:"Good"}),e.jsx(f,{value:"acceptable",children:"Acceptable"}),e.jsx(f,{value:"bad",children:"Bad"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{children:"Issue tags"}),e.jsx("div",{className:"grid grid-cols-1 gap-2",children:Qs.map(o=>e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx(te,{checked:S.includes(o.value),onCheckedChange:T=>Q(o.value,T===!0)}),o.label]},o.value))})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{children:"Reviewer notes"}),e.jsx(Bs,{value:g,onChange:o=>A(o.target.value.slice(0,5e3)),rows:5,placeholder:"What was correct, wrong, or useful for future evals?"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx(te,{checked:I,onCheckedChange:o=>d(o===!0)}),"Golden dataset example"]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx(te,{checked:w,onCheckedChange:o=>H(o===!0)}),"Eligible for training export"]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(_,{className:"flex-1",onClick:c,disabled:F,children:[F&&e.jsx(J,{className:"mr-1.5 h-3.5 w-3.5"}),"Save evaluation"]}),e.jsx(_,{variant:"destructive",size:"icon",onClick:m,children:e.jsx(Ye,{className:"h-4 w-4"})})]})]})]})]})]})})}):null]})}),e.jsx(Ns,{open:W,onOpenChange:P,children:e.jsxs(ws,{children:[e.jsxs(ys,{children:[e.jsx(_s,{children:"Delete all analysis logs?"}
1),e.jsx(Ss,{children:"This removes stored chart-analysis logs and screenshots. Mentor conversations remain available. Download an export first if you need an archive."})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{htmlFor:"delete-ai-logs",children:"Type DELETE ANALYSIS LOGS to confirm"}),e.jsx(re,{id:"delete-ai-logs",value:z,onChange:o=>R(o.target.value),autoComplete:"off"})]}),e.jsxs(ks,{children:[e.jsx(Cs,{children:"Cancel"}),e.jsx(As,{disabled:z!=="DELETE ANALYSIS LOGS",onClick:o=>{o.preventDefault(),E()},className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:"Delete history"})]})]})})]})}function ue({label:s,passed:r}){return e.jsxs("div",{className:"rounded-md border border-border px-2 py-2",children:[e.jsx("div",{className:r?"font-medium text-emerald-600":"font-medium text-red-600",children:r?"Pass":"Flag"}),e.jsx("div",{className:"text-muted-foreground",children:s})]})}function ra({stats:s}){return s?e.jsxs(v,{children:[e.jsx(k,{children:e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[e.jsxs("div",{children:[e.jsxs(C,{className:"flex items-center gap-2",children:[e.jsx(We,{className:"h-5 w-5 text-blue-500"}),"Jev answer verification"]}),e.jsx(L,{children:"Shadow checks for groundedness, contradictions, and completeness in the selected time range."})]}),e.jsx(u,{variant:"outline",children:"Shadow mode"})]})}),e.jsx(b,{className:"space-y-5",children:s.available?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-5",children:[e.jsx(ae,{label:"Evaluated",value:String(s.total),icon:e.jsx(Ts,{className:"h-4 w-4 text-blue-500"})}),e.jsx(ae,{label:"Verified",value:Y(s.verifiedRate),icon:e.jsx(Xe,{className:"h-4 w-4 text-emerald-500"})}),e.jsx(ae,{label:"Mixed",value:Y(s.mixedRate)}),e.jsx(ae,{label:"Low support",value:Y(s.lowSupportRate)}),e.jsx(ae,{label:"Average confidence",value:Y(s.averageSupportConfidence)})]}),e.jsxs("div",{className:"grid gap-4 lg:grid-cols-2",children:[e.jsxs("div",{className:"rounded-md border border-border p-4",children:[e.jsx("h4",{className:"mb-3 text-sm font-semibold",children:"Operational health"}),e.jsxs("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-2 text-sm",children:[e.jsx(K,{label:"Average latency",value:s.averageLatencyMs===null?"â":`${Math.round(s.averageLatencyMs)} ms`}),e.jsx(K,{label:"Recorded cost",value:`$${s.totalCostUsd.toFixed(4)}`}),e.jsx(K,{label:"Evaluator failures",value:String(s.evaluatorFailures)}),e.jsx(K,{label:"Would retry",value:String(s.wouldRetry)}),e.jsx(K,{label:"Retries performed",value:String(s.retriesAttempted)}),e.jsx(K,{label:"Detailed sample",value:s.sampleLimited?"Latest 1,000":"Complete range"})]})]}),e.jsxs("div",{className:"rounded-md border border-border p-4",children:[e.jsx("h4",{className:"mb-3 text-sm font-semibold",children:"Primary model breakdown"}),s.byModel.length?e.jsx("div",{className:"space-y-2",children:s.byModel.slice(0,5).map(r=>e.jsxs("div",{className:"flex items-center justify-between gap-3 text-sm",children:[e.jsx("span",{className:"min-w-0 truncate",title:r.model,children:r.model}),e.jsxs("span",{className:"whitespace-nowrap text-muted-foreground",children:[r.total," · ",Y(r.verifiedRate)," verified"]})]},r.model))}):e.jsx("p",{className:"text-sm text-muted-foreground",children:"No Jev evaluations in this range."})]})]}),s.topReasons.length>0&&e.jsxs("div",{className:"rounded-md border border-border p-4",children:[e.jsx("h4",{className:"mb-3 text-sm font-semibold",children:"Most common flags"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:s.topReasons.map(r=>e.jsxs(u,{variant:"outline",title:r.reason,children:[r.reason," · ",r.count]},r.reason))})]})]}):e.jsxs("div",{className:"flex items-center gap-2 rounded-md border border-amber-500/30 bg-amber-500/5 p-3 text-sm",children:[e.jsx(ge,{className:"h-4 w-4 text-amber-500"}),"Jev reporting is unavailable. The mentor remains unaffected."]})})]}):null}function ae({label:s,value:r,icon:t}){return e.jsxs("div",{className:"rounded-md border border-border p-3",children:[e.jsxs("div",{className:"mb-1 flex items-center gap-1.5 text-xs text-muted-foreground",children:[t,s]}),e.jsx("p",{className:"text-xl font-semibold",children:r})]})}function K({label:s,value:r}){return e.jsxs("div",{className:"contents",children:[e.jsx("dt",{className:"text-muted-foreground",children:s}),e.jsx("dd",{className:"text-right font-medium",children:r})]})}function ta(){const{toast:s}=qe(),[r,t]=i.useState([]),[n,N]=i.useState(!0),[j,S]=i.useState(""),[g,A]=i.useState("30d"),[I,d]=i.useState("all"),[w,H]=i.useState("all"),[F,W]=i.useState(!1),[P,z]=i.useState(!1),[R,O]=i.useState(0),[Q,c]=i.useState(0),[m,E]=i.useState(null),[o,T]=i.useState(null),[ds,Ne]=i.useState(!1),[le,we]=i.useState(null),[cs,ye]=i.useState(!1),[os,oe]=i.useState(!1),[ms,_e]=i.useState(""),[Se,ke]=i.useState(null),[Ce,Ae]=i.useState([]),[Re,Ee]=i.useState(""),[Te,De]=i.useState(!1),[Le,Ie]=i.useState(!1),X=i.useMemo(()=>({dateFrom:Ys(g),status:I,rating:w,eligibleForTraining:F?!0:void 0,goldenDataset:P?!0:void 0,search:j.trim()||void 0}),[P,g,w,j,I,F]),ie=i.useCallback(async()=>{N(!0);try{const a=await B({action:"list",filters:X,limit:se,offset:R});t(a.logs||[]),c(a.total||0),E(a.jev_stats||null)}catch(a){s({title:"Failed to load AI logs",description:a.message||"Admin log request failed.",variant:"destructive"})}finally{N(!1)}},[X,R,s]);i.useEffect(()=>{ie()},[ie]),i.useEffect(()=>{O(0)},[X]);const ne=i.useMemo(()=>{const a=r.filter(l=>l.reviewer_rating).length;return{totalVisible:r.length,errors:r.filter(l=>l.status==="error").length,reviewed:a,training:r.filter(l=>l.eligible_for_training).length}},[r]),xs=i.useMemo(()=>ea(o),[o]),Oe=async a=>{Ne(!0),T(null);try{const h=(await B({action:"detail",id:a.id,source:a.log_source||"analysis"})).log;T(h),ke(h.reviewer_rating),Ae(h.issue_tags||[]),Ee(h.reviewer_notes||""),De(h.golden_dataset),Ie(h.eligible_for_training)}catch(l){s({title:"Failed to open log",description:l.message,variant:"destructive"})}finally{Ne(!1)}},Me=async a=>{we(a);
1try{if(a==="csv"){const l=await B({action:"export_csv",filters:X});ve(l.filename,l.csv,"text/csv;charset=utf-8"),s({title:"CSV exported",description:`${l.rowCount} rows downloaded.`})}else{const l=await B({action:"export_json",filters:X});ve(l.filename,be(l.export),"application/json;charset=utf-8"),s({title:"JSON exported",description:"Signed screenshot links expire in 1 hour."})}}catch(l){s({title:"Export failed",description:l.message,variant:"destructive"})}finally{we(null)}},us=async()=>{if(o){ye(!0);try{const a=await B({action:"update_evaluation",id:o.id,reviewerRating:Se,issueTags:Ce,reviewerNotes:Re,goldenDataset:Te,eligibleForTraining:Le});T(l=>l&&{...l,...a.log}),t(l=>l.map(h=>h.id===o.id?{...h,...a.log}:h)),s({title:"Evaluation saved"})}catch(a){s({title:"Save failed",description:a.message,variant:"destructive"})}finally{ye(!1)}}},hs=async()=>{if(!(!o||!window.confirm("Delete this AI log and its screenshot?")))try{await B({action:"delete_one",id:o.id}),t(l=>l.filter(h=>h.id!==o.id)),T(null),c(l=>Math.max(0,l-1)),s({title:"Log deleted"})}catch(l){s({title:"Delete failed",description:l.message,variant:"destructive"})}},js=async()=>{try{const a=await B({action:"delete_all"});t(l=>l.filter(h=>h.log_source==="mentor")),T(null),c(l=>Math.max(0,l-a.deleted)),oe(!1),_e(""),s({title:"Analysis logs deleted",description:`${a.deleted} analysis rows and ${a.screenshotsRemoved} screenshots removed. Mentor conversations were preserved.`}),R===0?await ie():O(0)}catch(a){s({title:"Delete failed",description:a.message,variant:"destructive"})}},ps=(a,l)=>{Ae(h=>l?[...new Set([...h,a])]:h.filter(vs=>vs!==a))},fs=async a=>{await navigator.clipboard.writeText(a),s({title:"Request id copied"})};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-2xl font-bold",children:"AI Logs"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Inspect screenshots, AI inputs, raw outputs, model quality, and dataset candidates."})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs(_,{variant:"outline",size:"sm",onClick:ie,disabled:n,children:[n?e.jsx(J,{className:"mr-1.5 h-3.5 w-3.5"}):e.jsx(Qe,{className:"mr-1.5 h-3.5 w-3.5"}),"Refresh"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>Me("csv"),disabled:!!le,children:[le==="csv"?e.jsx(J,{className:"mr-1.5 h-3.5 w-3.5"}):e.jsx(Ke,{className:"mr-1.5 h-3.5 w-3.5"}),"CSV"]}),e.jsxs(_,{variant:"outline",size:"sm",onClick:()=>Me("json"),disabled:!!le,children:[le==="json"?e.jsx(J,{className:"mr-1.5 h-3.5 w-3.5"}):e.jsx(he,{className:"mr-1.5 h-3.5 w-3.5"}),"JSON"]}),e.jsxs(_,{variant:"destructive",size:"sm",onClick:()=>oe(!0),children:[e.jsx(Ye,{className:"mr-1.5 h-3.5 w-3.5"}),"Delete analysis logs"]})]})]}),e.jsxs("div",{className:"grid gap-3 md:grid-cols-4",children:[e.jsx(v,{children:e.jsxs(b,{className:"pt-4",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(Ze,{className:"h-4 w-4 text-blue-500"}),"Visible logs"]}),e.jsx("p",{className:"text-2xl font-bold",children:ne.totalVisible})]})}),e.jsx(v,{children:e.jsxs(b,{className:"pt-4",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(Ds,{className:"h-4 w-4 text-red-500"}),"Errors"]}),e.jsx("p",{className:"text-2xl font-bold",children:ne.errors})]})}),e.jsx(v,{children:e.jsxs(b,{className:"pt-4",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(Xe,{className:"h-4 w-4 text-emerald-500"}),"Reviewed"]}),e.jsx("p",{className:"text-2xl font-bold",children:ne.reviewed})]})}),e.jsx(v,{children:e.jsxs(b,{className:"pt-4",children:[e.jsxs("div",{className:"mb-2 flex items-center gap-2 text-xs text-muted-foreground",children:[e.jsx(he,{className:"h-4 w-4 text-violet-500"}),"Training-ready"]}),e.jsx("p",{className:"text-2xl font-bold",children:ne.training})]})})]}),e.jsx(ra,{stats:m}),e.jsxs(v,{children:[e.jsxs(k,{children:[e.jsx(C,{children:"Quality Queue"}),e.jsx(L,{children:"Open a row to inspect screenshot, AI input/output, and mark dataset quality."})]}),e.jsxs(b,{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("div",{className:"relative min-w-64 flex-1",children:[e.jsx(Ls,{className:"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"}),e.jsx(re,{value:j,onChange:a=>S(a.target.value),placeholder:"Search symbol, model, request id, or user...",className:"pl-9"})]}),e.jsxs(U,{value:g,onValueChange:A,children:[e.jsx($,{className:"w-24",children:e.jsx(G,{})}),e.jsx(V,{children:Ks.map(a=>e.jsx(f,{value:a.value,children:a.label},a.value))})]}
1),e.jsxs(U,{value:I,onValueChange:d,children:[e.jsx($,{className:"w-32",children:e.jsx(G,{})}),e.jsxs(V,{children:[e.jsx(f,{value:"all",children:"All status"}),e.jsx(f,{value:"success",children:"Success"}),e.jsx(f,{value:"error",children:"Error"})]})]}),e.jsxs(U,{value:w,onValueChange:H,children:[e.jsx($,{className:"w-40",children:e.jsx(G,{})}),e.jsxs(V,{children:[e.jsx(f,{value:"all",children:"All ratings"}),e.jsx(f,{value:"unreviewed",children:"Unreviewed"}),e.jsx(f,{value:"good",children:"Good"}),e.jsx(f,{value:"acceptable",children:"Acceptable"}),e.jsx(f,{value:"bad",children:"Bad"})]})]}),e.jsxs("label",{className:"flex h-10 items-center gap-2 rounded-md border border-border px-3 text-sm",children:[e.jsx(te,{checked:F,onCheckedChange:a=>W(a===!0)}),"Training"]}),e.jsxs("label",{className:"flex h-10 items-center gap-2 rounded-md border border-border px-3 text-sm",children:[e.jsx(te,{checked:P,onCheckedChange:a=>z(a===!0)}),"Golden"]})]}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs(je,{children:[e.jsx(pe,{children:e.jsxs(M,{children:[e.jsx(p,{children:"Time"}),e.jsx(p,{children:"User"}),e.jsx(p,{children:"Chart"}),e.jsx(p,{children:"Mode"}),e.jsx(p,{children:"Outcome"}),e.jsx(p,{children:"Model"}),e.jsx(p,{children:"Status"}),e.jsx(p,{children:"Jev"}),e.jsx(p,{children:"Rating"}),e.jsx(p,{children:"Dataset"}),e.jsx(p,{className:"text-right",children:"Open"})]})}),e.jsx(fe,{children:n?e.jsx(M,{children:e.jsxs(x,{colSpan:11,className:"py-8 text-center text-muted-foreground",children:[e.jsx(J,{className:"mx-auto mb-2 h-5 w-5"}),"Loading AI logs"]})}):r.length===0?e.jsx(M,{children:e.jsx(x,{colSpan:11,className:"py-8 text-center text-muted-foreground",children:"No AI logs match these filters."})}):r.map(a=>e.jsxs(M,{className:"cursor-pointer",onClick:()=>Oe(a),children:[e.jsx(x,{className:"whitespace-nowrap text-xs",children:ts(a.created_at)}),e.jsxs(x,{className:"max-w-48 truncate",children:[e.jsx("div",{className:"text-sm",children:a.user_email||a.user_id}),e.jsxs("div",{className:"text-xs text-muted-foreground flex items-center gap-1",children:[e.jsx("span",{children:a.plan_tier||"-"}),a.billing_plan_tier&&a.billing_plan_tier!==a.plan_tier?e.jsxs("span",{className:"text-[10px]",children:["(billing: ",a.billing_plan_tier,")"]}):null]})]}),e.jsxs(x,{children:[e.jsx("div",{className:"font-medium",children:a.symbol||"UNKNOWN"}),e.jsx("div",{className:"text-xs text-muted-foreground",children:a.timeframe||"N/A"})]}),e.jsxs(x,{children:[e.jsx("div",{className:"text-sm",children:a.interaction_type||"-"}),e.jsx("div",{className:"text-xs text-muted-foreground",children:Xs(a)})]}),e.jsx(x,{children:(()=>{const l=a.scan_summary;if(!l||!l.outcome)return e.jsx("span",{className:"text-xs text-muted-foreground",children:"â"});if(l.outcome==="SIGNAL"){const h=l.direction||"";return e.jsxs(u,{variant:"default",title:l.entry?`Entry ${l.entry}`:void 0,children:["Signal",h?` · ${h}`:""]})}return l.outcome==="WATCH_TRIGGER"?e.jsx(u,{variant:"secondary",title:l.alertLevel?`Alert ${l.alertLevel}`:void 0,children:"Alert"}):e.jsx(u,{variant:"outline",children:"No trigger"})})()}),e.jsxs(x,{className:"max-w-56",children:[e.jsx("div",{className:"truncate text-sm",children:a.model||"-"}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:[a.provider||"-"," · ",a.duration_ms??"-"," ms"]})]}),e.jsx(x,{children:e.jsx(u,{variant:a.status==="success"?"default":a.status==="pending"?"secondary":"destructive",children:a.status})}),e.jsx(x,{children:a.log_source==="mentor"?e.jsx(u,{variant:as(a.jev_verification?.status),children:rs(a.jev_verification?.status)}):e.jsx("span",{className:"text-xs text-muted-foreground",children:"â"})}),e.jsx(x,{children:a.log_source==="mentor"?e.jsx(u,{variant:"outline",children:"mentor"}):e.jsx(u,{variant:ls(a.reviewer_rating),children:a.reviewer_rating||"unreviewed"})}),e.jsx(x,{children:e.jsxs("div",{className:"flex flex-wrap gap-1",children:[a.golden_dataset&&e.jsx(u,{variant:"secondary",children:"golden"}),a.eligible_for_training&&e.jsx(u,{variant:"outline",children:"training"})]})}),e.jsx(x,{className:"text-right",children:e.jsx(_,{variant:"ghost",size:"sm",onClick:l=>{l.stopPropagation(),Oe(a)},children:e.jsx(Is,{className:"h-4 w-4"})})})]},a.id))})]})}),e.jsxs("div",{className:"flex items-center justify-between text-sm text-muted-foreground",children:[e.jsxs("span",{children:[Q," total logs"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(_,{variant:"outline",size:"sm",disabled:R===0||n,onClick:()=>O(a=>Math.max(0,a-se)),children:"Previous"}),e.jsx("span",{children:Math.floor(R/se)+1}),e.jsx(_,{variant:"outline",size:"sm",disabled:R+se>=Q||n,onClick:()=>O(a=>a+se),children:"Next"})]})]})]})]}
1),e.jsx(aa,{selected:o,setSelected:T,detailLoading:ds,selectedMarketContext:xs,reviewRating:Se,setReviewRating:ke,reviewTags:Ce,reviewNotes:Re,setReviewNotes:Ee,goldenDataset:Te,setGoldenDataset:De,eligibleForTraining:Le,setEligibleForTraining:Ie,savingReview:cs,deleteAllOpen:os,setDeleteAllOpen:oe,deleteConfirm:ms,setDeleteConfirm:_e,copyRequestId:fs,toggleTag:ps,saveEvaluation:us,deleteOne:hs,deleteAll:js})]})}function Na(){const[s,r]=i.useState("routing");return e.jsx("div",{className:"space-y-6",children:e.jsxs(gs,{value:s,onValueChange:r,children:[e.jsxs(bs,{children:[e.jsxs(me,{value:"routing",className:"gap-2",children:[e.jsx(He,{className:"h-4 w-4"}),"AI Routing & Quota"]}),e.jsxs(me,{value:"health",className:"gap-2",children:[e.jsx(Os,{className:"h-4 w-4"}),"System Health"]}),e.jsxs(me,{value:"logs",className:"gap-2",children:[e.jsx(Ze,{className:"h-4 w-4"}),"AI Execution Logs"]})]}),e.jsx(xe,{value:"routing",className:"pt-4",children:e.jsx(Js,{})}),e.jsx(xe,{value:"health",className:"space-y-8 pt-4",children:e.jsx(Ws,{})}),e.jsx(xe,{value:"logs",className:"pt-4",children:e.jsx(ta,{})})]})})}export{Na as AdminAiOperations};
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.