import{aN as he,bX as Ll,bp as nl,bs as i,aE as x,c8 as t,aG as V,bL as u,aF as K,c9 as ee,b$ as Ie,aa as Tl,aK as l,ab as El,aD as n,ad as Ke,aJ as s,r as Pe,bS as $,c4 as et,aP as lt,R as Ml,bI as $e,bD as me,bC as m,ay as te,X as W,Y as tt,t as ol,ak as ke,bo as at,N as nt,G as ot,O as st,S as it,E as sl,x as ut,ai as X,bE as oe,y as dt,v as Nl,u as il,c0 as tl,e as rt,bK as Je,b4 as de,c7 as we,br as ct,Q as mt,aQ as Ye,ac as ul,a9 as dl,a8 as vt,a4 as pt,Z as ft,c5 as Ze,aM as gt,ap as _t,p as bt,q as yt,bk as wt,bH as ht,aZ as kt,a_ as Fe,bR as Qe,aR as kl,L as Ct,ca as xt,F as $t,B as Vt,C as zt,aB as St,H as Lt,a1 as Tt,a0 as Et,bj as Cl,s as Mt,at as Nt,bA as xl,bW as Ut}from"./index-D5GfLbIx.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{w as Xe}from"./workspaceToolbar-abOZ7a24.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{n as $l,C as At,c as Rt,s as Vl,d as Dt,l as Bt}from"./ConfigPageBase-CgfsngDp.js";import{r as al,b as zl,e as Ot}from"./reflection-BwOBPyb9.js";import{f as Ft}from"./monitorConfigCache-DXn96T8F.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{P as Ul}from"./PermissionGuard-CR4qtxrh.js";import{er as It,cf as Kt,ce as Pt,cg as Gt,ch as Wt,ci as jt,cj as Ht,cd as qt,c9 as el}from"./install-D_iTbSFG.js";/* empty css *//* empty css */const Jt={class:"pb-header"},Yt={class:"pb-title"},Zt={class:"pb-actions"},Qt={key:0,class:"pb-dir"},Xt={class:"pb-name"},ea={class:"pb-name-text"},la={key:0,class:"pb-filename"},ta=he({__name:"PlaybackView",setup(w){const y=Ll(),f=m(!1),U=m(!1),S=m([]),b=m(""),E=m(!1),D=m(""),F=te(()=>{const v=D.value.trim().toLowerCase();return v?S.value.filter(r=>(r.displayName||"").toLowerCase().includes(v)||r.fileName.toLowerCase().includes(v)||(r.note||"").toLowerCase().includes(v)):S.value});function B(v){return v.displayName&&v.displayName.trim()?v.displayName.trim():v.fileName}function P(v){if(!v)return"-";const r=new Date(v);return Number.isNaN(r.getTime())?v:r.toLocaleString()}function Y(v){if(!v||v<0)return"-";const r=Math.round(v/1e3),j=Math.floor(r/3600),A=Math.floor(r%3600/60),h=r%60,c=d=>String(d).padStart(2,"0");return j>0?`${c(j)}:${c(A)}:${c(h)}`:`${c(A)}:${c(h)}`}function I(v){if(!v||v<0)return"-";if(v<1024)return`${v} B`;const r=v/1024;return r<1024?`${r<10?r.toFixed(1):r.toFixed(0)} KB`:`${(r/1024).toFixed(1)} MB`}async function g(){f.value=!0;try{const v=await Xe.getState();S.value=v.recording?.entries??[],b.value=v.recording?.recordingsDirectory??"",E.value=!!v.recording?.isPlaying}catch(v){S.value=[],W.error({message:v.message||"加载录像列表失败",grouping:!0})}finally{f.value=!1}}function _(v){y.push({path:"/admin/map-monitor",query:{playback:v.fileName}})}async function M(v){try{await tt.confirm(`确认删除录像「${B(v)}」?此操作不可恢复。`,"删除录像",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"}),await Xe.deleteRecording(v.fileName),W.success("已删除"),await g()}catch(r){if(r==="cancel"||r==="close")return;W.error(`删除失败:${r.message}`)}}async function Z(){U.value=!0;try{await Xe.stopPlayback(),W.success("已停止回放"),await g()}catch(v){W.error(`停止回放失败:${v.message}`)}finally{U.value=!1}}return nl(g),(v,r)=>{const j=Ke,A=Ml,h=Pe,c=El,d=Tl,p=ol,R=Ie;return i(),x(p,{shadow:"never",class:"playback-card"},{header:t(()=>[n("div",Jt,[n("div",Yt,[r[2]||(r[2]=n("span",null,"调度回放",-1)),E.value?(i(),x(j,{key:0,type:"success",size:"small",effect:"dark",class:"pb-playing"},{default:t(()=>[...r[1]||(r[1]=[s("回放中",-1)])]),_:1})):K("",!0)]),n("div",Zt,[l(A,{modelValue:D.value,"onUpdate:modelValue":r[0]||(r[0]=k=>D.value=k),"prefix-icon":$($e),placeholder:"按名称 / 文件名 / 备注检索",clearable:"",size:"small",class:"pb-search"},null,8,["modelValue","prefix-icon"]),E.value?(i(),x(h,{key:0,size:"small",type:"warning",plain:"",loading:U.value,onClick:Z},{default:t(()=>[...r[3]||(r[3]=[s(" 停止回放 ",-1)])]),_:1},8,["loading"])):K("",!0),l(h,{size:"small",icon:$(me),loading:f.value,onClick:g},{default:t(()=>[...r[4]||(r[4]=[s("刷新",-1)])]),_:1},8,["icon","loading"])])])]),default:t(()=>[b.value?(i(),V("p",Qt,"录像目录:"+u(b.value),1)):K("",!0),ee((i(),x(d,{data:F.value,stripe:"","empty-text":"暂无录像。在地图监控画布底栏「录制」后即可在此管理回放。"},{default:t(()=>[l(c,{label:"名称","min-width":"220"},{default:t(({row:k})=>[n("div",Xt,[n("span",ea,u(B(k)),1),k.headerReadable?K("",!0):(i(),x(j,{key:0,type:"danger",size:"small",effect:"plain"},{default:t(()=>[...r[5]||(r[5]=[s("头部不可读",-1)])]),_:1}))]),k.displayName&&k.displayName.trim()?(i(),V("div",la,u(k.fileName),1)):K("",!0)]),_:1}),l(c,{label:"录制时间",width:"180"},{default:t(({row:k})=>[s(u(P(k.fileWriteTime)),1)]),_:1}),l(c,{label:"时长",width:"110",align:"right"},{default:t(({row:k})=>[s(u(Y(k.durationMs)),1)]),_:1}),l(c,{label:"帧数",width:"90",align:"right"},{default:t(({row:k})=>[s(u(k.frameCount||"-"),1)]),_:1}),l(c,{label:"大小",width:"100",align:"right"},{default:t(({row:k})=>[s(u(I(k.fileSizeBytes)),1)]),_:1}),l(c,{prop:"note",label:"备注","min-width":"140","show-overflow-tooltip":""}),l(c,{label:"操作",width:"220",fixed:"right"},{default:t(({row:k})=>[l(h,{text:"",size:"small",type:"primary",icon:$(et),disabled:!k.headerReadable,onClick:H=>_(k)},{default:t(()=>[...r[6]||(r[6]=[s(" 查看 ",-1)])]),_:1},8,["icon","disabled","onClick"]),l(h,{text:"",size:"small",type:"danger",icon:$(lt),onClick:H=>M(k)},{default:t(()=>[...r[7]||(r[7]=[s("删除",-1)])]),_:1},8,["icon","onClick"])]),_:1})]),_:1},8,["data"])),[[R,f.value]])]),_:1})}}}),aa=ke(ta,[["__scopeId","data-v-49ba457d"]]);function na(w,y,f){if(!w)return[];const U=w[y]??w[f];if(U?.length)return[...U];for(const[S,b]of Object.entries(w))if(b?.length){if(S===y||S===f)return[...b];if(y.endsWith("."+S)||S.endsWith("."+f))return[...b];if(y.endsWith("."+f)&&(S===f||S.endsWith("."+f)))return[...b]}return[]}const oa={class:"monitor-section"},sa={key:0,class:"muted empty-hint"},Sl="simple-platform-methods-by-type-car-v1",ia=500,ua=he({__name:"OpsConfigView",setup(w){const y=Je([]),f=Je([]),U=Je([]),S=m(!1),b=m(!1),E=m([]),D=m(null),F=m(!1);let B=null,P=null;function Y(c){P=c,B&&clearTimeout(B),B=setTimeout(()=>{I()},ia)}async function I(){if(B=null,F.value){B=setTimeout(()=>{I()},200);return}const c=P;if(P=null,!!c){F.value=!0;try{const d=await Vl(c,{cachedRoot:D.value});D.value=d,W.success({message:"地图监控配置已自动保存",duration:1200,grouping:!0})}catch(d){W.error(`地图监控配置自动保存失败:${d instanceof Error?d.message:String(d)}`)}finally{F.value=!1,P&&Y(P)}}}at(()=>{B&&(clearTimeout(B),B=null),P&&!F.value&&I()});async function g(c,d){S.value=!0,b.value=!0;try{const p=await Ft(),[{config:R,cache:k},H]=await Promise.all([Bt(c,p),M()]);D.value=k,f.value=Z(p.available.site.methods),U.value=Z(p.available.track.methods),d(R)}catch{d($l(c)),f.value=[],U.value=[],await M()}finally{S.value=!1,b.value=!1}}async function _(c){D.value=await Vl(c,{cachedRoot:D.value})}async function M(){try{const c=sessionStorage.getItem(Sl);if(c){const d=JSON.parse(c);if(Array.isArray(d)&&d.length){y.value=d;return}}}catch{}try{const d=(await al.listMethodsByType("car")).map(p=>({typeKey:p.fullTypeName??p.typeName,shortTypeName:p.typeName,title:`${p.typeLabel??p.typeName} / ${p.fullTypeName??p.typeName} [${p.assemblyName}]`,methods:p.methods.map(R=>({methodName:R.methodName,label:R.label||R.methodName})).filter(R=>!!R.methodName)})).filter(p=>p.methods.length>0).sort((p,R)=>p.title.localeCompare(R.title));y.value=d;try{sessionStorage.setItem(Sl,JSON.stringify(d))}catch{}}catch{y.value=[]}}function Z(c){return c?.length?c.map(d=>({methodName:d,label:d})):[]}function v(c){return c.monitor??Dt()}function r(c,d){const p=v(c).carActionByType;return na(p,d.typeKey,d.shortTypeName)}function j(c,d){const p=r(c,d).slice().sort().join("\0");return`${d.typeKey}\0${p}`}function A(c,d,p,R,k){const H=v(d),le={...d,monitor:{...H,[p]:{...H[p],[R]:[...k]}}};c(le),Y(le)}function h(c,d,p,R){const k=v(d),H=Rt(k.carActionByType);H[p.typeKey]=[...R],p.shortTypeName!==p.typeKey&&delete H[p.shortTypeName];const le={...d,monitor:{...k,carActionByType:H}};c(le),Y(le)}return(c,d)=>{const p=ot,R=it,k=st,H=sl,le=il,ve=Nl,se=dt,Ve=ut,ze=nt,Se=Ie;return i(),x(At,{section:"ops",title:"运营维护",description:"调度回放、日志管理、版本维护(OpsConfig)",defaults:$(rt),"normalize-payload":$($l),"after-load":g,"before-save":_},{default:t(({payload:O,update:J})=>[l(ze,{"label-width":"200px",model:O},{default:t(()=>[l(p,{"content-position":"left"},{default:t(()=>[...d[1]||(d[1]=[s("调度回放",-1)])]),_:1}),l(k,{label:"保留时长 (天)"},{default:t(()=>[l(R,{"model-value":O.playback.retentionDays,min:1,max:3650,"onUpdate:modelValue":C=>J({...O,playback:{...O.playback,retentionDays:C??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(k,{label:"采样频率 (Hz)"},{default:t(()=>[l(R,{"model-value":O.playback.samplingHz,min:1,max:100,"onUpdate:modelValue":C=>J({...O,playback:{...O.playback,samplingHz:C??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(p,{"content-position":"left"},{default:t(()=>[...d[2]||(d[2]=[s("日志保留",-1)])]),_:1}),l(k,{label:"热数据 (天)"},{default:t(()=>[l(R,{"model-value":O.logRetention.hotDays,min:1,max:365,"onUpdate:modelValue":C=>J({...O,logRetention:{...O.logRetention,hotDays:C??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(k,{label:"冷数据 (天)"},{default:t(()=>[l(R,{"model-value":O.logRetention.coldDays,min:1,max:3650,"onUpdate:modelValue":C=>J({...O,logRetention:{...O.logRetention,coldDays:C??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(p,{"content-position":"left"},{default:t(()=>[...d[3]||(d[3]=[s("版本维护",-1)])]),_:1}),l(k,{label:"保留发布版本"},{default:t(()=>[l(R,{"model-value":O.version.keepReleases,min:1,max:100,"onUpdate:modelValue":C=>J({...O,version:{keepReleases:C??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(p,{"content-position":"left"},{default:t(()=>[...d[4]||(d[4]=[s("地图监控信息与动作管理",-1)])]),_:1}),ee((i(),V("div",oa,[l(H,{type:"info",closable:!1,"show-icon":"",title:F.value?"正在自动保存…":"支持直接多选,修改后会自动保存到地图监控(simple.json),无需点击上方「保存」。若某组不勾选,表示该组在地图监控中显示全部。",style:{"margin-bottom":"10px"}},null,8,["title"]),ee((i(),x(k,{label:"按车型动作配置"},{default:t(()=>[l(Ve,{modelValue:E.value,"onUpdate:modelValue":d[0]||(d[0]=C=>E.value=C),class:"type-actions"},{default:t(()=>[(i(!0),V(X,null,oe(y.value,C=>(i(),x(se,{key:C.typeKey,name:C.typeKey,title:`${C.title}(${C.methods.length})`},{default:t(()=>[ee(n("div",null,[(i(),x(ve,{key:j(O,C),"model-value":r(O,C),class:"cfg-check-grid","onUpdate:modelValue":ae=>h(J,O,C,ae)},{default:t(()=>[(i(!0),V(X,null,oe(C.methods,ae=>(i(),x(le,{key:`${C.typeKey}-${ae.methodName}`,label:ae.methodName},{default:t(()=>[s(u(ae.label),1)]),_:2},1032,["label"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue"]))],512),[[tl,E.value.includes(C.typeKey)]])]),_:2},1032,["name","title"]))),128))]),_:2},1032,["modelValue"]),!S.value&&!b.value&&!y.value.length?(i(),V("p",sa," 暂未扫描到带 MethodMember 的车型(请确认 SimpleLite 已连接并已加载插件)。 ")):K("",!0)]),_:2},1024)),[[Se,b.value]]),l(k,{label:"站点动作显示项"},{default:t(()=>[l(ve,{"model-value":O.monitor?.site?.actionKeys??[],class:"cfg-check-grid","onUpdate:modelValue":C=>A(J,O,"site","actionKeys",C)},{default:t(()=>[(i(!0),V(X,null,oe(f.value,C=>(i(),x(le,{key:`sa-${C.methodName}`,label:C.methodName},{default:t(()=>[s(u(C.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(k,{label:"路径动作显示项"},{default:t(()=>[l(ve,{"model-value":O.monitor?.track?.actionKeys??[],class:"cfg-check-grid","onUpdate:modelValue":C=>A(J,O,"track","actionKeys",C)},{default:t(()=>[(i(!0),V(X,null,oe(U.value,C=>(i(),x(le,{key:`ta-${C.methodName}`,label:C.methodName},{default:t(()=>[s(u(C.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024)])),[[Se,S.value]])]),_:2},1032,["model"])]),_:1},8,["defaults","normalize-payload"])}}}),da=ke(ua,[["__scopeId","data-v-bf134df3"]]),ra="/api",ca="/sl/projection/diagnosis",ce={overview:()=>de.get("/logs/overview").then(w=>w.data),files:w=>de.get("/logs/files",{params:w}).then(y=>y.data),entries:w=>de.get("/logs/entries",{params:w}).then(y=>y.data),digest:w=>de.get("/logs/digest",{params:w}).then(y=>y.data),liveDiagnosis:()=>de.get(`${ca}/all`).then(w=>{if(!w.data?.success||!w.data.data)throw new Error(w.data?.message??"获取实时诊断失败");return w.data.data}),browse:w=>de.get("/logs/browse",{params:w?{path:w}:void 0}).then(y=>y.data),analyze:w=>de.get("/logs/analyze",{params:w}).then(y=>y.data),raw:(w,y=2e3)=>de.get("/logs/raw",{params:{file:w,tail:y},responseType:"text"}).then(f=>f.data),downloadUrl:w=>`${ra}/logs/download?file=${encodeURIComponent(w)}`},ma={class:"logview"},va={class:"ov-head"},pa={class:"ov-title"},fa={key:0,class:"ov-stats"},ga={class:"ov-stat"},_a=["title"],ba={class:"ov-stat"},ya={class:"v"},wa={class:"ov-stat"},ha={class:"v"},ka={class:"ov-stat"},Ca={class:"v"},xa={class:"toolbar"},$a={key:0,class:"muted"},Va={key:0},za={key:1,class:"muted"},Sa={class:"mono"},La={class:"muted"},Ta={class:"toolbar"},Ea=["onClick"],Ma={key:0,class:"muted"},Na={class:"mono"},Ua={key:0,class:"muted"},Aa={key:0,class:"analyze-empty"},Ra={class:"toolbar"},Da={class:"mono"},Ba={key:1,class:"an-stats"},Oa={class:"ov-stat"},Fa={class:"v"},Ia={class:"ov-stat"},Ka={class:"v"},Pa={class:"ov-stat"},Ga={class:"v"},Wa={class:"ov-stat"},ja={class:"v"},Ha={class:"an-grid"},qa={class:"an-fields-body"},Ja={class:"mono"},Ya={class:"an-field-chart-wrap"},Za={class:"an-field-hint muted"},Qa={key:1,class:"muted"},Xa={class:"detail-content"},en={class:"detail-bar"},ln={class:"detail-pre"},tn={class:"file-bar"},an={key:2,class:"muted"},nn={key:3,class:"muted"},on={key:1,class:"muted"},sn={class:"mono"},un={key:2,class:"raw-pre"},dn=he({__name:"LogManagementView",setup(w){It([Kt,Pt,Gt,Wt,jt,Ht,qt]);const y=m("live"),f=m(null),U=m(!1),S=m(null),b=m(!1),E=m(!0),D=m(""),F=m(!0),B=m(2),P=m(""),Y=m(!1);let I;const g=m(null),_=m(!1),M=m(""),Z=m(""),v=m(!1),r=m(null),j=m(!1),A=m(""),h=m("structured"),c=m(!1),d=m(null),p=m(""),R=m(3e3),k=m(""),H=m(!1),le=te(()=>p.value?p.value.split(` `).length:0);function ve(o){return o?o<1024?`${o} B`:o<1024*1024?`${(o/1024).toFixed(1)} KB`:`${(o/1024/1024).toFixed(2)} MB`:"0 B"}function se(o){const e=new Date(o);return Number.isNaN(e.getTime())?o:e.toLocaleString("zh-CN",{hour12:!1})}function Ve(o){const e=new Date(o);return Number.isNaN(e.getTime())?o:e.toLocaleTimeString("zh-CN",{hour12:!1})+"."+String(e.getMilliseconds()).padStart(3,"0")}function ze(o){const e=new Date(o).getTime();return Number.isNaN(e)?0:e}const Se=te(()=>{let o=S.value?.items??[];Y.value&&(o=o.filter(z=>z.tagged));const e=P.value.trim().toLowerCase();return e&&(o=o.filter(z=>z.content.toLowerCase().includes(e)||z.tag.toLowerCase().includes(e))),[...o].sort((z,N)=>ze(N.time)-ze(z.time))});function O({row:o}){return o.tagged?"tagged-row":""}async function J(){b.value=!0;try{S.value=await ce.liveDiagnosis(),D.value=""}catch(o){D.value=`实时诊断不可用:${o.message}`}finally{b.value=!1,E.value=!1}}function C(){ae(),F.value&&y.value==="live"&&(I=window.setInterval(J,B.value*1e3))}function ae(){I&&(window.clearInterval(I),I=void 0)}we([F,B],C),we(y,o=>{o==="live"?(J(),C()):ae(),o==="analyze"&&Cl(fl)});const Al=te(()=>{const o=M.value?M.value.split("/"):[],e=[{label:"log",path:""}];let z="";for(const N of o)z=z?`${z}/${N}`:N,e.push({label:N,path:z});return e}),Rl=te(()=>{const o=g.value;if(!o)return[];const e=o.dirs.map(T=>({kind:"dir",name:T.name,rel:T.rel,mtime:T.mtime,bytes:0,fileCount:T.fileCount,isLog:!1,ext:""})),z=o.files.map(T=>({kind:"file",name:T.name,rel:T.rel,mtime:T.mtime,bytes:T.bytes,fileCount:0,isLog:T.isLog,ext:T.name.includes(".")?T.name.slice(T.name.lastIndexOf(".")):""}));let N=[...e,...z];const L=Z.value.trim().toLowerCase();return L&&(N=N.filter(T=>T.name.toLowerCase().includes(L))),N});async function Le(){_.value=!0;try{g.value=await ce.browse(M.value||void 0),M.value=g.value.path}catch(o){W.error(`浏览目录失败:${o.message}`)}finally{_.value=!1}}function Te(o){M.value=o,Le()}function Dl(o){o.kind==="dir"?Te(o.rel):rl(o.rel)}function rl(o){A.value=o,j.value=!0,k.value="",H.value=!1,d.value=null,p.value="",h.value=o.toLowerCase().endsWith(".log")?"structured":"raw",Ee()}async function Ee(){c.value=!0;try{h.value==="structured"?d.value=await ce.entries({file:A.value,order:"desc",limit:1e3}):p.value=await ce.raw(A.value,R.value)}catch(o){h.value==="raw"?p.value=`读取失败:${o.message}`:W.error(`解析失败:${o.message}`)}finally{c.value=!1}}function Bl(){(h.value==="structured"&&!d.value||h.value==="raw"&&!p.value)&&Ee()}function cl(){h.value==="structured"?d.value=null:p.value="",Ee()}const ml=te(()=>{let o=d.value?.entries??[];H.value&&(o=o.filter(z=>z.tag));const e=k.value.trim().toLowerCase();return e&&(o=o.filter(z=>z.content.toLowerCase().includes(e)||z.tag.toLowerCase().includes(e))),o}),pe=m(""),Me=m(!1),Q=m(null),Ne=m("minute"),Ce=m(""),ne=m(""),Ue=m(""),Ge=m(null),We=m(null),je=m(null);let fe=null,ge=null,_e=null;const Ae=["#7c3aed","#3b82f6","#22c55e","#f59e0b","#ef4444","#06b6d4","#ec4899","#84cc16"];function ie(o,e){return typeof window>"u"?e:getComputedStyle(document.documentElement).getPropertyValue(o).trim()||e}function He(o){return o===""?"(滚动记录)":o}const Ol=te(()=>{const o=Q.value?.timeRange;return!o?.start||!o?.end?"—":`${se(o.start)} ~ ${se(o.end)}`});async function Re(){if(pe.value){Me.value=!0;try{Q.value=await ce.analyze({file:pe.value,granularity:Ne.value,tag:Ce.value||void 0,field:ne.value||void 0,keyword:Ue.value.trim()||void 0})}catch(o){W.error(`分析失败:${o.message}`)}finally{Me.value=!1}}}function vl(o){j.value=!1,pe.value=o,Ce.value="",ne.value="",Ue.value="",y.value="analyze",Re()}function Fl(o){ne.value=ne.value===o?"":o}function pl(){y.value="files"}we([Ne,Ce,ne],()=>{pe.value&&Re()});function Il(){if(!Ge.value)return;const o=Q.value;fe?.dispose(),fe=el(Ge.value,void 0,{renderer:"canvas"});const e=ie("--mg-text-muted","#909399"),z=ie("--mg-divider","rgba(255,255,255,0.08)"),N=(o?.tags??[]).slice(0,12).slice().reverse();fe.setOption({backgroundColor:"transparent",grid:{left:8,right:28,top:10,bottom:6,containLabel:!0},tooltip:{trigger:"axis",axisPointer:{type:"shadow"},formatter:L=>{const T=L[0];return`${T.name}: ${T.value} 条`}},xAxis:{type:"value",axisLine:{show:!1},axisLabel:{color:e,fontSize:11},splitLine:{lineStyle:{color:z,type:"dashed"}}},yAxis:{type:"category",data:N.map(L=>He(L.tag)),axisLine:{lineStyle:{color:z}},axisLabel:{color:e,fontSize:11}},series:[{type:"bar",barMaxWidth:16,data:N.map((L,T)=>({value:L.count,itemStyle:{color:Ae[(N.length-1-T)%Ae.length],borderRadius:[0,3,3,0]}})),label:{show:!0,position:"right",color:e,fontSize:11}}]})}function Kl(){if(!We.value)return;const o=Q.value;ge?.dispose(),ge=el(We.value,void 0,{renderer:"canvas"});const e=ie("--mg-text-muted","#909399"),z=ie("--mg-divider","rgba(255,255,255,0.08)"),N=(o?.volume.buckets??[]).map(ue=>new Date(ue).getTime()),T=(o?.volume.topTags??[]).map((ue,q)=>({name:He(ue.tag),type:"bar",stack:"vol",barMaxWidth:18,data:N.map((be,ye)=>[be,ue.counts[ye]]),itemStyle:{color:Ae[q%Ae.length]}}));T.push({name:"总量",type:"line",smooth:!0,showSymbol:!1,z:5,data:N.map((ue,q)=>[ue,o?.volume.total[q]??0]),lineStyle:{width:2,color:ie("--mg-text-light","#e5e7eb")}}),ge.setOption({backgroundColor:"transparent",grid:{left:36,right:16,top:30,bottom:28,containLabel:!0},tooltip:{trigger:"axis",axisPointer:{type:"shadow"}},legend:{top:0,textStyle:{color:e,fontSize:11},itemHeight:8,itemWidth:12},xAxis:{type:"time",axisLine:{lineStyle:{color:z}},axisLabel:{color:e,fontSize:11},splitLine:{show:!1}},yAxis:{type:"value",axisLine:{show:!1},axisLabel:{color:e,fontSize:11},splitLine:{lineStyle:{color:z,type:"dashed"}}},series:T})}function Pl(){if(!je.value)return;const o=Q.value;_e?.dispose(),_e=el(je.value,void 0,{renderer:"canvas"});const e=ie("--mg-text-muted","#909399"),z=ie("--mg-divider","rgba(255,255,255,0.08)"),N=ie("--mg-accent","#7c3aed"),L=o?.series?.points??[];_e.setOption({backgroundColor:"transparent",grid:{left:44,right:16,top:18,bottom:L.length>60?40:28,containLabel:!0},tooltip:{trigger:"axis"},dataZoom:L.length>60?[{type:"inside"},{type:"slider",height:16,bottom:4}]:[],xAxis:{type:"time",axisLine:{lineStyle:{color:z}},axisLabel:{color:e,fontSize:11},splitLine:{show:!1}},yAxis:{type:"value",scale:!0,axisLine:{show:!1},axisLabel:{color:e,fontSize:11},splitLine:{lineStyle:{color:z,type:"dashed"}}},series:[{name:o?.series?.field??"",type:"line",smooth:!0,showSymbol:L.length<80,symbolSize:4,data:L.map(T=>[new Date(T.t).getTime(),T.v]),lineStyle:{width:2,color:N},itemStyle:{color:N},areaStyle:{color:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:N+"44"},{offset:1,color:N+"00"}]}}}]})}function fl(){Il(),Kl(),Pl()}we(Q,()=>{y.value==="analyze"&&Cl(fl)});function gl(){fe?.resize(),ge?.resize(),_e?.resize()}function De(o){r.value={time:o.time,tag:o.tag,content:o.content},v.value=!0}function _l(o){const e=document.createElement("a");e.href=ce.downloadUrl(o),e.download=o.split("/").pop()??"log.log",document.body.appendChild(e),e.click(),e.remove()}async function Gl(o){try{await navigator.clipboard.writeText(o),W.success("已复制")}catch{W.warning("复制失败,请手动选择文本")}}async function bl(){U.value=!0;try{f.value=await ce.overview()}catch(o){W.error(`加载概览失败:${o.message}`)}finally{U.value=!1}}async function Wl(){await bl(),y.value==="live"?await J():await Le()}return nl(async()=>{await bl(),await J(),C(),Le(),window.addEventListener("resize",gl)}),ct(()=>{ae(),window.removeEventListener("resize",gl),fe?.dispose(),fe=null,ge?.dispose(),ge=null,_e?.dispose(),_e=null}),(o,e)=>{const z=mt,N=Ke,L=Pe,T=ol,ue=vt,q=ft,be=pt,ye=Ml,yl=il,Be=sl,G=El,Oe=Tl,qe=dl,jl=yt,Hl=bt,ql=Ct,Jl=ul,wl=zt,Yl=Vt,Zl=$t,hl=Et,Ql=Tt,Xl=Lt,xe=Ie;return i(),x(Ul,{"widget-id":"ConfigCenter"},{default:t(()=>[n("div",ma,[l(T,{shadow:"never",class:"ov-card"},{default:t(()=>[n("div",va,[n("div",pa,[l(z,null,{default:t(()=>[l($(Ye))]),_:1}),e[22]||(e[22]=n("span",null,"日志管理",-1)),l(N,{size:"small",effect:"plain",type:"info"},{default:t(()=>[...e[21]||(e[21]=[s("Diagnosis · Post / Toast / DLog",-1)])]),_:1})]),l(L,{size:"small",icon:$(me),loading:U.value,onClick:Wl},{default:t(()=>[...e[23]||(e[23]=[s("刷新",-1)])]),_:1},8,["icon","loading"])]),e[28]||(e[28]=n("p",{class:"ov-desc"},[n("b",null,"实时诊断"),s("直连 SimpleLite 内核 "),n("code",null,"Diagnosis"),s(" 的内存态 "),n("code",null,"Post"),s(" / "),n("code",null,"Toast"),s(" (有标签按标签合订、无标签滚动记录);"),n("b",null,"日志文件"),s("浏览工作目录 "),n("code",null,"log/"),s(" 下的落盘日志(DLog)。 ")],-1)),f.value?(i(),V("div",fa,[n("div",ga,[e[24]||(e[24]=n("span",{class:"k"},"日志根目录",-1)),n("span",{class:"v path",title:f.value.root??""},u(f.value.root??"—"),9,_a)]),n("div",ba,[e[25]||(e[25]=n("span",{class:"k"},"文件数",-1)),n("span",ya,u(f.value.totalFiles??0),1)]),n("div",wa,[e[26]||(e[26]=n("span",{class:"k"},"总大小",-1)),n("span",ha,u(ve(f.value.totalBytes??0)),1)]),n("div",ka,[e[27]||(e[27]=n("span",{class:"k"},"最近写入",-1)),n("span",Ca,u(f.value.latestFileTime?se(f.value.latestFileTime):"—"),1)])])):K("",!0)]),_:1}),l(T,{shadow:"never",class:"body-card","body-style":"padding: 0 14px 14px"},{default:t(()=>[l(Jl,{modelValue:y.value,"onUpdate:modelValue":e[10]||(e[10]=a=>y.value=a),class:"log-tabs"},{default:t(()=>[l(qe,{name:"live"},{label:t(()=>[l(z,null,{default:t(()=>[l($(gt))]),_:1}),e[29]||(e[29]=n("span",{class:"tab-lbl"},"实时诊断",-1))]),default:t(()=>[n("div",xa,[l(ue,{modelValue:F.value,"onUpdate:modelValue":e[0]||(e[0]=a=>F.value=a),size:"small","inline-prompt":"","active-text":"自动","inactive-text":"手动"},null,8,["modelValue"]),l(be,{modelValue:B.value,"onUpdate:modelValue":e[1]||(e[1]=a=>B.value=a),size:"small",class:"sel-interval",disabled:!F.value},{default:t(()=>[l(q,{value:1,label:"每 1 秒"}),l(q,{value:2,label:"每 2 秒"}),l(q,{value:3,label:"每 3 秒"}),l(q,{value:5,label:"每 5 秒"})]),_:1},8,["modelValue","disabled"]),l(L,{size:"small",icon:$(me),loading:b.value,onClick:J},{default:t(()=>[...e[30]||(e[30]=[s("刷新",-1)])]),_:1},8,["icon","loading"]),l(ye,{modelValue:P.value,"onUpdate:modelValue":e[2]||(e[2]=a=>P.value=a),size:"small",clearable:"",placeholder:"标签 / 内容过滤",class:"sel-kw","prefix-icon":$($e)},null,8,["modelValue","prefix-icon"]),l(yl,{modelValue:Y.value,"onUpdate:modelValue":e[3]||(e[3]=a=>Y.value=a),size:"small"},{default:t(()=>[...e[31]||(e[31]=[s("仅带标签",-1)])]),_:1},8,["modelValue"]),e[32]||(e[32]=n("div",{class:"spacer"},null,-1)),S.value?(i(),V("span",$a,[s(" 合订 "+u(S.value.taggedCount)+" · 滚动 "+u(S.value.untaggedCount)+" · 共 "+u(S.value.total)+" ",1),S.value.serverTime?(i(),V("span",Va," · 更新 "+u(Ve(S.value.serverTime)),1)):K("",!0)])):K("",!0)]),D.value?(i(),x(Be,{key:0,type:"warning",closable:!1,"show-icon":"",title:D.value,style:{margin:"0 0 10px"}},null,8,["title"])):K("",!0),ee((i(),x(Oe,{data:Se.value,size:"small","max-height":"calc(100vh - 392px)","row-class-name":O,class:"live-table",onRowDblclick:e[4]||(e[4]=a=>De(a))},{empty:t(()=>[n("span",La,u(D.value?"SimpleLite 未连接":"暂无诊断消息"),1)]),default:t(()=>[l(G,{label:"时间",width:"130"},{default:t(({row:a})=>[s(u(Ve(a.time)),1)]),_:1}),l(G,{label:"标签",width:"170"},{default:t(({row:a})=>[a.tagged?(i(),x(N,{key:0,size:"small",effect:"dark"},{default:t(()=>[s(u(a.tag),1)]),_:2},1024)):(i(),V("span",za,"— 滚动"))]),_:1}),l(G,{label:"内容","show-overflow-tooltip":""},{default:t(({row:a})=>[n("span",Sa,u(a.content),1)]),_:1}),l(G,{label:"操作",width:"70",align:"center"},{default:t(({row:a})=>[l(L,{link:"",type:"primary",icon:$(Ze),onClick:re=>De(a)},null,8,["icon","onClick"])]),_:1})]),_:1},8,["data"])),[[xe,b.value&&E.value]])]),_:1}),l(qe,{name:"files"},{label:t(()=>[l(z,null,{default:t(()=>[l($(Fe))]),_:1}),e[33]||(e[33]=n("span",{class:"tab-lbl"},"日志文件",-1))]),default:t(()=>[n("div",Ta,[l(L,{size:"small",icon:$(_t),disabled:g.value?.parent==null,onClick:e[5]||(e[5]=a=>Te(g.value?.parent??""))},{default:t(()=>[...e[34]||(e[34]=[s("上一级",-1)])]),_:1},8,["icon","disabled"]),l(Hl,{separator:"/",class:"crumbs"},{default:t(()=>[(i(!0),V(X,null,oe(Al.value,a=>(i(),x(jl,{key:a.path},{default:t(()=>[n("a",{class:"crumb",onClick:re=>Te(a.path)},u(a.label),9,Ea)]),_:2},1024))),128))]),_:1}),l(L,{size:"small",icon:$(me),loading:_.value,onClick:Le},{default:t(()=>[...e[35]||(e[35]=[s("刷新",-1)])]),_:1},8,["icon","loading"]),l(ye,{modelValue:Z.value,"onUpdate:modelValue":e[6]||(e[6]=a=>Z.value=a),size:"small",clearable:"",placeholder:"按名称过滤",class:"sel-kw","prefix-icon":$($e)},null,8,["modelValue","prefix-icon"]),e[36]||(e[36]=n("div",{class:"spacer"},null,-1)),g.value?(i(),V("span",Ma,u(g.value.dirCount)+" 个文件夹 · "+u(g.value.fileCount)+" 个文件",1)):K("",!0)]),g.value&&!g.value.exists?(i(),x(Be,{key:0,type:"info",closable:!1,"show-icon":"",title:g.value.message||"日志目录尚未生成。",style:{margin:"0 0 10px"}},null,8,["title"])):K("",!0),ee((i(),x(Oe,{data:Rl.value,size:"small","max-height":"calc(100vh - 392px)",class:"files-table",onRowDblclick:Dl},{empty:t(()=>[...e[41]||(e[41]=[n("span",{class:"muted"},"该目录为空",-1)])]),default:t(()=>[l(G,{label:"名称","min-width":"280"},{default:t(({row:a})=>[n("span",{class:wt(["name-cell",{"is-dir":a.kind==="dir"}])},[l(z,null,{default:t(()=>[(i(),x(ht(a.kind==="dir"?$(kt):$(Ye))))]),_:2},1024),n("span",Na,u(a.name),1)],2)]),_:1}),l(G,{label:"类型",width:"160"},{default:t(({row:a})=>[a.kind==="dir"?(i(),V("span",Ua,"文件夹("+u(a.fileCount)+" 文件)",1)):(i(),x(N,{key:1,size:"small",effect:"plain",type:a.isLog?"success":"info"},{default:t(()=>[s(u(a.ext||"文件"),1)]),_:2},1032,["type"]))]),_:1}),l(G,{label:"大小",width:"110",align:"right"},{default:t(({row:a})=>[s(u(a.kind==="dir"?"—":ve(a.bytes)),1)]),_:1}),l(G,{label:"修改时间",width:"180"},{default:t(({row:a})=>[s(u(se(a.mtime)),1)]),_:1}),l(G,{label:"操作",width:"240",align:"center"},{default:t(({row:a})=>[a.kind==="dir"?(i(),x(L,{key:0,link:"",type:"primary",icon:$(Fe),onClick:re=>Te(a.rel)},{default:t(()=>[...e[37]||(e[37]=[s("进入",-1)])]),_:1},8,["icon","onClick"])):(i(),V(X,{key:1},[l(L,{link:"",type:"primary",icon:$(Ze),onClick:re=>rl(a.rel)},{default:t(()=>[...e[38]||(e[38]=[s("打开",-1)])]),_:1},8,["icon","onClick"]),a.isLog?(i(),x(L,{key:0,link:"",type:"primary",icon:$(Qe),onClick:re=>vl(a.rel)},{default:t(()=>[...e[39]||(e[39]=[s("分析",-1)])]),_:1},8,["icon","onClick"])):K("",!0),l(L,{link:"",type:"primary",icon:$(kl),onClick:re=>_l(a.rel)},{default:t(()=>[...e[40]||(e[40]=[s("下载",-1)])]),_:1},8,["icon","onClick"])],64))]),_:1})]),_:1},8,["data"])),[[xe,_.value]])]),_:1}),l(qe,{name:"analyze"},{label:t(()=>[l(z,null,{default:t(()=>[l($(Qe))]),_:1}),e[42]||(e[42]=n("span",{class:"tab-lbl"},"日志分析",-1))]),default:t(()=>[pe.value?(i(),V(X,{key:1},[n("div",Ra,[l(N,{size:"small",type:"info",effect:"plain",class:"an-target"},{default:t(()=>[l(z,null,{default:t(()=>[l($(Ye))]),_:1}),n("span",Da,u(pe.value),1)]),_:1}),l(L,{size:"small",icon:$(Fe),onClick:pl},{default:t(()=>[...e[44]||(e[44]=[s("换文件",-1)])]),_:1},8,["icon"]),e[46]||(e[46]=n("div",{class:"spacer"},null,-1)),e[47]||(e[47]=n("span",{class:"muted"},"粒度",-1)),l(be,{modelValue:Ne.value,"onUpdate:modelValue":e[7]||(e[7]=a=>Ne.value=a),size:"small",class:"sel-interval"},{default:t(()=>[l(q,{value:"second",label:"按秒"}),l(q,{value:"minute",label:"按分"}),l(q,{value:"hour",label:"按时"})]),_:1},8,["modelValue"]),l(be,{modelValue:Ce.value,"onUpdate:modelValue":e[8]||(e[8]=a=>Ce.value=a),size:"small",clearable:"",placeholder:"聚焦标签",class:"sel-tag"},{default:t(()=>[(i(!0),V(X,null,oe(Q.value?.tags??[],a=>(i(),x(q,{key:a.tag||"__none__",value:a.tag,label:`${He(a.tag)} (${a.count})`},null,8,["value","label"]))),128))]),_:1},8,["modelValue"]),l(ye,{modelValue:Ue.value,"onUpdate:modelValue":e[9]||(e[9]=a=>Ue.value=a),size:"small",clearable:"",placeholder:"关键字过滤",class:"sel-kw","prefix-icon":$($e),onKeyup:xt(Re,["enter"])},null,8,["modelValue","prefix-icon"]),l(L,{size:"small",type:"primary",icon:$(me),loading:Me.value,onClick:Re},{default:t(()=>[...e[45]||(e[45]=[s("分析",-1)])]),_:1},8,["icon","loading"])]),Q.value?.truncated?(i(),x(Be,{key:0,type:"warning",closable:!1,"show-icon":"",title:"文件较大,仅分析了前部分内容,统计为近似值。",style:{margin:"0 0 10px"}})):K("",!0),Q.value?(i(),V("div",Ba,[n("div",Oa,[e[48]||(e[48]=n("span",{class:"k"},"总条数",-1)),n("span",Fa,u(Q.value.total),1)]),n("div",Ia,[e[49]||(e[49]=n("span",{class:"k"},"标签数",-1)),n("span",Ka,u(Q.value.tags.length),1)]),n("div",Pa,[e[50]||(e[50]=n("span",{class:"k"},"数值字段",-1)),n("span",Ga,u(Q.value.fields.length),1)]),n("div",Wa,[e[51]||(e[51]=n("span",{class:"k"},"时间范围",-1)),n("span",ja,u(Ol.value),1)])])):K("",!0),ee((i(),V("div",Ha,[l(T,{shadow:"never",class:"an-card"},{default:t(()=>[e[52]||(e[52]=n("div",{class:"an-card-title"},"标签分布(Top 12)",-1)),n("div",{ref_key:"tagChartRef",ref:Ge,class:"an-chart"},null,512)]),_:1}),l(T,{shadow:"never",class:"an-card"},{default:t(()=>[e[53]||(e[53]=n("div",{class:"an-card-title"},"日志量随时间(Top 标签堆叠 + 总量)",-1)),n("div",{ref_key:"volChartRef",ref:We,class:"an-chart"},null,512)]),_:1})])),[[xe,Me.value]]),l(T,{shadow:"never",class:"an-card an-fields"},{default:t(()=>[e[55]||(e[55]=n("div",{class:"an-card-title"},[s(" 数值字段 "),n("span",{class:"muted"},"(识别 key=value / key:value,点「绘制」查看时序)")],-1)),n("div",qa,[l(Oe,{data:Q.value?.fields??[],size:"small","max-height":"280",class:"fields-table"},{empty:t(()=>[...e[54]||(e[54]=[n("span",{class:"muted"},"未识别到数值字段",-1)])]),default:t(()=>[l(G,{label:"字段","min-width":"110"},{default:t(({row:a})=>[n("span",Ja,u(a.name),1)]),_:1}),l(G,{label:"样本",width:"76",align:"right"},{default:t(({row:a})=>[s(u(a.samples),1)]),_:1}),l(G,{label:"最小",width:"86",align:"right"},{default:t(({row:a})=>[s(u(a.min),1)]),_:1}),l(G,{label:"最大",width:"86",align:"right"},{default:t(({row:a})=>[s(u(a.max),1)]),_:1}),l(G,{label:"均值",width:"96",align:"right"},{default:t(({row:a})=>[s(u(a.avg),1)]),_:1}),l(G,{label:"操作",width:"92",align:"center"},{default:t(({row:a})=>[l(L,{link:"",type:ne.value===a.name?"success":"primary",onClick:re=>Fl(a.name)},{default:t(()=>[s(u(ne.value===a.name?"已绘制":"绘制"),1)]),_:2},1032,["type","onClick"])]),_:1})]),_:1},8,["data"]),n("div",Ya,[ee(n("div",{ref_key:"fieldChartRef",ref:je,class:"an-chart tall"},null,512),[[tl,ne.value]]),ee(n("div",Za,"选择左侧一个数值字段查看其时序曲线",512),[[tl,!ne.value]])])])]),_:1})],64)):(i(),V("div",Aa,[l(ql,{description:"从「日志文件」选择一个 .log 文件进行分析"},{default:t(()=>[l(L,{type:"primary",icon:$(Fe),onClick:pl},{default:t(()=>[...e[43]||(e[43]=[s("去选择日志文件",-1)])]),_:1},8,["icon"])]),_:1})]))]),_:1})]),_:1},8,["modelValue"])]),_:1}),l(Zl,{modelValue:v.value,"onUpdate:modelValue":e[12]||(e[12]=a=>v.value=a),title:"日志条目详情",width:"680px","append-to-body":""},{default:t(()=>[r.value?(i(),V(X,{key:0},[l(Yl,{column:1,border:"",size:"small"},{default:t(()=>[l(wl,{label:"时间"},{default:t(()=>[s(u(r.value.time?se(r.value.time):"(无时间戳)"),1)]),_:1}),l(wl,{label:"标签"},{default:t(()=>[r.value.tag?(i(),x(N,{key:0,size:"small",effect:"dark"},{default:t(()=>[s(u(r.value.tag),1)]),_:1})):(i(),V("span",Qa,"(无,滚动记录)"))]),_:1})]),_:1}),n("div",Xa,[n("div",en,[e[57]||(e[57]=n("span",null,"内容",-1)),l(L,{size:"small",link:"",type:"primary",icon:$(St),onClick:e[11]||(e[11]=a=>Gl(r.value.content))},{default:t(()=>[...e[56]||(e[56]=[s("复制",-1)])]),_:1},8,["icon"])]),n("pre",ln,u(r.value.content),1)])],64)):K("",!0)]),_:1},8,["modelValue"]),l(Xl,{modelValue:j.value,"onUpdate:modelValue":e[20]||(e[20]=a=>j.value=a),title:A.value,size:"64%","append-to-body":""},{default:t(()=>[n("div",tn,[l(Ql,{modelValue:h.value,"onUpdate:modelValue":e[13]||(e[13]=a=>h.value=a),size:"small",onChange:Bl},{default:t(()=>[l(hl,{label:"structured"},{default:t(()=>[...e[58]||(e[58]=[s("结构化",-1)])]),_:1}),l(hl,{label:"raw"},{default:t(()=>[...e[59]||(e[59]=[s("原文",-1)])]),_:1})]),_:1},8,["modelValue"]),h.value==="structured"?(i(),V(X,{key:0},[l(ye,{modelValue:k.value,"onUpdate:modelValue":e[14]||(e[14]=a=>k.value=a),size:"small",clearable:"",placeholder:"内容 / 标签过滤",class:"sel-kw","prefix-icon":$($e)},null,8,["modelValue","prefix-icon"]),l(yl,{modelValue:H.value,"onUpdate:modelValue":e[15]||(e[15]=a=>H.value=a),size:"small"},{default:t(()=>[...e[60]||(e[60]=[s("仅带标签",-1)])]),_:1},8,["modelValue"])],64)):(i(),x(be,{key:1,modelValue:R.value,"onUpdate:modelValue":e[16]||(e[16]=a=>R.value=a),size:"small",class:"sel-tail",onChange:cl},{default:t(()=>[l(q,{value:1e3,label:"尾部 1000 行"}),l(q,{value:3e3,label:"尾部 3000 行"}),l(q,{value:1e4,label:"尾部 1 万行"}),l(q,{value:5e4,label:"尾部 5 万行"})]),_:1},8,["modelValue"])),h.value==="raw"&&p.value?(i(),V("span",an,u(le.value)+" 行",1)):h.value==="structured"&&d.value?(i(),V("span",nn,u(ml.value.length)+" / "+u(d.value.total)+" 条",1)):K("",!0),e[64]||(e[64]=n("div",{class:"spacer"},null,-1)),A.value.toLowerCase().endsWith(".log")?(i(),x(L,{key:4,size:"small",type:"primary",plain:"",icon:$(Qe),onClick:e[17]||(e[17]=a=>vl(A.value))},{default:t(()=>[...e[61]||(e[61]=[s("分析此文件",-1)])]),_:1},8,["icon"])):K("",!0),l(L,{size:"small",icon:$(kl),onClick:e[18]||(e[18]=a=>_l(A.value))},{default:t(()=>[...e[62]||(e[62]=[s("下载",-1)])]),_:1},8,["icon"]),l(L,{size:"small",icon:$(me),loading:c.value,onClick:cl},{default:t(()=>[...e[63]||(e[63]=[s("刷新",-1)])]),_:1},8,["icon","loading"])]),h.value==="structured"&&d.value?.truncated?(i(),x(Be,{key:0,type:"warning",closable:!1,"show-icon":"",title:"文件较大,仅解析了前部分条目。",style:{margin:"0 0 10px"}})):K("",!0),h.value==="structured"?ee((i(),x(Oe,{key:1,data:ml.value,size:"small","max-height":"calc(100vh - 220px)",class:"entries-table",onRowDblclick:e[19]||(e[19]=a=>De({time:a.time,tag:a.tag,content:a.content}))},{default:t(()=>[l(G,{label:"时间",width:"190"},{default:t(({row:a})=>[s(u(a.time?se(a.time):"—"),1)]),_:1}),l(G,{label:"标签",width:"160"},{default:t(({row:a})=>[a.tag?(i(),x(N,{key:0,size:"small",effect:"dark"},{default:t(()=>[s(u(a.tag),1)]),_:2},1024)):(i(),V("span",on,"—"))]),_:1}),l(G,{label:"内容","show-overflow-tooltip":""},{default:t(({row:a})=>[n("span",sn,u(a.content),1)]),_:1}),l(G,{label:"操作",width:"70",align:"center"},{default:t(({row:a})=>[l(L,{link:"",type:"primary",icon:$(Ze),onClick:re=>De({time:a.time,tag:a.tag,content:a.content})},null,8,["icon","onClick"])]),_:1})]),_:1},8,["data"])),[[xe,c.value]]):ee((i(),V("pre",un,[s(u(p.value),1)])),[[xe,c.value]])]),_:1},8,["modelValue","title"])])]),_:1})}}}),rn=ke(dn,[["__scopeId","data-v-43fe0c7b"]]),cn={class:"mmcg"},mn={class:"mmcg-head"},vn={class:"mmcg-title"},pn={key:0,class:"mmcg-empty muted"},fn={key:2,class:"mmcg-orphans"},gn={class:"orphan-list"},_n=he({__name:"MapMonitorConfigGroup",props:{title:{},available:{},selected:{},emptyTip:{}},emits:["update:selected"],setup(w,{emit:y}){const f=w,U=y,S=te(()=>f.available.length?f.selected.length?`${f.selected.length} / ${f.available.length}`:`白名单空 = 显示全部 (${f.available.length})`:"空"),b=te(()=>f.selected.filter(I=>!f.available.includes(I))),E=te(()=>f.available.length>f.selected.length);function D(I){const _=[...I.filter(M=>typeof M=="string"),...b.value];U("update:selected",_)}function F(){U("update:selected",[...f.available,...b.value])}function B(){U("update:selected",[...b.value])}function P(I){U("update:selected",f.selected.filter(g=>g!==I))}function Y(){U("update:selected",f.selected.filter(I=>f.available.includes(I)))}return(I,g)=>{const _=Ke,M=Pe,Z=Mt,v=il,r=Nl,j=sl;return i(),V("section",cn,[n("header",mn,[n("span",vn,u(w.title),1),l(_,{size:"small",effect:"plain",type:"info"},{default:t(()=>[s(u(S.value),1)]),_:1}),g[2]||(g[2]=n("div",{class:"spacer"},null,-1)),w.available.length?(i(),x(Z,{key:0},{default:t(()=>[l(M,{size:"small",disabled:!E.value,onClick:F},{default:t(()=>[...g[0]||(g[0]=[s("全选",-1)])]),_:1},8,["disabled"]),l(M,{size:"small",disabled:!w.selected.length,onClick:B},{default:t(()=>[...g[1]||(g[1]=[s("清空",-1)])]),_:1},8,["disabled"])]),_:1})):K("",!0)]),w.available.length?(i(),x(r,{key:1,"model-value":w.selected,class:"mmcg-grid","onUpdate:modelValue":D},{default:t(()=>[(i(!0),V(X,null,oe(w.available,A=>(i(),x(v,{key:A,value:A,label:A,class:"mmcg-cb"},null,8,["value","label"]))),128))]),_:1},8,["model-value"])):(i(),V("p",pn,u(w.emptyTip),1)),b.value.length?(i(),V("div",fn,[l(j,{type:"warning",closable:!1,"show-icon":"",title:`检测到 ${b.value.length} 个残留键(后端已经不再暴露,但仍在白名单中)`},{default:t(()=>[n("div",gn,[(i(!0),V(X,null,oe(b.value,A=>(i(),x(_,{key:A,type:"warning",size:"small",closable:"",onClose:h=>P(A)},{default:t(()=>[s(u(A),1)]),_:2},1032,["onClose"]))),128)),l(M,{link:"",type:"warning",size:"small",onClick:Y},{default:t(()=>[...g[3]||(g[3]=[s("一键清理全部残留",-1)])]),_:1})])]),_:1},8,["title"])])):K("",!0)])}}}),ll=ke(_n,[["__scopeId","data-v-242bdaa0"]]),bn={class:"mmc-header"},yn={class:"mmc-tab-body"},wn=he({__name:"MapMonitorConfigView",setup(w){const y=[{value:"car",label:"车辆 (Car)"},{value:"site",label:"站点 (Site)"},{value:"track",label:"路径 (Track)"}],f=m("car"),U=m(!1),S=m(!1),b=xl(zl()),E=xl(Ot()),D=m(JSON.stringify(zl())),F=te(()=>D.value!==JSON.stringify(b));function B(g,_){for(const M of y)g[M.value].fields=[..._[M.value]?.fields??[]],g[M.value].status=[..._[M.value]?.status??[]],g[M.value].methods=[..._[M.value]?.methods??[]]}async function P(g=!1){U.value=!0;try{const _=await al.getMonitorConfig();B(b,_.config),B(E,_.available),D.value=JSON.stringify(b),g&&W.success("已重载")}catch(_){W.error(`加载失败:${_ instanceof Error?_.message:String(_)}`)}finally{U.value=!1}}async function Y(){S.value=!0;try{const g=await al.saveMonitorConfig({car:{...b.car},site:{...b.site},track:{...b.track}});B(b,g),D.value=JSON.stringify(b),W.success("已保存(已写入 simple.json)")}catch(g){W.error(`保存失败:${g instanceof Error?g.message:String(g)}`)}finally{S.value=!1}}function I(g,_,M){b[g][_]=[...M]}return nl(()=>P()),(g,_)=>{const M=Ke,Z=Pe,v=dl,r=ul,j=ol,A=Ie;return i(),x(Ul,{"widget-id":"ConfigCenter"},{default:t(()=>[l(j,{shadow:"never",class:"mmc-card"},{header:t(()=>[n("div",bn,[_[6]||(_[6]=n("span",{class:"mmc-title"},"地图监控配置",-1)),l(M,{size:"small",effect:"plain"},{default:t(()=>[..._[2]||(_[2]=[s("section=map-monitor",-1)])]),_:1}),F.value?(i(),x(M,{key:0,size:"small",type:"warning",effect:"dark"},{default:t(()=>[..._[3]||(_[3]=[s("未保存",-1)])]),_:1})):K("",!0),_[7]||(_[7]=n("div",{class:"spacer"},null,-1)),l(Z,{size:"small",icon:$(me),loading:U.value,onClick:_[0]||(_[0]=h=>P(!0))},{default:t(()=>[..._[4]||(_[4]=[s("重载",-1)])]),_:1},8,["icon","loading"]),l(Z,{size:"small",type:"primary",icon:$(Nt),loading:S.value,disabled:!F.value,onClick:Y},{default:t(()=>[..._[5]||(_[5]=[s(" 保存 ",-1)])]),_:1},8,["icon","loading","disabled"])])]),default:t(()=>[_[8]||(_[8]=n("p",{class:"mmc-desc"},[s(" 勾选「地图监控」右侧选中信息面板要展示的内容白名单(按对象类型 - 车辆 / 站点 / 路径 分组)。 三组分别控制 "),n("b",null,"属性"),s("、"),n("b",null,"状态"),s("、"),n("b",null,"动作"),s(" Tab 里可见的字段 / 状态项 / 可执行方法。 每组留空 = 显示全部;勾选任何一项即进入白名单模式(仅显示已勾选)。保存后直接写入 SimpleLite 的 "),n("code",null,"simple.json"),s(" ("),n("code",null,"Configuration.conf.monitorVisibility"),s(")。 ")],-1)),l(r,{modelValue:f.value,"onUpdate:modelValue":_[1]||(_[1]=h=>f.value=h),class:"mmc-tabs"},{default:t(()=>[(i(),V(X,null,oe(y,h=>l(v,{key:h.value,label:h.label,name:h.value},{default:t(()=>[ee((i(),V("div",yn,[l(ll,{title:"属性字段(Properties)",available:E[h.value].fields,selected:b[h.value].fields,"empty-tip":"该类型暂未发现任何 [FieldMember]。在 SimpleLite 端添加字段后点重载会刷新。","onUpdate:selected":c=>I(h.value,"fields",c)},null,8,["available","selected","onUpdate:selected"]),l(ll,{title:"状态项(Status)",available:E[h.value].status,selected:b[h.value].status,"empty-tip":"该类型暂未发现任何 status 字段(来自 obj.status 反射)。","onUpdate:selected":c=>I(h.value,"status",c)},null,8,["available","selected","onUpdate:selected"]),l(ll,{title:"可执行动作(Methods)",available:E[h.value].methods,selected:b[h.value].methods,"empty-tip":"该类型暂未发现任何 [MethodMember] 方法。","onUpdate:selected":c=>I(h.value,"methods",c)},null,8,["available","selected","onUpdate:selected"])])),[[A,U.value]])]),_:2},1032,["label","name"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1})}}}),hn=ke(wn,[["__scopeId","data-v-4d3be43b"]]),kn={class:"config-hub-page"},Cn={class:"config-pane"},xn={class:"config-pane"},$n={class:"config-pane"},Vn={class:"config-pane"},zn=he({__name:"OpsCenterView",setup(w){const y=Ut(),f=Ll(),U=["playback","ops","logs","map-monitor"];function S(){const E=y.query.tab;return typeof E=="string"&&U.includes(E)?E:"playback"}const b=m(S());return we(b,E=>{y.query.tab!==E&&f.replace({query:{...y.query,tab:E}})}),we(()=>y.query.tab,()=>{const E=S();E!==b.value&&(b.value=E)}),(E,D)=>{const F=dl,B=ul;return i(),V("div",kn,[l(B,{modelValue:b.value,"onUpdate:modelValue":D[0]||(D[0]=P=>b.value=P),class:"hub-tabs"},{default:t(()=>[l(F,{name:"playback",label:"调度回放"},{default:t(()=>[n("div",Cn,[l(aa)])]),_:1}),l(F,{name:"ops",label:"运营维护",lazy:""},{default:t(()=>[n("div",xn,[l(da)])]),_:1}),l(F,{name:"logs",label:"日志管理",lazy:""},{default:t(()=>[n("div",$n,[l(rn)])]),_:1}),l(F,{name:"map-monitor",label:"地图监控配置",lazy:""},{default:t(()=>[n("div",Vn,[l(hn)])]),_:1})]),_:1},8,["modelValue"])])}}}),uo=ke(zn,[["__scopeId","data-v-0bd2e46f"]]);export{uo as default};