1import{r as n,j as e}from"./vendor-CWbTxbDJ.js";import{u as ke}from"./useAuthCheck-L6805PrT.js";import{A as we}from"./index-CKOktoVJ.js";import{aj as ce,ak as le,al as $e,am as Re,an as Fe,ao as Ae,ap as Ce,aq as Te}from"./projectApi-2m0MUXrH.js";import{c as Le}from"./index-CE0gaqa4.js";import"./ui-vendor-BVdwggPR.js";const De="_pageWrapper_1twpy_1",Ie="_card_1twpy_12",Je="_sectionTitle_1twpy_19",Pe="_muted_1twpy_25",Ee="_btnRow_1twpy_29",He="_btnPrimary_1twpy_35",Me="_btnSecondary_1twpy_36",Oe="_btnDanger_1twpy_37",We="_input_1twpy_62",Ue="_grid2_1twpy_75",qe="_pre_1twpy_87",t={pageWrapper:De,card:Ie,sectionTitle:Je,muted:Pe,btnRow:Ee,btnPrimary:He,btnSecondary:Me,btnDanger:Oe,input:We,grid2:Ue,pre:qe},Ke=l=>{try{return JSON.stringify(l,null,2)}catch{return String(l)}},M=l=>{const c=Number(l);if(!Number.isFinite(c)||c<=0)return"-";const m=new Date(c*1e3);return Number.isNaN(m.getTime())?"-":m.toLocaleString()},O=l=>{const c=Number(l);return Number.isFinite(c)?c<60?`${c.toFixed(0)} ç§å`:c<3600?`${(c/60).toFixed(1)} åéå`:c<86400?`${(c/3600).toFixed(1)} å°æ¶å`:`${(c/86400).toFixed(1)} 天å`:"-"},r=({label:l,value:c,tone:m="muted"})=>{const _=m==="ok"?"text-green-700":m==="warn"?"text-amber-700":m==="bad"?"text-red-700":"text-text-primary";return e.jsxs("div",{className:"flex items-start justify-between gap-3 py-1.5 border-b border-dashed border-neutral-200 last:border-0",children:[e.jsx("span",{className:"text-xs text-text-secondary shrink-0 pt-0.5",children:l}),e.jsx("span",{className:`text-sm text-right break-all ${_}`,children:c})]})},A=({value:l,title:c="åå§æ°æ®ï¼JSONï¼"})=>e.jsxs("details",{className:"mt-2",children:[e.jsx("summary",{className:"cursor-pointer text-xs text-text-secondary",children:c}),e.jsx("pre",{className:t.pre,children:Ke(l)})]}),W=({text:l})=>l?e.jsx("div",{className:"mt-2 rounded-lg bg-red-50 border border-red-200 text-red-700 text-xs p-2 break-all",children:l}):null,Ye=()=>{ke(!0,"/admin-dashboard",!0,"admin");const[l,c]=n.useState(!0),[m,_]=n.useState(null),[C,U]=n.useState(""),[g,q]=n.useState(null),[p,K]=n.useState(null),[S,ie]=n.useState(7),[T,L]=n.useState(null),[k,y]=n.useState({}),[de,z]=n.useState(!1),[B,oe]=n.useState(0),[G,ue]=n.useState(""),[Q,xe]=n.useState(!0),[D,V]=n.useState(!1),[X,me]=n.useState(3),[Y,he]=n.useState(!1),[I,Z]=n.useState(!1),[ee,ge]=n.useState(600),[J,se]=n.useState(!1),[b,w]=n.useState(""),[te,f]=n.useState(!1),[i,$]=n.useState(null),ae=n.useMemo(()=>String(C||"")==="slave",[C]),h=(s,a)=>{_({type:s,text:a})},j=s=>String(s?.message||s||"æªç¥é误"),N=async()=>{z(!0);const s=$e().then(u=>{q(u),oe(Date.now()),y(x=>({...x,status:void 0}))}).catch(u=>{q(null),y(x=>({...x,status:j(u)}))}),a=le(S).then(u=>{L(u),y(x=>({...x,history:void 0}))}).catch(u=>{L(null),y(x=>({...x,history:j(u)}))}),H=Re(500).then(u=>{K(u),y(x=>({...x,pending:void 0}))}).catch(u=>{K(null),y(x=>({...x,pending:j(u)}))}).finally(()=>z(!1));await Promise.allSettled([s,a,H])};n.useEffect(()=>{let s=!1;return(async()=>{try{const a=await fetch(Le("/api/hybrid/status/"),{credentials:"include"}),H=a.ok?await a.json():null;s||U(String(H?.role||""))}catch{s||U("")}try{await N()}catch(a){s||h("error",a?.message||"å 载失败")}finally{s||c(!1)}})(),()=>{s=!0}},[]),n.useEffect(()=>{let s=null;if(b)return s=setInterval(async()=>{try{f(!0);const a=await ce(b);$(a),a?.status&&["success","failed","canceled","error"].includes(String(a.status))&&(w(""),f(!1),await N())}catch{}finally{f(!1)}},2e3),()=>clearInterval(s)},[b]);const be=async()=>{if(!D){V(!0);try{const s=await Fe({reason:G,async:Q}),a=String(s?.job_id||s?.jobId||s?.id||"");a&&w(a),$(s),h("success","已触å忥任å¡"),await N()}catch(s){h("error",`触ååæ¥å¤±è´¥ï¼${j(s)}`)}finally{V(!1)}}},je=async()=>{if(b){f(!0);try{await Ae(b),h("success","已请æ±åæ¶ä»»å¡");const s=await ce(b);$(s),w(""),await N()}catch(s){h("error",`åæ¶å¤±è´¥ï¼${j(s)}`)}finally{f(!1)}}},pe=async()=>{if(!J){se(!0);try{const s=await Ce(ee),a=s?.result||{};h("success",a.cleared?`å·²æ¸
çéæ§éï¼å·²åå¨ ${O(a.age_seconds)}ï¼`:s?.message||`æªæ¸
çï¼${a.reason||"éä¸åå¨æè¿æªè¿æ"}`),await N()}catch(s){h("error",`å¤çé失败ï¼${j(s)}`)}finally{se(!1)}}},ye=async()=>
1{if(!I){Z(!0);try{const s=await Te({days:X,checksum:Y}),a=String(s?.job_id||s?.jobId||s?.id||"");a&&w(a),$(s),h("success","已触å对账/è¡¥å¿ä»»å¡"),await N()}catch(s){h("error",`触å对账失败ï¼${j(s)}`)}finally{Z(!1)}}},o=g?.state||null,P=g?.config||null,v=g?.background||null,d=o?.last_sync_record||null,R=g?.heartbeat_age_seconds,ne=o?.heartbeat_source||"",Ne=typeof R=="number"&&R<=180,ve=o?typeof R=="number"?`${O(R)}ï¼æ¥æºï¼${ne||"æªç¥"}ï¼`:`${ne||"æªç¥"}ï¼æ å¿è·³æ¶é´ï¼`:"没æä»»ä½åæ¥è®°å½ï¼èªå¨åæ¥æå¡å¯è½ä»æªè¿è¡ï¼",fe=g?.lock?`被å ç¨ ${O(g?.lock_age_seconds)}ï¼pid=${g?.lock?.pid??"-"}ï¼`:"空é²",E=Array.isArray(o?.config_errors)?o.config_errors:[],_e=v?v.running?"æ£å¨åæ¥ï¼ä¸ä¼ /é¨ç½²è§¦åçï¼":v.last_trigger_result?`䏿¬¡ ${v.last_trigger_result.success?"æå":"失败"} · ${v.last_trigger_result.files_count??0} 个æä»¶`:v.skipped_reason?`已跳è¿ï¼${v.skipped_reason}`:"å¾
å½":"-",Se=o?.auto_trigger_last_skip?`${o.auto_trigger_last_skip.reason} · ${M(o.auto_trigger_last_skip.at)}`:"æ ",re=Array.isArray(T?.rows)?T.rows:[],F=Array.isArray(p?.files)?p.files:[];return e.jsx("div",{className:t.pageWrapper,children:e.jsxs("div",{className:"flex",children:[e.jsx(we,{}),e.jsx("main",{className:"admin-main-content min-h-screen flex-1 p-6",children:e.jsxs("div",{className:"max-w-6xl mx-auto space-y-4",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-text-primary",children:"æä»¶åæ¥ææ´"}),e.jsx("p",{className:"text-text-secondary mt-1",children:"主ç«è§¦å rsync 忥䏿¥çåæ¥ç¶æï¼User_File â ä»ç«ï¼ãèªå¨åæ¥èæ¬ä¸åå°é¡µé¢å
±ç¨åä¸ä»½ç¶æä¸æä»¶éã"})]}),e.jsxs("div",{className:t.btnRow,children:[B>0&&e.jsxs("span",{className:"text-xs text-text-secondary self-center",children:["䏿¬¡å·æ° ",new Date(B).toLocaleTimeString()]}),e.jsx("button",{className:t.btnSecondary,onClick:()=>N(),disabled:l,children:l?"å è½½ä¸â¦":"å·æ°"})]})]}),m&&e.jsxs("div",{className:`rounded-xl p-3 border flex items-start justify-between gap-3 ${m.type==="success"?"bg-green-50 border-green-200 text-green-700":"bg-red-50 border-red-200 text-red-700"}`,children:[e.jsx("span",{className:"text-sm break-all",children:m.text}),e.jsx("button",{className:"text-xs underline shrink-0",onClick:()=>_(null),children:"å
³é"})]}),ae&&e.jsxs("div",{className:t.card,children:[e.jsx("div",{className:t.sectionTitle,children:"å½å为ä»ç«ç¯å¢"}),e.jsx("p",{className:t.muted,children:"æä»¶åæ¥ææ´é¡µä»
主ç«å¯ç¨ï¼è¯·å°ä¸»ç«è®¿é®è¯¥é¡µé¢ã"})]}),!ae&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:t.grid2,children:[e.jsxs("div",{className:t.card,children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("div",{className:t.sectionTitle,children:"è¿è¡ç¶æ"}),e.jsxs("div",{className:t.muted,children:["role: ",C||"-"]})]}),e.jsxs("div",{className:"mt-2",children:[e.jsx(r,{label:"忥éé",value:P?`${P.mode} â ${P.dest}`:"æªåå°é
ç½®"}),e.jsx(r,{label:"å¿è·³",value:ve,tone:Ne?"ok":o?"warn":"bad"}),e.jsx(r,{label:"䏿¬¡åæ¥",value:d?`${d.success?"æå":"失败"}ï¼${d.runner||"æªç¥æ¥æº"}ï¼`:"ææ è®°å½",tone:d?d.success?"ok":"bad":"muted"}),e.jsx(r,{label:"䏿¬¡æ¶é´",value:d?M(d.ended_at_ts):"-"}),e.jsx(r,{label:"䏿¬¡åå ",value:d?.reason||"-"}),e.jsx(r,{label:"䏿¬¡æä»¶æ°",value:d?`${d.files_count??0} 个ï¼èæ¶ ${Number(d.duration_seconds||0).toFixed(1)}s`:"-"}),d?.tolerated_warning&&e.jsx(r,{label:"æç¤º",value:String(d.tolerated_warning),tone:"warn"}),e.jsx(r,{label:"é误æè¦",value:o?.last_sync_error||"æ ",tone:o?.last_sync_error?"bad":"muted"}),e.jsx(r,{label:"æä»¶é",value:fe,tone:g?.lock?"warn":"ok"}),e.jsx(r,{label:"é
ç½®é®é¢",value:E.length?E.join("ï¼"):"æ ",tone:E.length?"bad":"muted"}),e.jsx(r,{label:"ä¸ä¼ 触åç忥",value:_e}),e.jsx(r,{label:"䏿¬¡è¢«è·³è¿",value:Se})]}),e.jsx(W,{text:k.status}),e.jsx(A,{value:g,title:"åå§æ°æ®ï¼ç¶ææ¥å£ JSONï¼"})]}),e.jsxs("div",{className:t.card,children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("div",{className:t.
1sectionTitle,children:"å¾
忥æ¸
å"}),e.jsx("div",{className:t.muted,children:"æè¿åæ´ï¼æå¤ 500ï¼"})]}),k.pending?e.jsxs(e.Fragment,{children:[e.jsx(W,{text:k.pending}),e.jsx("p",{className:t.muted,children:"忥è¿è¡ä¸æ¶è¯¥æ¸
åä¼è¿å 409ï¼å±äºæ£å¸¸ç°è±¡ï¼å¯ç¨ååçï¼ä¸å½±åç¹ãå¼å§åæ¥ãï¼ã"})]}):de&&!p?e.jsx("p",{className:t.muted,children:"æ£å¨é¢æ¼ï¼æä»¶å¤æ¶è¦çä¸ä¼ï¼â¦â¦è¿ä¸åæ
¢ä¸å½±åãè¿è¡ç¶æãåãå¼å§åæ¥ãã"}):p?.timed_out?e.jsx("div",{className:"mt-2 rounded-lg bg-amber-50 border border-amber-200 text-amber-800 text-xs p-2",children:p?.message||"颿¼è¶
æ¶ï¼è¯·ç´æ¥ç¹ãå¼å§åæ¥ãã"}):e.jsxs("div",{className:"mt-2",children:[e.jsx(r,{label:"å¾
忥æä»¶æ°",value:String(p?.pending_count??0),tone:Number(p?.pending_count??0)>0?"warn":"ok"}),F.length===0&&e.jsx("p",{className:t.muted,children:"ä»ç«å·²ç»å主ç«ä¸è´ï¼æ²¡æå¾
忥æä»¶ã"}),F.slice(0,20).map(s=>e.jsxs("div",{className:"text-xs text-text-secondary break-all py-0.5",children:["ð ",s]},s)),F.length>20&&e.jsxs("p",{className:t.muted,children:["â¦ å¦æ ",F.length-20," 个æä»¶ï¼ç¨ä¸æ¹âå¼å§åæ¥âå³å¯å
¨é¨æ¨éï¼"]})]}),e.jsx(A,{value:p})]})]}),e.jsxs("div",{className:t.grid2,children:[e.jsxs("div",{className:t.card,children:[e.jsx("div",{className:t.sectionTitle,children:"触å忥"}),e.jsxs("div",{className:"mt-3 space-y-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:t.muted,children:"åå ï¼å¯éï¼"}),e.jsx("input",{className:t.input,value:G,onChange:s=>ue(s.target.value),placeholder:"ä¾å¦ï¼åå¸å忥"})]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:Q,onChange:s=>xe(s.target.checked)}),e.jsx("span",{children:"弿¥æ§è¡ï¼æ¨èï¼"})]}),e.jsxs("div",{className:t.btnRow,children:[e.jsx("button",{className:t.btnPrimary,onClick:be,disabled:D,children:D?"å¤çä¸...":"å¼å§åæ¥"}),e.jsx("button",{className:t.btnDanger,onClick:je,disabled:!b||te,children:"åæ¶å½åä»»å¡"})]}),b&&e.jsxs("div",{className:t.muted,children:["å½åä»»å¡ï¼",b]})]})]}),e.jsxs("div",{className:t.card,children:[e.jsx("div",{className:t.sectionTitle,children:"é/对账"}),e.jsxs("div",{className:"mt-3 space-y-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:t.muted,children:"æ¸
çéæ§éï¼ç§ï¼"}),e.jsx("input",{className:t.input,value:String(ee),onChange:s=>ge(parseInt(s.target.value||"0",10)||0)})]}),e.jsx("div",{className:t.btnRow,children:e.jsx("button",{className:t.btnSecondary,onClick:pe,disabled:J,children:J?"å¤çä¸...":"æ¸
çé"})}),e.jsx("hr",{}),e.jsx("div",{className:t.muted,children:"对账/è¡¥å¿ï¼å¯éï¼èæ¶è¾é¿ï¼"}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:t.muted,children:"åæº¯å¤©æ°"}),e.jsx("input",{className:t.input,value:String(X),onChange:s=>me(parseInt(s.target.value||"0",10)||0)})]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm mt-6",children:[e.jsx("input",{type:"checkbox",checked:Y,onChange:s=>he(s.target.checked)}),e.jsx("span",{children:"checksumï¼æ´ä¸¥æ ¼ï¼"})]})]}),e.jsx("div",{className:t.btnRow,children:e.jsx("button",{className:t.btnSecondary,onClick:ye,disabled:I,children:I?"å¤çä¸...":"æ§è¡å¯¹è´¦/è¡¥å¿"})})]})]})]}),e.jsxs("div",{className:t.grid2,children:[e.jsxs("div",{className:t.card,children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("div",{className:t.sectionTitle,children:"ä»»å¡ç¶æ"}),e.jsx("div",{className:t.muted,children:te?"轮询ä¸":"就绪"})]}),i?e.jsxs("div",{className:"mt-2",children:[e.jsx(r,{label:"ç¶æ",value:String(i?.status||"-"),tone:i?.status==="success"?"ok":i?.status==="error"?"bad":"muted"}),e.jsx(r,{label:"说æ",value:String(i?.message||"-")}),i?.record&&e.jsxs(e.Fragment,{children:[e.jsx(r,{label:"ç»æ",value:i.record.success?"æå":"失败",tone:i.record.success?"ok":"bad"}),e.jsx(r,{label:"æä»¶æ°",value:String(i.record.files_count??0)}),e.jsx(r,{label:"èæ¶",value:`${Number(i.record.duration_seconds||0).toFixed(1)}s`}),!!i.record.stderr_tail&&e.jsx(r,{label:"é误",value:String(i.record.stderr_tail).slice(0,300),tone:"bad"})]}),!!i?.error&&e.jsx(r,{label:"å¼å¸¸",value:String(i.error),tone:"bad"})]}):e.jsx("p",{className:t.muted,children:"è¿æ²¡æè§¦åè¿ä»»å¡ã"}),e.jsx(A,{value:i})]}),e.jsxs("div",{className:t.card,children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("div",{className:t.
1sectionTitle,children:"åå²è®°å½"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{className:t.input,style:{width:120},value:String(S),onChange:s=>ie(parseInt(s.target.value||"0",10)||0)}),e.jsx("button",{className:t.btnSecondary,onClick:async()=>{try{L(await le(S)),y(s=>({...s,history:void 0}))}catch(s){h("error",`å è½½åå²å¤±è´¥ï¼${j(s)}`),y(a=>({...a,history:j(s)}))}},children:"æ¥è¯¢"})]})]}),e.jsx(W,{text:k.history}),re.length===0?e.jsxs("p",{className:t.muted,children:["è¿å°ä¸»ç«å¨ ",S," 天å
没æä»»ä½åæ¥è®°å½ï¼å
å«èªå¨åæ¥èæ¬ç忥ï¼ã"]}):e.jsx("div",{className:"mt-2 max-h-72 overflow-auto",children:re.slice(0,30).map((s,a)=>e.jsxs("div",{className:"py-1.5 border-b border-dashed border-neutral-200 last:border-0",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("span",{className:`text-sm ${s.success?"text-green-700":"text-red-700"}`,children:[s.success?"æå":"失败"," · ",s.files_count??0," 个æä»¶"]}),e.jsx("span",{className:"text-xs text-text-secondary",children:M(s.ended_at_ts)})]}),e.jsxs("div",{className:"text-xs text-text-secondary break-all",children:["åå ï¼",s.reason||"-"," · æ¥æºï¼",s.runner||"-"," · èæ¶ ",Number(s.duration_seconds||0).toFixed(1),"s"]}),!!s.tolerated_warning&&e.jsxs("div",{className:"text-xs text-amber-700",children:["æç¤ºï¼",s.tolerated_warning]}),!s.success&&!!s.stderr_tail&&e.jsx("div",{className:"text-xs text-red-700 break-all",children:String(s.stderr_tail).slice(0,240)})]},`${s.ended_at_ts}-${a}`))}),e.jsx(A,{value:T})]})]})]})]})})]})})};export{Ye as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.