PageSourceSearch

https://app.nexport.ai/assets/ParseFailures-DLs3EPiX.js

js nexport.ai collected 2026-10-05 13:53:27 UTC 18,076 bytes, 1 lines download raw bytes

1import{r as d,j as s,L as H,c as g}from"./index--1RmYx0j.js";const K=["","fanout","classify","extract","normalize","hs","network","unknown"],Q=["","system","external","input","content","policy"],V=["","dev_only","user_summary","user_actionable"],W=["","auto","manual","none"],R={system:"bg-red-100 text-red-700",external:"bg-orange-100 text-orange-700",input:"bg-yellow-100 text-yellow-700",content:"bg-amber-100 text-amber-700",policy:"bg-violet-100 text-violet-700"},X={dev_only:"bg-gray-200 text-gray-700",user_summary:"bg-blue-100 text-blue-700",user_actionable:"bg-emerald-100 text-emerald-700"},L={auto:"bg-sky-100 text-sky-700",manual:"bg-amber-100 text-amber-700",none:"bg-gray-100 text-gray-600"};function u({value:t,styleMap:c}){if(!t)return null;const r=c[t]??"bg-gray-100 text-gray-700";return s.jsx("span",{className:`inline-block text-[10px] font-medium px-1.5 py-0.5 rounded ${r}`,"data-sc-src":"src/pages/Admin/ParseFailures.tsx:102",children:t})}function ss(){const[t,c]=d.useState([]),[r,n]=d.useState({total:0,openCount:0,resolvedCount:0}),[f,M]=d.useState(!0),[p,_]=d.useState(""),[m,D]=d.useState(""),[y,O]=d.useState(""),[b,Y]=d.useState(""),[A,z]=d.useState(""),[F,S]=d.useState(!1),[x,U]=d.useState(null),[a,C]=d.useState(null),[P,h]=d.useState(!1),[$,N]=d.useState(""),j=async()=>{S(!0);try{const e=new URLSearchParams;f&&e.set("unresolved","1"),p&&e.set("step",p),m&&e.set("category",m),y&&e.set("audience",y),b&&e.set("retry",b);const i=await(await g(`/api/admin/docs/parse-failures?${e}`)).json();c(i.failures??[]),n(i.stats??{total:0,openCount:0,resolvedCount:0})}finally{S(!1)}},v=async e=>{U(e),C(null),N("");const l=await g(`/api/admin/docs/parse-failures/${e}`);if(l.ok){const i=await l.json();C(i),N(i.failure.resolutionNote??"")}},q=async()=>{if(x){h(!0);try{await g(`/api/admin/docs/parse-failures/${x}/resolve`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({note:$,resolvedBy:"admin"})}),await j(),await v(x)}finally{h(!1)}}},J=async()=>{if(x){h(!0);try{await g(`/api/admin/docs/parse-failures/${x}/reopen`,{method:"POST"}),await j(),await v(x)}finally{h(!1)}}},B=async(e,l)=>{const i=await g(`/api/admin/docs/parse-failures/${e}/file/${l}/download`);if(i.ok){const{url:G}=await i.json();window.open(G,"_blank")}};d.useEffect(()=>{j()},[f,p,m,y,b]);const E=d.useMemo(()=>{const e=A.trim().toLowerCase();return e?t.filter(l=>l.errorMessage.toLowerCase().includes(e)||(l.caseId??"").toLowerCase().includes(e)||l.id.toLowerCase().includes(e)):t},[t,A]);return s.jsxs("div",{className:"min-h-screen bg-gray-50 dark:bg-gray-900","data-sc-src":"src/pages/Admin/ParseFailures.tsx:214",children:[s.jsx("div",{className:"bg-red-600 text-white px-6 py-2 text-sm font-medium","data-sc-src":"src/pages/Admin/ParseFailures.tsx:216",children:"⚠ 개발자 전용 — 사이드바 비노출, ADMIN_USER_IDS 등록된 계정만 접근 가능."}),s.jsxs("div",{className:"px-6 py-6","data-sc-src":"src/pages/Admin/ParseFailures.tsx:220",children:[s.jsxs("header",{className:"mb-4","data-sc-src":"src/pages/Admin/ParseFailures.tsx:221",children:[s.jsx("h1",{className:"text-2xl font-bold text-gray-900 dark:text-white","data-sc-src":"src/pages/Admin/ParseFailures.tsx:222",children:"분석 실패 모니터"}),s.jsx("p",{className:"text-sm text-gray-500 mt-1","data-sc-src":"src/pages/Admin/ParseFailures.tsx:225",children:"서류관리 케이스 파이프라인이 무너진 사건들을 모아 봅니다. 파일 단위 단계 실패는 케이스 상세에서 확인합니다."})]}),s.jsxs("div",{className:"grid grid-cols-3 gap-3 mb-4","data-sc-src":"src/pages/Admin/ParseFailures.tsx:232",children:[s.jsx(k,{label:"전체",value:r.total}),s.jsx(k,{label:"미해결",value:r.openCount,accent:"red"}),s.jsx(k,{label:"해결됨",value:r.resolvedCount,accent:"green"})]}),s.jsxs("div",{className:"flex flex-wrap items-center gap-3 mb-4 rounded-lg bg-white dark:bg-gray-800 p-3 border border-gray-200 dark:border-gray-700","data-sc-src":"src/pages/Admin/ParseFailures.tsx:239",children:[s.jsxs("label",{className:"flex items-center gap-2 text-sm","data-sc-src":"src/pages/Admin/ParseFailures.tsx:240",children:[s.jsx("input",{type:"checkbox",checked:f,onChange:e=>M(e.target.checked),"data-sc-src":"src/pages/Admin/ParseFailures.tsx:241"}),"미해결만"]}),s.jsx("select",{value:p,onChange:e=>_(e.target.value),className:"text-sm border rounded px-2 py-1 dark:bg-gray-700 dark:border-gray-600","data-sc-src":"src/pages/Admin/ParseFailures.tsx:248",children:K.map(e=>s.jsx("option",{value:e,"data-sc-src":"src/pages/Admin/ParseFailures.tsx:254",children:e?`단계: ${e}`:"단계: 전체"},e||"all"))}),s.jsx("select",{value:m,onChange:e=>D(e.target.value),className:"text-sm border rounded px-2 py-1 dark:bg-gray-700 dark:border-gray-600",title:"에러 카테고리","data-sc-src":"src/pages/Admin/ParseFailures.tsx:259",children:Q.map(e=>s.jsx("option",{value:e,"data-sc-src":"src/pages/Admin/ParseFailures.tsx:266",children:e?`카테고리: ${e}`:"카테고리: 전체"},e||"all-cat"))}),s.jsx("select",{value:y,onChange:e=>O(e.target.value),className:"text-sm border rounded px-2 py-1 dark:bg-gray-700 dark:border-gray-600",title:"노출 대상","data-sc-src":"src/pages/Admin/ParseFailures.tsx:271",children:V.map(e=>s.jsx("option",{value:e,"data-sc-src":"src/pages/Admin/ParseFailures.tsx:278",children:e?`대상: ${e}`:"대상: 전체"},e||"all-aud"))}),s.jsx("select",{value:b,onChange:e=>Y(e.target.value),className:"text-sm border rounded px-2 py-1 dark:bg-gray-700 dark:border-gray-600",title:"재시도 정책","data-sc-src":"src/pages/Admin/ParseFailures.tsx:283",children:W.map(e=>s.jsx("option",{value:e,"data-sc-src":"src/pages/Admin/ParseFailures.tsx:290",children:e?`재시도: ${e}`:"재시도: 전체"},e||"all-rt"))}),s.jsx("input",{value:A,onChange:e=>z(e.target.value),placeholder:"에러 메시지/케이스 ID/실패 ID로 검색",className:"flex-1 min-w-[260px] text-sm border rounded px-3 py-1.5 dark:bg-gray-700 dark:border-gray-600","data-sc-src":"src/pages/Admin/ParseFailures.tsx:295"}),s.jsx("button",{onClick:j,className:"text-sm px-3 py-1.5 rounded bg-gray-800 text-white hover:bg-gray-700","data-sc-src":"src/pages/Admin/ParseFailures.tsx:301",children:"새로고침"})]}),s.jsxs("div",{className:"grid grid-cols-12 gap-4","data-sc-src":"src/pages/Admin/ParseFailures.tsx:309",children:[s.jsx("div",{className:"col-span-12 lg:col-span-7 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 overflow-x-auto","data-sc-src":"src/pages/Admin/ParseFailures.tsx:311",children:s.jsxs("table",{className:"w-full text-sm","data-sc-src":"src/pages/Admin/ParseFailures.tsx:312",children:[s.jsx("thead",{className:"bg-gray-50 dark:bg-gray-700/50 text-xs uppercase text-gray-500","data-sc-src":"src/pages/Admin/ParseFailures.tsx:313",children:s.jsxs("tr",{"data-sc-src":"src/pages/Admin/ParseFailures.tsx:314",children:[s.jsx("th",{className:"text-left px-3 py-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:315",children:"발생시각"}),s.jsx("th",{className:"text-left px-3 py-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:316",children:"단계"}),s.jsx("th",{className:"text-left px-3 py-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:317",children:"카테고리"}),s.jsx("th",{className:"text-left px-3 py-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:318",children:"에러"}),s.jsx("th",{className:"text-left px-3 py-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:319",children:"파일"}),s.jsx("th",{className:"text-left px-3 py-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:320",children:"상태"})]})}),s.jsxs("tbody",{"data-sc-src":"src/pages/Admin/ParseFailures.tsx:323",children:[F&&s.jsx("tr",{"data-sc-src":"src/pages/Admin/ParseFailures.tsx:325",children:s.jsx("td",{colSpan:6,className:"text-center text-gray-400 py-8","data-sc-src":"src/pages/Admin/ParseFailures.tsx:326",children:"불러오는 중…"})}),!F&&E.length===0&&s.jsx("tr",{"data-sc-src":"src/pages/Admin/ParseFailures.tsx:332",children:s.jsx("td",{colSpan:6,className:"text-center text-gray-400 py-8","data-sc-src":"src/pages/Admin/ParseFailures.tsx:333",children:"조건에 맞는 실패가 없습니다."})}),!F&&E.map(e=>{var l;return s.jsxs("tr",{onClick:()=>
1v(e.id),className:`cursor-pointer border-t border-gray-100 dark:border-gray-700 hover:bg-blue-50 dark:hover:bg-blue-950/30 ${x===e.id?"bg-blue-50 dark:bg-blue-950/30":""}`,"data-sc-src":"src/pages/Admin/ParseFailures.tsx:340",children:[s.jsx("td",{className:"px-3 py-2 whitespace-nowrap text-gray-700 dark:text-gray-300","data-sc-src":"src/pages/Admin/ParseFailures.tsx:347",children:I(e.createdAt)}),s.jsx("td",{className:"px-3 py-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:350",children:s.jsx(T,{step:e.pipelineStep})}),s.jsx("td",{className:"px-3 py-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:353",children:s.jsxs("div",{className:"flex flex-wrap gap-1 items-center","data-sc-src":"src/pages/Admin/ParseFailures.tsx:354",children:[s.jsx(u,{value:e.errorCategory,styleMap:R}),s.jsx(u,{value:e.errorRetryability,styleMap:L}),e.errorCode&&s.jsx("span",{className:"text-[10px] font-mono text-gray-500","data-sc-src":"src/pages/Admin/ParseFailures.tsx:358",children:e.errorCode})]})}),s.jsx("td",{className:"px-3 py-2 max-w-xs truncate text-gray-800 dark:text-gray-200","data-sc-src":"src/pages/Admin/ParseFailures.tsx:364",children:e.errorMessage}),s.jsxs("td",{className:"px-3 py-2 text-xs text-gray-500","data-sc-src":"src/pages/Admin/ParseFailures.tsx:367",children:[((l=e.files)==null?void 0:l.length)??0,"개"]}),s.jsx("td",{className:"px-3 py-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:370",children:e.resolvedAt?s.jsx("span",{className:"inline-block text-xs px-2 py-0.5 rounded bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-300","data-sc-src":"src/pages/Admin/ParseFailures.tsx:372",children:"해결됨"}):s.jsx("span",{className:"inline-block text-xs px-2 py-0.5 rounded bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-300","data-sc-src":"src/pages/Admin/ParseFailures.tsx:376",children:"미해결"})})]},e.id)})]})]})}),s.jsxs("div",{className:"col-span-12 lg:col-span-5","data-sc-src":"src/pages/Admin/ParseFailures.tsx:388",children:[!a&&s.jsx("div",{className:"rounded-lg border border-dashed border-gray-300 dark:border-gray-700 p-10 text-center text-gray-400","data-sc-src":"src/pages/Admin/ParseFailures.tsx:390",children:"좌측에서 행을 선택하면 상세가 표시됩니다."}),a&&s.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4 space-y-4","data-sc-src":"src/pages/Admin/ParseFailures.tsx:395",children:[s.jsxs("div",{className:"flex items-start justify-between gap-3","data-sc-src":"src/pages/Admin/ParseFailures.tsx:396",children:[s.jsxs("div",{"data-sc-src":"src/pages/Admin/ParseFailures.tsx:397",children:[s.jsx("div",{className:"text-xs text-gray-500","data-sc-src":"src/pages/Admin/ParseFailures.tsx:398",children:"실패 ID"}),s.jsx("div",{className:"font-mono text-xs text-gray-700 dark:text-gray-300","data-sc-src":"src/pages/Admin/ParseFailures.tsx:399",children:a.failure.id})]}),s.jsxs("div",{className:"text-right","data-sc-src":"src/pages/Admin/ParseFailures.tsx:403",children:[s.jsx(T,{step:a.failure.pipelineStep}),s.jsx("div",{className:"text-xs text-gray-400 mt-1","data-sc-src":"src/pages/Admin/ParseFailures.tsx:405",children:a.failure.source})]})]}),(a.failure.errorCategory||a.failure.errorAudience||a.failure.errorRetryability||a.failure.errorCode)&&s.jsx(o,{title:"에러 분류",children:s.jsxs("div",{className:"flex flex-wrap gap-1.5 items-center","data-sc-src":"src/pages/Admin/ParseFailures.tsx:417",children:[s.jsx(u,{value:a.failure.errorCategory,styleMap:R}),s.jsx(u,{value:a.failure.errorRetryability,styleMap:L}),s.jsx(u,{value:a.failure.errorAudience,styleMap:X}),a.failure.errorCode&&s.jsx("span",{className:"text-[11px] font-mono px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-900 text-gray-700 dark:text-gray-300","data-sc-src":"src/pages/Admin/ParseFailures.tsx:431",children:a.failure.errorCode})]})}),s.jsx(o,{title:"에러 메시지",children:s.jsx("pre",{className:"whitespace-pre-wrap break-words text-xs bg-gray-100 dark:bg-gray-900 p-2 rounded","data-sc-src":"src/pages/Admin/ParseFailures.tsx:440",children:a.failure.errorMessage})}),a.failure.errorStack&&s.jsx(o,{title:"Stack trace",children:s.jsx("pre",{className:"whitespace-pre-wrap break-words text-[10px] bg-gray-100 dark:bg-gray-900 p-2 rounded max-h-60 overflow-auto","data-sc-src":"src/pages/Admin/ParseFailures.tsx:447",children:a.failure.errorStack})}),a.case&&s.jsx(o,{title:"연결된 케이스",children:s.jsxs("div",{className:"text-sm","data-sc-src":"src/pages/Admin/ParseFailures.tsx:455",children:[s.jsx(H,{to:`/docs/cases/${a.case.id}`,state:{from:"/admin/docs/parse-failures",label:"파싱 실패 관리자"},className:"text-blue-600 hover:underline font-mono text-xs",children:a.case.id}),s.jsxs("span",{className:"ml-2 text-xs text-gray-500","data-sc-src":"src/pages/Admin/ParseFailures.tsx:466",children:["상태: ",a.case.status]})]})}),a.files.length>
10&&s.jsx(o,{title:"케이스 파일 & 단계별 에러",children:s.jsx("div",{className:"space-y-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:475",children:a.files.map(e=>s.jsxs("div",{className:"border border-gray-200 dark:border-gray-700 rounded p-2 text-xs","data-sc-src":"src/pages/Admin/ParseFailures.tsx:477",children:[s.jsxs("div",{className:"flex items-center justify-between","data-sc-src":"src/pages/Admin/ParseFailures.tsx:481",children:[s.jsx("div",{className:"font-medium truncate","data-sc-src":"src/pages/Admin/ParseFailures.tsx:482",children:e.fileName}),s.jsx("button",{onClick:()=>B(a.failure.id,e.id),className:"text-blue-600 hover:underline text-xs ml-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:485",children:"원본 다운"})]}),s.jsxs("div",{className:"text-gray-500 mt-1","data-sc-src":"src/pages/Admin/ParseFailures.tsx:494",children:[e.mimeType," · 분류=",e.kind]}),s.jsx(w,{label:"classify",status:e.classifyStatus,error:e.classifyError}),s.jsx(w,{label:"normalize",status:e.normalizeStatus,error:e.normalizeError}),s.jsx(w,{label:"extract",status:e.extractStatus,error:e.extractError}),e.unsupported&&s.jsxs("div",{className:"mt-1 text-amber-600","data-sc-src":"src/pages/Admin/ParseFailures.tsx:513",children:["지원불가: ",e.unsupportedReason]})]},e.id))})}),a.failure.requestContext&&s.jsx(o,{title:"요청 컨텍스트",children:s.jsx("pre",{className:"text-[10px] bg-gray-100 dark:bg-gray-900 p-2 rounded overflow-auto","data-sc-src":"src/pages/Admin/ParseFailures.tsx:525",children:JSON.stringify(a.failure.requestContext,null,2)})}),s.jsxs(o,{title:"해결 처리",children:[s.jsx("textarea",{value:$,onChange:e=>N(e.target.value),rows:3,placeholder:"해결 메모 (예: gemini 응답 깨짐 — partialJson 보강)",className:"w-full text-sm border rounded p-2 dark:bg-gray-900 dark:border-gray-700","data-sc-src":"src/pages/Admin/ParseFailures.tsx:532"}),s.jsx("div",{className:"flex gap-2 mt-2","data-sc-src":"src/pages/Admin/ParseFailures.tsx:539",children:a.failure.resolvedAt?s.jsxs(s.Fragment,{children:[s.jsxs("span",{className:"text-xs text-green-600 self-center","data-sc-src":"src/pages/Admin/ParseFailures.tsx:542",children:["✓ ",I(a.failure.resolvedAt)," 해결"]}),s.jsx("button",{onClick:J,disabled:P,className:"ml-auto text-xs px-3 py-1.5 border rounded hover:bg-gray-50 dark:border-gray-600","data-sc-src":"src/pages/Admin/ParseFailures.tsx:545",children:"다시 열기"})]}):s.jsx("button",{onClick:q,disabled:P,className:"ml-auto text-xs px-3 py-1.5 rounded bg-green-600 text-white hover:bg-green-700 disabled:opacity-50","data-sc-src":"src/pages/Admin/ParseFailures.tsx:554",children:P?"처리 중…":"해결로 표시"})})]})]})]})]})]})]})}function o({title:t,children:c}){return s.jsxs("div",{"data-sc-src":"src/pages/Admin/ParseFailures.tsx:581",children:[s.jsx("div",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-1","data-sc-src":"src/pages/Admin/ParseFailures.tsx:582",children:t}),c]})}function k({label:t,value:c,accent:r}){const n=r==="red"?"text-red-600":r==="green"?"text-green-600":"text-gray-900 dark:text-white";return s.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4","data-sc-src":"src/pages/Admin/ParseFailures.tsx:606",children:[s.jsx("div",{className:"text-xs text-gray-500","data-sc-src":"src/pages/Admin/ParseFailures.tsx:607",children:t}),s.jsx("div",{className:`text-2xl font-bold mt-1 ${n}`,"data-sc-src":"src/pages/Admin/ParseFailures.tsx:608",children:c})]})}function T({step:t}){const r={fanout:"bg-purple-100 text-purple-700",classify:"bg-blue-100 text-blue-700",extract:"bg-amber-100 text-amber-700",normalize:"bg-cyan-100 text-cyan-700",hs:"bg-indigo-100 text-indigo-700",network:"bg-gray-100 text-gray-700",unknown:"bg-gray-100 text-gray-700"}[t]??"bg-gray-100 text-gray-700";return s.jsx("span",{className:`inline-block text-xs px-2 py-0.5 rounded ${r}`,"data-sc-src":"src/pages/Admin/ParseFailures.tsx:625",children:t})}function w({label:t,status:c,error:r}){const n=c==="failed"||!!r;return s.jsxs("div",{className:"flex items-start gap-2 mt-1","data-sc-src":"src/pages/Admin/ParseFailures.tsx:642",children:[s.jsx("span",{className:`text-[10px] uppercase font-mono w-16 ${n?"text-red-600":"text-gray-400"}`,"data-sc-src":"src/pages/Admin/ParseFailures.tsx:643",children:t}),s.jsx("span",{className:"text-xs text-gray-600 dark:text-gray-400","data-sc-src":"src/pages/Admin/ParseFailures.tsx:650",children:c}),r&&s.jsx("span",{className:"text-xs text-red-600 dark:text-red-400 truncate flex-1","data-sc-src":"src/pages/Admin/ParseFailures.tsx:652",children:r})]})}function I(t){const c=new Date(t),r=n=>n.toString().padStart(2,"0");return`${c.getFullYear()}-${r(c.getMonth()+1)}-${r(c.getDate())} ${r(c.getHours())}:${r(c.getMinutes())}:${r(c.getSeconds())}`}export{ss 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.